cross-seed 6.0.0-8 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/action.js +177 -71
  2. package/dist/action.js.map +1 -1
  3. package/dist/arr.js +62 -54
  4. package/dist/arr.js.map +1 -1
  5. package/dist/clients/Deluge.js +70 -46
  6. package/dist/clients/Deluge.js.map +1 -1
  7. package/dist/clients/QBittorrent.js +110 -68
  8. package/dist/clients/QBittorrent.js.map +1 -1
  9. package/dist/clients/RTorrent.js +46 -23
  10. package/dist/clients/RTorrent.js.map +1 -1
  11. package/dist/clients/TorrentClient.js +14 -1
  12. package/dist/clients/TorrentClient.js.map +1 -1
  13. package/dist/clients/Transmission.js +30 -10
  14. package/dist/clients/Transmission.js.map +1 -1
  15. package/dist/cmd.js +46 -23
  16. package/dist/cmd.js.map +1 -1
  17. package/dist/config.template.cjs +59 -59
  18. package/dist/config.template.cjs.map +1 -1
  19. package/dist/configSchema.js +90 -26
  20. package/dist/configSchema.js.map +1 -1
  21. package/dist/configuration.js +4 -1
  22. package/dist/configuration.js.map +1 -1
  23. package/dist/constants.js +77 -9
  24. package/dist/constants.js.map +1 -1
  25. package/dist/dataFiles.js +4 -5
  26. package/dist/dataFiles.js.map +1 -1
  27. package/dist/db.js +2 -1
  28. package/dist/db.js.map +1 -1
  29. package/dist/decide.js +279 -169
  30. package/dist/decide.js.map +1 -1
  31. package/dist/diff.js +13 -3
  32. package/dist/diff.js.map +1 -1
  33. package/dist/errors.js.map +1 -1
  34. package/dist/indexers.js +94 -33
  35. package/dist/indexers.js.map +1 -1
  36. package/dist/inject.js +448 -0
  37. package/dist/inject.js.map +1 -0
  38. package/dist/jobs.js +13 -6
  39. package/dist/jobs.js.map +1 -1
  40. package/dist/logger.js +27 -9
  41. package/dist/logger.js.map +1 -1
  42. package/dist/migrations/00-initialSchema.js.map +1 -1
  43. package/dist/migrations/05-caps.js.map +1 -1
  44. package/dist/migrations/06-uniqueDecisions.js +29 -0
  45. package/dist/migrations/06-uniqueDecisions.js.map +1 -0
  46. package/dist/migrations/07-limits.js +12 -0
  47. package/dist/migrations/07-limits.js.map +1 -0
  48. package/dist/migrations/migrations.js +4 -0
  49. package/dist/migrations/migrations.js.map +1 -1
  50. package/dist/parseTorrent.js +6 -0
  51. package/dist/parseTorrent.js.map +1 -1
  52. package/dist/pipeline.js +224 -112
  53. package/dist/pipeline.js.map +1 -1
  54. package/dist/preFilter.js +122 -55
  55. package/dist/preFilter.js.map +1 -1
  56. package/dist/pushNotifier.js +7 -5
  57. package/dist/pushNotifier.js.map +1 -1
  58. package/dist/searchee.js +198 -17
  59. package/dist/searchee.js.map +1 -1
  60. package/dist/server.js +106 -54
  61. package/dist/server.js.map +1 -1
  62. package/dist/startup.js +16 -7
  63. package/dist/startup.js.map +1 -1
  64. package/dist/torrent.js +116 -50
  65. package/dist/torrent.js.map +1 -1
  66. package/dist/torznab.js +323 -153
  67. package/dist/torznab.js.map +1 -1
  68. package/dist/utils.js +229 -44
  69. package/dist/utils.js.map +1 -1
  70. package/package.json +11 -6
package/dist/pipeline.js CHANGED
@@ -3,47 +3,48 @@ import fs from "fs";
3
3
  import { zip } from "lodash-es";
4
4
  import ms from "ms";
5
5
  import { performAction, performActions } from "./action.js";
6
- import { Decision, InjectionResult, } from "./constants.js";
6
+ import { Decision, InjectionResult, isAnyMatchedDecision, SaveResult, } from "./constants.js";
7
7
  import { findPotentialNestedRoots, findSearcheesFromAllDataDirs, } from "./dataFiles.js";
8
8
  import { db } from "./db.js";
