cross-seed 6.13.6 → 7.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 +12 -13
- package/dist/webui/assets/FieldInfo-Bxj_j8SJ.js +1 -0
- package/dist/webui/assets/Page-C3rteCZt.js +1 -0
- package/dist/webui/assets/array-field-DVSC6nHP.js +1 -0
- package/dist/webui/assets/badge-DTZMtS0e.js +1 -0
- package/dist/webui/assets/check-Bu3ldi63.js +1 -0
- package/dist/webui/assets/chevron-down-CRy8M0kJ.js +1 -0
- package/dist/webui/assets/clients-CW8oEZoQ.js +1 -0
- package/dist/webui/assets/connect-YBNsnjWT.js +1 -0
- package/dist/webui/assets/debug-mz8-WYZj.js +1 -0
- package/dist/webui/assets/directories-BSK28RgR.js +1 -0
- package/dist/webui/assets/duration-field-C6xoSlJg.js +1 -0
- package/dist/webui/assets/general-lJJxZhH7.js +1 -0
- package/dist/webui/assets/health-CXbsVrie.js +1 -0
- package/dist/webui/assets/index-Bi48hI2z.js +54 -0
- package/dist/webui/assets/index-C-Ul7GNg.css +1 -0
- package/dist/webui/assets/index-C2cH1Gst.js +1 -0
- package/dist/webui/assets/index-Cc5bDmJr.js +1 -0
- package/dist/webui/assets/jobs-CxmNab9w.js +1 -0
- package/dist/webui/assets/library-vaj2W8sE.js +1 -0
- package/dist/webui/assets/loader-circle-M0gu1gZ-.js +1 -0
- package/dist/webui/assets/logs-Cu9RyKS0.js +1 -0
- package/dist/webui/assets/search-2R5sIdT8.js +1 -0
- package/dist/webui/assets/select-field-BCqNLDrJ.js +1 -0
- package/dist/webui/assets/select-zHgqMzLj.js +1 -0
- package/dist/webui/assets/settings-CMYjpTbZ.js +1 -0
- package/dist/webui/assets/submit-button-BtcnyggQ.js +1 -0
- package/dist/webui/assets/switch-G0W3uJVN.js +1 -0
- package/dist/webui/assets/switch-field-IBd9ORNq.js +1 -0
- package/dist/webui/assets/table-DvgJU7Gh.js +1 -0
- package/dist/webui/assets/test-tube-BIwmoM45.js +1 -0
- package/dist/webui/assets/text-field-DruSbGhy.js +1 -0
- package/dist/webui/assets/time-BSMZjmyW.js +1 -0
- package/dist/webui/assets/trackers-D-OpAe63.js +7 -0
- package/dist/webui/assets/use-form-validation-context-BkAfWAh0.js +1 -0
- package/dist/webui/assets/use-settings-form-submit-CDRh-E9U.js +2 -0
- package/dist/webui/assets/useQuery-A4Hv_4uX.js +1 -0
- package/dist/webui/index.html +13 -0
- package/node_modules/@cross-seed/shared/dist/configSchema.d.ts +261 -0
- package/node_modules/@cross-seed/shared/dist/configSchema.d.ts.map +1 -0
- package/node_modules/@cross-seed/shared/dist/configSchema.js +53 -0
- package/node_modules/@cross-seed/shared/dist/configSchema.js.map +1 -0
- package/node_modules/@cross-seed/shared/dist/constants.d.ts +122 -0
- package/node_modules/@cross-seed/shared/dist/constants.d.ts.map +1 -0
- package/node_modules/@cross-seed/shared/dist/constants.js +127 -0
- package/node_modules/@cross-seed/shared/dist/constants.js.map +1 -0
- package/node_modules/@cross-seed/shared/dist/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@cross-seed/shared/dist/utils.d.ts +6 -0
- package/node_modules/@cross-seed/shared/dist/utils.d.ts.map +1 -0
- package/node_modules/@cross-seed/shared/dist/utils.js +9 -0
- package/node_modules/@cross-seed/shared/dist/utils.js.map +1 -0
- package/node_modules/@cross-seed/shared/package.json +22 -0
- package/package.json +35 -11
- package/dist/Result.js +0 -64
- package/dist/Result.js.map +0 -1
- package/dist/action.js +0 -693
- package/dist/action.js.map +0 -1
- package/dist/arr.js +0 -199
- package/dist/arr.js.map +0 -1
- package/dist/auth.js +0 -25
- package/dist/auth.js.map +0 -1
- package/dist/clients/Deluge.js +0 -698
- package/dist/clients/Deluge.js.map +0 -1
- package/dist/clients/QBittorrent.js +0 -785
- package/dist/clients/QBittorrent.js.map +0 -1
- package/dist/clients/RTorrent.js +0 -654
- package/dist/clients/RTorrent.js.map +0 -1
- package/dist/clients/TorrentClient.js +0 -272
- package/dist/clients/TorrentClient.js.map +0 -1
- package/dist/clients/Transmission.js +0 -404
- package/dist/clients/Transmission.js.map +0 -1
- package/dist/cmd.js +0 -196
- package/dist/cmd.js.map +0 -1
- package/dist/config.template.cjs +0 -353
- package/dist/config.template.cjs.map +0 -1
- package/dist/configSchema.js +0 -667
- package/dist/configSchema.js.map +0 -1
- package/dist/configuration.js +0 -82
- package/dist/configuration.js.map +0 -1
- package/dist/constants.js +0 -281
- package/dist/constants.js.map +0 -1
- package/dist/dataFiles.js +0 -208
- package/dist/dataFiles.js.map +0 -1
- package/dist/db.js +0 -216
- package/dist/db.js.map +0 -1
- package/dist/decide.js +0 -553
- package/dist/decide.js.map +0 -1
- package/dist/diff.js +0 -24
- package/dist/diff.js.map +0 -1
- package/dist/errors.js +0 -16
- package/dist/errors.js.map +0 -1
- package/dist/indexers.js +0 -180
- package/dist/indexers.js.map +0 -1
- package/dist/inject.js +0 -594
- package/dist/inject.js.map +0 -1
- package/dist/jobs.js +0 -146
- package/dist/jobs.js.map +0 -1
- package/dist/logger.js +0 -143
- package/dist/logger.js.map +0 -1
- package/dist/migrations/00-initialSchema.js +0 -30
- package/dist/migrations/00-initialSchema.js.map +0 -1
- package/dist/migrations/01-jobs.js +0 -12
- package/dist/migrations/01-jobs.js.map +0 -1
- package/dist/migrations/02-timestamps.js +0 -21
- package/dist/migrations/02-timestamps.js.map +0 -1
- package/dist/migrations/03-rateLimits.js +0 -14
- package/dist/migrations/03-rateLimits.js.map +0 -1
- package/dist/migrations/04-auth.js +0 -13
- package/dist/migrations/04-auth.js.map +0 -1
- package/dist/migrations/05-caps.js +0 -16
- package/dist/migrations/05-caps.js.map +0 -1
- package/dist/migrations/06-uniqueDecisions.js +0 -29
- package/dist/migrations/06-uniqueDecisions.js.map +0 -1
- package/dist/migrations/07-limits.js +0 -12
- package/dist/migrations/07-limits.js.map +0 -1
- package/dist/migrations/08-rss.js +0 -15
- package/dist/migrations/08-rss.js.map +0 -1
- package/dist/migrations/09-clientAndDataSearchees.js +0 -34
- package/dist/migrations/09-clientAndDataSearchees.js.map +0 -1
- package/dist/migrations/10-indexerNameAudioBookCaps.js +0 -18
- package/dist/migrations/10-indexerNameAudioBookCaps.js.map +0 -1
- package/dist/migrations/11-trackers.js +0 -38
- package/dist/migrations/11-trackers.js.map +0 -1
- package/dist/migrations/migrations.js +0 -31
- package/dist/migrations/migrations.js.map +0 -1
- package/dist/parseTorrent.js +0 -128
- package/dist/parseTorrent.js.map +0 -1
- package/dist/pipeline.js +0 -527
- package/dist/pipeline.js.map +0 -1
- package/dist/preFilter.js +0 -250
- package/dist/preFilter.js.map +0 -1
- package/dist/pushNotifier.js +0 -137
- package/dist/pushNotifier.js.map +0 -1
- package/dist/runtimeConfig.js +0 -11
- package/dist/runtimeConfig.js.map +0 -1
- package/dist/searchee.js +0 -658
- package/dist/searchee.js.map +0 -1
- package/dist/server.js +0 -456
- package/dist/server.js.map +0 -1
- package/dist/startup.js +0 -203
- package/dist/startup.js.map +0 -1
- package/dist/torrent.js +0 -637
- package/dist/torrent.js.map +0 -1
- package/dist/torznab.js +0 -786
- package/dist/torznab.js.map +0 -1
- package/dist/utils.js +0 -637
- package/dist/utils.js.map +0 -1
package/dist/decide.js
DELETED
|
@@ -1,553 +0,0 @@
|
|
|
1
|
-
import bencode from "bencode";
|
|
2
|
-
import { readFile, stat, unlink, utimes, writeFile } from "fs/promises";
|
|
3
|
-
import ms from "ms";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { appDir } from "./configuration.js";
|
|
6
|
-
import { ANIME_GROUP_REGEX, Decision, isAnyMatchedDecision, MatchMode, parseSource, REPACK_PROPER_REGEX, RES_STRICT_REGEX, SEASON_REGEX, TORRENT_CACHE_FOLDER, } from "./constants.js";
|
|
7
|
-
import { db } from "./db.js";
|
|
8
|
-
import { Label, logger } from "./logger.js";
|
|
9
|
-
import { Metafile } from "./parseTorrent.js";
|
|
10
|
-
import { findBlockedStringInReleaseMaybe, isSingleEpisode, } from "./preFilter.js";
|
|
11
|
-
import { getRuntimeConfig } from "./runtimeConfig.js";
|
|
12
|
-
import { getFuzzySizeFactor, getMediaType, getMinSizeRatio, getReleaseGroup, } from "./searchee.js";
|
|
13
|
-
import { findAllTorrentFilesInDir, parseTorrentFromPath, snatch, SnatchError, } from "./torrent.js";
|
|
14
|
-
import { exists, extractInt, getLogString, Mutex, sanitizeInfoHash, stripExtension, withMutex, } from "./utils.js";
|
|
15
|
-
function logDecision(searchee, candidate, decision, metafile, tracker, options) {
|
|
16
|
-
const { blockList, matchMode } = getRuntimeConfig(options?.configOverride);
|
|
17
|
-
let reason;
|
|
18
|
-
let match = "no match";
|
|
19
|
-
switch (decision) {
|
|
20
|
-
case Decision.RELEASE_GROUP_MISMATCH:
|
|
21
|
-
reason = `it has a different release group: ${getReleaseGroup(stripExtension(searchee.title))} -> ${getReleaseGroup(stripExtension(candidate.name))}`;
|
|
22
|
-
break;
|
|
23
|
-
case Decision.RESOLUTION_MISMATCH:
|
|
24
|
-
reason = `its resolution does not match: ${searchee.title.match(RES_STRICT_REGEX)?.groups?.res} -> ${candidate.name.match(RES_STRICT_REGEX)?.groups?.res}`;
|
|
25
|
-
break;
|
|
26
|
-
case Decision.SOURCE_MISMATCH:
|
|
27
|
-
reason = `it has a different source: ${parseSource(searchee.title)} -> ${parseSource(candidate.name)}`;
|
|
28
|
-
break;
|
|
29
|
-
case Decision.PROPER_REPACK_MISMATCH:
|
|
30
|
-
reason = `one is a different subsequent release: ${searchee.title.match(REPACK_PROPER_REGEX)?.groups?.type ??
|
|
31
|
-
"INITIAL"} -> ${candidate.name.match(REPACK_PROPER_REGEX)?.groups?.type ?? "INITIAL"}`;
|
|
32
|
-
break;
|
|
33
|
-
case Decision.FUZZY_SIZE_MISMATCH:
|
|
34
|
-
reason = `the total sizes are outside of the fuzzySizeThreshold range: ${Math.abs((candidate.size - searchee.length) / searchee.length).toFixed(3)} > ${getFuzzySizeFactor(searchee)}`;
|
|
35
|
-
break;
|
|
36
|
-
case Decision.MATCH:
|
|
37
|
-
match = decision;
|
|
38
|
-
reason =
|
|
39
|
-
"all file sizes and file names match: torrent progress will be 100%";
|
|
40
|
-
break;
|
|
41
|
-
case Decision.MATCH_SIZE_ONLY:
|
|
42
|
-
match = decision;
|
|
43
|
-
reason = "all file sizes match: torrent progress will be 100%";
|
|
44
|
-
break;
|
|
45
|
-
case Decision.MATCH_PARTIAL:
|
|
46
|
-
match = decision;
|
|
47
|
-
reason = `most file sizes match: torrent progress will be ~${(getPartialSizeRatio(metafile, searchee) * 100).toFixed(3)}%`;
|
|
48
|
-
break;
|
|
49
|
-
case Decision.PARTIAL_SIZE_MISMATCH:
|
|
50
|
-
reason = `too many files are missing or have different sizes: torrent progress would be ${(getPartialSizeRatio(metafile, searchee) * 100).toFixed(3)}%`;
|
|
51
|
-
break;
|
|
52
|
-
case Decision.SIZE_MISMATCH:
|
|
53
|
-
reason = `some files are missing or have different sizes${compareFileTreesPartial(metafile, searchee) ? ` (will match in partial match mode)` : ""}`;
|
|
54
|
-
break;
|
|
55
|
-
case Decision.SAME_INFO_HASH:
|
|
56
|
-
reason = "the infoHash is the same";
|
|
57
|
-
break;
|
|
58
|
-
case Decision.INFO_HASH_ALREADY_EXISTS:
|
|
59
|
-
reason = "the infoHash matches a torrent you already have";
|
|
60
|
-
break;
|
|
61
|
-
case Decision.FILE_TREE_MISMATCH:
|
|
62
|
-
reason = `it has a different file tree${matchMode === MatchMode.STRICT ? " (will match in flexible or partial matchMode)" : ""}`;
|
|
63
|
-
break;
|
|
64
|
-
case Decision.MAGNET_LINK:
|
|
65
|
-
reason = "the torrent is a magnet link";
|
|
66
|
-
break;
|
|
67
|
-
case Decision.RATE_LIMITED:
|
|
68
|
-
reason = "cross-seed has reached this tracker's rate limit";
|
|
69
|
-
break;
|
|
70
|
-
case Decision.DOWNLOAD_FAILED:
|
|
71
|
-
reason = "the torrent file failed to download";
|
|
72
|
-
break;
|
|
73
|
-
case Decision.NO_DOWNLOAD_LINK:
|
|
74
|
-
reason = "it doesn't have a download link";
|
|
75
|
-
break;
|
|
76
|
-
case Decision.BLOCKED_RELEASE:
|
|
77
|
-
reason = `it matches the blocklist: ${findBlockedStringInReleaseMaybe(searchee, blockList) ??
|
|
78
|
-
findBlockedStringInReleaseMaybe(metafile, blockList)}`;
|
|
79
|
-
break;
|
|
80
|
-
default:
|
|
81
|
-
reason = decision;
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
logger.verbose({
|
|
85
|
-
label: `${searchee.label}/${Label.DECIDE}`,
|
|
86
|
-
message: `${getLogString(searchee)} - ${match} for ${tracker} torrent ${candidate.name}${metafile ? ` [${sanitizeInfoHash(metafile.infoHash)}]` : ""} - ${reason}`,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
export function compareFileTrees(candidate, searchee) {
|
|
90
|
-
let cmp;
|
|
91
|
-
if (!searchee.infoHash && !searchee.path) {
|
|
92
|
-
// Absolute path so need name
|
|
93
|
-
cmp = (elOfA, elOfB) => {
|
|
94
|
-
const lengthsAreEqual = elOfB.length === elOfA.length;
|
|
95
|
-
const namesAreEqual = elOfB.name === elOfA.name;
|
|
96
|
-
return lengthsAreEqual && namesAreEqual;
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
cmp = (elOfA, elOfB) => {
|
|
101
|
-
const lengthsAreEqual = elOfB.length === elOfA.length;
|
|
102
|
-
const pathsAreEqual = elOfB.path === elOfA.path;
|
|
103
|
-
return lengthsAreEqual && pathsAreEqual;
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
return candidate.files.every((elOfA) => searchee.files.some((elOfB) => cmp(elOfA, elOfB)));
|
|
107
|
-
}
|
|
108
|
-
export function compareFileTreesIgnoringNames(candidate, searchee) {
|
|
109
|
-
const availableFiles = searchee.files.slice();
|
|
110
|
-
for (const candidateFile of candidate.files) {
|
|
111
|
-
let matchedSearcheeFiles = availableFiles.filter((searcheeFile) => searcheeFile.length === candidateFile.length);
|
|
112
|
-
if (matchedSearcheeFiles.length > 1) {
|
|
113
|
-
matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === candidateFile.name);
|
|
114
|
-
}
|
|
115
|
-
if (matchedSearcheeFiles.length === 0) {
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
|
-
const index = availableFiles.indexOf(matchedSearcheeFiles[0]);
|
|
119
|
-
availableFiles.splice(index, 1);
|
|
120
|
-
}
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
export function getPartialSizeRatio(candidate, searchee) {
|
|
124
|
-
let matchedSizes = 0;
|
|
125
|
-
for (const candidateFile of candidate.files) {
|
|
126
|
-
const searcheeHasFileSize = searchee.files.some((searcheeFile) => searcheeFile.length === candidateFile.length);
|
|
127
|
-
if (searcheeHasFileSize) {
|
|
128
|
-
matchedSizes += candidateFile.length;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return matchedSizes / candidate.length;
|
|
132
|
-
}
|
|
133
|
-
export function compareFileTreesPartial(candidate, searchee) {
|
|
134
|
-
let matchedSizes = 0;
|
|
135
|
-
const availableFiles = searchee.files.slice();
|
|
136
|
-
for (const candidateFile of candidate.files) {
|
|
137
|
-
let matchedSearcheeFiles = availableFiles.filter((searcheeFile) => searcheeFile.length === candidateFile.length);
|
|
138
|
-
if (matchedSearcheeFiles.length > 1) {
|
|
139
|
-
matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === candidateFile.name);
|
|
140
|
-
}
|
|
141
|
-
if (matchedSearcheeFiles.length) {
|
|
142
|
-
matchedSizes += candidateFile.length;
|
|
143
|
-
const index = availableFiles.indexOf(matchedSearcheeFiles[0]);
|
|
144
|
-
availableFiles.splice(index, 1);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
const totalPieces = Math.ceil(candidate.length / candidate.pieceLength);
|
|
148
|
-
const availablePieces = Math.floor(matchedSizes / candidate.pieceLength);
|
|
149
|
-
return availablePieces / totalPieces >= getMinSizeRatio(searchee);
|
|
150
|
-
}
|
|
151
|
-
function fuzzySizeDoesMatch(resultSize, searchee) {
|
|
152
|
-
const fuzzySizeFactor = getFuzzySizeFactor(searchee);
|
|
153
|
-
const { length } = searchee;
|
|
154
|
-
const lowerBound = length - fuzzySizeFactor * length;
|
|
155
|
-
const upperBound = length + fuzzySizeFactor * length;
|
|
156
|
-
return resultSize >= lowerBound && resultSize <= upperBound;
|
|
157
|
-
}
|
|
158
|
-
function resolutionDoesMatch(searcheeTitle, candidateName) {
|
|
159
|
-
const searcheeRes = searcheeTitle
|
|
160
|
-
.match(RES_STRICT_REGEX)
|
|
161
|
-
?.groups?.res?.trim()
|
|
162
|
-
?.toLowerCase();
|
|
163
|
-
const candidateRes = candidateName
|
|
164
|
-
.match(RES_STRICT_REGEX)
|
|
165
|
-
?.groups?.res?.trim()
|
|
166
|
-
?.toLowerCase();
|
|
167
|
-
if (!searcheeRes || !candidateRes)
|
|
168
|
-
return true;
|
|
169
|
-
return extractInt(searcheeRes) === extractInt(candidateRes);
|
|
170
|
-
}
|
|
171
|
-
function releaseGroupDoesMatch(searcheeTitle, candidateName) {
|
|
172
|
-
const searcheeReleaseGroup = getReleaseGroup(stripExtension(searcheeTitle))?.toLowerCase();
|
|
173
|
-
const candidateReleaseGroup = getReleaseGroup(stripExtension(candidateName))?.toLowerCase();
|
|
174
|
-
if (!searcheeReleaseGroup || !candidateReleaseGroup) {
|
|
175
|
-
return true; // Pass if missing -GRP
|
|
176
|
-
}
|
|
177
|
-
if (searcheeReleaseGroup.startsWith(candidateReleaseGroup) ||
|
|
178
|
-
candidateReleaseGroup.startsWith(searcheeReleaseGroup)) {
|
|
179
|
-
return true; // -GRP matches
|
|
180
|
-
}
|
|
181
|
-
// Anime naming can cause weird things to match as release groups
|
|
182
|
-
const searcheeAnimeGroup = searcheeTitle
|
|
183
|
-
.match(ANIME_GROUP_REGEX)
|
|
184
|
-
?.groups?.group?.trim()
|
|
185
|
-
?.toLowerCase();
|
|
186
|
-
const candidateAnimeGroup = candidateName
|
|
187
|
-
.match(ANIME_GROUP_REGEX)
|
|
188
|
-
?.groups?.group?.trim()
|
|
189
|
-
?.toLowerCase();
|
|
190
|
-
if (!searcheeAnimeGroup && !candidateAnimeGroup) {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
// Most checks will never get here, below are rare edge cases
|
|
194
|
-
if (searcheeAnimeGroup === candidateAnimeGroup) {
|
|
195
|
-
return true;
|
|
196
|
-
}
|
|
197
|
-
if (searcheeAnimeGroup && searcheeAnimeGroup === candidateReleaseGroup) {
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
if (candidateAnimeGroup && searcheeReleaseGroup === candidateAnimeGroup) {
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
return false;
|
|
204
|
-
}
|
|
205
|
-
function sourceDoesMatch(searcheeTitle, candidateName) {
|
|
206
|
-
const searcheeSource = parseSource(searcheeTitle);
|
|
207
|
-
const candidateSource = parseSource(candidateName);
|
|
208
|
-
if (!searcheeSource || !candidateSource)
|
|
209
|
-
return true;
|
|
210
|
-
return searcheeSource === candidateSource;
|
|
211
|
-
}
|
|
212
|
-
function releaseVersionDoesMatch(searcheeName, candidateName) {
|
|
213
|
-
return (REPACK_PROPER_REGEX.test(searcheeName) ===
|
|
214
|
-
REPACK_PROPER_REGEX.test(candidateName));
|
|
215
|
-
}
|
|
216
|
-
export async function assessCandidate(metaOrCandidate, searchee, infoHashesToExclude, blockList, options) {
|
|
217
|
-
const { includeSingleEpisodes, matchMode } = getRuntimeConfig(options?.configOverride);
|
|
218
|
-
// When metaOrCandidate is a Metafile, skip straight to the
|
|
219
|
-
// main matching algorithms as we don't need pre-download filtering.
|
|
220
|
-
const isCandidate = !(metaOrCandidate instanceof Metafile);
|
|
221
|
-
if (isCandidate) {
|
|
222
|
-
const name = metaOrCandidate.name;
|
|
223
|
-
if (!releaseGroupDoesMatch(searchee.title, name)) {
|
|
224
|
-
return { decision: Decision.RELEASE_GROUP_MISMATCH };
|
|
225
|
-
}
|
|
226
|
-
if (!resolutionDoesMatch(searchee.title, name)) {
|
|
227
|
-
return { decision: Decision.RESOLUTION_MISMATCH };
|
|
228
|
-
}
|
|
229
|
-
if (!sourceDoesMatch(searchee.title, name)) {
|
|
230
|
-
return { decision: Decision.SOURCE_MISMATCH };
|
|
231
|
-
}
|
|
232
|
-
if (!releaseVersionDoesMatch(searchee.title, name)) {
|
|
233
|
-
return { decision: Decision.PROPER_REPACK_MISMATCH };
|
|
234
|
-
}
|
|
235
|
-
const size = metaOrCandidate.size;
|
|
236
|
-
if (size && !fuzzySizeDoesMatch(size, searchee)) {
|
|
237
|
-
return { decision: Decision.FUZZY_SIZE_MISMATCH };
|
|
238
|
-
}
|
|
239
|
-
if (!metaOrCandidate.link) {
|
|
240
|
-
return { decision: Decision.NO_DOWNLOAD_LINK };
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
let metaCached = !isCandidate;
|
|
244
|
-
if (findBlockedStringInReleaseMaybe(searchee, blockList)) {
|
|
245
|
-
return {
|
|
246
|
-
decision: Decision.BLOCKED_RELEASE,
|
|
247
|
-
metafile: !isCandidate ? metaOrCandidate : undefined,
|
|
248
|
-
metaCached,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
let metafile;
|
|
252
|
-
if (isCandidate) {
|
|
253
|
-
const res = await snatch(metaOrCandidate, searchee.label, {
|
|
254
|
-
retries: 4,
|
|
255
|
-
delayMs: searchee.label === Label.ANNOUNCE
|
|
256
|
-
? ms("5 minutes")
|
|
257
|
-
: ms("1 minute"),
|
|
258
|
-
});
|
|
259
|
-
if (res.isErr()) {
|
|
260
|
-
const err = res.unwrapErr();
|
|
261
|
-
return err === SnatchError.MAGNET_LINK
|
|
262
|
-
? { decision: Decision.MAGNET_LINK }
|
|
263
|
-
: err === SnatchError.RATE_LIMITED
|
|
264
|
-
? { decision: Decision.RATE_LIMITED }
|
|
265
|
-
: { decision: Decision.DOWNLOAD_FAILED };
|
|
266
|
-
}
|
|
267
|
-
metafile = res.unwrap();
|
|
268
|
-
metaCached = await cacheTorrentFile(metafile, metaOrCandidate, searchee.label);
|
|
269
|
-
metaOrCandidate.size = metafile.length; // Trackers can be wrong
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
metafile = metaOrCandidate;
|
|
273
|
-
}
|
|
274
|
-
if (searchee.infoHash === metafile.infoHash) {
|
|
275
|
-
return { decision: Decision.SAME_INFO_HASH, metafile, metaCached };
|
|
276
|
-
}
|
|
277
|
-
if (infoHashesToExclude.has(metafile.infoHash)) {
|
|
278
|
-
return {
|
|
279
|
-
decision: Decision.INFO_HASH_ALREADY_EXISTS,
|
|
280
|
-
metafile,
|
|
281
|
-
metaCached,
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
if (findBlockedStringInReleaseMaybe(metafile, blockList)) {
|
|
285
|
-
return { decision: Decision.BLOCKED_RELEASE, metafile, metaCached };
|
|
286
|
-
}
|
|
287
|
-
// Prevent candidate episodes from matching searchee season packs
|
|
288
|
-
if (!includeSingleEpisodes &&
|
|
289
|
-
SEASON_REGEX.test(searchee.title) &&
|
|
290
|
-
isSingleEpisode(metafile, getMediaType(metafile))) {
|
|
291
|
-
return { decision: Decision.FILE_TREE_MISMATCH, metafile, metaCached };
|
|
292
|
-
}
|
|
293
|
-
const perfectMatch = compareFileTrees(metafile, searchee);
|
|
294
|
-
if (perfectMatch) {
|
|
295
|
-
return { decision: Decision.MATCH, metafile, metaCached };
|
|
296
|
-
}
|
|
297
|
-
const sizeMatch = compareFileTreesIgnoringNames(metafile, searchee);
|
|
298
|
-
if (sizeMatch && matchMode !== MatchMode.STRICT) {
|
|
299
|
-
return { decision: Decision.MATCH_SIZE_ONLY, metafile, metaCached };
|
|
300
|
-
}
|
|
301
|
-
if (matchMode === MatchMode.PARTIAL) {
|
|
302
|
-
const partialSizeMatch = getPartialSizeRatio(metafile, searchee) >=
|
|
303
|
-
getMinSizeRatio(searchee);
|
|
304
|
-
if (!partialSizeMatch) {
|
|
305
|
-
return {
|
|
306
|
-
decision: Decision.PARTIAL_SIZE_MISMATCH,
|
|
307
|
-
metafile,
|
|
308
|
-
metaCached,
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
const partialMatch = compareFileTreesPartial(metafile, searchee);
|
|
312
|
-
if (partialMatch) {
|
|
313
|
-
return { decision: Decision.MATCH_PARTIAL, metafile, metaCached };
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
else if (!sizeMatch) {
|
|
317
|
-
return { decision: Decision.SIZE_MISMATCH, metafile, metaCached };
|
|
318
|
-
}
|
|
319
|
-
return { decision: Decision.FILE_TREE_MISMATCH, metafile, metaCached };
|
|
320
|
-
}
|
|
321
|
-
export function getCachedTorrentName(infoHash) {
|
|
322
|
-
return `${infoHash}.cached.torrent`;
|
|
323
|
-
}
|
|
324
|
-
async function existsInTorrentCache(infoHash) {
|
|
325
|
-
const torrentPath = path.join(appDir(), TORRENT_CACHE_FOLDER, getCachedTorrentName(infoHash));
|
|
326
|
-
if (await exists(torrentPath))
|
|
327
|
-
return torrentPath;
|
|
328
|
-
return null;
|
|
329
|
-
}
|
|
330
|
-
async function getCachedTorrent(infoHash, searcheeLabel) {
|
|
331
|
-
if (!infoHash)
|
|
332
|
-
return null;
|
|
333
|
-
const torrentPath = await existsInTorrentCache(infoHash);
|
|
334
|
-
if (!torrentPath)
|
|
335
|
-
return null;
|
|
336
|
-
let meta;
|
|
337
|
-
try {
|
|
338
|
-
meta = await parseTorrentFromPath(torrentPath);
|
|
339
|
-
}
|
|
340
|
-
catch (e) {
|
|
341
|
-
logger.error({
|
|
342
|
-
label: `${searcheeLabel}/${Label.DECIDE}`,
|
|
343
|
-
message: `Failed to parse cached torrent ${torrentPath.replace(infoHash, sanitizeInfoHash(infoHash))} - deleting: ${e.message}`,
|
|
344
|
-
});
|
|
345
|
-
logger.debug(e);
|
|
346
|
-
try {
|
|
347
|
-
await unlink(torrentPath); // cleanup job handles db entries
|
|
348
|
-
}
|
|
349
|
-
catch (e) {
|
|
350
|
-
if (await exists(torrentPath)) {
|
|
351
|
-
logger.error({
|
|
352
|
-
label: `${searcheeLabel}/${Label.DECIDE}`,
|
|
353
|
-
message: `Failed to delete corrupted cached torrent ${torrentPath.replace(infoHash, sanitizeInfoHash(infoHash))}: ${e.message}`,
|
|
354
|
-
});
|
|
355
|
-
logger.debug(e);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
return null;
|
|
359
|
-
}
|
|
360
|
-
await utimes(torrentPath, new Date(), (await stat(torrentPath)).mtime);
|
|
361
|
-
return { meta, torrentPath };
|
|
362
|
-
}
|
|
363
|
-
async function cacheTorrentFile(meta, candidate, searcheeLabel) {
|
|
364
|
-
let cached = false;
|
|
365
|
-
try {
|
|
366
|
-
const torrentPath = path.join(appDir(), TORRENT_CACHE_FOLDER, getCachedTorrentName(meta.infoHash));
|
|
367
|
-
await writeFile(torrentPath, new Uint8Array(meta.encode()));
|
|
368
|
-
cached = true;
|
|
369
|
-
if (candidate.indexerId && meta.trackers.length) {
|
|
370
|
-
const dbIndexer = await db("indexer")
|
|
371
|
-
.where({ id: candidate.indexerId })
|
|
372
|
-
.first();
|
|
373
|
-
const dbTrackers = dbIndexer?.trackers
|
|
374
|
-
? JSON.parse(dbIndexer.trackers)
|
|
375
|
-
: [];
|
|
376
|
-
let added = false;
|
|
377
|
-
for (const tracker of meta.trackers) {
|
|
378
|
-
if (dbTrackers.includes(tracker))
|
|
379
|
-
continue;
|
|
380
|
-
dbTrackers.push(tracker);
|
|
381
|
-
added = true;
|
|
382
|
-
}
|
|
383
|
-
if (added) {
|
|
384
|
-
await db("indexer")
|
|
385
|
-
.where({ id: candidate.indexerId })
|
|
386
|
-
.update({ trackers: JSON.stringify(dbTrackers) });
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
return cached;
|
|
390
|
-
}
|
|
391
|
-
catch (e) {
|
|
392
|
-
logger.error({
|
|
393
|
-
label: `${searcheeLabel}/${Label.DECIDE}`,
|
|
394
|
-
message: `Error while caching torrent ${getLogString(meta)}: ${e.message}`,
|
|
395
|
-
});
|
|
396
|
-
logger.debug(e);
|
|
397
|
-
return cached;
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
export async function updateTorrentCache(oldStr, newStr) {
|
|
401
|
-
const torrentCacheDir = path.join(appDir(), TORRENT_CACHE_FOLDER);
|
|
402
|
-
const torrentPaths = await findAllTorrentFilesInDir(torrentCacheDir);
|
|
403
|
-
console.log(`Found ${torrentPaths.length} files in cache, processing...`);
|
|
404
|
-
let count = 0;
|
|
405
|
-
for (const torrentPath of torrentPaths) {
|
|
406
|
-
try {
|
|
407
|
-
const torrent = bencode.decode(await readFile(torrentPath));
|
|
408
|
-
const announce = torrent.announce?.toString();
|
|
409
|
-
const announceList = torrent["announce-list"]?.map((tier) => tier.map((url) => url.toString()));
|
|
410
|
-
if (!announce?.includes(oldStr) &&
|
|
411
|
-
!announceList?.some((t) => t.some((url) => url.includes(oldStr)))) {
|
|
412
|
-
continue;
|
|
413
|
-
}
|
|
414
|
-
count++;
|
|
415
|
-
console.log(`#${count}: ${torrentPath}`);
|
|
416
|
-
let updated = false;
|
|
417
|
-
if (announce) {
|
|
418
|
-
const newAnnounce = announce.replace(oldStr, newStr);
|
|
419
|
-
if (announce !== newAnnounce) {
|
|
420
|
-
updated = true;
|
|
421
|
-
console.log(`--- ${announce} -> ${newAnnounce}`);
|
|
422
|
-
torrent.announce = Buffer.from(newAnnounce);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
if (announceList) {
|
|
426
|
-
torrent["announce-list"] = announceList.map((tier) => tier.map((url) => {
|
|
427
|
-
const newAnnounce = url.replace(oldStr, newStr);
|
|
428
|
-
if (url === newAnnounce)
|
|
429
|
-
return Buffer.from(url);
|
|
430
|
-
updated = true;
|
|
431
|
-
console.log(`--- ${url} -> ${newAnnounce}`);
|
|
432
|
-
return Buffer.from(newAnnounce);
|
|
433
|
-
}));
|
|
434
|
-
}
|
|
435
|
-
if (updated) {
|
|
436
|
-
await writeFile(torrentPath, new Uint8Array(bencode.encode(torrent)));
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
catch (e) {
|
|
440
|
-
console.error(`Error reading ${torrentPath}: ${e}`);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
async function assessAndSaveResults(metaOrCandidate, searchee, guid, infoHashesToExclude, firstSeen, guidInfoHashMap, options) {
|
|
445
|
-
const { blockList } = getRuntimeConfig(options?.configOverride);
|
|
446
|
-
const assessment = await assessCandidate(metaOrCandidate, searchee, infoHashesToExclude, blockList, options);
|
|
447
|
-
if (assessment.metaCached) {
|
|
448
|
-
await withMutex(Mutex.GUID_INFO_HASH_MAP, { useQueue: true }, async () => {
|
|
449
|
-
guidInfoHashMap.set(guid, assessment.metafile.infoHash);
|
|
450
|
-
await db.transaction(async (trx) => {
|
|
451
|
-
const { id } = await trx("searchee")
|
|
452
|
-
.select("id")
|
|
453
|
-
.where({ name: searchee.title })
|
|
454
|
-
.first();
|
|
455
|
-
await trx("decision")
|
|
456
|
-
.insert({
|
|
457
|
-
searchee_id: id,
|
|
458
|
-
guid: guid,
|
|
459
|
-
info_hash: assessment.metafile.infoHash,
|
|
460
|
-
decision: assessment.decision,
|
|
461
|
-
first_seen: firstSeen,
|
|
462
|
-
last_seen: Date.now(),
|
|
463
|
-
fuzzy_size_factor: getFuzzySizeFactor(searchee),
|
|
464
|
-
})
|
|
465
|
-
.onConflict(["searchee_id", "guid"])
|
|
466
|
-
.merge();
|
|
467
|
-
});
|
|
468
|
-
});
|
|
469
|
-
}
|
|
470
|
-
return assessment;
|
|
471
|
-
}
|
|
472
|
-
export const rawGuidInfoHashMap = new Map();
|
|
473
|
-
export async function rebuildGuidInfoHashMap() {
|
|
474
|
-
return withMutex(Mutex.GUID_INFO_HASH_MAP, { useQueue: true }, async () => {
|
|
475
|
-
const res = await db("decision")
|
|
476
|
-
.select("guid", "info_hash")
|
|
477
|
-
.whereNotNull("info_hash");
|
|
478
|
-
rawGuidInfoHashMap.clear(); // Needs to be async atomic for clearing and setting
|
|
479
|
-
for (const { guid, info_hash } of res) {
|
|
480
|
-
rawGuidInfoHashMap.set(guid, info_hash);
|
|
481
|
-
}
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
export async function getGuidInfoHashMap() {
|
|
485
|
-
if (!rawGuidInfoHashMap.size)
|
|
486
|
-
await rebuildGuidInfoHashMap();
|
|
487
|
-
return rawGuidInfoHashMap;
|
|
488
|
-
}
|
|
489
|
-
/**
|
|
490
|
-
* Some trackers have alt titles which get their own guid but resolve to same torrent
|
|
491
|
-
* @param guid The guid of the candidate
|
|
492
|
-
* @param link The link of the candidate
|
|
493
|
-
* @param guidInfoHashMap The map of guids to infoHashes. Necessary for optimal fuzzy lookups.
|
|
494
|
-
* @returns The infoHash of the torrent if found
|
|
495
|
-
*/
|
|
496
|
-
function guidLookup(guid, link, guidInfoHashMap) {
|
|
497
|
-
const infoHash = guidInfoHashMap.get(guid) ?? guidInfoHashMap.get(link);
|
|
498
|
-
if (infoHash)
|
|
499
|
-
return infoHash;
|
|
500
|
-
const torrentIdRegex = /\.tv\/torrent\/(\d+)\/group/;
|
|
501
|
-
for (const guidOrLink of [guid, link]) {
|
|
502
|
-
const torrentIdStr = guidOrLink.match(torrentIdRegex)?.[1];
|
|
503
|
-
if (!torrentIdStr)
|
|
504
|
-
continue;
|
|
505
|
-
for (const [key, value] of guidInfoHashMap) {
|
|
506
|
-
if (key.match(torrentIdRegex)?.[1] === torrentIdStr)
|
|
507
|
-
return value;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
export async function assessCandidateCaching(candidate, searchee, infoHashesToExclude, guidInfoHashMap, options) {
|
|
512
|
-
const { name, guid, link, tracker } = candidate;
|
|
513
|
-
const cacheEntry = await db("decision")
|
|
514
|
-
.select({
|
|
515
|
-
id: "decision.id",
|
|
516
|
-
infoHash: "decision.info_hash",
|
|
517
|
-
decision: "decision.decision",
|
|
518
|
-
firstSeen: "decision.first_seen",
|
|
519
|
-
fuzzySizeFactor: "decision.fuzzy_size_factor",
|
|
520
|
-
})
|
|
521
|
-
.join("searchee", "decision.searchee_id", "searchee.id")
|
|
522
|
-
.where({ name: searchee.title, guid })
|
|
523
|
-
.first();
|
|
524
|
-
const infoHash = guidLookup(guid, link, guidInfoHashMap);
|
|
525
|
-
const res = await getCachedTorrent(infoHash, searchee.label);
|
|
526
|
-
const metaOrCandidate = res?.meta ?? candidate;
|
|
527
|
-
if (metaOrCandidate instanceof Metafile) {
|
|
528
|
-
logger.verbose({
|
|
529
|
-
label: `${searchee.label}/${Label.DECIDE}`,
|
|
530
|
-
message: `Using cached torrent for ${tracker} assessment ${name}: ${getLogString(metaOrCandidate)}`,
|
|
531
|
-
});
|
|
532
|
-
candidate.size = metaOrCandidate.length; // Trackers can be wrong
|
|
533
|
-
}
|
|
534
|
-
let assessment;
|
|
535
|
-
if (infoHashesToExclude.has(cacheEntry?.infoHash)) {
|
|
536
|
-
// Already injected fast path, preserve match decision
|
|
537
|
-
assessment = { decision: Decision.INFO_HASH_ALREADY_EXISTS };
|
|
538
|
-
await db("decision")
|
|
539
|
-
.where({ id: cacheEntry.id })
|
|
540
|
-
.update({
|
|
541
|
-
last_seen: Date.now(),
|
|
542
|
-
decision: isAnyMatchedDecision(cacheEntry.decision)
|
|
543
|
-
? cacheEntry.decision
|
|
544
|
-
: Decision.INFO_HASH_ALREADY_EXISTS,
|
|
545
|
-
});
|
|
546
|
-
}
|
|
547
|
-
else {
|
|
548
|
-
assessment = await assessAndSaveResults(metaOrCandidate, searchee, guid, infoHashesToExclude, cacheEntry?.firstSeen ?? Date.now(), guidInfoHashMap, options);
|
|
549
|
-
}
|
|
550
|
-
logDecision(searchee, candidate, assessment.decision, assessment.metafile, tracker, options);
|
|
551
|
-
return assessment;
|
|
552
|
-
}
|
|
553
|
-
//# sourceMappingURL=decide.js.map
|
package/dist/decide.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"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"}
|
package/dist/diff.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { deepStrictEqual } from "assert";
|
|
2
|
-
import { parseTorrentFromPath } from "./torrent.js";
|
|
3
|
-
function diff(thing1, thing2) {
|
|
4
|
-
console.log("Use `cross-seed tree` on each .torrent file to display their full structure");
|
|
5
|
-
try {
|
|
6
|
-
deepStrictEqual(thing1, thing2);
|
|
7
|
-
console.log(thing1);
|
|
8
|
-
console.log("Torrents are equal");
|
|
9
|
-
}
|
|
10
|
-
catch (e) {
|
|
11
|
-
console.log(e);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
export async function diffCmd(first, second) {
|
|
15
|
-
const f1 = (await parseTorrentFromPath(first)).files;
|
|
16
|
-
const f2 = (await parseTorrentFromPath(second)).files;
|
|
17
|
-
const sortBy = f1.length === 1
|
|
18
|
-
? (a, b) => b.length - a.length
|
|
19
|
-
: f2.length === 1
|
|
20
|
-
? (a, b) => a.length - b.length
|
|
21
|
-
: (a, b) => a.path.localeCompare(b.path);
|
|
22
|
-
return diff(f1.sort(sortBy), f2.sort(sortBy));
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM;IAC3B,OAAO,CAAC,GAAG,CACV,6EAA6E,CAC7E,CAAC;IACF,IAAI,CAAC;QACJ,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAa,EAAE,MAAc;IAC1D,MAAM,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,MAAM,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,MAAM,MAAM,GACX,EAAE,CAAC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAC/B,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;YAC/B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/errors.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { logger } from "./logger.js";
|
|
2
|
-
export class CrossSeedError extends Error {
|
|
3
|
-
constructor(message, options) {
|
|
4
|
-
super(message, options);
|
|
5
|
-
delete this.stack;
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
export function exitOnCrossSeedErrors(e) {
|
|
9
|
-
logger ? logger.error(e) : console.error(e);
|
|
10
|
-
if (e instanceof CrossSeedError) {
|
|
11
|
-
process.exitCode = 1;
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
throw e;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,cAAe,SAAQ,KAAK;IACxC,YAAY,OAAgB,EAAE,OAAsB;QACnD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;CACD;AAED,MAAM,UAAU,qBAAqB,CAAC,CAAC;IACtC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,CAAC,YAAY,cAAc,EAAE,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,MAAM,CAAC,CAAC;AACT,CAAC"}
|