cross-seed 5.9.2 → 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 +26 -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 +91 -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/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/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}` : ""})\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,55 @@ 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
84
|
.option("--data-category <cat>", "Category to assign torrents from data-based matching", fallback(fileConfig.dataCategory, "cross-seed-data"))
|
64
85
|
.option("--link-dir <dir>", "Directory to output data-matched hardlinks to", fileConfig.linkDir)
|
86
|
+
.option("--legacy-linking", "Use flat linking directory structure (without individual tracker folders)", fallback(fileConfig.legacyLinking, 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
91
|
.option("--skip-recheck", "Skips torrent recheck upon adding to QBittorrent", fallback(fileConfig.skipRecheck, false))
|
70
|
-
.
|
71
|
-
.
|
72
|
-
.
|
73
|
-
.
|
92
|
+
.option("--max-data-depth <depth>", "Max depth to look for searchees in dataDirs", (n) => parseInt(n), fallback(fileConfig.maxDataDepth, 2))
|
93
|
+
.option("-i, --torrent-dir <dir>", "Directory with torrent files", fileConfig.torrentDir)
|
94
|
+
.option("-s, --output-dir <dir>", "Directory to save results in", fileConfig.outputDir)
|
95
|
+
.option("--include-non-videos", "Include torrents which contain non-video files", fallback(fileConfig.includeNonVideos, false))
|
74
96
|
.option("-e, --include-episodes", "Include all episode torrents in the search (including from season packs)", fallback(fileConfig.includeEpisodes, false))
|
75
97
|
.option("--include-single-episodes", "Include single episode torrents in the search", fallback(fileConfig.includeSingleEpisodes, false))
|
76
98
|
.option("--no-include-non-videos", "Don't include torrents which contain non-videos")
|
77
99
|
.option("--no-include-episodes", "Don't include episode torrents")
|
78
|
-
.
|
100
|
+
.option("--fuzzy-size-threshold <decimal>", "The size difference allowed to be considered a match.", parseFloat, fallback(fileConfig.fuzzySizeThreshold, 0.02))
|
79
101
|
.option("-x, --exclude-older <cutoff>", "Exclude torrents first seen more than n minutes ago. Bypasses the -a flag.", fileConfig.excludeOlder)
|
80
102
|
.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
|
-
.
|
103
|
+
.option("-v, --verbose", "Log verbose output", false)
|
82
104
|
.addOption(new Option("-A, --action <action>", "If set to 'inject', cross-seed will attempt to add the found torrents to your torrent client.")
|
83
105
|
.default(fallback(fileConfig.action, Action.SAVE))
|
84
|
-
.choices(Object.values(Action))
|
85
|
-
.makeOptionMandatory())
|
106
|
+
.choices(Object.values(Action)))
|
86
107
|
.option("--rtorrent-rpc-url <url>", "The url of your rtorrent XMLRPC interface. Requires '-A inject'. See the docs for more information.", fileConfig.rtorrentRpcUrl)
|
87
108
|
.option("--qbittorrent-url <url>", "The url of your qBittorrent webui. Requires '-A inject'. See the docs for more information.", fileConfig.qbittorrentUrl)
|
88
109
|
.option("--transmission-rpc-url <url>", "The url of your Transmission RPC interface. Requires '-A inject'. See the docs for more information.", fileConfig.transmissionRpcUrl)
|
89
110
|
.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)
|
111
|
+
.option("--duplicate-categories", "Create and inject using categories with the same save paths as your normal categories", fallback(fileConfig.duplicateCategories, false))
|
91
112
|
.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))
|
113
|
+
.option("-d, --delay <delay>", "Pause duration (seconds) between searches", parseFloat, fallback(fileConfig.delay, 10))
|
114
|
+
.option("--snatch-timeout <timeout>", "Timeout for unresponsive snatches", fallback(fileConfig.snatchTimeout, "30 seconds"))
|
115
|
+
.option("--search-timeout <timeout>", "Timeout for unresponsive searches", fallback(fileConfig.searchTimeout, "30 seconds"))
|
116
|
+
.option("--search-limit <number>", "The number of searches before stops", parseInt, fallback(fileConfig.searchLimit, 0))
|
117
|
+
.option("--block-list <strings>", "The infohashes and/or strings in torrent name to block from cross-seed",
|
118
|
+
// @ts-expect-error commander supports non-string defaults
|
119
|
+
fallback(fileConfig.blockList, []));
|
96
120
|
}
|
97
121
|
program.name(PROGRAM_NAME);
|
98
|
-
program.description(chalk.yellow.bold(
|
122
|
+
program.description(chalk.yellow.bold(`${PROGRAM_NAME} v${PROGRAM_VERSION}`));
|
99
123
|
program.version(PROGRAM_VERSION, "-V, --version", "output the current version");
|
100
124
|
program
|
101
125
|
.command("gen-config")
|
102
126
|
.description("Generate a config file")
|
103
127
|
.option("-d, --docker", "Generate the docker config instead of the normal one")
|
104
|
-
.action((
|
105
|
-
generateConfig(options);
|
106
|
-
});
|
128
|
+
.action(() => void generateConfig());
|
107
129
|
program
|
108
130
|
.command("clear-cache")
|
109
131
|
.description("Clear the cache of downloaded-and-rejected torrents")
|
@@ -124,7 +146,7 @@ program
|
|
124
146
|
.requiredOption("--notification-webhook-url <url>", "cross-seed will send POST requests to this url with a JSON payload of { title, body }", fileConfig.notificationWebhookUrl)
|
125
147
|
.action((options) => {
|
126
148
|
setRuntimeConfig(options);
|
127
|
-
initializeLogger();
|
149
|
+
initializeLogger(options);
|
128
150
|
initializePushNotifier();
|
129
151
|
sendTestNotification();
|
130
152
|
});
|
@@ -144,9 +166,11 @@ program
|
|
144
166
|
program
|
145
167
|
.command("api-key")
|
146
168
|
.description("Show the api key")
|
147
|
-
.
|
169
|
+
.addOption(apiKeyOption)
|
170
|
+
.action(async (options) => {
|
171
|
+
setRuntimeConfig(options);
|
148
172
|
await db.migrate.latest();
|
149
|
-
console.log(await
|
173
|
+
console.log(await getApiKey());
|
150
174
|
await db.destroy();
|
151
175
|
});
|
152
176
|
program
|
@@ -160,22 +184,13 @@ program
|
|
160
184
|
createCommandWithSharedOptions("daemon", "Start the cross-seed daemon")
|
161
185
|
.option("-p, --port <port>", "Listen on a custom port", (n) => parseInt(n), fallback(fileConfig.port, 2468))
|
162
186
|
.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
187
|
.option("--no-port", "Do not listen on any port")
|
166
188
|
.option("--search-cadence <cadence>", "Run searches on a schedule. Format: https://github.com/vercel/ms", fileConfig.searchCadence)
|
167
189
|
.option("--rss-cadence <cadence>", "Run an rss scan on a schedule. Format: https://github.com/vercel/ms", fileConfig.rssCadence)
|
190
|
+
.addOption(apiKeyOption)
|
168
191
|
.action(async (options) => {
|
169
192
|
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
|
-
});
|
193
|
+
await validateAndSetRuntimeConfig(options);
|
179
194
|
await db.migrate.latest();
|
180
195
|
await doStartupValidation();
|
181
196
|
serve(options.port, options.host);
|
@@ -188,14 +203,7 @@ createCommandWithSharedOptions("daemon", "Start the cross-seed daemon")
|
|
188
203
|
});
|
189
204
|
createCommandWithSharedOptions("rss", "Run an rss scan").action(async (options) => {
|
190
205
|
try {
|
191
|
-
|
192
|
-
setRuntimeConfig(runtimeConfig);
|
193
|
-
initializeLogger();
|
194
|
-
initializePushNotifier();
|
195
|
-
logger.verbose({
|
196
|
-
label: Label.CONFIGDUMP,
|
197
|
-
message: inspect(runtimeConfig),
|
198
|
-
});
|
206
|
+
await validateAndSetRuntimeConfig(options);
|
199
207
|
await db.migrate.latest();
|
200
208
|
await doStartupValidation();
|
201
209
|
await scanRssFeeds();
|
@@ -210,14 +218,7 @@ createCommandWithSharedOptions("search", "Search for cross-seeds")
|
|
210
218
|
.addOption(new Option("--torrents <torrents...>", "torrent files separated by spaces").hideHelp())
|
211
219
|
.action(async (options) => {
|
212
220
|
try {
|
213
|
-
|
214
|
-
setRuntimeConfig(runtimeConfig);
|
215
|
-
initializeLogger();
|
216
|
-
initializePushNotifier();
|
217
|
-
logger.verbose({
|
218
|
-
label: Label.CONFIGDUMP,
|
219
|
-
message: inspect(runtimeConfig),
|
220
|
-
});
|
221
|
+
await validateAndSetRuntimeConfig(options);
|
221
222
|
await db.migrate.latest();
|
222
223
|
await doStartupValidation();
|
223
224
|
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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"}
|