9
- import { assessCandidate } from "./decide.js";
9
+ import { assessCandidateCaching } from "./decide.js";
10
10
  import { IndexerStatus, updateIndexerStatus, updateSearchTimestamps, } from "./indexers.js";
11
11
  import { Label, logger } from "./logger.js";
12
- import { filterByContent, filterDupes, filterTimestamps } from "./preFilter.js";
12
+ import { filterByContent, filterDupesFromSimilar, filterTimestamps, } from "./preFilter.js";
13
13
  import { sendResultsNotification } from "./pushNotifier.js";
14
14
  import { isOk } from "./Result.js";
15
15
  import { getRuntimeConfig } from "./runtimeConfig.js";
16
16
  import { createSearcheeFromMetafile, createSearcheeFromPath, createSearcheeFromTorrentFile, } from "./searchee.js";
17
- import { getInfoHashesToExclude, getTorrentByCriteria, getTorrentByFuzzyName, indexNewTorrents, loadTorrentDirLight, } from "./torrent.js";
18
- import { queryRssFeeds, searchTorznab } from "./torznab.js";
19
- import { filterAsync, isTruthy, stripExtension } from "./utils.js";
17
+ import { getInfoHashesToExclude, getSimilarTorrentsByName, getTorrentByCriteria, indexNewTorrents, loadTorrentDirLight, } from "./torrent.js";
18
+ import { getSearchString, queryRssFeeds, searchTorznab, } from "./torznab.js";
19
+ import { getLogString, humanReadableDate, isTruthy, wait } from "./utils.js";
20
20
  async function assessCandidates(candidates, searchee, hashesToExclude) {
21
21
  const assessments = [];
22
22
  for (const result of candidates) {
23
- const assessment = await assessCandidate(result, searchee, hashesToExclude);
23
+ const assessment = await assessCandidateCaching(result, searchee, hashesToExclude);
24
24
  assessments.push({ assessment, tracker: result.tracker });
25
25
  }
26
26
  return assessments;
27
27
  }
