diff --git a/.circleci/config.yml b/.circleci/config.yml index 59c0a4ee..8677a82b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,53 +2,341 @@ # # Check https://circleci.com/docs/2.0/language-javascript/ for more details # -version: 2 +version: 2.1 jobs: - build: - docker: + checkout: + working_directory: ~/repo + + docker: # specify the version you desire here - - image: circleci/node:10.14.2 + - image: circleci/node:lts # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images # documented at https://circleci.com/docs/2.0/circleci-images/ # - image: circleci/mongo:3.4.4 - working_directory: ~/repo + steps: + - checkout + - save_cache: + key: v1-repo-{{ .Environment.CIRCLE_SHA1 }} + paths: + - ~/repo + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + # Download and cache node-cache + - restore_cache: + keys: + - v1-nodecache-{{ checksum "gulpfile.js" }} + # fallback to using the latest cache if no exact match is found + - v1-nodecache- + + #- run: sudo npm prune + - run: + name: update-npm + command: 'sudo npm install' + + #store cache dependencies + - save_cache: + key: v1-dependencies-{{ checksum "package.json" }} + paths: + - node_modules + + #store node cache + - save_cache: + key: v1-nodecache-{{ checksum "gulpfile.js" }} + paths: + - cache + + build_original: + docker: + # specify the version you desire here + - image: circleci/node:lts + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/mongo:3.4.4 - steps: - - checkout + working_directory: ~/repo + steps: # Download and cache dependencies - restore_cache: keys: - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + # Download and cache node-cache + - restore_cache: + keys: - v1-nodecache-{{ checksum "gulpfile.js" }} # fallback to using the latest cache if no exact match is found + - v1-nodecache- + + #- run: sudo npm prune + - run: sudo npm install + #- run: sudo npm install -g gulp + + # run tests! + #- run: gulp build linux32,linux64,win32,win64,osx64 + - run: npx gulp build -p linux32,linux64,win32,win64 + + - deploy: + command: npx gulp zip -p linux32,linux64,win32,win64 + + build_linux64: + docker: + # specify the version you desire here + - image: circleci/node:lts + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/mongo:3.4.4 + + working_directory: ~/repo + + steps: + - restore_cache: + keys: + - v1-repo-{{ .Environment.CIRCLE_SHA1 }} + - v1-repo- + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found - v1-dependencies- - - - run: npm install - - run: sudo npm install -g gulp + + # Download and cache node-cache + - restore_cache: + keys: + - v1-nodecache-{{ checksum "gulpfile.js" }} + # fallback to using the latest cache if no exact match is found + - v1-nodecache- + + #- run: sudo npm prune + - run: sudo npm install + #- run: sudo npm install -g gulp # run tests! #- run: gulp build linux32,linux64,win32,win64,osx64 - - run: gulp build -p linux32,linux64,win32,win64 + - run: npx gulp build -p linux64 - deploy: - command: gulp zip -p linux32,linux64,win32,win64 + command: npx gulp zip -p linux64 #store cache dependencies - save_cache: + key: v1-dependencies-{{ checksum "package.json" }} paths: - node_modules + + #store node cache + - save_cache: + key: v1-nodecache-{{ checksum "gulpfile.js" }} + paths: + - cache + + - store_artifacts: + path: ~/repo/dist + + build_linux32: + docker: + # specify the version you desire here + - image: circleci/node:lts + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/mongo:3.4.4 + + working_directory: ~/repo + + steps: + - restore_cache: + keys: + - v1-repo-{{ .Environment.CIRCLE_SHA1 }} + - v1-repo- + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + # Download and cache node-cache + - restore_cache: + keys: + - v1-nodecache-{{ checksum "gulpfile.js" }} + # fallback to using the latest cache if no exact match is found + - v1-nodecache- + + #- run: sudo npm prune + - run: sudo npm install + + # run tests! + #- run: gulp build linux32,linux64,win32,win64,osx64 + - run: npx gulp build -p linux32 + + - deploy: + command: npx gulp zip -p linux32 + + #store cache dependencies + - save_cache: key: v1-dependencies-{{ checksum "package.json" }} - + paths: + - node_modules + + #store node cache - save_cache: + key: v1-nodecache-{{ checksum "gulpfile.js" }} paths: - cache + + - store_artifacts: + path: ~/repo/dist + + build_win64: + docker: + # specify the version you desire here + - image: circleci/node:lts + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/mongo:3.4.4 + + working_directory: ~/repo + + steps: + - restore_cache: + keys: + - v1-repo-{{ .Environment.CIRCLE_SHA1 }} + - v1-repo- + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + # Download and cache node-cache + - restore_cache: + keys: + - v1-nodecache-{{ checksum "gulpfile.js" }} + # fallback to using the latest cache if no exact match is found + - v1-nodecache- + + #- run: sudo npm prune + - run: sudo npm install + + # run tests! + #- run: gulp build linux32,linux64,win32,win64,osx64 + - run: npx gulp build -p win64 + + - deploy: + command: npx gulp zip -p win64 + + #store cache dependencies + - save_cache: + key: v1-dependencies-{{ checksum "package.json" }} + paths: + - node_modules + + #store node cache + - save_cache: key: v1-nodecache-{{ checksum "gulpfile.js" }} - + paths: + - cache + - store_artifacts: path: ~/repo/dist + build_win32: + docker: + # specify the version you desire here + - image: circleci/node:lts + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/mongo:3.4.4 + + working_directory: ~/repo + + steps: + - restore_cache: + keys: + - v1-repo-{{ .Environment.CIRCLE_SHA1 }} + - v1-repo- + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + # Download and cache node-cache + - restore_cache: + keys: + - v1-nodecache-{{ checksum "gulpfile.js" }} + # fallback to using the latest cache if no exact match is found + - v1-nodecache- + + #- run: sudo npm prune + - run: sudo npm install + + # run tests! + #- run: gulp build linux32,linux64,win32,win64,osx64 + - run: npx gulp build -p win32 + + - deploy: + command: npx gulp zip -p win32 + + #store cache dependencies + - save_cache: + key: v1-dependencies-{{ checksum "package.json" }} + paths: + - node_modules + + #store node cache + - save_cache: + key: v1-nodecache-{{ checksum "gulpfile.js" }} + paths: + - cache + + - store_artifacts: + path: ~/repo/dist + + +workflows: + version: 2.1 + build-and-deploy: + jobs: + - checkout + - build_linux64: + requires: + - checkout + - build_linux32: + requires: + - checkout + - build_win32: + requires: + - checkout + - build_win64: + requires: + - checkout diff --git a/.gitignore b/.gitignore index 45d53619..c8535484 100644 --- a/.gitignore +++ b/.gitignore @@ -353,6 +353,7 @@ __pycache__/ #vscode .vscode/ +*.code-workspace #snap parts/ diff --git a/.vscode/settings.json b/.vscode/settings.json index 392fb975..dd3473fc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,6 @@ // Defines space handling after function keyword for anonymous functions "javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false, "eslint.enable": false, - "jshint.enable": false + "jshint.enable": false, + "editor.rulers": [80,120] } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c43f79d4..66799f89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,32 @@ +## 0.4.2-0 Beta - Extra Time, Extra Popcorn - 23 August 2020 + +New Features: +- Sort: Sort By, Genres, Type are now saved when going between Movies + and TV Shows. +- RARBG: Updated categories for RARBG to support 4K, Movies, TV Shows, XXX +- Tracker: Added Tracker Updater + +BugFixes: +- Trakt: Authorize Fixed +- RARBG: Fixed RARBG search support in Torrent Collection +- Trailer: Validate trailer information is correct +- Favorites: Fixed Favorites to handle bad movie entries + +Updated: +- OpenSubtitles: Updated handling of subtitle search +- OpenSubtitles: Added performance tests +- OpenSubtitles: Subtitle information is now loaded in the background +- Trakt: Updated Watchlist refresh and trakt clean up +- Trakt: Added Trak scrobble to ext players +- Code: Intergrated torrent health into repo +- Chromecast: Enabled auto discovery of new chromecast device on a set period + of time + ## 0.4.1-17.1 Beta - Popcorn Treats - 24 October 2019 New Features: -- Added more information to status screen: Active Users, and Total User, Time remaining +- Added more information to status screen: Active Users, and Total User, + Time remaining BugFixes: - Fixed Next TV episode playing Automatically @@ -17,7 +42,8 @@ Updated: New Features: - OpenSubtitles: Add link to create account -- OpenSubtitles: Added Username and Password for OpenSubtitles API into the settings screen. +- OpenSubtitles: Added Username and Password for OpenSubtitles API into the + settings screen. - ExtPlayer: Added Windows Media Player - Player: Added a "Download Only" option to the player selection - gulp: Add ffmpeg update to cache sdk @@ -71,7 +97,9 @@ New Features: BugFixes: -- Fixed build archive so that all files are included when a new build is generated. All builds should now have all the proper files as expected and run properly. +- Fixed build archive so that all files are included when a new build is + generated. All builds should now have all the proper files as expected and + run properly. - Updated dependencies ## 0.4.1-11 Beta - Now with some butter - 6 December 2017 @@ -84,7 +112,8 @@ BugFixes: - Updated nw.js with ffmpeg fix from Butter Project (butterproject.org) OpenSubtitles: -- Added error handling to OpenSubtitles search call, movie list will appear after a short time. +- Added error handling to OpenSubtitles search call, movie list will appear + after a short time. ## 0.4.1-9 Beta - I have a need for speed - 10 October 2017 diff --git a/README.md b/README.md index d88683b1..225c15b3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ -[Warning! Popcorntime.sh threatens your computer privacy.](http://popcorn-time.is/official-statement.html#Malware2) - # [Popcorn Time Community](https://github.com/PopcornTime-CE/desktop) -[![Join the chat at https://gitter.im/PopcornTime-CE/desktop](https://badges.gitter.im/PopcornTime-CE/desktop.svg)](https://gitter.im/PopcornTime-CE/desktop?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Join the chat at https://gitter.im/PopcornTime-CE/desktop](https://badges.gitter.im/PopcornTime-CE/desktop.svg)](https://gitter.im/PopcornTime-CE/desktop?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![CircleCI](https://circleci.com/gh/captainyarr/popcorntime-ce-desktop.svg?style=shield)](https://app.circleci.com/pipelines/github/captainyarr/popcorntime-ce-desktop) Allow anyone to easily watch their favorite movies, shows, and anime. @@ -98,4 +96,4 @@ You should have received a copy of the GNU General Public License along with thi *** -Copyright (c) 2019 Popcorn Time Community - Released under the [GPL v3 license](LICENSE.txt). +Copyright (c) 2020 Popcorn Time Community - Released under the [GPL v3 license](LICENSE.txt). diff --git a/greenkeeper.json b/greenkeeper.json deleted file mode 100644 index b85259a0..00000000 --- a/greenkeeper.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "groups": { - "default": { - "packages": [ - "package.json", - "src/app/vendor/mousetrap/package.json" - ] - } - } -} diff --git a/gulpfile.js b/gulpfile.js index f7231157..7cdfa1a5 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -28,7 +28,7 @@ var argv = require('yargs') .argv; //Set Default nw.js version -var nwVersion = '0.41.3'; +var nwVersion = '0.44.1'; var buildDownloadUrl = 'https://dl.nwjs.io/'; nwVersion = argv.nwv ? argv.nwv : nwVersion; @@ -72,7 +72,12 @@ var buildTask = function () { }; var cleanTask = function () { - return del('build/'); + var item = 0; + + buildplatforms.forEach(item => { + del('build/Popcorn-Time-CE/'+item+'/'); + }); + return del('build/Popcorn-Time-CE/'+item+'/'); } var ffmpegcacheTask = function () { @@ -185,29 +190,45 @@ var zipTask = function () { zipArray.add(gulp.src('./build/Popcorn-Time-CE/linux64/**') .pipe(tar('popcorn-time-ce_linux64_' + package.version + '.tar')) .pipe(gzip()) - .pipe(gulp.dest('./dist'))); + .pipe(gulp.dest('./dist')) + .on('end', function() { + console.log('Build Zip Complete: ' + item); + }) + ); break; case "linux32": zipArray.add(gulp.src('./build/Popcorn-Time-CE/linux32/**') .pipe(tar('popcorn-time-ce_linux32_' + package.version + '.tar')) .pipe(gzip()) - .pipe(gulp.dest('./dist'))); + .pipe(gulp.dest('./dist')) + .on('end', function() { + console.log('Build Zip Complete: ' + item); + })); break; case "win32": zipArray.add(gulp.src('./build/Popcorn-Time-CE/win32/**') .pipe(zip('popcorn-time-ce_win32_' + package.version + '.zip')) - .pipe(gulp.dest('./dist'))); + .pipe(gulp.dest('./dist')) + .on('end', function() { + console.log('Build Zip Complete: ' + item); + })); break; case "win64": zipArray.add(gulp.src('./build/Popcorn-Time-CE/win64/**') .pipe(zip('popcorn-time-ce_win64_' + package.version + '.zip')) - .pipe(gulp.dest('./dist'))); + .pipe(gulp.dest('./dist')) + .on('end', function() { + console.log('Build Zip Complete: ' + item); + })); break; case "osx64": zipArray.add(gulp.src('./build/Popcorn-Time-CE/osx64/**') .pipe(zip('popcorn-time-ce_osx64_' + package.version + '.zip')) //.pipe(gzip()) - .pipe(gulp.dest('./dist'))); + .pipe(gulp.dest('./dist')) + .on('end', function() { + console.log('Build Zip Complete: ' + item); + })); break; } }); diff --git a/install b/install index 14100e74..62952470 100755 --- a/install +++ b/install @@ -23,7 +23,7 @@ fi func_error #Variables -version="0.4.1-17.1" +version="0.4.2-0" tos="https://popcorntime.sh/tos" $path="$HOME/.Popcorn-Time-CE" diff --git a/package-lock.json b/package-lock.json index 4630a401..86a5f247 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "Popcorn-Time-CE", - "version": "0.4.1-17.1", + "version": "0.4.2-0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -682,6 +682,11 @@ "fastq": "^1.6.0" } }, + "@servie/events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@servie/events/-/events-1.0.0.tgz", + "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==" + }, "@types/babel__core": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", @@ -723,6 +728,12 @@ "@babel/types": "^7.3.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -783,6 +794,11 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, + "@types/tough-cookie": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.7.tgz", + "integrity": "sha512-rMQbgMGxnLsdn8e9aPVyuN+zMQLrZ2QW8xlv7eWS1mydfGXN+tsTKffcIzd8rGCcLdmi3xvQw2MDaZI1bBNTaw==" + }, "@types/yargs": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", @@ -798,6 +814,11 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "URIjs": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/URIjs/-/URIjs-1.16.1.tgz", + "integrity": "sha1-7evGeLi3SyawXStIHhI4P1rgS4s=" + }, "abab": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", @@ -809,14 +830,6 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", @@ -842,9 +855,9 @@ } }, "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "acorn-walk": { @@ -928,50 +941,20 @@ } }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - } - }, - "ambi": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", - "integrity": "sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=", - "requires": { - "editions": "^1.1.1", - "typechecker": "^4.3.0" }, "dependencies": { - "typechecker": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz", - "integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==", - "requires": { - "editions": "^2.1.0" - }, - "dependencies": { - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - } - } + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" } } }, @@ -1214,9 +1197,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1228,9 +1211,9 @@ } }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "lodash": { @@ -1547,9 +1530,9 @@ "dev": true }, "async": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", - "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" }, "async-done": { "version": "1.3.2", @@ -1572,7 +1555,8 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true }, "async-settle": { "version": "1.0.0", @@ -1594,11 +1578,6 @@ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, - "aws-sign": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", - "integrity": "sha1-xVAThWyBlOyFSgy+yQqrWgTOOsU=" - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1609,6 +1588,14 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, "babel-jest": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", @@ -1913,9 +1900,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2005,9 +1992,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2046,18 +2033,10 @@ "multicast-dns-service-types": "^1.1.0" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "boom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz", - "integrity": "sha1-yM2wQUNZEnQWKMBE7Mcy0dF8Ceo=", - "requires": { - "hoek": "0.7.x" - } + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" }, "boxen": { "version": "1.3.0", @@ -2330,6 +2309,11 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, + "byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", + "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==" + }, "bytebuffer": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-3.5.5.tgz", @@ -2448,29 +2432,6 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, - "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - } - }, "chokidar": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", @@ -2566,9 +2527,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2631,10 +2592,27 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, + "client-oauth2": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/client-oauth2/-/client-oauth2-4.3.3.tgz", + "integrity": "sha512-k8AvUYJon0vv75ufoVo4nALYb/qwFFicO3I0+39C6xEdflqVtr+f9cy+0ZxAduoVSTfhP5DX2tY2XICAd5hy6Q==", + "requires": { + "popsicle": "^12.0.5", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", @@ -2644,12 +2622,14 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -2657,12 +2637,14 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -2673,6 +2655,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -2681,6 +2664,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -2906,11 +2890,6 @@ "safe-buffer": "~5.1.1" } }, - "cookie-jar": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", - "integrity": "sha1-ZOzAasl423leS1KQy+SLo3gUAPo=" - }, "cookiejar": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", @@ -2966,9 +2945,9 @@ } }, "create-torrent": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-4.4.1.tgz", - "integrity": "sha512-LuoXnCRMKEo3KR3jEbCRpP3Nu2TUhLTlb/axP9+rl+ouhBpxTaHaTTN1bdUS2x2VK3wWyCBl1OZHyHhlRBntWg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-4.4.2.tgz", + "integrity": "sha512-FRxgYty6AF00xrYKMtpQ14ZJlst+i7mmUhcN4do7TTjktEntqAzfriaOIV6xk27t9GLTtraFnaTxsGgnyFA2eA==", "requires": { "bencode": "^2.0.0", "block-stream2": "^2.0.0", @@ -2985,9 +2964,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3034,41 +3013,12 @@ } } }, - "cryptiles": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz", - "integrity": "sha1-GlVnNPBtJLo0hirpy55wmjr7/xw=", - "requires": { - "boom": "0.3.x" - } - }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, - "csextends": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz", - "integrity": "sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==" - }, - "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", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -3147,7 +3097,8 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "decompress-response": { "version": "3.3.0", @@ -3393,20 +3344,6 @@ "esutils": "^2.0.2" } }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -3416,23 +3353,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -3505,14 +3425,6 @@ "object.defaults": "^1.1.0" } }, - "eachr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/eachr/-/eachr-2.0.4.tgz", - "integrity": "sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8=", - "requires": { - "typechecker": "^2.0.8" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -3523,11 +3435,6 @@ "safer-buffer": "^2.1.0" } }, - "editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==" - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3544,7 +3451,8 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, "encodeurl": { "version": "1.0.2", @@ -3559,37 +3467,6 @@ "once": "^1.4.0" } }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "errlop": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz", - "integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==", - "requires": { - "editions": "^2.1.2" - }, - "dependencies": { - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - } - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3714,9 +3591,9 @@ } }, "eslint": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", - "integrity": "sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -3726,19 +3603,19 @@ "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.2", + "eslint-utils": "^1.4.3", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^11.7.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.4.1", + "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -3747,7 +3624,7 @@ "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^6.1.2", @@ -3759,15 +3636,26 @@ }, "dependencies": { "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -3796,6 +3684,27 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3826,6 +3735,12 @@ "ms": "^2.1.1" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -3837,15 +3752,33 @@ "tmp": "^0.0.33" } }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3862,36 +3795,97 @@ "dev": true }, "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.2.tgz", + "integrity": "sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", + "figures": "^3.0.0", + "lodash": "^4.17.16", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "ms": { @@ -3900,32 +3894,84 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", + "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } } } @@ -3948,9 +3994,9 @@ } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { @@ -3971,9 +4017,9 @@ "dev": true }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -3981,35 +4027,35 @@ } }, "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", - "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "^7.0.0", - "acorn-jsx": "^5.0.2", + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" }, "dependencies": { "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true } } @@ -4021,12 +4067,20 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { @@ -4064,11 +4118,6 @@ "es5-ext": "~0.10.14" } }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, "eventemitter3": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", @@ -4196,21 +4245,6 @@ } } }, - "extendr": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/extendr/-/extendr-2.1.0.tgz", - "integrity": "sha1-MBqgu+pWX00tyPVw8qImEahSe1Y=", - "requires": { - "typechecker": "~2.0.1" - }, - "dependencies": { - "typechecker": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz", - "integrity": "sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=" - } - } - }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -4296,21 +4330,6 @@ } } }, - "extract-opts": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-2.2.0.tgz", - "integrity": "sha1-H6KOunNSxttID4hc63GkaBC+bX0=", - "requires": { - "typechecker": "~2.0.1" - }, - "dependencies": { - "typechecker": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz", - "integrity": "sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=" - } - } - }, "extract-zip": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", @@ -4321,6 +4340,23 @@ "debug": "2.6.9", "mkdirp": "0.5.1", "yauzl": "2.4.1" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } } }, "extsprintf": { @@ -4489,10 +4525,10 @@ "typedarray-to-buffer": "^3.0.0" }, "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -4597,9 +4633,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flatten": { @@ -4617,6 +4653,24 @@ "readable-stream": "^2.3.6" } }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4672,9 +4726,9 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-chunk-store": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fs-chunk-store/-/fs-chunk-store-2.0.1.tgz", - "integrity": "sha512-V9PXz33rhq6E9lFmvmElmLyvEvnSeryU/TzfHnCEIpEU6Y/2Fyc4xEeeneV/pUgKG1mRAKSU+DBtHyO2GQ2EBA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fs-chunk-store/-/fs-chunk-store-2.0.2.tgz", + "integrity": "sha512-4nSngo6KyoGguscb5sTxjcxOvtRiMxuQl4vFK9SnYYMjmy08Nm095ACoM3lxj1KmCuxO4JMnuo4EebMWHlagjQ==", "requires": { "random-access-file": "^2.0.1", "randombytes": "^2.0.3", @@ -5390,33 +5444,6 @@ "assert-plus": "^1.0.0" } }, - "gitlab": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/gitlab/-/gitlab-11.3.2.tgz", - "integrity": "sha512-GJKj2SgYTNA2M3i21RcBUXw3ItRMn+MPwcmJZu+Yz3AYCEYdr0KOL+2kP37Jzyn4lqXdcPmAjsvQ6hk99uLmzg==", - "requires": { - "form-data": "^2.5.1", - "ky": "^0.15.0", - "ky-universal": "^0.3.0", - "li": "^1.3.0", - "query-string": "^6.8.3", - "universal-url": "^2.0.0", - "xcase": "^2.0.1", - "yargs": "^14.2.0" - }, - "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -5574,11 +5601,6 @@ "url-parse-lax": "^1.0.0" } }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" - }, "graceful-fs-extra": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/graceful-fs-extra/-/graceful-fs-extra-2.0.0.tgz", @@ -5896,9 +5918,9 @@ } }, "gulp-zip": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.1.tgz", - "integrity": "sha512-M/IWLh9RvOpuofDZkgDirtiyz9J3yIqnDOJ3muzk2D/XnZ1ruqPlPLRIpXnl/aZU+xXwKPdOIxjRzkUcVEQyZQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.2.tgz", + "integrity": "sha512-rZd0Ppuc8Bf7J2/WzcdNaeb+lcEXf1R8mV/PJ9Kdu7PmnInWVeLSmiXIka/2QSe6uhAsGVFAMffWSaMzAPGTBg==", "dev": true, "requires": { "get-stream": "^5.1.0", @@ -5929,6 +5951,12 @@ "pump": "^3.0.0" } }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -5940,17 +5968,18 @@ } }, "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true }, "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "requires": { + "inherits": "^2.0.4", "readable-stream": "2 || 3" } }, @@ -6100,32 +6129,11 @@ } } }, - "hasurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hasurl/-/hasurl-1.0.0.tgz", - "integrity": "sha512-43ypUd3DbwyCT01UYpA99AEZxZ4aKtRxWGBHEIbjcOsUghd9YUON0C+JF6isNjaiwC/UF5neaUudy6JS9jZPZQ==" - }, "hat": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=" }, - "hawk": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", - "integrity": "sha1-mzYd7pWpMWQObVBOBWCaj8OsRdI=", - "requires": { - "boom": "0.3.x", - "cryptiles": "0.1.x", - "hoek": "0.7.x", - "sntp": "0.1.x" - } - }, - "hoek": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", - "integrity": "sha1-YPvZBFV1Qc0rh5Wr8wihs3cOFVo=" - }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -6149,31 +6157,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -6234,22 +6217,22 @@ } }, "i18n": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.3.tgz", - "integrity": "sha1-LYzxwkciYCwgQdAbpq5eqlE4jw4=", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.6.tgz", + "integrity": "sha512-aMsJq8i1XXrb+BBsgmJBwak9mr69zPEIAUPb6c5yw2G/O4k1Q52lBxL+agZdQDN/RGf1ylQzrCswsOOgIiC1FA==", "requires": { "debug": "*", - "make-plural": "^3.0.3", - "math-interval-parser": "^1.1.0", - "messageformat": "^0.3.1", + "make-plural": "^6.0.1", + "math-interval-parser": "^2.0.1", + "messageformat": "^2.3.0", "mustache": "*", - "sprintf-js": ">=1.0.3" + "sprintf-js": "^1.1.2" } }, "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -6266,20 +6249,6 @@ "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, - "ignorefs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", - "integrity": "sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=", - "requires": { - "editions": "^1.3.3", - "ignorepatterns": "^1.1.0" - } - }, - "ignorepatterns": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz", - "integrity": "sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=" - }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -6291,9 +6260,9 @@ "integrity": "sha1-Ds2tDFRjMmcte1tRGya7GM5W5z8=" }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -6460,6 +6429,11 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "ip-set": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ip-set/-/ip-set-1.0.2.tgz", @@ -6853,6 +6827,14 @@ "@babel/types": "^7.4.0", "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-report": { @@ -7933,6 +7915,12 @@ "supports-color": "^5.3.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -8147,9 +8135,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -8423,27 +8411,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "ky": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.15.0.tgz", - "integrity": "sha512-6IlJRPFHq4ZKRRa9lyh6YqHqlmddAkfyXI9CYvZpLQtg7fQvwncPHyHrmtXAHKCqHOilINPMT88eW6FTA3HwkA==" - }, - "ky-universal": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.3.0.tgz", - "integrity": "sha512-CM4Bgb2zZZpsprcjI6DNYTaH3oGHXL2u7BU4DK+lfCuC4snkt9/WRpMYeKbBbXscvKkeqBwzzjFX2WwmKY5K/A==", - "requires": { - "abort-controller": "^3.0.0", - "node-fetch": "^2.6.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - } - } - }, "last-one-wins": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", @@ -8523,11 +8490,6 @@ "type-check": "~0.3.2" } }, - "li": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/li/-/li-1.3.0.tgz", - "integrity": "sha1-IsWbyu+qmo7zWc91l4TkvxBq6hs=" - }, "lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -8601,6 +8563,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -8609,7 +8572,8 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, @@ -8672,20 +8636,11 @@ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true }, "lodash.difference": { "version": "4.5.0", @@ -8702,20 +8657,11 @@ "lodash._root": "^3.0.0" } }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true }, "lodash.isarguments": { "version": "3.1.0", @@ -8746,46 +8692,17 @@ "lodash.isarray": "^3.0.0" } }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, "lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", "dev": true }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true }, "lodash.template": { "version": "3.6.2", @@ -8897,6 +8814,19 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "make-error-cause": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-2.3.0.tgz", + "integrity": "sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==", + "requires": { + "make-error": "^1.3.5" + } + }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -8907,12 +8837,9 @@ } }, "make-plural": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-3.0.6.tgz", - "integrity": "sha1-IDOgO6wpC487uRJY9lud9+iwHKc=", - "requires": { - "minimist": "^1.2.0" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.1.0.tgz", + "integrity": "sha512-0ekbPHqxcdRcmjZ43TkRuejK5rXgMF1OjG4FVnVHgCvOcjrexaSX7a0dfAvqhOm1qWPgjYnXtmz3cHpHW5ZewA==" }, "makeerror": { "version": "1.0.11", @@ -8998,12 +8925,9 @@ } }, "math-interval-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-1.1.0.tgz", - "integrity": "sha1-2+2lsGsySZc8bfYXD94jhvCv2JM=", - "requires": { - "xregexp": "^2.0.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", + "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==" }, "mdns-js": { "version": "0.5.0", @@ -9042,9 +8966,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9110,36 +9034,35 @@ "dev": true }, "messageformat": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-0.3.1.tgz", - "integrity": "sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", + "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", "requires": { - "async": "~1.5.2", - "glob": "~6.0.4", - "make-plural": "~3.0.3", - "nopt": "~3.0.6", - "watchr": "~2.4.13" + "make-plural": "^4.3.0", + "messageformat-formatters": "^2.0.1", + "messageformat-parser": "^4.1.2" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "make-plural": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", + "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimist": "^1.2.0" } } } }, + "messageformat-formatters": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", + "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==" + }, + "messageformat-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.2.tgz", + "integrity": "sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA==" + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -9246,17 +9169,17 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" }, "dependencies": { "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, @@ -9267,9 +9190,9 @@ "dev": true }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" }, "mp4-box-encoding": { "version": "1.4.1", @@ -9290,9 +9213,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9340,9 +9263,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9352,9 +9275,9 @@ } }, "mustache": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz", - "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.1.tgz", + "integrity": "sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA==" }, "mute-stdout": { "version": "1.0.1", @@ -9626,6 +9549,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, "requires": { "abbrev": "1" } @@ -9686,14 +9610,6 @@ "set-blocking": "~2.0.0" } }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "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", @@ -10077,9 +9993,9 @@ "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=" }, "opensubtitles-api": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/opensubtitles-api/-/opensubtitles-api-5.0.1.tgz", - "integrity": "sha512-Iurb30SrY5eHoZz/ORxBfuXCApBy5uHkUae7AZ6gfyNgpbRlBnQAvEtHWGu5caOHT/61n98O8Kmh2f2sX+4quQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/opensubtitles-api/-/opensubtitles-api-5.1.1.tgz", + "integrity": "sha512-FU/tBfMUSisFlmOmvbU8ONaUnAFkN1mb/I75CbjhqNsvKtdZhfEL4eFx+XWswLbX1P1n/K7IY6az5P4bGafiBA==", "requires": { "urijs": "^1.19.1", "xmlrpc": "^1.3.2" @@ -10240,6 +10156,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -10248,6 +10165,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -10270,7 +10188,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "package-json": { "version": "4.0.1", @@ -10329,9 +10248,9 @@ } }, "parse-numeric-range": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", - "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz", + "integrity": "sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg==" }, "parse-passwd": { "version": "1.0.0", @@ -10340,17 +10259,16 @@ "dev": true }, "parse-torrent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-7.0.1.tgz", - "integrity": "sha512-FdF1kBImRLt+ICV4NTz8L+sI2hFlPXAq1tXuw21gKz8EuThyVUFJ/wPfBEyYQrvnBpmGf7cM/LVSOhMRe8MrKw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-7.1.3.tgz", + "integrity": "sha512-to8zT7+o6bVTyP35r2QgG1svuFGMFO1mE6ri1oWHgL9tlgnOtfjmfHmA3mOuP9HTIU/8OiZw0NG5zbyqVLxhvA==", "requires": { "bencode": "^2.0.0", "blob-to-buffer": "^1.2.6", "get-stdin": "^7.0.0", "magnet-uri": "^5.1.3", "simple-get": "^3.0.1", - "simple-sha1": "^3.0.0", - "uniq": "^1.0.1" + "simple-sha1": "^3.0.0" }, "dependencies": { "simple-sha1": { @@ -10592,7 +10510,8 @@ "picomatch": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true }, "piece-length": { "version": "2.0.1", @@ -10691,28 +10610,127 @@ } } }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "pop-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", + "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" + }, + "popsicle": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.0.5.tgz", + "integrity": "sha512-PZt2+KfNQVwYXEwaAdJPLsYFJ+j0M25+26GhBovxhq9TZFRJfigAlJ5JfioCf/9R4RcTSu9VeaovJcb20Br7mw==", + "requires": { + "popsicle-content-encoding": "^1.0.0", + "popsicle-cookie-jar": "^1.0.0", + "popsicle-redirects": "^1.1.0", + "popsicle-transport-http": "^1.0.6", + "popsicle-transport-xhr": "^1.0.2", + "popsicle-user-agent": "^1.0.0", + "servie": "^4.3.2", + "throwback": "^4.1.0", + "tough-cookie": "^3.0.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "popsicle-content-encoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/popsicle-content-encoding/-/popsicle-content-encoding-1.0.0.tgz", + "integrity": "sha512-4Df+vTfM8wCCJVTzPujiI6eOl3SiWQkcZg0AMrOkD1enMXsF3glIkFUZGvour1Sj7jOWCsNSEhBxpbbhclHhzw==" + }, + "popsicle-cookie-jar": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/popsicle-cookie-jar/-/popsicle-cookie-jar-1.0.0.tgz", + "integrity": "sha512-vrlOGvNVELko0+J8NpGC5lHWDGrk8LQJq9nwAMIVEVBfN1Lib3BLxAaLRGDTuUnvl45j5N9dT2H85PULz6IjjQ==", + "requires": { + "@types/tough-cookie": "^2.3.5", + "tough-cookie": "^3.0.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "popsicle-redirects": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/popsicle-redirects/-/popsicle-redirects-1.1.0.tgz", + "integrity": "sha512-XCpzVjVk7tty+IJnSdqWevmOr1n8HNDhL86v7mZ6T1JIIf2KGybxUk9mm7ZFOhWMkGB0e8XkacHip7BV8AQWQA==" + }, + "popsicle-transport-http": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/popsicle-transport-http/-/popsicle-transport-http-1.0.8.tgz", + "integrity": "sha512-5jeUUNSAElwNnFkb6LE1b/YlOHlaFWKN8N8BBdHZWIK6QQzb34nuXkbKJZxn7xK5VrGpCAraHayycQf7KpIJOw==", + "requires": { + "make-error-cause": "^2.2.0", + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "popsicle-transport-xhr": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/popsicle-transport-xhr/-/popsicle-transport-xhr-1.0.2.tgz", + "integrity": "sha512-v9eAJnj1tydT4VmDdyKFE1z/+oL01vB7AS3LfSFMAYv33dzqlxtbApKALcYWBQotIqw3FoIqd2FiDR6qJsOxtA==" }, - "pop-iterate": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", - "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" + "popsicle-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/popsicle-user-agent/-/popsicle-user-agent-1.0.0.tgz", + "integrity": "sha512-epKaq3TTfTzXcxBxjpoKYMcTTcAX8Rykus6QZu77XNhJuRHSRxMd+JJrbX/3PFI0opFGSN0BabbAYCbGxbu0mA==" }, "posix-character-classes": { "version": "0.1.1", @@ -10878,7 +10896,8 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, "q": { "version": "2.0.3", @@ -10900,20 +10919,10 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, - "query-string": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.8.3.tgz", - "integrity": "sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==", - "requires": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, "queue-microtask": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.1.2.tgz", - "integrity": "sha512-F9wwNePtXrzZenAB3ax0Y8TSKGvuB7Qw16J30hspEUTbfUM+H827XyN3rlpwhVmtm5wuZtbKIHjOnwDn7MUxWQ==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.1.3.tgz", + "integrity": "sha512-zC1ZDLKFhZSa8vAdFbkOGouHcOUMgUAI/2/3on/KktpY+BaVqABkzDSsCSvJfmLbICOnrEuF9VIMezZf+T0mBA==" }, "random-access-file": { "version": "2.1.3", @@ -10959,9 +10968,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10971,14 +10980,9 @@ } }, "rarbg-api": { - "version": "git+https://github.com/talas9/rarbg-api.git#599b6f4404e9f739062ceb3ba17fe9a619f7797a", - "from": "git+https://github.com/talas9/rarbg-api.git", - "requires": { - "cheerio": "0.x.x", - "moment": "2.x.x", - "q": "2.x.x", - "request": "2.x.x" - } + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rarbg-api/-/rarbg-api-1.1.4.tgz", + "integrity": "sha512-BxhHwCW/h18l8m8nwONfEVcNRN0qt0mBp0eM0yecdDIG6h1VcNMdCViLqyPethZC0UExTCGsioCWvVWbCkBMhg==" }, "rc": { "version": "1.2.8", @@ -11028,54 +11032,16 @@ } }, "read-torrent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/read-torrent/-/read-torrent-1.3.0.tgz", - "integrity": "sha1-Tg71vqbLJNMYQ+tvqFQ60CMqufQ=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/read-torrent/-/read-torrent-1.3.1.tgz", + "integrity": "sha512-TzPdVpK3xEnvsS1yCy94CiOmfzG2/MNuZjpZi64+HJxb9fVZD4nIfFFGZ9T2N/dgwOFumfacw3xCD6rXtgwn2g==", "requires": { "magnet-uri": "~2.0.0", "parse-torrent": "^4.0.0", - "request": "~2.16.2", + "request": "^2.83.0", "xtend": "^4.0.0" }, "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "requires": { - "delayed-stream": "0.0.5" - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" - }, - "forever-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", - "integrity": "sha1-4cJcetROCcOPIzh2x2/MJP+EOx8=" - }, - "form-data": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", - "integrity": "sha1-2zRaU3jYau6x7V1VO4aawZLS9e0=", - "requires": { - "async": "~0.2.7", - "combined-stream": "~0.0.4", - "mime": "~1.2.2" - } - }, - "json-stringify-safe": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", - "integrity": "sha1-nbew5TDH8onF6MhDKvGRwv91pbM=" - }, "magnet-uri": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-2.0.1.tgz", @@ -11084,21 +11050,6 @@ "thirty-two": "~0.0.1" } }, - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "oauth-sign": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", - "integrity": "sha1-oOahcV2u0GLzIrYit/5a/RA1tuI=" - }, "parse-torrent": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-4.1.0.tgz", @@ -11120,38 +11071,10 @@ } } }, - "qs": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", - "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=" - }, - "request": { - "version": "2.16.6", - "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", - "integrity": "sha1-hy/kRa5y3iZrN4edatfclI+gHK0=", - "requires": { - "aws-sign": "~0.2.0", - "cookie-jar": "~0.2.0", - "forever-agent": "~0.2.0", - "form-data": "~0.0.3", - "hawk": "~0.10.2", - "json-stringify-safe": "~3.0.0", - "mime": "~1.2.7", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.2.0", - "qs": "~0.5.4", - "tunnel-agent": "~0.2.0" - } - }, "thirty-two": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", "integrity": "sha1-QlPinYywWPBIAmfFaYwOSSflS2o=" - }, - "tunnel-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", - "integrity": "sha1-aFPCr7GyEJ5FYp5JK9419Fnqaeg=" } } }, @@ -11177,11 +11100,18 @@ } }, "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "requires": { - "picomatch": "^2.0.4" + "picomatch": "^2.2.1" + }, + "dependencies": { + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + } } }, "realpath-native": { @@ -11300,15 +11230,15 @@ "dev": true }, "render-media": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/render-media/-/render-media-3.4.0.tgz", - "integrity": "sha512-0BTIvIBS4xdC/qPpoj8ZsdZ/YoQhn+DutUqBkur1yUs5SnDoruiAtaHFJhxle8pREnNN/kT8E8fkftgMkJ8Tvg==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/render-media/-/render-media-3.4.3.tgz", + "integrity": "sha512-Gyk9CYWqGmG2W83ZfQnK8ZGZbmKkrxnHHHiWxF32vH5Afd19IIPZFZADtlmeXVA2petJgCB9L1EbPUc6dS8jDg==", "requires": { "debug": "^4.1.1", "is-ascii": "^1.0.0", - "mediasource": "^2.1.0", - "stream-to-blob-url": "^3.0.0", - "videostream": "^3.2.0" + "mediasource": "^2.3.0", + "stream-to-blob-url": "^3.0.2", + "videostream": "^3.2.1" }, "dependencies": { "debug": { @@ -11365,9 +11295,9 @@ } }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -11376,7 +11306,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -11386,9 +11316,25 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "request-progress": { @@ -11431,7 +11377,8 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "require-main-filename": { "version": "1.0.1", @@ -11528,9 +11475,9 @@ } }, "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } @@ -11591,14 +11538,6 @@ "ret": "~0.1.10" } }, - "safefs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", - "integrity": "sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=", - "requires": { - "graceful-fs": "*" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -11686,20 +11625,10 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", "integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=" }, - "scandirectory": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", - "integrity": "sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=", - "requires": { - "ignorefs": "^1.0.0", - "safefs": "^3.1.2", - "taskgroup": "^4.0.5" - } - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "semver-diff": { "version": "2.1.0", @@ -11770,10 +11699,20 @@ "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", "optional": true }, + "servie": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/servie/-/servie-4.3.2.tgz", + "integrity": "sha512-1NpFf3LjkDDq4IIuBqtqHfSdPWhXpuyWwuBdwbifZjWSxQd8rCWz5W9AluxNvWfteM1qQ26puODIzWljvBJc5A==", + "requires": { + "@servie/events": "^1.0.0", + "byte-length": "^1.0.2" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "set-value": { "version": "2.0.0", @@ -11857,9 +11796,9 @@ } }, "mimic-response": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", - "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" } } }, @@ -12080,14 +12019,6 @@ } } }, - "sntp": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz", - "integrity": "sha1-XvSBuVGnspr/30r9fyaDj8ESD4Q=", - "requires": { - "hoek": "0.7.x" - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -12178,11 +12109,6 @@ "through": "2" } }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -12285,14 +12211,14 @@ } }, "stream-to-blob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-to-blob/-/stream-to-blob-2.0.0.tgz", - "integrity": "sha512-E+YitTtIHo7RQ4Cmgl+EzlMpqvLroTynRgt4t0pI4y5oz/piqlBQB8NFXLIWcjGOsKw+THnImrdpWcOCVxK25Q==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-to-blob/-/stream-to-blob-2.0.1.tgz", + "integrity": "sha512-GXlqXt3svqwIVWoICenix5Poxi4KbCF0BdXXUbpU1X4vq1V8wmjiEIU3aFJzCGNFpKxfbnG0uoowS3nKUgSPYg==" }, "stream-to-blob-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-to-blob-url/-/stream-to-blob-url-3.0.0.tgz", - "integrity": "sha512-Mu1iPvbBkzdUPCZ+J+XBr/oagjOBfj4vpErHRIe08QzWeILSDtF5LXo6v44HeQFpx7dfqcBKjGUbSNCJ+38zqQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-to-blob-url/-/stream-to-blob-url-3.0.2.tgz", + "integrity": "sha512-PS6wT2ZyyR38Cy+lE6PBEI1ZmO2HdzZoLeDGG0zZbYikCZd0dh8FUoSeFzgWLItpBYw1WJmPVRLpykRV+lAWLQ==", "requires": { "stream-to-blob": "^2.0.0" } @@ -12305,11 +12231,6 @@ "once": "^1.3.3" } }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" - }, "strike-api": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/strike-api/-/strike-api-0.2.0.tgz", @@ -12564,9 +12485,9 @@ "dev": true }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "string-width": { @@ -12638,19 +12559,10 @@ "xtend": "^4.0.0" } }, - "taskgroup": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz", - "integrity": "sha1-feGT/r12gnPEV3MElwJNUSwnkVo=", - "requires": { - "ambi": "^2.2.0", - "csextends": "^1.0.3" - } - }, "temp": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz", - "integrity": "sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", + "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", "requires": { "rimraf": "~2.6.2" }, @@ -12830,6 +12742,11 @@ "xtend": "~4.0.0" } }, + "throwback": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throwback/-/throwback-4.1.0.tgz", + "integrity": "sha512-dLFe8bU8SeH0xeqeKL7BNo8XoPC/o91nz9/ooeplZPiso+DZukhoyZcSz9TFnUNScm+cA9qjU1m1853M6sPOng==" + }, "thunky": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", @@ -13077,51 +12994,23 @@ } }, "torrent-tracker": { - "version": "git+https://github.com/PTCE-Public/torrent-tracker.git#6c2ac5eedec302ea6e0ba5264fdeedbc8dfc0690", - "from": "git+https://github.com/PTCE-Public/torrent-tracker.git", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/torrent-tracker/-/torrent-tracker-0.0.9.tgz", + "integrity": "sha512-hjnhQxuT3B0IErlL6k6omVa6G65ntwifPORHMnDnhyZNQfh6krei9MLdH2O/io1WgpWlb8PLZJl9mag7S286ow==", "requires": { - "bencode": "^0.7.0", + "bencode": "^2.0.0", "compact2string": "^1.4.0", "hat": "0.0.3", - "request": "^2.60.0", - "underscore": "^1.8.3", - "urijs": "^1.17.0" - }, - "dependencies": { - "bencode": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-0.7.0.tgz", - "integrity": "sha1-gR7WR8ARiUXkG7S7veqaLHihcIM=" - } - } - }, - "torrent-tracker-health": { - "version": "git+https://github.com/PTCE-Public/torrent-tracker-health.git#4d593d415fe114b9f9f02aa2864d91b55086cb14", - "from": "git+https://github.com/PTCE-Public/torrent-tracker-health.git", - "requires": { - "async": "^1.4.0", - "debug": "^2.2.0", - "q": "1.4.1", - "read-torrent": "1.3.0", - "torrent-tracker": "git+https://github.com/PTCE-Public/torrent-tracker.git" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" - } + "request": "^2.88.0", + "underscore": "^1.9.1", + "urijs": "^1.19.1" } }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -13131,6 +13020,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, "requires": { "punycode": "^2.1.0" }, @@ -13138,7 +13028,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true } } }, @@ -13155,9 +13046,9 @@ "optional": true }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tunnel-agent": { @@ -13183,10 +13074,11 @@ "prelude-ls": "~1.1.2" } }, - "typechecker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-2.1.0.tgz", - "integrity": "sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M=" + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true }, "typedarray": { "version": "0.0.6", @@ -13241,9 +13133,9 @@ "dev": true }, "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==" }, "undertaker": { "version": "1.2.1", @@ -13327,15 +13219,6 @@ "crypto-random-string": "^1.0.0" } }, - "universal-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universal-url/-/universal-url-2.0.0.tgz", - "integrity": "sha512-3DLtXdm/G1LQMCnPj+Aw7uDoleQttNHp2g5FnNQKR6cP6taNWS1b/Ehjjx4PVyvejKi3TJyu8iBraKM4q3JQPg==", - "requires": { - "hasurl": "^1.0.0", - "whatwg-url": "^7.0.0" - } - }, "unordered-array-remove": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", @@ -13508,9 +13391,9 @@ } }, "upnp-mediarenderer-client": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/upnp-mediarenderer-client/-/upnp-mediarenderer-client-1.2.4.tgz", - "integrity": "sha1-DGOlGAIIK2sDtZbEdcxk/B4Id8g=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/upnp-mediarenderer-client/-/upnp-mediarenderer-client-1.4.0.tgz", + "integrity": "sha512-F+C3Yceoz0j3ZWEchz5tpaOEqkbpObRUmeuPGc9+2u2YvC1CDbXGQ6mjbM10MDhnUJ0tTWYTufpj6xsWctnULw==", "requires": { "debug": "^2.1.3", "elementtree": "^0.1.6", @@ -13659,9 +13542,9 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "v8flags": { @@ -13881,21 +13764,6 @@ "makeerror": "1.0.x" } }, - "watchr": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.4.13.tgz", - "integrity": "sha1-10hHu01vkPYf4sdPn2hmKqDgdgE=", - "requires": { - "eachr": "^2.0.2", - "extendr": "^2.1.0", - "extract-opts": "^2.2.0", - "ignorefs": "^1.0.0", - "safefs": "^3.1.2", - "scandirectory": "^2.5.0", - "taskgroup": "^4.2.0", - "typechecker": "^2.0.8" - } - }, "weak-map": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", @@ -13904,7 +13772,8 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "websocket-driver": { "version": "0.7.0", @@ -13921,51 +13790,50 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, "webtorrent": { - "version": "0.107.16", - "resolved": "https://registry.npmjs.org/webtorrent/-/webtorrent-0.107.16.tgz", - "integrity": "sha512-5fdPZFiZPxwbigAHtMVQ7ZCXbZSQlxgB6JPD77itpc9DdKYPpliFwCLsNiQpj1jmpo91HlHUJk+Xp3ks1fLUQg==", + "version": "0.108.6", + "resolved": "https://registry.npmjs.org/webtorrent/-/webtorrent-0.108.6.tgz", + "integrity": "sha512-hkwjMQTbBiwdJn3vEVjOyNwKZISp6r4GEl/J0N6Ukw2oeaETIylvAlf7G0o+a9FcFMThBIle0iCPYLTwumCOaQ==", "requires": { - "addr-to-ip-port": "^1.4.2", + "addr-to-ip-port": "^1.5.1", "bitfield": "^3.0.0", - "bittorrent-dht": "^9.0.0", - "bittorrent-protocol": "^3.0.0", - "chrome-net": "^3.3.2", - "chunk-store-stream": "^4.0.0", - "create-torrent": "^4.0.0", - "debug": "^4.1.0", - "end-of-stream": "^1.1.0", + "bittorrent-dht": "^10.0.0", + "bittorrent-protocol": "^3.1.1", + "chrome-net": "^3.3.4", + "chunk-store-stream": "^4.1.0", + "create-torrent": "^4.4.2", + "debug": "^4.1.1", + "end-of-stream": "1.4.1", "escape-html": "^1.0.3", - "fs-chunk-store": "^2.0.0", + "fs-chunk-store": "^2.0.2", "http-node": "github:feross/http-node#webtorrent", - "immediate-chunk-store": "^2.0.0", + "immediate-chunk-store": "^2.1.0", "load-ip-set": "^2.1.0", - "memory-chunk-store": "^1.2.0", - "mime": "^2.4.0", + "memory-chunk-store": "^1.3.0", + "mime": "^2.4.6", "multistream": "^4.0.0", - "package-json-versionify": "^1.0.2", - "parse-numeric-range": "^0.0.2", - "parse-torrent": "^7.0.0", + "package-json-versionify": "^1.0.4", + "parse-numeric-range": "^1.2.0", + "parse-torrent": "^7.1.3", "pump": "^3.0.0", "random-iterate": "^1.0.1", - "randombytes": "^2.0.3", - "range-parser": "^1.2.0", - "readable-stream": "^3.0.6", - "render-media": "^3.0.0", - "run-parallel": "^1.1.6", - "run-parallel-limit": "^1.0.3", + "randombytes": "^2.1.0", + "range-parser": "^1.2.1", + "readable-stream": "^3.6.0", + "render-media": "^3.4.3", + "run-parallel": "^1.1.9", + "run-parallel-limit": "^1.0.5", "simple-concat": "^1.0.0", "simple-get": "^3.0.1", - "simple-peer": "^9.0.0", + "simple-peer": "^9.7.2", "simple-sha1": "^3.0.1", - "speedometer": "^1.0.0", - "stream-to-blob": "^2.0.0", - "stream-to-blob-url": "^3.0.0", - "stream-with-known-length-to-buffer": "^1.0.0", - "torrent-discovery": "^9.1.1", + "speedometer": "^1.1.0", + "stream-to-blob": "^2.0.1", + "stream-to-blob-url": "^3.0.2", + "stream-with-known-length-to-buffer": "^1.0.3", + "torrent-discovery": "^9.3.0", "torrent-piece": "^2.0.0", - "uniq": "^1.0.1", "unordered-array-remove": "^1.0.2", - "ut_metadata": "^3.3.0", + "ut_metadata": "^3.5.0", "ut_pex": "^2.0.0" }, "dependencies": { @@ -13975,13 +13843,12 @@ "integrity": "sha512-hJmWKucJQfdSkQPDPBKmWogM9s8+NOSzDT9QVbJbjinXaQ0bJKPu/cn98qRWy3PDNWtKw4XaoUP3XruGRIKEgg==" }, "bittorrent-dht": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-9.0.3.tgz", - "integrity": "sha512-6FISjApL62THEMyptDm0kPTAnInBn8Sft3dK/JZcCI07LRIpIP+3Z6gle6xJUhyRVs6K5HmXAtaRatFsOEySOg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-10.0.0.tgz", + "integrity": "sha512-mrM18HMabvd3n/hQa4PYe942nWvBsJCBQb5PfT9kUJLlspNPGiulZYSCgWs7+XarS7nufYrGEp07f9eKTKIrgw==", "requires": { "bencode": "^2.0.0", "debug": "^4.1.1", - "inherits": "^2.0.1", "k-bucket": "^5.0.0", "k-rpc": "^5.0.0", "last-one-wins": "^1.0.4", @@ -13992,39 +13859,75 @@ } }, "bittorrent-tracker": { - "version": "9.14.4", - "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-9.14.4.tgz", - "integrity": "sha512-2Y/MNRjYhysD6t4r38z7l1WTT7g23IAqRWZRsj7xnnpciFn4xE4qiKmyFwA4gtbFGAZ14K3DdaqZbiQsC3PEfQ==", - "requires": { - "bencode": "^2.0.0", - "bittorrent-peerid": "^1.0.2", - "bn.js": "^5.0.0", - "bufferutil": "^4.0.0", - "chrome-dgram": "^3.0.2", - "compact2string": "^1.2.0", - "debug": "^4.0.1", - "ip": "^1.0.1", - "lru": "^3.0.0", - "minimist": "^1.1.1", - "once": "^1.3.0", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-9.15.0.tgz", + "integrity": "sha512-5LhLQeGxdVFumJTbveJS16Rc+Vzh/nbC6o80UMj6ZRvSkiVkk+4L782OMYI0VG1JTfUxiRFP4f+CZBFyuclLBg==", + "requires": { + "bencode": "^2.0.1", + "bittorrent-peerid": "^1.3.2", + "bn.js": "^5.1.1", + "bufferutil": "^4.0.1", + "chrome-dgram": "^3.0.4", + "compact2string": "^1.4.1", + "debug": "^4.1.1", + "ip": "^1.1.5", + "lru": "^3.1.0", + "minimist": "^1.2.5", + "once": "^1.4.0", "random-iterate": "^1.0.1", - "randombytes": "^2.0.3", - "run-parallel": "^1.1.2", - "run-series": "^1.0.2", - "simple-get": "^3.0.0", - "simple-peer": "^9.0.0", - "simple-websocket": "^8.0.0", - "string2compact": "^1.1.1", - "uniq": "^1.0.1", + "randombytes": "^2.1.0", + "run-parallel": "^1.1.9", + "run-series": "^1.1.8", + "simple-get": "^4.0.0", + "simple-peer": "^9.7.1", + "simple-websocket": "^8.1.1", + "string2compact": "^1.3.0", "unordered-array-remove": "^1.0.2", - "utf-8-validate": "^5.0.1", - "ws": "^7.0.0" + "utf-8-validate": "^5.0.2", + "ws": "^7.3.0" + }, + "dependencies": { + "simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + } } }, "bn.js": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.0.0.tgz", - "integrity": "sha512-bVwDX8AF+72fIUNuARelKAlQUNtPOfG2fRxorbVvFk4zpHbqLrPdOGfVg5vrKwVzLLePqPBiATaOZNELQzmS0A==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + }, + "chrome-dgram": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.5.tgz", + "integrity": "sha512-RcCR5Kpn+F7VGmtL3ex78ltB+cuuSTZdGBa4j3fQwUqz/90uOKd5t+WmnJp+QNv017oaHzn5GoMv1mCoRTmehQ==", + "requires": { + "inherits": "^2.0.1", + "run-series": "^1.1.2" + } + }, + "chrome-net": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", + "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", + "requires": { + "inherits": "^2.0.1" + } + }, + "compact2string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.1.tgz", + "integrity": "sha512-3D+EY5nsRhqnOwDxveBv5T8wGo4DEvYxjDtPGmdOX+gfr5gE92c2RC0w2wa+xEefm07QuVqqcF3nZJUZ92l/og==", + "requires": { + "ipaddr.js": ">= 0.1.5" + } }, "debug": { "version": "4.1.1", @@ -14034,6 +13937,14 @@ "ms": "^2.1.1" } }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, "immediate-chunk-store": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/immediate-chunk-store/-/immediate-chunk-store-2.1.0.tgz", @@ -14068,6 +13979,21 @@ "inherits": "^2.0.1" } }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14082,10 +14008,15 @@ "once": "^1.3.1" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14093,9 +14024,9 @@ } }, "simple-peer": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.6.0.tgz", - "integrity": "sha512-NYqSKPu75xhkZYKGJhCbLCG5kfBtDHf8U9ddk4EKFfYNU7XgIisov+V8wMbVVgyMCfn8pm8uOqQQmE50FPDFWA==", + "version": "9.7.2", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.7.2.tgz", + "integrity": "sha512-xeMyxa9B4V0eA6mf17fVr8nm2QhAYFu+ZZv8zkSFFTjJETGF227CshwobrIYZuspJglMD63egcevQXGOrTIsuA==", "requires": { "debug": "^4.0.1", "get-browser-rtc": "^1.0.0", @@ -14114,11 +14045,12 @@ } }, "simple-websocket": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-8.0.1.tgz", - "integrity": "sha512-2QKSRjf+tqFXLVmOQjf95gHeKhuyx2k1ouDjtnE0uKCYw84HfN85HsXo+GmPH+2PIh5BQql++g2AIbHgGAZU4w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-8.1.1.tgz", + "integrity": "sha512-06I3cwOD5Q3LdVd6qfyDGp1U9eau9x9qniSL3b/aDgM5bsJX4nZfCuii2UCFcTfrDq0jCXF4NQ/38qeC8CJZTg==", "requires": { "debug": "^4.1.1", + "queue-microtask": "^1.1.0", "randombytes": "^2.0.3", "readable-stream": "^3.1.1", "ws": "^7.0.0" @@ -14130,11 +14062,11 @@ "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==" }, "torrent-discovery": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/torrent-discovery/-/torrent-discovery-9.2.1.tgz", - "integrity": "sha512-bjKkbTEkcoZTXF8nhcRu6UWqbkpUsehd/6umoZqjgj/dM8nD3O7wNkPZrmls+vVf+2LT9ejZMlNUvZCqSe8cqg==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/torrent-discovery/-/torrent-discovery-9.3.0.tgz", + "integrity": "sha512-rdOfm+o6d+E+nRjeYiCzXGrM9ou7spkZpxu9xhnfKoTJgtWpSYEHXO4BT9hwVF1uoUpm+hOwNnwgkSfBZNMh7g==", "requires": { - "bittorrent-dht": "^9.0.0", + "bittorrent-dht": "^10.0.0", "bittorrent-tracker": "^9.0.0", "debug": "^4.0.0", "run-parallel": "^1.1.2" @@ -14146,12 +14078,9 @@ "integrity": "sha512-H/Z/yCuvZJj1vl1IQHI8dvF2QrUuXRJoptT5DW5967/dsLpXlCg+uyhFR5lfNj5mNaYePUbKtnL+qKWZGXv4Nw==" }, "ws": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", - "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", - "requires": { - "async-limiter": "^1.0.0" - } + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" } } }, @@ -14185,6 +14114,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -14202,7 +14132,8 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "wide-align": { "version": "1.1.3", @@ -14326,6 +14257,12 @@ "integrity": "sha1-CvyjDzxudFgFjSigtnPJ3aYiubU=", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -14390,11 +14327,6 @@ } } }, - "xcase": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xcase/-/xcase-2.0.1.tgz", - "integrity": "sha1-x/pyyqD0QNt4/VZzQyA4rJhEULk=" - }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", @@ -14438,11 +14370,6 @@ } } }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -14460,9 +14387,10 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz", - "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, "requires": { "cliui": "^5.0.0", "decamelize": "^1.2.0", @@ -14474,23 +14402,26 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^15.0.0" + "yargs-parser": "^15.0.1" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -14498,22 +14429,26 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -14524,6 +14459,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -14531,12 +14467,14 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true }, "yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index 6284b926..107adb55 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,14 @@ }, "license": "GPL-3.0", "main": "src/app/index.html", - "version": "0.4.1-17.1", + "version": "0.4.2-0", "node-remote": "*://*", - "releaseName": "Popcorn Treats", + "chromium-args": "--password-store=basic --remote-debugging-port=9222 --inspect-brk", + "releaseName": "Extra Time, Extra Popcorn", "scripts": { "start": "npx gulp run", - "update": "npm prune && npm install" + "update": "npm prune && npm install", + "debug": "NODE_ENV=development npx gulp run" }, "single-instance": false, "window": { @@ -30,65 +32,69 @@ "position": "center" }, "dependencies": { + "URIjs": "^1.16.1", "adm-zip": "0.4.13", "airplay-js": "^0.3.0", - "ajv": "6.10.2", - "async": "^3.0.1", + "ajv": "6.12.3", + "async": "^3.2.0", + "axios": "^0.19.2", + "bottleneck": "^2.19.5", "chromecast-js": "git+https://github.com/captainyarr/chromecast-js.git", - "gitlab": "^11.3.2", - "i18n": "0.8.3", - "iconv-lite": "^0.5.0", + "client-oauth2": "^4.3.3", + "i18n": "0.8.6", + "iconv-lite": "^0.5.2", "jschardet": "2.1.0", "json-rpc2": "^1.0.2", "kat-api-ce": "^0.0.4", "markdown": "~0.5.0", "memoizee": "^0.4.4", - "mkdirp": "^0.5.1", - "moment": "^2.10.2", + "mkdirp": "^0.5.5", + "moment": "^2.27.0", "mv": "^2.0.3", "nedb": "1.8.0", "node-captions": "0.4.6", "node-tvdb": "^4.0.0", "node-webkit-fdialogs": "^0.2.7", "nodecast-js": "^1.0.3", - "opensubtitles-api": "5.0.1", + "opensubtitles-api": "5.1.1", "opensubtitles-ce": "^1.0.0", "os-name": "^3.1.0", - "parse-torrent": "^7.0.1", + "parse-torrent": "^7.1.3", "peerflix": "^0.39.0", "q": "^2.0.3", - "rarbg-api": "git+https://github.com/talas9/rarbg-api.git", - "readdirp": "^3.2.0", - "request": "^2.87.0", - "rimraf": "^3.0.0", + "rarbg-api": "1.1.4", + "read-torrent": "^1.3.1", + "readdirp": "^3.4.0", + "request": "^2.88.2", + "rimraf": "^3.0.2", "sanitizer": "^0.1.2", - "semver": "^6.3.0", + "semver": "^7.3.2", "send": "^0.17.1", "strike-api": "0.2.0", "tar": "^5.0.5", - "temp": "^0.9.0", - "torrent-tracker-health": "git+https://github.com/PTCE-Public/torrent-tracker-health.git", - "underscore": "1.9.1", - "upnp-mediarenderer-client": "^1.2.1", + "temp": "^0.9.1", + "torrent-tracker": "0.0.9", + "underscore": "1.9.2", + "upnp-mediarenderer-client": "^1.4.0", "urijs": "^1.19.2", - "webtorrent": "^0.107.16", + "webtorrent": "^0.108.6", "xmlbuilder": "^13.0.2" }, "devDependencies": { "del": "^5.1.0", - "eslint": "^6.5.1", + "eslint": "^6.8.0", "eslint-config-google": "^0.14.0", "gulp": "^4.0.2", "gulp-download": "0.0.1", - "gulp-gzip": "^1.4.0", - "gulp-tar": "^3.0.1", + "gulp-gzip": "^1.4.2", + "gulp-tar": "3.0.1", "gulp-unzip": "^1.1.0", - "gulp-zip": "^5.0.1", + "gulp-zip": "^5.0.2", "jest": "^24.9.0", "merge2": "1.3.0", "nw-builder": "^3.5.7", "nw-gyp": "^3.6.5", - "yargs": "^14.2.0" + "yargs": "^14.2.3" }, "description": "", "author": "" diff --git a/src/app/app.js b/src/app/app.js index bcfe98a3..2ef70553 100644 --- a/src/app/app.js +++ b/src/app/app.js @@ -39,17 +39,17 @@ win.debug = function() { }; win.info = function() { var params = Array.prototype.slice.call(arguments, 1); - params.unshift('[%cINFO%c] ' + arguments[0], 'color: blue;', 'color: black;'); + params.unshift('%c[%cINFO%c] %c' + arguments[0], 'color: black;','color: blue;', 'color: black;','color: grey;'); console.info.apply(console, params); }; win.warn = function() { var params = Array.prototype.slice.call(arguments, 1); - params.unshift('[%cWARNING%c] ' + arguments[0], 'color: orange;', 'color: black;'); + params.unshift('[%cWARNING%c] %c' + arguments[0], 'color: orange;', 'color: black;','color: grey;'); console.warn.apply(console, params); }; win.error = function() { var params = Array.prototype.slice.call(arguments, 1); - params.unshift('%c[%cERROR%c] ' + arguments[0], 'color: black;', 'color: red;', 'color: black;'); + params.unshift('%c[%cERROR%c] %c' + arguments[0], 'color: black;', 'color: red;', 'color: black;','color: grey;'); console.error.apply(console, params); fs.appendFileSync(path.join(require('nw.gui').App.dataPath, 'logs.txt'), '\n\n' + (arguments[0].stack || arguments[0])); // log errors; }; @@ -211,6 +211,7 @@ var initApp = function() { }; App.addInitializer(function(options) { + AdvSettings.updateTrackers(); initTemplates() .then(initApp); }); diff --git a/src/app/common.js b/src/app/common.js index 73356903..d19a8217 100644 --- a/src/app/common.js +++ b/src/app/common.js @@ -9,7 +9,12 @@ Common.healthMap = { 3: 'excellent' }; -Common.calcHealth = function (torrent) { +/** + * @description Calculate Torrent Health + * @param {NewType} torrent + * @return {number} Scaled value 1-3 + */ +Common.calcHealth = function(torrent) { var seeds = torrent.seed; var peers = torrent.peer; @@ -34,11 +39,16 @@ Common.calcHealth = function (torrent) { return scaledTotal; }; -Common.md5 = function (arg) { +/** + * @description Generate an MD5 hash based on parameter + * @param {data} arg Value to be hashed + * @return {Hash} MD5 Hash + */ +Common.md5 = function(arg) { return crypt.createHash('md5').update(arg).digest('hex'); }; -Common.copyFile = function (source, target, cb) { +Common.copyFile = function(source, target, cb) { var cbCalled = false; var rd = fs.createReadStream(source); @@ -57,14 +67,14 @@ Common.copyFile = function (source, target, cb) { var wr = fs.createWriteStream(target); wr.on('error', done); - wr.on('close', function (ex) { + wr.on('close', function(ex) { done(); }); rd.pipe(wr); }; -Common.fileSize = function (num) { +Common.fileSize = function(num) { if (isNaN(num)) { return; } @@ -75,19 +85,19 @@ Common.fileSize = function (num) { var neg = num < 0; switch (os.platform()) { - case 'linux': - base = 1024; - units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; - break; - case 'win32': - base = 1024; - units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - break; - case 'darwin': + case 'linux': + base = 1024; + units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; + break; + case 'win32': + base = 1024; + units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + break; + case 'darwin': /* falls through */ - default: - base = 1000; - units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + default: + base = 1000; + units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; } if (neg) { @@ -116,16 +126,16 @@ Common.fileSize = function (num) { return (neg ? '-' : '') + num + ' ' + unit; }; -Common.matchTorrent = function (file, torrent) { +Common.matchTorrent = function(file, torrent) { var defer = Q.defer(); var data = {}; - var checkTraktSearch = function (trakt, filename) { - return Q.Promise(function (resolve, reject) { + var checkTraktSearch = function(trakt, filename) { + return Q.Promise(function(resolve, reject) { var traktObj = trakt .match(/[\w+\s+]+/ig)[0] .split(' '); - traktObj.forEach(function (word) { + traktObj.forEach(function(word) { if (word.length >= 4) { var regxp = new RegExp(word.slice(0, 3), 'ig'); if (filename.replace(/\W/ig, '').match(regxp) === null) { @@ -137,18 +147,18 @@ Common.matchTorrent = function (file, torrent) { }); }; - var searchMovie = function (title) { - return Q.Promise(function (resolve, reject) { + var searchMovie = function(title) { + return Q.Promise(function(resolve, reject) { // find a matching movie App.Trakt.search(title, 'movie') - .then(function (summary) { + .then(function(summary) { if (!summary || summary.length === 0) { reject(new Error('Unable to fetch data from Trakt.tv')); } else { checkTraktSearch(summary[0].movie.title, data.filename) - .then(function () { + .then(function() { data.movie = {}; data.type = 'movie'; data.movie.image = summary[0].movie.images.fanart.medium; @@ -156,28 +166,28 @@ Common.matchTorrent = function (file, torrent) { data.movie.title = summary[0].movie.title; resolve(data); }) - .catch(function (err) { + .catch(function(err) { data.error = err.message; resolve(data); }); } }) - .catch(function (err) { + .catch(function(err) { reject(new Error('An error occured while trying to get subtitles')); }); }); }; - var searchEpisode = function (title, season, episode) { - return Q.Promise(function (resolve, reject) { + var searchEpisode = function(title, season, episode) { + return Q.Promise(function(resolve, reject) { if (!title || !season || !episode) { return reject(new Error('Title, season and episode need to be passed')); } // find a matching show App.Trakt.shows.summary(title) - .then(function (summary) { + .then(function(summary) { if (!summary || summary.length === 0) { return reject(new Error('Unable to fetch data from Trakt.tv')); @@ -185,7 +195,7 @@ Common.matchTorrent = function (file, torrent) { // find the corresponding episode App.Trakt.episodes.summary(title, season, episode) - .then(function (episodeSummary) { + .then(function(episodeSummary) { if (!episodeSummary) { return reject(new Error('Unable to fetch data from Trakt.tv')); @@ -205,20 +215,20 @@ Common.matchTorrent = function (file, torrent) { resolve(data); } - }).catch(function (err) { + }).catch(function(err) { reject(new Error('Error while looking for metadata to get subtitles')); }); } }) - .catch(function (err) { + .catch(function(err) { reject(new Error('Error while looking for metadata to get subtitles')); }); }); }; - var injectTorrent = function (file, torrent) { - return Q.Promise(function (resolve, reject) { + var injectTorrent = function(file, torrent) { + return Q.Promise(function(resolve, reject) { if (!torrent) { resolve(file); } @@ -242,8 +252,8 @@ Common.matchTorrent = function (file, torrent) { }); }; - var formatTitle = function (title) { - return Q.Promise(function (resolve, reject) { + var formatTitle = function(title) { + return Q.Promise(function(resolve, reject) { var formatted = {}; // regex match @@ -299,7 +309,7 @@ Common.matchTorrent = function (file, torrent) { }); }; - var injectQuality = function (title) { + var injectQuality = function(title) { // 480p if (title.match(/480[pix]/i)) { return '480p'; @@ -333,7 +343,7 @@ Common.matchTorrent = function (file, torrent) { // inject torrent title if not in filename injectTorrent(file, torrent) - .then(function (parsed) { + .then(function(parsed) { var title = $.trim(parsed.replace(/\[rartv\]/i, '').replace(/\[PublicHD\]/i, '').replace(/\[ettv\]/i, '').replace(/\[eztv\]/i, '')).replace(/[\s]/g, '.'); data.filename = file; @@ -343,30 +353,30 @@ Common.matchTorrent = function (file, torrent) { } formatTitle(parsed) - .then(function (obj) { + .then(function(obj) { searchEpisode(obj.title, obj.season, obj.episode) - .then(function (result) { + .then(function(result) { result.filename = data.filename; defer.resolve(result); }) - .catch(function (error) { + .catch(function(error) { searchMovie(obj.title) - .then(function (result) { + .then(function(result) { result.filename = data.filename; defer.resolve(result); }) - .catch(function (error) { + .catch(function(error) { data.error = error.message; defer.resolve(data); }); }); }) - .catch(function (error) { + .catch(function(error) { data.error = error.message; defer.resolve(data); }); }) - .catch(function (error) { + .catch(function(error) { data.error = error.message; defer.resolve(data); }); @@ -375,7 +385,7 @@ Common.matchTorrent = function (file, torrent) { return defer.promise; }; -Common.sanitize = function (input) { +Common.sanitize = function(input) { function sanitizeString(string) { return require('sanitizer').sanitize(string); } diff --git a/src/app/database.js b/src/app/database.js index 03e76609..7df2bd96 100644 --- a/src/app/database.js +++ b/src/app/database.js @@ -7,7 +7,7 @@ async = require('async'), db = {}, data_path = require('nw.gui').App.dataPath, - TTL = 1000 * 60 * 60 * 72; //72 hours + TTL = 1000 * 60 * 60 * 24 * 14; //14 Day retention var startupTime = window.performance.now(); console.debug('Database path: ' + data_path); diff --git a/src/app/index.html b/src/app/index.html index 9f8b159b..24067eb2 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -17,7 +17,7 @@ j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); - })(window, document, 'script', 'dataLayer', 'GTM-ML5LN34'); + })(window, document, 'script', 'dataLayer', 'GTM-WNT4KWR'); @@ -32,7 +32,7 @@ - +
@@ -187,6 +187,14 @@ diff --git a/src/app/language/en.json b/src/app/language/en.json index c560c83a..706e21cc 100644 --- a/src/app/language/en.json +++ b/src/app/language/en.json @@ -559,5 +559,9 @@ "reality": "reality", "crime": "crime", "action": "action", - "This version of Popcorn Time CE is a fork based on Popcorntime Community.": "This version of Popcorn Time CE is a fork based on Popcorntime Community." + "This version of Popcorn Time CE is a fork based on Popcorntime Community.": "This version of Popcorn Time CE is a fork based on Popcorntime Community.", + "animation": "animation", + "4K": "4K", + "XXX": "XXX", + "mystery": "mystery" } \ No newline at end of file diff --git a/src/app/lib/device/chromecast.js b/src/app/lib/device/chromecast.js index 57e76961..ee4ea91f 100644 --- a/src/app/lib/device/chromecast.js +++ b/src/app/lib/device/chromecast.js @@ -172,5 +172,19 @@ })); }); + setInterval(updateChromecast, 180 * 1000); //seconds * 1000ms + + function updateChromecast() { + win.debug('Scanning: Local Network for updated Chromecast devices'); + + var browser = new chromecast.Browser(); + + browser.on('deviceOn', function(device) { + collection.add(new Chromecast({ + device: device + })); + }); + } + App.Device.Chromecast = Chromecast; })(window.App); diff --git a/src/app/lib/device/ext-player.js b/src/app/lib/device/ext-player.js index 26cc6fa6..78d502cd 100644 --- a/src/app/lib/device/ext-player.js +++ b/src/app/lib/device/ext-player.js @@ -8,18 +8,24 @@ var collection = App.Device.Collection; var child = require('child_process'); + var model; //Store current streamModel + var ExtPlayer = App.Device.Generic.extend({ defaults: { type: 'ext-app', name: i18n.__('External Player'), }, + model, + play: function(streamModel) { var options = {}; var args = []; - var url = streamModel.attributes.src; + var url = streamModel.get('src');//streamModel.attributes.src; var cmd; + this.model = streamModel; + if (process.platform == 'win32') { // "" So it behaves when spaces in path //Node.js Format: spawn('"with spaces.cmd"', ['arg with spaces'], { shell: true }); @@ -80,6 +86,8 @@ var player = child.spawn(cmd, args, options); + this.sendToTrakt('start'); + player.stdout.on('data', (data) => { win.info(`stdout: ${data}`); }); @@ -90,6 +98,7 @@ player.on('error', (data) => { win.error("External Player Error" + data); + this.sendToTrakt('stop'); App.vent.trigger('player:close'); App.vent.trigger('stream:stop'); App.vent.trigger('preload:stop'); @@ -101,6 +110,8 @@ // don't stop on exit, because Bomi could be already running in background and the command ends while the stream should continue return; } + this.sendToTrakt('stop'); + App.vent.trigger('player:close'); App.vent.trigger('stream:stop'); App.vent.trigger('preload:stop'); @@ -111,7 +122,29 @@ stop: function() { }, - unpause: function() { } + unpause: function() { }, + + sendToTrakt: function(method) { + var type = this.isMovie(); + var id = type === 'movie' ? this.model.get('imdb_id') : this.model.get('episode_id'); + var progress = 0; //this.video.currentTime() / this.video.duration() * 100 | 0; + + if(method == 'stop') + progress = 100; + + App.Trakt.scrobble(method, type, id, progress); + }, + isMovie: function() { + if (this.model.get('tvdb_id') === undefined) { + if (this.model.get('type') === 'video/youtube' || this.model.get('imdb_id') === undefined) { + return undefined; + } else { + return 'movie'; + } + } else { + return 'episode'; + } + }, }); function getPlayerName(loc) { @@ -174,7 +207,7 @@ }, 'mpv': { type: 'mpv', - switches: '-quiet', + switches: '--quiet', subswitch: '--sub-file=', fs: '--fs' }, @@ -277,7 +310,7 @@ addPath(process.env.LOCALAPPDATA); addPath(process.env.LOCALAPPDATA + '\\Programs'); addPath(process.env.LOCALAPPDATA + '\\Apps\\2.0\\'); - + /* win.debug("SystemDrive:"+process.env.SystemDrive); win.debug("LOCALAPPDATA:"+process.env.LOCALAPPDATA); diff --git a/src/app/lib/models/filter.js b/src/app/lib/models/filter.js index 0ea27ca4..8d77ec5c 100644 --- a/src/app/lib/models/filter.js +++ b/src/app/lib/models/filter.js @@ -1,4 +1,4 @@ -(function (App) { +(function(App) { 'use strict'; var Filter = Backbone.Model.extend({ @@ -9,10 +9,30 @@ order: -1 }, - initialize: function () { - this.set('sorter', this.get('sorter') || this.get('sorters')[0]); - this.set('genre', this.get('genre') || this.get('genres')[0]); - this.set('type', this.get('type') || this.get('types')[0]); + initialize: function() { + win.debug(this.get('sorters')); + + switch (App.currentview) { + case 'movies': + this.set('sorter', this.get('sorter') || AdvSettings.get('lastSortMovie') || this.get('sorters')[0]); + this.set('genre', this.get('genre') || AdvSettings.get('lastGenreMovie') || this.get('genres')[0]); + this.set('type', this.get('type') || AdvSettings.get('lastTypeMovie') || this.get('types')[0]); + break; + case 'shows': + this.set('sorter', this.get('sorter') || AdvSettings.get('lastSortTV') || this.get('sorters')[0]); + this.set('genre', this.get('genre') || AdvSettings.get('lastGenreTV') || this.get('genres')[0]); + this.set('type', this.get('type') || AdvSettings.get('lastTypeTV') || this.get('types')[0]); + break; + case 'anime': + this.set('sorter', this.get('sorter') || AdvSettings.get('lastSortAnime') || this.get('sorters')[0]); + this.set('genre', this.get('genre') || AdvSettings.get('lastGenreAnime') || this.get('genres')[0]); + this.set('type', this.get('type') || AdvSettings.get('lastTypeAnime') || this.get('types')[0]); + break; + default: + this.set('sorter', this.get('sorter') || AdvSettings.get('lastSortMovie') || this.get('sorters')[0]); + this.set('genre', this.get('genre') || AdvSettings.get('lastGenreMovie') || this.get('genres')[0]); + this.set('type', this.get('type') || AdvSettings.get('lastTypeMovie') || this.get('types')[0]); + } this.set('order', this.get('order') || -1); } }); diff --git a/src/app/lib/models/generic_collection.js b/src/app/lib/models/generic_collection.js index f7c0cca4..9ca2e6fa 100644 --- a/src/app/lib/models/generic_collection.js +++ b/src/app/lib/models/generic_collection.js @@ -1,11 +1,11 @@ -(function (App) { +(function(App) { 'use strict'; var Q = require('q'); var PopCollection = Backbone.Collection.extend({ popid: 'imdb_id', - initialize: function (models, options) { + initialize: function(models, options) { this.providers = this.getProviders(); options = options || {}; @@ -19,7 +19,7 @@ Backbone.Collection.prototype.initialize.apply(this, arguments); }, - fetch: function () { + fetch: function() { var self = this; if (this.state === 'loading' && !this.hasMore) { @@ -32,6 +32,20 @@ var subtitle = this.providers.subtitle; var torrents = this.providers.torrents; + var updateSubtitles = function(subtitles) { + //win.debug("updateSubtitles"); + _.each(subtitles, function(subtitle,id) { + //win.debug("Update subtitle id: " + id); + var model = self.get(id); + if (model) { + var ts = model.get('subtitle'); + _.extend(ts, subtitle); + model.set('subtitle', ts); + } + }); + self.trigger('sync', self); + } + /* XXX(xaiki): provider hack * * we actually do this to 'save' the provider number, @@ -40,7 +54,7 @@ * provider declare a unique id, and then lookthem up in * a hash. */ - var torrentPromises = _.map(torrents, function (torrentProvider, pid) { //XXX(xaiki): provider hack + var torrentPromises = _.map(torrents, function(torrentProvider, pid) { //XXX(xaiki): provider hack var deferred = Q.defer(); var promises = [torrentProvider.fetch(self.filter)]; @@ -48,13 +62,14 @@ var idsPromise = promises[0].then(_.bind(torrentProvider.extractIds, torrentProvider)); if (subtitle) { - promises.push(idsPromise.then(_.bind(subtitle.fetch, subtitle))); + //promises.push(idsPromise.then(_.bind(subtitle.fetch, subtitle))); + idsPromise.then(_.bind(subtitle.fetch, subtitle)).then(updateSubtitles); } Q.all(promises) - .spread(function (torrents, subtitles) { + .spread(function(torrents, subtitles) { // If a new request was started... - _.each(torrents.results, function (movie) { + _.each(torrents.results, function(movie) { var id = movie[self.popid]; /* XXX(xaiki): check if we already have this * torrent if we do merge our torrents with the @@ -72,12 +87,13 @@ if (subtitles) { movie.subtitle = subtitles[id]; - } + } else + movie.subtitle = {}; }); return deferred.resolve(torrents); }) - .catch(function (err) { + .catch(function(err) { self.state = 'error'; self.trigger('loaded', self, self.state); win.error('PopCollection.fetch() : torrentPromises mapping', err); @@ -86,8 +102,8 @@ return deferred.promise; }); - Q.all(torrentPromises).done(function (torrents) { - _.forEach(torrents, function (t) { + Q.all(torrentPromises).done(function(torrents) { + _.forEach(torrents, function(t) { self.add(t.results); }); self.hasMore = _.pluck(torrents, 'hasMore')[0]; @@ -97,7 +113,7 @@ }); }, - fetchMore: function () { + fetchMore: function() { this.filter.page += 1; this.fetch(); } diff --git a/src/app/lib/providers/favorites.js b/src/app/lib/providers/favorites.js index b55d4206..2d882cd7 100644 --- a/src/app/lib/providers/favorites.js +++ b/src/app/lib/providers/favorites.js @@ -1,46 +1,58 @@ -(function (App) { +(function(App) { 'use strict'; var Q = require('q'); - var Favorites = function () {}; + var Favorites = function() { }; Favorites.prototype.constructor = Favorites; - var queryTorrents = function (filters) { + var queryTorrents = function(filters) { return App.db.getBookmarks(filters) - .then(function (data) { - return data; - }, - function (error) { + .then(function(data) { + return data; + }, + function(error) { return []; }); }; - var formatForPopcorn = function (items) { + var formatForPopcorn = function(items) { var movieList = []; - items.forEach(function (movie) { + items.forEach(function(movie) { var deferred = Q.defer(); // we check if its a movie // or tv show then we extract right data if (movie.type === 'movie') { // its a movie + var _data = movie; Database.getMovie(movie.imdb_id) - .then(function (data) { + .then(function(data) { + if (data) { data.type = 'bookmarkedmovie'; if (/slurm.trakt.us/.test(data.image)) { data.image = data.image.replace(/slurm.trakt.us/, 'walter.trakt.us'); } deferred.resolve(data); - }, - function (err) { + return null; + } else { + deferred.reject("Movie IMDB Not Found"); + } + }, + function(err) { deferred.reject(err); + }) + .then(function(data) { deferred.resolve(data) }, + function(err) { + win.error(err + " " + _data.imdb_id); + Database.deleteBookmark(_data.imdb_id); + deferred.resolve(_data); }); } else { // its a tv show var _data = null; Database.getTVShowByImdb(movie.imdb_id) - .then(function (data) { + .then(function(data) { data.type = 'bookmarkedshow'; data.imdb = data.imdb_id; // Fallback for old bookmarks without provider in database or marked as Eztv @@ -58,9 +70,9 @@ deferred.resolve(data); return null; } - }, function (err) { + }, function(err) { deferred.reject(err); - }).then(function (data) { + }).then(function(data) { if (data) { // Cache new show and return Database.updateTVShow(data); @@ -69,7 +81,7 @@ data.image = data.images.poster; deferred.resolve(data); } - }, function (err) { + }, function(err) { // Show no longer exists on provider // Scrub bookmark and TV show // But return previous data one last time @@ -86,11 +98,11 @@ return Q.all(movieList); }; - Favorites.prototype.extractIds = function (items) { + Favorites.prototype.extractIds = function(items) { return _.pluck(items, 'imdb_id'); }; - Favorites.prototype.fetch = function (filters) { + Favorites.prototype.fetch = function(filters) { return queryTorrents(filters) .then(formatForPopcorn); }; diff --git a/src/app/lib/providers/opensubtitlesmovies.js b/src/app/lib/providers/opensubtitlesmovies.js index 34e82369..7adaab39 100644 --- a/src/app/lib/providers/opensubtitlesmovies.js +++ b/src/app/lib/providers/opensubtitlesmovies.js @@ -2,16 +2,36 @@ 'use strict'; var _ = require('underscore'); - var request = require('request'); var Q = require('q'); var OpenSubtitlesApi = require('opensubtitles-api'); + const Bottleneck = require('bottleneck'); + const { + performance, + PerformanceObserver + } = require('perf_hooks'); + + var osError = false; + + let obs; //Default non-authenicated login var OS = new OpenSubtitlesApi({ useragent: 'Popcorn Time v1' }); - var TTL = 1000 * 60 * 60 * 48; // 48 hours + const limiterOptions = { + //reservoir: 40, // initial value + //reservoirRefreshAmount: 40, + //reservoirRefreshInterval: 10 * 1000, // must be divisible by 250 + + // also use maxConcurrent and/or minTime for safety + maxConcurrent: 5, + minTime: 250 // pick a value that makes sense for your use case + }; + + const limiter = new Bottleneck(limiterOptions); + + var TTL = 1000 * 60 * 60 * 24 * 14; // 14 Day retention var OpenSubtitlesMovies = function() { win.debug('OpenSubtitles Init') @@ -20,7 +40,7 @@ //Login with Default Values this.authenticated = false; - this.authenticate(App.settings.opensubtitlesUsername,App.settings.opensubtitlesPassword); + this.authenticate(App.settings.opensubtitlesUsername, App.settings.opensubtitlesPassword); }; @@ -74,7 +94,7 @@ OpenSubtitlesMovies.prototype.authenticate = function(username, password, callback) { win.debug("Opensubtitles Authenicate") - + var deferred = Q.defer(); //Login with Default Values @@ -93,13 +113,14 @@ //win.debug(res.userinfo); this.authenticated = true; win.debug("OpenSubtitles API Login Successful"); - - ga('send', { - hitType: 'event', - eventCategory: 'OpenSubtitles', - eventAction: 'OpenSubtitles Login Successful', - eventLabel: 'OpenSubtitles Login Successful' - }); + if (App.settings.analytics) { + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Login Successful', + eventLabel: 'OpenSubtitles Login Successful' + }); + } deferred.resolve(this.authenticated); }) @@ -110,12 +131,14 @@ }); this.authenticated = false; win.debug("OpenSubtitles API Login Unsuccessful"); - ga('send', { - hitType: 'event', - eventCategory: 'OpenSubtitles', - eventAction: 'OpenSubtitles Login Unsuccessful', - eventLabel: 'OpenSubtitles: '+err - }); + if (App.settings.analytics) { + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Login Unsuccessful', + eventLabel: 'OpenSubtitles: ' + err + }); + } deferred.resolve(this.authenticated); }); @@ -125,12 +148,14 @@ }); this.authenticated = false; win.debug("OpenSubtitles API Login Unsuccessful"); - ga('send', { - hitType: 'event', - eventCategory: 'OpenSubtitles', - eventAction: 'OpenSubtitles Login Anonymous', - eventLabel: 'OpenSubtitles Login Anonymous' - }); + if (App.settings.analytics) { + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Login Anonymous', + eventLabel: 'OpenSubtitles Login Anonymous' + }); + } deferred.resolve(this.authenticated); } return deferred.promise; @@ -143,76 +168,87 @@ }); this.authenticated = false; win.debug("Opensubtitles API Logout"); - ga('send', { - hitType: 'event', - eventCategory: 'OpenSubtitles', - eventAction: 'OpenSubtitles Disconnect', - eventLabel: 'OpenSubtitles Disconnect' - }); + if (App.settings.analytics) { + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Disconnect', + eventLabel: 'OpenSubtitles Disconnect' + }); + } callback(); }; + var subtitleSearch = function(id) { + var deferred = Q.defer(); + + if (!osError) { + win.debug("Search Start: " + id); + OS.search({ + imdbid: id, + gzip: false + }).then(subtitles => { + //win.debug("OS:Subtitles: "+JSON.stringify(subtitles)); + win.debug("Search End: " + id); + if (subtitles) { + deferred.resolve({ + [id]: subtitles + }); + } else { + //subtitles is blank + deferred.resolve({}); + } + }).catch(err => { + win.error("OpenSubtitlesMovies API Error: " + id + " " + err); + validateOSError(err); + //subtitles is blank + deferred.resolve({}); + }); + } else { + //subtitles is blank + deferred.resolve({}); + } + return deferred.promise; + }; + + const throttledsubtitleSearch = limiter.wrap(subtitleSearch); + var querySubtitles = function(imdbIds) { + performance.mark('querySubtitles_start'); var deferred = Q.defer(); if (_.isEmpty(imdbIds)) { //subtitles is blank + performance.mark('querySubtitles_end'); + performance.measure('querySubtitles', 'querySubtitles_start', 'querySubtitles_end'); deferred.resolve({}); return deferred.promise; } + osError = false; //Clear OS error flag + //win.debug("querySubtitles: " + imdbIds); //Cycle through each imdbId then return the sublist //Search for imdbId - var i = _.size(imdbIds); - - if (i < 10) { - i = 0; - } return Q.all( - _.map(imdbIds, function(id) { - var deferred = Q.defer(); - setTimeout(function() { - //win.debug("Search Start: "+id); - OS.search({ - imdbid: id, - gzip: false - }).then(subtitles => { - //win.debug("OS:Subtitles: "+JSON.stringify(subtitles)); - if (subtitles) { - deferred.resolve({ - [id]: subtitles - }); - } else { - //subtitles is blank - deferred.resolve({}); - } - }).catch(err => { - win.error("OpenSubtitlesMovies API Error: "+id+" " + err); - //subtitles is blank - deferred.resolve({}); - }); - }, 400 * (i)); - //win.debug("Subtitle IMDB ID: " + id + " Time: "+300*i+"ms"); - if (i > 0) { - i = i - 1 - } - return deferred.promise; - })).then(data => { - //Create subtitleList Array and return based on the input list - var subtitleList = {}; - subtitleList.subs = {}; - - _.each(data, function(item) { - for (var name in item) { - //win.debug("Subtitle IMDB ID: " + name); - subtitleList.subs[name] = item[name]; - } + _.map(imdbIds, throttledsubtitleSearch)) + .then(data => { + //Create subtitleList Array and return based on the input list + var subtitleList = {}; + subtitleList.subs = {}; + + _.each(data, function(item) { + for (var name in item) { + //win.debug("Subtitle IMDB ID: " + name); + subtitleList.subs[name] = item[name]; + } + }); + performance.mark('querySubtitles_end'); + performance.measure('querySubtitles', 'querySubtitles_start', 'querySubtitles_end'); + return subtitleList; }); - return subtitleList; - }); }; var normalizeLangCodes = function(data) { @@ -224,6 +260,7 @@ }; var formatForPopcorn = function(data) { + performance.mark('formatForPopcorn_start'); //win.debug("formatForPopcorn:data: " + JSON.stringify(data)); var allSubs = {}; // Iterate each movie @@ -248,12 +285,63 @@ }); //win.debug("Common.santize: " + JSON.stringify(Common.sanitize(allSubs))); - + performance.mark('formatForPopcorn_end'); + performance.measure('formatForPopcorn_subtitles', 'formatForPopcorn_start', 'formatForPopcorn_end'); return Common.sanitize(allSubs); }; + var validateOSError = function(err) { + //Check and process OS errors + switch (err.message) { + case 'API seems offline': + case '401 Unauthorized': + osError = true; + break; + default: + break; + } + + } + + var stopPerformance = function() { + try { + obs.disconnect(); + } catch (e) { + win.error(e) + } + } OpenSubtitlesMovies.prototype.query = function(ids) { - return querySubtitles(ids).then(formatForPopcorn); + if (typeof (obs) == 'undefined') { + obs = new PerformanceObserver((list, observer) => { + const entries = list.getEntries(); + entries.forEach((entry) => { + win.debug('Performance Test: ' + entry.name + ' Duration: ' + entry.duration.toFixed(2) + 'ms'); + if (App.settings.analytics) { + ga('send', { + hitType: 'timing', + timingCategory: 'OpenSubtitles', + timingVar: entry.name, + timingValue: entry.duration.toFixed(0), + timingLabel: 'OpenSubtitles_' + App.settings.version + '_' + entry.name, + }); + } + }); + performance.clearMarks(); + }); + } + + obs.observe({ entryTypes: ['measure'], buffered: true }); + + let amount = _.size(ids); + + if (amount < 40) + limiter.updateSettings({ + minTime: 50 + }) + else + limiter.updateSettings(limiterOptions); + + return querySubtitles(ids).then(formatForPopcorn).finally(stopPerformance); }; App.Providers.OpenSubtitlesMovies = OpenSubtitlesMovies; diff --git a/src/app/lib/providers/torrent_cache.js b/src/app/lib/providers/torrent_cache.js index 3b9be7e5..8b0027da 100644 --- a/src/app/lib/providers/torrent_cache.js +++ b/src/app/lib/providers/torrent_cache.js @@ -1,4 +1,4 @@ -(function (App) { +(function(App) { 'use strict'; var peerflix = require('peerflix'), Q = require('q'), @@ -18,18 +18,18 @@ var tpmDir = path.join(App.settings.tmpLocation, 'TorrentCache'), MAGNET_RESOLVE_TIMEOUT = 60 * 1000; // let's give max a minute to resolve a magnet uri - var mod = function () { - this._checkTmpDir(); - }, + var mod = function() { + this._checkTmpDir(); + }, pmod = mod.prototype; - pmod.getTmpDir = function () { + pmod.getTmpDir = function() { return tpmDir; }; - pmod.clearTmpDir = function () { + pmod.clearTmpDir = function() { var self = this; - rimraf(tpmDir, function (err) { + rimraf(tpmDir, function(err) { if (err) { win.error('TorrentCache.clearTmpDir()', err); } @@ -37,15 +37,15 @@ }); }; - pmod._checkTmpDir = function () { - mkdirp(tpmDir, function (err) { + pmod._checkTmpDir = function() { + mkdirp(tpmDir, function(err) { if (err) { win.error('TorrentCache._checkTmpDir()', err); } }); }; - pmod.getType = function (torrent) { + pmod.getType = function(torrent) { if (typeof torrent === 'string') { if (torrent.substring(0, 8) === 'magnet:?') { return 'magnet'; @@ -60,7 +60,7 @@ return 'unknown'; }; - pmod.resolve = function (torrent) { + pmod.resolve = function(torrent) { var type = this.getType(torrent); stateModel = new Backbone.Model({ state: 'Resolving..', @@ -71,37 +71,44 @@ }); App.vent.trigger('stream:started', stateModel); switch (type) { - case 'torrenturl': - case 'torrent': - case 'magnet': - this.checkCache(torrent).then(function (result) { - var filePath = result[0], - exists = result[1]; - if (exists) { - return handlers.handleSuccess(filePath); - } - // try to store this torrent into our cache - handlers['handle' + type](filePath, torrent).then(handlers.handleSuccess); - }.bind(this)); - break; - default: - handlers.handleError('TorrentCache.resolve(): Unknown torrent type', torrent); - return false; + case 'torrenturl': + case 'torrent': + case 'magnet': + this.checkCache(torrent).then(function(result) { + var filePath = result[0], + exists = result[1]; + if (exists) { + return handlers.handleSuccess(filePath); + } + // try to store this torrent into our cache + handlers['handle' + type](filePath, torrent) + .then(handlers.handleSuccess) + .catch(function(error){ + handlers.handleError(error,torrent); + }); + }.bind(this)); + break; + default: + handlers.handleError('TorrentCache.resolve(): Unknown torrent type', torrent); + return false; } return true; }; - pmod._getKey = function (name) { - return Common.md5(path.basename(name)); + pmod._getKey = function(name) { + if (name.substring(0, 8) === 'magnet:?') + return Common.md5(name); + else + return Common.md5(path.basename(name)); }; - pmod.checkCache = function (torrent) { + pmod.checkCache = function(torrent) { var deferred = Q.defer(), name = this._getKey(torrent) + '.torrent', targetPath = path.join(tpmDir, name); // check if file already exists - fs.readdir(tpmDir, function (err, files) { + fs.readdir(tpmDir, function(err, files) { if (err) { handlers.handleError('TorrentCache.checkCache() readdir:' + err, torrent); return deferred.reject(err); @@ -111,7 +118,7 @@ return deferred.resolve([targetPath, false]); } // check if it actually is a file, not dir.. - fs.lstat(targetPath, function (err, stats) { + fs.lstat(targetPath, function(err, stats) { if (err) { handlers.handleError('TorrentCache.checkCache() lstat:' + err, torrent); return deferred.reject(err); @@ -126,15 +133,15 @@ return deferred.promise; }; - pmod.stop = function () { + pmod.stop = function() { stateModel = null; }; var handlers = { - handletorrent: function (filePath, torrent) { + handletorrent: function(filePath, torrent) { // just copy the torrent file var deferred = Q.defer(); - Common.copyFile(torrent, filePath, function (err) { + Common.copyFile(torrent, filePath, function(err) { if (err) { return handlers.handleError('TorrentCache.handletorrent() error: ' + err, torrent); } @@ -142,12 +149,12 @@ }); return deferred.promise; }, - handletorrenturl: function (filePath, torrent) { + handletorrenturl: function(filePath, torrent) { // try to download the file var deferred = Q.defer(), safeTimeoutID = null, doneReached = false; - var done = function (error) { + var done = function(error) { clearTimeout(safeTimeoutID); if (doneReached) { return; @@ -157,7 +164,7 @@ // try unlinking the file in case it was created try { fs.unlink(filePath); - } catch (e) {} + } catch (e) { } return handlers.handleError('TorrentCache.handletorrenturl() error: ' + error, torrent); } deferred.resolve(filePath); @@ -175,38 +182,38 @@ } }, req = request(params) - .on('response', function (resp) { - if (resp.statusCode >= 400) { - return done('Invalid status: ' + resp.statusCode); - } - switch (resp.headers['content-encoding']) { - case 'gzip': - resp.pipe(zlib.createGunzip()).pipe(ws); - break; - case 'deflate': - resp.pipe(zlib.createInflate()).pipe(ws); - break; - default: - resp.pipe(ws); - break; - } - ws - .on('error', done) - .on('close', done); - }) - .on('error', done) - .on('end', function () { - // just to be on the safe side here, set 'huge' amount of time, close event should be triggered on ws long before this one if all goes good. - safeTimeoutID = setTimeout(function () { - done('Waiting for stream to end error: timed out.'); - }, 5 * 1000); - }); + .on('response', function(resp) { + if (resp.statusCode >= 400) { + return done('Invalid status: ' + resp.statusCode); + } + switch (resp.headers['content-encoding']) { + case 'gzip': + resp.pipe(zlib.createGunzip()).pipe(ws); + break; + case 'deflate': + resp.pipe(zlib.createInflate()).pipe(ws); + break; + default: + resp.pipe(ws); + break; + } + ws + .on('error', done) + .on('close', done); + }) + .on('error', done) + .on('end', function() { + // just to be on the safe side here, set 'huge' amount of time, close event should be triggered on ws long before this one if all goes good. + safeTimeoutID = setTimeout(function() { + done('Waiting for stream to end error: timed out.'); + }, 5 * 1000); + }); } catch (e) { done(e); } return deferred.promise; }, - handlemagnet: function (filePath, torrent) { + handlemagnet: function(filePath, torrent) { clearTimeout(safeMagetTID); var deferred = Q.defer(), @@ -218,33 +225,37 @@ // lets wait max a minute // because engine does not report any error on wrong magnet links /*jshint -W120 */ - var currentTID = safeMagetTID = setTimeout(function () { - engine.destroy(); - handlers.handleError('TorrentCache.handlemagnet() error: timed out', torrent); + var currentTID = safeMagetTID = setTimeout(function() { + //engine.destroy(); + //handlers.handleError('TorrentCache.handlemagnet() error: timed out', torrent); + error = 'TorrentCache.handlemagnet() error: timed out'; + resolve(); + destroyEngine(); }, MAGNET_RESOLVE_TIMEOUT); - var resolve = function () { + var resolve = function() { // maybe somehow new magnet was pasted in while loading this one if (currentTID !== safeMagetTID) { return; } if (error) { - return handlers.handleError('TorrentCache.handlemagnet() error: ' + error, torrent); + //handlers.handleError('TorrentCache.handlemagnet() error: ' + error, torrent); + return deferred.reject('TorrentCache.handlemagnet() error: ' + error); } deferred.resolve(filePath); }; - var destroyEngine = function () { + var destroyEngine = function() { engine.destroy(); engine = null; }; - engine.on('ready', function () { + engine.on('ready', function() { var resolvedTorrentPath = engine.path; clearTimeout(currentTID); if (resolvedTorrentPath) { // copy resolved path to cache so it will be awailable next time - Common.copyFile(resolvedTorrentPath + '.torrent', filePath, function (err) { + Common.copyFile(resolvedTorrentPath + '.torrent', filePath, function(err) { if (err) { error = err; } @@ -259,34 +270,36 @@ return deferred.promise; }, - handleSuccess: function (filePath) { - win.debug('TorrentCache.handleSuccess() ' + filePath + ' stopped: ' + !stateModel); + handleSuccess: function(filePath) { + if (!stateModel) { return; } + + win.debug('TorrentCache.handleSuccess() ' + filePath + ' stopped: ' + !stateModel); + var torrentStart = new Backbone.Model({ torrent: filePath, is_file: true }); App.vent.trigger('stream:start', torrentStart); }, - handleError: function (err, torrent) { + handleError: function(err, torrent) { win.error(err, torrent); handlers.updateState('Error resolving torrent.'); }, - updateState: function (state) { + updateState: function(state) { if (stateModel) { stateModel.set('state', state); } } }; - var singleton = new mod(); App.vent.on('torrentcache:stop', singleton.stop); - App.Providers.TorrentCache = function () { + App.Providers.TorrentCache = function() { return singleton; }; diff --git a/src/app/lib/providers/trakttv.js b/src/app/lib/providers/trakttv.js index 2c70d5e4..8476e625 100644 --- a/src/app/lib/providers/trakttv.js +++ b/src/app/lib/providers/trakttv.js @@ -1,17 +1,28 @@ (function(App) { 'use strict'; - var request = require('request'), - URI = require('urijs'), - Q = require('q'), - _ = require('underscore'), - inherits = require('util').inherits; + const axios = require('axios'); + var URI = require('urijs'); + var Q = require('q'); + var _ = require('underscore'); + var inherits = require('util').inherits; + const ClientOAuth2 = require('client-oauth2'); + var API_ENDPOINT = URI('https://api.trakt.tv'), CLIENT_ID = '3cdac1a63e01706452e6d52c70264cb4c9fe2d95d4c8d315521081c9f14c82ad', CLIENT_SECRET = '5a22c1a5da51bb6f8dcdd2ab57f708c6bccf0e9915e67299d1eeab77ddfd7713', REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'; + let traktAuth = new ClientOAuth2({ + clientId: CLIENT_ID, + clientSecret: CLIENT_SECRET, + accessTokenUri: 'https://api.trakt.tv/oauth/token', + authorizationUri: 'https://api.trakt.tv/oauth/authorize', + redirectUri: REDIRECT_URI + }) + + function TraktTv() { App.Providers.CacheProviderV2.call(this, 'metadata'); @@ -85,12 +96,14 @@ getVariables = getVariables || {}; - var requestUri = API_ENDPOINT.clone() .segment(endpoint) .addQuery(getVariables); - request({ + win.debug("Trakt GET: " + requestUri.toString()); + + //Add Axios Version of functions + const options = { method: 'GET', url: requestUri.toString(), headers: { @@ -99,17 +112,20 @@ 'trakt-api-version': '2', 'trakt-api-key': CLIENT_ID } - }, function(error, response, body) { - if (error || !body) { - defer.reject(error); - } else if (response.statusCode >= 400) { + }; + + axios(options).then((response) => { + if (response.status >= 400) { defer.resolve({}); } else { - defer.resolve(Common.sanitize(JSON.parse(body))); + defer.resolve(Common.sanitize(response.data)); + } + }).catch(function(error) { + if (error) { + defer.reject(error); } }); - return defer.promise; }; @@ -121,7 +137,10 @@ var requestUri = API_ENDPOINT.clone() .segment(endpoint); - request({ + win.debug("Trakt POST: " + requestUri.toString()); + + //Add Axios Version of functions + const options = { method: 'POST', url: requestUri.toString(), headers: { @@ -130,18 +149,23 @@ 'trakt-api-version': '2', 'trakt-api-key': CLIENT_ID }, - body: JSON.stringify(postVariables) - }, function(error, response, body) { - if (error || !body) { - defer.reject(error); - } else if (response.statusCode >= 400) { + data: JSON.stringify(postVariables) + }; + + axios(options).then((response) => { + if (response.status >= 400) { defer.resolve({}); } else { - defer.resolve(Common.sanitize(JSON.parse(body))); + defer.resolve(Common.sanitize(response.data)); + } + }).catch(function(error) { + if (error) { + defer.reject(error); } }); return defer.promise; + }; TraktTv.prototype.calendars = { @@ -428,7 +452,7 @@ return defer.promise; }, authorize: function() { - win.debug("trakt authorize started"); + win.debug("Trakt authorize started"); var defer = Q.defer(); var url = false; var loginWindow; @@ -440,14 +464,14 @@ win.debug("trakt:OAUTH: " + OAUTH_URI + '&redirect_uri=' + encodeURIComponent(REDIRECT_URI)); gui.App.addOriginAccessWhitelistEntry(API_URI, 'app', 'host', true); window.loginWindow = gui.Window.open(OAUTH_URI + '&redirect_uri=' + encodeURIComponent(REDIRECT_URI), { - position: 'center', - focus: true, - title: 'Trakt.tv', - icon: 'src/app/images/icon.png', - resizable: false, - width: 600, - height: 600 - }, + position: 'center', + focus: true, + title: 'Trakt.tv', + icon: 'src/app/images/icon.png', + resizable: false, + width: 600, + height: 600 + }, function(new_win) { // And listeners to new window's focus event new_win.on('loaded', function() { @@ -456,7 +480,7 @@ if (url.indexOf('&') === -1 && url.indexOf('auth/signin') === -1) { if (url.indexOf('oauth/authorize/') !== -1) { - url = url.split('/'); + url = url.split('/native?code='); url = url[url.length - 1]; new_win.close(); } else { @@ -465,7 +489,7 @@ } else { url = false; } - win.debug("Trakt Authorize Code:" + url); + win.debug("Trakt Authorize Code: " + url); }); new_win.on('closed', function() { if (url) { @@ -516,33 +540,38 @@ win.debug("Trakt Revoke Access Token"); var defer = Q.defer(); - var postVariables = "token=" + Settings.traktToken; + //var postVariables = "token=" + Settings.traktToken; + var postVariables = { + token: Settings.traktToken, + client_id: CLIENT_ID, + client_secret: CLIENT_SECRET + }; var requestUri = API_ENDPOINT.clone() .segment("oauth/revoke"); - request({ + //Add Axios Version of functions + const options = { method: 'POST', url: requestUri.toString(), headers: { - 'Content-Type': 'application/x-www-form-urlencode', - 'Authorization': 'Bearer ' + Settings.traktToken, - 'trakt-api-version': '2', - 'trakt-api-key': CLIENT_ID + 'Content-Type': 'application/json' }, - body: JSON.stringify(postVariables) - }, function(error, response, body) { - //win.debug('Status:', response.statusCode); - //win.debug('Headers:', JSON.stringify(response.headers)); - //win.debug('Response:', body); - if (error || !body) { - defer.reject(error); - } else if (response.statusCode >= 400) { + data: JSON.stringify(postVariables) + }; + + axios(options).then((response) => { + if (response.status >= 400) { defer.resolve({}); } else { - defer.resolve(Common.sanitize(JSON.parse(body))); + defer.resolve(Common.sanitize(response.data)); + } + }).catch(function(error) { + if (error) { + defer.reject(error); } }); + return defer.promise; } }; @@ -685,7 +714,7 @@ case 'database': break; case 'seen': - /* falls through */ + /* falls through */ default: App.Trakt.sync.addToHistory('episode', show.episode_id); break; @@ -698,7 +727,7 @@ case 'database': break; case 'seen': - /* falls through */ + /* falls through */ default: App.Trakt.sync.removeFromHistory('episode', show.episode_id); break; @@ -721,10 +750,10 @@ } $('.watched-toggle').addClass('selected').text(i18n.__('Seen')); App.MovieDetailView.model.set('watched', true); - } catch (e) {} + } catch (e) { } break; case 'seen': - /* falls through */ + /* falls through */ default: App.Trakt.sync.addToHistory('movie', movie.imdb_id); break; @@ -737,7 +766,7 @@ case 'database': break; case 'seen': - /* falls through */ + /* falls through */ default: App.Trakt.sync.removeFromHistory('movie', movie.imdb_id); break; diff --git a/src/app/lib/providers/watchlist.js b/src/app/lib/providers/watchlist.js index 648cd21d..fefdcda4 100644 --- a/src/app/lib/providers/watchlist.js +++ b/src/app/lib/providers/watchlist.js @@ -3,8 +3,10 @@ 'use strict'; var Q = require('q'); var TVApi = App.Providers.get('TVApi'); + const WATCHLIST_REFRESH = 2; //Refresh minutes + const TRAKT_SHOWDAYS = 30; //Number of days to retrieve shows Trakt.tv + var Watchlist = function() { }; - var Watchlist = function() {}; Watchlist.prototype.constructor = Watchlist; var queryTorrents = function(filters) { @@ -13,19 +15,19 @@ //Checked when last fetched App.db.getSetting({ - key: 'watchlist-fetched' - }) + key: 'watchlist-fetched' + }) .then(function(doc) { if (doc) { var d = moment.unix(doc.value); - if (Math.abs(now.diff(d, 'hours')) >= 12) { - win.info('Watchlist - last update was %s hour(s) ago', Math.abs(now.diff(d, 'hours'))); + if (Math.abs(now.diff(d, 'minutes')) >= WATCHLIST_REFRESH) { + win.info('Watchlist - last update was %s minute(s) ago', Math.abs(now.diff(d, 'hours'))); fetchWatchlist(true); } else { - // Last fetch is fresh (< 12h) - win.info('Watchlist - next update in %s hour(s)', 12 - Math.abs(now.diff(d, 'hours'))); + // Last fetch is fresh time (< WATCHLIST_REFRESH) + win.info('Watchlist - next update in %s minutes(s)', WATCHLIST_REFRESH - Math.abs(now.diff(d, 'minutes'))); fetchWatchlist(false); } } else { @@ -37,29 +39,29 @@ function fetchWatchlist(update) { App.db.getSetting({ - key: 'watchlist' - }) + key: 'watchlist' + }) .then(function(doc) { if (doc && !update) { // Returning cached watchlist deferred.resolve(doc.value || []); } else { win.info('Watchlist - Fetching new watchlist'); - App.Trakt.calendars.myShows(moment().subtract(30, 'days').format('YYYY-MM-DD'), 30) + App.Trakt.calendars.myShows(moment().subtract(TRAKT_SHOWDAYS, 'days').format('YYYY-MM-DD'), TRAKT_SHOWDAYS) .then(function(data) { - win.debug("trakt watchlist data: " + data); + win.debug("Trakt watchlist data retrieved"); App.db.writeSetting({ - key: 'watchlist', - value: data - }) - .then(function() { - win.debug("trakt watchlist-fetched data: " + data); + key: 'watchlist', + value: data + }) + .then(function() { + win.debug("Trakt watchlist-fetched data retrieved"); App.db.writeSetting({ key: 'watchlist-fetched', value: now.unix() }); }) - .then(function() { + .then(function() { deferred.resolve(data || []); }); }) @@ -81,10 +83,10 @@ if (show.show_id && show.season !== 0) { promisifyDb(db.watched.find({ - imdb_id: show.show_id.toString(), - season: show.season.toString(), - episode: show.episode.toString() - })) + imdb_id: show.show_id.toString(), + season: show.season.toString(), + episode: show.episode.toString() + })) .then(function(data) { if (data != null && data.length > 0) { deferred.resolve(null); @@ -120,7 +122,7 @@ data.imdb = data.imdb_id; data.next_episode = show.next_episode; // Fallback for old bookmarks without provider in database or marked as Eztv - if (typeof(data.provider) === 'undefined' || data.provider === 'Eztv') { + if (typeof (data.provider) === 'undefined' || data.provider === 'Eztv') { data.provider = 'TVApi'; } deferred.resolve(data); @@ -180,12 +182,12 @@ var deferred = Q.defer(); win.info('Watchlist - Fetching new watchlist'); - App.Trakt.calendars.myShows(moment().subtract(30, 'days').format('YYYY-MM-DD'), 30) + App.Trakt.calendars.myShows(moment().subtract(TRAKT_SHOWDAYS, 'days').format('YYYY-MM-DD'), TRAKT_SHOWDAYS) .then(function(data) { App.db.writeSetting({ - key: 'watchlist', - value: data - }) + key: 'watchlist', + value: data + }) .then(function() { App.db.writeSetting({ key: 'watchlist-fetched', diff --git a/src/app/lib/providers/yts.js b/src/app/lib/providers/yts.js index c642ed9b..b609c3f9 100644 --- a/src/app/lib/providers/yts.js +++ b/src/app/lib/providers/yts.js @@ -1,8 +1,8 @@ -(function (App) { +(function(App) { 'use strict'; var Q = require('q'); - var request = require('request'); + var axios = require('axios'); var inherits = require('util').inherits; function YTS() { @@ -14,11 +14,11 @@ } inherits(YTS, App.Providers.Generic); - YTS.prototype.extractIds = function (items) { + YTS.prototype.extractIds = function(items) { return _.pluck(items.results, 'imdb_id'); }; - var format = function (data) { + var format = function(data) { /* var results = _.chain(data.movies) .filter(function (movie) { @@ -27,47 +27,54 @@ return torrent.quality !== '3D'; }); })*/ - var tracker_list = ''; + var tracker_list = ''; - Settings.trackers.forEach(function (item) { - tracker_list += '&tr=' + item; - }); + Settings.trackers.forEach(function(item) { + tracker_list += '&tr=' + item; + }); + + function check_trailer(movie){ + if(movie.yt_trailer_code && movie.yt_trailer_code != ""){ + return 'https://www.youtube.com/watch?v=' + movie.yt_trailer_code + }else + return null; + } - var results = _.chain(data.movies).map(function (movie) { - return { - type: 'movie', - id: movie.id, - imdb_id: movie.imdb_code, - title: movie.title, - slug: movie.slug, - year: movie.year, - genre: movie.genres, - directors: movie.directors, - cast: movie.cast, - rating: movie.rating, - runtime: movie.runtime, - image: movie.medium_cover_image, - cover: movie.medium_cover_image, //movie.large_cover_image, - backdrop: movie.background_image, - synopsis: movie.synopsis, - trailer: 'https://www.youtube.com/watch?v=' + movie.yt_trailer_code || false, - google_video: movie.google_video || false, - certification: movie.mpa_rating, - torrents: _.reduce(movie.torrents, function (torrents, torrent) { - if (torrent.quality !== '3D') { - torrents[torrent.quality] = { - url: torrent.url, - magnet: 'magnet:?xt=urn:btih:' + torrent.hash + tracker_list, - size: torrent.size_bytes, - filesize: torrent.size, - seed: torrent.seeds, - peer: torrent.peers - }; - } - return torrents; - }, {}) - }; - }).value(); + var results = _.chain(data.movies).map(function(movie) { + return { + type: 'movie', + id: movie.id, + imdb_id: movie.imdb_code, + title: movie.title, + slug: movie.slug, + year: movie.year, + genre: movie.genres, + directors: movie.directors, + cast: movie.cast, + rating: movie.rating, + runtime: movie.runtime, + image: movie.medium_cover_image, + cover: movie.medium_cover_image, //movie.large_cover_image, + backdrop: movie.background_image, + synopsis: movie.synopsis, + trailer: check_trailer(movie), + google_video: movie.google_video || false, + certification: movie.mpa_rating, + torrents: _.reduce(movie.torrents, function(torrents, torrent) { + if (torrent.quality !== '3D') { + torrents[torrent.quality] = { + url: torrent.url, + magnet: 'magnet:?xt=urn:btih:' + torrent.hash + tracker_list, + size: torrent.size_bytes, + filesize: torrent.size, + seed: torrent.seeds, + peer: torrent.peers + }; + } + return torrents; + }, {}) + }; + }).value(); return { results: Common.sanitize(results), @@ -75,7 +82,7 @@ }; }; - YTS.prototype.fetch = function (filters) { + YTS.prototype.fetch = function(filters) { var params = { sort_by: 'seeds', limit: 50, @@ -103,14 +110,14 @@ case 'last added': params.sort_by = 'date_added'; break; - case 'last added & google cloud': + case 'last added & google cloud': params.sort_by = 'google_cloud'; - App.settings['chosenPlayer'] = 'googlecloud'; + App.settings['chosenPlayer'] = 'googlecloud'; break; - case 'downloads': + case 'downloads': params.sort_by = 'download_count'; break; - case 'likes': + case 'likes': params.sort_by = 'like_count'; break; default: @@ -128,16 +135,21 @@ var defer = Q.defer(); + function get(index) { + + //Convert to axios var options = { - uri: Settings.ytsAPI[index].url + 'api/v2/list_movies.json', - qs: params, - json: true, - timeout: 10000 + url: Settings.ytsAPI[index].url + 'api/v2/list_movies.json', + params: params }; + + win.info("Request to YTS API: " + options.url); + var req = jQuery.extend(true, {}, Settings.ytsAPI[index], options); - request(req, function (err, res, data) { - if (err || res.statusCode >= 400 || (data && !data.data)) { + + axios(req).then(function(res) { + if (res.status >= 400 || (res.data && !res.data.data)) { win.warn('YTS API endpoint \'%s\' failed.', Settings.ytsAPI[index].url); if (index + 1 >= Settings.ytsAPI.length) { return defer.reject(err || 'Status Code is above 400'); @@ -145,14 +157,40 @@ get(index + 1); } return; - } else if (!data || data.status === 'error') { - err = data ? data.status_message : 'No data returned'; + } else if (!res.data || res.data.status === 'error') { + err = res.data ? res.data.status_message : 'No data returned'; return defer.reject(err); } else { - return defer.resolve(format(data.data)); + return defer.resolve(format(res.data.data)); } + + }).catch(function(error) { + if (error.response) { + // The request was made and the server responded with a status code + // that falls out of the range of 2xx + win.error(error.response.status); + } else if (error.request) { + // The request was made but no response was received + // `error.request` is an instance of XMLHttpRequest in the browser and an instance of + // http.ClientRequest in node.js + win.error(error.request); + } else { + // Something happened in setting up the request that triggered an Error + win.error('Error', error.message); + } + + //If error state check if another endpoint is available and retry + if (index + 1 >= Settings.ytsAPI.length) { + return defer.reject(error.message || 'Status Code is above 400'); + } else { + get(index + 1); + } + return; }); } + + //Get Movie list via request + //get(0); get(0); return defer.promise; @@ -190,7 +228,7 @@ return defer.promise; };*/ - YTS.prototype.detail = function (torrent_id, old_data) { + YTS.prototype.detail = function(torrent_id, old_data) { return Q(old_data); }; diff --git a/src/app/lib/util/torrent-tracker-health/LICENSE b/src/app/lib/util/torrent-tracker-health/LICENSE new file mode 100644 index 00000000..5a3ca391 --- /dev/null +++ b/src/app/lib/util/torrent-tracker-health/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2015 Popcorn Time Team & the contributors +Copyright (c) 2014 XeonCore +Original Code Copyright (c) 2014 Eóin Martin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/app/lib/util/torrent-tracker-health/README.md b/src/app/lib/util/torrent-tracker-health/README.md new file mode 100644 index 00000000..8fce3923 --- /dev/null +++ b/src/app/lib/util/torrent-tracker-health/README.md @@ -0,0 +1,21 @@ +torrent-tracker-health +============== + +Get health info for torrents. This library is based on torrent-tracker and returns the number of seeds and peers. + +Based on [torrent-health](https://github.com/SlashmanX/torrent-health). + + var torrentHealth = require('torrent-tracker-health'); + var magnet = 'magnet:?xt=urn:btih:d2310f718eb02f98665266786f7d00b42a20f055&dn=Gone+Girl+(2014)+1080p&tr=udp://tracker.openbittorrent.com:80/announce&tr=udp://open.demonii.com:1337/announce&tr=udp://tracker.coppersurfer.tk:6969'; + + torrentHealth(magnet, { + timeout: 1000 + }) + .then(function (res) { + console.log('seeds:', res.seeds); + console.log('peers:', res.peers); + console.log('ratio:', res.peers > 0 ? res.seeds / res.peers : +res.seeds); + }) + .catch(function (err) { + console.log('error:', err); + }); \ No newline at end of file diff --git a/src/app/lib/util/torrent-tracker-health/index.js b/src/app/lib/util/torrent-tracker-health/index.js new file mode 100644 index 00000000..da279f47 --- /dev/null +++ b/src/app/lib/util/torrent-tracker-health/index.js @@ -0,0 +1,125 @@ + + +var readTorrent = require('read-torrent'), + Q = require('q'), + async = require('async'), + util = require('util'), + //LOG = require('debug')('torrent-tracker-health'), + Tracker = require('torrent-tracker'); + + +module.exports = getHealth; +//exports = getHealth; +//export default getHealth; + +var trackerCache = { + trackers: {}, + get: function(tracker) { + if (tracker in this.trackers) { + return this.trackers[tracker]; + } else { + this.trackers[tracker] = new Tracker(tracker); + return this.trackers[tracker]; + } + } +}; + +function getHealth(uri, options) { + if (!options) { + options = {}; + } + + if (typeof uri === 'object') { + if (!uri.uri) { + throw 'No torrent URI specified'; + } else { + options = uri; + uri = options.uri; + } + } + + var defer = Q.defer(); + + readTorrent(uri, function(err, info) { + if (err) { + //LOG('Error in read-torrent: ' + err.message); + return defer.reject(err); + } else { + if (!util.isArray(info.announce)) { + info.announce = [info.announce]; + } + + if (options.force && util.isArray(options.force)) { + options.force.forEach(function(trUri) { + if (info.announce.indexOf(trUri) === -1) { + // Add the "forced" trackers to the list + info.announce.push(trUri); + } + }); + } + + async.map(info.announce, function(trUri, done) { + // Check the tracker URI isn't blacklisted + if (options.blacklist && options.blacklist.some(function(regex) { + if (typeof regex === 'string') { + regex = new RegExp(regex); + } + return regex.test(trUri); + })) { + // Don't try to scrape it. + return done(null, null); + } + + //LOG('Obtaining tracker for ' + trUri); + var tracker = trackerCache.get(trUri); + tracker.scrape([info.infoHash], { + timeout: options.timeout + }, function(err, data) { + if (err) { + if (err.message === 'timed out' || err.code === 'ETIMEDOUT') { + //LOG('Scrape timed out for ' + trUri); + return done(null, null); + } else { + //LOG('Error in torrent-tracker: ' + err.message); + return done(err, null); + } + } else { + return done(null, { + seeds: data[info.infoHash].seeders, + peers: data[info.infoHash].leechers + }); + } + }); + }, function(err, results) { + if (err) { + //LOG('Error: ' + err.message); + return defer.reject(err); + } else { + var totalSeeds = 0, + totalPeers = 0, + total = 0; + results.forEach(function(result) { + if (!result) { + return; + } + totalSeeds += result.seeds | 0; + totalPeers += result.peers | 0; + total++; + }); + + // Avoid divide-by-zero issues + if (total === 0) { + total = 1; + } + + return defer.resolve({ + seeds: Math.round(totalSeeds / total) | 0, + peers: Math.round(totalPeers / total) | 0 + }); + } + }); + } + }); + + return defer.promise; +} diff --git a/src/app/lib/views/about.js b/src/app/lib/views/about.js index 89e760dc..580a8c74 100644 --- a/src/app/lib/views/about.js +++ b/src/app/lib/views/about.js @@ -54,7 +54,7 @@ }, reportIssue: function () { - App.vent.trigger('issue:new'); + App.vent.trigger(); }, closeChangelog: function () { diff --git a/src/app/lib/views/browser/filter_bar.js b/src/app/lib/views/browser/filter_bar.js index 2123b2f6..5114f66a 100644 --- a/src/app/lib/views/browser/filter_bar.js +++ b/src/app/lib/views/browser/filter_bar.js @@ -243,6 +243,19 @@ var sorter = $(e.target).attr('data-value'); + switch (App.currentview) { + case 'movies': + AdvSettings.set('lastSortMovie', sorter); + break; + case 'shows': + AdvSettings.set('lastSortTV', sorter); + break; + case 'anime': + AdvSettings.set('lastSortAnime', sorter); + break; + default: + } + if (this.previousSort === sorter) { this.model.set('order', this.model.get('order') * -1); } else if (this.previousSort !== sorter && sorter === 'title') { @@ -266,6 +279,20 @@ $(e.target).addClass('active'); var type = $(e.target).attr('data-value'); + + switch (App.currentview) { + case 'movies': + AdvSettings.set('lastTypeMovie', type); + break; + case 'shows': + AdvSettings.set('lastTypeTV', type); + break; + case 'anime': + AdvSettings.set('lastTypeAnime', type); + break; + default: + } + this.ui.typeValue.text(i18n.__(type)); this.model.set({ @@ -280,6 +307,21 @@ $(e.target).addClass('active'); var genre = $(e.target).attr('data-value'); + + switch (App.currentview) { + case 'movies': + AdvSettings.set('lastGenreMovie', genre); + break; + case 'shows': + AdvSettings.set('lastGenreTV', genre); + break; + case 'anime': + AdvSettings.set('lastGenreAnime', genre); + break; + default: + } + + this.ui.genreValue.text(i18n.__(genre)); this.model.set({ diff --git a/src/app/lib/views/main_window.js b/src/app/lib/views/main_window.js index a93ba5e9..a90b75cc 100644 --- a/src/app/lib/views/main_window.js +++ b/src/app/lib/views/main_window.js @@ -205,14 +205,15 @@ } //Initialize Google Analytics - if (App.settings.analytics) { - //Set AppVersion - ga('set', 'appName', App.Config.title); - ga('set', 'appVersion', AdvSettings.get('version')); - ga('send', 'screenview', { - screenName: App.Config.title - }); - } + + //Set App Details + ga('set', 'appName', App.Config.title); + ga('set', 'appVersion', AdvSettings.get('version')); + + ga('send', { + hitType: 'screenview', + screenName: App.Config.title + }); that.InitModal.destroy(); @@ -298,13 +299,15 @@ showAnime: function(e) { this.Settings.destroy(); this.MovieDetail.destroy(); - ga('set', { - page: '/popcorntimece/anime/', - title: 'Anime List' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/anime/', + title: 'Anime List' + }); + ga('send', { + hitType: 'pageview' + }); + } this.Content.show(new App.View.AnimeBrowser()); }, @@ -348,13 +351,15 @@ showFavorites: function(e) { this.Settings.destroy(); this.MovieDetail.destroy(); - ga('set', { - page: '/popcorntimece/favorites/', - title: 'Favorites' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/favorites/', + title: 'Favorites' + }); + ga('send', { + hitType: 'pageview' + }); + } this.Content.show(new App.View.FavoriteBrowser()); }, @@ -382,68 +387,79 @@ } } waitForSync(); - - ga('set', { - page: '/popcorntimece/watchlist/', - title: 'Watchlist' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/watchlist/', + title: 'Watchlist' + }); + ga('send', { + hitType: 'pageview' + }); + } }, showDisclaimer: function(e) { - ga('set', { - page: '/popcorntimece/disclaimer/', - title: 'Disclaimer' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/disclaimer/', + title: 'Disclaimer' + }); + ga('send', { + hitType: 'pageview' + }); + } this.Disclaimer.show(new App.View.DisclaimerModal()); }, showRegister: function(e) { - ga('set', { - page: '/popcorntimece/register/', - title: 'Register' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/register/', + title: 'Register' + }); + ga('send', { + hitType: 'pageview' + }); + } this.Register.show(new App.View.RegisterModal()); }, showAbout: function(e) { - ga('set', { - page: '/popcorntimece/about/', - title: 'About' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/about/', + title: 'About' + }); + ga('send', { + hitType: 'pageview' + }); + } this.About.show(new App.View.About()); }, showTorrentCollection: function(e) { - ga('set', { - page: '/popcorntimece/torrentcollection/', - title: 'Torrent Collection' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/torrentcollection/', + title: 'Torrent Collection' + }); + ga('send', { + hitType: 'pageview' + }); + } this.TorrentCollection.show(new App.View.TorrentCollection()); }, showPlugins: function(e) { - ga('set', { - page: '/popcorntimece/plugins/', - title: 'Plugins' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/plugins/', + title: 'Plugins' + }); + ga('send', { + hitType: 'pageview' + }); + } this.Plugins.show(new App.View.Plugins()); }, @@ -460,13 +476,15 @@ }, showHelp: function(e) { - ga('set', { - page: '/popcorntimece/help/', - title: 'Help' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/help/', + title: 'Help' + }); + ga('send', { + hitType: 'pageview' + }); + } this.Help.show(new App.View.Help()); }, @@ -528,13 +546,15 @@ }, showSettings: function(settingsModel) { - ga('set', { - page: '/popcorntimece/settings/', - title: 'Settings' - }); - ga('send', { - hitType: 'pageview' - }); + if (App.settings.analytics) { + ga('set', { + page: '/popcorntimece/settings/', + title: 'Settings' + }); + ga('send', { + hitType: 'pageview' + }); + } this.Settings.show(new App.View.Settings({ model: settingsModel })); @@ -542,13 +562,14 @@ traktAuthenticated: function() { win.info('Trakt: authenticated'); - ga('send', { - hitType: 'event', - eventCategory: 'Trakt', - eventAction: 'Trakt Authenticated', - eventLabel: 'Trakt Authenticated' - }); - + if (App.settings.analytics) { + ga('send', { + hitType: 'event', + eventCategory: 'Trakt', + eventAction: 'Trakt Authenticated', + eventLabel: 'Trakt Authenticated' + }); + } if (Settings.traktSyncOnStart && (Settings.traktLastSync + 1800000 < new Date().valueOf())) { //only refresh every 30min App.Trakt.sync.lastActivities() .then(function(activities) { // check if new activities @@ -556,12 +577,14 @@ if (lastActivities > Settings.traktLastActivities) { AdvSettings.set('traktLastActivities', lastActivities); Database.deleteWatched(); - ga('send', { - hitType: 'event', - eventCategory: 'Trakt', - eventAction: 'Trakt Sync All', - eventLabel: 'Trakt Sync All' - }); + if (App.settings.analytics) { + ga('send', { + hitType: 'event', + eventCategory: 'Trakt', + eventAction: 'Trakt Sync All', + eventLabel: 'Trakt Sync All' + }); + } App.Trakt.syncTrakt.all(); } }); @@ -626,8 +649,8 @@ var that = this; App.db.getSetting({ - key: 'postersWidth' - }) + key: 'postersWidth' + }) .then(function(doc) { var postersWidth = doc.value; var postersHeight = Math.round(postersWidth * Settings.postersSizeRatio); diff --git a/src/app/lib/views/movie_detail.js b/src/app/lib/views/movie_detail.js index c47765b4..b1fa1910 100644 --- a/src/app/lib/views/movie_detail.js +++ b/src/app/lib/views/movie_detail.js @@ -321,7 +321,11 @@ quality: false, title: this.model.get('title') }); - var tmpPlayer = App.Device.Collection.selected.attributes.id; + + var tmpPlayer = 'local'; + + if(App.Device.Collection.selected != null) + tmpPlayer = App.Device.Collection.selected.attributes.id; App.Device.Collection.setDevice('local'); App.vent.trigger('stream:ready', trailer); App.Device.Collection.setDevice(tmpPlayer); diff --git a/src/app/lib/views/player/loading.js b/src/app/lib/views/player/loading.js index 88f7cb10..ed667c7a 100644 --- a/src/app/lib/views/player/loading.js +++ b/src/app/lib/views/player/loading.js @@ -104,6 +104,12 @@ var self = this; var state = this.model.get('state'); var streamInfo = this.model.get('streamInfo'); + + if (typeof streamInfo == 'undefined'){ + win.error('streamInfo is not defined'); + return this.cancelStreaming(); + } + win.info('Loading torrent:', state); this.checkFreeSpace(this.model.get('streamInfo').get('size')); diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index d85560e9..f4ceda69 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -132,16 +132,10 @@ }, resetMovieAPI: function() { - var value = [{ - url: 'http://yts.am/', - strictSSL: true - }, - { - url: 'https://yts.ag/', - strictSSL: true - } - ]; + var value = App.settings['defaultMovieAPI'].slice(0); + App.settings['ytsAPI'] = value; + //save to db App.db.writeSetting({ key: 'ytsAPI', @@ -154,14 +148,10 @@ }, resetTVShowAPI: function() { - var value = [{ - url: 'https://api-fetch.website/tv/', - strictSSL: true - }, { - url: 'http://eztvapi.ml/', - strictSSL: true - }]; + var value = App.settings['defaultTvAPI'].slice(0); + App.settings['tvAPI'] = value; + //save to db App.db.writeSetting({ key: 'tvAPI', @@ -219,10 +209,15 @@ if (value.substr(0, 8) !== 'https://' && value.substr(0, 7) !== 'http://') { value = 'http://' + value; } - value = [{ + + App.settings['ytsAPI'] = App.settings['defaultMovieAPI'].slice(0); + + App.settings['ytsAPI'].unshift({ url: value, strictSSL: value.substr(0, 8) === 'https://' - }]; + }); + + value = App.settings['ytsAPI']; break; case 'tvAPI': value = field.val(); @@ -232,11 +227,17 @@ if (value.substr(0, 8) !== 'https://' && value.substr(0, 7) !== 'http://') { value = 'http://' + value; } - value = [{ + + App.settings['tvAPI'] = App.settings['defaultTvAPI'].slice(0); + + App.settings['tvAPI'].unshift({ url: value, strictSSL: value.substr(0, 8) === 'https://' - }]; + }); + + value = App.settings['tvAPI']; break; + case 'opensubtitlesUsername': value = field.val(); break; @@ -263,7 +264,7 @@ if ($('option:selected', field).val() === 'Last Open') { AdvSettings.set('lastTab', App.currentview); } - /* falls through */ + /* falls through */ case 'watchedCovers': case 'theme': value = $('option:selected', field).val(); @@ -557,12 +558,14 @@ if (value == false) { that.alertMessageFailed(i18n.__("Incorrect Username or Password")); } - ga('send', { - hitType: 'event', - eventCategory: 'Settings', - eventAction: 'OpenSubtitles Login Incorrect', - eventLabel: 'OpenSubtitles Login Incorrect' - }); + if (App.settings.analytics) { + ga('send', { + hitType: 'event', + eventCategory: 'Settings', + eventAction: 'OpenSubtitles Login Incorrect', + eventLabel: 'OpenSubtitles Login Incorrect' + }); + } return value; }).then(function(value) { if (value == true) { @@ -714,18 +717,18 @@ } return location; } catch (err) { - if (err.code !== 'EEXIST'){ + if (err.code !== 'EEXIST') { $('.notification_alert').show().text(i18n.__('Unable to create new Download directory')).delay(5000).fadeOut(400); return this.resetTmpLocation(); } } }, - resetTmpLocation: function(){ + resetTmpLocation: function() { var value = path.join(os.tmpDir(), 'Popcorn-Time'); $('#tmpLocation').val(value); this.render(); - return value; + return value; }, openDatabaseFolder: function() { diff --git a/src/app/lib/views/show_detail.js b/src/app/lib/views/show_detail.js index 049805a3..4fe05f8f 100644 --- a/src/app/lib/views/show_detail.js +++ b/src/app/lib/views/show_detail.js @@ -1,7 +1,8 @@ (function (App) { 'use strict'; - var torrentHealth = require('torrent-tracker-health'); + //var torrentHealth = require('torrent-tracker-health'); + var torrentHealth = require('./lib/util/torrent-tracker-health'); var cancelTorrentHealth = function () {}; var torrentHealthRestarted = null; @@ -853,6 +854,7 @@ if (torrent.substring(0, 8) === 'magnet:?') { // if 'magnet:?' is because TVApi sends back links, not magnets + //TODO: Update torrent magnet with full tracker list torrent = torrent.split('&tr')[0] + '&tr=udp://tracker.openbittorrent.com:80/announce' + '&tr=udp://open.demonii.com:1337/announce' + '&tr=udp://tracker.coppersurfer.tk:6969'; torrentHealth(torrent, { diff --git a/src/app/lib/views/torrent_collection.js b/src/app/lib/views/torrent_collection.js index c8c332d8..2fd58dd3 100644 --- a/src/app/lib/views/torrent_collection.js +++ b/src/app/lib/views/torrent_collection.js @@ -1,6 +1,8 @@ -(function (App) { +(function(App) { 'use strict'; + var torrentHealth = require('./lib/util/torrent-tracker-health'); + var clipboard = gui.Clipboard.get(), collection = path.join(require('nw.gui').App.dataPath + '/TorrentCollection/'), files; @@ -26,7 +28,7 @@ 'contextmenu #online-input': 'rightclick_search' }, - initialize: function () { + initialize: function() { if (!fs.existsSync(collection)) { fs.mkdirSync(collection); win.debug('TorrentCollection: data directory created'); @@ -35,8 +37,8 @@ this.searchEngine = Settings.onlineSearchEngine; }, - onShow: function () { - Mousetrap.bind(['esc', 'backspace'], function (e) { + onShow: function() { + Mousetrap.bind(['esc', 'backspace'], function(e) { $('#filterbar-torrent-collection').click(); }); @@ -45,15 +47,15 @@ this.render(); - if(AdvSettings.get('pluginKATsearch')===false && AdvSettings.get('pluginRARBGsearch')===false) - $('.onlinesearch').hide(); - if(AdvSettings.get('pluginKATsearch')===false) - $('#kat-icon').hide(); - if(AdvSettings.get('pluginRARBGsearch')===false) - $('#rarbg-icon').hide(); + if (AdvSettings.get('pluginKATsearch') === false && AdvSettings.get('pluginRARBGsearch') === false) + $('.onlinesearch').hide(); + if (AdvSettings.get('pluginKATsearch') === false) + $('#kat-icon').hide(); + if (AdvSettings.get('pluginRARBGsearch') === false) + $('#rarbg-icon').hide(); }, - onRender: function () { + onRender: function() { $('.engine-icon').removeClass('active'); $('#' + this.searchEngine.toLowerCase() + '-icon').addClass('active'); $('#online-input').focus(); @@ -71,7 +73,7 @@ }); }, - changeEngine: function (e) { + changeEngine: function(e) { e.preventDefault(); Settings.onlineSearchEngine = this.searchEngine = e.currentTarget.dataset.id; @@ -86,7 +88,7 @@ } }, - createMagnetURI: function (torrentHash) { + createMagnetURI: function(torrentHash) { var magnet_uri = 'magnet:?xt=urn:btih:'; var tracker_list = '&tr=udp:\/\/tracker.coppersurfer.tk:6969' + '&tr=udp:\/\/p4p.arenabg.com:1337' @@ -100,15 +102,25 @@ + '&tr=udp:\/\/tracker.coppersurfer.tk:6969' + '&tr=udp:\/\/tracker.leechers-paradise.org:6969' + '&tr=udp:\/\/exodus.desync.com:696931622A'; - - Settings.trackers.forEach(function(item){ - tracker_list += '&tr='+item; + + Settings.trackers.forEach(function(item) { + tracker_list += '&tr=' + item; }); - + return magnet_uri + torrentHash + tracker_list; }, - onlineSearch: function (e) { + updateMagnetURI: function(magnet_uri) { + let tracker_list = ""; + + Settings.trackers.forEach(function(item) { + tracker_list += '&tr=' + item; + }); + + return magnet_uri + tracker_list; + }, + + onlineSearch: function(e) { if (e) { e.preventDefault(); } @@ -116,13 +128,22 @@ var input = $('#online-input').val(); var category = $('.online-categories > select').val(); AdvSettings.set('OnlineSearchCategory', category); - if (category === 'TV Series') { - category = 'tv'; - } else if (category === 'Movies') { - category = 'movies'; - } else if (category === 'Anime') { - category = 'anime'; + + switch (category) { + case 'TV Series': + category = 'tv'; + break; + case 'Movies': + category = "movies"; + break; + case 'XXX': + category = 'xxx'; + break; + case '4K': + category = '4k'; + break; } + var current = $('.onlinesearch-info > ul.file-list').html(); if (input === '' && current === '') { @@ -140,17 +161,26 @@ if (this.searchEngine === 'KAT') { + ga('set', { + page: '/popcorntimece/kat/search?s=' + encodeURI(input) + '&cat=' + encodeURI(category), + title: 'KAT Search Results: ' + input + }); + + ga('send', { + hitType: 'pageview' + }); + var kat = require('kat-api-ce'); kat.search({ query: input, min_seeds: 5, category: category - }).then(function (data) { + }).then(function(data) { win.debug('KAT search: %s results', data.results.length); - data.results.forEach(function (item) { + data.results.forEach(function(item) { var itemModel = { title: item.title, - magnet: item.magnet, + magnet: that.updateMagnetURI(item.magnet), seeds: item.seeds, peers: item.peers, size: Common.fileSize(parseInt(item.size)), @@ -171,7 +201,7 @@ $('.notorrents-info,.torrents-info').hide(); $('.online-search').removeClass('fa-spin fa-spinner').addClass('fa-search'); $('.onlinesearch-info').show(); - }).catch(function (err) { + }).catch(function(err) { win.debug('KAT search failed:', err.message); var error; if (err.message === 'No results') { @@ -187,16 +217,59 @@ }); } else { - //CREDIT to Mohammed Talas - github.com/talas9 + + //GA Track RARBG Search Value + ga('set', { + page: '/popcorntimece/rarbg/search?s=' + encodeURI(input) + '&cat=' + encodeURI(category), + title: 'RARBG Search Results: ' + input + }); + + ga('send', { + hitType: 'pageview' + }); + + //RarBg Search var rarbg = require('rarbg-api'); - rarbg.search(input, category).then(function (result) { - console.debug('rarbg search: %s results', result.results.length); - result.results.forEach(function (item) { + + const defaultParams = { + category: rarbg.CATEGORY.MOVIES, + limit: 100, + sort: 'last', + min_seeders: null, + min_leechers: null, + format: 'json_extended', + ranked: null + } + + switch (category) { + case 'xxx': + defaultParams.category = rarbg.CATEGORY.XXX; + break; + case 'movies': + defaultParams.category = rarbg.CATEGORY.MOVIES; + break; + case 'tv': + defaultParams.category = rarbg.CATEGORY.TV; + break; + case '4k': + defaultParams.category = rarbg.CATEGORY['4K']; + break; + } + + win.debug('rargb search started: %s', input); + rarbg.search(input, defaultParams).then(function(result) { + win.debug('rarbg search: %s results', result.length); + + //TODO: Update tracker list for each magnet + let tracker_list = that.updateMagnetURI(""); + + result.forEach(function(item) { + var itemModel = { title: item.title, - magnet: item.torrentLink, - seeds: item.seeds, - peers: item.leechs, + magnet: item.download,//FIXME tracker_list, + seeds: item.seeders, + peers: item.leechers, size: Common.fileSize(parseInt(item.size)), index: index }; @@ -221,7 +294,7 @@ if (index === 0) { $('.onlinesearch-info>ul.file-list').html('

