cross-seed 6.0.0-4 → 6.0.0-40
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 +188 -74
- package/dist/action.js.map +1 -1
- package/dist/arr.js +197 -0
- package/dist/arr.js.map +1 -0
- package/dist/clients/Deluge.js +78 -55
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +98 -67
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +39 -12
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js +1 -1
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +31 -11
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +37 -23
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +88 -52
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +102 -14
- package/dist/configSchema.js.map +1 -1
- package/dist/configuration.js +4 -1
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +114 -6
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +4 -5
- package/dist/dataFiles.js.map +1 -1
- package/dist/db.js +2 -1
- package/dist/db.js.map +1 -1
- package/dist/decide.js +282 -167
- package/dist/decide.js.map +1 -1
- package/dist/diff.js +13 -3
- package/dist/diff.js.map +1 -1
- package/dist/errors.js +5 -2
- package/dist/errors.js.map +1 -1
- package/dist/indexers.js +96 -16
- package/dist/indexers.js.map +1 -1
- package/dist/inject.js +410 -0
- package/dist/inject.js.map +1 -0
- package/dist/jobs.js +9 -2
- package/dist/jobs.js.map +1 -1
- package/dist/logger.js +29 -9
- package/dist/logger.js.map +1 -1
- package/dist/migrations/00-initialSchema.js.map +1 -1
- package/dist/migrations/05-caps.js +16 -0
- package/dist/migrations/05-caps.js.map +1 -0
- package/dist/migrations/06-uniqueDecisions.js +29 -0
- package/dist/migrations/06-uniqueDecisions.js.map +1 -0
- package/dist/migrations/07-limits.js +12 -0
- package/dist/migrations/07-limits.js.map +1 -0
- package/dist/migrations/migrations.js +13 -1
- package/dist/migrations/migrations.js.map +1 -1
- package/dist/parseTorrent.js +6 -0
- package/dist/parseTorrent.js.map +1 -1
- package/dist/pipeline.js +225 -116
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +130 -52
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +7 -5
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/searchee.js +200 -19
- package/dist/searchee.js.map +1 -1
- package/dist/server.js +79 -32
- package/dist/server.js.map +1 -1
- package/dist/startup.js +17 -6
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +117 -51
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +374 -146
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +252 -33
- package/dist/utils.js.map +1 -1
- package/package.json +10 -5
package/dist/Result.js
CHANGED
@@ -12,16 +12,17 @@ class OkResult {
|
|
12
12
|
mapOk(mapper) {
|
13
13
|
return new OkResult(mapper(this.contents));
|
14
14
|
}
|
15
|
-
|
16
|
-
mapErr(mapper) {
|
15
|
+
mapErr() {
|
17
16
|
return this;
|
18
17
|
}
|
19
|
-
|
20
|
-
unwrapOrThrow(errToThrow) {
|
18
|
+
unwrap() {
|
21
19
|
return this.contents;
|
22
20
|
}
|
23
|
-
|
24
|
-
|
21
|
+
unwrapOrThrow() {
|
22
|
+
return this.contents;
|
23
|
+
}
|
24
|
+
orElse() {
|
25
|
+
return this.contents;
|
25
26
|
}
|
26
27
|
}
|
27
28
|
class ErrResult {
|
@@ -35,18 +36,20 @@ class ErrResult {
|
|
35
36
|
isErr() {
|
36
37
|
return true;
|
37
38
|
}
|
38
|
-
|
39
|
-
mapOk(mapper) {
|
39
|
+
mapOk() {
|
40
40
|
return this;
|
41
41
|
}
|
42
42
|
mapErr(mapper) {
|
43
43
|
return new ErrResult(mapper(this.contents));
|
44
44
|
}
|
45
|
+
unwrapErr() {
|
46
|
+
return this.contents;
|
47
|
+
}
|
45
48
|
unwrapOrThrow(errToThrow) {
|
46
|
-
throw errToThrow
|
49
|
+
throw errToThrow;
|
47
50
|
}
|
48
|
-
|
49
|
-
return
|
51
|
+
orElse(t) {
|
52
|
+
return t;
|
50
53
|
}
|
51
54
|
}
|
52
55
|
export function resultOf(value) {
|
@@ -55,4 +58,7 @@ export function resultOf(value) {
|
|
55
58
|
export function resultOfErr(value) {
|
56
59
|
return new ErrResult(value);
|
57
60
|
}
|
61
|
+
export function isOk(result) {
|
62
|
+
return result.isOk();
|
63
|
+
}
|
58
64
|
//# sourceMappingURL=Result.js.map
|
package/dist/Result.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Result.js","sourceRoot":"","sources":["../src/Result.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"Result.js","sourceRoot":"","sources":["../src/Result.ts"],"names":[],"mappings":"AAAA,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,MAAM;QACL,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,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,KAAK;QACJ,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,CAAI,MAAmB;QAC5B,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,UAAiB;QAC9B,MAAM,UAAU,CAAC;IAClB,CAAC;IAED,MAAM,CAAI,CAAI;QACb,OAAO,CAAC,CAAC;IACV,CAAC;CACD;AAID,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;AAED,MAAM,UAAU,IAAI,CAAO,MAAoB;IAC9C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/action.js
CHANGED
@@ -1,64 +1,93 @@
|
|
1
1
|
import chalk from "chalk";
|
2
|
-
import { existsSync, linkSync, mkdirSync, statSync, symlinkSync } from "fs";
|
2
|
+
import { existsSync, linkSync, lstatSync, mkdirSync, readlinkSync, rmSync, statSync, symlinkSync, } from "fs";
|
3
3
|
import { dirname, join, resolve } from "path";
|
4
4
|
import { getClient } from "./clients/TorrentClient.js";
|
5
5
|
import { Action, Decision, InjectionResult, LinkType, SaveResult, } from "./constants.js";
|
6
|
-
import { logger } from "./logger.js";
|
6
|
+
import { Label, logger } from "./logger.js";
|
7
7
|
import { resultOf, resultOfErr } from "./Result.js";
|
8
8
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
9
|
-
import {
|
9
|
+
import { createSearcheeFromPath, getSearcheeSource, } from "./searchee.js";
|
10
10
|
import { saveTorrentFile } from "./torrent.js";
|
11
|
-
import {
|
12
|
-
function
|
13
|
-
const
|
14
|
-
const
|
11
|
+
import { getLogString, getMediaType } from "./utils.js";
|
12
|
+
function logActionResult(result, newMeta, searchee, tracker, decision) {
|
13
|
+
const metaLog = getLogString(newMeta, chalk.green.bold);
|
14
|
+
const searcheeLog = getLogString(searchee, chalk.magenta.bold);
|
15
|
+
const source = `${getSearcheeSource(searchee)} (${searcheeLog})`;
|
16
|
+
const foundBy = `Found ${metaLog} on ${chalk.bold(tracker)} by`;
|
17
|
+
let infoOrVerbose = logger.info;
|
18
|
+
let warnOrVerbose = logger.warn;
|
19
|
+
if (searchee.label === Label.INJECT) {
|
20
|
+
infoOrVerbose = logger.verbose;
|
21
|
+
warnOrVerbose = logger.verbose;
|
22
|
+
}
|
15
23
|
switch (result) {
|
24
|
+
case SaveResult.SAVED:
|
25
|
+
infoOrVerbose({
|
26
|
+
label: searchee.label,
|
27
|
+
message: `${foundBy} ${chalk.green.bold(decision)} from ${source} - saved`,
|
28
|
+
});
|
29
|
+
break;
|
16
30
|
case InjectionResult.SUCCESS:
|
17
|
-
|
31
|
+
infoOrVerbose({
|
32
|
+
label: searchee.label,
|
33
|
+
message: `${foundBy} ${chalk.green.bold(decision)} from ${source} - injected`,
|
34
|
+
});
|
18
35
|
break;
|
19
36
|
case InjectionResult.ALREADY_EXISTS:
|
20
|
-
|
37
|
+
infoOrVerbose({
|
38
|
+
label: searchee.label,
|
39
|
+
message: `${foundBy} ${chalk.yellow(decision)} from ${source} - exists`,
|
40
|
+
});
|
21
41
|
break;
|
22
42
|
case InjectionResult.TORRENT_NOT_COMPLETE:
|
23
|
-
|
43
|
+
warnOrVerbose({
|
44
|
+
label: searchee.label,
|
45
|
+
message: `${foundBy} ${chalk.yellow(decision)} from ${source} - incomplete torrent, saving...`,
|
46
|
+
});
|
24
47
|
break;
|
25
48
|
case InjectionResult.FAILURE:
|
26
49
|
default:
|
27
|
-
logger.error(
|
50
|
+
logger.error({
|
51
|
+
label: searchee.label,
|
52
|
+
message: `${foundBy} ${chalk.red(decision)} from ${source} - failed to inject, saving...`,
|
53
|
+
});
|
28
54
|
break;
|
29
55
|
}
|
30
56
|
}
|
31
57
|
/**
|
32
58
|
* @return the root of linked files.
|
33
59
|
*/
|
34
|
-
function linkExactTree(newMeta, destinationDir, sourceRoot) {
|
35
|
-
|
36
|
-
|
37
|
-
}
|
60
|
+
function linkExactTree(newMeta, destinationDir, sourceRoot, options) {
|
61
|
+
let alreadyExisted = false;
|
62
|
+
let linkedNewFiles = false;
|
38
63
|
for (const newFile of newMeta.files) {
|
39
|
-
const srcFilePath =
|
64
|
+
const srcFilePath = statSync(sourceRoot).isFile()
|
65
|
+
? sourceRoot
|
66
|
+
: join(dirname(sourceRoot), newFile.path);
|
40
67
|
const destFilePath = join(destinationDir, newFile.path);
|
68
|
+
if (existsSync(destFilePath)) {
|
69
|
+
alreadyExisted = true;
|
70
|
+
continue;
|
71
|
+
}
|
72
|
+
if (options.ignoreMissing && !existsSync(srcFilePath))
|
73
|
+
continue;
|
41
74
|
mkdirSync(dirname(destFilePath), { recursive: true });
|
42
|
-
linkFile(srcFilePath, destFilePath)
|
75
|
+
if (linkFile(srcFilePath, destFilePath)) {
|
76
|
+
linkedNewFiles = true;
|
77
|
+
}
|
43
78
|
}
|
44
|
-
|
45
|
-
}
|
46
|
-
/**
|
47
|
-
* @return the root of linked file.
|
48
|
-
*/
|
49
|
-
function fuzzyLinkOneFile(newMeta, destinationDir, sourceRoot) {
|
50
|
-
const srcFilePath = sourceRoot;
|
51
|
-
const destFilePath = join(destinationDir, newMeta.files[0].path);
|
52
|
-
mkdirSync(dirname(destFilePath), { recursive: true });
|
53
|
-
linkFile(srcFilePath, destFilePath);
|
54
|
-
return join(destinationDir, newMeta.name);
|
79
|
+
const contentPath = join(destinationDir, newMeta.name);
|
80
|
+
return { contentPath, alreadyExisted, linkedNewFiles };
|
55
81
|
}
|
56
82
|
/**
|
57
83
|
* @return the root of linked files.
|
58
84
|
*/
|
59
|
-
function
|
85
|
+
function linkFuzzyTree(searchee, newMeta, destinationDir, sourceRoot, options) {
|
86
|
+
let alreadyExisted = false;
|
87
|
+
let linkedNewFiles = false;
|
88
|
+
const availableFiles = searchee.files.slice();
|
60
89
|
for (const newFile of newMeta.files) {
|
61
|
-
let matchedSearcheeFiles =
|
90
|
+
let matchedSearcheeFiles = availableFiles.filter((searcheeFile) => searcheeFile.length === newFile.length);
|
62
91
|
if (matchedSearcheeFiles.length > 1) {
|
63
92
|
matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === newFile.name);
|
64
93
|
}
|
@@ -67,69 +96,129 @@ function fuzzyLinkPartial(searchee, newMeta, destinationDir, sourceRoot) {
|
|
67
96
|
? sourceRoot
|
68
97
|
: join(dirname(sourceRoot), matchedSearcheeFiles[0].path);
|
69
98
|
const destFilePath = join(destinationDir, newFile.path);
|
99
|
+
const index = availableFiles.indexOf(matchedSearcheeFiles[0]);
|
100
|
+
availableFiles.splice(index, 1);
|
101
|
+
if (existsSync(destFilePath)) {
|
102
|
+
alreadyExisted = true;
|
103
|
+
continue;
|
104
|
+
}
|
105
|
+
if (options.ignoreMissing && !existsSync(srcFilePath))
|
106
|
+
continue;
|
70
107
|
mkdirSync(dirname(destFilePath), { recursive: true });
|
71
|
-
linkFile(srcFilePath, destFilePath)
|
108
|
+
if (linkFile(srcFilePath, destFilePath)) {
|
109
|
+
linkedNewFiles = true;
|
110
|
+
}
|
72
111
|
}
|
73
112
|
}
|
74
|
-
|
113
|
+
const contentPath = join(destinationDir, newMeta.name);
|
114
|
+
return { contentPath, alreadyExisted, linkedNewFiles };
|
75
115
|
}
|
76
|
-
|
116
|
+
function unlinkMetafile(meta, destinationDir) {
|
117
|
+
const file = meta.files[0];
|
118
|
+
let rootFolder = file.path;
|
119
|
+
let parent = dirname(rootFolder);
|
120
|
+
while (parent !== ".") {
|
121
|
+
rootFolder = parent;
|
122
|
+
parent = dirname(rootFolder);
|
123
|
+
}
|
124
|
+
const fullPath = join(destinationDir, rootFolder);
|
125
|
+
if (!existsSync(fullPath))
|
126
|
+
return;
|
127
|
+
if (resolve(fullPath) === resolve(destinationDir))
|
128
|
+
return;
|
129
|
+
logger.verbose(`Unlinking ${fullPath}`);
|
130
|
+
rmSync(fullPath, { recursive: true });
|
131
|
+
}
|
132
|
+
export async function linkAllFilesInMetafile(searchee, newMeta, tracker, decision, options) {
|
77
133
|
const { linkDir, flatLinking } = getRuntimeConfig();
|
78
|
-
const
|
134
|
+
const newMetaClientSavePathRes = await getClient().getDownloadDir(newMeta, {
|
135
|
+
onlyCompleted: false,
|
136
|
+
});
|
137
|
+
const fullLinkDir = newMetaClientSavePathRes.isOk()
|
138
|
+
? newMetaClientSavePathRes.unwrap() // Use existing if ALREADY_EXISTS
|
139
|
+
: flatLinking
|
140
|
+
? linkDir
|
141
|
+
: join(linkDir, tracker);
|
79
142
|
let sourceRoot;
|
80
143
|
if (searchee.path) {
|
144
|
+
if (!existsSync(searchee.path)) {
|
145
|
+
logger.error({
|
146
|
+
label: searchee.label,
|
147
|
+
message: `Linking failed, ${searchee.path} not found. Make sure Docker volume mounts are set up properly.`,
|
148
|
+
});
|
149
|
+
return resultOfErr("MISSING_DATA");
|
150
|
+
}
|
151
|
+
const result = await createSearcheeFromPath(searchee.path);
|
152
|
+
if (result.isErr()) {
|
153
|
+
return resultOfErr("TORRENT_NOT_FOUND");
|
154
|
+
}
|
155
|
+
const refreshedSearchee = result.unwrap();
|
156
|
+
if (options.onlyCompleted &&
|
157
|
+
searchee.length !== refreshedSearchee.length) {
|
158
|
+
return resultOfErr("TORRENT_NOT_COMPLETE");
|
159
|
+
}
|
81
160
|
sourceRoot = searchee.path;
|
82
161
|
}
|
83
162
|
else {
|
84
|
-
const downloadDirResult = await getClient().getDownloadDir(searchee);
|
163
|
+
const downloadDirResult = await getClient().getDownloadDir(searchee, { onlyCompleted: options.onlyCompleted });
|
85
164
|
if (downloadDirResult.isErr()) {
|
86
|
-
return downloadDirResult.mapErr((e) => e === "NOT_FOUND"
|
165
|
+
return downloadDirResult.mapErr((e) => e === "NOT_FOUND" || e === "UNKNOWN_ERROR"
|
166
|
+
? "TORRENT_NOT_FOUND"
|
167
|
+
: e);
|
87
168
|
}
|
88
|
-
sourceRoot = join(downloadDirResult.
|
169
|
+
sourceRoot = join(downloadDirResult.unwrap(), searchee.files.length === 1
|
89
170
|
? searchee.files[0].path
|
90
171
|
: searchee.name);
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
172
|
+
if (!existsSync(sourceRoot)) {
|
173
|
+
logger.error({
|
174
|
+
label: searchee.label,
|
175
|
+
message: `Linking failed, ${sourceRoot} not found. Make sure Docker volume mounts are set up properly.`,
|
176
|
+
});
|
177
|
+
return resultOfErr("MISSING_DATA");
|
178
|
+
}
|
95
179
|
}
|
96
180
|
if (decision === Decision.MATCH) {
|
97
|
-
return resultOf(linkExactTree(newMeta, fullLinkDir, sourceRoot
|
98
|
-
|
99
|
-
|
100
|
-
return resultOf(fuzzyLinkOneFile(newMeta, fullLinkDir, sourceRoot));
|
181
|
+
return resultOf(linkExactTree(newMeta, fullLinkDir, sourceRoot, {
|
182
|
+
ignoreMissing: !options.onlyCompleted,
|
183
|
+
}));
|
101
184
|
}
|
102
185
|
else {
|
103
|
-
return resultOf(
|
186
|
+
return resultOf(linkFuzzyTree(searchee, newMeta, fullLinkDir, sourceRoot, {
|
187
|
+
ignoreMissing: !options.onlyCompleted,
|
188
|
+
}));
|
104
189
|
}
|
105
190
|
}
|
106
191
|
export async function performAction(newMeta, decision, searchee, tracker) {
|
107
192
|
const { action, linkDir } = getRuntimeConfig();
|
108
|
-
const isVideo = hasVideo(searchee);
|
109
193
|
if (action === Action.SAVE) {
|
110
|
-
await saveTorrentFile(tracker,
|
111
|
-
|
112
|
-
|
113
|
-
logger.info(`Found ${styledName} on ${styledTracker} by ${decision} - saved`);
|
114
|
-
return SaveResult.SAVED;
|
194
|
+
await saveTorrentFile(tracker, getMediaType(searchee), newMeta);
|
195
|
+
logActionResult(SaveResult.SAVED, newMeta, searchee, tracker, decision);
|
196
|
+
return { actionResult: SaveResult.SAVED, linkedNewFiles: false };
|
115
197
|
}
|
116
198
|
let destinationDir;
|
199
|
+
let unlinkOk = false;
|
200
|
+
let linkedNewFiles = false;
|
117
201
|
if (linkDir) {
|
118
|
-
const linkedFilesRootResult = await linkAllFilesInMetafile(searchee, newMeta, tracker, decision);
|
202
|
+
const linkedFilesRootResult = await linkAllFilesInMetafile(searchee, newMeta, tracker, decision, { onlyCompleted: true });
|
119
203
|
if (linkedFilesRootResult.isOk()) {
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
logger.warn("Falling back to non-linking.");
|
125
|
-
if (searchee.path) {
|
126
|
-
destinationDir = dirname(searchee.path);
|
127
|
-
}
|
204
|
+
const linkResult = linkedFilesRootResult.unwrap();
|
205
|
+
destinationDir = dirname(linkResult.contentPath);
|
206
|
+
unlinkOk = !linkResult.alreadyExisted;
|
207
|
+
linkedNewFiles = linkResult.linkedNewFiles;
|
128
208
|
}
|
129
209
|
else {
|
130
|
-
|
131
|
-
|
132
|
-
|
210
|
+
const result = linkedFilesRootResult.unwrapErr();
|
211
|
+
const warnOrVerbose = searchee.label !== Label.INJECT ? logger.warn : logger.verbose;
|
212
|
+
warnOrVerbose({
|
213
|
+
label: searchee.label,
|
214
|
+
message: `Failed to link files for ${getLogString(newMeta)}: ${result}`,
|
215
|
+
});
|
216
|
+
const injectionResult = result === "TORRENT_NOT_COMPLETE"
|
217
|
+
? InjectionResult.TORRENT_NOT_COMPLETE
|
218
|
+
: InjectionResult.FAILURE;
|
219
|
+
logActionResult(injectionResult, newMeta, searchee, tracker, decision);
|
220
|
+
await saveTorrentFile(tracker, getMediaType(searchee), newMeta);
|
221
|
+
return { actionResult: injectionResult, linkedNewFiles };
|
133
222
|
}
|
134
223
|
}
|
135
224
|
else if (searchee.path) {
|
@@ -137,18 +226,27 @@ export async function performAction(newMeta, decision, searchee, tracker) {
|
|
137
226
|
destinationDir = dirname(searchee.path);
|
138
227
|
}
|
139
228
|
const result = await getClient().inject(newMeta, searchee, decision, destinationDir);
|
140
|
-
|
141
|
-
if (result === InjectionResult.
|
142
|
-
|
229
|
+
logActionResult(result, newMeta, searchee, tracker, decision);
|
230
|
+
if (result === InjectionResult.SUCCESS) {
|
231
|
+
// For an easy re-injection user workflow when multiple MATCH_PARTIAL
|
232
|
+
if (decision === Decision.MATCH_PARTIAL) {
|
233
|
+
await saveTorrentFile(tracker, getMediaType(searchee), newMeta);
|
234
|
+
}
|
143
235
|
}
|
144
|
-
|
236
|
+
else if (result !== InjectionResult.ALREADY_EXISTS) {
|
237
|
+
await saveTorrentFile(tracker, getMediaType(searchee), newMeta);
|
238
|
+
if (unlinkOk && destinationDir) {
|
239
|
+
unlinkMetafile(newMeta, destinationDir);
|
240
|
+
}
|
241
|
+
}
|
242
|
+
return { actionResult: result, linkedNewFiles };
|
145
243
|
}
|
146
244
|
export async function performActions(searchee, matches) {
|
147
245
|
const results = [];
|
148
246
|
for (const { tracker, assessment } of matches) {
|
149
|
-
const
|
150
|
-
results.push(
|
151
|
-
if (
|
247
|
+
const { actionResult } = await performAction(assessment.metafile, assessment.decision, searchee, tracker);
|
248
|
+
results.push(actionResult);
|
249
|
+
if (actionResult === InjectionResult.TORRENT_NOT_COMPLETE)
|
152
250
|
break;
|
153
251
|
}
|
154
252
|
return results;
|
@@ -156,19 +254,35 @@ export async function performActions(searchee, matches) {
|
|
156
254
|
function linkFile(oldPath, newPath) {
|
157
255
|
const { linkType } = getRuntimeConfig();
|
158
256
|
try {
|
257
|
+
const ogFileResolvedPath = unwrapSymlinks(oldPath);
|
159
258
|
if (linkType === LinkType.HARDLINK) {
|
160
|
-
linkSync(
|
259
|
+
linkSync(ogFileResolvedPath, newPath);
|
161
260
|
}
|
162
261
|
else {
|
163
262
|
// we need to resolve because symlinks are resolved outside
|
164
263
|
// the context of cross-seed's working directory
|
165
|
-
symlinkSync(
|
264
|
+
symlinkSync(ogFileResolvedPath, resolve(newPath));
|
166
265
|
}
|
266
|
+
return true;
|
167
267
|
}
|
168
268
|
catch (e) {
|
169
269
|
if (e.code === "EEXIST")
|
170
|
-
return;
|
270
|
+
return false;
|
171
271
|
throw e;
|
172
272
|
}
|
173
273
|
}
|
274
|
+
/**
|
275
|
+
* Recursively resolves symlinks to the original file. Differs from realpath
|
276
|
+
* in that it will not resolve directory symlinks in the middle of the path.
|
277
|
+
* @param path
|
278
|
+
*/
|
279
|
+
function unwrapSymlinks(path) {
|
280
|
+
for (let i = 0; i < 16; i++) {
|
281
|
+
if (!lstatSync(path).isSymbolicLink()) {
|
282
|
+
return path;
|
283
|
+
}
|
284
|
+
path = resolve(dirname(path), readlinkSync(path));
|
285
|
+
}
|
286
|
+
throw new Error(`too many levels of symbolic links at ${path}`);
|
287
|
+
}
|
174
288
|
//# sourceMappingURL=action.js.map
|
package/dist/action.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"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"}
|
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,SAAS,EACT,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,WAAW,GACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EACN,MAAM,EAEN,QAAQ,EAER,eAAe,EACf,QAAQ,EACR,UAAU,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAU,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACN,sBAAsB,EACtB,iBAAiB,GAIjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQxD,SAAS,eAAe,CACvB,MAAoB,EACpB,OAAiB,EACjB,QAA2B,EAC3B,OAAe,EACf,QAAkB;IAElB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,KAAK,WAAW,GAAG,CAAC;IACjE,MAAM,OAAO,GAAG,SAAS,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAEhE,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC;IAChC,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC;IAChC,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACrC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IACD,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,UAAU,CAAC,KAAK;YACpB,aAAa,CAAC;gBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,GAAG,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,UAAU;aAC1E,CAAC,CAAC;YACH,MAAM;QACP,KAAK,eAAe,CAAC,OAAO;YAC3B,aAAa,CAAC;gBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,GAAG,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,aAAa;aAC7E,CAAC,CAAC;YACH,MAAM;QACP,KAAK,eAAe,CAAC,cAAc;YAClC,aAAa,CAAC;gBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,GAAG,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,MAAM,WAAW;aACvE,CAAC,CAAC;YACH,MAAM;QACP,KAAK,eAAe,CAAC,oBAAoB;YACxC,aAAa,CAAC;gBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,GAAG,OAAO,IAAI,KAAK,CAAC,MAAM,CAClC,QAAQ,CACR,SAAS,MAAM,kCAAkC;aAClD,CAAC,CAAC;YACH,MAAM;QACP,KAAK,eAAe,CAAC,OAAO,CAAC;QAC7B;YACC,MAAM,CAAC,KAAK,CAAC;gBACZ,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG,CAC/B,QAAQ,CACR,SAAS,MAAM,gCAAgC;aAChD,CAAC,CAAC;YACH,MAAM;IACR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACrB,OAAiB,EACjB,cAAsB,EACtB,UAAkB,EAClB,OAAmC;IAEnC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;YAChD,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,cAAc,GAAG,IAAI,CAAC;YACtB,SAAS;QACV,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,SAAS;QAChE,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;YACzC,cAAc,GAAG,IAAI,CAAC;QACvB,CAAC;IACF,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACrB,QAAkB,EAClB,OAAiB,EACjB,cAAsB,EACtB,UAAkB,EAClB,OAAmC;IAEnC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,oBAAoB,GAAG,cAAc,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,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAChC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9B,cAAc,GAAG,IAAI,CAAC;gBACtB,SAAS;YACV,CAAC;YACD,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,SAAS;YAChE,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;gBACzC,cAAc,GAAG,IAAI,CAAC;YACvB,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,IAAc,EAAE,cAAsB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3B,IAAI,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,UAAU,GAAG,MAAM,CAAC;QACpB,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAClC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC;QAAE,OAAO;IAC1D,MAAM,CAAC,OAAO,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,QAAkB,EAClB,OAAiB,EACjB,OAAe,EACf,QAA0B,EAC1B,OAAmC;IAUnC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACpD,MAAM,wBAAwB,GAAG,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE;QAC1E,aAAa,EAAE,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,wBAAwB,CAAC,IAAI,EAAE;QAClD,CAAC,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,iCAAiC;QACrE,CAAC,CAAC,WAAW;YACZ,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE3B,IAAI,UAAkB,CAAC;IACvB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC;gBACZ,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,mBAAmB,QAAQ,CAAC,IAAI,iEAAiE;aAC1G,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,IACC,OAAO,CAAC,aAAa;YACrB,QAAQ,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM,EAC3C,CAAC;YACF,OAAO,WAAW,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC;QACD,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;SAAM,CAAC;QACP,MAAM,iBAAiB,GAAG,MAAM,SAAS,EAAE,CAAC,cAAc,CACzD,QAAgC,EAChC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CACxC,CAAC;QACF,IAAI,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/B,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,eAAe;gBACzC,CAAC,CAAC,mBAAmB;gBACrB,CAAC,CAAC,CAAC,CACJ,CAAC;QACH,CAAC;QACD,UAAU,GAAG,IAAI,CAChB,iBAAiB,CAAC,MAAM,EAAE,EAC1B,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAC1B,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;YACxB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAChB,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC;gBACZ,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,mBAAmB,UAAU,iEAAiE;aACvG,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,QAAQ,CACd,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;YAC/C,aAAa,EAAE,CAAC,OAAO,CAAC,aAAa;SACrC,CAAC,CACF,CAAC;IACH,CAAC;SAAM,CAAC;QACP,OAAO,QAAQ,CACd,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;YACzD,aAAa,EAAE,CAAC,OAAO,CAAC,aAAa;SACrC,CAAC,CACF,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,OAAiB,EACjB,QAA0B,EAC1B,QAA2B,EAC3B,OAAe;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE/C,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,cAAkC,CAAC;IACvC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,qBAAqB,GAAG,MAAM,sBAAsB,CACzD,QAAQ,EACR,OAAO,EACP,OAAO,EACP,QAAQ,EACR,EAAE,aAAa,EAAE,IAAI,EAAE,CACvB,CAAC;QACF,IAAI,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,EAAE,CAAC;YAClD,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACjD,QAAQ,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;YACtC,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,EAAE,CAAC;YACjD,MAAM,aAAa,GAClB,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAChE,aAAa,CAAC;gBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,4BAA4B,YAAY,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE;aACvE,CAAC,CAAC;YACH,MAAM,eAAe,GACpB,MAAM,KAAK,sBAAsB;gBAChC,CAAC,CAAC,eAAe,CAAC,oBAAoB;gBACtC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;YAC5B,eAAe,CACd,eAAe,EACf,OAAO,EACP,QAAQ,EACR,OAAO,EACP,QAAQ,CACR,CAAC;YACF,MAAM,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YAChE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;QAC1D,CAAC;IACF,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1B,2DAA2D;QAC3D,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,MAAM,CACtC,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,cAAc,CACd,CAAC;IAEF,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9D,IAAI,MAAM,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;QACxC,qEAAqE;QACrE,IAAI,QAAQ,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC;IACF,CAAC;SAAM,IAAI,MAAM,KAAK,eAAe,CAAC,cAAc,EAAE,CAAC;QACtD,MAAM,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;YAChC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,QAA2B,EAC3B,OAAgC;IAEhC,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,OAAO,EAAE,CAAC;QAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,aAAa,CAC3C,UAAU,CAAC,QAAS,EACpB,UAAU,CAAC,QAA4B,EACvC,QAAQ,EACR,OAAO,CACP,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,YAAY,KAAK,eAAe,CAAC,oBAAoB;YAAE,MAAM;IAClE,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,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACpC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACP,2DAA2D;YAC3D,gDAAgD;YAChD,WAAW,CAAC,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,CAAC,CAAC;IACT,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,IAAY;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/arr.js
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
import chalk from "chalk";
|
2
|
+
import ms from "ms";
|
3
|
+
import { join as posixJoin } from "node:path/posix";
|
4
|
+
import { URLSearchParams } from "node:url";
|
5
|
+
import { SCENE_TITLE_REGEX } from "./constants.js";
|
6
|
+
import { CrossSeedError } from "./errors.js";
|
7
|
+
import { Label, logger } from "./logger.js";
|
8
|
+
import { resultOf, resultOfErr } from "./Result.js";
|
9
|
+
import { getRuntimeConfig } from "./runtimeConfig.js";
|
10
|
+
import { cleanseSeparators, getApikey, isTruthy, MediaType, sanitizeUrl, stripMetaFromName, } from "./utils.js";
|
11
|
+
export function arrIdsEqual(a, b) {
|
12
|
+
return (a?.imdbId === b?.imdbId &&
|
13
|
+
a?.tmdbId === b?.tmdbId &&
|
14
|
+
a?.tvdbId === b?.tvdbId &&
|
15
|
+
a?.tvMazeId === b?.tvMazeId);
|
16
|
+
}
|
17
|
+
export async function validateUArrLs() {
|
18
|
+
const { sonarr, radarr } = getRuntimeConfig();
|
19
|
+
if (sonarr) {
|
20
|
+
const urls = sonarr.map((str) => new URL(str));
|
21
|
+
for (const url of urls) {
|
22
|
+
if (!url.searchParams.has("apikey")) {
|
23
|
+
throw new CrossSeedError(`Sonarr url ${url} does not specify an apikey`);
|
24
|
+
}
|
25
|
+
await checkArrIsActive(url.href, "Sonarr");
|
26
|
+
}
|
27
|
+
}
|
28
|
+
if (radarr) {
|
29
|
+
const urls = radarr.map((str) => new URL(str));
|
30
|
+
for (const url of urls) {
|
31
|
+
if (!url.searchParams.has("apikey")) {
|
32
|
+
throw new CrossSeedError(`Radarr url ${url} does not specify an apikey`);
|
33
|
+
}
|
34
|
+
await checkArrIsActive(url.href, "Radarr");
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
async function checkArrIsActive(uArrL, arrInstance) {
|
39
|
+
const arrPingCheck = await makeArrApiCall(uArrL, "/api");
|
40
|
+
if (arrPingCheck.isOk()) {
|
41
|
+
const arrPingResponse = arrPingCheck.unwrap();
|
42
|
+
if (!arrPingResponse?.current) {
|
43
|
+
throw new CrossSeedError(`Failed to establish a connection to ${arrInstance} URL: ${uArrL}`);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
else {
|
47
|
+
const error = arrPingCheck.unwrapErr();
|
48
|
+
throw new CrossSeedError(`Could not contact ${arrInstance} at ${uArrL}`, {
|
49
|
+
cause: error.message.includes("fetch failed") && error.cause
|
50
|
+
? error.cause
|
51
|
+
: error,
|
52
|
+
});
|
53
|
+
}
|
54
|
+
}
|
55
|
+
function getBodySampleMessage(text) {
|
56
|
+
const first1000Chars = text.substring(0, 1000);
|
57
|
+
if (first1000Chars) {
|
58
|
+
return `first 1000 characters: ${first1000Chars}`;
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
return "";
|
62
|
+
}
|
63
|
+
}
|
64
|
+
async function makeArrApiCall(uArrL, resourcePath, params = new URLSearchParams()) {
|
65
|
+
const apikey = getApikey(uArrL);
|
66
|
+
const url = new URL(sanitizeUrl(uArrL));
|
67
|
+
url.pathname = posixJoin(url.pathname, resourcePath);
|
68
|
+
for (const [name, value] of params) {
|
69
|
+
url.searchParams.set(name, value);
|
70
|
+
}
|
71
|
+
let response;
|
72
|
+
try {
|
73
|
+
response = await fetch(url, {
|
74
|
+
signal: AbortSignal.timeout(ms("30 seconds")),
|
75
|
+
headers: { "X-Api-Key": apikey },
|
76
|
+
});
|
77
|
+
}
|
78
|
+
catch (networkError) {
|
79
|
+
if (networkError.name === "AbortError" ||
|
80
|
+
networkError.name === "TimeoutError") {
|
81
|
+
return resultOfErr(new Error("connection timeout"));
|
82
|
+
}
|
83
|
+
return resultOfErr(networkError);
|
84
|
+
}
|
85
|
+
if (!response.ok) {
|
86
|
+
const responseText = await response.text();
|
87
|
+
const bodySampleMessage = getBodySampleMessage(responseText);
|
88
|
+
return resultOfErr(new Error(`${response.status} ${response.statusText} ${bodySampleMessage}`));
|
89
|
+
}
|
90
|
+
try {
|
91
|
+
const responseBody = await response.clone().json();
|
92
|
+
return resultOf(responseBody);
|
93
|
+
}
|
94
|
+
catch (e) {
|
95
|
+
const responseText = await response.text();
|
96
|
+
return resultOfErr(new Error(`Arr response was non-JSON. ${getBodySampleMessage(responseText)}`));
|
97
|
+
}
|
98
|
+
}
|
99
|
+
async function getMediaFromArr(uArrL, title) {
|
100
|
+
return await makeArrApiCall(uArrL, "/api/v3/parse", new URLSearchParams({ title }));
|
101
|
+
}
|
102
|
+
export function formatFoundIds(foundIds) {
|
103
|
+
return Object.entries(foundIds)
|
104
|
+
.filter(([idName]) => ["imdbid", "tmdbid", "tvdbid", "tvmazeid"].includes(idName.toLowerCase()))
|
105
|
+
.map(([idName, idValue]) => {
|
106
|
+
const name = idName.toUpperCase().replace("ID", "");
|
107
|
+
const val = idValue ?? "N/A";
|
108
|
+
return `${chalk.yellow(name)}=${chalk.white(val)}`;
|
109
|
+
})
|
110
|
+
.join(" ");
|
111
|
+
}
|
112
|
+
function logArrQueryResult(externalIds, searchTerm, label, error) {
|
113
|
+
if (error) {
|
114
|
+
if (!Object.values(externalIds).some(isTruthy)) {
|
115
|
+
logger.verbose({
|
116
|
+
label: label,
|
117
|
+
message: `Lookup failed for ${chalk.yellow(searchTerm)} - ${chalk.red(error.message)} - make sure the item is added to an Arr instance.`,
|
118
|
+
});
|
119
|
+
return;
|
120
|
+
}
|
121
|
+
logger.debug({
|
122
|
+
label: label,
|
123
|
+
message: `Failed to lookup IDs for ${chalk.yellow(searchTerm)} - (${chalk.red(String(error).split(":").slice(1)[0].trim())})`,
|
124
|
+
});
|
125
|
+
logger.debug(error);
|
126
|
+
}
|
127
|
+
else {
|
128
|
+
const foundIdsStr = formatFoundIds(externalIds);
|
129
|
+
logger.verbose({
|
130
|
+
label: label,
|
131
|
+
message: `Found media for ${chalk.green.bold(searchTerm)} -> ${foundIdsStr}`,
|
132
|
+
});
|
133
|
+
}
|
134
|
+
}
|
135
|
+
function getRelevantArrInstances(mediaType) {
|
136
|
+
const { sonarr, radarr } = getRuntimeConfig();
|
137
|
+
switch (mediaType) {
|
138
|
+
case MediaType.SEASON:
|
139
|
+
case MediaType.EPISODE:
|
140
|
+
return sonarr;
|
141
|
+
case MediaType.MOVIE:
|
142
|
+
return radarr;
|
143
|
+
case MediaType.ANIME:
|
144
|
+
case MediaType.VIDEO:
|
145
|
+
return [...sonarr, ...radarr];
|
146
|
+
default:
|
147
|
+
return [];
|
148
|
+
}
|
149
|
+
}
|
150
|
+
export async function scanAllArrsForMedia(searcheeTitle, mediaType) {
|
151
|
+
const uArrLs = getRelevantArrInstances(mediaType);
|
152
|
+
if (uArrLs.length === 0) {
|
153
|
+
return resultOfErr(false);
|
154
|
+
}
|
155
|
+
const title = mediaType !== MediaType.VIDEO
|
156
|
+
? searcheeTitle.match(SCENE_TITLE_REGEX).groups.title
|
157
|
+
: cleanseSeparators(stripMetaFromName(searcheeTitle));
|
158
|
+
let error = new Error(`No ids found for ${title} | MediaType: ${mediaType.toUpperCase()}`);
|
159
|
+
for (const uArrL of uArrLs) {
|
160
|
+
const name = mediaType === MediaType.VIDEO &&
|
161
|
+
getRuntimeConfig().sonarr?.includes(uArrL)
|
162
|
+
? `${title} S00E00` // Sonarr needs season or episode
|
163
|
+
: title;
|
164
|
+
const result = await getMediaFromArr(uArrL, name);
|
165
|
+
if (result.isErr()) {
|
166
|
+
error = result.unwrapErr();
|
167
|
+
continue;
|
168
|
+
}
|
169
|
+
const response = result.unwrap();
|
170
|
+
const ids = response.movie ?? response.series ?? {};
|
171
|
+
for (const [key, value] of Object.entries(ids)) {
|
172
|
+
if (value === 0 || value === "0") {
|
173
|
+
ids[key] = undefined;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
if (Object.values(ids).some(isTruthy)) {
|
177
|
+
const label = response.movie ? Label.RADARR : Label.SONARR;
|
178
|
+
logArrQueryResult(ids, name, label);
|
179
|
+
return resultOf(response);
|
180
|
+
}
|
181
|
+
}
|
182
|
+
logArrQueryResult({}, searcheeTitle, Label.ARRS, error);
|
183
|
+
return resultOfErr(false);
|
184
|
+
}
|
185
|
+
export async function getRelevantArrIds(caps, parsedMedia) {
|
186
|
+
const idSearchCaps = parsedMedia.movie
|
187
|
+
? caps.movieIdSearch
|
188
|
+
: caps.tvIdSearch;
|
189
|
+
const ids = parsedMedia.movie ?? parsedMedia.series;
|
190
|
+
return {
|
191
|
+
tvdbid: idSearchCaps.tvdbId ? ids.tvdbId : undefined,
|
192
|
+
tmdbid: idSearchCaps.tmdbId ? ids.tmdbId : undefined,
|
193
|
+
imdbid: idSearchCaps.imdbId ? ids.imdbId : undefined,
|
194
|
+
tvmazeid: idSearchCaps.tvMazeId ? ids.tvMazeId : undefined,
|
195
|
+
};
|
196
|
+
}
|
197
|
+
//# sourceMappingURL=arr.js.map
|