cross-seed 5.9.1 → 6.0.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.
- package/README.md +1 -1
- package/dist/Result.js +2 -0
- package/dist/Result.js.map +1 -1
- package/dist/action.js +117 -57
- package/dist/action.js.map +1 -1
- package/dist/auth.js +5 -5
- package/dist/auth.js.map +1 -1
- package/dist/clients/Deluge.js +68 -36
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +40 -30
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +61 -23
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +18 -8
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +76 -75
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +226 -142
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +184 -0
- package/dist/configSchema.js.map +1 -0
- package/dist/configuration.js +35 -9
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +27 -11
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +17 -8
- package/dist/dataFiles.js.map +1 -1
- package/dist/decide.js +100 -20
- package/dist/decide.js.map +1 -1
- package/dist/diff.js.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/indexers.js +3 -3
- package/dist/indexers.js.map +1 -1
- package/dist/jobs.js +15 -7
- package/dist/jobs.js.map +1 -1
- package/dist/logger.js +9 -9
- package/dist/logger.js.map +1 -1
- package/dist/migrations/00-initialSchema.js.map +1 -1
- package/dist/migrations/02-timestamps.js +3 -1
- package/dist/migrations/02-timestamps.js.map +1 -1
- package/dist/parseTorrent.js +11 -2
- package/dist/parseTorrent.js.map +1 -1
- package/dist/pipeline.js +34 -25
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +17 -6
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +29 -10
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/searchee.js +8 -1
- package/dist/searchee.js.map +1 -1
- package/dist/server.js.map +1 -1
- package/dist/startup.js +62 -23
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +14 -29
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +56 -32
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +32 -5
- package/dist/utils.js.map +1 -1
- package/package.json +23 -13
- package/dist/config.template.docker.cjs +0 -236
- package/dist/config.template.docker.cjs.map +0 -1
package/README.md
CHANGED
package/dist/Result.js
CHANGED
package/dist/Result.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Result.js","sourceRoot":"","sources":["../src/Result.ts"],"names":[],"mappings":"AASA,MAAM,QAAQ;
|
1
|
+
{"version":3,"file":"Result.js","sourceRoot":"","sources":["../src/Result.ts"],"names":[],"mappings":"AASA,MAAM,QAAQ;IACI,QAAQ,CAAI;IAE7B,YAAY,QAAW;QACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,IAAI;QACH,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK;QACJ,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAI,MAAmB;QAC3B,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAI,MAAmB;QAC5B,OAAO,IAA+B,CAAC;IACxC,CAAC;IAED,6DAA6D;IAC7D,aAAa,CAAC,UAAkB;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,gBAAgB;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACxD,CAAC;CACD;AAED,MAAM,SAAS;IACG,QAAQ,CAAI;IAE7B,YAAY,QAAW;QACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,IAAI;QACH,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK;QACJ,OAAO,IAAI,CAAC;IACb,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAI,MAAmB;QAC3B,OAAO,IAA+B,CAAC;IACxC,CAAC;IAED,MAAM,CAAI,MAAmB;QAC5B,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,aAAa,CAAC,UAAkB;QAC/B,MAAM,UAAU,IAAI,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACvE,CAAC;IAED,gBAAgB;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;CACD;AAED,MAAM,UAAU,QAAQ,CAAO,KAAQ;IACtC,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW,CAAO,KAAQ;IACzC,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/action.js
CHANGED
@@ -1,67 +1,125 @@
|
|
1
1
|
import chalk from "chalk";
|
2
2
|
import { existsSync, linkSync, mkdirSync, readdirSync, statSync, symlinkSync, } from "fs";
|
3
|
-
import {
|
3
|
+
import { basename, dirname, join, relative, resolve } from "path";
|
4
4
|
import { getClient } from "./clients/TorrentClient.js";
|
5
5
|
import { Action, Decision, InjectionResult, LinkType, SaveResult, } from "./constants.js";
|
6
6
|
import { logger } from "./logger.js";
|
7
|
+
import { resultOf, resultOfErr } from "./Result.js";
|
7
8
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
9
|
+
import { hasVideo } from "./searchee.js";
|
8
10
|
import { saveTorrentFile } from "./torrent.js";
|
9
11
|
import { getTag } from "./utils.js";
|
10
|
-
|
11
|
-
|
12
|
-
const
|
13
|
-
|
14
|
-
|
12
|
+
function logInjectionResult(result, tracker, name, decision) {
|
13
|
+
const styledName = chalk.green.bold(name);
|
14
|
+
const styledTracker = chalk.bold(tracker);
|
15
|
+
switch (result) {
|
16
|
+
case InjectionResult.SUCCESS:
|
17
|
+
logger.info(`Found ${styledName} on ${styledTracker} by ${decision} - injected`);
|
18
|
+
break;
|
19
|
+
case InjectionResult.ALREADY_EXISTS:
|
20
|
+
logger.info(`Found ${styledName} on ${styledTracker} by ${decision} - exists`);
|
21
|
+
break;
|
22
|
+
case InjectionResult.TORRENT_NOT_COMPLETE:
|
23
|
+
logger.warn(`Found ${styledName} on ${styledTracker} by ${decision} - skipping incomplete torrent`);
|
24
|
+
break;
|
25
|
+
case InjectionResult.FAILURE:
|
26
|
+
default:
|
27
|
+
logger.error(`Found ${styledName} on ${styledTracker} by ${decision} - failed to inject, saving instead`);
|
28
|
+
break;
|
15
29
|
}
|
16
30
|
}
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
31
|
+
/**
|
32
|
+
* this may not work with subfolder content layout
|
33
|
+
* @return the root of linked file. most likely "destinationDir/name". Not necessarily a file, it can be a directory
|
34
|
+
*/
|
35
|
+
function fuzzyLinkOneFile(searchee, newMeta, destinationDir, sourceRoot) {
|
36
|
+
const srcFilePath = join(sourceRoot, relative(searchee.name, searchee.files[0].path));
|
37
|
+
const destFilePath = join(destinationDir, newMeta.files[0].path);
|
38
|
+
mkdirSync(dirname(destFilePath), { recursive: true });
|
39
|
+
linkFile(srcFilePath, destFilePath);
|
40
|
+
return join(destinationDir, newMeta.name);
|
41
|
+
}
|
42
|
+
function fuzzyLinkPartial(searchee, newMeta, destinationDir, sourceRoot) {
|
43
|
+
for (const newFile of newMeta.files) {
|
44
|
+
let matchedSearcheeFiles = searchee.files.filter((searcheeFile) => searcheeFile.length === newFile.length);
|
45
|
+
if (matchedSearcheeFiles.length > 1) {
|
46
|
+
matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === newFile.name);
|
22
47
|
}
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
mkdirSync(join(linkDir, candidateParentDir), {
|
31
|
-
recursive: true,
|
32
|
-
});
|
33
|
-
correctedlinkDir = join(linkDir, candidateParentDir);
|
34
|
-
}
|
35
|
-
linkFile(searchee.path, join(correctedlinkDir, newMeta.files[0].name));
|
48
|
+
if (matchedSearcheeFiles.length) {
|
49
|
+
const srcFilePath = statSync(sourceRoot).isFile()
|
50
|
+
? sourceRoot
|
51
|
+
: join(dirname(sourceRoot), matchedSearcheeFiles[0].path);
|
52
|
+
const destFilePath = join(destinationDir, newFile.path);
|
53
|
+
mkdirSync(dirname(destFilePath), { recursive: true });
|
54
|
+
linkFile(srcFilePath, destFilePath);
|
36
55
|
}
|
37
56
|
}
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
break;
|
52
|
-
case InjectionResult.FAILURE:
|
53
|
-
default:
|
54
|
-
logger.error(`Found ${styledName} on ${styledTracker} - failed to inject, saving instead`);
|
55
|
-
saveTorrentFile(tracker, getTag(searchee.name), newMeta);
|
56
|
-
break;
|
57
|
+
return join(destinationDir, newMeta.name);
|
58
|
+
}
|
59
|
+
async function linkAllFilesInMetafile(searchee, newMeta, tracker, decision) {
|
60
|
+
const { linkDir, legacyLinking } = getRuntimeConfig();
|
61
|
+
const fullLinkDir = legacyLinking ? linkDir : join(linkDir, tracker);
|
62
|
+
let sourceRoot;
|
63
|
+
if (searchee.path) {
|
64
|
+
sourceRoot = searchee.path;
|
65
|
+
}
|
66
|
+
else {
|
67
|
+
const downloadDirResult = await getClient().getDownloadDir(searchee);
|
68
|
+
if (downloadDirResult.isErr()) {
|
69
|
+
return downloadDirResult.mapErr((e) => e === "NOT_FOUND" ? "TORRENT_NOT_FOUND" : e);
|
57
70
|
}
|
58
|
-
|
71
|
+
sourceRoot = join(downloadDirResult.unwrapOrThrow(), searchee.name);
|
72
|
+
}
|
73
|
+
if (!existsSync(sourceRoot)) {
|
74
|
+
logger.error(`Linking failed, ${sourceRoot} not found. Make sure Docker volume mounts are set up properly.`);
|
75
|
+
return resultOfErr("MISSING_DATA");
|
76
|
+
}
|
77
|
+
if (decision === Decision.MATCH) {
|
78
|
+
return resultOf(linkExactTree(sourceRoot, fullLinkDir));
|
79
|
+
}
|
80
|
+
else if (decision === Decision.MATCH_SIZE_ONLY) {
|
81
|
+
return resultOf(fuzzyLinkOneFile(searchee, newMeta, fullLinkDir, sourceRoot));
|
59
82
|
}
|
60
83
|
else {
|
61
|
-
|
62
|
-
|
84
|
+
return resultOf(fuzzyLinkPartial(searchee, newMeta, fullLinkDir, sourceRoot));
|
85
|
+
}
|
86
|
+
}
|
87
|
+
export async function performAction(newMeta, decision, searchee, tracker) {
|
88
|
+
const { action, linkDir } = getRuntimeConfig();
|
89
|
+
const isVideo = hasVideo(searchee);
|
90
|
+
if (action === Action.SAVE) {
|
91
|
+
await saveTorrentFile(tracker, getTag(searchee.name, isVideo), newMeta);
|
92
|
+
const styledName = chalk.green.bold(newMeta.name);
|
93
|
+
const styledTracker = chalk.bold(tracker);
|
94
|
+
logger.info(`Found ${styledName} on ${styledTracker} by ${decision} - saved`);
|
63
95
|
return SaveResult.SAVED;
|
64
96
|
}
|
97
|
+
let destinationDir;
|
98
|
+
if (linkDir) {
|
99
|
+
const linkedFilesRootResult = await linkAllFilesInMetafile(searchee, newMeta, tracker, decision);
|
100
|
+
if (linkedFilesRootResult.isOk()) {
|
101
|
+
destinationDir = dirname(linkedFilesRootResult.unwrapOrThrow());
|
102
|
+
}
|
103
|
+
else if (decision === Decision.MATCH &&
|
104
|
+
linkedFilesRootResult.unwrapErrOrThrow() === "MISSING_DATA") {
|
105
|
+
logger.warn("Falling back to non-linking.");
|
106
|
+
}
|
107
|
+
else {
|
108
|
+
logInjectionResult(InjectionResult.FAILURE, tracker, newMeta.name, decision);
|
109
|
+
await saveTorrentFile(tracker, getTag(searchee.name, isVideo), newMeta);
|
110
|
+
return InjectionResult.FAILURE;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
else if (searchee.path) {
|
114
|
+
// should be a MATCH, as risky requires a linkDir to be set
|
115
|
+
destinationDir = dirname(searchee.path);
|
116
|
+
}
|
117
|
+
const result = await getClient().inject(newMeta, searchee, decision, destinationDir);
|
118
|
+
logInjectionResult(result, tracker, newMeta.name, decision);
|
119
|
+
if (result === InjectionResult.FAILURE) {
|
120
|
+
await saveTorrentFile(tracker, getTag(searchee.name, isVideo), newMeta);
|
121
|
+
}
|
122
|
+
return result;
|
65
123
|
}
|
66
124
|
export async function performActions(searchee, matches) {
|
67
125
|
const results = [];
|
@@ -73,20 +131,22 @@ export async function performActions(searchee, matches) {
|
|
73
131
|
}
|
74
132
|
return results;
|
75
133
|
}
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
134
|
+
/**
|
135
|
+
* @return the root of linked files.
|
136
|
+
*/
|
137
|
+
function linkExactTree(oldPath, dest) {
|
138
|
+
const newPath = join(dest, basename(oldPath));
|
80
139
|
if (statSync(oldPath).isFile()) {
|
81
|
-
|
82
|
-
|
140
|
+
mkdirSync(dirname(newPath), { recursive: true });
|
141
|
+
linkFile(oldPath, newPath);
|
142
|
+
}
|
143
|
+
else {
|
144
|
+
mkdirSync(newPath, { recursive: true });
|
145
|
+
for (const dirent of readdirSync(oldPath)) {
|
146
|
+
linkExactTree(join(oldPath, dirent), newPath);
|
83
147
|
}
|
84
|
-
return;
|
85
148
|
}
|
86
|
-
|
87
|
-
readdirSync(oldPath).forEach((file) => {
|
88
|
-
linkExact(join(oldPath, file), join(newPath, basename(oldPath)));
|
89
|
-
});
|
149
|
+
return newPath;
|
90
150
|
}
|
91
151
|
function linkFile(oldPath, newPath) {
|
92
152
|
const { linkType } = getRuntimeConfig();
|
package/dist/action.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACN,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,WAAW,GACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACN,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,WAAW,GACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EACN,MAAM,EAEN,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,UAAU,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAU,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAY,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,SAAS,kBAAkB,CAC1B,MAAuB,EACvB,OAAe,EACf,IAAY,EACZ,QAAkB;IAElB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,eAAe,CAAC,OAAO;YAC3B,MAAM,CAAC,IAAI,CACV,SAAS,UAAU,OAAO,aAAa,OAAO,QAAQ,aAAa,CACnE,CAAC;YACF,MAAM;QACP,KAAK,eAAe,CAAC,cAAc;YAClC,MAAM,CAAC,IAAI,CACV,SAAS,UAAU,OAAO,aAAa,OAAO,QAAQ,WAAW,CACjE,CAAC;YACF,MAAM;QACP,KAAK,eAAe,CAAC,oBAAoB;YACxC,MAAM,CAAC,IAAI,CACV,SAAS,UAAU,OAAO,aAAa,OAAO,QAAQ,gCAAgC,CACtF,CAAC;YACF,MAAM;QACP,KAAK,eAAe,CAAC,OAAO,CAAC;QAC7B;YACC,MAAM,CAAC,KAAK,CACX,SAAS,UAAU,OAAO,aAAa,OAAO,QAAQ,qCAAqC,CAC3F,CAAC;YACF,MAAM;IACR,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CACxB,QAAkB,EAClB,OAAiB,EACjB,cAAsB,EACtB,UAAkB;IAElB,MAAM,WAAW,GAAG,IAAI,CACvB,UAAU,EACV,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC/C,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjE,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,gBAAgB,CACxB,QAAkB,EAClB,OAAiB,EACjB,cAAsB,EACtB,UAAkB;IAElB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,oBAAoB,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAC/C,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CACxD,CAAC;QACF,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,oBAAoB,GAAG,oBAAoB,CAAC,MAAM,CACjD,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CACpD,CAAC;QACH,CAAC;QACD,IAAI,oBAAoB,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;gBAChD,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACxD,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,sBAAsB,CACpC,QAAkB,EAClB,OAAiB,EACjB,OAAe,EACf,QAGyB;IAUzB,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACtD,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,UAAkB,CAAC;IACvB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;SAAM,CAAC;QACP,MAAM,iBAAiB,GAAG,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/B,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAC3C,CAAC;QACH,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CACX,mBAAmB,UAAU,iEAAiE,CAC9F,CAAC;QACF,OAAO,WAAW,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,CAAC,eAAe,EAAE,CAAC;QAClD,OAAO,QAAQ,CACd,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAC5D,CAAC;IACH,CAAC;SAAM,CAAC;QACP,OAAO,QAAQ,CACd,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAC5D,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,OAAiB,EACjB,QAGyB,EACzB,QAAkB,EAClB,OAAe;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CACV,SAAS,UAAU,OAAO,aAAa,OAAO,QAAQ,UAAU,CAChE,CAAC;QACF,OAAO,UAAU,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,IAAI,cAAkC,CAAC;IAEvC,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,qBAAqB,GAAG,MAAM,sBAAsB,CACzD,QAAQ,EACR,OAAO,EACP,OAAO,EACP,QAAQ,CACR,CAAC;QACF,IAAI,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,cAAc,GAAG,OAAO,CAAC,qBAAqB,CAAC,aAAa,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,IACN,QAAQ,KAAK,QAAQ,CAAC,KAAK;YAC3B,qBAAqB,CAAC,gBAAgB,EAAE,KAAK,cAAc,EAC1D,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,kBAAkB,CACjB,eAAe,CAAC,OAAO,EACvB,OAAO,EACP,OAAO,CAAC,IAAI,EACZ,QAAQ,CACR,CAAC;YACF,MAAM,eAAe,CACpB,OAAO,EACP,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAC9B,OAAO,CACP,CAAC;YACF,OAAO,eAAe,CAAC,OAAO,CAAC;QAChC,CAAC;IACF,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1B,2DAA2D;QAC3D,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,MAAM,CACtC,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,cAAc,CACd,CAAC;IAEF,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,MAAM,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAQ,EAAE,OAAO;IACrD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,OAAO,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,aAAa,CACjC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,QAAQ,EACnB,QAAQ,EACR,OAAO,CACP,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,MAAM,KAAK,eAAe,CAAC,oBAAoB;YAAE,MAAM;IAC5D,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;GAEG;AAEH,SAAS,aAAa,CAAC,OAAe,EAAE,IAAY;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACP,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,OAAe;IACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACxC,IAAI,CAAC;QACJ,IAAI,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACP,2DAA2D;YAC3D,gDAAgD;YAChD,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAChC,MAAM,CAAC,CAAC;IACT,CAAC;AACF,CAAC"}
|
package/dist/auth.js
CHANGED
@@ -9,17 +9,17 @@ export async function resetApiKey() {
|
|
9
9
|
await db("settings").update({ apikey });
|
10
10
|
return apikey;
|
11
11
|
}
|
12
|
-
export async function
|
12
|
+
export async function getApiKey() {
|
13
|
+
const { apiKey: runtimeConfigApiKey } = getRuntimeConfig();
|
14
|
+
if (runtimeConfigApiKey)
|
15
|
+
return runtimeConfigApiKey;
|
13
16
|
const { apikey } = await db("settings").select("apikey").first();
|
14
17
|
if (!apikey)
|
15
18
|
return resetApiKey();
|
16
19
|
return apikey;
|
17
20
|
}
|
18
21
|
export async function checkApiKey(keyToCheck) {
|
19
|
-
const
|
20
|
-
if (!apiAuth)
|
21
|
-
return true;
|
22
|
-
const apikey = await getApiKeyFromDatabase();
|
22
|
+
const apikey = await getApiKey();
|
23
23
|
return apikey === keyToCheck;
|
24
24
|
}
|
25
25
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,SAAS,cAAc;IACtB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAChC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,SAAS,cAAc;IACtB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAChC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC9B,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC3D,IAAI,mBAAmB;QAAE,OAAO,mBAAmB,CAAC;IAEpD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;IACjE,IAAI,CAAC,MAAM;QAAE,OAAO,WAAW,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB;IACnD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,OAAO,MAAM,KAAK,UAAU,CAAC;AAC9B,CAAC"}
|
package/dist/clients/Deluge.js
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
import
|
1
|
+
import ms from "ms";
|
2
|
+
import { Decision, 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 { extractCredentialsFromUrl } from "../utils.js";
|
6
|
-
import
|
7
|
+
import { resultOf, resultOfErr } from "../Result.js";
|
7
8
|
var DelugeErrorCode;
|
8
9
|
(function (DelugeErrorCode) {
|
9
10
|
DelugeErrorCode[DelugeErrorCode["NO_AUTH"] = 1] = "NO_AUTH";
|
@@ -13,10 +14,10 @@ var DelugeErrorCode;
|
|
13
14
|
DelugeErrorCode[DelugeErrorCode["BAD_JSON"] = 5] = "BAD_JSON";
|
14
15
|
})(DelugeErrorCode || (DelugeErrorCode = {}));
|
15
16
|
export default class Deluge {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
delugeCookie = null;
|
18
|
+
delugeLabel = TORRENT_TAG;
|
19
|
+
delugeLabelSuffix = TORRENT_CATEGORY_SUFFIX;
|
20
|
+
isLabelEnabled;
|
20
21
|
/**
|
21
22
|
* validates the login and host for deluge webui
|
22
23
|
*/
|
@@ -66,6 +67,8 @@ export default class Deluge {
|
|
66
67
|
headers.set("Cookie", this.delugeCookie);
|
67
68
|
let response, json;
|
68
69
|
const id = Math.floor(Math.random() * 0x7fffffff);
|
70
|
+
const abortController = new AbortController();
|
71
|
+
setTimeout(() => void abortController.abort(), ms("10 seconds")).unref();
|
69
72
|
try {
|
70
73
|
response = await fetch(href, {
|
71
74
|
body: JSON.stringify({
|
@@ -75,16 +78,19 @@ export default class Deluge {
|
|
75
78
|
}),
|
76
79
|
method: "POST",
|
77
80
|
headers,
|
81
|
+
signal: abortController.signal,
|
78
82
|
});
|
79
83
|
}
|
80
84
|
catch (networkError) {
|
81
|
-
|
85
|
+
if (networkError.name === "AbortError") {
|
86
|
+
throw new Error(`Deluge method ${method} timed out after 10 seconds`);
|
87
|
+
}
|
82
88
|
throw new Error(`Failed to connect to Deluge at ${href}`, {
|
83
89
|
cause: networkError,
|
84
90
|
});
|
85
91
|
}
|
86
92
|
try {
|
87
|
-
json = await response.json();
|
93
|
+
json = (await response.json());
|
88
94
|
}
|
89
95
|
catch (jsonParseError) {
|
90
96
|
throw new Error(`Deluge method ${method} response was non-JSON ${jsonParseError}`);
|
@@ -124,8 +130,10 @@ export default class Deluge {
|
|
124
130
|
* if Label plugin is loaded, adds (if necessary)
|
125
131
|
* and sets the label based on torrent hash.
|
126
132
|
*/
|
127
|
-
async setLabel(infoHash, label) {
|
128
|
-
if (this.isLabelEnabled)
|
133
|
+
async setLabel(name, infoHash, label) {
|
134
|
+
if (!this.isLabelEnabled)
|
135
|
+
return;
|
136
|
+
try {
|
129
137
|
const setResult = await this.call("label.set_torrent", [
|
130
138
|
infoHash,
|
131
139
|
label,
|
@@ -135,14 +143,20 @@ export default class Deluge {
|
|
135
143
|
await this.call("label.set_torrent", [infoHash, label]);
|
136
144
|
}
|
137
145
|
}
|
146
|
+
catch (e) {
|
147
|
+
logger.warn({
|
148
|
+
label: Label.DELUGE,
|
149
|
+
message: `Failed to label ${name} (${infoHash}) as ${label}`,
|
150
|
+
});
|
151
|
+
}
|
138
152
|
}
|
139
153
|
/**
|
140
154
|
* injects a torrent into deluge client
|
141
155
|
*/
|
142
|
-
async inject(newTorrent, searchee, path) {
|
156
|
+
async inject(newTorrent, searchee, decision, path) {
|
143
157
|
try {
|
144
|
-
let torrentInfo;
|
145
158
|
const { duplicateCategories } = getRuntimeConfig();
|
159
|
+
let torrentInfo;
|
146
160
|
if (searchee.infoHash) {
|
147
161
|
torrentInfo = await this.getTorrentInfo(searchee);
|
148
162
|
if (!torrentInfo.complete) {
|
@@ -156,17 +170,17 @@ export default class Deluge {
|
|
156
170
|
});
|
157
171
|
return InjectionResult.FAILURE;
|
158
172
|
}
|
159
|
-
const params = this.formatData(`${newTorrent.getFileSystemSafeName()}.cross-seed.torrent`, newTorrent.encode().toString("base64"), path ? path : torrentInfo.save_path, !!searchee.infoHash);
|
173
|
+
const params = this.formatData(`${newTorrent.getFileSystemSafeName()}.cross-seed.torrent`, newTorrent.encode().toString("base64"), path ? path : torrentInfo.save_path, !!searchee.infoHash, decision);
|
160
174
|
const addResult = await this.call("core.add_torrent_file", params);
|
161
175
|
if (addResult.result) {
|
162
176
|
const { dataCategory } = getRuntimeConfig();
|
163
|
-
await this.setLabel(newTorrent.infoHash, searchee.path
|
177
|
+
await this.setLabel(newTorrent.name, newTorrent.infoHash, searchee.path
|
164
178
|
? dataCategory
|
165
179
|
: torrentInfo.label
|
166
180
|
? duplicateCategories
|
167
|
-
? torrentInfo.label.endsWith(
|
181
|
+
? torrentInfo.label.endsWith(this.delugeLabelSuffix) || torrentInfo.label === dataCategory
|
168
182
|
? torrentInfo.label
|
169
|
-
: `${torrentInfo.label}.
|
183
|
+
: `${torrentInfo.label}${this.delugeLabelSuffix}`
|
170
184
|
: torrentInfo.label
|
171
185
|
: this.delugeLabel);
|
172
186
|
return InjectionResult.SUCCESS;
|
@@ -189,38 +203,57 @@ export default class Deluge {
|
|
189
203
|
return InjectionResult.FAILURE;
|
190
204
|
}
|
191
205
|
}
|
192
|
-
catch (
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
}
|
200
|
-
else {
|
201
|
-
logger.error({
|
202
|
-
label: Label.DELUGE,
|
203
|
-
message: `Injection failed: ${injectResult}`,
|
204
|
-
});
|
205
|
-
logger.debug(injectResult);
|
206
|
-
return InjectionResult.FAILURE;
|
207
|
-
}
|
206
|
+
catch (error) {
|
207
|
+
logger.error({
|
208
|
+
label: Label.DELUGE,
|
209
|
+
message: `Injection failed: ${error}`,
|
210
|
+
});
|
211
|
+
logger.debug(error);
|
212
|
+
return InjectionResult.FAILURE;
|
208
213
|
}
|
209
214
|
}
|
210
215
|
/**
|
211
216
|
* formats the json for rpc calls to inject
|
212
217
|
*/
|
213
|
-
formatData(filename, filedump, path, isTorrent) {
|
218
|
+
formatData(filename, filedump, path, isTorrent, decision) {
|
219
|
+
const { skipRecheck } = getRuntimeConfig();
|
220
|
+
const skipRecheckTorrent = decision === Decision.MATCH_PARTIAL ? skipRecheck : true;
|
214
221
|
return [
|
215
222
|
filename,
|
216
223
|
filedump,
|
217
224
|
{
|
218
|
-
add_paused: isTorrent ?
|
219
|
-
seed_mode: isTorrent ?
|
225
|
+
add_paused: isTorrent ? !skipRecheckTorrent : !skipRecheck,
|
226
|
+
seed_mode: isTorrent ? skipRecheckTorrent : skipRecheck,
|
220
227
|
download_location: path,
|
221
228
|
},
|
222
229
|
];
|
223
230
|
}
|
231
|
+
/**
|
232
|
+
* returns directory of a infohash in deluge as a string
|
233
|
+
*/
|
234
|
+
async getDownloadDir(searchee) {
|
235
|
+
let torrent, response;
|
236
|
+
const params = [["save_path", "progress"], { hash: searchee.infoHash }];
|
237
|
+
try {
|
238
|
+
response = await this.call("web.update_ui", params);
|
239
|
+
}
|
240
|
+
catch (e) {
|
241
|
+
return resultOfErr("UNKNOWN_ERROR");
|
242
|
+
}
|
243
|
+
if (response.result.torrents) {
|
244
|
+
torrent = response.result.torrents?.[searchee.infoHash];
|
245
|
+
}
|
246
|
+
else {
|
247
|
+
return resultOfErr("UNKNOWN_ERROR");
|
248
|
+
}
|
249
|
+
if (torrent === undefined) {
|
250
|
+
return resultOfErr("NOT_FOUND");
|
251
|
+
}
|
252
|
+
else if (response.result.torrents?.[searchee.infoHash].progress !== 100) {
|
253
|
+
return resultOfErr("TORRENT_NOT_COMPLETE");
|
254
|
+
}
|
255
|
+
return resultOf(torrent.save_path);
|
256
|
+
}
|
224
257
|
/**
|
225
258
|
* returns information needed to complete/validate injection
|
226
259
|
*/
|
@@ -260,7 +293,6 @@ export default class Deluge {
|
|
260
293
|
message: `Failed to fetch torrent data: ${searchee.name} - (${searchee.infoHash})`,
|
261
294
|
});
|
262
295
|
logger.debug(e);
|
263
|
-
// @ts-expect-error needs es2022 target (tsconfig)
|
264
296
|
throw new Error("web.update_ui: failed to fetch data from client", {
|
265
297
|
cause: e,
|
266
298
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Deluge.js","sourceRoot":"","sources":["../../src/clients/Deluge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,
|
1
|
+
{"version":3,"file":"Deluge.js","sourceRoot":"","sources":["../../src/clients/Deluge.ts"],"names":[],"mappings":"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"}
|