WIP: adding download torrents functions - seedlinux - Torrent indexing tool opensource torrents with share ratio's etc.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 36400b3f1e690ea4f8c7c29f26fd309d97c6ad17
 (DIR) parent 17883aa7ec852387e78d5c0231d1bdd0ec9c6c5a
 (HTM) Author: Jay Scott <jay@jayscott.co.uk>
       Date:   Tue,  5 Sep 2017 15:40:38 +0100
       
       WIP: adding download torrents functions
       
       Diffstat:
         A bin/download                        |      93 +++++++++++++++++++++++++++++++
         M models/torrent_model.js             |       3 ++-
         M package-lock.json                   |     524 ++++++++++++++++++++++++++++++-
         M package.json                        |       5 +++++
         M views/details.pug                   |       5 +++++
       
       5 files changed, 626 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/bin/download b/bin/download
       @@ -0,0 +1,93 @@
       +#!/usr/bin/env node
       +'use strict';
       +
       +const request = require('request');
       +const cheerio = require('cheerio');
       +const download = require('download-to-file')
       +const S = require('string');
       +
       +const torrent_data = "./data/torrents/"
       +
       +console.log('Downloading torrents');
       +
       +function distrowatch_torrents() { 
       +  const baseurl = "http://distrowatch.com/"
       +
       +  request(baseurl + 'dwres.php?resource=bittorrent', function (error, response, html) {
       +    if (!error && response.statusCode == 200) {
       +      var $ = cheerio.load(html);
       +      $('td.torrent').each(function(i, element){
       +        var href = $('a', this).attr('href');
       +
       +        if (typeof href !== 'undefined' && href !== null){
       +          let torrent_name = href.split('dwres/torrents/');
       +          
       +          download(baseurl + href, torrent_data + torrent_name[1], function(err){
       +            if (err) throw err
       +            console.log("Downloaded - " + torrent_name[1])
       +          }) 
       +        }
       +      });
       +    }
       +  });
       +}
       +
       +function fedora_torrents() { 
       +  const baseurl = "https://torrent.fedoraproject.org/"
       +
       +  request(baseurl, function (error, response, html) {
       +    if (!error && response.statusCode == 200) {
       +      var $ = cheerio.load(html);
       +      $('td').each(function(i, element){
       +        var href = $('a', this).attr('href');
       +        
       +        if (typeof href !== 'undefined' && href !== null){
       +          let torrent_name = href.split('/torrents/');
       +
       +          download(href, torrent_data + torrent_name[1], function(err){
       +            if (err) throw err
       +            console.log("Downloaded - " + torrent_name[1])
       +          }) 
       +        }
       +      });
       +    }
       +  });
       +}
       +
       +function antergos_torrents() { 
       +  const baseurl = "http://mirrors.antergos.com/iso/release/"
       +  const mirrorurl = "http://mirrorservice.org/sites/repo.antergos.com/iso/release/"
       +
       +  console.log('Downloading torrents from Antergos');
       +  request(baseurl, function (error, response, html) {
       +    if (!error && response.statusCode == 200) {
       +      var $ = cheerio.load(html);
       +      $('td').each(function(i, element){
       +        var href = $('a', this).attr('href');
       +
       +        if (typeof href !== 'undefined' && href !== null){
       +          if ( S(href).endsWith('.torrent') ) { 
       +            download(mirrorurl + href, torrent_data + href, function(err){
       +              if (err) throw err
       +              console.log("Downloaded - " + href)
       +            }) 
       +          }
       +      }
       +        // if (typeof href !== 'undefined' && href !== null){
       +        //   let torrent_name = href.split('/torrents/');
       +
       +        //   download(href, torrent_data + torrent_name[1], function(err){
       +        //     if (err) throw err
       +        //     console.log("Downloaded - " + torrent_name[1])
       +        //   }) 
       +        // }
       +      });
       +    }
       +  });
       +}
       +
       +
       +// using the following list for torrent sources https://www.reddit.com/r/linux/comments/56no6f/legal_torrents_only_what_linux_or_other/
       +//distrowatch_torrents();
       +//fedora_torrents();
       +antergos_torrents();
 (DIR) diff --git a/models/torrent_model.js b/models/torrent_model.js
       @@ -22,7 +22,8 @@ const TorrentSchema = Schema(
            }],
            magneturi: {type: String},
            leechers: {type: Number},
       -    seeders: {type: Number},
       +    seeders: {type: Number}
       +
          }
        );
        
 (DIR) diff --git a/package-lock.json b/package-lock.json
       @@ -4,11 +4,25 @@
          "lockfileVersion": 1,
          "requires": true,
          "dependencies": {
       +    "@types/node": {
       +      "version": "6.0.88",
       +      "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.88.tgz",
       +      "integrity": "sha512-bYDPZTX0/s1aihdjLuAgogUAT5M+TpoWChEMea2p0yOcfn5bu3k6cJb9cp6nw268XeSNIGGr+4+/8V5K6BGzLQ=="
       +    },
            "abbrev": {
              "version": "1.1.0",
              "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
              "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8="
            },
       +    "ajv": {
       +      "version": "4.11.8",
       +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
       +      "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
       +      "requires": {
       +        "co": "4.6.0",
       +        "json-stable-stringify": "1.0.1"
       +      }
       +    },
            "ansi-regex": {
              "version": "2.1.1",
              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
       @@ -46,6 +60,16 @@
              "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
              "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
            },
       +    "asn1": {
       +      "version": "0.2.3",
       +      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
       +      "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
       +    },
       +    "assert-plus": {
       +      "version": "0.2.0",
       +      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
       +      "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
       +    },
            "async": {
              "version": "2.5.0",
              "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz",
       @@ -66,11 +90,35 @@
              "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
              "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
            },
       +    "asynckit": {
       +      "version": "0.4.0",
       +      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
       +      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
       +    },
       +    "aws-sign2": {
       +      "version": "0.6.0",
       +      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
       +      "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
       +    },
       +    "aws4": {
       +      "version": "1.6.0",
       +      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
       +      "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
       +    },
            "balanced-match": {
              "version": "1.0.0",
              "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
              "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
            },
       +    "bcrypt-pbkdf": {
       +      "version": "1.0.1",
       +      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
       +      "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
       +      "optional": true,
       +      "requires": {
       +        "tweetnacl": "0.14.5"
       +      }
       +    },
            "binary-extensions": {
              "version": "1.10.0",
              "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz",
       @@ -214,6 +262,19 @@
                }
              }
            },
       +    "boolbase": {
       +      "version": "1.0.0",
       +      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       +      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
       +    },
       +    "boom": {
       +      "version": "2.10.1",
       +      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
       +      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
       +      "requires": {
       +        "hoek": "2.16.3"
       +      }
       +    },
            "brace-expansion": {
              "version": "1.1.8",
              "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
       @@ -283,6 +344,11 @@
                "tape": "2.3.3"
              }
            },
       +    "caseless": {
       +      "version": "0.12.0",
       +      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
       +      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
       +    },
            "chai": {
              "version": "4.1.1",
              "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.1.tgz",
       @@ -358,6 +424,19 @@
                "supports-color": "2.0.0"
              }
            },
       +    "cheerio": {
       +      "version": "1.0.0-rc.2",
       +      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
       +      "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
       +      "requires": {
       +        "css-select": "1.2.0",
       +        "dom-serializer": "0.1.0",
       +        "entities": "1.1.1",
       +        "htmlparser2": "3.9.2",
       +        "lodash": "4.17.4",
       +        "parse5": "3.0.2"
       +      }
       +    },
            "chokidar": {
              "version": "1.7.0",
              "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
       @@ -395,6 +474,11 @@
              "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz",
              "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk="
            },
       +    "co": {
       +      "version": "4.6.0",
       +      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
       +      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
       +    },
            "colors": {
              "version": "0.6.2",
              "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
       @@ -404,7 +488,6 @@
              "version": "1.0.5",
              "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
              "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
       -      "dev": true,
              "requires": {
                "delayed-stream": "1.0.0"
              }
       @@ -527,11 +610,50 @@
              "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
              "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
            },
       +    "cryptiles": {
       +      "version": "2.0.5",
       +      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
       +      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
       +      "requires": {
       +        "boom": "2.10.1"
       +      }
       +    },
       +    "css-select": {
       +      "version": "1.2.0",
       +      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
       +      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
       +      "requires": {
       +        "boolbase": "1.0.0",
       +        "css-what": "2.1.0",
       +        "domutils": "1.5.1",
       +        "nth-check": "1.0.1"
       +      }
       +    },
       +    "css-what": {
       +      "version": "2.1.0",
       +      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
       +      "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0="
       +    },
            "cycle": {
              "version": "1.0.3",
              "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
              "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
            },
       +    "dashdash": {
       +      "version": "1.14.1",
       +      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
       +      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
       +      "requires": {
       +        "assert-plus": "1.0.0"
       +      },
       +      "dependencies": {
       +        "assert-plus": {
       +          "version": "1.0.0",
       +          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       +          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
       +        }
       +      }
       +    },
            "debug": {
              "version": "2.6.8",
              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
       @@ -565,14 +687,68 @@
            "delayed-stream": {
              "version": "1.0.0",
              "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
       -      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
       -      "dev": true
       +      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
            },
            "director": {
              "version": "1.2.7",
              "resolved": "https://registry.npmjs.org/director/-/director-1.2.7.tgz",
              "integrity": "sha1-v9N0EHX9f7GlsuE2WMX0vsd3NvM="
            },
       +    "dom-serializer": {
       +      "version": "0.1.0",
       +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
       +      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
       +      "requires": {
       +        "domelementtype": "1.1.3",
       +        "entities": "1.1.1"
       +      },
       +      "dependencies": {
       +        "domelementtype": {
       +          "version": "1.1.3",
       +          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
       +          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
       +        }
       +      }
       +    },
       +    "domelementtype": {
       +      "version": "1.3.0",
       +      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
       +      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
       +    },
       +    "domhandler": {
       +      "version": "2.4.1",
       +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
       +      "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
       +      "requires": {
       +        "domelementtype": "1.3.0"
       +      }
       +    },
       +    "domutils": {
       +      "version": "1.5.1",
       +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
       +      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
       +      "requires": {
       +        "dom-serializer": "0.1.0",
       +        "domelementtype": "1.3.0"
       +      }
       +    },
       +    "download-file": {
       +      "version": "0.1.5",
       +      "resolved": "https://registry.npmjs.org/download-file/-/download-file-0.1.5.tgz",
       +      "integrity": "sha1-ylC6ZNkJSwyHAu+f/5LSGJ4UERc=",
       +      "requires": {
       +        "mkdirp": "0.5.1"
       +      }
       +    },
       +    "download-to-file": {
       +      "version": "2.0.0",
       +      "resolved": "https://registry.npmjs.org/download-to-file/-/download-to-file-2.0.0.tgz",
       +      "integrity": "sha1-Bsgz8q28+fmSNGhC9iB7VKJGC8w=",
       +      "requires": {
       +        "mkdirp": "0.5.1",
       +        "pump": "1.0.2"
       +      }
       +    },
            "duplexer": {
              "version": "0.1.1",
              "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
       @@ -589,6 +765,15 @@
                "stream-shift": "1.0.0"
              }
            },
       +    "ecc-jsbn": {
       +      "version": "0.1.1",
       +      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
       +      "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
       +      "optional": true,
       +      "requires": {
       +        "jsbn": "0.1.1"
       +      }
       +    },
            "end-of-stream": {
              "version": "1.0.0",
              "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz",
       @@ -607,6 +792,11 @@
                }
              }
            },
       +    "entities": {
       +      "version": "1.1.1",
       +      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
       +      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
       +    },
            "es6-promise": {
              "version": "3.3.1",
              "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
       @@ -943,6 +1133,11 @@
                }
              }
            },
       +    "extend": {
       +      "version": "3.0.1",
       +      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
       +      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
       +    },
            "extglob": {
              "version": "0.3.2",
              "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
       @@ -951,6 +1146,11 @@
                "is-extglob": "1.0.0"
              }
            },
       +    "extsprintf": {
       +      "version": "1.3.0",
       +      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
       +      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
       +    },
            "eyes": {
              "version": "0.1.8",
              "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
       @@ -1045,6 +1245,11 @@
                "winston": "0.8.3"
              }
            },
       +    "forever-agent": {
       +      "version": "0.6.1",
       +      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
       +      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
       +    },
            "forever-monitor": {
              "version": "1.7.1",
              "resolved": "https://registry.npmjs.org/forever-monitor/-/forever-monitor-1.7.1.tgz",
       @@ -1127,6 +1332,21 @@
              "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
              "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
            },
       +    "getpass": {
       +      "version": "0.1.7",
       +      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
       +      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
       +      "requires": {
       +        "assert-plus": "1.0.0"
       +      },
       +      "dependencies": {
       +        "assert-plus": {
       +          "version": "1.0.0",
       +          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       +          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
       +        }
       +      }
       +    },
            "glob": {
              "version": "7.1.2",
              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
       @@ -1186,6 +1406,20 @@
              "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
              "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
            },
       +    "har-schema": {
       +      "version": "1.0.5",
       +      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
       +      "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4="
       +    },
       +    "har-validator": {
       +      "version": "4.2.1",
       +      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
       +      "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
       +      "requires": {
       +        "ajv": "4.11.8",
       +        "har-schema": "1.0.5"
       +      }
       +    },
            "has-ansi": {
              "version": "2.0.0",
              "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
       @@ -1194,6 +1428,17 @@
                "ansi-regex": "2.1.1"
              }
            },
       +    "hawk": {
       +      "version": "3.1.3",
       +      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
       +      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
       +      "requires": {
       +        "boom": "2.10.1",
       +        "cryptiles": "2.0.5",
       +        "hoek": "2.16.3",
       +        "sntp": "1.0.9"
       +      }
       +    },
            "helmet": {
              "version": "3.8.1",
              "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.8.1.tgz",
       @@ -1397,6 +1642,34 @@
                }
              }
            },
       +    "hoek": {
       +      "version": "2.16.3",
       +      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
       +      "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
       +    },
       +    "htmlparser2": {
       +      "version": "3.9.2",
       +      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
       +      "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
       +      "requires": {
       +        "domelementtype": "1.3.0",
       +        "domhandler": "2.4.1",
       +        "domutils": "1.5.1",
       +        "entities": "1.1.1",
       +        "inherits": "2.0.3",
       +        "readable-stream": "2.3.3"
       +      }
       +    },
       +    "http-signature": {
       +      "version": "1.1.1",
       +      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
       +      "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
       +      "requires": {
       +        "assert-plus": "0.2.0",
       +        "jsprim": "1.4.1",
       +        "sshpk": "1.13.1"
       +      }
       +    },
            "i": {
              "version": "0.3.5",
              "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz",
       @@ -1521,6 +1794,11 @@
              "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
              "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
            },
       +    "is-typedarray": {
       +      "version": "1.0.0",
       +      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
       +      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
       +    },
            "isarray": {
              "version": "1.0.0",
              "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       @@ -1539,6 +1817,12 @@
              "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
              "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
            },
       +    "jsbn": {
       +      "version": "0.1.1",
       +      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
       +      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
       +      "optional": true
       +    },
            "jshint": {
              "version": "2.9.5",
              "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz",
       @@ -1792,11 +2076,47 @@
                }
              }
            },
       +    "json-schema": {
       +      "version": "0.2.3",
       +      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
       +      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
       +    },
       +    "json-stable-stringify": {
       +      "version": "1.0.1",
       +      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
       +      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
       +      "requires": {
       +        "jsonify": "0.0.0"
       +      }
       +    },
       +    "json-stringify-safe": {
       +      "version": "5.0.1",
       +      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
       +      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
       +    },
            "jsonify": {
              "version": "0.0.0",
              "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
              "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
            },
       +    "jsprim": {
       +      "version": "1.4.1",
       +      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
       +      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
       +      "requires": {
       +        "assert-plus": "1.0.0",
       +        "extsprintf": "1.3.0",
       +        "json-schema": "0.2.3",
       +        "verror": "1.10.0"
       +      },
       +      "dependencies": {
       +        "assert-plus": {
       +          "version": "1.0.0",
       +          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       +          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
       +        }
       +      }
       +    },
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
       @@ -1818,6 +2138,11 @@
              "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz",
              "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA="
            },
       +    "lodash": {
       +      "version": "4.17.4",
       +      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
       +      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
       +    },
            "lodash._baseassign": {
              "version": "3.2.0",
              "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
       @@ -1931,6 +2256,19 @@
                "regex-cache": "0.4.3"
              }
            },
       +    "mime-db": {
       +      "version": "1.30.0",
       +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
       +      "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
       +    },
       +    "mime-types": {
       +      "version": "2.1.17",
       +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
       +      "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
       +      "requires": {
       +        "mime-db": "1.30.0"
       +      }
       +    },
            "minimatch": {
              "version": "3.0.4",
              "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       @@ -3053,11 +3391,24 @@
                "lazy": "1.0.11"
              }
            },
       +    "nth-check": {
       +      "version": "1.0.1",
       +      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
       +      "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
       +      "requires": {
       +        "boolbase": "1.0.0"
       +      }
       +    },
            "number-is-nan": {
              "version": "1.0.1",
              "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
              "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
            },
       +    "oauth-sign": {
       +      "version": "0.8.2",
       +      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
       +      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
       +    },
            "object-assign": {
              "version": "3.0.0",
              "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
       @@ -3247,6 +3598,14 @@
                }
              }
            },
       +    "parse5": {
       +      "version": "3.0.2",
       +      "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz",
       +      "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=",
       +      "requires": {
       +        "@types/node": "6.0.88"
       +      }
       +    },
            "path-is-absolute": {
              "version": "1.0.1",
              "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       @@ -3260,6 +3619,11 @@
                "through": "2.3.8"
              }
            },
       +    "performance-now": {
       +      "version": "0.2.0",
       +      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
       +      "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU="
       +    },
            "pinkie": {
              "version": "2.0.4",
              "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
       @@ -3748,6 +4112,35 @@
                }
              }
            },
       +    "pump": {
       +      "version": "1.0.2",
       +      "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz",
       +      "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=",
       +      "requires": {
       +        "end-of-stream": "1.4.0",
       +        "once": "1.4.0"
       +      },
       +      "dependencies": {
       +        "end-of-stream": {
       +          "version": "1.4.0",
       +          "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
       +          "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=",
       +          "requires": {
       +            "once": "1.4.0"
       +          }
       +        }
       +      }
       +    },
       +    "punycode": {
       +      "version": "1.4.1",
       +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
       +      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
       +    },
       +    "qs": {
       +      "version": "6.4.0",
       +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
       +      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
       +    },
            "randomatic": {
              "version": "1.1.7",
              "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
       @@ -3890,6 +4283,52 @@
                "is-finite": "1.0.2"
              }
            },
       +    "request": {
       +      "version": "2.81.0",
       +      "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
       +      "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
       +      "requires": {
       +        "aws-sign2": "0.6.0",
       +        "aws4": "1.6.0",
       +        "caseless": "0.12.0",
       +        "combined-stream": "1.0.5",
       +        "extend": "3.0.1",
       +        "forever-agent": "0.6.1",
       +        "form-data": "2.1.4",
       +        "har-validator": "4.2.1",
       +        "hawk": "3.1.3",
       +        "http-signature": "1.1.1",
       +        "is-typedarray": "1.0.0",
       +        "isstream": "0.1.2",
       +        "json-stringify-safe": "5.0.1",
       +        "mime-types": "2.1.17",
       +        "oauth-sign": "0.8.2",
       +        "performance-now": "0.2.0",
       +        "qs": "6.4.0",
       +        "safe-buffer": "5.1.1",
       +        "stringstream": "0.0.5",
       +        "tough-cookie": "2.3.2",
       +        "tunnel-agent": "0.6.0",
       +        "uuid": "3.1.0"
       +      },
       +      "dependencies": {
       +        "form-data": {
       +          "version": "2.1.4",
       +          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
       +          "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
       +          "requires": {
       +            "asynckit": "0.4.0",
       +            "combined-stream": "1.0.5",
       +            "mime-types": "2.1.17"
       +          }
       +        },
       +        "uuid": {
       +          "version": "3.1.0",
       +          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
       +          "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g=="
       +        }
       +      }
       +    },
            "resumer": {
              "version": "0.0.0",
              "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
       @@ -3948,6 +4387,14 @@
              "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
              "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
            },
       +    "sntp": {
       +      "version": "1.0.9",
       +      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
       +      "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
       +      "requires": {
       +        "hoek": "2.16.3"
       +      }
       +    },
            "split": {
              "version": "0.3.3",
              "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
       @@ -3956,6 +4403,28 @@
                "through": "2.3.8"
              }
            },
       +    "sshpk": {
       +      "version": "1.13.1",
       +      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
       +      "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
       +      "requires": {
       +        "asn1": "0.2.3",
       +        "assert-plus": "1.0.0",
       +        "bcrypt-pbkdf": "1.0.1",
       +        "dashdash": "1.14.1",
       +        "ecc-jsbn": "0.1.1",
       +        "getpass": "0.1.7",
       +        "jsbn": "0.1.1",
       +        "tweetnacl": "0.14.5"
       +      },
       +      "dependencies": {
       +        "assert-plus": {
       +          "version": "1.0.0",
       +          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       +          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
       +        }
       +      }
       +    },
            "stack-trace": {
              "version": "0.0.10",
              "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
       @@ -3974,6 +4443,11 @@
              "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
              "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
            },
       +    "string": {
       +      "version": "3.3.3",
       +      "resolved": "https://registry.npmjs.org/string/-/string-3.3.3.tgz",
       +      "integrity": "sha1-XqIRzZLSKOGEKUmQpsyXs2anfLA="
       +    },
            "string_decoder": {
              "version": "1.0.3",
              "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
       @@ -3990,6 +4464,11 @@
                "strip-ansi": "3.0.1"
              }
            },
       +    "stringstream": {
       +      "version": "0.0.5",
       +      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
       +      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
       +    },
            "strip-ansi": {
              "version": "3.0.1",
              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
       @@ -4183,6 +4662,28 @@
                "nopt": "1.0.10"
              }
            },
       +    "tough-cookie": {
       +      "version": "2.3.2",
       +      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
       +      "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
       +      "requires": {
       +        "punycode": "1.4.1"
       +      }
       +    },
       +    "tunnel-agent": {
       +      "version": "0.6.0",
       +      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       +      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
       +      "requires": {
       +        "safe-buffer": "5.1.1"
       +      }
       +    },
       +    "tweetnacl": {
       +      "version": "0.14.5",
       +      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
       +      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
       +      "optional": true
       +    },
            "undefsafe": {
              "version": "0.0.3",
              "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz",
       @@ -4232,6 +4733,23 @@
              "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
              "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho="
            },
       +    "verror": {
       +      "version": "1.10.0",
       +      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
       +      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
       +      "requires": {
       +        "assert-plus": "1.0.0",
       +        "core-util-is": "1.0.2",
       +        "extsprintf": "1.3.0"
       +      },
       +      "dependencies": {
       +        "assert-plus": {
       +          "version": "1.0.0",
       +          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       +          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
       +        }
       +      }
       +    },
            "webtorrent-health": {
              "version": "1.1.1",
              "resolved": "https://registry.npmjs.org/webtorrent-health/-/webtorrent-health-1.1.1.tgz",
 (DIR) diff --git a/package.json b/package.json
       @@ -11,8 +11,11 @@
          "dependencies": {
            "async": "^2.5.0",
            "body-parser": "^1.17.2",
       +    "cheerio": "^1.0.0-rc.2",
            "compression": "^1.6.2",
            "debug": "^2.6.8",
       +    "download-file": "^0.1.5",
       +    "download-to-file": "^2.0.0",
            "express": "^4.15.3",
            "flat": "^2.0.1",
            "forever": "^0.15.3",
       @@ -23,6 +26,8 @@
            "nodemon": "^1.11.0",
            "parse-torrent": "^5.8.3",
            "pug": "^2.0.0-rc.2",
       +    "request": "^2.81.0",
       +    "string": "^3.3.3",
            "webtorrent-health": "^1.1.1"
          },
          "devDependencies": {
 (DIR) diff --git a/views/details.pug b/views/details.pug
       @@ -43,6 +43,11 @@ block content
                  td= i.created
                tr
                  td
       +            i.hourglass.full.olive.icon
       +            = 'Last Checked'
       +          td= i.updated
       +        tr
       +          td
                    i.comment.outline.olive.icon
                    = 'Comment'
                  td= i.comment