' + i18n.__('No results found') + '
'); } - }).catch(function (err) { + }).catch(function(err) { console.debug('rarbg search failed:', err.message || err); var error; if (err === 'No torrents found') { @@ -242,16 +315,19 @@ } }, - onlineAddItem: function (item) { + onlineAddItem: function(item) { var ratio = item.peers > 0 ? item.seeds / item.peers : +item.seeds; $('.onlinesearch-info>ul.file-list').append( '
  • ' + item.title + '
    ' + item.size + '
  • ' - ); + ); if (item.seeds === 0) { // recalc the peers/seeds + //TODO: Update tracker list to full var torrent = item.magnet.split('&tr')[0] + '&tr=udp://tracker.openbittorrent.com:80/announce' + '&tr=udp://open.demonii.com:1337/announce' + '&tr=udp://tracker.coppersurfer.tk:6969'; - require('torrent-tracker-health')(torrent, { + + //require('torrent-tracker-health')(torrent, { + torrentHealth(torrent, { timeout: 1000 - }).then(function (res) { + }).then(function(res) { //console.log('torrent index %s: %s -> %s (seeds)', item.index, item.seeds, res.seeds) ratio = res.peers > 0 ? res.seeds / res.peers : +res.seeds; $('.result-item[data-index=' + item.index + '] i').attr('data-original-title', i18n.__('Ratio:') + ' ' + ratio.toFixed(2) + '
    ' + i18n.__('Seeds:') + ' ' + res.seeds + ' - ' + i18n.__('Peers:') + ' ' + res.peers); @@ -259,45 +335,46 @@ } }, - onlineOpen: function (e) { - var file = $(e.currentTarget).dataset.file; + onlineOpen: function(e) { + //var file = $(e.currentTarget).dataset.file; + var file = e.currentTarget.dataset.file; Settings.droppedMagnet = file; window.handleTorrent(file); }, - onlineClose: function () { + onlineClose: function() { $('.onlinesearch-info>ul.file-list').html(''); $('.onlinesearch-info').hide(); this.render(); }, - rightclick_search: function (e) { + rightclick_search: function(e) { e.stopPropagation(); var search_menu = new this.context_Menu(i18n.__('Cut'), i18n.__('Copy'), i18n.__('Paste')); search_menu.popup(e.originalEvent.x, e.originalEvent.y); }, - context_Menu: function (cutLabel, copyLabel, pasteLabel) { + context_Menu: function(cutLabel, copyLabel, pasteLabel) { var gui = require('nw.gui'), menu = new gui.Menu(), cut = new gui.MenuItem({ label: cutLabel || 'Cut', - click: function () { + click: function() { document.execCommand('cut'); } }), copy = new gui.MenuItem({ label: copyLabel || 'Copy', - click: function () { + click: function() { document.execCommand('copy'); } }), paste = new gui.MenuItem({ label: pasteLabel || 'Paste', - click: function () { + click: function() { var text = clipboard.get('text'); $('#online-input').val(text); } @@ -310,11 +387,11 @@ return menu; }, - openFileSelector: function (e) { + openFileSelector: function(e) { var _file = e.currentTarget.innerText; var file; - if(_file !== undefined) + if (_file !== undefined) file = _file.substring(0, _file.length - 2); // avoid ENOENT else file = ""; @@ -330,7 +407,7 @@ } }, - openMagnet: function (e) { + openMagnet: function(e) { this.$('.tooltip').css('display', 'none'); e.preventDefault(); e.stopPropagation(); @@ -357,7 +434,7 @@ } }, - deleteItem: function (e) { + deleteItem: function(e) { this.$('.tooltip').css('display', 'none'); e.preventDefault(); e.stopPropagation(); @@ -373,7 +450,7 @@ this.render(); }, - renameItem: function (e) { + renameItem: function(e) { this.$('.tooltip').css('display', 'none'); e.preventDefault(); e.stopPropagation(); @@ -413,7 +490,7 @@ this.render(); }, - renameInput: function (oldName) { + renameInput: function(oldName) { var userInput = prompt(i18n.__('Enter new name'), oldName); if (!userInput || userInput === oldName) { return false; @@ -422,43 +499,43 @@ } }, - clearCollection: function () { + clearCollection: function() { deleteFolder(collection); win.debug('Torrent Collection: delete all', collection); App.vent.trigger('torrentCollection:show'); }, - openCollection: function () { + openCollection: function() { win.debug('Opening: ' + collection); gui.Shell.openItem(collection); }, - importItem: function () { + importItem: function() { this.$('.tooltip').css('display', 'none'); var that = this; var input = document.querySelector('.collection-import-hidden'); - input.addEventListener('change', function (evt) { + input.addEventListener('change', function(evt) { var file = $('.collection-import-hidden')[0].files[0]; that.render(); window.ondrop({ dataTransfer: { files: [file] }, - preventDefault: function () { } + preventDefault: function() { } }); }, false); input.click(); }, - onDestroy: function () { + onDestroy: function() { Mousetrap.unbind(['esc', 'backspace']); $('#movie-detail').show(); $('#nav-filters').show(); }, - closeTorrentCollection: function () { + closeTorrentCollection: function() { App.vent.trigger('torrentCollection:close'); } diff --git a/src/app/settings.js b/src/app/settings.js index 51cd7397..0ed48135 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -2,7 +2,8 @@ var Q = require('q'), os = require('os'), path = require('path'), _ = require('underscore'), - data_path = require('nw.gui').App.dataPath; + data_path = require('nw.gui').App.dataPath, + axios = require('axios'); /** Default settings **/ var Settings = {}; @@ -86,7 +87,7 @@ Settings.pluginGoogleDrive = true; Settings.pluginHTML5 = true; Settings.pluginVLC = true; Settings.pluginRARBGsearch = true; -Settings.pluginKATsearch = true; +Settings.pluginKATsearch = false; Settings.pluginFakeSkan = false; // Features @@ -117,25 +118,30 @@ Settings.opensubtitlesAuthenticated = false; Settings.opensubtitlesUsername = ""; Settings.opensubtitlesPassword = ""; -Settings.tvAPI = [{ - url: 'https://api-fetch.website/tv/', +Settings.defaultTvAPI = [{ + url: 'https://tv-v2.api-fetch.sh/', strictSSL: true }, { - url: 'https://tv-v2.api-fetch.website', + url: 'https://tv-v2.api-fetch.am/', + strictSSL: true +}, { + url: 'https://tv-v2.api-fetch.website/', strictSSL: true }]; -Settings.ytsAPI = [{ +Settings.tvAPI = Settings.defaultTvAPI.slice(0); + + +Settings.defaultMovieAPI = [{ url: 'http://yts.am/', strictSSL: true }, { url: 'http://yts.ag/', strictSSL: true -},{ - url: 'https://movies.api-fetch.website/', - strictSSL: true }]; +Settings.ytsAPI = Settings.defaultMovieAPI.slice(0); + Settings.updateEndpoint = { url: '',//'http://popcorntime.ag/', index: 0, @@ -148,27 +154,24 @@ Settings.updateEndpoint = { }] }; -Settings.trackersList = ['https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all_udp.txt']; +Settings.trackersList = [ + 'https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt', + 'https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all_ws.txt' +]; Settings.trackers = [ - 'udp://glotorrents.pw:6969/announce', - 'udp://tracker.coppersurfer.tk:80', 'udp://tracker.coppersurfer.tk:6969/announce', - 'udp://tracker.leechers-paradise.org:6969/announce', 'udp://tracker.internetwarriors.net:1337/announce', - 'udp://tracker.openbittorrent.com:80', + 'http://tracker.moxing.party:6969/announce', 'udp://tracker.opentrackr.org:1337/announce', 'udp://tracker.pirateparty.gr:6969/announce', 'udp://tracker.tiny-vps.com:6969/announce', - 'udp://tracker.vanitycore.co:6969/announce', 'udp://exodus.desync.com:6969/announce', - 'udp://p4p.arenabg.ch:1337', - 'udp://open.demonii.com:1337/announce', - 'udp://public.popcorn-tracker.org:6969/announce', - 'udp://9.rarbg.to:2710/announce', - 'udp://p4p.arenabg.com:1337', - 'wss://tracker.openwebtorrent.com:443/announce', - 'wss://tracker.fastcast.nz:443/announce' + 'https://tracker.bt-hash.com:443/announce', + 'http://explodie.org:6969/announce', + 'udp://9.rarbg.me:2710', + 'udp://9.rarbg.to:2710', + 'wss://tracker.openwebtorrent.com' ]; // App Settings @@ -185,7 +188,7 @@ Settings.tv_detail_jump_to = 'next'; Settings.rememberRegister = true; //GA Code -Settings.gaCode = 'UA-72854850-1'; //PROD - 1, TEST - 3 +Settings.gaCode = 'UA-174404912-1'; //PROD - 1, TEST - 3 Settings.analytics = true; var ScreenResolution = { @@ -224,9 +227,9 @@ var AdvSettings = { set: function(variable, newValue) { Database.writeSetting({ - key: variable, - value: newValue - }) + key: variable, + value: newValue + }) .then(function() { Settings[variable] = newValue; }); @@ -393,8 +396,8 @@ var AdvSettings = { var cacheDb = openDatabase('cachedb', '', 'Cache database', 50 * 1024 * 1024); cacheDb.transaction(function(tx) { - tx.executeSql('DELETE FROM subtitle',[], function(_, result) {}); - tx.executeSql('DELETE FROM metadata',[], function(_, result) {}); + tx.executeSql('DELETE FROM subtitle', [], function(_, result) { }); + tx.executeSql('DELETE FROM metadata', [], function(_, result) { }); }); // Add an upgrade flag @@ -403,4 +406,21 @@ var AdvSettings = { AdvSettings.set('version', currentVersion); AdvSettings.set('releaseName', gui.App.manifest.releaseName); }, + + updateTrackers: async function() { + + win.info('Update Trackers'); + Settings.trackersList.forEach(async function(item) { + //win.debug('Tracker Started: '+item); + var trackers; + try { + const response = await axios.get(item); + trackers = response.data.split("\n\n").filter(function(value, index, arr) { return value != "" }); + Settings.trackers = _.union(Settings.trackers, trackers); + win.debug('Trackers Added: ' + item); + } catch (error) { + win.error(error); + } + }) + }, }; \ No newline at end of file diff --git a/src/app/templates/about.tpl b/src/app/templates/about.tpl index 290da52d..601f931c 100644 --- a/src/app/templates/about.tpl +++ b/src/app/templates/about.tpl @@ -12,8 +12,13 @@ <% } %> -
    + +
    + <%= i18n.__("Report an issue") %>
    diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 56b0c510..82b9755d 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -469,14 +469,14 @@

    <%= i18n.__("Movie API Endpoint") %>

    - <% if (Settings.ytsAPI.length <= 1) { %> + <% if (Settings.ytsAPI.length > Settings.defaultMovieAPI.length) { %>    <% } %>

    <%= i18n.__("TV Show API Endpoint") %>

    - <% if (Settings.tvAPI.length <= 1) { %> + <% if (Settings.tvAPI.length > Settings.defaultTvAPI.length) { %>    <% } %>
    diff --git a/src/app/templates/torrent_collection.tpl b/src/app/templates/torrent_collection.tpl index 259d937a..571beea2 100644 --- a/src/app/templates/torrent_collection.tpl +++ b/src/app/templates/torrent_collection.tpl @@ -9,7 +9,7 @@