seedlinux

find open source torrents and stats for people wishing to contribute bandwidth.
git clone git://git.beardyjay.co.uk/seedlinux
Log | Files | Refs | README | LICENSE

commit 2f5d8f1c1b6fdaabfd8da3fb4c981e0059cb463e
parent b3102ea62697b35d8c2cf640817e1d9c731613e7
Author: Jay Scott <jay@jayscott.co.uk>
Date:   Sun,  2 Jul 2017 21:40:10 +0100

refactor, update peer info script

I have done a bit of refactoring after reading up on the best
wants to handle async callbacks. I have also updated the script
that will run hourly to get the latest data. It can still be
refactored more to use the functions from the torrents controller
for example.

Diffstat:
Mapp.js | 1-
Abin/update | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcontrollers/torrents_controller.js | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mpackage-lock.json | 173++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Mpackage.json | 5+++--
5 files changed, 328 insertions(+), 32 deletions(-)

diff --git a/app.js b/app.js @@ -2,7 +2,6 @@ const express = require('express'); const path = require('path'); -const favicon = require('serve-favicon'); const logger = require('morgan'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); diff --git a/bin/update b/bin/update @@ -0,0 +1,102 @@ +#!/usr/bin/env node +'use strict'; + +console.log('Updating Seeder and Leecher information'); + +const async = require('async'); +const mongoose = require('mongoose'); +const webtorrentHealth = require('webtorrent-health'); +const mongoDB = process.env.DB_URI; +const Torrent = require('../models/torrent_model'); + +mongoose.connect(mongoDB); + +var db = mongoose.connection; + +db.on('error', console.error.bind(console, 'MongoDB connection error:')); + +function updateTorrent(torrent, callback) { + webtorrentHealth(torrent.magneturi, {trackers: torrent.announce}, function (err, data) { + if (err) { + callback(err, null); + } else { + let newData = { + seeders: data.seeds, + leechers: data.peers, + ratio: (Math.round((data.peers > 0 ? data.seeds / data.peers : data.seeds) +'e+2') + 'e-2') + }; + callback(null, newData); + } + }); +} + +function getTorrent(query, callback) { + Torrent.find(query, function(err, data) { + if (err) { + callback(err, null); + } else { + callback(null, data[0]); + } + }); +} + +function saveTorrent(query, data, callback) { + Torrent.findOneAndUpdate(query, data, function(err, data) { + if (err) { + callback(err, null); + } else { + callback(null, data[0]); + } + }); +} + +Torrent.find({}, function(err, data) { + if (err) console.log(err); + + async.eachSeries(data, function(file, callback) { + async.waterfall([ + function(callback){ + getTorrent({hash: file.hash }, function(err, torrent) { + if (err) callback(true); + + if (!torrent) + callback(true); + else + callback(null, torrent); + }); + }, + function(arg1, callback){ + updateTorrent(arg1, function(err, data) { + if (err) callback(true); + + callback(null, data); + + }); + }, + function(arg1, callback){ + saveTorrent({hash: file.hash }, arg1, function(err, data) { + if (err) callback(true); + + console.log("Saved - " + file.hash); + callback(null, data); + + }); + }], function (err) { + + if (err) + throw err; + + callback(); + } + ); + }, function(err) { + if( err ) { + console.log('A torrent failed to process'); + process.exit(1); + } else { + console.log('All torrents have been processed successfully'); + process.exit(); + } + }); +}); + diff --git a/controllers/torrents_controller.js b/controllers/torrents_controller.js @@ -11,9 +11,9 @@ function getTorrent(query, callback) { callback(null, data[0]); } }); -}; +} -function updateTorrent(query, data, callback) { +function saveTorrent(query, data, callback) { Torrent.findOneAndUpdate(query, data, function(err, data) { if (err) { callback(err, null); @@ -21,7 +21,25 @@ function updateTorrent(query, data, callback) { callback(null, data[0]); } }); -}; +} + +function updateTorrent(torrent, callback) { + + const webtorrentHealth = require('webtorrent-health'); + + webtorrentHealth(torrent.magneturi, {trackers: torrent.announce}, function (err, data) { + if (err) { + callback(err, null); + } else { + let newData = { + seeders: data.seeds, + leechers: data.peers, + ratio: (Math.round((data.peers > 0 ? data.seeds / data.peers : data.seeds) +'e+2') + 'e-2') + }; + callback(null, newData); + } + }); +} exports.index = function(req, res) { async.parallel( @@ -50,7 +68,7 @@ exports.torrent_detail = function(req, res) { } }, function(err, results) { - if (results.torrent_data == '') { + if (results.torrent_data === '') { res.sendStatus(404); } else { res.render('details', { title: 'Torrent Details', data: results }); @@ -61,29 +79,41 @@ exports.torrent_detail = function(req, res) { exports.torrent_update = function(req, res) { - const webtorrentHealth = require('webtorrent-health'); + async.waterfall([ + function(callback){ + getTorrent({hash: req.params.id }, function(err, torrent) { + if (err) callback(true); - getTorrent({hash: req.params.id }, function(err, torrent) { - if (err) res.sendStatus(404); + if (!torrent) + callback("404"); + else + callback(null, torrent); + }); + }, + function(arg1, callback){ + updateTorrent(arg1, function(err, data) { + if (err) callback(true); + + callback(null, data); - if (torrent == null) { - res.sendStatus(404); - } else { - webtorrentHealth(torrent.magneturi, {trackers: torrent.announce}, function (err, data) { - if (err) res.sendStatus(500); + }); + }, + function(arg1, callback){ + saveTorrent({hash: req.params.id }, arg1, function(err, data) { + if (err) callback(true); - let newData = { - seeders: data.seeds, - leechers: data.peers, - ratio: Math.round((data.peers > 0 ? data.seeds / data.peers : data.seeds) +'e+2') + 'e-2' - } - - updateTorrent({hash: req.params.id}, newData, function(err, user) { - if (err) res.sendStatus(500); + callback(null, data); + }); + }], function (err, result) { + + if (err === "404") + res.sendStatus(404); + else if (err) + res.sendStatus(500); + else res.redirect('/torrent/details/' + req.params.id); - }); - }) + } - }); -} + ); +};+ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json @@ -77,6 +77,12 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==" }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, "basic-auth": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", @@ -143,6 +149,12 @@ } } }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true + }, "bson": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", @@ -190,6 +202,12 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.27.tgz", "integrity": "sha1-re91sxwWD/pdcvTeZ5ZuJmDBolU=" }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -210,6 +228,18 @@ "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.0.tgz", "integrity": "sha1-qZzZbqAAUlaEsmloOuIiLW7qe0k=" }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -250,6 +280,12 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", @@ -287,6 +323,44 @@ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -302,6 +376,12 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=" }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, "es6-promise": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", @@ -317,6 +397,12 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, "expand-template": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.0.3.tgz", @@ -362,6 +448,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, "function-bind": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", @@ -389,6 +481,12 @@ "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", "optional": true }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -410,6 +508,32 @@ "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.0.tgz", "integrity": "sha1-oB2JTVKsf2WZu7H2PfycQR33DLo=" }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "http-errors": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", @@ -420,6 +544,12 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -476,6 +606,26 @@ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "dev": true, + "dependencies": { + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, "jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -551,6 +701,12 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -702,6 +858,12 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", @@ -928,11 +1090,6 @@ } } }, - "serve-favicon": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.3.tgz", - "integrity": "sha1-WYaxewUCZCtkHCH4GLGszjICXSM=" - }, "serve-static": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", @@ -949,6 +1106,12 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", diff --git a/package.json b/package.json @@ -9,7 +9,6 @@ "dependencies": { "app-root-path": "^2.0.1", "async": "^2.5.0", - "bittorrent-tracker": "^9.2.3", "body-parser": "~1.17.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", @@ -20,7 +19,9 @@ "morgan": "~1.8.1", "parse-torrent": "^5.8.3", "pug": "~2.0.0-beta11", - "serve-favicon": "~2.4.2", "webtorrent-health": "^1.1.1" + }, + "devDependencies": { + "jshint": "^2.9.5" } }