cross-seed 5.9.2 → 6.0.0-1
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 +7 -1
- package/dist/Result.js +2 -0
- package/dist/Result.js.map +1 -1
- package/dist/action.js +127 -62
- 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 +104 -51
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +205 -122
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +57 -23
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +17 -9
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +89 -77
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +237 -144
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +177 -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 +28 -12
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +17 -8
- package/dist/dataFiles.js.map +1 -1
- package/dist/decide.js +118 -28
- 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/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 +42 -5
- package/dist/utils.js.map +1 -1
- package/package.json +12 -12
- package/dist/config.template.docker.cjs +0 -236
- package/dist/config.template.docker.cjs.map +0 -1
package/dist/clients/RTorrent.js
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
import {
|
1
|
+
import { stat, unlink, writeFile } from "fs/promises";
|
2
2
|
import { dirname, join, resolve, sep } from "path";
|
3
3
|
import { inspect } from "util";
|
4
4
|
import xmlrpc from "xmlrpc";
|
5
|
-
import { InjectionResult } from "../constants.js";
|
5
|
+
import { InjectionResult, TORRENT_TAG } from "../constants.js";
|
6
6
|
import { CrossSeedError } from "../errors.js";
|
7
7
|
import { Label, logger } from "../logger.js";
|
8
8
|
import { Metafile } from "../parseTorrent.js";
|
9
9
|
import { resultOf, resultOfErr } from "../Result.js";
|
10
10
|
import { getRuntimeConfig } from "../runtimeConfig.js";
|
11
|
-
import { extractCredentialsFromUrl, wait } from "../utils.js";
|
11
|
+
import { shouldRecheck, extractCredentialsFromUrl, wait } from "../utils.js";
|
12
|
+
const COULD_NOT_FIND_INFO_HASH = "Could not find info-hash.";
|
12
13
|
async function createLibTorrentResumeTree(meta, basePath) {
|
13
14
|
async function getFileResumeData(file) {
|
14
15
|
const filePathWithoutFirstSegment = file.path
|
@@ -16,9 +17,7 @@ async function createLibTorrentResumeTree(meta, basePath) {
|
|
16
17
|
.slice(1)
|
17
18
|
.join(sep);
|
18
19
|
const resolvedFilePath = resolve(basePath, filePathWithoutFirstSegment);
|
19
|
-
const fileStat = await
|
20
|
-
.stat(resolvedFilePath)
|
21
|
-
.catch(() => ({ isFile: () => false }));
|
20
|
+
const fileStat = await stat(resolvedFilePath).catch(() => ({ isFile: () => false }));
|
22
21
|
if (!fileStat.isFile() || fileStat.size !== file.length) {
|
23
22
|
logger.debug({
|
24
23
|
label: Label.RTORRENT,
|
@@ -46,9 +45,10 @@ async function saveWithLibTorrentResume(meta, savePath, basePath) {
|
|
46
45
|
...meta.raw,
|
47
46
|
libtorrent_resume: await createLibTorrentResumeTree(meta, basePath),
|
48
47
|
};
|
49
|
-
await
|
48
|
+
await writeFile(savePath, new Metafile(rawWithLibtorrentResume).encode());
|
50
49
|
}
|
51
50
|
export default class RTorrent {
|
51
|
+
client;
|
52
52
|
constructor() {
|
53
53
|
const { rtorrentRpcUrl } = getRuntimeConfig();
|
54
54
|
const { href, username, password } = extractCredentialsFromUrl(rtorrentRpcUrl).unwrapOrThrow(new CrossSeedError("rTorrent url must be percent-encoded"));
|
@@ -85,9 +85,9 @@ export default class RTorrent {
|
|
85
85
|
}
|
86
86
|
async checkOriginalTorrent(searchee) {
|
87
87
|
const infoHash = searchee.infoHash.toUpperCase();
|
88
|
-
let
|
88
|
+
let response;
|
89
89
|
try {
|
90
|
-
|
90
|
+
response = await this.methodCallP("system.multicall", [
|
91
91
|
[
|
92
92
|
{
|
93
93
|
methodName: "d.directory",
|
@@ -97,27 +97,44 @@ export default class RTorrent {
|
|
97
97
|
methodName: "d.complete",
|
98
98
|
params: [infoHash],
|
99
99
|
},
|
100
|
+
{
|
101
|
+
methodName: "d.is_multi_file",
|
102
|
+
params: [infoHash],
|
103
|
+
},
|
100
104
|
],
|
101
105
|
]);
|
102
106
|
}
|
103
107
|
catch (e) {
|
104
108
|
logger.debug(e);
|
105
|
-
return resultOfErr(
|
109
|
+
return resultOfErr("FAILURE");
|
110
|
+
}
|
111
|
+
function isFault(response) {
|
112
|
+
return "faultString" in response[0];
|
106
113
|
}
|
107
|
-
// temp diag for #154
|
108
114
|
try {
|
109
|
-
|
115
|
+
if (isFault(response)) {
|
116
|
+
if (response[0].faultString === COULD_NOT_FIND_INFO_HASH) {
|
117
|
+
return resultOfErr("NOT_FOUND");
|
118
|
+
}
|
119
|
+
else {
|
120
|
+
throw new Error("Unknown rTorrent fault while checking original torrent");
|
121
|
+
}
|
122
|
+
}
|
123
|
+
const [[directoryBase], [isCompleteStr], [isMultiFileStr]] = response;
|
110
124
|
const isComplete = Boolean(Number(isCompleteStr));
|
111
125
|
if (!isComplete) {
|
112
|
-
return resultOfErr(
|
126
|
+
return resultOfErr("TORRENT_NOT_COMPLETE");
|
113
127
|
}
|
114
|
-
return resultOf({
|
128
|
+
return resultOf({
|
129
|
+
directoryBase,
|
130
|
+
isMultiFile: Boolean(Number(isMultiFileStr)),
|
131
|
+
});
|
115
132
|
}
|
116
133
|
catch (e) {
|
117
134
|
logger.error(e);
|
118
135
|
logger.debug("Failure caused by server response below:");
|
119
|
-
logger.debug(inspect(
|
120
|
-
return resultOfErr(
|
136
|
+
logger.debug(inspect(response));
|
137
|
+
return resultOfErr("FAILURE");
|
121
138
|
}
|
122
139
|
}
|
123
140
|
async getDownloadLocation(meta, searchee, path) {
|
@@ -152,24 +169,41 @@ export default class RTorrent {
|
|
152
169
|
throw new CrossSeedError(`Failed to reach rTorrent at ${rtorrentRpcUrl}`);
|
153
170
|
}
|
154
171
|
}
|
155
|
-
async
|
172
|
+
async getDownloadDir(searchee) {
|
173
|
+
const result = await this.checkOriginalTorrent(searchee);
|
174
|
+
return result
|
175
|
+
.mapOk(({ directoryBase, isMultiFile }) => {
|
176
|
+
return isMultiFile ? dirname(directoryBase) : directoryBase;
|
177
|
+
})
|
178
|
+
.mapErr((error) => (error === "FAILURE" ? "UNKNOWN_ERROR" : error));
|
179
|
+
}
|
180
|
+
async inject(meta, searchee, decision, path) {
|
156
181
|
const { outputDir } = getRuntimeConfig();
|
157
182
|
if (await this.checkForInfoHashInClient(meta.infoHash)) {
|
158
183
|
return InjectionResult.ALREADY_EXISTS;
|
159
184
|
}
|
160
185
|
const result = await this.getDownloadLocation(meta, searchee, path);
|
161
|
-
if (result.isErr())
|
162
|
-
|
186
|
+
if (result.isErr()) {
|
187
|
+
switch (result.unwrapErrOrThrow()) {
|
188
|
+
case "NOT_FOUND":
|
189
|
+
return InjectionResult.FAILURE;
|
190
|
+
case "TORRENT_NOT_COMPLETE":
|
191
|
+
return InjectionResult.TORRENT_NOT_COMPLETE;
|
192
|
+
case "FAILURE":
|
193
|
+
return InjectionResult.FAILURE;
|
194
|
+
}
|
195
|
+
}
|
163
196
|
const { directoryBase, basePath } = result.unwrapOrThrow();
|
164
197
|
const torrentFilePath = resolve(outputDir, `${meta.name}.tmp.${Date.now()}.torrent`);
|
165
198
|
await saveWithLibTorrentResume(meta, torrentFilePath, basePath);
|
199
|
+
const loadType = shouldRecheck(decision) ? "load" : "load.start";
|
166
200
|
for (let i = 0; i < 5; i++) {
|
167
201
|
try {
|
168
|
-
await this.methodCallP(
|
202
|
+
await this.methodCallP(loadType, [
|
169
203
|
"",
|
170
204
|
torrentFilePath,
|
171
205
|
`d.directory_base.set="${directoryBase}"`,
|
172
|
-
`d.custom1.set="
|
206
|
+
`d.custom1.set="${TORRENT_TAG}"`,
|
173
207
|
`d.custom.set=addtime,${Math.round(Date.now() / 1000)}`,
|
174
208
|
]);
|
175
209
|
break;
|
@@ -180,12 +214,12 @@ export default class RTorrent {
|
|
180
214
|
}
|
181
215
|
for (let i = 0; i < 5; i++) {
|
182
216
|
if (await this.checkForInfoHashInClient(meta.infoHash)) {
|
183
|
-
setTimeout(() =>
|
217
|
+
setTimeout(() => unlink(torrentFilePath), 1000);
|
184
218
|
return InjectionResult.SUCCESS;
|
185
219
|
}
|
186
220
|
await wait(100 * Math.pow(2, i));
|
187
221
|
}
|
188
|
-
setTimeout(() =>
|
222
|
+
setTimeout(() => unlink(torrentFilePath), 1000);
|
189
223
|
return InjectionResult.FAILURE;
|
190
224
|
}
|
191
225
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RTorrent.js","sourceRoot":"","sources":["../../src/clients/RTorrent.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"RTorrent.js","sourceRoot":"","sources":["../../src/clients/RTorrent.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"TorrentClient.js","sourceRoot":"","sources":["../../src/clients/TorrentClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,MAAM,MAAM,aAAa,CAAC;
|
1
|
+
{"version":3,"file":"TorrentClient.js","sourceRoot":"","sources":["../../src/clients/TorrentClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,IAAI,YAA2B,CAAC;AAoBhC,SAAS,yBAAyB;IACjC,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,GACzE,gBAAgB,EAAE,CAAC;IACpB,IAAI,cAAc,EAAE,CAAC;QACpB,YAAY,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC/B,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC3B,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,CAAC;SAAM,IAAI,kBAAkB,EAAE,CAAC;QAC/B,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACnC,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACzB,YAAY,GAAG,IAAI,MAAM,EAAE,CAAC;IAC7B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,SAAS;IACxB,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,yBAAyB,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,YAAY,CAAC;AACrB,CAAC"}
|
@@ -1,15 +1,15 @@
|
|
1
|
-
import
|
2
|
-
import { InjectionResult } from "../constants.js";
|
1
|
+
import { InjectionResult, TORRENT_TAG } from "../constants.js";
|
3
2
|
import { CrossSeedError } from "../errors.js";
|
4
3
|
import { Label, logger } from "../logger.js";
|
5
4
|
import { resultOf, resultOfErr } from "../Result.js";
|
6
5
|
import { getRuntimeConfig } from "../runtimeConfig.js";
|
7
|
-
import { extractCredentialsFromUrl } from "../utils.js";
|
6
|
+
import { shouldRecheck, extractCredentialsFromUrl } from "../utils.js";
|
8
7
|
const XTransmissionSessionId = "X-Transmission-Session-Id";
|
9
8
|
function doesAlreadyExist(args) {
|
10
9
|
return "torrent-duplicate" in args;
|
11
10
|
}
|
12
11
|
export default class Transmission {
|
12
|
+
xTransmissionSessionId;
|
13
13
|
async request(method, args = {}, retries = 1) {
|
14
14
|
const { transmissionRpcUrl } = getRuntimeConfig();
|
15
15
|
const { username, password, href } = extractCredentialsFromUrl(transmissionRpcUrl).unwrapOrThrow(new CrossSeedError("Transmission rpc url must be percent-encoded"));
|
@@ -92,25 +92,33 @@ export default class Transmission {
|
|
92
92
|
}
|
93
93
|
return resultOf({ downloadDir });
|
94
94
|
}
|
95
|
-
async
|
95
|
+
async getDownloadDir(searchee) {
|
96
|
+
const result = await this.checkOriginalTorrent(searchee);
|
97
|
+
return result
|
98
|
+
.mapOk((r) => r.downloadDir)
|
99
|
+
.mapErr((err) => (err === "FAILURE" ? "UNKNOWN_ERROR" : err));
|
100
|
+
}
|
101
|
+
async inject(newTorrent, searchee, decision, path) {
|
96
102
|
let downloadDir;
|
97
103
|
if (path) {
|
98
104
|
downloadDir = path;
|
99
105
|
}
|
100
106
|
else {
|
101
|
-
const result = await this.
|
107
|
+
const result = await this.getDownloadDir(searchee);
|
102
108
|
if (result.isErr()) {
|
103
|
-
return
|
109
|
+
return InjectionResult.FAILURE;
|
110
|
+
}
|
111
|
+
else {
|
112
|
+
downloadDir = result.unwrapOrThrow();
|
104
113
|
}
|
105
|
-
downloadDir = result.unwrapOrThrow().downloadDir;
|
106
114
|
}
|
107
115
|
let addResponse;
|
108
116
|
try {
|
109
117
|
addResponse = await this.request("torrent-add", {
|
110
118
|
"download-dir": downloadDir,
|
111
119
|
metainfo: newTorrent.encode().toString("base64"),
|
112
|
-
paused:
|
113
|
-
labels: [
|
120
|
+
paused: shouldRecheck(decision),
|
121
|
+
labels: [TORRENT_TAG],
|
114
122
|
});
|
115
123
|
}
|
116
124
|
catch (e) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Transmission.js","sourceRoot":"","sources":["../../src/clients/Transmission.ts"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"Transmission.js","sourceRoot":"","sources":["../../src/clients/Transmission.ts"],"names":[],"mappings":"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"}
|
package/dist/cmd.js
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
2
|
import chalk from "chalk";
|
3
3
|
import { Option, program } from "commander";
|
4
|
-
import
|
5
|
-
import {
|
6
|
-
import { getApiKeyFromDatabase, resetApiKey } from "./auth.js";
|
4
|
+
import { getApiKey, resetApiKey } from "./auth.js";
|
5
|
+
import { VALIDATION_SCHEMA, customizeErrorMessage } from "./configSchema.js";
|
7
6
|
import { generateConfig, getFileConfig } from "./configuration.js";
|
8
7
|
import { Action, LinkType, MatchMode, PROGRAM_NAME, PROGRAM_VERSION, } from "./constants.js";
|
9
8
|
import { db } from "./db.js";
|
10
9
|
import { diffCmd } from "./diff.js";
|
11
|
-
import { exitOnCrossSeedErrors } from "./errors.js";
|
10
|
+
import { CrossSeedError, exitOnCrossSeedErrors } from "./errors.js";
|
12
11
|
import { jobsLoop } from "./jobs.js";
|
13
|
-
import {
|
12
|
+
import { Label, initializeLogger, logger } from "./logger.js";
|
14
13
|
import { main, scanRssFeeds } from "./pipeline.js";
|
15
14
|
import { initializePushNotifier, sendTestNotification, } from "./pushNotifier.js";
|
16
15
|
import { setRuntimeConfig } from "./runtimeConfig.js";
|
@@ -20,32 +19,54 @@ import "./signalHandlers.js";
|
|
20
19
|
import { doStartupValidation } from "./startup.js";
|
21
20
|
import { parseTorrentFromFilename } from "./torrent.js";
|
22
21
|
import { fallback } from "./utils.js";
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
}
|
33
|
-
}
|
34
|
-
if (options.excludeOlder) {
|
35
|
-
options.excludeOlder = ms(options.excludeOlder);
|
36
|
-
}
|
37
|
-
if (options.excludeRecentSearch) {
|
38
|
-
options.excludeRecentSearch = ms(options.excludeRecentSearch);
|
22
|
+
import { inspect } from "util";
|
23
|
+
let fileConfig;
|
24
|
+
try {
|
25
|
+
fileConfig = await getFileConfig();
|
26
|
+
}
|
27
|
+
catch (e) {
|
28
|
+
if (e instanceof CrossSeedError) {
|
29
|
+
console.error(e.message);
|
30
|
+
process.exit(1);
|
39
31
|
}
|
40
|
-
|
41
|
-
|
32
|
+
throw e;
|
33
|
+
}
|
34
|
+
const apiKeyOption = new Option("--api-key <key>", "Provide your own API key to override the autogenerated one.").default(fileConfig.apiKey);
|
35
|
+
/**
|
36
|
+
* validates and sets RuntimeConfig
|
37
|
+
* @return (the number of errors Zod encountered in the configuration)
|
38
|
+
*/
|
39
|
+
export async function validateAndSetRuntimeConfig(options) {
|
40
|
+
initializeLogger(options);
|
41
|
+
logger.info(`${PROGRAM_NAME} v${PROGRAM_VERSION}`);
|
42
|
+
logger.info("Validating your configuration...");
|
43
|
+
try {
|
44
|
+
options = VALIDATION_SCHEMA.parse(options, {
|
45
|
+
errorMap: customizeErrorMessage,
|
46
|
+
});
|
42
47
|
}
|
43
|
-
|
44
|
-
|
48
|
+
catch ({ errors }) {
|
49
|
+
logger.verbose({
|
50
|
+
label: Label.CONFIGDUMP,
|
51
|
+
message: inspect(options),
|
52
|
+
});
|
53
|
+
errors?.forEach(({ path, message }) => {
|
54
|
+
const urlPath = path[0];
|
55
|
+
const optionLine = path.length === 2
|
56
|
+
? `${path[0]} (position #${path[1] + 1})`
|
57
|
+
: path;
|
58
|
+
logger.error(`${path.length > 0 ? `Option: ${optionLine}` : "Configuration:"}\n\t\t\t\t${message}\n\t\t\t\t(https://www.cross-seed.org/docs/basics/options${urlPath ? `#${urlPath.toLowerCase()}` : ""})\n`);
|
59
|
+
});
|
60
|
+
if (errors?.length > 0) {
|
61
|
+
throw new CrossSeedError(`Your configuration is invalid, please see the ${errors.length > 1 ? "errors" : "error"} above for details.`);
|
62
|
+
}
|
45
63
|
}
|
46
|
-
|
64
|
+
setRuntimeConfig(options);
|
65
|
+
initializePushNotifier();
|
47
66
|
}
|
48
|
-
|
67
|
+
/**
|
68
|
+
* parsing and processing of CLI and config file
|
69
|
+
*/
|
49
70
|
function createCommandWithSharedOptions(name, description) {
|
50
71
|
return program
|
51
72
|
.command(name)
|
@@ -56,54 +77,54 @@ function createCommandWithSharedOptions(name, description) {
|
|
56
77
|
.option("--data-dirs <dirs...>", "Directories to use if searching by data instead of torrents (separated by spaces)",
|
57
78
|
// @ts-expect-error commander supports non-string defaults
|
58
79
|
fallback(fileConfig.dataDirs))
|
59
|
-
.addOption(new Option("--match-mode <mode>", "Safe will only download torrents with perfect matches. Risky will allow for renames and more matches, but might cause false positives")
|
80
|
+
.addOption(new Option("--match-mode <mode>", "Safe will only download torrents with perfect matches. Risky will allow for renames and more matches, but might cause false positives. Partial is like risky but it ignores small files like .nfo/.srt if missing.")
|
60
81
|
.default(fallback(fileConfig.matchMode, MatchMode.SAFE))
|
61
82
|
.choices(Object.values(MatchMode))
|
62
83
|
.makeOptionMandatory())
|
63
|
-
.option("--
|
84
|
+
.option("--link-category <cat>", "Torrent client category to set on linked torrents", fallback(fileConfig.linkCategory, "cross-seed-link"))
|
64
85
|
.option("--link-dir <dir>", "Directory to output data-matched hardlinks to", fileConfig.linkDir)
|
86
|
+
.option("--flat-linking", "Use flat linking directory structure (without individual tracker folders)", fallback(fileConfig.flatLinking, false))
|
65
87
|
.addOption(new Option("--link-type <type>", "Use links of this type to inject data-based matches into your client")
|
66
88
|
.default(fallback(fileConfig.linkType, LinkType.SYMLINK))
|
67
89
|
.choices(Object.values(LinkType))
|
68
90
|
.makeOptionMandatory())
|
69
|
-
.option("--
|
70
|
-
.
|
71
|
-
.
|
72
|
-
.
|
73
|
-
.requiredOption("--include-non-videos", "Include torrents which contain non-video files", fallback(fileConfig.includeNonVideos, false))
|
91
|
+
.option("--max-data-depth <depth>", "Max depth to look for searchees in dataDirs", (n) => parseInt(n), fallback(fileConfig.maxDataDepth, 2))
|
92
|
+
.option("-i, --torrent-dir <dir>", "Directory with torrent files", fileConfig.torrentDir)
|
93
|
+
.option("-s, --output-dir <dir>", "Directory to save results in", fileConfig.outputDir)
|
94
|
+
.option("--include-non-videos", "Include torrents which contain non-video files", fallback(fileConfig.includeNonVideos, false))
|
74
95
|
.option("-e, --include-episodes", "Include all episode torrents in the search (including from season packs)", fallback(fileConfig.includeEpisodes, false))
|
75
96
|
.option("--include-single-episodes", "Include single episode torrents in the search", fallback(fileConfig.includeSingleEpisodes, false))
|
76
97
|
.option("--no-include-non-videos", "Don't include torrents which contain non-videos")
|
77
98
|
.option("--no-include-episodes", "Don't include episode torrents")
|
78
|
-
.
|
99
|
+
.option("--fuzzy-size-threshold <decimal>", "The size difference allowed to be considered a match.", parseFloat, fallback(fileConfig.fuzzySizeThreshold, 0.02))
|
79
100
|
.option("-x, --exclude-older <cutoff>", "Exclude torrents first seen more than n minutes ago. Bypasses the -a flag.", fileConfig.excludeOlder)
|
80
101
|
.option("-r, --exclude-recent-search <cutoff>", "Exclude torrents which have been searched more recently than n minutes ago. Bypasses the -a flag.", fileConfig.excludeRecentSearch)
|
81
|
-
.
|
102
|
+
.option("-v, --verbose", "Log verbose output", false)
|
82
103
|
.addOption(new Option("-A, --action <action>", "If set to 'inject', cross-seed will attempt to add the found torrents to your torrent client.")
|
83
104
|
.default(fallback(fileConfig.action, Action.SAVE))
|
84
|
-
.choices(Object.values(Action))
|
85
|
-
.makeOptionMandatory())
|
105
|
+
.choices(Object.values(Action)))
|
86
106
|
.option("--rtorrent-rpc-url <url>", "The url of your rtorrent XMLRPC interface. Requires '-A inject'. See the docs for more information.", fileConfig.rtorrentRpcUrl)
|
87
107
|
.option("--qbittorrent-url <url>", "The url of your qBittorrent webui. Requires '-A inject'. See the docs for more information.", fileConfig.qbittorrentUrl)
|
88
108
|
.option("--transmission-rpc-url <url>", "The url of your Transmission RPC interface. Requires '-A inject'. See the docs for more information.", fileConfig.transmissionRpcUrl)
|
89
109
|
.option("--deluge-rpc-url <url>", "The url of your Deluge JSON-RPC interface. Requires '-A inject'. See the docs for more information.", fileConfig.delugeRpcUrl)
|
90
|
-
.option("--duplicate-categories", "Create and inject using categories with the same save paths as your normal categories", fileConfig.duplicateCategories)
|
110
|
+
.option("--duplicate-categories", "Create and inject using categories with the same save paths as your normal categories", fallback(fileConfig.duplicateCategories, false))
|
91
111
|
.option("--notification-webhook-url <url>", "cross-seed will send POST requests to this url with a JSON payload of { title, body }", fileConfig.notificationWebhookUrl)
|
92
|
-
.
|
93
|
-
.
|
94
|
-
.
|
95
|
-
.option("--search-limit <number>", "The number of searches before stops", parseInt, fallback(fileConfig.searchLimit, 0))
|
112
|
+
.option("-d, --delay <delay>", "Pause duration (seconds) between searches", parseFloat, fallback(fileConfig.delay, 10))
|
113
|
+
.option("--snatch-timeout <timeout>", "Timeout for unresponsive snatches", fallback(fileConfig.snatchTimeout, "30 seconds"))
|
114
|
+
.option("--search-timeout <timeout>", "Timeout for unresponsive searches", fallback(fileConfig.searchTimeout, "30 seconds"))
|
115
|
+
.option("--search-limit <number>", "The number of searches before stops", parseInt, fallback(fileConfig.searchLimit, 0))
|
116
|
+
.option("--block-list <strings>", "The infohashes and/or strings in torrent name to block from cross-seed",
|
117
|
+
// @ts-expect-error commander supports non-string defaults
|
118
|
+
fallback(fileConfig.blockList, []));
|
96
119
|
}
|
97
120
|
program.name(PROGRAM_NAME);
|
98
|
-
program.description(chalk.yellow.bold(
|
121
|
+
program.description(chalk.yellow.bold(`${PROGRAM_NAME} v${PROGRAM_VERSION}`));
|
99
122
|
program.version(PROGRAM_VERSION, "-V, --version", "output the current version");
|
100
123
|
program
|
101
124
|
.command("gen-config")
|
102
125
|
.description("Generate a config file")
|
103
126
|
.option("-d, --docker", "Generate the docker config instead of the normal one")
|
104
|
-
.action((
|
105
|
-
generateConfig(options);
|
106
|
-
});
|
127
|
+
.action(() => void generateConfig());
|
107
128
|
program
|
108
129
|
.command("clear-cache")
|
109
130
|
.description("Clear the cache of downloaded-and-rejected torrents")
|
@@ -118,13 +139,25 @@ program
|
|
118
139
|
});
|
119
140
|
await db.destroy();
|
120
141
|
});
|
142
|
+
program
|
143
|
+
.command("clear-indexer-failures")
|
144
|
+
.description("Clear the cached details of indexers (failures and caps)")
|
145
|
+
.action(async () => {
|
146
|
+
console.log("If you've received a '429' (rate-limiting), continuing to hammer", "your indexers may result in negative consequences.");
|
147
|
+
console.log("If you have to do this more than once in a short", "period of time, you have bigger issues that need to be addressed.");
|
148
|
+
await db("indexer").update({
|
149
|
+
status: null,
|
150
|
+
retry_after: null,
|
151
|
+
});
|
152
|
+
await db.destroy();
|
153
|
+
});
|
121
154
|
program
|
122
155
|
.command("test-notification")
|
123
156
|
.description("Send a test notification")
|
124
157
|
.requiredOption("--notification-webhook-url <url>", "cross-seed will send POST requests to this url with a JSON payload of { title, body }", fileConfig.notificationWebhookUrl)
|
125
158
|
.action((options) => {
|
126
159
|
setRuntimeConfig(options);
|
127
|
-
initializeLogger();
|
160
|
+
initializeLogger(options);
|
128
161
|
initializePushNotifier();
|
129
162
|
sendTestNotification();
|
130
163
|
});
|
@@ -144,9 +177,11 @@ program
|
|
144
177
|
program
|
145
178
|
.command("api-key")
|
146
179
|
.description("Show the api key")
|
147
|
-
.
|
180
|
+
.addOption(apiKeyOption)
|
181
|
+
.action(async (options) => {
|
182
|
+
setRuntimeConfig(options);
|
148
183
|
await db.migrate.latest();
|
149
|
-
console.log(await
|
184
|
+
console.log(await getApiKey());
|
150
185
|
await db.destroy();
|
151
186
|
});
|
152
187
|
program
|
@@ -160,22 +195,13 @@ program
|
|
160
195
|
createCommandWithSharedOptions("daemon", "Start the cross-seed daemon")
|
161
196
|
.option("-p, --port <port>", "Listen on a custom port", (n) => parseInt(n), fallback(fileConfig.port, 2468))
|
162
197
|
.option("--host <host>", "Bind to a specific IP address", fileConfig.host)
|
163
|
-
.option("--api-auth", "Require API auth via API key", fallback(fileConfig.apiAuth, false))
|
164
|
-
.option("--no-api-auth", "Don't require API auth")
|
165
198
|
.option("--no-port", "Do not listen on any port")
|
166
199
|
.option("--search-cadence <cadence>", "Run searches on a schedule. Format: https://github.com/vercel/ms", fileConfig.searchCadence)
|
167
200
|
.option("--rss-cadence <cadence>", "Run an rss scan on a schedule. Format: https://github.com/vercel/ms", fileConfig.rssCadence)
|
201
|
+
.addOption(apiKeyOption)
|
168
202
|
.action(async (options) => {
|
169
203
|
try {
|
170
|
-
|
171
|
-
setRuntimeConfig(runtimeConfig);
|
172
|
-
initializeLogger();
|
173
|
-
initializePushNotifier();
|
174
|
-
logger.info(`${PROGRAM_NAME} v${PROGRAM_VERSION}`);
|
175
|
-
logger.verbose({
|
176
|
-
label: Label.CONFIGDUMP,
|
177
|
-
message: inspect(runtimeConfig),
|
178
|
-
});
|
204
|
+
await validateAndSetRuntimeConfig(options);
|
179
205
|
await db.migrate.latest();
|
180
206
|
await doStartupValidation();
|
181
207
|
serve(options.port, options.host);
|
@@ -188,14 +214,7 @@ createCommandWithSharedOptions("daemon", "Start the cross-seed daemon")
|
|
188
214
|
});
|
189
215
|
createCommandWithSharedOptions("rss", "Run an rss scan").action(async (options) => {
|
190
216
|
try {
|
191
|
-
|
192
|
-
setRuntimeConfig(runtimeConfig);
|
193
|
-
initializeLogger();
|
194
|
-
initializePushNotifier();
|
195
|
-
logger.verbose({
|
196
|
-
label: Label.CONFIGDUMP,
|
197
|
-
message: inspect(runtimeConfig),
|
198
|
-
});
|
217
|
+
await validateAndSetRuntimeConfig(options);
|
199
218
|
await db.migrate.latest();
|
200
219
|
await doStartupValidation();
|
201
220
|
await scanRssFeeds();
|
@@ -210,14 +229,7 @@ createCommandWithSharedOptions("search", "Search for cross-seeds")
|
|
210
229
|
.addOption(new Option("--torrents <torrents...>", "torrent files separated by spaces").hideHelp())
|
211
230
|
.action(async (options) => {
|
212
231
|
try {
|
213
|
-
|
214
|
-
setRuntimeConfig(runtimeConfig);
|
215
|
-
initializeLogger();
|
216
|
-
initializePushNotifier();
|
217
|
-
logger.verbose({
|
218
|
-
label: Label.CONFIGDUMP,
|
219
|
-
message: inspect(runtimeConfig),
|
220
|
-
});
|
232
|
+
await validateAndSetRuntimeConfig(options);
|
221
233
|
await db.migrate.latest();
|
222
234
|
await doStartupValidation();
|
223
235
|
await main();
|
package/dist/cmd.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cmd.js","sourceRoot":"","sources":["../src/cmd.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"cmd.js","sourceRoot":"","sources":["../src/cmd.ts"],"names":[],"mappings":"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"}
|