cross-seed 6.0.0-2 → 6.0.0-20

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 (60) hide show
  1. package/dist/Result.js +17 -11
  2. package/dist/Result.js.map +1 -1
  3. package/dist/action.js +141 -45
  4. package/dist/action.js.map +1 -1
  5. package/dist/arr.js +200 -0
  6. package/dist/arr.js.map +1 -0
  7. package/dist/clients/Deluge.js +121 -61
  8. package/dist/clients/Deluge.js.map +1 -1
  9. package/dist/clients/QBittorrent.js +70 -64
  10. package/dist/clients/QBittorrent.js.map +1 -1
  11. package/dist/clients/RTorrent.js +9 -9
  12. package/dist/clients/RTorrent.js.map +1 -1
  13. package/dist/clients/TorrentClient.js.map +1 -1
  14. package/dist/clients/Transmission.js +9 -9
  15. package/dist/clients/Transmission.js.map +1 -1
  16. package/dist/cmd.js +11 -7
  17. package/dist/cmd.js.map +1 -1
  18. package/dist/config.template.cjs +68 -36
  19. package/dist/config.template.cjs.map +1 -1
  20. package/dist/configSchema.js +42 -8
  21. package/dist/configSchema.js.map +1 -1
  22. package/dist/configuration.js.map +1 -1
  23. package/dist/constants.js +89 -6
  24. package/dist/constants.js.map +1 -1
  25. package/dist/dataFiles.js +4 -5
  26. package/dist/dataFiles.js.map +1 -1
  27. package/dist/decide.js +128 -90
  28. package/dist/decide.js.map +1 -1
  29. package/dist/errors.js +5 -2
  30. package/dist/errors.js.map +1 -1
  31. package/dist/indexers.js +31 -4
  32. package/dist/indexers.js.map +1 -1
  33. package/dist/jobs.js +2 -0
  34. package/dist/jobs.js.map +1 -1
  35. package/dist/logger.js +18 -5
  36. package/dist/logger.js.map +1 -1
  37. package/dist/migrations/05-caps.js +16 -0
  38. package/dist/migrations/05-caps.js.map +1 -0
  39. package/dist/migrations/migrations.js +9 -1
  40. package/dist/migrations/migrations.js.map +1 -1
  41. package/dist/pipeline.js +165 -81
  42. package/dist/pipeline.js.map +1 -1
  43. package/dist/preFilter.js +89 -36
  44. package/dist/preFilter.js.map +1 -1
  45. package/dist/pushNotifier.js +2 -1
  46. package/dist/pushNotifier.js.map +1 -1
  47. package/dist/runtimeConfig.js.map +1 -1
  48. package/dist/searchee.js +149 -10
  49. package/dist/searchee.js.map +1 -1
  50. package/dist/server.js +10 -10
  51. package/dist/server.js.map +1 -1
  52. package/dist/startup.js +2 -0
  53. package/dist/startup.js.map +1 -1
  54. package/dist/torrent.js +86 -28
  55. package/dist/torrent.js.map +1 -1
  56. package/dist/torznab.js +250 -88
  57. package/dist/torznab.js.map +1 -1
  58. package/dist/utils.js +84 -21
  59. package/dist/utils.js.map +1 -1
  60. package/package.json +3 -1
@@ -1,10 +1,10 @@
1
+ import ms from "ms";
1
2
  import { InjectionResult, TORRENT_TAG, TORRENT_CATEGORY_SUFFIX, } from "../constants.js";
2
3
  import { CrossSeedError } from "../errors.js";
3
4
  import { Label, logger } from "../logger.js";
4
5
  import { getRuntimeConfig } from "../runtimeConfig.js";
5
6
  import { shouldRecheck, extractCredentialsFromUrl, wait } from "../utils.js";
6
7
  import { resultOf, resultOfErr } from "../Result.js";
7
- import ms from "ms";
8
8
  var DelugeErrorCode;
