cross-seed 6.0.0-2 → 6.0.0-21
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.
- package/dist/Result.js +17 -11
- package/dist/Result.js.map +1 -1
- package/dist/action.js +141 -45
- package/dist/action.js.map +1 -1
- package/dist/arr.js +200 -0
- package/dist/arr.js.map +1 -0
- package/dist/clients/Deluge.js +121 -61
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +70 -64
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +9 -9
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +9 -9
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +11 -7
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +68 -36
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +42 -8
- package/dist/configSchema.js.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +89 -6
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +4 -5
- package/dist/dataFiles.js.map +1 -1
- package/dist/decide.js +139 -92
- package/dist/decide.js.map +1 -1
- package/dist/errors.js +5 -2
- package/dist/errors.js.map +1 -1
- package/dist/indexers.js +31 -4
- package/dist/indexers.js.map +1 -1
- package/dist/jobs.js +2 -0
- package/dist/jobs.js.map +1 -1
- package/dist/logger.js +18 -5
- package/dist/logger.js.map +1 -1
- package/dist/migrations/05-caps.js +16 -0
- package/dist/migrations/05-caps.js.map +1 -0
- package/dist/migrations/migrations.js +9 -1
- package/dist/migrations/migrations.js.map +1 -1
- package/dist/pipeline.js +166 -81
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +91 -37
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +4 -2
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/searchee.js +149 -10
- package/dist/searchee.js.map +1 -1
- package/dist/server.js +10 -10
- package/dist/server.js.map +1 -1
- package/dist/startup.js +2 -0
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +86 -28
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +250 -88
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +84 -21
- package/dist/utils.js.map +1 -1
- package/package.json +3 -1
package/dist/clients/Deluge.js
CHANGED
@@ -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
|
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
|
48
|
-
if (!
|
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
|
52
|
-
if (
|
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
|
-
|
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
|
-
*
|
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
|
-
|
126
|
-
|
127
|
-
|
133
|
+
if (enabledPlugins.isOk()) {
|
134
|
+
return enabledPlugins.unwrap().includes("Label");
|
135
|
+
}
|
136
|
+
else {
|
137
|
+
return false;
|
138
|
+
}
|
128
139
|
}
|
129
|
-
|
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.
|
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(
|
169
|
+
async setLabel(newTorrent, label) {
|
170
|
+
let setResult;
|
152
171
|
if (!this.isLabelEnabled)
|
153
172
|
return;
|
154
173
|
try {
|
155
|
-
const
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
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
|
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
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
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(
|
256
|
-
let
|
257
|
-
const params = [["save_path", "progress"], { hash:
|
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.
|
265
|
-
|
309
|
+
if (!response.isOk()) {
|
310
|
+
return resultOfErr("UNKNOWN_ERROR");
|
266
311
|
}
|
267
|
-
|
312
|
+
const torrentResponse = response.unwrap().torrents;
|
313
|
+
if (!torrentResponse) {
|
268
314
|
return resultOfErr("UNKNOWN_ERROR");
|
269
315
|
}
|
270
|
-
|
316
|
+
const torrent = torrentResponse[meta.infoHash];
|
317
|
+
if (!torrent) {
|
271
318
|
return resultOfErr("NOT_FOUND");
|
272
319
|
}
|
273
|
-
|
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
|
-
[
|
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.
|
293
|
-
torrent = response.
|
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 === "
|
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 ${
|
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
|
-
|
86
|
-
const { duplicateCategories } = getRuntimeConfig();
|
87
|
-
|
88
|
-
|
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.
|
98
|
-
if
|
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 (
|
106
|
-
return
|
97
|
+
if (category.endsWith(TORRENT_CATEGORY_SUFFIX)) {
|
98
|
+
return category;
|
107
99
|
}
|
108
|
-
|
109
|
-
|
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
|
-
|
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(
|
129
|
+
async getDownloadDir(meta, options) {
|
129
130
|
try {
|
130
|
-
const torrentInfo = await this.getTorrentInfo(
|
131
|
+
const torrentInfo = await this.getTorrentInfo(meta.infoHash);
|
131
132
|
if (!torrentInfo) {
|
132
133
|
return resultOfErr("NOT_FOUND");
|
133
134
|
}
|
134
|
-
if (
|
135
|
+
if (options.onlyCompleted &&
|
136
|
+
!this.isTorrentInfoComplete(torrentInfo)) {
|
135
137
|
return resultOfErr("TORRENT_NOT_COMPLETE");
|
136
138
|
}
|
137
|
-
const savePath = this.getCorrectSavePath(
|
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
|
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
|
171
|
-
@return
|
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
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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
|
-
|
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
|
-
|
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 {
|
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
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
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.
|
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 (
|
257
|
+
if (!autoTMM) {
|
258
|
+
formData.append("downloadPath", savePath);
|
252
259
|
formData.append("savepath", savePath);
|
253
260
|
}
|
254
|
-
formData.append("autoTMM",
|
255
|
-
formData.append("category", category);
|
256
|
-
formData.append("tags", this.getTagsForNewTorrent(
|
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
|
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
|
}
|