cross-seed 6.0.0-9 → 6.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/dist/action.js +177 -68
- package/dist/action.js.map +1 -1
- package/dist/arr.js +62 -54
- package/dist/arr.js.map +1 -1
- package/dist/clients/Deluge.js +70 -46
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +110 -68
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +45 -22
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js +14 -1
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +29 -9
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +46 -23
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +60 -63
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +89 -25
- package/dist/configSchema.js.map +1 -1
- package/dist/configuration.js +4 -1
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +69 -10
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +4 -5
- package/dist/dataFiles.js.map +1 -1
- package/dist/db.js +2 -1
- package/dist/db.js.map +1 -1
- package/dist/decide.js +231 -146
- package/dist/decide.js.map +1 -1
- package/dist/diff.js +13 -3
- package/dist/diff.js.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/indexers.js +94 -33
- package/dist/indexers.js.map +1 -1
- package/dist/inject.js +448 -0
- package/dist/inject.js.map +1 -0
- package/dist/jobs.js +13 -6
- package/dist/jobs.js.map +1 -1
- package/dist/logger.js +27 -9
- package/dist/logger.js.map +1 -1
- package/dist/migrations/00-initialSchema.js.map +1 -1
- package/dist/migrations/05-caps.js.map +1 -1
- package/dist/migrations/06-uniqueDecisions.js +29 -0
- package/dist/migrations/06-uniqueDecisions.js.map +1 -0
- package/dist/migrations/07-limits.js +12 -0
- package/dist/migrations/07-limits.js.map +1 -0
- package/dist/migrations/migrations.js +4 -0
- package/dist/migrations/migrations.js.map +1 -1
- package/dist/parseTorrent.js +6 -0
- package/dist/parseTorrent.js.map +1 -1
- package/dist/pipeline.js +224 -108
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +122 -55
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +7 -5
- package/dist/pushNotifier.js.map +1 -1
- package/dist/searchee.js +198 -17
- package/dist/searchee.js.map +1 -1
- package/dist/server.js +106 -54
- package/dist/server.js.map +1 -1
- package/dist/startup.js +16 -7
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +100 -37
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +323 -153
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +228 -43
- package/dist/utils.js.map +1 -1
- package/package.json +11 -6
package/dist/decide.js
CHANGED
@@ -1,22 +1,19 @@
|
|
1
|
-
import { existsSync, statSync, utimesSync, writeFileSync } from "fs";
|
1
|
+
import { existsSync, statSync, unlinkSync, utimesSync, writeFileSync, } from "fs";
|
2
|
+
import ms from "ms";
|
2
3
|
import path from "path";
|
3
4
|
import { appDir } from "./configuration.js";
|
4
|
-
import { Decision,
|
5
|
+
import { ANIME_GROUP_REGEX, Decision, isAnyMatchedDecision, isStaticDecision, MatchMode, parseSource, REPACK_PROPER_REGEX, RES_STRICT_REGEX, SEASON_REGEX, TORRENT_CACHE_FOLDER, } from "./constants.js";
|
5
6
|
import { db } from "./db.js";
|
6
7
|
import { Label, logger } from "./logger.js";
|
7
|
-
import {
|
8
|
+
import { Metafile } from "./parseTorrent.js";
|
9
|
+
import { findBlockedStringInReleaseMaybe, isSingleEpisode, } from "./preFilter.js";
|
10
|
+
import { resultOf, resultOfErr } from "./Result.js";
|
8
11
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
12
|
+
import { getReleaseGroup, } from "./searchee.js";
|
9
13
|
import { parseTorrentFromFilename, snatch, SnatchError } from "./torrent.js";
|
10
|
-
import {
|
11
|
-
|
12
|
-
|
13
|
-
return;
|
14
|
-
function logReason(reason) {
|
15
|
-
logger.verbose({
|
16
|
-
label: Label.DECIDE,
|
17
|
-
message: `${name} - no match for ${tracker} torrent ${Title} - ${reason}`,
|
18
|
-
});
|
19
|
-
}
|
14
|
+
import { extractInt, getFuzzySizeFactor, getLogString, getMediaType, getMinSizeRatio, sanitizeInfoHash, stripExtension, wait, } from "./utils.js";
|
15
|
+
function logDecision(searchee, candidate, decision, metafile, tracker) {
|
16
|
+
const { matchMode } = getRuntimeConfig();
|
20
17
|
let reason;
|
21
18
|
switch (decision) {
|
22
19
|
case Decision.MATCH_PARTIAL:
|
@@ -26,14 +23,16 @@ const createReasonLogger = (Title, tracker, name) => (decision, cached, searchee
|
|
26
23
|
case Decision.MATCH:
|
27
24
|
return;
|
28
25
|
case Decision.FUZZY_SIZE_MISMATCH:
|
26
|
+
reason = `the total sizes are outside of the fuzzySizeThreshold range: ${Math.abs((candidate.size - searchee.length) / searchee.length).toFixed(3)} > ${getFuzzySizeFactor()}`;
|
27
|
+
break;
|
29
28
|
case Decision.SIZE_MISMATCH:
|
29
|
+
reason = `some files are missing or have different sizes${compareFileTreesPartial(metafile, searchee) ? ` (will match in partial match mode)` : ""}`;
|
30
|
+
break;
|
30
31
|
case Decision.PARTIAL_SIZE_MISMATCH:
|
31
|
-
reason = `
|
32
|
-
? `: ${candidate.size >= searchee.length ? "+" : ""}${humanReadableSize(candidate.size - searchee.length)}`
|
33
|
-
: ""}`;
|
32
|
+
reason = `too many files are missing or have different sizes: torrent progress would be ${(getPartialSizeRatio(metafile, searchee) * 100).toFixed(3)}%`;
|
34
33
|
break;
|
35
34
|
case Decision.RESOLUTION_MISMATCH:
|
36
|
-
reason = `its resolution does not match: ${searchee.
|
35
|
+
reason = `its resolution does not match: ${searchee.title.match(RES_STRICT_REGEX)?.groups?.res} -> ${candidate.name.match(RES_STRICT_REGEX)?.groups?.res}`;
|
37
36
|
break;
|
38
37
|
case Decision.NO_DOWNLOAD_LINK:
|
39
38
|
reason = "it doesn't have a download link";
|
@@ -47,23 +46,25 @@ const createReasonLogger = (Title, tracker, name) => (decision, cached, searchee
|
|
47
46
|
case Decision.MAGNET_LINK:
|
48
47
|
reason = "the torrent is a magnet link";
|
49
48
|
break;
|
49
|
+
case Decision.SAME_INFO_HASH:
|
50
|
+
reason = "the info hash is the same";
|
51
|
+
break;
|
50
52
|
case Decision.INFO_HASH_ALREADY_EXISTS:
|
51
53
|
reason = "the info hash matches a torrent you already have";
|
52
54
|
break;
|
53
55
|
case Decision.FILE_TREE_MISMATCH:
|
54
|
-
reason =
|
56
|
+
reason = `it has a different file tree${matchMode === MatchMode.SAFE ? " (will match in risky or partial match mode)" : ""}`;
|
55
57
|
break;
|
56
58
|
case Decision.RELEASE_GROUP_MISMATCH:
|
57
|
-
reason = `it has a different release group: ${searchee.name
|
58
|
-
.match(RELEASE_GROUP_REGEX)
|
59
|
-
?.groups?.group?.trim()} -> ${candidate.name
|
60
|
-
.match(RELEASE_GROUP_REGEX)
|
61
|
-
?.groups?.group?.trim()}`;
|
59
|
+
reason = `it has a different release group: ${getReleaseGroup(stripExtension(searchee.title))} -> ${getReleaseGroup(stripExtension(candidate.name))}`;
|
62
60
|
break;
|
63
61
|
case Decision.PROPER_REPACK_MISMATCH:
|
64
|
-
reason = `one is a different subsequent release: ${searchee.
|
62
|
+
reason = `one is a different subsequent release: ${searchee.title.match(REPACK_PROPER_REGEX)?.groups?.type ??
|
65
63
|
"INITIAL"} -> ${candidate.name.match(REPACK_PROPER_REGEX)?.groups?.type ?? "INITIAL"}`;
|
66
64
|
break;
|
65
|
+
case Decision.SOURCE_MISMATCH:
|
66
|
+
reason = `it has a different source: ${parseSource(searchee.title)} -> ${parseSource(candidate.name)}`;
|
67
|
+
break;
|
67
68
|
case Decision.BLOCKED_RELEASE:
|
68
69
|
reason = `it matches the blocklist: "${findBlockedStringInReleaseMaybe(searchee, getRuntimeConfig().blockList)}"`;
|
69
70
|
break;
|
@@ -71,8 +72,11 @@ const createReasonLogger = (Title, tracker, name) => (decision, cached, searchee
|
|
71
72
|
reason = decision;
|
72
73
|
break;
|
73
74
|
}
|
74
|
-
|
75
|
-
|
75
|
+
logger.verbose({
|
76
|
+
label: Label.DECIDE,
|
77
|
+
message: `${getLogString(searchee)} - no match for ${tracker} torrent ${candidate.name}${metafile ? ` [${sanitizeInfoHash(metafile.infoHash)}]` : ""} - ${reason}`,
|
78
|
+
});
|
79
|
+
}
|
76
80
|
export function compareFileTrees(candidate, searchee) {
|
77
81
|
const cmp = (elOfA, elOfB) => {
|
78
82
|
const lengthsAreEqual = elOfB.length === elOfA.length;
|
@@ -82,19 +86,21 @@ export function compareFileTrees(candidate, searchee) {
|
|
82
86
|
return candidate.files.every((elOfA) => searchee.files.some((elOfB) => cmp(elOfA, elOfB)));
|
83
87
|
}
|
84
88
|
export function compareFileTreesIgnoringNames(candidate, searchee) {
|
89
|
+
const availableFiles = searchee.files.slice();
|
85
90
|
for (const candidateFile of candidate.files) {
|
86
|
-
let matchedSearcheeFiles =
|
91
|
+
let matchedSearcheeFiles = availableFiles.filter((searcheeFile) => searcheeFile.length === candidateFile.length);
|
87
92
|
if (matchedSearcheeFiles.length > 1) {
|
88
93
|
matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === candidateFile.name);
|
89
94
|
}
|
90
95
|
if (matchedSearcheeFiles.length === 0) {
|
91
96
|
return false;
|
92
97
|
}
|
98
|
+
const index = availableFiles.indexOf(matchedSearcheeFiles[0]);
|
99
|
+
availableFiles.splice(index, 1);
|
93
100
|
}
|
94
101
|
return true;
|
95
102
|
}
|
96
|
-
export function
|
97
|
-
const { fuzzySizeThreshold } = getRuntimeConfig();
|
103
|
+
export function getPartialSizeRatio(candidate, searchee) {
|
98
104
|
let matchedSizes = 0;
|
99
105
|
for (const candidateFile of candidate.files) {
|
100
106
|
const searcheeHasFileSize = searchee.files.some((searcheeFile) => searcheeFile.length === candidateFile.length);
|
@@ -102,33 +108,35 @@ export function comparePartialSizeOnly(candidate, searchee) {
|
|
102
108
|
matchedSizes += candidateFile.length;
|
103
109
|
}
|
104
110
|
}
|
105
|
-
return matchedSizes / candidate.length
|
111
|
+
return matchedSizes / candidate.length;
|
106
112
|
}
|
107
113
|
export function compareFileTreesPartial(candidate, searchee) {
|
108
|
-
const { fuzzySizeThreshold } = getRuntimeConfig();
|
109
114
|
let matchedSizes = 0;
|
115
|
+
const availableFiles = searchee.files.slice();
|
110
116
|
for (const candidateFile of candidate.files) {
|
111
|
-
let matchedSearcheeFiles =
|
117
|
+
let matchedSearcheeFiles = availableFiles.filter((searcheeFile) => searcheeFile.length === candidateFile.length);
|
112
118
|
if (matchedSearcheeFiles.length > 1) {
|
113
119
|
matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === candidateFile.name);
|
114
120
|
}
|
115
121
|
if (matchedSearcheeFiles.length) {
|
116
122
|
matchedSizes += candidateFile.length;
|
123
|
+
const index = availableFiles.indexOf(matchedSearcheeFiles[0]);
|
124
|
+
availableFiles.splice(index, 1);
|
117
125
|
}
|
118
126
|
}
|
119
127
|
const totalPieces = Math.ceil(candidate.length / candidate.pieceLength);
|
120
128
|
const availablePieces = Math.floor(matchedSizes / candidate.pieceLength);
|
121
|
-
return availablePieces / totalPieces >=
|
129
|
+
return availablePieces / totalPieces >= getMinSizeRatio();
|
122
130
|
}
|
123
131
|
function fuzzySizeDoesMatch(resultSize, searchee) {
|
124
|
-
const
|
132
|
+
const fuzzySizeFactor = getFuzzySizeFactor();
|
125
133
|
const { length } = searchee;
|
126
|
-
const lowerBound = length -
|
127
|
-
const upperBound = length +
|
134
|
+
const lowerBound = length - fuzzySizeFactor * length;
|
135
|
+
const upperBound = length + fuzzySizeFactor * length;
|
128
136
|
return resultSize >= lowerBound && resultSize <= upperBound;
|
129
137
|
}
|
130
|
-
function resolutionDoesMatch(
|
131
|
-
const searcheeRes =
|
138
|
+
function resolutionDoesMatch(searcheeTitle, candidateName) {
|
139
|
+
const searcheeRes = searcheeTitle
|
132
140
|
.match(RES_STRICT_REGEX)
|
133
141
|
?.groups?.res?.trim()
|
134
142
|
?.toLowerCase();
|
@@ -136,88 +144,116 @@ function resolutionDoesMatch(searcheeName, candidateName, matchMode) {
|
|
136
144
|
.match(RES_STRICT_REGEX)
|
137
145
|
?.groups?.res?.trim()
|
138
146
|
?.toLowerCase();
|
139
|
-
if (searcheeRes
|
147
|
+
if (!searcheeRes || !candidateRes)
|
140
148
|
return true;
|
141
|
-
|
142
|
-
// if we are unsure, pass in risky or partial mode but fail in safe mode
|
143
|
-
if (!searcheeRes || !candidateRes) {
|
144
|
-
return matchMode !== MatchMode.SAFE;
|
145
|
-
}
|
146
|
-
return searcheeRes.startsWith(candidateRes);
|
149
|
+
return extractInt(searcheeRes) === extractInt(candidateRes);
|
147
150
|
}
|
148
|
-
function
|
149
|
-
const
|
150
|
-
const
|
151
|
-
|
152
|
-
|
153
|
-
?.toLowerCase();
|
154
|
-
const candidateTypeStr = candidateVersionType?.groups?.type
|
155
|
-
?.trim()
|
156
|
-
?.toLowerCase();
|
157
|
-
if (searcheeTypeStr !== candidateTypeStr ||
|
158
|
-
searcheeVersionType?.groups?.arrtype) {
|
159
|
-
return matchMode !== MatchMode.SAFE;
|
151
|
+
function releaseGroupDoesMatch(searcheeTitle, candidateName) {
|
152
|
+
const searcheeReleaseGroup = getReleaseGroup(stripExtension(searcheeTitle))?.toLowerCase();
|
153
|
+
const candidateReleaseGroup = getReleaseGroup(stripExtension(candidateName))?.toLowerCase();
|
154
|
+
if (!searcheeReleaseGroup || !candidateReleaseGroup) {
|
155
|
+
return true; // Pass if missing -GRP
|
160
156
|
}
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
157
|
+
if (searcheeReleaseGroup.startsWith(candidateReleaseGroup) ||
|
158
|
+
candidateReleaseGroup.startsWith(searcheeReleaseGroup)) {
|
159
|
+
return true; // -GRP matches
|
160
|
+
}
|
161
|
+
// Anime naming can cause weird things to match as release groups
|
162
|
+
const searcheeAnimeGroup = searcheeTitle
|
163
|
+
.match(ANIME_GROUP_REGEX)
|
166
164
|
?.groups?.group?.trim()
|
167
165
|
?.toLowerCase();
|
168
|
-
const
|
169
|
-
.match(
|
166
|
+
const candidateAnimeGroup = candidateName
|
167
|
+
.match(ANIME_GROUP_REGEX)
|
170
168
|
?.groups?.group?.trim()
|
171
169
|
?.toLowerCase();
|
172
|
-
if (
|
173
|
-
return
|
170
|
+
if (!searcheeAnimeGroup && !candidateAnimeGroup) {
|
171
|
+
return false;
|
174
172
|
}
|
175
|
-
//
|
176
|
-
if (
|
177
|
-
return
|
173
|
+
// Most checks will never get here, below are rare edge cases
|
174
|
+
if (searcheeAnimeGroup === candidateAnimeGroup) {
|
175
|
+
return true;
|
178
176
|
}
|
179
|
-
|
180
|
-
|
181
|
-
async function assessCandidateHelper(candidate, searchee, hashesToExclude) {
|
182
|
-
const { matchMode, blockList } = getRuntimeConfig();
|
183
|
-
const { name, size, link } = candidate;
|
184
|
-
if (!releaseGroupDoesMatch(searchee.name, name, matchMode)) {
|
185
|
-
return { decision: Decision.RELEASE_GROUP_MISMATCH };
|
177
|
+
if (searcheeAnimeGroup && searcheeAnimeGroup === candidateReleaseGroup) {
|
178
|
+
return true;
|
186
179
|
}
|
187
|
-
if (
|
188
|
-
return
|
180
|
+
if (candidateAnimeGroup && searcheeReleaseGroup === candidateAnimeGroup) {
|
181
|
+
return true;
|
189
182
|
}
|
190
|
-
|
191
|
-
|
192
|
-
|
183
|
+
return false;
|
184
|
+
}
|
185
|
+
function sourceDoesMatch(searcheeTitle, candidateName) {
|
186
|
+
const searcheeSource = parseSource(searcheeTitle);
|
187
|
+
const candidateSource = parseSource(candidateName);
|
188
|
+
if (!searcheeSource || !candidateSource)
|
189
|
+
return true;
|
190
|
+
return searcheeSource === candidateSource;
|
191
|
+
}
|
192
|
+
export async function assessCandidate(metaOrCandidate, searchee, hashesToExclude) {
|
193
|
+
const { blockList, includeSingleEpisodes, matchMode } = getRuntimeConfig();
|
194
|
+
// When metaOrCandidate is a Metafile, skip straight to the
|
195
|
+
// main matching algorithms as we don't need pre-download filtering.
|
196
|
+
const isCandidate = !(metaOrCandidate instanceof Metafile);
|
197
|
+
const name = metaOrCandidate.name;
|
198
|
+
const size = isCandidate ? metaOrCandidate.size : metaOrCandidate.length;
|
199
|
+
if (isCandidate) {
|
200
|
+
if (!releaseGroupDoesMatch(searchee.title, name)) {
|
201
|
+
return { decision: Decision.RELEASE_GROUP_MISMATCH };
|
193
202
|
}
|
194
|
-
|
195
|
-
else {
|
196
|
-
if (!resolutionDoesMatch(searchee.name, name, matchMode)) {
|
203
|
+
if (!resolutionDoesMatch(searchee.title, name)) {
|
197
204
|
return { decision: Decision.RESOLUTION_MISMATCH };
|
198
205
|
}
|
199
|
-
|
200
|
-
|
201
|
-
|
206
|
+
if (!sourceDoesMatch(searchee.title, name)) {
|
207
|
+
return { decision: Decision.SOURCE_MISMATCH };
|
208
|
+
}
|
209
|
+
if (size && !fuzzySizeDoesMatch(size, searchee)) {
|
210
|
+
return { decision: Decision.FUZZY_SIZE_MISMATCH };
|
211
|
+
}
|
212
|
+
if (!metaOrCandidate.link) {
|
213
|
+
return { decision: Decision.NO_DOWNLOAD_LINK };
|
214
|
+
}
|
202
215
|
}
|
203
216
|
if (findBlockedStringInReleaseMaybe(searchee, blockList)) {
|
204
217
|
return { decision: Decision.BLOCKED_RELEASE };
|
205
218
|
}
|
206
|
-
|
207
|
-
if (
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
219
|
+
let metafile;
|
220
|
+
if (isCandidate) {
|
221
|
+
let res = await snatch(metaOrCandidate);
|
222
|
+
if (res.isErr()) {
|
223
|
+
const e = res.unwrapErr();
|
224
|
+
if ([Label.ANNOUNCE, Label.RSS].includes(searchee.label) &&
|
225
|
+
![SnatchError.RATE_LIMITED, SnatchError.MAGNET_LINK].includes(e)) {
|
226
|
+
await wait(ms("30 seconds"));
|
227
|
+
res = await snatch(metaOrCandidate);
|
228
|
+
}
|
229
|
+
if (res.isErr()) {
|
230
|
+
const err = res.unwrapErr();
|
231
|
+
return err === SnatchError.MAGNET_LINK
|
232
|
+
? { decision: Decision.MAGNET_LINK }
|
233
|
+
: err === SnatchError.RATE_LIMITED
|
234
|
+
? { decision: Decision.RATE_LIMITED }
|
235
|
+
: { decision: Decision.DOWNLOAD_FAILED };
|
236
|
+
}
|
237
|
+
}
|
238
|
+
metafile = res.unwrap();
|
239
|
+
cacheTorrentFile(metafile);
|
240
|
+
metaOrCandidate.size = metafile.length; // Trackers can be wrong
|
241
|
+
}
|
242
|
+
else {
|
243
|
+
metafile = metaOrCandidate;
|
244
|
+
}
|
245
|
+
if (searchee.infoHash === metafile.infoHash) {
|
246
|
+
return { decision: Decision.SAME_INFO_HASH, metafile };
|
214
247
|
}
|
215
|
-
const metafile = result.unwrap();
|
216
|
-
cacheTorrentFile(metafile);
|
217
|
-
candidate.size = metafile.length; // Trackers can be wrong
|
218
248
|
if (hashesToExclude.includes(metafile.infoHash)) {
|
219
249
|
return { decision: Decision.INFO_HASH_ALREADY_EXISTS, metafile };
|
220
250
|
}
|
251
|
+
// Prevent candidate episodes from matching searchee season packs
|
252
|
+
if (!includeSingleEpisodes &&
|
253
|
+
SEASON_REGEX.test(searchee.title) &&
|
254
|
+
isSingleEpisode(metafile, getMediaType(metafile))) {
|
255
|
+
return { decision: Decision.FILE_TREE_MISMATCH, metafile };
|
256
|
+
}
|
221
257
|
const perfectMatch = compareFileTrees(metafile, searchee);
|
222
258
|
if (perfectMatch) {
|
223
259
|
return { decision: Decision.MATCH, metafile };
|
@@ -227,7 +263,7 @@ async function assessCandidateHelper(candidate, searchee, hashesToExclude) {
|
|
227
263
|
return { decision: Decision.MATCH_SIZE_ONLY, metafile };
|
228
264
|
}
|
229
265
|
if (matchMode === MatchMode.PARTIAL) {
|
230
|
-
const partialSizeMatch =
|
266
|
+
const partialSizeMatch = getPartialSizeRatio(metafile, searchee) >= getMinSizeRatio();
|
231
267
|
if (!partialSizeMatch) {
|
232
268
|
return { decision: Decision.PARTIAL_SIZE_MISMATCH, metafile };
|
233
269
|
}
|
@@ -248,8 +284,22 @@ function existsInTorrentCache(infoHash) {
|
|
248
284
|
utimesSync(torrentPath, new Date(), statSync(torrentPath).mtime);
|
249
285
|
return true;
|
250
286
|
}
|
251
|
-
async function getCachedTorrentFile(infoHash) {
|
252
|
-
|
287
|
+
async function getCachedTorrentFile(infoHash, options = { deleteOnFail: true }) {
|
288
|
+
const torrentPath = path.join(appDir(), TORRENT_CACHE_FOLDER, `${infoHash}.cached.torrent`);
|
289
|
+
try {
|
290
|
+
return resultOf(await parseTorrentFromFilename(torrentPath));
|
291
|
+
}
|
292
|
+
catch (e) {
|
293
|
+
logger.error({
|
294
|
+
label: Label.DECIDE,
|
295
|
+
message: `Failed to parse cached torrent ${sanitizeInfoHash(infoHash)}${options.deleteOnFail ? " - deleting" : ""}`,
|
296
|
+
});
|
297
|
+
logger.debug(e);
|
298
|
+
if (options.deleteOnFail) {
|
299
|
+
unlinkSync(torrentPath);
|
300
|
+
}
|
301
|
+
return resultOfErr(e);
|
302
|
+
}
|
253
303
|
}
|
254
304
|
function cacheTorrentFile(meta) {
|
255
305
|
const torrentPath = path.join(appDir(), TORRENT_CACHE_FOLDER, `${meta.infoHash}.cached.torrent`);
|
@@ -257,77 +307,112 @@ function cacheTorrentFile(meta) {
|
|
257
307
|
return;
|
258
308
|
writeFileSync(torrentPath, meta.encode());
|
259
309
|
}
|
260
|
-
async function assessAndSaveResults(
|
261
|
-
const assessment = await
|
310
|
+
async function assessAndSaveResults(metaOrCandidate, searchee, guid, infoHashesToExclude, firstSeen) {
|
311
|
+
const assessment = await assessCandidate(metaOrCandidate, searchee, infoHashesToExclude);
|
262
312
|
await db.transaction(async (trx) => {
|
263
|
-
const now = Date.now();
|
264
313
|
const { id } = await trx("searchee")
|
265
314
|
.select("id")
|
266
|
-
.where({ name: searchee.
|
315
|
+
.where({ name: searchee.title })
|
267
316
|
.first();
|
268
|
-
await trx("decision")
|
317
|
+
await trx("decision")
|
318
|
+
.insert({
|
269
319
|
searchee_id: id,
|
270
320
|
guid: guid,
|
271
|
-
decision: assessment.decision,
|
272
321
|
info_hash: assessment.metafile?.infoHash ?? null,
|
273
|
-
|
274
|
-
first_seen:
|
275
|
-
|
322
|
+
decision: assessment.decision,
|
323
|
+
first_seen: firstSeen,
|
324
|
+
last_seen: Date.now(),
|
325
|
+
fuzzy_size_factor: getFuzzySizeFactor(),
|
326
|
+
})
|
327
|
+
.onConflict(["searchee_id", "guid"])
|
328
|
+
.merge();
|
276
329
|
});
|
277
330
|
return assessment;
|
278
331
|
}
|
279
|
-
|
332
|
+
/**
|
333
|
+
* Some trackers have alt titles which get their own guid but resolve to same torrent
|
334
|
+
* @param guid The guid of the candidate
|
335
|
+
* @returns The info hash of the torrent if found
|
336
|
+
*/
|
337
|
+
async function fuzzyGuidLookup(guid) {
|
338
|
+
if (!guid.includes(".tv/torrent/"))
|
339
|
+
return;
|
340
|
+
const torrentIdStr = guid.match(/\.tv\/torrent\/(\d+)\/group/)?.[1];
|
341
|
+
if (!torrentIdStr)
|
342
|
+
return;
|
343
|
+
return (await db("decision")
|
344
|
+
.select({ infoHash: "info_hash" })
|
345
|
+
.where("guid", "like", `%.tv/torrent/${torrentIdStr}/group%`)
|
346
|
+
.whereNotNull("info_hash")
|
347
|
+
.first())?.infoHash;
|
348
|
+
}
|
349
|
+
export async function assessCandidateCaching(candidate, searchee, infoHashesToExclude) {
|
280
350
|
const { guid, name, tracker } = candidate;
|
281
|
-
const logReason = createReasonLogger(name, tracker, searchee.name);
|
282
351
|
const cacheEntry = await db("decision")
|
283
352
|
.select({
|
284
|
-
decision: "decision.decision",
|
285
|
-
infoHash: "decision.info_hash",
|
286
353
|
id: "decision.id",
|
354
|
+
infoHash: "decision.info_hash",
|
355
|
+
decision: "decision.decision",
|
356
|
+
firstSeen: "decision.first_seen",
|
357
|
+
fuzzySizeFactor: "decision.fuzzy_size_factor",
|
287
358
|
})
|
288
359
|
.join("searchee", "decision.searchee_id", "searchee.id")
|
289
|
-
.where({ name: searchee.
|
360
|
+
.where({ name: searchee.title, guid })
|
290
361
|
.first();
|
362
|
+
const metaInfoHash = (await db("decision")
|
363
|
+
.select({ infoHash: "info_hash" })
|
364
|
+
.where({ guid })
|
365
|
+
.whereNotNull("info_hash")
|
366
|
+
.first())?.infoHash ?? (await fuzzyGuidLookup(guid));
|
367
|
+
const metaOrCandidate = metaInfoHash
|
368
|
+
? existsInTorrentCache(metaInfoHash)
|
369
|
+
? (await getCachedTorrentFile(metaInfoHash)).orElse(candidate)
|
370
|
+
: candidate
|
371
|
+
: candidate;
|
372
|
+
if (metaOrCandidate instanceof Metafile) {
|
373
|
+
logger.verbose({
|
374
|
+
label: Label.DECIDE,
|
375
|
+
message: `Using cached torrent ${sanitizeInfoHash(metaInfoHash)} for ${tracker} assessment ${name}`,
|
376
|
+
});
|
377
|
+
candidate.size = metaOrCandidate.length; // Trackers can be wrong
|
378
|
+
}
|
291
379
|
let assessment;
|
292
|
-
if (!cacheEntry?.decision
|
293
|
-
|
294
|
-
|
295
|
-
assessment = await assessAndSaveResults(candidate, searchee, guid, infoHashesToExclude);
|
296
|
-
logReason(assessment.decision, false, searchee, candidate);
|
380
|
+
if (!cacheEntry?.decision) {
|
381
|
+
// New candidate, could be metafile from cache
|
382
|
+
assessment = await assessAndSaveResults(metaOrCandidate, searchee, guid, infoHashesToExclude, Date.now());
|
297
383
|
}
|
298
|
-
else if (
|
384
|
+
else if (isAnyMatchedDecision(cacheEntry.decision) &&
|
299
385
|
infoHashesToExclude.includes(cacheEntry.infoHash)) {
|
300
|
-
//
|
386
|
+
// Already injected fast path, preserve match decision
|
301
387
|
assessment = { decision: Decision.INFO_HASH_ALREADY_EXISTS };
|
302
|
-
await db("decision")
|
303
|
-
|
304
|
-
|
305
|
-
}
|
306
|
-
else if (isDecisionAnyMatch(cacheEntry.decision) &&
|
307
|
-
cacheEntry.infoHash &&
|
308
|
-
existsInTorrentCache(cacheEntry.infoHash)) {
|
309
|
-
// cached match
|
310
|
-
assessment = {
|
311
|
-
decision: cacheEntry.decision,
|
312
|
-
metafile: await getCachedTorrentFile(cacheEntry.infoHash),
|
313
|
-
};
|
388
|
+
await db("decision").where({ id: cacheEntry.id }).update({
|
389
|
+
last_seen: Date.now(),
|
390
|
+
});
|
314
391
|
}
|
315
|
-
else if (
|
316
|
-
|
317
|
-
|
392
|
+
else if (isStaticDecision(cacheEntry.decision)) {
|
393
|
+
// These decisions will never change unless we update their logic
|
394
|
+
assessment = { decision: cacheEntry.decision };
|
395
|
+
await db("decision").where({ id: cacheEntry.id }).update({
|
396
|
+
last_seen: Date.now(),
|
397
|
+
});
|
318
398
|
}
|
319
399
|
else {
|
320
|
-
// cached
|
321
|
-
|
322
|
-
|
400
|
+
// Re-assess decisions using Metafile if cached
|
401
|
+
if (cacheEntry.decision !== Decision.FUZZY_SIZE_MISMATCH ||
|
402
|
+
cacheEntry.fuzzySizeFactor < getFuzzySizeFactor()) {
|
403
|
+
assessment = await assessAndSaveResults(metaOrCandidate, searchee, guid, infoHashesToExclude, cacheEntry.firstSeen);
|
404
|
+
}
|
405
|
+
else {
|
406
|
+
assessment = { decision: Decision.FUZZY_SIZE_MISMATCH };
|
407
|
+
await db("decision").where({ id: cacheEntry.id }).update({
|
408
|
+
last_seen: Date.now(),
|
409
|
+
});
|
410
|
+
}
|
323
411
|
}
|
324
|
-
|
325
|
-
if (
|
326
|
-
|
327
|
-
.where({ id: cacheEntry.id })
|
328
|
-
.update({ last_seen: Date.now() });
|
412
|
+
const wasCached = cacheEntry?.decision === assessment.decision;
|
413
|
+
if (!wasCached) {
|
414
|
+
logDecision(searchee, candidate, assessment.decision, assessment.metafile, tracker);
|
329
415
|
}
|
330
416
|
return assessment;
|
331
417
|
}
|
332
|
-
export { assessCandidateCaching as assessCandidate };
|
333
418
|
//# sourceMappingURL=decide.js.map
|
package/dist/decide.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"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"}
|
package/dist/diff.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
+
import { deepStrictEqual } from "assert";
|
1
2
|
import { createSearcheeFromMetafile } from "./searchee.js";
|
2
3
|
import { parseTorrentFromFilename } from "./torrent.js";
|
3
|
-
import { deepStrictEqual } from "assert";
|
4
4
|
function diff(thing1, thing2) {
|
5
5
|
try {
|
6
6
|
deepStrictEqual(thing1, thing2);
|
@@ -14,8 +14,18 @@ function diff(thing1, thing2) {
|
|
14
14
|
export async function diffCmd(first, second) {
|
15
15
|
const firstMeta = await parseTorrentFromFilename(first);
|
16
16
|
const secondMeta = await parseTorrentFromFilename(second);
|
17
|
-
const
|
18
|
-
|
17
|
+
const firstSearcheeRes = createSearcheeFromMetafile(firstMeta);
|
18
|
+
if (firstSearcheeRes.isErr()) {
|
19
|
+
console.log(firstSearcheeRes.unwrapErr());
|
20
|
+
return;
|
21
|
+
}
|
22
|
+
const secondSearcheeRes = createSearcheeFromMetafile(secondMeta);
|
23
|
+
if (secondSearcheeRes.isErr()) {
|
24
|
+
console.log(secondSearcheeRes.unwrapErr());
|
25
|
+
return;
|
26
|
+
}
|
27
|
+
const firstSearchee = firstSearcheeRes.unwrap();
|
28
|
+
const secondSearchee = secondSearcheeRes.unwrap();
|
19
29
|
delete firstSearchee.infoHash;
|
20
30
|
delete secondSearchee.infoHash;
|
21
31
|
diff(firstSearchee, secondSearchee);
|
package/dist/diff.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAExD,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM;IAC3B,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,SAAS,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1C,OAAO;IACR,CAAC;IACD,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IACjE,IAAI,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3C,OAAO;IACR,CAAC;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC;IAClD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAC9B,OAAO,cAAc,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AACrC,CAAC"}
|