cross-seed 3.4.2 → 4.0.2
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 +14 -93
- package/dist/action.js +48 -0
- package/dist/action.js.map +1 -0
- package/dist/cache.js +13 -0
- package/dist/cache.js.map +1 -0
- package/dist/cmd.js +34 -23
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +38 -21
- package/dist/config.template.cjs.map +1 -1
- package/dist/config.template.docker.cjs +41 -23
- package/dist/config.template.docker.cjs.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/db.js +11 -28
- package/dist/db.js.map +1 -1
- package/dist/decide.js +37 -21
- package/dist/decide.js.map +1 -1
- package/dist/errors.js +8 -0
- package/dist/errors.js.map +1 -1
- package/dist/jobs.js +73 -0
- package/dist/jobs.js.map +1 -0
- package/dist/logger.js +6 -2
- package/dist/logger.js.map +1 -1
- package/dist/migrations/00-initialSchema.js +75 -0
- package/dist/migrations/00-initialSchema.js.map +1 -0
- package/dist/migrations/01-jobs.js +17 -0
- package/dist/migrations/01-jobs.js.map +1 -0
- package/dist/migrations/migrations.js +9 -0
- package/dist/migrations/migrations.js.map +1 -0
- package/dist/pipeline.js +76 -95
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +20 -18
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +37 -0
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js +0 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/server.js +5 -4
- package/dist/server.js.map +1 -1
- package/dist/signalHandlers.js +7 -2
- package/dist/signalHandlers.js.map +1 -1
- package/dist/startup.js +0 -2
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +26 -13
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +2 -2
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +16 -4
- package/dist/utils.js.map +1 -1
- package/package.json +5 -3
- package/dist/jackett.js +0 -64
- package/dist/jackett.js.map +0 -1
package/dist/pipeline.js
CHANGED
@@ -1,65 +1,32 @@
|
|
1
1
|
import chalk from "chalk";
|
2
2
|
import fs from "fs";
|
3
|
-
import {
|
4
|
-
import {
|
5
|
-
import
|
3
|
+
import { zip } from "lodash-es";
|
4
|
+
import { performAction, performActions } from "./action.js";
|
5
|
+
import { Decision, InjectionResult, SaveResult, } from "./constants.js";
|
6
|
+
import { db } from "./db.js";
|
6
7
|
import { assessCandidate } from "./decide.js";
|
7
|
-
import { searchJackett } from "./jackett.js";
|
8
8
|
import { Label, logger } from "./logger.js";
|
9
9
|
import { filterByContent, filterDupes, filterTimestamps } from "./preFilter.js";
|
10
|
-
import {
|
10
|
+
import { sendResultsNotification } from "./pushNotifier.js";
|
11
11
|
import { EmptyNonceOptions, getRuntimeConfig, } from "./runtimeConfig.js";
|
12
12
|
import { createSearcheeFromMetafile, createSearcheeFromTorrentFile, } from "./searchee.js";
|
13
|
-
import { getInfoHashesToExclude, getTorrentByCriteria,
|
13
|
+
import { getInfoHashesToExclude, getTorrentByCriteria, indexNewTorrents, loadTorrentDirLight, } from "./torrent.js";
|
14
14
|
import { getTorznabManager } from "./torznab.js";
|
15
|
-
import {
|
16
|
-
async function performAction(meta, searchee, tracker, nonceOptions, tag) {
|
17
|
-
const { action } = getRuntimeConfig();
|
18
|
-
let isTorrentIncomplete;
|
19
|
-
const styledName = chalk.green.bold(meta.name);
|
20
|
-
const styledTracker = chalk.bold(tracker);
|
21
|
-
if (action === Action.INJECT) {
|
22
|
-
const result = await getClient().inject(meta, searchee, nonceOptions);
|
23
|
-
switch (result) {
|
24
|
-
case InjectionResult.SUCCESS:
|
25
|
-
logger.info(`Found ${styledName} on ${styledTracker} - injected`);
|
26
|
-
break;
|
27
|
-
case InjectionResult.ALREADY_EXISTS:
|
28
|
-
logger.info(`Found ${styledName} on ${styledTracker} - exists`);
|
29
|
-
break;
|
30
|
-
case InjectionResult.TORRENT_NOT_COMPLETE:
|
31
|
-
logger.warn(`Found ${styledName} on ${styledTracker} - skipping incomplete torrent`);
|
32
|
-
isTorrentIncomplete = true;
|
33
|
-
break;
|
34
|
-
case InjectionResult.FAILURE:
|
35
|
-
default:
|
36
|
-
logger.error(`Found ${styledName} on ${styledTracker} - failed to inject, saving instead`);
|
37
|
-
saveTorrentFile(tracker, tag, meta, nonceOptions);
|
38
|
-
break;
|
39
|
-
}
|
40
|
-
}
|
41
|
-
else {
|
42
|
-
saveTorrentFile(tracker, tag, meta, nonceOptions);
|
43
|
-
logger.info(`Found ${styledName} on ${styledTracker}`);
|
44
|
-
}
|
45
|
-
return { isTorrentIncomplete };
|
46
|
-
}
|
47
|
-
async function searchJackettOrTorznab(name, nonceOptions) {
|
48
|
-
const { torznab } = getRuntimeConfig();
|
49
|
-
return torznab
|
50
|
-
? getTorznabManager().searchTorznab(name, nonceOptions)
|
51
|
-
: searchJackett(name, nonceOptions);
|
52
|
-
}
|
15
|
+
import { filterAsync, ok, stripExtension } from "./utils.js";
|
53
16
|
async function findOnOtherSites(searchee, hashesToExclude, nonceOptions = EmptyNonceOptions) {
|
54
17
|
const assessEach = async (result) => ({
|
55
18
|
assessment: await assessCandidate(result, searchee, hashesToExclude),
|
56
19
|
tracker: result.tracker,
|
57
20
|
});
|
58
|
-
const tag = getTag(searchee.name);
|
59
21
|
const query = stripExtension(searchee.name);
|
22
|
+
// make sure searchee is in database
|
23
|
+
await db("searchee")
|
24
|
+
.insert({ name: searchee.name })
|
25
|
+
.onConflict("name")
|
26
|
+
.ignore();
|
60
27
|
let response;
|
61
28
|
try {
|
62
|
-
response = await
|
29
|
+
response = await getTorznabManager().searchTorznab(query, nonceOptions);
|
63
30
|
}
|
64
31
|
catch (e) {
|
65
32
|
logger.error(`error searching for ${query}`);
|
@@ -67,46 +34,33 @@ async function findOnOtherSites(searchee, hashesToExclude, nonceOptions = EmptyN
|
|
67
34
|
}
|
68
35
|
const results = response;
|
69
36
|
const loaded = await Promise.all(results.map(assessEach));
|
70
|
-
const
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
type: "conjunction",
|
77
|
-
}).format(successful.map((s) => s.tracker))}`
|
78
|
-
: ""}`,
|
79
|
-
extra: {
|
80
|
-
infoHashes: successful.map((s) => s.assessment.info.infoHash),
|
81
|
-
trackers: successful.map((s) => s.tracker),
|
82
|
-
},
|
83
|
-
});
|
84
|
-
for (const { tracker, assessment } of successful) {
|
85
|
-
const { isTorrentIncomplete } = await performAction(assessment.info, searchee, tracker, nonceOptions, tag);
|
86
|
-
if (isTorrentIncomplete)
|
87
|
-
return successful.length;
|
37
|
+
const matches = loaded.filter((e) => e.assessment.decision === Decision.MATCH);
|
38
|
+
const actionResults = await performActions(searchee, matches, nonceOptions);
|
39
|
+
if (!actionResults.includes(InjectionResult.TORRENT_NOT_COMPLETE)) {
|
40
|
+
const zipped = zip(matches.map((m) => m.assessment), matches.map((m) => m.tracker), actionResults);
|
41
|
+
sendResultsNotification(searchee, zipped, Label.SEARCH);
|
42
|
+
await updateSearchTimestamps(searchee.name);
|
88
43
|
}
|
89
|
-
|
90
|
-
return successful.length;
|
44
|
+
return matches.length;
|
91
45
|
}
|
92
|
-
function updateSearchTimestamps(name) {
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
46
|
+
async function updateSearchTimestamps(name) {
|
47
|
+
await db.transaction(async (trx) => {
|
48
|
+
const now = Date.now();
|
49
|
+
const entry = await trx("searchee").where({ name }).first();
|
50
|
+
await trx("searchee")
|
51
|
+
.where({ name })
|
52
|
+
.update({
|
53
|
+
last_searched: now,
|
54
|
+
first_searched: (entry === null || entry === void 0 ? void 0 : entry.first_searched) ? undefined : now,
|
55
|
+
});
|
56
|
+
});
|
103
57
|
}
|
104
58
|
async function findMatchesBatch(samples, hashesToExclude) {
|
105
|
-
const { delay
|
59
|
+
const { delay } = getRuntimeConfig();
|
106
60
|
let totalFound = 0;
|
107
61
|
for (const [i, sample] of samples.entries()) {
|
108
62
|
const sleep = new Promise((r) => setTimeout(r, delay * 1000));
|
109
|
-
const progress = chalk.blue(`[${i + 1
|
63
|
+
const progress = chalk.blue(`[${i + 1}/${samples.length}]`);
|
110
64
|
const name = stripExtension(sample.name);
|
111
65
|
logger.info("%s %s %s", progress, chalk.dim("Searching for"), name);
|
112
66
|
const numFoundPromise = findOnOtherSites(sample, hashesToExclude);
|
@@ -117,7 +71,7 @@ async function findMatchesBatch(samples, hashesToExclude) {
|
|
117
71
|
}
|
118
72
|
export async function searchForLocalTorrentByCriteria(criteria, nonceOptions) {
|
119
73
|
const meta = await getTorrentByCriteria(criteria);
|
120
|
-
const hashesToExclude = getInfoHashesToExclude();
|
74
|
+
const hashesToExclude = await getInfoHashesToExclude();
|
121
75
|
if (!filterByContent(meta))
|
122
76
|
return null;
|
123
77
|
return findOnOtherSites(meta, hashesToExclude, nonceOptions);
|
@@ -129,23 +83,29 @@ export async function checkNewCandidateMatch(candidate) {
|
|
129
83
|
}
|
130
84
|
catch (e) {
|
131
85
|
logger.verbose({
|
132
|
-
label: Label.
|
86
|
+
label: Label.REVERSE_LOOKUP,
|
133
87
|
message: `Did not find an existing entry for ${candidate.name}`,
|
134
88
|
});
|
135
89
|
return false;
|
136
90
|
}
|
137
|
-
const hashesToExclude = getInfoHashesToExclude();
|
91
|
+
const hashesToExclude = await getInfoHashesToExclude();
|
138
92
|
if (!filterByContent(meta))
|
139
93
|
return false;
|
140
94
|
const searchee = createSearcheeFromMetafile(meta);
|
95
|
+
// make sure searchee is in database
|
96
|
+
await db("searchee")
|
97
|
+
.insert({ name: searchee.name })
|
98
|
+
.onConflict("name")
|
99
|
+
.ignore();
|
141
100
|
const assessment = await assessCandidate(candidate, searchee, hashesToExclude);
|
142
101
|
if (assessment.decision !== Decision.MATCH)
|
143
102
|
return false;
|
144
|
-
const
|
145
|
-
|
103
|
+
const result = await performAction(assessment.metafile, searchee, candidate.tracker, EmptyNonceOptions);
|
104
|
+
await sendResultsNotification(searchee, [[assessment, candidate.tracker, result]], Label.REVERSE_LOOKUP);
|
105
|
+
return result === InjectionResult.SUCCESS || result === SaveResult.SAVED;
|
146
106
|
}
|
147
107
|
async function findSearchableTorrents() {
|
148
|
-
const {
|
108
|
+
const { torrents } = getRuntimeConfig();
|
149
109
|
let parsedTorrents;
|
150
110
|
if (Array.isArray(torrents)) {
|
151
111
|
const searcheeResults = await Promise.all(torrents.map(createSearcheeFromTorrentFile));
|
@@ -157,20 +117,41 @@ async function findSearchableTorrents() {
|
|
157
117
|
const hashesToExclude = parsedTorrents
|
158
118
|
.map((t) => t.infoHash)
|
159
119
|
.filter(Boolean);
|
160
|
-
const filteredTorrents = filterDupes(parsedTorrents)
|
161
|
-
|
162
|
-
.
|
163
|
-
|
164
|
-
|
165
|
-
return { samples, hashesToExclude };
|
120
|
+
const filteredTorrents = await filterAsync(filterDupes(parsedTorrents).filter(filterByContent), filterTimestamps);
|
121
|
+
logger.info({
|
122
|
+
label: Label.SEARCH,
|
123
|
+
message: `Found ${parsedTorrents.length} torrents, ${filteredTorrents.length} suitable to search for matches`,
|
124
|
+
});
|
125
|
+
return { samples: filteredTorrents, hashesToExclude };
|
166
126
|
}
|
167
127
|
export async function main() {
|
168
|
-
const {
|
128
|
+
const { outputDir } = getRuntimeConfig();
|
169
129
|
const { samples, hashesToExclude } = await findSearchableTorrents();
|
170
|
-
if (offset > 0)
|
171
|
-
logger.info(`Starting at offset ${offset}`);
|
172
130
|
fs.mkdirSync(outputDir, { recursive: true });
|
173
131
|
const totalFound = await findMatchesBatch(samples, hashesToExclude);
|
174
|
-
logger.info(
|
132
|
+
logger.info({
|
133
|
+
label: Label.SEARCH,
|
134
|
+
message: chalk.cyan(`Found ${chalk.bold.white(totalFound)} cross seeds from ${chalk.bold.white(samples.length)} original torrents`),
|
135
|
+
});
|
136
|
+
}
|
137
|
+
export async function scanRssFeeds() {
|
138
|
+
const candidates = await getTorznabManager().searchTorznab("");
|
139
|
+
logger.verbose({
|
140
|
+
label: Label.RSS,
|
141
|
+
message: `Scan returned ${candidates.length} results`,
|
142
|
+
});
|
143
|
+
logger.verbose({
|
144
|
+
label: Label.RSS,
|
145
|
+
message: "Indexing new torrents...",
|
146
|
+
});
|
147
|
+
await indexNewTorrents();
|
148
|
+
for (const [i, candidate] of candidates.entries()) {
|
149
|
+
logger.verbose({
|
150
|
+
label: Label.RSS,
|
151
|
+
message: `Processing release ${i + 1}/${candidates.length}`,
|
152
|
+
});
|
153
|
+
await checkNewCandidateMatch(candidate);
|
154
|
+
}
|
155
|
+
logger.info({ label: Label.RSS, message: "Scan complete" });
|
175
156
|
}
|
176
157
|
//# sourceMappingURL=pipeline.js.map
|
package/dist/pipeline.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/preFilter.js
CHANGED
@@ -1,29 +1,26 @@
|
|
1
1
|
import { uniqBy } from "lodash-es";
|
2
2
|
import path from "path";
|
3
3
|
import { EP_REGEX, EXTENSIONS } from "./constants.js";
|
4
|
-
import db from "./db.js";
|
5
4
|
import { Label, logger } from "./logger.js";
|
6
5
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
7
|
-
import {
|
6
|
+
import { db } from "./db.js";
|
7
|
+
import { nMsAgo } from "./utils.js";
|
8
8
|
const extensionsWithDots = EXTENSIONS.map((e) => `.${e}`);
|
9
9
|
export function filterByContent(searchee) {
|
10
|
-
const { includeEpisodes,
|
11
|
-
if (searchAll)
|
12
|
-
return true;
|
10
|
+
const { includeEpisodes, includeNonVideos } = getRuntimeConfig();
|
13
11
|
function logReason(reason) {
|
14
12
|
logger.verbose({
|
15
13
|
label: Label.PREFILTER,
|
16
14
|
message: `Torrent ${searchee.name} was not selected for searching because ${reason}`,
|
17
15
|
});
|
18
16
|
}
|
19
|
-
|
20
|
-
|
21
|
-
EP_REGEX.test(searchee.files[0].name)) {
|
17
|
+
const isSingleEpisodeTorrent = searchee.files.length === 1 && EP_REGEX.test(searchee.files[0].name);
|
18
|
+
if (!includeEpisodes && isSingleEpisodeTorrent) {
|
22
19
|
logReason("it is a single episode");
|
23
20
|
return false;
|
24
21
|
}
|
25
|
-
const
|
26
|
-
if (!
|
22
|
+
const allFilesAreVideos = searchee.files.every((file) => extensionsWithDots.includes(path.extname(file.name)));
|
23
|
+
if (!includeNonVideos && !allFilesAreVideos) {
|
27
24
|
logReason("not all files are videos");
|
28
25
|
return false;
|
29
26
|
}
|
@@ -40,25 +37,30 @@ export function filterDupes(searchees) {
|
|
40
37
|
}
|
41
38
|
return filtered;
|
42
39
|
}
|
43
|
-
export function filterTimestamps(searchee) {
|
40
|
+
export async function filterTimestamps(searchee) {
|
44
41
|
const { excludeOlder, excludeRecentSearch } = getRuntimeConfig();
|
45
|
-
const
|
46
|
-
|
42
|
+
const timestampDataSql = await db("searchee")
|
43
|
+
.where({ name: searchee.name })
|
44
|
+
.first();
|
45
|
+
if (!timestampDataSql)
|
47
46
|
return true;
|
48
|
-
const {
|
47
|
+
const { first_searched, last_searched } = timestampDataSql;
|
49
48
|
function logReason(reason) {
|
50
49
|
logger.verbose({
|
51
50
|
label: Label.PREFILTER,
|
52
51
|
message: `Torrent ${searchee.name} was not selected for searching because ${reason}`,
|
53
52
|
});
|
54
53
|
}
|
55
|
-
if (excludeOlder &&
|
56
|
-
|
54
|
+
if (excludeOlder &&
|
55
|
+
first_searched &&
|
56
|
+
first_searched < nMsAgo(excludeOlder)) {
|
57
|
+
logReason(`its first search timestamp ${first_searched} is older than ${excludeOlder} minutes ago`);
|
57
58
|
return false;
|
58
59
|
}
|
59
60
|
if (excludeRecentSearch &&
|
60
|
-
|
61
|
-
|
61
|
+
last_searched &&
|
62
|
+
last_searched > nMsAgo(excludeRecentSearch)) {
|
63
|
+
logReason(`its last search timestamp ${last_searched} is newer than ${excludeRecentSearch} minutes ago`);
|
62
64
|
return false;
|
63
65
|
}
|
64
66
|
return true;
|
package/dist/preFilter.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"preFilter.js","sourceRoot":"","sources":["../src/preFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"preFilter.js","sourceRoot":"","sources":["../src/preFilter.ts"],"names":[],"mappings":"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"}
|
package/dist/pushNotifier.js
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import fetch from "node-fetch";
|
2
|
+
import { InjectionResult, SaveResult } from "./constants.js";
|
2
3
|
import { logger } from "./logger.js";
|
3
4
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
4
5
|
export let pushNotifier;
|
@@ -12,10 +13,46 @@ export class PushNotifier {
|
|
12
13
|
method: "POST",
|
13
14
|
headers: { "Content-Type": "application/json" },
|
14
15
|
body: JSON.stringify({ title, body, ...rest }),
|
16
|
+
}).catch(() => {
|
17
|
+
logger.error({ message: "" });
|
15
18
|
});
|
16
19
|
}
|
17
20
|
}
|
18
21
|
}
|
22
|
+
function formatTrackersAsList(trackers) {
|
23
|
+
// @ts-expect-error Intl.ListFormat totally exists on node 12
|
24
|
+
return new Intl.ListFormat("en", {
|
25
|
+
style: "long",
|
26
|
+
type: "conjunction",
|
27
|
+
}).format(trackers);
|
28
|
+
}
|
29
|
+
export function sendResultsNotification(searchee, results, source) {
|
30
|
+
const name = searchee.name;
|
31
|
+
const notableSuccesses = results.filter(([, , actionResult]) => actionResult === InjectionResult.SUCCESS ||
|
32
|
+
actionResult === SaveResult.SAVED);
|
33
|
+
const failures = results.filter(([, , actionResult]) => actionResult === InjectionResult.FAILURE);
|
34
|
+
if (notableSuccesses.length) {
|
35
|
+
const name = searchee.name;
|
36
|
+
const numTrackers = notableSuccesses.length;
|
37
|
+
const infoHashes = notableSuccesses.map(([assessment]) => assessment.metafile.infoHash);
|
38
|
+
const trackers = notableSuccesses.map(([, tracker]) => tracker);
|
39
|
+
const trackersListStr = formatTrackersAsList(trackers);
|
40
|
+
pushNotifier.notify({
|
41
|
+
body: `${source}: Injected ${name} from ${numTrackers} trackers: ${trackersListStr}`,
|
42
|
+
extra: { infoHashes, trackers },
|
43
|
+
});
|
44
|
+
}
|
45
|
+
if (failures.length) {
|
46
|
+
const numTrackers = failures.length;
|
47
|
+
const infoHashes = failures.map(([assessment]) => assessment.metafile.infoHash);
|
48
|
+
const trackers = failures.map(([, tracker]) => tracker);
|
49
|
+
const trackersListStr = formatTrackersAsList(trackers);
|
50
|
+
pushNotifier.notify({
|
51
|
+
body: `Failed to inject ${name} from ${numTrackers} trackers: ${trackersListStr}`,
|
52
|
+
extra: { infoHashes, trackers },
|
53
|
+
});
|
54
|
+
}
|
55
|
+
}
|
19
56
|
export function initializePushNotifier() {
|
20
57
|
const { notificationWebhookUrl } = getRuntimeConfig();
|
21
58
|
pushNotifier = new PushNotifier(notificationWebhookUrl);
|
package/dist/pushNotifier.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"pushNotifier.js","sourceRoot":"","sources":["../src/pushNotifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
1
|
+
{"version":3,"file":"pushNotifier.js","sourceRoot":"","sources":["../src/pushNotifier.ts"],"names":[],"mappings":"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"}
|
package/dist/runtimeConfig.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"runtimeConfig.js","sourceRoot":"","sources":["../src/runtimeConfig.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"runtimeConfig.js","sourceRoot":"","sources":["../src/runtimeConfig.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAChC,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;CACpB,CAAC;AAEF,IAAI,aAA4B,CAAC;AAEjC,MAAM,UAAU,gBAAgB,CAAC,SAAwB;IACxD,aAAa,GAAG,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC/B,OAAO,aAAa,CAAC;AACtB,CAAC"}
|
package/dist/server.js
CHANGED
@@ -4,6 +4,7 @@ import { parse as qsParse } from "querystring";
|
|
4
4
|
import { inspect } from "util";
|
5
5
|
import { Label, logger } from "./logger.js";
|
6
6
|
import { checkNewCandidateMatch, searchForLocalTorrentByCriteria, } from "./pipeline.js";
|
7
|
+
import { indexNewTorrents } from "./torrent.js";
|
7
8
|
function getData(req) {
|
8
9
|
return new Promise((resolve) => {
|
9
10
|
const chunks = [];
|
@@ -28,9 +29,6 @@ function parseData(data) {
|
|
28
29
|
if ("infoHash" in parsed) {
|
29
30
|
parsed.infoHash = parsed.infoHash.toLowerCase();
|
30
31
|
}
|
31
|
-
if ("trackers" in parsed && !Array.isArray(parsed.trackers)) {
|
32
|
-
parsed.trackers = [parsed.trackers];
|
33
|
-
}
|
34
32
|
if ("size" in parsed && typeof parsed.size === "string") {
|
35
33
|
parsed.size = Number(parsed.size);
|
36
34
|
}
|
@@ -56,7 +54,7 @@ async function search(req, res) {
|
|
56
54
|
return;
|
57
55
|
}
|
58
56
|
const criteria = pick(data, ["infoHash", "name"]);
|
59
|
-
const nonceOptions = pick(data, ["
|
57
|
+
const nonceOptions = pick(data, ["outputDir"]);
|
60
58
|
if (!("infoHash" in criteria || "name" in criteria)) {
|
61
59
|
const message = "A name or info hash must be provided";
|
62
60
|
logger.error({ label: Label.SERVER, message });
|
@@ -70,6 +68,7 @@ async function search(req, res) {
|
|
70
68
|
label: Label.SERVER,
|
71
69
|
message: `Received search request: ${criteriaStr}`,
|
72
70
|
});
|
71
|
+
await indexNewTorrents();
|
73
72
|
try {
|
74
73
|
let numFound = null;
|
75
74
|
if (criteria) {
|
@@ -90,6 +89,7 @@ async function search(req, res) {
|
|
90
89
|
}
|
91
90
|
catch (e) {
|
92
91
|
logger.error(e);
|
92
|
+
logger.debug(e);
|
93
93
|
}
|
94
94
|
}
|
95
95
|
async function announce(req, res) {
|
@@ -126,6 +126,7 @@ async function announce(req, res) {
|
|
126
126
|
});
|
127
127
|
const candidate = data;
|
128
128
|
try {
|
129
|
+
await indexNewTorrents();
|
129
130
|
const result = await checkNewCandidateMatch(candidate);
|
130
131
|
if (result) {
|
131
132
|
logger.info({
|
package/dist/server.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAyC,MAAM,MAAM,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAEN,sBAAsB,EACtB,+BAA+B,GAC/B,MAAM,eAAe,CAAC;
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/signalHandlers.js
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import { db } from "./db.js";
|
2
|
+
async function exitGracefully() {
|
3
|
+
await db.destroy();
|
4
|
+
process.exit();
|
5
|
+
}
|
6
|
+
process.on("SIGINT", exitGracefully);
|
7
|
+
process.on("SIGTERM", exitGracefully);
|
3
8
|
//# sourceMappingURL=signalHandlers.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"signalHandlers.js","sourceRoot":"","sources":["../src/signalHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,EAAE,CAAC,
|
1
|
+
{"version":3,"file":"signalHandlers.js","sourceRoot":"","sources":["../src/signalHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,KAAK,UAAU,cAAc;IAC5B,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC"}
|
package/dist/startup.js
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
import { getClient } from "./clients/TorrentClient.js";
|
2
2
|
import { CrossSeedError } from "./errors.js";
|
3
|
-
import { validateJackettApi } from "./jackett.js";
|
4
3
|
import { logger } from "./logger.js";
|
5
4
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
6
5
|
import { validateTorrentDir } from "./torrent.js";
|
@@ -17,7 +16,6 @@ export async function doStartupValidation() {
|
|
17
16
|
const downloadClient = getClient();
|
18
17
|
const torznabManager = getTorznabManager();
|
19
18
|
await Promise.all([
|
20
|
-
validateJackettApi(),
|
21
19
|
torznabManager.validateTorznabUrls(),
|
22
20
|
downloadClient === null || downloadClient === void 0 ? void 0 : downloadClient.validateConfig(),
|
23
21
|
validateTorrentDir(),
|
package/dist/startup.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAkB,MAAM,cAAc,CAAC;AAEjE,SAAS,eAAe;IACvB,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACtE,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC,EAAE;QAC/D,MAAM,IAAI,cAAc,CACvB,qFAAqF,CACrF,CAAC;KACF;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACxC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAChD,eAAe,EAAE,CAAC;IAClB,MAAM,cAAc,GAAG,SAAS,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,OAAO,CAAC,GAAG,CAChB;QACC,cAAc,CAAC,mBAAmB,EAAE;QACpC,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,cAAc,EAAE;QAChC,kBAAkB,EAAE;KACpB,CAAC,MAAM,CAAC,OAAO,CAAC,CACjB,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;AAC7C,CAAC"}
|