9
9
  (function (DelugeErrorCode) {
10
10
  DelugeErrorCode[DelugeErrorCode["NO_AUTH"] = 1] = "NO_AUTH";
@@ -36,20 +36,20 @@ export default class Deluge {
36
36
  throw new CrossSeedError("You need to define a password in the delugeRpcUrl. (e.g. http://:<PASSWORD>@localhost:8112)");
37
37
  }
38
38
  try {
39
- const authResponse = await this.call("auth.login", [password], 0);
40
- if (!authResponse.result) {
39
+ const authResponse = (await this.call("auth.login", [password], 0)).unwrapOrThrow(new Error("failed to connect for authentication"));
40
+ if (!authResponse) {
41
41
  throw new CrossSeedError(`Reached Deluge, but failed to authenticate: ${href}`);
42
42
  }
43
43
  }
44
44
  catch (networkError) {
45
45
  throw new CrossSeedError(networkError);
46
46
  }
47
- const connectedResponse = await this.call("web.connected", [], 0);
48
- if (!connectedResponse.result) {
47
+ const isConnectedResponse = await this.call("web.connected", [], 0);
48
+ if (isConnectedResponse.isOk() && !isConnectedResponse.unwrap()) {
49
49
  logger.warn("Deluge WebUI disconnected from daemon...attempting to reconnect.");
50
- const webuiHostList = await this.call("web.get_hosts", [], 0);
51
- const connectResponse = await this.call("web.connect", [webuiHostList.result[0][0]], 0);
52
- if (!connectResponse.error) {
50
+ const webuiHostList = (await this.call("web.get_hosts", [], 0)).unwrapOrThrow(new Error("failed to get host-list for reconnect"));
51
+ const connectResponse = await this.call("web.connect", [webuiHostList[0][0]], 0);
52
+ if (connectResponse.isOk() && connectResponse.unwrap()) {
53
53
  logger.info("Deluge WebUI connected to the daemon.");
54
54
  }
55
55
  else {
@@ -59,10 +59,14 @@ export default class Deluge {
59
59
  }
60
60
  /**
61
61
  * ensures authentication and sends JSON-RPC calls to deluge
62
+ * @param method RPC method to send (usually prefaced with module name)
63
+ * @param params parameters for the method (usually in an array)
64
+ * @param retries specify a retry count (optional)
65
+ * @return a promised Result of the specified ResultType or an ErrorType
62
66
  */
63
67
  async call(method, params, retries = 1) {
64
68
  const { delugeRpcUrl } = getRuntimeConfig();
65
- const { href } = extractCredentialsFromUrl(delugeRpcUrl).unwrapOrThrow();
69
+ const { href } = extractCredentialsFromUrl(delugeRpcUrl).unwrapOrThrow(new CrossSeedError("delugeRpcUrl must be percent-encoded"));
66
70
  const headers = new Headers({ "Content-Type": "application/json" });
67
71
  if (this.delugeCookie)
68
72
  headers.set("Cookie", this.delugeCookie);
@@ -106,10 +110,14 @@ export default class Deluge {
106
110
  }
107
111
  }
108
112
  this.handleResponseHeaders(response.headers);
109
- return json;
113
+ if (json.error) {
114
+ return resultOfErr(json.error);
115
+ }
116
+ return resultOf(json.result);
110
117
  }
111
118
  /**
112
119
  * parses the set-cookie header and updates stored value
120
+ * @param headers the headers from a request
113
121
  */
114
122
  handleResponseHeaders(headers) {
115
123
  if (headers.has("Set-Cookie")) {
@@ -118,15 +126,23 @@ export default class Deluge {
118
126
  }
119
127
  /**
120
128
  * checks enabled plugins for "Label"
121
- * returns true if successful.
129
+ * @return boolean declaring whether the "Label" plugin is enabled
122
130
  */
123
131
  async labelEnabled() {
124
132
  const enabledPlugins = await this.call("core.get_enabled_plugins", []);
125
- return enabledPlugins.error
126
- ? false
127
- : enabledPlugins.result.includes("Label");
133
+ if (enabledPlugins.isOk()) {
134
+ return enabledPlugins.unwrap().includes("Label");
135
+ }
136
+ else {
137
+ return false;
138
+ }
128
139
  }
129
- // generates the label (string) for injection based on searchee and torrentInfo
140
+ /**
141
+ * generates the label for injection based on searchee and torrentInfo
142
+ * @param searchee Searchee that contains the originating torrent
143
+ * @param torrentInfo TorrentInfo from the searchee
144
+ * @return string with the label for the newTorrent
145
+ */
130
146
  calculateLabel(searchee, torrentInfo) {
131
147
  const { linkCategory, duplicateCategories } = getRuntimeConfig();
132
148
  if (!searchee.infoHash || !torrentInfo.label) {
@@ -138,7 +154,7 @@ export default class Deluge {
138
154
  }
139
155
  const shouldSuffixLabel = !ogLabel.endsWith(this.delugeLabelSuffix) && // no .cross-seed
140
156
  ogLabel !== linkCategory; // not data
141
- return searchee.path
157
+ return !searchee.infoHash
142
158
  ? linkCategory
143
159
  : shouldSuffixLabel
144
160
  ? `${ogLabel}${this.delugeLabelSuffix}`
@@ -147,29 +163,52 @@ export default class Deluge {
147
163
  /**
148
164
  * if Label plugin is loaded, adds (if necessary)
149
165
  * and sets the label based on torrent hash.
166
+ * @param newTorrent the searchee of the newTorrent
167
+ * @param label the destination label for the newTorrent/searchee
150
168
  */
151
- async setLabel(name, infoHash, label) {
169
+ async setLabel(newTorrent, label) {
170
+ let setResult;
152
171
  if (!this.isLabelEnabled)
153
172
  return;
154
173
  try {
155
- const setResult = await this.call("label.set_torrent", [
156
- infoHash,
157
- label,
158
- ]);
159
- if (setResult.error?.code === DelugeErrorCode.RPC_FAIL) {
174
+ const getCurrentLabels = await this.call("label.get_labels", []);
175
+ if (getCurrentLabels.isErr()) {
176
+ this.isLabelEnabled = false;
177
+ throw new Error("Labels have been disabled.");
178
+ }
179
+ if (getCurrentLabels.unwrap().includes(label)) {
180
+ setResult = await this.call("label.set_torrent", [
181
+ newTorrent.infoHash,
182
+ label,
183
+ ]);
184
+ }
185
+ else {
160
186
  await this.call("label.add", [label]);
161
- await this.call("label.set_torrent", [infoHash, label]);
187
+ await wait(300);
188
+ setResult = await this.call("label.set_torrent", [
189
+ newTorrent.infoHash,
190
+ label,
191
+ ]);
192
+ }
193
+ if (setResult.isErr()) {
194
+ throw new Error(setResult.unwrapErr().message);
162
195
  }
163
196
  }
164
197
  catch (e) {
198
+ logger.debug(e);
165
199
  logger.warn({
166
200
  label: Label.DELUGE,
167
- message: `Failed to label ${name} (${infoHash}) as ${label}`,
201
+ message: `Failed to label ${newTorrent.name} (${newTorrent.infoHash}) as ${label}`,
168
202
  });
169
203
  }
170
204
  }
171
205
  /**
172
206
  * injects a torrent into deluge client
207
+ * @param newTorrent injected candidate torrent
208
+ * @param searchee originating torrent (searchee)
209
+ * @param decision decision by which the newTorrent was matched
210
+ * @param path location of the linked files (optional)
211
+ * @return InjectionResult of the newTorrent's injection
173
212
  */
174
213
  async inject(newTorrent, searchee, decision, path) {
175
214
  try {
@@ -191,12 +230,29 @@ export default class Deluge {
191
230
  const encodedTorrentData = newTorrent.encode().toString("base64");
192
231
  const torrentPath = path ? path : torrentInfo.save_path;
193
232
  const params = this.formatData(torrentFileName, encodedTorrentData, torrentPath, decision);
194
- const addResult = await this.call("core.add_torrent_file", params);
195
- const addResponse = typeof addResult.error?.message === "string"
196
- ? addResult.error
197
- : addResult.result;
198
- if (typeof addResponse === "string") {
199
- await this.setLabel(newTorrent.name, newTorrent.infoHash, this.calculateLabel(searchee, torrentInfo));
233
+ const addResponse = await this.call("core.add_torrent_file", params);
234
+ if (addResponse.isErr()) {
235
+ const addResponseError = addResponse.unwrapErr();
236
+ if (addResponseError.message.includes("already")) {
237
+ return InjectionResult.ALREADY_EXISTS;
238
+ }
239
+ else if (addResponseError) {
240
+ logger.debug({
241
+ label: Label.DELUGE,
242
+ message: `Injection failed: ${addResponseError.message}`,
243
+ });
244
+ return InjectionResult.FAILURE;
245
+ }
246
+ else {
247
+ logger.debug({
248
+ label: Label.DELUGE,
249
+ message: `Unknown injection failure: ${newTorrent.name} (${newTorrent.infoHash})`,
250
+ });
251
+ return InjectionResult.FAILURE;
252
+ }
253
+ }
254
+ if (addResponse.isOk()) {
255
+ await this.setLabel(newTorrent, this.calculateLabel(searchee, torrentInfo));
200
256
  if (shouldRecheck(decision)) {
201
257
  // when paused, libtorrent doesnt start rechecking
202
258
  // leaves torrent ready to download - ~99%
@@ -205,24 +261,6 @@ export default class Deluge {
205
261
  [newTorrent.infoHash],
206
262
  ]);
207
263
  }
208
- return InjectionResult.SUCCESS;
209
- }
210
- else if (addResponse?.message.includes("already")) {
211
- return InjectionResult.ALREADY_EXISTS;
212
- }
213
- else if (addResponse) {
214
- logger.debug({
215
- label: Label.DELUGE,
216
- message: `Injection failed: ${addResponse}`,
217
- });
218
- return InjectionResult.FAILURE;
219
- }
220
- else {
221
- logger.debug({
222
- label: Label.DELUGE,
223
- message: `Unknown injection failure: ${newTorrent.name} (${newTorrent.infoHash})`,
224
- });
225
- return InjectionResult.FAILURE;
226
264
  }
227
265
  }
228
266
  catch (error) {
@@ -233,9 +271,14 @@ export default class Deluge {
233
271
  logger.debug(error);
234
272
  return InjectionResult.FAILURE;
235
273
  }
274
+ return InjectionResult.SUCCESS;
236
275
  }
237
276
  /**
238
277
  * formats the json for rpc calls to inject
278
+ * @param filename filename for the injecting torrent file
279
+ * @param filedump string with encoded torrent file
280
+ * @param path path to the torrent data
281
+ * @param decision decision by which the newTorrent was matched
239
282
  */
240
283
  formatData(filename, filedump, path, decision) {
241
284
  const toRecheck = shouldRecheck(decision);
@@ -251,32 +294,38 @@ export default class Deluge {
251
294
  }
252
295
  /**
253
296
  * returns directory of an infohash in deluge as a string
297
+ * @param searchee Searchee or Metafile for torrent to lookup in client
298
+ * @return Result containing either a string with path or reason it was not provided
254
299
  */
255
- async getDownloadDir(searchee) {
256
- let torrent, response;
257
- const params = [["save_path", "progress"], { hash: searchee.infoHash }];
300
+ async getDownloadDir(meta, options) {
301
+ let response;
302
+ const params = [["save_path", "progress"], { hash: meta.infoHash }];
258
303
  try {
259
304
  response = await this.call("web.update_ui", params);
260
305
  }
261
306
  catch (e) {
262
307
  return resultOfErr("UNKNOWN_ERROR");
263
308
  }
264
- if (response.result.torrents) {
265
- torrent = response.result.torrents?.[searchee.infoHash];
309
+ if (!response.isOk()) {
310
+ return resultOfErr("UNKNOWN_ERROR");
266
311
  }
267
- else {
312
+ const torrentResponse = response.unwrap().torrents;
313
+ if (!torrentResponse) {
268
314
  return resultOfErr("UNKNOWN_ERROR");
269
315
  }
270
- if (torrent === undefined) {
316
+ const torrent = torrentResponse[meta.infoHash];
317
+ if (!torrent) {
271
318
  return resultOfErr("NOT_FOUND");
272
319
  }
273
- else if (response.result.torrents?.[searchee.infoHash].progress !== 100) {
320
+ if (options.onlyCompleted && torrent.progress !== 100) {
274
321
  return resultOfErr("TORRENT_NOT_COMPLETE");
275
322
  }
276
323
  return resultOf(torrent.save_path);
277
324
  }
278
325
  /**
279
326
  * returns information needed to complete/validate injection
327
+ * @param searchee the Searchee for the torrent you are requesting TorrentInfo from
328
+ * @return Promise of TorrentInfo type
280
329
  */
281
330
  async getTorrentInfo(searchee) {
282
331
  if (!searchee.infoHash) {
@@ -285,12 +334,19 @@ export default class Deluge {
285
334
  let torrent;
286
335
  try {
287
336
  const params = [
288
- ["state", "progress", "save_path", "label"],
337
+ [
338
+ "name",
339
+ "state",
340
+ "progress",
341
+ "save_path",
342
+ "label",
343
+ "total_remaining",
344
+ ],
289
345
  { hash: searchee.infoHash },
290
346
  ];
291
- const response = await this.call("web.update_ui", params);
292
- if (response.result.torrents) {
293
- torrent = response.result.torrents?.[searchee.infoHash];
347
+ const response = (await this.call("web.update_ui", params)).unwrapOrThrow(new Error("failed to fetch the torrent list"));
348
+ if (response.torrents) {
349
+ torrent = response.torrents?.[searchee.infoHash];
294
350
  }
295
351
  else {
296
352
  throw new Error("Client returned unexpected response (object missing)");
@@ -298,7 +354,11 @@ export default class Deluge {
298
354
  if (torrent === undefined) {
299
355
  throw new Error(`Torrent not found in client (${searchee.infoHash})`);
300
356
  }
301
- const completedTorrent = torrent.state === "Seeding" || torrent.progress === 100;
357
+ const completedTorrent = (torrent.state === "Paused" &&
358
+ (torrent.progress === 100 || !torrent.total_remaining)) ||
359
+ torrent.state === "Seeding" ||
360
+ torrent.progress === 100 ||
361
+ !torrent.total_remaining;
302
362
  const torrentLabel = this.isLabelEnabled && torrent.label.length != 0
303
363
  ? torrent.label
304
364
  : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"Deluge.js","sourceRoot":"","sources":["../../src/clients/Deluge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Deluge.js","sourceRoot":"","sources":["../../src/clients/Deluge.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { dirname } from "path";
2
2
  import { InjectionResult, TORRENT_TAG, TORRENT_CATEGORY_SUFFIX, } from "../constants.js";
3
3
  import { CrossSeedError } from "../errors.js";
4
4
  import { Label, logger } from "../logger.js";
5
+ import ms from "ms";
5
6
  import { getRuntimeConfig } from "../runtimeConfig.js";
6
7
  import { shouldRecheck, extractCredentialsFromUrl, wait } from "../utils.js";
7
8
  import { resultOf, resultOfErr } from "../Result.js";
@@ -40,9 +41,12 @@ export default class QBittorrent {
40
41
  await this.createTag();
41
42
  }
42
43
  async request(path, body, headers = {}, retries = 3) {
44
+ const bodyStr = body instanceof FormData
45
+ ? JSON.stringify(Object.fromEntries(body))
46
+ : JSON.stringify(body);
43
47
  logger.verbose({
44
48
  label: Label.QBITTORRENT,
45
- message: `Making request (${retries}) to ${path} with body ${JSON.stringify(body)}`,
49
+ message: `Making request (${retries}) to ${path} with body ${bodyStr}`,
46
50
  });
47
51
  let response;
48
52
  try {
@@ -82,35 +86,32 @@ export default class QBittorrent {
82
86
  ? "Subfolder"
83
87
  : "Original";
84
88
  }
85
- getTagsForNewTorrent(searchee, searcheeInfo, category) {
86
- const { duplicateCategories } = getRuntimeConfig();
87
- /* get the original category if torrent based - cuz otherwise we
88
- * use 'category'. this addresses path being truthy but still being
89
- * torrent searchee
90
- */
91
- const categoryForTagging = searcheeInfo
92
- ? searcheeInfo.category
93
- : category;
94
- if (!categoryForTagging || categoryForTagging.length === 0) {
95
- return TORRENT_TAG;
89
+ getCategoryForNewTorrent(category) {
90
+ const { duplicateCategories, linkCategory } = getRuntimeConfig();
91
+ if (!duplicateCategories) {
92
+ return category;
96
93
  }
97
- if (category.endsWith(TORRENT_CATEGORY_SUFFIX)) {
98
- if (duplicateCategories) {
99
- return `${TORRENT_TAG},${categoryForTagging}`;
100
- }
101
- else {
102
- return TORRENT_TAG;
103
- }
94
+ if (!category.length || category === linkCategory) {
95
+ return category; // Use tags for category duplication if linking
104
96
  }
105
- if (searchee.path) {
106
- return TORRENT_TAG;
97
+ if (category.endsWith(TORRENT_CATEGORY_SUFFIX)) {
98
+ return category;
107
99
  }
108
- else if (duplicateCategories) {
109
- return `${TORRENT_TAG},${categoryForTagging}${TORRENT_CATEGORY_SUFFIX}`;
100
+ return `${category}${TORRENT_CATEGORY_SUFFIX}`;
101
+ }
102
+ getTagsForNewTorrent(searcheeInfo, path) {
103
+ const { duplicateCategories, linkCategory } = getRuntimeConfig();
104
+ if (!duplicateCategories || !searcheeInfo || !path) {
105
+ return TORRENT_TAG; // Require path to duplicate category using tags
110
106
  }
111
- else {
107
+ const searcheeCategory = searcheeInfo.category;
108
+ if (!searcheeCategory.length || searcheeCategory === linkCategory) {
112
109
  return TORRENT_TAG;
113
110
  }
111
+ if (searcheeCategory.endsWith(TORRENT_CATEGORY_SUFFIX)) {
112
+ return `${TORRENT_TAG},${searcheeCategory}`;
113
+ }
114
+ return `${TORRENT_TAG},${searcheeCategory}${TORRENT_CATEGORY_SUFFIX}`;
114
115
  }
115
116
  async createTag() {
116
117
  await this.request("/torrents/createTags", `tags=${TORRENT_TAG}`, X_WWW_FORM_URLENCODED);
@@ -125,16 +126,17 @@ export default class QBittorrent {
125
126
  @param searchee the Searchee we are generating off (in client)
126
127
  @return either a string containing the path or a error mesage
127
128
  */
128
- async getDownloadDir(searchee) {
129
+ async getDownloadDir(meta, options) {
129
130
  try {
130
- const torrentInfo = await this.getTorrentInfo(searchee.infoHash);
131
+ const torrentInfo = await this.getTorrentInfo(meta.infoHash);
131
132
  if (!torrentInfo) {
132
133
  return resultOfErr("NOT_FOUND");
133
134
  }
134
- if (!this.isTorrentComplete(torrentInfo)) {
135
+ if (options.onlyCompleted &&
136
+ !this.isTorrentInfoComplete(torrentInfo)) {
135
137
  return resultOfErr("TORRENT_NOT_COMPLETE");
136
138
  }
137
- const savePath = this.getCorrectSavePath(searchee, torrentInfo);
139
+ const savePath = this.getCorrectSavePath(meta, torrentInfo);
138
140
  return resultOf(savePath);
139
141
  }
140
142
  catch (e) {
@@ -157,7 +159,7 @@ export default class QBittorrent {
157
159
  return torrentInfo.save_path;
158
160
  }
159
161
  /*
160
- @return array of query results
162
+ @return array of all torrents in the client
161
163
  */
162
164
  async getAllTorrentInfo() {
163
165
  const responseText = await this.request("/torrents/info", "");
@@ -167,29 +169,32 @@ export default class QBittorrent {
167
169
  return JSON.parse(responseText);
168
170
  }
169
171
  /*
170
- @param hash the hash of the torrent or undefined for all torrents
171
- @return array of query results
172
+ @param hash the hash of the torrent
173
+ @return the torrent if it exists
172
174
  */
173
- async getTorrentInfo(hash) {
175
+ async getTorrentInfo(hash, retries = 0) {
174
176
  if (!hash)
175
177
  return undefined;
176
- const responseText = await this.request("/torrents/info", `hashes=${hash}`, X_WWW_FORM_URLENCODED);
177
- if (responseText) {
178
- const torrents = JSON.parse(responseText);
179
- if (torrents.length > 0) {
180
- return torrents[0];
178
+ for (let i = 0; i <= retries; i++) {
179
+ const responseText = await this.request("/torrents/info", `hashes=${hash}`, X_WWW_FORM_URLENCODED);
180
+ if (responseText) {
181
+ const torrents = JSON.parse(responseText);
182
+ if (torrents.length > 0) {
183
+ return torrents[0];
184
+ }
181
185
  }
186
+ const torrents = await this.getAllTorrentInfo();
187
+ const torrentInfo = torrents.find((torrent) => hash === torrent.hash ||
188
+ hash === torrent.infohash_v1 ||
189
+ hash === torrent.infohash_v2);
190
+ if (torrentInfo) {
191
+ return torrentInfo;
192
+ }
193
+ await wait(ms("1 second") * 2 ** i);
182
194
  }
183
- logger.verbose({
184
- label: Label.QBITTORRENT,
185
- message: `Failed to retrieve torrent info using infohash_v1 ${hash}, checking all hashes`,
186
- });
187
- const torrents = await this.getAllTorrentInfo();
188
- return torrents.find((torrent) => hash === torrent.hash ||
189
- hash === torrent.infohash_v1 ||
190
- hash === torrent.infohash_v2);
195
+ return undefined;
191
196
  }
192
- isTorrentComplete(torrentInfo) {
197
+ isTorrentInfoComplete(torrentInfo) {
193
198
  return [
194
199
  "uploading",
195
200
  "pausedUP",
@@ -208,22 +213,23 @@ export default class QBittorrent {
208
213
  return dirname(searcheeInfo.content_path) !== searcheeInfo.save_path;
209
214
  }
210
215
  async inject(newTorrent, searchee, decision, path) {
211
- const { flatLinking, linkCategory } = getRuntimeConfig();
216
+ const { linkCategory } = getRuntimeConfig();
212
217
  try {
213
218
  if (await this.getTorrentInfo(newTorrent.infoHash)) {
214
219
  return InjectionResult.ALREADY_EXISTS;
215
220
  }
216
221
  const searcheeInfo = await this.getTorrentInfo(searchee.infoHash);
217
- // This should be extremly rare as we just linked successfully
218
- if (searchee.infoHash && !searcheeInfo && path) {
219
- logger.warning({
220
- label: Label.QBITTORRENT,
221
- message: `Searchee torrent may have been deleted, tagging may not meet expectations: ${searchee.infoHash}`,
222
- });
223
- }
224
- // This is never possible, being made explicit here
225
- if (!searcheeInfo && !path) {
226
- throw new Error(`Searchee torrent may have been deleted: ${searchee.infoHash}`);
222
+ if (!searcheeInfo) {
223
+ if (!path) {
224
+ // This is never possible, being made explicit here
225
+ throw new Error(`Searchee torrent may have been deleted: ${searchee.name} [${searchee.infoHash}]`);
226
+ }
227
+ else if (searchee.infoHash) {
228
+ logger.warning({
229
+ label: Label.QBITTORRENT,
230
+ message: `Searchee torrent may have been deleted, tagging may not meet expectations: ${searchee.name} [${searchee.infoHash}]`,
231
+ });
232
+ }
227
233
  }
228
234
  const { savePath, isComplete, autoTMM, category } = path
229
235
  ? {
@@ -234,7 +240,7 @@ export default class QBittorrent {
234
240
  }
235
241
  : {
236
242
  savePath: searcheeInfo.save_path,
237
- isComplete: this.isTorrentComplete(searcheeInfo),
243
+ isComplete: this.isTorrentInfoComplete(searcheeInfo),
238
244
  autoTMM: searcheeInfo.auto_tmm,
239
245
  category: searcheeInfo.category,
240
246
  };
@@ -248,12 +254,13 @@ export default class QBittorrent {
248
254
  // ---------------------- Building form data ----------------------
249
255
  const formData = new FormData();
250
256
  formData.append("torrents", buffer, filename);
251
- if (path) {
257
+ if (!autoTMM) {
258
+ formData.append("downloadPath", savePath);
252
259
  formData.append("savepath", savePath);
253
260
  }
254
- formData.append("autoTMM", flatLinking && searchee.infoHash ? autoTMM.toString() : "false");
255
- formData.append("category", category);
256
- formData.append("tags", this.getTagsForNewTorrent(searchee, searcheeInfo, category));
261
+ formData.append("autoTMM", autoTMM.toString());
262
+ formData.append("category", this.getCategoryForNewTorrent(category));
263
+ formData.append("tags", this.getTagsForNewTorrent(searcheeInfo, path));
257
264
  formData.append("contentLayout", this.getLayoutForNewTorrent(searchee, searcheeInfo, path));
258
265
  formData.append("skip_checking", (!toRecheck).toString());
259
266
  formData.append("paused", toRecheck.toString());
@@ -261,8 +268,7 @@ export default class QBittorrent {
261
268
  // it concats the value and the sentinel
262
269
  formData.append("foo", "bar");
263
270
  await this.addTorrent(formData);
264
- await wait(1000);
265
- const newInfo = await this.getTorrentInfo(newTorrent.infoHash);
271
+ const newInfo = await this.getTorrentInfo(newTorrent.infoHash, 5);
266
272
  if (!newInfo) {
267
273
  throw new Error(`Failed to retrieve torrent after adding`);
268
274
  }