cross-seed 2.9.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/{src/clients → clients}/QBittorrent.js +31 -37
  2. package/dist/clients/QBittorrent.js.map +1 -0
  3. package/dist/{src/clients → clients}/RTorrent.js +42 -48
  4. package/dist/clients/RTorrent.js.map +1 -0
  5. package/dist/clients/TorrentClient.js +20 -0
  6. package/dist/clients/TorrentClient.js.map +1 -0
  7. package/dist/{src/cmd.js → cmd.js} +54 -57
  8. package/dist/cmd.js.map +1 -0
  9. package/dist/{src/config.template.js → config.template.cjs} +1 -2
  10. package/dist/config.template.cjs.map +1 -0
  11. package/dist/{src/config.template.docker.js → config.template.docker.cjs} +1 -3
  12. package/dist/config.template.docker.cjs.map +1 -0
  13. package/dist/configuration.js +39 -0
  14. package/dist/configuration.js.map +1 -0
  15. package/dist/constants.js +33 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/db.js +28 -0
  18. package/dist/db.js.map +1 -0
  19. package/dist/decide.js +132 -0
  20. package/dist/decide.js.map +1 -0
  21. package/dist/errors.js +11 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/jackett.js +68 -0
  24. package/dist/jackett.js.map +1 -0
  25. package/dist/{src/logger.js → logger.js} +22 -25
  26. package/dist/logger.js.map +1 -0
  27. package/dist/pipeline.js +134 -0
  28. package/dist/pipeline.js.map +1 -0
  29. package/dist/preFilter.js +66 -0
  30. package/dist/preFilter.js.map +1 -0
  31. package/dist/pushNotifier.js +27 -0
  32. package/dist/pushNotifier.js.map +1 -0
  33. package/dist/runtimeConfig.js +12 -0
  34. package/dist/runtimeConfig.js.map +1 -0
  35. package/dist/searchee.js +49 -0
  36. package/dist/searchee.js.map +1 -0
  37. package/dist/{src/server.js → server.js} +23 -30
  38. package/dist/server.js.map +1 -0
  39. package/dist/{src/signalHandlers.js → signalHandlers.js} +0 -0
  40. package/dist/signalHandlers.js.map +1 -0
  41. package/dist/startup.js +24 -0
  42. package/dist/startup.js.map +1 -0
  43. package/dist/torrent.js +128 -0
  44. package/dist/torrent.js.map +1 -0
  45. package/dist/utils.js +28 -0
  46. package/dist/utils.js.map +1 -0
  47. package/package.json +21 -25
  48. package/dist/package.json +0 -68
  49. package/dist/src/clients/QBittorrent.js.map +0 -1
  50. package/dist/src/clients/RTorrent.js.map +0 -1
  51. package/dist/src/clients/TorrentClient.js +0 -27
  52. package/dist/src/clients/TorrentClient.js.map +0 -1
  53. package/dist/src/cmd.js.map +0 -1
  54. package/dist/src/config.template.docker.js.map +0 -1
  55. package/dist/src/config.template.js.map +0 -1
  56. package/dist/src/configuration.js +0 -66
  57. package/dist/src/configuration.js.map +0 -1
  58. package/dist/src/constants.js +0 -39
  59. package/dist/src/constants.js.map +0 -1
  60. package/dist/src/db.js +0 -34
  61. package/dist/src/db.js.map +0 -1
  62. package/dist/src/decide.js +0 -143
  63. package/dist/src/decide.js.map +0 -1
  64. package/dist/src/errors.js +0 -15
  65. package/dist/src/errors.js.map +0 -1
  66. package/dist/src/jackett.js +0 -76
  67. package/dist/src/jackett.js.map +0 -1
  68. package/dist/src/logger.js.map +0 -1
  69. package/dist/src/pipeline.js +0 -140
  70. package/dist/src/pipeline.js.map +0 -1
  71. package/dist/src/preFilter.js +0 -77
  72. package/dist/src/preFilter.js.map +0 -1
  73. package/dist/src/pushNotifier.js +0 -35
  74. package/dist/src/pushNotifier.js.map +0 -1
  75. package/dist/src/runtimeConfig.js +0 -17
  76. package/dist/src/runtimeConfig.js.map +0 -1
  77. package/dist/src/searchee.js +0 -72
  78. package/dist/src/searchee.js.map +0 -1
  79. package/dist/src/server.js.map +0 -1
  80. package/dist/src/signalHandlers.js.map +0 -1
  81. package/dist/src/startup.js +0 -28
  82. package/dist/src/startup.js.map +0 -1
  83. package/dist/src/torrent.js +0 -169
  84. package/dist/src/torrent.js.map +0 -1
  85. package/dist/src/utils.js +0 -39
  86. package/dist/src/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.template.docker.js","sourceRoot":"","sources":["../../src/config.template.docker.js"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,4EAA4E;AAC5E,wBAAwB;AAExB,MAAM,CAAC,OAAO,GAAG;IAChB,gBAAgB,EAAE,6BAA6B;IAC/C,aAAa,EAAE,2BAA2B;IAE1C,4EAA4E;IAC5E,4DAA4D;IAC5D,KAAK,EAAE,EAAE;IAET,qBAAqB;IACrB,gDAAgD;IAChD,uDAAuD;IACvD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;IAEnC,sCAAsC;IACtC,+CAA+C;IAC/C,2CAA2C;IAC3C,8CAA8C;IAC9C,gCAAgC;IAChC,2DAA2D;IAC3D,UAAU,EAAE,WAAW;IAEvB,gEAAgE;IAChE,gCAAgC;IAChC,2DAA2D;IAC3D,SAAS,EAAE,cAAc;IAEzB,gDAAgD;IAChD,eAAe,EAAE,KAAK;IAEtB,wDAAwD;IACxD,yCAAyC;IACzC,SAAS,EAAE,KAAK;IAEhB,uDAAuD;IACvD,YAAY,EAAE,SAAS;IAEvB,4CAA4C;IAC5C,oCAAoC;IACpC,mBAAmB,EAAE,SAAS;IAE9B,oCAAoC;IACpC,6DAA6D;IAC7D,MAAM,EAAE,MAAM;IAEd,6CAA6C;IAC7C,uCAAuC;IACvC,wEAAwE;IACxE,cAAc,EAAE,SAAS;IAEzB,qCAAqC;IACrC,uCAAuC;IACvC,4DAA4D;IAC5D,4CAA4C;IAC5C,cAAc,EAAE,SAAS;IAEzB,iDAAiD;IACjD,0CAA0C;IAC1C,2CAA2C;IAC3C,sBAAsB,EAAE,SAAS;CACjC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.template.js","sourceRoot":"","sources":["../../src/config.template.js"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,wBAAwB;AAExB,MAAM,CAAC,OAAO,GAAG;IAChB,aAAa,EAAE,CAAC;IAEhB,gBAAgB,EAAE,+BAA+B;IACjD,aAAa,EAAE,2BAA2B;IAE1C,4EAA4E;IAC5E,4DAA4D;IAC5D,KAAK,EAAE,EAAE;IAET,qBAAqB;IACrB,gDAAgD;IAChD,uDAAuD;IACvD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;IAEnC,sCAAsC;IACtC,+CAA+C;IAC/C,2CAA2C;IAC3C,8CAA8C;IAC9C,UAAU,EAAE,2BAA2B;IAEvC,gEAAgE;IAChE,SAAS,EAAE,GAAG;IAEd,gDAAgD;IAChD,eAAe,EAAE,KAAK;IAEtB,wDAAwD;IACxD,yCAAyC;IACzC,SAAS,EAAE,KAAK;IAEhB,uDAAuD;IACvD,YAAY,EAAE,SAAS;IAEvB,4CAA4C;IAC5C,oCAAoC;IACpC,mBAAmB,EAAE,SAAS;IAE9B,oCAAoC;IACpC,6DAA6D;IAC7D,MAAM,EAAE,MAAM;IAEd,6CAA6C;IAC7C,uCAAuC;IACvC,wEAAwE;IACxE,cAAc,EAAE,SAAS;IAEzB,qCAAqC;IACrC,uCAAuC;IACvC,4DAA4D;IAC5D,4CAA4C;IAC5C,cAAc,EAAE,SAAS;IAEzB,iDAAiD;IACjD,0CAA0C;IAC1C,2CAA2C;IAC3C,sBAAsB,EAAE,SAAS;CACjC,CAAC"}
@@ -1,66 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getFileConfig = exports.generateConfig = exports.createAppDir = exports.appDir = void 0;
7
- const chalk_1 = __importDefault(require("chalk"));
8
- const fs_1 = __importDefault(require("fs"));
9
- const path_1 = __importDefault(require("path"));
10
- const package_json_1 = __importDefault(require("../package.json"));
11
- const config_template_1 = __importDefault(require("./config.template"));
12
- const constants_1 = require("./constants");
13
- function appDir() {
14
- return (process.env.CONFIG_DIR ||
15
- (process.platform === "win32"
16
- ? path_1.default.resolve(process.env.LOCALAPPDATA, package_json_1.default.name)
17
- : path_1.default.resolve(process.env.HOME, `.${package_json_1.default.name}`)));
18
- }
19
- exports.appDir = appDir;
20
- function createAppDir() {
21
- fs_1.default.mkdirSync(path_1.default.join(appDir(), "torrent_cache"), { recursive: true });
22
- fs_1.default.mkdirSync(path_1.default.join(appDir(), "logs"), { recursive: true });
23
- }
24
- exports.createAppDir = createAppDir;
25
- function generateConfig({ force = false, docker = false, }) {
26
- createAppDir();
27
- const dest = path_1.default.join(appDir(), "config.js");
28
- const templatePath = path_1.default.join(__dirname, `config.template${docker ? ".docker" : ""}.js`);
29
- if (!force && fs_1.default.existsSync(dest)) {
30
- console.log("Configuration file already exists.");
31
- return;
32
- }
33
- fs_1.default.copyFileSync(templatePath, dest);
34
- console.log("Configuration file created at", chalk_1.default.yellow.bold(dest));
35
- }
36
- exports.generateConfig = generateConfig;
37
- function printUpdateInstructions(missingKeys) {
38
- const configPath = path_1.default.join(appDir(), "config.js");
39
- console.error(chalk_1.default.yellow `
40
- Error: Your configuration file is out of date.
41
- Missing options:\n\t${missingKeys.join("\n\t")}
42
- Please update at ${configPath}.
43
- When you are done, set the configVersion to ${config_template_1.default.configVersion}.
44
- It may help to read the template, at ${constants_1.CONFIG_TEMPLATE_URL}
45
- `);
46
- }
47
- function getFileConfig() {
48
- const configPath = path_1.default.join(appDir(), "config.js");
49
- try {
50
- // eslint-disable-next-line @typescript-eslint/no-var-requires
51
- const fileConfig = require(configPath);
52
- const { configVersion = 0 } = fileConfig;
53
- if (configVersion < configVersion) {
54
- const missingKeys = Object.keys(config_template_1.default).filter((k) => !(k in fileConfig));
55
- printUpdateInstructions(missingKeys);
56
- }
57
- return fileConfig;
58
- }
59
- catch (e) {
60
- if (e.code !== "MODULE_NOT_FOUND")
61
- throw e;
62
- return {};
63
- }
64
- }
65
- exports.getFileConfig = getFileConfig;
66
- //# sourceMappingURL=configuration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../../src/configuration.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PermanentDecisions = exports.Decision = exports.InjectionResult = exports.Action = exports.TORRENT_CACHE_FOLDER = exports.INDEXED_TORRENTS = exports.DECISIONS = exports.SEARCHEES = exports.CONFIG_TEMPLATE_URL = exports.EXTENSIONS = exports.MOVIE_REGEX = exports.SEASON_REGEX = exports.EP_REGEX = void 0;
4
- exports.EP_REGEX = /^(?<title>.+)[. ](?<season>S\d+)(?<episode>E\d+)/i;
5
- exports.SEASON_REGEX = /^(?<title>.+)[. ](?<season>S\d+)(?:\s?-\s?(?<seasonmax>S?\d+))?(?!E\d+)/i;
6
- exports.MOVIE_REGEX = /^(?<title>.+)[. ][[(]?(?<year>\d{4})[)\]]?(?![pi])/i;
7
- exports.EXTENSIONS = ["mkv", "mp4", "avi"];
8
- exports.CONFIG_TEMPLATE_URL = "https://github.com/mmgoodnow/cross-seed/blob/master/src/config.template.js";
9
- exports.SEARCHEES = "searchees";
10
- exports.DECISIONS = "decisions";
11
- exports.INDEXED_TORRENTS = "indexedTorrents";
12
- exports.TORRENT_CACHE_FOLDER = "torrent_cache";
13
- var Action;
14
- (function (Action) {
15
- Action["SAVE"] = "save";
16
- Action["INJECT"] = "inject";
17
- })(Action = exports.Action || (exports.Action = {}));
18
- var InjectionResult;
19
- (function (InjectionResult) {
20
- InjectionResult[InjectionResult["SUCCESS"] = 0] = "SUCCESS";
21
- InjectionResult[InjectionResult["FAILURE"] = 1] = "FAILURE";
22
- InjectionResult[InjectionResult["ALREADY_EXISTS"] = 2] = "ALREADY_EXISTS";
23
- InjectionResult[InjectionResult["TORRENT_NOT_COMPLETE"] = 3] = "TORRENT_NOT_COMPLETE";
24
- })(InjectionResult = exports.InjectionResult || (exports.InjectionResult = {}));
25
- var Decision;
26
- (function (Decision) {
27
- Decision["MATCH"] = "MATCH";
28
- Decision["SIZE_MISMATCH"] = "SIZE_MISMATCH";
29
- Decision["NO_DOWNLOAD_LINK"] = "NO_DOWNLOAD_LINK";
30
- Decision["DOWNLOAD_FAILED"] = "DOWNLOAD_FAILED";
31
- Decision["INFO_HASH_ALREADY_EXISTS"] = "INFO_HASH_ALREADY_EXISTS";
32
- Decision["FILE_TREE_MISMATCH"] = "FILE_TREE_MISMATCH";
33
- })(Decision = exports.Decision || (exports.Decision = {}));
34
- exports.PermanentDecisions = [
35
- Decision.SIZE_MISMATCH,
36
- Decision.NO_DOWNLOAD_LINK,
37
- Decision.FILE_TREE_MISMATCH,
38
- ];
39
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,mDAAmD,CAAC;AAC/D,QAAA,YAAY,GAAG,0EAA0E,CAAC;AAC1F,QAAA,WAAW,GAAG,qDAAqD,CAAC;AAEpE,QAAA,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAEnC,QAAA,mBAAmB,GAC/B,4EAA4E,CAAC;AAEjE,QAAA,SAAS,GAAG,WAAW,CAAC;AACxB,QAAA,SAAS,GAAG,WAAW,CAAC;AACxB,QAAA,gBAAgB,GAAG,iBAAiB,CAAC;AAErC,QAAA,oBAAoB,GAAG,eAAe,CAAC;AAEpD,IAAY,MAGX;AAHD,WAAY,MAAM;IACjB,uBAAa,CAAA;IACb,2BAAiB,CAAA;AAClB,CAAC,EAHW,MAAM,GAAN,cAAM,KAAN,cAAM,QAGjB;AAED,IAAY,eAKX;AALD,WAAY,eAAe;IAC1B,2DAAO,CAAA;IACP,2DAAO,CAAA;IACP,yEAAc,CAAA;IACd,qFAAoB,CAAA;AACrB,CAAC,EALW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAK1B;AAED,IAAY,QAOX;AAPD,WAAY,QAAQ;IACnB,2BAAe,CAAA;IACf,2CAA+B,CAAA;IAC/B,iDAAqC,CAAA;IACrC,+CAAmC,CAAA;IACnC,iEAAqD,CAAA;IACrD,qDAAyC,CAAA;AAC1C,CAAC,EAPW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAOnB;AAEY,QAAA,kBAAkB,GAAe;IAC7C,QAAQ,CAAC,aAAa;IACtB,QAAQ,CAAC,gBAAgB;IACzB,QAAQ,CAAC,kBAAkB;CAC3B,CAAC"}
package/dist/src/db.js DELETED
@@ -1,34 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.dropDatabase = void 0;
7
- const rimraf_1 = require("rimraf");
8
- const lowdb_1 = __importDefault(require("lowdb"));
9
- const FileSync_1 = __importDefault(require("lowdb/adapters/FileSync"));
10
- const path_1 = __importDefault(require("path"));
11
- const configuration_1 = require("./configuration");
12
- const constants_1 = require("./constants");
13
- const fs_1 = require("fs");
14
- configuration_1.createAppDir();
15
- const db = lowdb_1.default(new FileSync_1.default(path_1.default.join(configuration_1.appDir(), "cache.json")));
16
- const emptyDatabase = {
17
- [constants_1.SEARCHEES]: {},
18
- [constants_1.DECISIONS]: {},
19
- [constants_1.INDEXED_TORRENTS]: [],
20
- dbVersion: 3,
21
- };
22
- const dbVersion = db.get("dbVersion").value();
23
- if (!dbVersion || dbVersion < emptyDatabase.dbVersion) {
24
- db.setState(emptyDatabase);
25
- }
26
- db.defaults(emptyDatabase).write();
27
- function dropDatabase() {
28
- db.setState(emptyDatabase).write();
29
- fs_1.unlinkSync(path_1.default.join(configuration_1.appDir(), "cache.json"));
30
- rimraf_1.sync(path_1.default.join(configuration_1.appDir(), "torrent_cache"));
31
- }
32
- exports.dropDatabase = dropDatabase;
33
- exports.default = db;
34
- //# sourceMappingURL=db.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/db.ts"],"names":[],"mappings":";;;;;;AAAA,mCAA4C;AAC5C,kDAA0B;AAC1B,uEAA+C;AAC/C,gDAAwB;AACxB,mDAAuD;AACvD,2CAA+E;AAC/E,2BAAgC;AAEhC,4BAAY,EAAE,CAAC;AA4Bf,MAAM,EAAE,GAAG,eAAK,CAAC,IAAI,kBAAQ,CAAS,cAAI,CAAC,IAAI,CAAC,sBAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAE1E,MAAM,aAAa,GAAG;IACrB,CAAC,qBAAS,CAAC,EAAE,EAAE;IACf,CAAC,qBAAS,CAAC,EAAE,EAAE;IACf,CAAC,4BAAgB,CAAC,EAAE,EAAE;IACtB,SAAS,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;AAE9C,IAAI,CAAC,SAAS,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE;IACtD,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;CAC3B;AAED,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;AAEnC,SAAgB,YAAY;IAC3B,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;IACnC,eAAU,CAAC,cAAI,CAAC,IAAI,CAAC,sBAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9C,aAAU,CAAC,cAAI,CAAC,IAAI,CAAC,sBAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;AAClD,CAAC;AAJD,oCAIC;AAED,kBAAe,EAAE,CAAC"}
@@ -1,143 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.assessResult = void 0;
7
- const fs_1 = require("fs");
8
- const parse_torrent_1 = __importDefault(require("parse-torrent"));
9
- const path_1 = __importDefault(require("path"));
10
- const configuration_1 = require("./configuration");
11
- const constants_1 = require("./constants");
12
- const db_1 = __importDefault(require("./db"));
13
- const logger_1 = require("./logger");
14
- const torrent_1 = require("./torrent");
15
- const createReasonLogger = (Title, tracker, name) => (decision, cached) => {
16
- function logReason(reason) {
17
- logger_1.logger.verbose({
18
- label: logger_1.Label.DECIDE,
19
- message: `${name} - no match for ${tracker} torrent ${Title} - ${reason}`,
20
- });
21
- }
22
- let reason;
23
- switch (decision) {
24
- case constants_1.Decision.MATCH:
25
- return;
26
- case constants_1.Decision.SIZE_MISMATCH:
27
- reason = "its size does not match";
28
- break;
29
- case constants_1.Decision.NO_DOWNLOAD_LINK:
30
- reason = "it doesn't have a download link";
31
- break;
32
- case constants_1.Decision.DOWNLOAD_FAILED:
33
- reason = "the torrent file failed to download";
34
- break;
35
- case constants_1.Decision.INFO_HASH_ALREADY_EXISTS:
36
- reason = "the info hash matches a torrent you already have";
37
- break;
38
- case constants_1.Decision.FILE_TREE_MISMATCH:
39
- reason = "it has a different file tree";
40
- break;
41
- default:
42
- reason = decision;
43
- break;
44
- }
45
- if (cached)
46
- logReason(`${reason} (cached)`);
47
- else
48
- logReason(reason);
49
- };
50
- function compareFileTrees(candidate, searchee) {
51
- const cmp = (elOfA, elOfB) => {
52
- const lengthsAreEqual = elOfB.length === elOfA.length;
53
- const pathsAreEqual = elOfB.path === elOfA.path;
54
- return lengthsAreEqual && pathsAreEqual;
55
- };
56
- return candidate.files.every((elOfA) => searchee.files.some((elOfB) => cmp(elOfA, elOfB)));
57
- }
58
- function sizeDoesMatch(resultSize, searchee) {
59
- const { length } = searchee;
60
- const lowerBound = length - 0.02 * length;
61
- const upperBound = length + 0.02 * length;
62
- return resultSize >= lowerBound && resultSize <= upperBound;
63
- }
64
- async function assessResultHelper({ Link, Size }, searchee, hashesToExclude) {
65
- if (!sizeDoesMatch(Size, searchee)) {
66
- return { decision: constants_1.Decision.SIZE_MISMATCH };
67
- }
68
- if (!Link)
69
- return { decision: constants_1.Decision.NO_DOWNLOAD_LINK };
70
- const info = await torrent_1.parseTorrentFromURL(Link);
71
- if (!info)
72
- return { decision: constants_1.Decision.DOWNLOAD_FAILED };
73
- if (hashesToExclude.includes(info.infoHash)) {
74
- return { decision: constants_1.Decision.INFO_HASH_ALREADY_EXISTS };
75
- }
76
- if (!compareFileTrees(info, searchee)) {
77
- return { decision: constants_1.Decision.FILE_TREE_MISMATCH };
78
- }
79
- return { decision: constants_1.Decision.MATCH, info };
80
- }
81
- function existsInCache(infoHash) {
82
- return fs_1.existsSync(path_1.default.join(configuration_1.appDir(), constants_1.TORRENT_CACHE_FOLDER, `${infoHash}.cached.torrent`));
83
- }
84
- async function getCachedTorrentFile(infoHash) {
85
- return torrent_1.parseTorrentFromFilename(path_1.default.join(configuration_1.appDir(), constants_1.TORRENT_CACHE_FOLDER, `${infoHash}.cached.torrent`));
86
- }
87
- function cacheTorrentFile(meta) {
88
- fs_1.writeFileSync(path_1.default.join(configuration_1.appDir(), constants_1.TORRENT_CACHE_FOLDER, `${meta.infoHash}.cached.torrent`), parse_torrent_1.default.toTorrentFile(meta));
89
- }
90
- async function assessResultCaching(result, searchee, infoHashesToExclude) {
91
- const { Guid, Title, TrackerId: tracker } = result;
92
- const logReason = createReasonLogger(Title, tracker, searchee.name);
93
- const cacheEntry = db_1.default
94
- .get([
95
- constants_1.DECISIONS,
96
- searchee.name,
97
- Guid,
98
- ])
99
- .clone()
100
- .value();
101
- // handles path creation
102
- db_1.default.get(constants_1.DECISIONS)
103
- .defaultsDeep({
104
- [searchee.name]: {
105
- [Guid]: {
106
- firstSeen: Date.now(),
107
- },
108
- },
109
- })
110
- .set([searchee.name, Guid, "lastSeen"], Date.now())
111
- .value();
112
- let assessment;
113
- if (cacheEntry && cacheEntry.decision !== constants_1.Decision.MATCH) {
114
- assessment = { decision: cacheEntry.decision };
115
- logReason(cacheEntry.decision, true);
116
- }
117
- else if (cacheEntry && existsInCache(cacheEntry.infoHash)) {
118
- if (infoHashesToExclude.includes(cacheEntry.infoHash)) {
119
- // has been added since the last run
120
- assessment = { decision: constants_1.Decision.INFO_HASH_ALREADY_EXISTS };
121
- db_1.default.set([constants_1.DECISIONS, searchee.name, Guid, "decision"], assessment.decision).value();
122
- }
123
- else {
124
- assessment = {
125
- decision: cacheEntry.decision,
126
- info: await getCachedTorrentFile(cacheEntry.infoHash),
127
- };
128
- }
129
- }
130
- else {
131
- assessment = await assessResultHelper(result, searchee, infoHashesToExclude);
132
- db_1.default.set([constants_1.DECISIONS, searchee.name, Guid, "decision"], assessment.decision).value();
133
- if (assessment.decision === constants_1.Decision.MATCH) {
134
- db_1.default.set([constants_1.DECISIONS, searchee.name, Guid, "infoHash"], assessment.info.infoHash).value();
135
- cacheTorrentFile(assessment.info);
136
- }
137
- logReason(assessment.decision, false);
138
- }
139
- db_1.default.write();
140
- return assessment;
141
- }
142
- exports.assessResult = assessResultCaching;
143
- //# sourceMappingURL=decide.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decide.js","sourceRoot":"","sources":["../../src/decide.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CrossSeedError = void 0;
4
- const logger_1 = require("./logger");
5
- class CrossSeedError extends Error {
6
- constructor(message) {
7
- super(message);
8
- delete this.stack;
9
- }
10
- print() {
11
- logger_1.logger.error(this.message);
12
- }
13
- }
14
- exports.CrossSeedError = CrossSeedError;
15
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAElC,MAAa,cAAe,SAAQ,KAAK;IACxC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,KAAK;QACJ,eAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;CACD;AATD,wCASC"}
@@ -1,76 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.makeJackettRequest = exports.validateJackettApi = void 0;
7
- const querystring_1 = __importDefault(require("querystring"));
8
- const simple_get_1 = __importDefault(require("simple-get"));
9
- const constants_1 = require("./constants");
10
- const errors_1 = require("./errors");
11
- const logger_1 = require("./logger");
12
- const runtimeConfig_1 = require("./runtimeConfig");
13
- function reformatTitleForSearching(name) {
14
- const seasonMatch = name.match(constants_1.SEASON_REGEX);
15
- const movieMatch = name.match(constants_1.MOVIE_REGEX);
16
- const episodeMatch = name.match(constants_1.EP_REGEX);
17
- const fullMatch = episodeMatch
18
- ? episodeMatch[0]
19
- : seasonMatch
20
- ? seasonMatch[0]
21
- : movieMatch
22
- ? movieMatch[0]
23
- : name;
24
- return fullMatch
25
- .replace(/[.()[\]]/g, " ")
26
- .replace(/\s+/g, " ")
27
- .trim();
28
- }
29
- function fullJackettUrl(jackettServerUrl, params) {
30
- const jackettPath = `/api/v2.0/indexers/all/results`;
31
- return `${jackettServerUrl}${jackettPath}?${querystring_1.default.encode(params)}`;
32
- }
33
- async function validateJackettApi() {
34
- const { jackettServerUrl, jackettApiKey: apikey } = runtimeConfig_1.getRuntimeConfig();
35
- if (/\/$/.test(jackettServerUrl)) {
36
- logger_1.logger.warn("Warning: Jackett server url should not end with '/'");
37
- }
38
- // search for gibberish so the results will be empty
39
- const gibberish = "bscdjpstabgdspjdasmomdsenqciadsnocdpsikncaodsnimcdqsanc";
40
- try {
41
- await makeJackettRequest(gibberish);
42
- }
43
- catch (e) {
44
- const dummyUrl = fullJackettUrl(jackettServerUrl, { apikey });
45
- throw new errors_1.CrossSeedError(`Could not reach Jackett at ${dummyUrl}`);
46
- }
47
- }
48
- exports.validateJackettApi = validateJackettApi;
49
- function makeJackettRequest(name, nonceOptions = runtimeConfig_1.EmptyNonceOptions) {
50
- const { jackettApiKey, trackers: runtimeConfigTrackers, jackettServerUrl, } = runtimeConfig_1.getRuntimeConfig();
51
- const { trackers = runtimeConfigTrackers } = nonceOptions;
52
- const params = {
53
- apikey: jackettApiKey,
54
- Query: reformatTitleForSearching(name),
55
- "Tracker[]": trackers,
56
- };
57
- const opts = {
58
- method: "GET",
59
- url: fullJackettUrl(jackettServerUrl, params),
60
- json: true,
61
- };
62
- logger_1.logger.verbose({
63
- label: logger_1.Label.JACKETT,
64
- message: `making search with query "${params.Query}"`,
65
- });
66
- return new Promise((resolve, reject) => {
67
- simple_get_1.default.concat(opts, (err, res, data) => {
68
- if (err)
69
- reject(err);
70
- else
71
- resolve(data);
72
- });
73
- });
74
- }
75
- exports.makeJackettRequest = makeJackettRequest;
76
- //# sourceMappingURL=jackett.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jackett.js","sourceRoot":"","sources":["../../src/jackett.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"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"}
@@ -1,140 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.main = exports.searchForLocalTorrentByCriteria = void 0;
7
- const chalk_1 = __importDefault(require("chalk"));
8
- const fs_1 = __importDefault(require("fs"));
9
- const TorrentClient_1 = require("./clients/TorrentClient");
10
- const constants_1 = require("./constants");
11
- const db_1 = __importDefault(require("./db"));
12
- const decide_1 = require("./decide");
13
- const jackett_1 = require("./jackett");
14
- const logger_1 = require("./logger");
15
- const preFilter_1 = require("./preFilter");
16
- const pushNotifier_1 = require("./pushNotifier");
17
- const runtimeConfig_1 = require("./runtimeConfig");
18
- const torrent_1 = require("./torrent");
19
- const utils_1 = require("./utils");
20
- async function findOnOtherSites(searchee, hashesToExclude, nonceOptions = runtimeConfig_1.EmptyNonceOptions) {
21
- const { action } = runtimeConfig_1.getRuntimeConfig();
22
- const assessEach = async (result) => ({
23
- assessment: await decide_1.assessResult(result, searchee, hashesToExclude),
24
- tracker: result.TrackerId,
25
- });
26
- const tag = utils_1.getTag(searchee.name);
27
- const query = utils_1.stripExtension(searchee.name);
28
- let response;
29
- try {
30
- response = await jackett_1.makeJackettRequest(query, nonceOptions);
31
- }
32
- catch (e) {
33
- logger_1.logger.error(`error querying Jackett for ${query}`);
34
- return 0;
35
- }
36
- const results = response.Results;
37
- const loaded = await Promise.all(results.map(assessEach));
38
- const successful = loaded.filter((e) => e.assessment.decision === constants_1.Decision.MATCH);
39
- pushNotifier_1.pushNotifier.notify({
40
- body: `Found ${searchee.name} on ${successful.length} trackers${successful.length &&
41
- // @ts-expect-error ListFormat totally exists in node 12
42
- `: ${new Intl.ListFormat("en", {
43
- style: "long",
44
- type: "conjunction",
45
- }).format(successful.map((s) => s.tracker))}`}`,
46
- extra: {
47
- infoHashes: successful.map((s) => s.assessment.info.infoHash),
48
- trackers: successful.map((s) => s.tracker),
49
- },
50
- });
51
- let isTorrentIncomplete;
52
- for (const { tracker, assessment: { info: newInfo }, } of successful) {
53
- const styledName = chalk_1.default.green.bold(newInfo.name);
54
- const styledTracker = chalk_1.default.bold(tracker);
55
- if (action === constants_1.Action.INJECT) {
56
- const result = await TorrentClient_1.getClient().inject(newInfo, searchee, nonceOptions);
57
- switch (result) {
58
- case constants_1.InjectionResult.SUCCESS:
59
- logger_1.logger.info(`Found ${styledName} on ${styledTracker} - injected`);
60
- break;
61
- case constants_1.InjectionResult.ALREADY_EXISTS:
62
- logger_1.logger.info(`Found ${styledName} on ${styledTracker} - exists`);
63
- break;
64
- case constants_1.InjectionResult.TORRENT_NOT_COMPLETE:
65
- logger_1.logger.warn(`Found ${styledName} on ${styledTracker} - skipping incomplete torrent`);
66
- isTorrentIncomplete = true;
67
- break;
68
- case constants_1.InjectionResult.FAILURE:
69
- default:
70
- logger_1.logger.error(`Found ${styledName} on ${styledTracker} - failed to inject, saving instead`);
71
- torrent_1.saveTorrentFile(tracker, tag, newInfo, nonceOptions);
72
- break;
73
- }
74
- }
75
- else {
76
- torrent_1.saveTorrentFile(tracker, tag, newInfo, nonceOptions);
77
- logger_1.logger.info(`Found ${styledName} on ${styledTracker}`);
78
- }
79
- }
80
- if (!isTorrentIncomplete) {
81
- updateSearchTimestamps(searchee.name);
82
- }
83
- return successful.length;
84
- }
85
- function updateSearchTimestamps(name) {
86
- db_1.default.get(constants_1.SEARCHEES)
87
- .defaultsDeep({
88
- [name]: {
89
- firstSearched: Date.now(),
90
- },
91
- })
92
- .set([name, "lastSearched"], Date.now())
93
- .write();
94
- }
95
- async function findMatchesBatch(samples, hashesToExclude) {
96
- const { delay, offset } = runtimeConfig_1.getRuntimeConfig();
97
- let totalFound = 0;
98
- for (const [i, sample] of samples.entries()) {
99
- const sleep = new Promise((r) => setTimeout(r, delay * 1000));
100
- const progress = chalk_1.default.blue(`[${i + 1 + offset}/${samples.length + offset}]`);
101
- const name = utils_1.stripExtension(sample.name);
102
- logger_1.logger.info("%s %s %s", progress, chalk_1.default.dim("Searching for"), name);
103
- const numFoundPromise = findOnOtherSites(sample, hashesToExclude);
104
- const [numFound] = await Promise.all([numFoundPromise, sleep]);
105
- totalFound += numFound;
106
- }
107
- return totalFound;
108
- }
109
- async function searchForLocalTorrentByCriteria(criteria, nonceOptions) {
110
- const meta = await torrent_1.getTorrentByCriteria(criteria);
111
- const hashesToExclude = torrent_1.getInfoHashesToExclude();
112
- if (!preFilter_1.filterByContent(meta))
113
- return null;
114
- return findOnOtherSites(meta, hashesToExclude, nonceOptions);
115
- }
116
- exports.searchForLocalTorrentByCriteria = searchForLocalTorrentByCriteria;
117
- async function findSearchableTorrents() {
118
- const { offset } = runtimeConfig_1.getRuntimeConfig();
119
- const parsedTorrents = await torrent_1.loadTorrentDirLight();
120
- const hashesToExclude = parsedTorrents
121
- .map((t) => t.infoHash)
122
- .filter(Boolean);
123
- const filteredTorrents = preFilter_1.filterDupes(parsedTorrents)
124
- .filter(preFilter_1.filterByContent)
125
- .filter(preFilter_1.filterTimestamps);
126
- const samples = filteredTorrents.slice(offset);
127
- logger_1.logger.info("Found %d torrents, %d suitable to search for matches", parsedTorrents.length, filteredTorrents.length);
128
- return { samples, hashesToExclude };
129
- }
130
- async function main() {
131
- const { offset, outputDir } = runtimeConfig_1.getRuntimeConfig();
132
- const { samples, hashesToExclude } = await findSearchableTorrents();
133
- if (offset > 0)
134
- logger_1.logger.info(`Starting at offset ${offset}`);
135
- fs_1.default.mkdirSync(outputDir, { recursive: true });
136
- const totalFound = await findMatchesBatch(samples, hashesToExclude);
137
- logger_1.logger.info(chalk_1.default.cyan("Done! Found %s cross seeds from %s original torrents"), chalk_1.default.bold.white(totalFound), chalk_1.default.bold.white(samples.length));
138
- }
139
- exports.main = main;
140
- //# sourceMappingURL=pipeline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/pipeline.ts"],"names":[],"mappings":"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"}