cross-seed 2.9.0 → 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 +52 -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} +58 -60
  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 -140
  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 -139
  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,57 +1,52 @@
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
- const form_data_1 = __importDefault(require("form-data"));
7
- const node_fetch_1 = __importDefault(require("node-fetch"));
8
- const parse_torrent_1 = __importDefault(require("parse-torrent"));
9
- const querystring_1 = __importDefault(require("querystring"));
10
- const constants_1 = require("../constants");
11
- const errors_1 = require("../errors");
12
- const logger_1 = require("../logger");
13
- const runtimeConfig_1 = require("../runtimeConfig");
1
+ import FormData from "form-data";
2
+ import fetch from "node-fetch";
3
+ import parseTorrent from "parse-torrent";
4
+ import querystring from "querystring";
5
+ import { InjectionResult } from "../constants.js";
6
+ import { CrossSeedError } from "../errors.js";
7
+ import { Label, logger } from "../logger.js";
8
+ import { getRuntimeConfig } from "../runtimeConfig.js";
14
9
  const X_WWW_FORM_URLENCODED = {
15
10
  "Content-Type": "application/x-www-form-urlencoded",
16
11
  };
17
- class QBittorrent {
12
+ export default class QBittorrent {
18
13
  constructor() {
19
- const { qbittorrentUrl } = runtimeConfig_1.getRuntimeConfig();
14
+ const { qbittorrentUrl } = getRuntimeConfig();
20
15
  try {
21
16
  this.url = new URL(`${qbittorrentUrl}/api/v2`);
22
17
  }
23
18
  catch (e) {
24
- throw new errors_1.CrossSeedError("qBittorrent url must be percent-encoded");
19
+ throw new CrossSeedError("qBittorrent url must be percent-encoded");
25
20
  }
26
21
  }
27
22
  async login() {
28
23
  const { origin, pathname, username, password } = this.url;
29
24
  let qs;
30
25
  try {
31
- qs = querystring_1.default.encode({
26
+ qs = querystring.encode({
32
27
  username: decodeURIComponent(username),
33
28
  password: decodeURIComponent(password),
34
29
  });
35
30
  }
36
31
  catch (e) {
37
- throw new errors_1.CrossSeedError("qBittorrent url must be percent-encoded");
32
+ throw new CrossSeedError("qBittorrent url must be percent-encoded");
38
33
  }
39
34
  let response;
40
35
  try {
41
- response = await node_fetch_1.default(`${origin}${pathname}/auth/login?${qs}`);
36
+ response = await fetch(`${origin}${pathname}/auth/login?${qs}`);
42
37
  }
43
38
  catch (e) {
44
- throw new errors_1.CrossSeedError(`qBittorrent login failed: ${e.message}`);
39
+ throw new CrossSeedError(`qBittorrent login failed: ${e.message}`);
45
40
  }
46
41
  if (response.status !== 200) {
47
- throw new errors_1.CrossSeedError(`qBittorrent login failed with code ${response.status}`);
42
+ throw new CrossSeedError(`qBittorrent login failed with code ${response.status}`);
48
43
  }
49
44
  const cookieArray = response.headers.raw()["set-cookie"];
50
45
  if (cookieArray) {
51
46
  this.cookie = cookieArray[0].split(";")[0];
52
47
  }
53
48
  else {
54
- throw new errors_1.CrossSeedError(`qBittorrent login failed: Invalid username or password`);
49
+ throw new CrossSeedError(`qBittorrent login failed: Invalid username or password`);
55
50
  }
56
51
  }
57
52
  async validateConfig() {
@@ -59,19 +54,19 @@ class QBittorrent {
59
54
  await this.createTag();
60
55
  }
61
56
  async request(path, body, headers = {}, retries = 1) {
62
- logger_1.logger.verbose({
63
- label: logger_1.Label.QBITTORRENT,
57
+ logger.verbose({
58
+ label: Label.QBITTORRENT,
64
59
  message: `Making request to ${path} with body ${body.toString()}`,
65
60
  });
66
61
  const { origin, pathname } = this.url;
67
- const response = await node_fetch_1.default(`${origin}${pathname}${path}`, {
62
+ const response = await fetch(`${origin}${pathname}${path}`, {
68
63
  method: "post",
69
64
  headers: { Cookie: this.cookie, ...headers },
70
65
  body,
71
66
  });
72
67
  if (response.status === 403 && retries > 0) {
73
- logger_1.logger.verbose({
74
- label: logger_1.Label.QBITTORRENT,
68
+ logger.verbose({
69
+ label: Label.QBITTORRENT,
75
70
  message: "received 403 from API. Logging in again and retrying",
76
71
  });
77
72
  await this.login();
@@ -103,14 +98,14 @@ class QBittorrent {
103
98
  }
104
99
  async inject(newTorrent, searchee, nonceOptions) {
105
100
  if (await this.isInfoHashInClient(newTorrent.infoHash)) {
106
- return constants_1.InjectionResult.ALREADY_EXISTS;
101
+ return InjectionResult.ALREADY_EXISTS;
107
102
  }
108
- const buf = parse_torrent_1.default.toTorrentFile(newTorrent);
103
+ const buf = parseTorrent.toTorrentFile(newTorrent);
109
104
  try {
110
- const { save_path, category, isComplete, } = await this.getTorrentConfiguration(searchee);
105
+ const { save_path, category, isComplete } = await this.getTorrentConfiguration(searchee);
111
106
  if (!isComplete)
112
- return constants_1.InjectionResult.TORRENT_NOT_COMPLETE;
113
- const formData = new form_data_1.default();
107
+ return InjectionResult.TORRENT_NOT_COMPLETE;
108
+ const formData = new FormData();
114
109
  formData.append("torrents", buf, {
115
110
  filename: `${newTorrent.name}.cross-seed.torrent`,
116
111
  contentType: "application/x-bittorrent",
@@ -120,16 +115,15 @@ class QBittorrent {
120
115
  formData.append("tags", "cross-seed");
121
116
  formData.append("autoTMM", "false");
122
117
  await this.request("/torrents/add", formData);
123
- return constants_1.InjectionResult.SUCCESS;
118
+ return InjectionResult.SUCCESS;
124
119
  }
125
120
  catch (e) {
126
- logger_1.logger.debug({
127
- label: logger_1.Label.QBITTORRENT,
121
+ logger.debug({
122
+ label: Label.QBITTORRENT,
128
123
  message: `injection failed: ${e.message}`,
129
124
  });
130
- return constants_1.InjectionResult.FAILURE;
125
+ return InjectionResult.FAILURE;
131
126
  }
132
127
  }
133
128
  }
134
- exports.default = QBittorrent;
135
129
  //# sourceMappingURL=QBittorrent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QBittorrent.js","sourceRoot":"","sources":["../../src/clients/QBittorrent.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAA6B,MAAM,YAAY,CAAC;AACvD,OAAO,YAA0B,MAAM,eAAe,CAAC;AACvD,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAgB,MAAM,qBAAqB,CAAC;AAIrE,MAAM,qBAAqB,GAAG;IAC7B,cAAc,EAAE,mCAAmC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,WAAW;IAI/B;QACC,MAAM,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAAC;QAC9C,IAAI;YACH,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,cAAc,SAAS,CAAC,CAAC;SAC/C;QAAC,OAAO,CAAC,EAAE;YACX,MAAM,IAAI,cAAc,CAAC,yCAAyC,CAAC,CAAC;SACpE;IACF,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAE1D,IAAI,EAAE,CAAC;QACP,IAAI;YACH,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;gBACvB,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC;gBACtC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC;aACtC,CAAC,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACX,MAAM,IAAI,cAAc,CAAC,yCAAyC,CAAC,CAAC;SACpE;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,GAAG,QAAQ,eAAe,EAAE,EAAE,CAAC,CAAC;SAChE;QAAC,OAAO,CAAC,EAAE;YACX,MAAM,IAAI,cAAc,CAAC,6BAA6B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACnE;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC5B,MAAM,IAAI,cAAc,CACvB,sCAAsC,QAAQ,CAAC,MAAM,EAAE,CACvD,CAAC;SACF;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3C;aAAM;YACN,MAAM,IAAI,cAAc,CACvB,wDAAwD,CACxD,CAAC;SACF;IACF,CAAC;IAED,KAAK,CAAC,cAAc;QACnB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,OAAO,CACpB,IAAY,EACZ,IAAc,EACd,UAAkC,EAAE,EACpC,OAAO,GAAG,CAAC;QAEX,MAAM,CAAC,OAAO,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,WAAW;YACxB,OAAO,EAAE,qBAAqB,IAAI,cAAc,IAAI,CAAC,QAAQ,EAAE,EAAE;SACjE,CAAC,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE;YAC5C,IAAI;SACJ,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE;YAC3C,MAAM,CAAC,OAAO,CAAC;gBACd,KAAK,EAAE,KAAK,CAAC,WAAW;gBACxB,OAAO,EAAE,sDAAsD;aAC/D,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;SACtD;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,SAAS;QACd,MAAM,IAAI,CAAC,OAAO,CACjB,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,CACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACxC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CACtC,sBAAsB,EACtB,QAAQ,QAAQ,EAAE,EAClB,qBAAqB,CACrB,CAAC;QACF,IAAI;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5C,OAAO,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,CAAC;SACpD;QAAC,OAAO,CAAC,EAAE;YACX,OAAO,KAAK,CAAC;SACb;IACF,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC5B,QAAkB;QAElB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CACtC,gBAAgB,EAChB,UAAU,QAAQ,CAAC,QAAQ,EAAE,EAC7B,qBAAqB,CACrB,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,CACnC,CAAC;QACF,IAAI,YAAY,KAAK,SAAS,EAAE;YAC/B,MAAM,IAAI,KAAK,CACd,0DAA0D,CAC1D,CAAC;SACF;QACD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;QACvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,KAAK,CAAC,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,MAAM,CACX,UAAoB,EACpB,QAAkB,EAClB,YAA0B;QAE1B,IAAI,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YACvD,OAAO,eAAe,CAAC,cAAc,CAAC;SACtC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI;YACH,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,GACxC,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU;gBAAE,OAAO,eAAe,CAAC,oBAAoB,CAAC;YAC7D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE;gBAChC,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,qBAAqB;gBACjD,WAAW,EAAE,0BAA0B;aACvC,CAAC,CAAC;YACH,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACzC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACvC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YACtC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;YAC9C,OAAO,eAAe,CAAC,OAAO,CAAC;SAC/B;QAAC,OAAO,CAAC,EAAE;YACX,MAAM,CAAC,KAAK,CAAC;gBACZ,KAAK,EAAE,KAAK,CAAC,WAAW;gBACxB,OAAO,EAAE,qBAAqB,CAAC,CAAC,OAAO,EAAE;aACzC,CAAC,CAAC;YACH,OAAO,eAAe,CAAC,OAAO,CAAC;SAC/B;IACF,CAAC;CACD"}
@@ -1,27 +1,23 @@
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
- const bencode_1 = __importDefault(require("bencode"));
7
- const fs_1 = require("fs");
8
- const parse_torrent_1 = __importDefault(require("parse-torrent"));
9
- const path_1 = require("path");
10
- const xmlrpc_1 = __importDefault(require("xmlrpc"));
11
- const constants_1 = require("../constants");
12
- const errors_1 = require("../errors");
13
- const logger_1 = require("../logger");
14
- const runtimeConfig_1 = require("../runtimeConfig");
15
- const utils_1 = require("../utils");
1
+ import bencode from "bencode";
2
+ import { promises as fs } from "fs";
3
+ import parseTorrent from "parse-torrent";
4
+ import { dirname, resolve } from "path";
5
+ import { inspect } from "util";
6
+ import xmlrpc from "xmlrpc";
7
+ import { InjectionResult } from "../constants.js";
8
+ import { CrossSeedError } from "../errors.js";
9
+ import { Label, logger } from "../logger.js";
10
+ import { getRuntimeConfig } from "../runtimeConfig.js";
11
+ import { wait } from "../utils.js";
16
12
  async function createLibTorrentResumeTree(meta, dataDir) {
17
13
  async function getFileResumeData(file) {
18
- const filePath = path_1.resolve(dataDir, file.path);
19
- const fileStat = await fs_1.promises
14
+ const filePath = resolve(dataDir, file.path);
15
+ const fileStat = await fs
20
16
  .lstat(filePath)
21
17
  .catch(() => ({ isFile: () => false }));
22
18
  if (!fileStat.isFile() || fileStat.size !== file.length) {
23
- logger_1.logger.debug({
24
- label: logger_1.Label.RTORRENT,
19
+ logger.debug({
20
+ label: Label.RTORRENT,
25
21
  message: `File ${filePath} either doesn't exist or is the wrong size.`,
26
22
  });
27
23
  return {
@@ -42,18 +38,18 @@ async function createLibTorrentResumeTree(meta, dataDir) {
42
38
  };
43
39
  }
44
40
  async function saveWithLibTorrentResume(meta, savePath, dataDir) {
45
- const rawMeta = bencode_1.default.decode(parse_torrent_1.default.toTorrentFile(meta));
41
+ const rawMeta = bencode.decode(parseTorrent.toTorrentFile(meta));
46
42
  rawMeta.libtorrent_resume = await createLibTorrentResumeTree(meta, dataDir);
47
- await fs_1.promises.writeFile(savePath, bencode_1.default.encode(rawMeta));
43
+ await fs.writeFile(savePath, bencode.encode(rawMeta));
48
44
  }
49
- class RTorrent {
45
+ export default class RTorrent {
50
46
  constructor() {
51
- const { rtorrentRpcUrl } = runtimeConfig_1.getRuntimeConfig();
47
+ const { rtorrentRpcUrl } = getRuntimeConfig();
52
48
  try {
53
49
  const { origin, username, password, protocol, pathname } = new URL(rtorrentRpcUrl);
54
50
  const clientCreator = protocol === "https:"
55
- ? xmlrpc_1.default.createSecureClient
56
- : xmlrpc_1.default.createClient;
51
+ ? xmlrpc.createSecureClient
52
+ : xmlrpc.createClient;
57
53
  const shouldUseAuth = Boolean(username && password);
58
54
  this.client = clientCreator({
59
55
  url: origin + pathname,
@@ -66,13 +62,13 @@ class RTorrent {
66
62
  });
67
63
  }
68
64
  catch (e) {
69
- throw new errors_1.CrossSeedError("rTorrent url must be percent-encoded");
65
+ throw new CrossSeedError("rTorrent url must be percent-encoded");
70
66
  }
71
67
  }
72
68
  async methodCallP(method, args) {
73
- logger_1.logger.verbose({
74
- label: logger_1.Label.RTORRENT,
75
- message: `Calling method ${method} with params ${args}`,
69
+ logger.verbose({
70
+ label: Label.RTORRENT,
71
+ message: `Calling method ${method} with params ${inspect(args)}`,
76
72
  });
77
73
  return new Promise((resolve, reject) => {
78
74
  this.client.methodCall(method, args, (err, data) => {
@@ -88,10 +84,10 @@ class RTorrent {
88
84
  }
89
85
  async getTorrentConfiguration(searchee) {
90
86
  if (!searchee.infoHash) {
91
- throw new errors_1.CrossSeedError("rTorrent direct injection not implemented for data-based searchees");
87
+ throw new CrossSeedError("rTorrent direct injection not implemented for data-based searchees");
92
88
  }
93
89
  const infoHash = searchee.infoHash.toUpperCase();
94
- const [[isMultiFileStr], [dir], [isCompleteStr],] = await this.methodCallP("system.multicall", [
90
+ const result = await this.methodCallP("system.multicall", [
95
91
  [
96
92
  {
97
93
  methodName: "d.is_multi_file",
@@ -107,13 +103,22 @@ class RTorrent {
107
103
  },
108
104
  ],
109
105
  ]);
110
- return {
111
- dataDir: Number(isMultiFileStr) ? path_1.dirname(dir) : dir,
112
- isComplete: Boolean(Number(isCompleteStr)),
113
- };
106
+ // temp diag for #154
107
+ try {
108
+ const [[isMultiFileStr], [dir], [isCompleteStr]] = result;
109
+ return {
110
+ dataDir: Number(isMultiFileStr) ? dirname(dir) : dir,
111
+ isComplete: Boolean(Number(isCompleteStr)),
112
+ };
113
+ }
114
+ catch (e) {
115
+ logger.error(e);
116
+ logger.debug("Failure caused by server response below:");
117
+ logger.debug(inspect(result));
118
+ }
114
119
  }
115
120
  async validateConfig() {
116
- const { rtorrentRpcUrl } = runtimeConfig_1.getRuntimeConfig();
121
+ const { rtorrentRpcUrl } = getRuntimeConfig();
117
122
  // no validation to do
118
123
  if (!rtorrentRpcUrl)
119
124
  return;
@@ -121,19 +126,19 @@ class RTorrent {
121
126
  await this.methodCallP("download_list", []);
122
127
  }
123
128
  catch (e) {
124
- throw new errors_1.CrossSeedError(`Failed to reach rTorrent at ${rtorrentRpcUrl}`);
129
+ throw new CrossSeedError(`Failed to reach rTorrent at ${rtorrentRpcUrl}`);
125
130
  }
126
131
  }
127
132
  async inject(meta, searchee, nonceOptions) {
128
- const { outputDir: runtimeConfigOutputDir } = runtimeConfig_1.getRuntimeConfig();
133
+ const { outputDir: runtimeConfigOutputDir } = getRuntimeConfig();
129
134
  const { outputDir = runtimeConfigOutputDir } = nonceOptions;
130
135
  if (await this.checkForInfoHashInClient(meta.infoHash)) {
131
- return constants_1.InjectionResult.ALREADY_EXISTS;
136
+ return InjectionResult.ALREADY_EXISTS;
132
137
  }
133
138
  const { dataDir, isComplete } = await this.getTorrentConfiguration(searchee);
134
139
  if (!isComplete)
135
- return constants_1.InjectionResult.TORRENT_NOT_COMPLETE;
136
- const torrentFilePath = path_1.resolve(outputDir, `${meta.name}.tmp.${Date.now()}.torrent`);
140
+ return InjectionResult.TORRENT_NOT_COMPLETE;
141
+ const torrentFilePath = resolve(outputDir, `${meta.name}.tmp.${Date.now()}.torrent`);
137
142
  await saveWithLibTorrentResume(meta, torrentFilePath, dataDir);
138
143
  for (let i = 0; i < 5; i++) {
139
144
  try {
@@ -147,19 +152,18 @@ class RTorrent {
147
152
  break;
148
153
  }
149
154
  catch (e) {
150
- await utils_1.wait(1000 * Math.pow(2, i));
155
+ await wait(1000 * Math.pow(2, i));
151
156
  }
152
157
  }
153
158
  for (let i = 0; i < 5; i++) {
154
159
  if (await this.checkForInfoHashInClient(meta.infoHash)) {
155
- setTimeout(() => fs_1.promises.unlink(torrentFilePath), 1000);
156
- return constants_1.InjectionResult.SUCCESS;
160
+ setTimeout(() => fs.unlink(torrentFilePath), 1000);
161
+ return InjectionResult.SUCCESS;
157
162
  }
158
- await utils_1.wait(100 * Math.pow(2, i));
163
+ await wait(100 * Math.pow(2, i));
159
164
  }
160
- setTimeout(() => fs_1.promises.unlink(torrentFilePath), 1000);
161
- return constants_1.InjectionResult.FAILURE;
165
+ setTimeout(() => fs.unlink(torrentFilePath), 1000);
166
+ return InjectionResult.FAILURE;
162
167
  }
163
168
  }
164
- exports.default = RTorrent;
165
169
  //# sourceMappingURL=RTorrent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RTorrent.js","sourceRoot":"","sources":["../../src/clients/RTorrent.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAS,MAAM,IAAI,CAAC;AAC3C,OAAO,YAAuC,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,MAAkB,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAgB,MAAM,qBAAqB,CAAC;AAErE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAcnC,KAAK,UAAU,0BAA0B,CACxC,IAAc,EACd,OAAe;IAEf,KAAK,UAAU,iBAAiB,CAC/B,IAAiB;QAEjB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,EAAE;aACvB,KAAK,CAAC,QAAQ,CAAC;aACf,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAY,CAAA,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE;YACxD,MAAM,CAAC,KAAK,CAAC;gBACZ,KAAK,EAAE,KAAK,CAAC,QAAQ;gBACrB,OAAO,EAAE,QAAQ,QAAQ,6CAA6C;aACtE,CAAC,CAAC;YACH,OAAO;gBACN,SAAS,EAAE,CAAC;gBACZ,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,CAAC;aACX,CAAC;SACF;QAED,OAAO;YACN,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;YACpD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1C,QAAQ,EAAE,CAAC;SACX,CAAC;IACH,CAAC;IAED,OAAO;QACN,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QACnD,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,CACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CACjC;KACD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CACtC,IAAc,EACd,QAAgB,EAChB,OAAe;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,iBAAiB,GAAG,MAAM,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,QAAQ;IAE5B;QACC,MAAM,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAAC;QAE9C,IAAI;YACH,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CACjE,cAAc,CACd,CAAC;YAEF,MAAM,aAAa,GAClB,QAAQ,KAAK,QAAQ;gBACpB,CAAC,CAAC,MAAM,CAAC,kBAAkB;gBAC3B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;YAExB,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;YAEpD,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;gBAC3B,GAAG,EAAE,MAAM,GAAG,QAAQ;gBACtB,UAAU,EAAE,aAAa;oBACxB,CAAC,CAAC;wBACA,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC;wBAClC,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC;qBACjC;oBACH,CAAC,CAAC,SAAS;aACZ,CAAC,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACX,MAAM,IAAI,cAAc,CAAC,sCAAsC,CAAC,CAAC;SACjE;IACF,CAAC;IAEO,KAAK,CAAC,WAAW,CAAI,MAAc,EAAE,IAAI;QAChD,MAAM,CAAC,OAAO,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,QAAQ;YACrB,OAAO,EAAE,kBAAkB,MAAM,gBAAgB,OAAO,CAAC,IAAI,CAAC,EAAE;SAChE,CAAC,CAAC;QACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBAClD,IAAI,GAAG;oBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,QAAgB;QAC9C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAC1C,eAAe,EACf,EAAE,CACF,CAAC;QACF,OAAO,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC5B,QAAkB;QAElB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACvB,MAAM,IAAI,cAAc,CACvB,oEAAoE,CACpE,CAAC;SACF;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAa,kBAAkB,EAAE;YACrE;gBACC;oBACC,UAAU,EAAE,iBAAiB;oBAC7B,MAAM,EAAE,CAAC,QAAQ,CAAC;iBAClB;gBACD;oBACC,UAAU,EAAE,aAAa;oBACzB,MAAM,EAAE,CAAC,QAAQ,CAAC;iBAClB;gBACD;oBACC,UAAU,EAAE,YAAY;oBACxB,MAAM,EAAE,CAAC,QAAQ,CAAC;iBAClB;aACD;SACD,CAAC,CAAC;QAEH,qBAAqB;QACrB,IAAI;YACH,MAAM,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC;YAC1D,OAAO;gBACN,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;gBACpD,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;aAC1C,CAAC;SACF;QAAC,OAAO,CAAC,EAAE;YACX,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;SAC9B;IACF,CAAC;IAED,KAAK,CAAC,cAAc;QACnB,MAAM,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAAC;QAC9C,sBAAsB;QACtB,IAAI,CAAC,cAAc;YAAE,OAAO;QAE5B,IAAI;YACH,MAAM,IAAI,CAAC,WAAW,CAAW,eAAe,EAAE,EAAE,CAAC,CAAC;SACtD;QAAC,OAAO,CAAC,EAAE;YACX,MAAM,IAAI,cAAc,CACvB,+BAA+B,cAAc,EAAE,CAC/C,CAAC;SACF;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CACX,IAAc,EACd,QAAkB,EAClB,YAA0B;QAE1B,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,GAAG,gBAAgB,EAAE,CAAC;QACjE,MAAM,EAAE,SAAS,GAAG,sBAAsB,EAAE,GAAG,YAAY,CAAC;QAE5D,IAAI,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACvD,OAAO,eAAe,CAAC,cAAc,CAAC;SACtC;QAED,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CACjE,QAAQ,CACR,CAAC;QAEF,IAAI,CAAC,UAAU;YAAE,OAAO,eAAe,CAAC,oBAAoB,CAAC;QAE7D,MAAM,eAAe,GAAG,OAAO,CAC9B,SAAS,EACT,GAAG,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,UAAU,CACxC,CAAC;QACF,MAAM,wBAAwB,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QAE/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI;gBACH,MAAM,IAAI,CAAC,WAAW,CAAO,YAAY,EAAE;oBAC1C,EAAE;oBACF,eAAe;oBACf,oBAAoB,OAAO,GAAG;oBAC9B,4BAA4B;oBAC5B,wBAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE;iBACvD,CAAC,CAAC;gBACH,MAAM;aACN;YAAC,OAAO,CAAC,EAAE;gBACX,MAAM,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAClC;SACD;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACvD,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;gBACnD,OAAO,eAAe,CAAC,OAAO,CAAC;aAC/B;YACD,MAAM,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACjC;QACD,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,eAAe,CAAC,OAAO,CAAC;IAChC,CAAC;CACD"}
@@ -0,0 +1,20 @@
1
+ import { getRuntimeConfig } from "../runtimeConfig.js";
2
+ import QBittorrent from "./QBittorrent.js";
3
+ import RTorrent from "./RTorrent.js";
4
+ let activeClient;
5
+ function instantiateDownloadClient() {
6
+ const { rtorrentRpcUrl, qbittorrentUrl } = getRuntimeConfig();
7
+ if (rtorrentRpcUrl) {
8
+ activeClient = new RTorrent();
9
+ }
10
+ else if (qbittorrentUrl) {
11
+ activeClient = new QBittorrent();
12
+ }
13
+ }
14
+ export function getClient() {
15
+ if (!activeClient) {
16
+ instantiateDownloadClient();
17
+ }
18
+ return activeClient;
19
+ }
20
+ //# sourceMappingURL=TorrentClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TorrentClient.js","sourceRoot":"","sources":["../../src/clients/TorrentClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAgB,MAAM,qBAAqB,CAAC;AAErE,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,IAAI,YAA2B,CAAC;AAWhC,SAAS,yBAAyB;IACjC,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9D,IAAI,cAAc,EAAE;QACnB,YAAY,GAAG,IAAI,QAAQ,EAAE,CAAC;KAC9B;SAAM,IAAI,cAAc,EAAE;QAC1B,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC;KACjC;AACF,CAAC;AAED,MAAM,UAAU,SAAS;IACxB,IAAI,CAAC,YAAY,EAAE;QAClB,yBAAyB,EAAE,CAAC;KAC5B;IACD,OAAO,YAAY,CAAC;AACrB,CAAC"}
@@ -1,24 +1,21 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const chalk_1 = __importDefault(require("chalk"));
8
- const commander_1 = require("commander");
9
- const package_json_1 = __importDefault(require("../package.json"));
10
- const configuration_1 = require("./configuration");
11
- const constants_1 = require("./constants");
12
- const db_1 = require("./db");
13
- const errors_1 = require("./errors");
14
- const logger_1 = require("./logger");
15
- const pipeline_1 = require("./pipeline");
16
- const pushNotifier_1 = require("./pushNotifier");
17
- const runtimeConfig_1 = require("./runtimeConfig");
18
- const server_1 = require("./server");
19
- const util_1 = require("util");
20
- require("./signalHandlers");
21
- const startup_1 = require("./startup");
2
+ import chalk from "chalk";
3
+ import { Option, program } from "commander";
4
+ import { inspect } from "util";
5
+ import { generateConfig, getFileConfig } from "./configuration.js";
6
+ import { Action } from "./constants.js";
7
+ import { dropDatabase } from "./db.js";
8
+ import { CrossSeedError } from "./errors.js";
9
+ import { initializeLogger, Label, logger } from "./logger.js";
10
+ import { main } from "./pipeline.js";
11
+ import { initializePushNotifier, sendTestNotification, } from "./pushNotifier.js";
12
+ import { setRuntimeConfig } from "./runtimeConfig.js";
13
+ import { serve } from "./server.js";
14
+ import "./signalHandlers.js";
15
+ import { doStartupValidation } from "./startup.js";
16
+ import { createRequire } from "module";
17
+ const require = createRequire(import.meta.url);
18
+ const packageDotJson = require("../package.json");
22
19
  function fallback(...args) {
23
20
  for (const arg of args) {
24
21
  if (arg !== undefined)
@@ -27,65 +24,66 @@ function fallback(...args) {
27
24
  return undefined;
28
25
  }
29
26
  function processOptions(options) {
30
- options.trackers =
31
- options.trackers && options.trackers.split(",").filter((e) => e !== "");
27
+ var _a;
28
+ options.trackers = (_a = options.trackers) === null || _a === void 0 ? void 0 : _a.split(",").filter((e) => e !== "");
32
29
  return options;
33
30
  }
34
31
  async function run() {
35
- const fileConfig = configuration_1.getFileConfig();
32
+ const fileConfig = await getFileConfig();
36
33
  function createCommandWithSharedOptions(name, description) {
37
- return commander_1.program
34
+ var _a;
35
+ return program
38
36
  .command(name)
39
37
  .description(description)
40
38
  .requiredOption("-u, --jackett-server-url <url>", "Your Jackett server url", fileConfig.jackettServerUrl)
41
39
  .requiredOption("-k, --jackett-api-key <key>", "Your Jackett API key", fileConfig.jackettApiKey)
42
- .requiredOption("-t, --trackers <tracker1>,<tracker2>", "Comma-separated list of Jackett tracker ids to search (Tracker ids can be found in their Torznab feed paths)", fallback(fileConfig.trackers && fileConfig.trackers.join(","), ""))
40
+ .requiredOption("-t, --trackers <tracker1>,<tracker2>", "Comma-separated list of Jackett tracker ids to search (Tracker ids can be found in their Torznab feed paths)", fallback((_a = fileConfig.trackers) === null || _a === void 0 ? void 0 : _a.join(","), ""))
43
41
  .requiredOption("-i, --torrent-dir <dir>", "Directory with torrent files", fileConfig.torrentDir)
44
42
  .requiredOption("-s, --output-dir <dir>", "Directory to save results in", fileConfig.outputDir)
45
43
  .requiredOption("-a, --search-all", "Search for all torrents regardless of their contents", fallback(fileConfig.searchAll, false))
46
44
  .option("-x, --exclude-older <cutoff>", "Exclude torrents first seen more than n minutes ago. Bypasses the -a flag.", (n) => parseInt(n), fileConfig.excludeOlder)
47
45
  .option("-r, --exclude-recent-search <cutoff>", "Exclude torrents which have been searched more recently than n minutes ago. Bypasses the -a flag.", (n) => parseInt(n), fileConfig.excludeRecentSearch)
48
46
  .requiredOption("-v, --verbose", "Log verbose output", false)
49
- .addOption(new commander_1.Option("-A, --action <action>", "If set to 'inject', cross-seed will attempt to add the found torrents to your torrent client.")
50
- .default(fallback(fileConfig.action, constants_1.Action.SAVE))
51
- .choices(Object.values(constants_1.Action))
47
+ .addOption(new Option("-A, --action <action>", "If set to 'inject', cross-seed will attempt to add the found torrents to your torrent client.")
48
+ .default(fallback(fileConfig.action, Action.SAVE))
49
+ .choices(Object.values(Action))
52
50
  .makeOptionMandatory())
53
51
  .option("--rtorrent-rpc-url <url>", "The url of your rtorrent XMLRPC interface. Requires '-A inject'. See the docs for more information.", fileConfig.rtorrentRpcUrl)
54
52
  .option("--qbittorrent-url <url>", "The url of your qBittorrent webui. Requires '-A inject'. See the docs for more information.", fileConfig.qbittorrentUrl)
55
53
  .option("--notification-webhook-url <url>", "cross-seed will send POST requests to this url with a JSON payload of { title, body }", fileConfig.notificationWebhookUrl);
56
54
  }
57
- commander_1.program.name(package_json_1.default.name);
58
- commander_1.program.description(chalk_1.default.yellow.bold("cross-seed"));
59
- commander_1.program.version(package_json_1.default.version, "-V, --version", "output the current version");
60
- commander_1.program
55
+ program.name(packageDotJson.name);
56
+ program.description(chalk.yellow.bold("cross-seed"));
57
+ program.version(packageDotJson.version, "-V, --version", "output the current version");
58
+ program
61
59
  .command("gen-config")
62
60
  .description("Generate a config file")
63
61
  .option("-d, --docker", "Generate the docker config instead of the normal one")
64
62
  .action((options) => {
65
- configuration_1.generateConfig(options);
63
+ generateConfig(options);
66
64
  });
67
- commander_1.program
65
+ program
68
66
  .command("clear-cache")
69
67
  .description("Clear the cache of downloaded-and-rejected torrents")
70
- .action(db_1.dropDatabase);
68
+ .action(dropDatabase);
71
69
  createCommandWithSharedOptions("daemon", "Start the cross-seed daemon").action(async (options) => {
72
70
  try {
73
71
  const runtimeConfig = processOptions(options);
74
- runtimeConfig_1.setRuntimeConfig(runtimeConfig);
75
- logger_1.initializeLogger();
76
- pushNotifier_1.initializePushNotifier();
77
- logger_1.logger.verbose({
78
- label: logger_1.Label.CONFIGDUMP,
79
- message: util_1.inspect(runtimeConfig),
72
+ setRuntimeConfig(runtimeConfig);
73
+ initializeLogger();
74
+ initializePushNotifier();
75
+ logger.verbose({
76
+ label: Label.CONFIGDUMP,
77
+ message: inspect(runtimeConfig),
80
78
  });
81
79
  if (process.env.DOCKER_ENV === "true") {
82
- configuration_1.generateConfig({ docker: true });
80
+ generateConfig({ docker: true });
83
81
  }
84
- await startup_1.doStartupValidation();
85
- await server_1.serve();
82
+ await doStartupValidation();
83
+ await serve();
86
84
  }
87
85
  catch (e) {
88
- if (e instanceof errors_1.CrossSeedError) {
86
+ if (e instanceof CrossSeedError) {
89
87
  e.print();
90
88
  process.exitCode = 1;
91
89
  return;
@@ -93,16 +91,16 @@ async function run() {
93
91
  throw e;
94
92
  }
95
93
  });
96
- commander_1.program
94
+ program
97
95
  .command("test-notification")
98
96
  .description("Send a test notification")
99
97
  .requiredOption("--notification-webhook-url <url>", "cross-seed will send POST requests to this url with a JSON payload of { title, body }", fileConfig.notificationWebhookUrl)
100
98
  .action((options) => {
101
99
  const runtimeConfig = processOptions(options);
102
- runtimeConfig_1.setRuntimeConfig(runtimeConfig);
103
- logger_1.initializeLogger();
104
- pushNotifier_1.initializePushNotifier();
105
- pushNotifier_1.sendTestNotification();
100
+ setRuntimeConfig(runtimeConfig);
101
+ initializeLogger();
102
+ initializePushNotifier();
103
+ sendTestNotification();
106
104
  });
107
105
  createCommandWithSharedOptions("search", "Search for cross-seeds")
108
106
  .requiredOption("-o, --offset <offset>", "Offset to start from", (n) => parseInt(n), 0)
@@ -111,18 +109,18 @@ async function run() {
111
109
  .action(async (options) => {
112
110
  try {
113
111
  const runtimeConfig = processOptions(options);
114
- runtimeConfig_1.setRuntimeConfig(runtimeConfig);
115
- logger_1.initializeLogger();
116
- pushNotifier_1.initializePushNotifier();
117
- logger_1.logger.verbose({
118
- label: logger_1.Label.CONFIGDUMP,
119
- message: util_1.inspect(runtimeConfig),
112
+ setRuntimeConfig(runtimeConfig);
113
+ initializeLogger();
114
+ initializePushNotifier();
115
+ logger.verbose({
116
+ label: Label.CONFIGDUMP,
117
+ message: inspect(runtimeConfig),
120
118
  });
121
- await startup_1.doStartupValidation();
122
- await pipeline_1.main();
119
+ await doStartupValidation();
120
+ await main();
123
121
  }
124
122
  catch (e) {
125
- if (e instanceof errors_1.CrossSeedError) {
123
+ if (e instanceof CrossSeedError) {
126
124
  e.print();
127
125
  process.exitCode = 1;
128
126
  return;
@@ -130,7 +128,7 @@ async function run() {
130
128
  throw e;
131
129
  }
132
130
  });
133
- await commander_1.program.parseAsync();
131
+ await program.parseAsync();
134
132
  }
135
133
  run();
136
134
  //# sourceMappingURL=cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd.js","sourceRoot":"","sources":["../src/cmd.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  // If you find yourself always using the same command-line flag, you can set
2
2
  // it here as a default.
3
3
  module.exports = {
4
- configVersion: 1,
5
4
  jackettServerUrl: "http://localhost:9117/jackett",
6
5
  jackettApiKey: "YOUR_JACKETT_API_KEY_HERE",
7
6
  // Pause at least this much in between each Jackett search. Higher is safer.
@@ -45,4 +44,4 @@ module.exports = {
45
44
  // Conforms to the caronc/apprise REST API.
46
45
  notificationWebhookUrl: undefined,
47
46
  };
48
- //# sourceMappingURL=config.template.js.map
47
+ //# sourceMappingURL=config.template.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.template.cjs","sourceRoot":"","sources":["../src/config.template.cjs"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,wBAAwB;AAExB,MAAM,CAAC,OAAO,GAAG;IAChB,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,5 +1,3 @@
1
- // All of the configuration can be overridden with command-line flags,
2
- // and some are more useful as flags than permanent config (offset).
3
1
  // If you find yourself always using the same command-line flag, you can set
4
2
  // it here as a default.
5
3
  module.exports = {
@@ -50,4 +48,4 @@ module.exports = {
50
48
  // Conforms to the caronc/apprise REST API.
51
49
  notificationWebhookUrl: undefined,
52
50
  };
53
- //# sourceMappingURL=config.template.docker.js.map
51
+ //# sourceMappingURL=config.template.docker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.template.docker.cjs","sourceRoot":"","sources":["../src/config.template.docker.cjs"],"names":[],"mappings":"AAAA,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"}