28
- async function findOnOtherSites(searchee, hashesToExclude) {
28
+ async function findOnOtherSites(searchee, hashesToExclude, cachedSearch, progress) {
29
29
  // make sure searchee is in database
30
30
  await db("searchee")
31
- .insert({ name: searchee.name })
31
+ .insert({ name: searchee.title })
32
32
  .onConflict("name")
33
33
  .ignore();
34
- let response;
35
- try {
36
- response = await searchTorznab(searchee);
37
- }
38
- catch (e) {
39
- logger.error(`error searching for ${searchee.name}`);
40
- logger.debug(e);
41
- return { searchedIndexers: 0, matches: 0 };
42
- }
34
+ const response = await searchTorznab(searchee, cachedSearch, progress);
35
+ const cachedIndexers = cachedSearch.indexerCandidates.length;
36
+ const searchedIndexers = response.length - cachedIndexers;
37
+ cachedSearch.indexerCandidates = response;
43
38
  const results = response.flatMap((e) => e.candidates.map((candidate) => ({
44
39
  ...candidate,
45
40
  indexerId: e.indexerId,
46
41
  })));
42
+ if (response.length) {
43
+ logger.verbose({
44
+ label: Label.DECIDE,
45
+ message: `Assessing ${results.length} candidates for ${searchee.title} from ${searchedIndexers}|${cachedIndexers} indexers by search|cache`,
46
+ });
47
+ }
47
48
  const assessments = await assessCandidates(results, searchee, hashesToExclude);
48
49
  const { rateLimited, notRateLimited } = assessments.reduce((acc, cur, idx) => {
49
50
  const candidate = results[idx];
@@ -56,165 +57,276 @@ async function findOnOtherSites(searchee, hashesToExclude) {
56
57
  rateLimited: new Set(),
57
58
  notRateLimited: new Set(response.map((r) => r.indexerId)),
58
59
  });
59
- const matches = assessments.filter((e) => e.assessment.decision === Decision.MATCH ||
60
- e.assessment.decision === Decision.MATCH_SIZE_ONLY ||
61
- e.assessment.decision === Decision.MATCH_PARTIAL);
60
+ const matches = assessments.filter((e) => isAnyMatchedDecision(e.assessment.decision));
62
61
  const actionResults = await performActions(searchee, matches);
63
- if (actionResults.includes(InjectionResult.TORRENT_NOT_COMPLETE)) {
64
- // If the torrent is not complete, "cancel the search"
65
- return { matches: 0, searchedIndexers: 0 };
66
- }
67
- await updateSearchTimestamps(searchee.name, Array.from(notRateLimited));
62
+ await updateSearchTimestamps(searchee.title, Array.from(notRateLimited));
68
63
  await updateIndexerStatus(IndexerStatus.RATE_LIMITED, Date.now() + ms("1 hour"), Array.from(rateLimited));
69
64
  const zipped = zip(matches.map((m) => m.assessment), matches.map((m) => m.tracker), actionResults);
70
- sendResultsNotification(searchee, zipped, Label.SEARCH);
71
- return { matches: matches.length, searchedIndexers: response.length };
65
+ sendResultsNotification(searchee, zipped);
66
+ return { searchedIndexers, matches: matches.length };
72
67
  }
73
- async function findMatchesBatch(samples, hashesToExclude) {
68
+ async function findMatchesBatch(searchees, hashesToExclude) {
74
69
  const { delay } = getRuntimeConfig();
75
70
  let totalFound = 0;
76
- for (const [i, sample] of samples.entries()) {
71
+ let prevSearchTime = 0;
72
+ const cachedSearch = { q: null, indexerCandidates: [] };
73
+ for (const [i, searchee] of searchees.entries()) {
74
+ const progress = chalk.blue(`(${i + 1}/${searchees.length}) `);
77
75
  try {
78
- const sleep = new Promise((r) => setTimeout(r, delay * 1000));
79
- const progress = chalk.blue(`[${i + 1}/${samples.length}]`);
80
- const name = stripExtension(sample.name);
81
- logger.info("%s %s %s", progress, chalk.dim("Searching for"), name);
82
- const { matches, searchedIndexers } = await findOnOtherSites(sample, hashesToExclude);
76
+ const sleepTime = delay * 1000 - (Date.now() - prevSearchTime);
77
+ if (sleepTime > 0) {
78
+ await wait(sleepTime);
79
+ }
80
+ const searchTime = Date.now();
81
+ const { searchedIndexers, matches } = await findOnOtherSites(searchee, hashesToExclude, cachedSearch, progress);
83
82
  totalFound += matches;
84
- // if all indexers were rate limited, don't sleep
83
+ // if all indexers were rate limited or cached, don't sleep
85
84
  if (searchedIndexers === 0)
86
85
  continue;
87
- await sleep;
86
+ prevSearchTime = searchTime;
88
87
  }
89
88
  catch (e) {
90
- logger.error(`error searching for ${sample.name}`);
89
+ const searcheeLog = getLogString(searchee, chalk.bold.white);
90
+ logger.error({
91
+ label: searchee.label,
92
+ message: `${progress}Error searching for ${searcheeLog}`,
93
+ });
91
94
  logger.debug(e);
92
95
  }
93
96
  }
94
97
  return totalFound;
95
98
  }
96
99
  export async function searchForLocalTorrentByCriteria(criteria) {
97
- const { maxDataDepth } = getRuntimeConfig();
98
- let searchees;
99
- if (criteria.path) {
100
- const searcheeResults = await Promise.all(findPotentialNestedRoots(criteria.path, maxDataDepth).map(createSearcheeFromPath));
101
- searchees = searcheeResults.filter(isOk).map((t) => t.unwrap());
100
+ const { delay, maxDataDepth } = getRuntimeConfig();
101
+ const rawSearchees = [];
102
+ if (criteria.infoHash || !criteria.path) {
103
+ const res = createSearcheeFromMetafile(await getTorrentByCriteria(criteria));
104
+ if (res.isOk())
105
+ rawSearchees.push(res.unwrap());
102
106
  }
103
107
  else {
104
- searchees = [await getTorrentByCriteria(criteria)];
108
+ const searcheeResults = await Promise.all(findPotentialNestedRoots(criteria.path, maxDataDepth).map(createSearcheeFromPath));
109
+ rawSearchees.push(...searcheeResults.filter(isOk).map((r) => r.unwrap()));
105
110
  }
111
+ const searchees = rawSearchees.map((searchee) => ({
112
+ ...searchee,
113
+ label: Label.WEBHOOK,
114
+ }));
115
+ const includeEpisodes = searchees.length === 1;
106
116
  const hashesToExclude = await getInfoHashesToExclude();
107
- let matches = 0;
108
- for (let i = 0; i < searchees.length; i++) {
109
- if (!filterByContent(searchees[i]))
110
- return null;
111
- const foundOnOtherSites = await findOnOtherSites(searchees[i], hashesToExclude);
112
- matches += foundOnOtherSites.matches;
113
- }
114
- return matches;
117
+ let totalFound = 0;
118
+ let filtered = 0;
119
+ const cachedSearch = { q: null, indexerCandidates: [] };
120
+ for (const [i, searchee] of searchees.entries()) {
121
+ const progress = chalk.blue(`(${i + 1}/${searchees.length}) `);
122
+ try {
123
+ if (!filterByContent(searchee, includeEpisodes)) {
124
+ filtered++;
125
+ continue;
126
+ }
127
+ const sleep = wait(delay * 1000);
128
+ const { matches, searchedIndexers } = await findOnOtherSites(searchee, hashesToExclude, cachedSearch, progress);
129
+ totalFound += matches;
130
+ // if all indexers were rate limited, don't sleep
131
+ if (searchedIndexers === 0 || i === searchees.length - 1)
132
+ continue;
133
+ await sleep;
134
+ }
135
+ catch (e) {
136
+ const searcheeLog = getLogString(searchee, chalk.bold.white);
137
+ logger.error({
138
+ label: searchee.label,
139
+ message: `${progress}Error searching for ${searcheeLog}`,
140
+ });
141
+ logger.debug(e);
142
+ }
143
+ }
144
+ if (filtered === searchees.length)
145
+ return null;
146
+ return totalFound;
115
147
  }
116
- export async function checkNewCandidateMatch(candidate) {
117
- const meta = await getTorrentByFuzzyName(candidate.name);
118
- if (meta === null) {
148
+ export async function checkNewCandidateMatch(candidate, searcheeLabel) {
149
+ const candidateLog = `${chalk.bold.white(candidate.name)} from ${candidate.tracker}`;
150
+ const { keys, metas } = await getSimilarTorrentsByName(candidate.name);
151
+ const method = keys.length ? `[${keys}]` : "Fuse fallback";
152
+ if (!metas.length) {
119
153
  logger.verbose({
120
- label: Label.REVERSE_LOOKUP,
121
- message: `Did not find an existing entry for ${candidate.name}`,
154
+ label: searcheeLabel,
155
+ message: `Did not find an existing entry using ${method} for ${candidateLog}`,
122
156
  });
123
- return null;
157
+ return { decision: null, actionResult: null };
158
+ }
159
+ const searchees = filterDupesFromSimilar(metas
160
+ .map(createSearcheeFromMetafile)
161
+ .filter(isOk)
162
+ .map((r) => r.unwrap())
163
+ .map((searchee) => ({ ...searchee, label: searcheeLabel }))
164
+ .filter((searchee) => filterByContent(searchee)));
165
+ if (!searchees.length) {
166
+ logger.verbose({
167
+ label: searcheeLabel,
168
+ message: `No valid entries found using ${method} for ${candidateLog}`,
169
+ });
170
+ return { decision: null, actionResult: null };
124
171
  }
172
+ logger.verbose({
173
+ label: searcheeLabel,
174
+ message: `Unique entries [${searchees.map((m) => m.title)}] using ${method} for ${candidateLog}`,
175
+ });
125
176
  const hashesToExclude = await getInfoHashesToExclude();
126
- if (!filterByContent(meta))
127
- return null;
128
- const searchee = createSearcheeFromMetafile(meta);
129
- // make sure searchee is in database
130
- await db("searchee")
131
- .insert({ name: searchee.name })
132
- .onConflict("name")
133
- .ignore();
134
- const assessment = await assessCandidate(candidate, searchee, hashesToExclude);
135
- if (assessment.decision !== Decision.MATCH &&
136
- assessment.decision !== Decision.MATCH_SIZE_ONLY &&
137
- assessment.decision !== Decision.MATCH_PARTIAL) {
138
- return null;
177
+ let decision = null;
178
+ let actionResult = null;
179
+ searchees.sort((a, b) => b.files.length - a.files.length);
180
+ for (const searchee of searchees) {
181
+ await db("searchee")
182
+ .insert({ name: searchee.title })
183
+ .onConflict("name")
184
+ .ignore();
185
+ const assessment = await assessCandidateCaching(candidate, searchee, hashesToExclude);
186
+ if (!isAnyMatchedDecision(assessment.decision)) {
187
+ if (assessment.decision === Decision.SAME_INFO_HASH) {
188
+ decision = null;
189
+ break;
190
+ }
191
+ if (assessment.decision === Decision.INFO_HASH_ALREADY_EXISTS &&
192
+ (!decision || !isAnyMatchedDecision(decision))) {
193
+ decision = assessment.decision;
194
+ }
195
+ continue;
196
+ }
197
+ decision = assessment.decision;
198
+ ({ actionResult } = await performAction(assessment.metafile, assessment.decision, searchee, candidate.tracker));
199
+ sendResultsNotification(searchee, [
200
+ [assessment, candidate.tracker, actionResult],
201
+ ]);
202
+ if (actionResult === SaveResult.SAVED ||
203
+ actionResult === InjectionResult.SUCCESS ||
204
+ actionResult === InjectionResult.ALREADY_EXISTS) {
205
+ break;
206
+ }
139
207
  }
140
- const result = await performAction(assessment.metafile, assessment.decision, searchee, candidate.tracker);
141
- await sendResultsNotification(searchee, [[assessment, candidate.tracker, result]], Label.REVERSE_LOOKUP);
142
- return result;
208
+ return { decision, actionResult };
143
209
  }
144
- async function findSearchableTorrents() {
145
- const { torrents, dataDirs, torrentDir, searchLimit } = getRuntimeConfig();
146
- let allSearchees = [];
210
+ export async function findAllSearchees(searcheeLabel) {
211
+ const { torrents, dataDirs, torrentDir } = getRuntimeConfig();
212
+ const rawSearchees = [];
147
213
  if (Array.isArray(torrents)) {
148
214
  const searcheeResults = await Promise.all(torrents.map(createSearcheeFromTorrentFile));
149
- allSearchees = searcheeResults.filter(isOk).map((r) => r.unwrap());
215
+ rawSearchees.push(...searcheeResults.filter(isOk).map((r) => r.unwrap()));
150
216
  }
151
217
  else {
152
218
  if (typeof torrentDir === "string") {
153
- allSearchees.push(...(await loadTorrentDirLight(torrentDir)));
219
+ rawSearchees.push(...(await loadTorrentDirLight(torrentDir)));
154
220
  }
155
221
  if (Array.isArray(dataDirs)) {
156
222
  const searcheeResults = await Promise.all(findSearcheesFromAllDataDirs().map(createSearcheeFromPath));
157
- allSearchees.push(...searcheeResults.filter(isOk).map((r) => r.unwrap()));
223
+ rawSearchees.push(...searcheeResults.filter(isOk).map((r) => r.unwrap()));
158
224
  }
159
225
  }
160
- const hashesToExclude = allSearchees
226
+ return rawSearchees.map((searchee) => ({
227
+ ...searchee,
228
+ label: searcheeLabel,
229
+ }));
230
+ }
231
+ async function findSearchableTorrents() {
232
+ const { searchLimit } = getRuntimeConfig();
233
+ const realSearchees = await findAllSearchees(Label.SEARCH);
234
+ const hashesToExclude = realSearchees
161
235
  .map((t) => t.infoHash)
162
236
  .filter(isTruthy);
163
- let filteredTorrents = await filterAsync(filterDupes(allSearchees).filter(filterByContent), filterTimestamps);
237
+ // Group the exact same search queries together for easy cache use later
238
+ const grouping = new Map();
239
+ for (const searchee of realSearchees.filter((s) => filterByContent(s))) {
240
+ const key = await getSearchString(searchee);
241
+ if (!grouping.has(key)) {
242
+ grouping.set(key, []);
243
+ }
244
+ grouping.get(key).push(searchee);
245
+ }
246
+ const keysToDelete = [];
247
+ for (const [key, groupedSearchees] of grouping) {
248
+ // If one searchee needs to be searched, use the candidates for all
249
+ const filteredSearchees = filterDupesFromSimilar(groupedSearchees);
250
+ const results = await Promise.all(filteredSearchees.map(filterTimestamps));
251
+ if (!results.some(isTruthy)) {
252
+ keysToDelete.push(key);
253
+ continue;
254
+ }
255
+ // Prefer infoHash
256
+ filteredSearchees.sort((a, b) => {
257
+ if (a.infoHash && !b.infoHash)
258
+ return -1;
259
+ if (!a.infoHash && b.infoHash)
260
+ return 1;
261
+ return 0;
262
+ });
263
+ // Sort by most number files (less chance of partial)
264
+ filteredSearchees.sort((a, b) => {
265
+ return b.files.length - a.files.length;
266
+ });
267
+ grouping.set(key, filteredSearchees);
268
+ }
269
+ for (const key of keysToDelete) {
270
+ grouping.delete(key);
271
+ }
272
+ let finalSearchees = Array.from(grouping.values()).flat();
164
273
  logger.info({
165
274
  label: Label.SEARCH,
166
- message: `Found ${allSearchees.length} torrents, ${filteredTorrents.length} suitable to search for matches`,
275
+ message: `Found ${realSearchees.length} torrents, ${finalSearchees.length} suitable to search for matches using ${grouping.size} unique queries`,
167
276
  });
168
- if (searchLimit && filteredTorrents.length > searchLimit) {
277
+ if (searchLimit && finalSearchees.length > searchLimit) {
169
278
  logger.info({
170
279
  label: Label.SEARCH,
171
280
  message: `Limited to ${searchLimit} searches`,
172
281
  });
173
- filteredTorrents = filteredTorrents.slice(0, searchLimit);
282
+ finalSearchees = finalSearchees.slice(0, searchLimit);
174
283
  }
175
- return { samples: filteredTorrents, hashesToExclude };
284
+ return { searchees: finalSearchees, hashesToExclude };
176
285
  }
177
286
  export async function main() {
178
287
  const { outputDir, linkDir } = getRuntimeConfig();
179
- const { samples, hashesToExclude } = await findSearchableTorrents();
288
+ const { searchees, hashesToExclude } = await findSearchableTorrents();
180
289
  if (!fs.existsSync(outputDir)) {
181
290
  fs.mkdirSync(outputDir, { recursive: true });
182
291
  }
183
292
  if (linkDir && !fs.existsSync(linkDir)) {
184
293
  fs.mkdirSync(linkDir, { recursive: true });
185
294
  }
186
- const totalFound = await findMatchesBatch(samples, hashesToExclude);
295
+ const totalFound = await findMatchesBatch(searchees, hashesToExclude);
187
296
  logger.info({
188
297
  label: Label.SEARCH,
189
- message: chalk.cyan(`Found ${chalk.bold.white(totalFound)} cross seeds from ${chalk.bold.white(samples.length)} original torrents`),
298
+ message: chalk.cyan(`Found ${chalk.bold.white(totalFound)} cross seeds from ${chalk.bold.white(searchees.length)} original torrents`),
190
299
  });
191
300
  }
192
301
  export async function scanRssFeeds() {
193
- const { torznab } = getRuntimeConfig();
194
- if (torznab.length > 0) {
195
- const candidates = await queryRssFeeds();
196
- const lastRun = (await db("job_log")
197
- .select("last_run")
198
- .where({ name: "rss" })
199
- .first())?.last_run ?? 0;
200
- const candidatesSinceLastTime = candidates.filter((c) => c.pubDate > lastRun);
201
- logger.verbose({
202
- label: Label.RSS,
203
- message: `Scan returned ${candidatesSinceLastTime.length} new results, ignoring ${candidates.length - candidatesSinceLastTime.length} already seen`,
204
- });
205
- logger.verbose({
302
+ const { torrentDir, torznab } = getRuntimeConfig();
303
+ if (!torrentDir || !torznab.length) {
304
+ logger.error({
206
305
  label: Label.RSS,
207
- message: "Indexing new torrents...",
306
+ message: "RSS requires torrentDir and torznab to be set",
208
307
  });
209
- await indexNewTorrents();
210
- for (const [i, candidate] of candidatesSinceLastTime.entries()) {
211
- logger.verbose({
212
- label: Label.RSS,
213
- message: `Processing release ${i + 1}/${candidatesSinceLastTime.length}`,
214
- });
215
- await checkNewCandidateMatch(candidate);
216
- }
217
- logger.info({ label: Label.RSS, message: "Scan complete" });
308
+ return;
218
309
  }
310
+ const lastRun = (await db("job_log").select("last_run").where({ name: "rss" }).first())
311
+ ?.last_run ?? 0;
312
+ logger.verbose({
313
+ label: Label.RSS,
314
+ message: "Indexing new torrents...",
315
+ });
316
+ await indexNewTorrents();
317
+ logger.verbose({
318
+ label: Label.RSS,
319
+ message: "Querying RSS feeds...",
320
+ });
321
+ const candidates = queryRssFeeds(lastRun);
322
+ let i = 0;
323
+ for await (const candidate of candidates) {
324
+ await checkNewCandidateMatch(candidate, Label.RSS);
325
+ i++;
326
+ }
327
+ logger.info({
328
+ label: Label.RSS,
329
+ message: `RSS scan complete - checked ${i} new candidates since ${humanReadableDate(lastRun)}`,
330
+ });
219
331
  }
220
332
  //# sourceMappingURL=pipeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}