cross-seed 7.0.0-1 → 7.0.0-11

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 (287) hide show
  1. package/dist/Result.d.ts +27 -0
  2. package/dist/Result.js +64 -0
  3. package/dist/Result.js.map +1 -0
  4. package/dist/action.d.ts +34 -0
  5. package/dist/action.js +694 -0
  6. package/dist/action.js.map +1 -0
  7. package/dist/arr.d.ts +31 -0
  8. package/dist/arr.js +267 -0
  9. package/dist/arr.js.map +1 -0
  10. package/dist/auth.d.ts +3 -0
  11. package/dist/auth.js +28 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/clients/Deluge.d.ts +153 -0
  14. package/dist/clients/Deluge.js +699 -0
  15. package/dist/clients/Deluge.js.map +1 -0
  16. package/dist/clients/QBittorrent.d.ts +218 -0
  17. package/dist/clients/QBittorrent.js +786 -0
  18. package/dist/clients/QBittorrent.js.map +1 -0
  19. package/dist/clients/RTorrent.d.ts +43 -0
  20. package/dist/clients/RTorrent.js +658 -0
  21. package/dist/clients/RTorrent.js.map +1 -0
  22. package/dist/clients/TorrentClient.d.ts +108 -0
  23. package/dist/clients/TorrentClient.js +342 -0
  24. package/dist/clients/TorrentClient.js.map +1 -0
  25. package/dist/clients/Transmission.d.ts +43 -0
  26. package/dist/clients/Transmission.js +405 -0
  27. package/dist/clients/Transmission.js.map +1 -0
  28. package/dist/cmd.d.ts +2 -0
  29. package/dist/cmd.js +128 -0
  30. package/dist/cmd.js.map +1 -0
  31. package/dist/configSchema.d.ts +1 -0
  32. package/dist/configSchema.js +2 -0
  33. package/dist/configSchema.js.map +1 -0
  34. package/dist/configuration.d.ts +63 -0
  35. package/dist/configuration.js +321 -0
  36. package/dist/configuration.js.map +1 -0
  37. package/dist/constants.d.ts +108 -0
  38. package/dist/constants.js +251 -0
  39. package/dist/constants.js.map +1 -0
  40. package/dist/dataFiles.d.ts +8 -0
  41. package/dist/dataFiles.js +223 -0
  42. package/dist/dataFiles.js.map +1 -0
  43. package/dist/db.d.ts +14 -0
  44. package/dist/db.js +287 -0
  45. package/dist/db.js.map +1 -0
  46. package/dist/dbConfig.d.ts +4 -0
  47. package/dist/dbConfig.js +67 -0
  48. package/dist/dbConfig.js.map +1 -0
  49. package/dist/decide.d.ts +25 -0
  50. package/dist/decide.js +553 -0
  51. package/dist/decide.js.map +1 -0
  52. package/dist/diagnostics/db.d.ts +21 -0
  53. package/dist/diagnostics/db.js +107 -0
  54. package/dist/diagnostics/db.js.map +1 -0
  55. package/dist/diff.d.ts +1 -0
  56. package/dist/diff.js +24 -0
  57. package/dist/diff.js.map +1 -0
  58. package/dist/errors.d.ts +3 -0
  59. package/dist/errors.js +7 -0
  60. package/dist/errors.js.map +1 -0
  61. package/dist/indexers.d.ts +105 -0
  62. package/dist/indexers.js +248 -0
  63. package/dist/indexers.js.map +1 -0
  64. package/dist/inject.d.ts +2 -0
  65. package/dist/inject.js +594 -0
  66. package/dist/inject.js.map +1 -0
  67. package/dist/jobs.d.ts +29 -0
  68. package/dist/jobs.js +151 -0
  69. package/dist/jobs.js.map +1 -0
  70. package/dist/logger.d.ts +29 -0
  71. package/dist/logger.js +157 -0
  72. package/dist/logger.js.map +1 -0
  73. package/dist/migrations/00-initialSchema.d.ts +9 -0
  74. package/dist/migrations/00-initialSchema.js +30 -0
  75. package/dist/migrations/00-initialSchema.js.map +1 -0
  76. package/dist/migrations/01-jobs.d.ts +9 -0
  77. package/dist/migrations/01-jobs.js +12 -0
  78. package/dist/migrations/01-jobs.js.map +1 -0
  79. package/dist/migrations/02-timestamps.d.ts +9 -0
  80. package/dist/migrations/02-timestamps.js +21 -0
  81. package/dist/migrations/02-timestamps.js.map +1 -0
  82. package/dist/migrations/03-rateLimits.d.ts +9 -0
  83. package/dist/migrations/03-rateLimits.js +14 -0
  84. package/dist/migrations/03-rateLimits.js.map +1 -0
  85. package/dist/migrations/04-auth.d.ts +9 -0
  86. package/dist/migrations/04-auth.js +13 -0
  87. package/dist/migrations/04-auth.js.map +1 -0
  88. package/dist/migrations/05-caps.d.ts +9 -0
  89. package/dist/migrations/05-caps.js +16 -0
  90. package/dist/migrations/05-caps.js.map +1 -0
  91. package/dist/migrations/06-uniqueDecisions.d.ts +9 -0
  92. package/dist/migrations/06-uniqueDecisions.js +29 -0
  93. package/dist/migrations/06-uniqueDecisions.js.map +1 -0
  94. package/dist/migrations/07-limits.d.ts +9 -0
  95. package/dist/migrations/07-limits.js +12 -0
  96. package/dist/migrations/07-limits.js.map +1 -0
  97. package/dist/migrations/08-rss.d.ts +9 -0
  98. package/dist/migrations/08-rss.js +15 -0
  99. package/dist/migrations/08-rss.js.map +1 -0
  100. package/dist/migrations/09-clientAndDataSearchees.d.ts +9 -0
  101. package/dist/migrations/09-clientAndDataSearchees.js +34 -0
  102. package/dist/migrations/09-clientAndDataSearchees.js.map +1 -0
  103. package/dist/migrations/10-indexerNameAudioBookCaps.d.ts +9 -0
  104. package/dist/migrations/10-indexerNameAudioBookCaps.js +18 -0
  105. package/dist/migrations/10-indexerNameAudioBookCaps.js.map +1 -0
  106. package/dist/migrations/11-trackers.d.ts +9 -0
  107. package/dist/migrations/11-trackers.js +38 -0
  108. package/dist/migrations/11-trackers.js.map +1 -0
  109. package/dist/migrations/12-user-auth.d.ts +9 -0
  110. package/dist/migrations/12-user-auth.js +22 -0
  111. package/dist/migrations/12-user-auth.js.map +1 -0
  112. package/dist/migrations/13-settings.d.ts +9 -0
  113. package/dist/migrations/13-settings.js +23 -0
  114. package/dist/migrations/13-settings.js.map +1 -0
  115. package/dist/migrations/14-indexer-enabled-flag.d.ts +9 -0
  116. package/dist/migrations/14-indexer-enabled-flag.js +12 -0
  117. package/dist/migrations/14-indexer-enabled-flag.js.map +1 -0
  118. package/dist/migrations/15-remove-url-unique-constraint.d.ts +9 -0
  119. package/dist/migrations/15-remove-url-unique-constraint.js +14 -0
  120. package/dist/migrations/15-remove-url-unique-constraint.js.map +1 -0
  121. package/dist/migrations/16-prune-inactive-indexers.d.ts +9 -0
  122. package/dist/migrations/16-prune-inactive-indexers.js +17 -0
  123. package/dist/migrations/16-prune-inactive-indexers.js.map +1 -0
  124. package/dist/migrations/migrations.d.ts +13 -0
  125. package/dist/migrations/migrations.js +41 -0
  126. package/dist/migrations/migrations.js.map +1 -0
  127. package/dist/parseTorrent.d.ts +53 -0
  128. package/dist/parseTorrent.js +128 -0
  129. package/dist/parseTorrent.js.map +1 -0
  130. package/dist/pipeline.d.ts +41 -0
  131. package/dist/pipeline.js +578 -0
  132. package/dist/pipeline.js.map +1 -0
  133. package/dist/preFilter.d.ts +25 -0
  134. package/dist/preFilter.js +250 -0
  135. package/dist/preFilter.js.map +1 -0
  136. package/dist/problems/linking.d.ts +2 -0
  137. package/dist/problems/linking.js +80 -0
  138. package/dist/problems/linking.js.map +1 -0
  139. package/dist/problems/path.d.ts +22 -0
  140. package/dist/problems/path.js +96 -0
  141. package/dist/problems/path.js.map +1 -0
  142. package/dist/problems.d.ts +13 -0
  143. package/dist/problems.js +48 -0
  144. package/dist/problems.js.map +1 -0
  145. package/dist/pushNotifier.d.ts +19 -0
  146. package/dist/pushNotifier.js +137 -0
  147. package/dist/pushNotifier.js.map +1 -0
  148. package/dist/routes/baseApi.d.ts +2 -0
  149. package/dist/routes/baseApi.js +354 -0
  150. package/dist/routes/baseApi.js.map +1 -0
  151. package/dist/routes/indexerApi.d.ts +6 -0
  152. package/dist/routes/indexerApi.js +165 -0
  153. package/dist/routes/indexerApi.js.map +1 -0
  154. package/dist/routes/staticFrontendPlugin.d.ts +4 -0
  155. package/dist/routes/staticFrontendPlugin.js +61 -0
  156. package/dist/routes/staticFrontendPlugin.js.map +1 -0
  157. package/dist/runtimeConfig.d.ts +6 -0
  158. package/dist/runtimeConfig.js +27 -0
  159. package/dist/runtimeConfig.js.map +1 -0
  160. package/dist/searchee.d.ts +108 -0
  161. package/dist/searchee.js +690 -0
  162. package/dist/searchee.js.map +1 -0
  163. package/dist/server.d.ts +4 -0
  164. package/dist/server.js +65 -0
  165. package/dist/server.js.map +1 -0
  166. package/dist/services/indexerService.d.ts +96 -0
  167. package/dist/services/indexerService.js +287 -0
  168. package/dist/services/indexerService.js.map +1 -0
  169. package/dist/sessionCookies.d.ts +5 -0
  170. package/dist/sessionCookies.js +27 -0
  171. package/dist/sessionCookies.js.map +1 -0
  172. package/dist/startup.d.ts +25 -0
  173. package/dist/startup.js +157 -0
  174. package/dist/startup.js.map +1 -0
  175. package/dist/torrent.d.ts +69 -0
  176. package/dist/torrent.js +665 -0
  177. package/dist/torrent.js.map +1 -0
  178. package/dist/torznab.d.ts +60 -0
  179. package/dist/torznab.js +711 -0
  180. package/dist/torznab.js.map +1 -0
  181. package/dist/trpc/fastifyAdapter.d.ts +2 -0
  182. package/dist/trpc/fastifyAdapter.js +9 -0
  183. package/dist/trpc/fastifyAdapter.js.map +1 -0
  184. package/dist/trpc/index.d.ts +49 -0
  185. package/dist/trpc/index.js +53 -0
  186. package/dist/trpc/index.js.map +1 -0
  187. package/dist/trpc/routers/auth.d.ts +43 -0
  188. package/dist/trpc/routers/auth.js +116 -0
  189. package/dist/trpc/routers/auth.js.map +1 -0
  190. package/dist/trpc/routers/clients.d.ts +21 -0
  191. package/dist/trpc/routers/clients.js +65 -0
  192. package/dist/trpc/routers/clients.js.map +1 -0
  193. package/dist/trpc/routers/health.d.ts +17 -0
  194. package/dist/trpc/routers/health.js +24 -0
  195. package/dist/trpc/routers/health.js.map +1 -0
  196. package/dist/trpc/routers/index.d.ts +394 -0
  197. package/dist/trpc/routers/index.js +23 -0
  198. package/dist/trpc/routers/index.js.map +1 -0
  199. package/dist/trpc/routers/indexers.d.ts +75 -0
  200. package/dist/trpc/routers/indexers.js +79 -0
  201. package/dist/trpc/routers/indexers.js.map +1 -0
  202. package/dist/trpc/routers/jobs.d.ts +33 -0
  203. package/dist/trpc/routers/jobs.js +84 -0
  204. package/dist/trpc/routers/jobs.js.map +1 -0
  205. package/dist/trpc/routers/logs.d.ts +27 -0
  206. package/dist/trpc/routers/logs.js +91 -0
  207. package/dist/trpc/routers/logs.js.map +1 -0
  208. package/dist/trpc/routers/searchees.d.ts +51 -0
  209. package/dist/trpc/routers/searchees.js +156 -0
  210. package/dist/trpc/routers/searchees.js.map +1 -0
  211. package/dist/trpc/routers/settings.d.ts +83 -0
  212. package/dist/trpc/routers/settings.js +92 -0
  213. package/dist/trpc/routers/settings.js.map +1 -0
  214. package/dist/trpc/routers/stats.d.ts +42 -0
  215. package/dist/trpc/routers/stats.js +102 -0
  216. package/dist/trpc/routers/stats.js.map +1 -0
  217. package/dist/userAuth.d.ts +21 -0
  218. package/dist/userAuth.js +86 -0
  219. package/dist/userAuth.js.map +1 -0
  220. package/dist/utils/authUtils.d.ts +10 -0
  221. package/dist/utils/authUtils.js +24 -0
  222. package/dist/utils/authUtils.js.map +1 -0
  223. package/dist/utils/logWatcher.d.ts +28 -0
  224. package/dist/utils/logWatcher.js +229 -0
  225. package/dist/utils/logWatcher.js.map +1 -0
  226. package/dist/utils/object.d.ts +1 -0
  227. package/dist/utils/object.js +4 -0
  228. package/dist/utils/object.js.map +1 -0
  229. package/dist/utils.d.ts +172 -0
  230. package/dist/utils.js +648 -0
  231. package/dist/utils.js.map +1 -0
  232. package/dist/webui/assets/{FieldInfo-Bxj_j8SJ.js → FieldInfo-sRlPRNSK.js} +1 -1
  233. package/dist/webui/assets/{Page-C3rteCZt.js → Page-B68mlTwU.js} +1 -1
  234. package/dist/webui/assets/{array-field-DVSC6nHP.js → array-field-BCFMrvoU.js} +1 -1
  235. package/dist/webui/assets/{badge-DTZMtS0e.js → badge-C5YCxEzP.js} +1 -1
  236. package/dist/webui/assets/check-NQsw6yBl.js +1 -0
  237. package/dist/webui/assets/{chevron-down-CRy8M0kJ.js → chevron-down-8PGvFYxV.js} +1 -1
  238. package/dist/webui/assets/{clients-CW8oEZoQ.js → clients-DnVpwApe.js} +1 -1
  239. package/dist/webui/assets/{connect-YBNsnjWT.js → connect-wMg2zyz6.js} +1 -1
  240. package/dist/webui/assets/debug-BrjwiEi2.js +1 -0
  241. package/dist/webui/assets/{directories-BSK28RgR.js → directories-CHpJCWNR.js} +1 -1
  242. package/dist/webui/assets/{duration-field-C6xoSlJg.js → duration-field-DIkKt3iw.js} +1 -1
  243. package/dist/webui/assets/{general-lJJxZhH7.js → general-uZrUIxbI.js} +1 -1
  244. package/dist/webui/assets/health-_MuvAyjo.js +1 -0
  245. package/dist/webui/assets/index-B41DM2T5.css +1 -0
  246. package/dist/webui/assets/{index-C2cH1Gst.js → index-BBzHsn7u.js} +1 -1
  247. package/dist/webui/assets/{index-Bi48hI2z.js → index-Ncy0-Qo7.js} +3 -3
  248. package/dist/webui/assets/index-pKWy6v1P.js +1 -0
  249. package/dist/webui/assets/{jobs-CxmNab9w.js → jobs-B8eat0YU.js} +1 -1
  250. package/dist/webui/assets/{library-vaj2W8sE.js → library-BB0jQ8zn.js} +1 -1
  251. package/dist/webui/assets/{loader-circle-M0gu1gZ-.js → loader-circle-Bz67bJa3.js} +1 -1
  252. package/dist/webui/assets/logs-CeP28848.js +1 -0
  253. package/dist/webui/assets/{search-2R5sIdT8.js → search-BRBIrqaX.js} +1 -1
  254. package/dist/webui/assets/{select-zHgqMzLj.js → select-GZr6C6eZ.js} +1 -1
  255. package/dist/webui/assets/{select-field-BCqNLDrJ.js → select-field-CvT0SYk8.js} +1 -1
  256. package/dist/webui/assets/settings-0ZdYY8g_.js +1 -0
  257. package/dist/webui/assets/{submit-button-BtcnyggQ.js → submit-button-D7DKHqAq.js} +1 -1
  258. package/dist/webui/assets/{switch-G0W3uJVN.js → switch-BeMrf8sh.js} +1 -1
  259. package/dist/webui/assets/{switch-field-IBd9ORNq.js → switch-field-qMXHRKhx.js} +1 -1
  260. package/dist/webui/assets/{table-DvgJU7Gh.js → table-qEFWauuw.js} +1 -1
  261. package/dist/webui/assets/{test-tube-BIwmoM45.js → test-tube-DhD6uWdp.js} +1 -1
  262. package/dist/webui/assets/{text-field-DruSbGhy.js → text-field-ZnKHDUks.js} +1 -1
  263. package/dist/webui/assets/{time-BSMZjmyW.js → time-BM9K_Fbp.js} +1 -1
  264. package/dist/webui/assets/{trackers-D-OpAe63.js → trackers-BjJuAdX3.js} +1 -1
  265. package/dist/webui/assets/{use-form-validation-context-BkAfWAh0.js → use-form-validation-context-D2oA54L_.js} +1 -1
  266. package/dist/webui/assets/{use-settings-form-submit-CDRh-E9U.js → use-settings-form-submit-CXwtE1sI.js} +2 -2
  267. package/dist/webui/assets/useQuery-DD10sbzn.js +1 -0
  268. package/dist/webui/index.html +2 -2
  269. package/node_modules/@cross-seed/shared/dist/configSchema.d.ts.map +1 -1
  270. package/node_modules/@cross-seed/shared/dist/configSchema.js.map +1 -1
  271. package/node_modules/@cross-seed/shared/dist/tsconfig.tsbuildinfo +1 -1
  272. package/node_modules/@cross-seed/shared/dist/utils.d.ts +3 -0
  273. package/node_modules/@cross-seed/shared/dist/utils.d.ts.map +1 -1
  274. package/node_modules/@cross-seed/shared/dist/utils.js +11 -0
  275. package/node_modules/@cross-seed/shared/dist/utils.js.map +1 -1
  276. package/node_modules/@cross-seed/shared/package.json +3 -1
  277. package/package.json +18 -59
  278. package/LICENSE +0 -201
  279. package/README.md +0 -33
  280. package/dist/webui/assets/check-Bu3ldi63.js +0 -1
  281. package/dist/webui/assets/debug-mz8-WYZj.js +0 -1
  282. package/dist/webui/assets/health-CXbsVrie.js +0 -1
  283. package/dist/webui/assets/index-C-Ul7GNg.css +0 -1
  284. package/dist/webui/assets/index-Cc5bDmJr.js +0 -1
  285. package/dist/webui/assets/logs-Cu9RyKS0.js +0 -1
  286. package/dist/webui/assets/settings-CMYjpTbZ.js +0 -1
  287. package/dist/webui/assets/useQuery-A4Hv_4uX.js +0 -1
@@ -0,0 +1,578 @@
1
+ import chalk from "chalk";
2
+ import { stat } from "fs/promises";
3
+ import { humanReadableSize } from "@cross-seed/shared/utils";
4
+ // Utility function to replace lodash zip
5
+ function zip(arr1, arr2, arr3) {
6
+ return arr1.map((item, index) => [item, arr2[index], arr3[index]]);
7
+ }
8
+ import ms from "ms";
9
+ import { basename } from "path";
10
+ import { performAction, performActions } from "./action.js";
11
+ import { byClientHostPriority, getClients } from "./clients/TorrentClient.js";
12
+ import { Decision, InjectionResult, isAnyMatchedDecision, SaveResult, } from "./constants.js";
13
+ import { findPotentialNestedRoots, findSearcheesFromAllDataDirs, } from "./dataFiles.js";
14
+ import { db } from "./db.js";
15
+ import { assessCandidateCaching, getGuidInfoHashMap, } from "./decide.js";
16
+ import { getAllIndexers, IndexerStatus, updateIndexerStatus, updateSearchTimestamps, } from "./indexers.js";
17
+ import { getJobLastRun, JobName } from "./jobs.js";
18
+ import { Label, logger } from "./logger.js";
19
+ import { filterByContent, filterDupesFromSimilar, filterTimestamps, } from "./preFilter.js";
20
+ import { sendResultsNotification } from "./pushNotifier.js";
21
+ import { isOk } from "./Result.js";
22
+ import { getRuntimeConfig } from "./runtimeConfig.js";
23
+ import { createEnsembleSearchees, createSearcheeFromPath, createSearcheeFromTorrentFile, getNewestFileAge, getSeasonKeys, } from "./searchee.js";
24
+ import { getInfoHashesToExclude, getSimilarByName, getTorrentByCriteria, indexTorrentsAndDataDirs, loadTorrentDirLight, } from "./torrent.js";
25
+ import { getSearchString, queryRssFeeds, searchTorznab, } from "./torznab.js";
26
+ import { getEnabledIndexers } from "./indexers.js";
27
+ import { AsyncSemaphore, comparing, filterAsync, flatMapAsync, formatAsList, getLogString, humanReadableDate, inBatches, isTruthy, mapAsync, Mutex, notExists, reduceAsync, stripExtension, withMutex, } from "./utils.js";
28
+ async function assessCandidates(candidates, searchee, infoHashesToExclude, options) {
29
+ const guidInfoHashMap = await getGuidInfoHashMap();
30
+ const candidatesByIndexer = candidates.reduce((acc, cur) => {
31
+ if (!acc.has(cur.indexerId))
32
+ acc.set(cur.indexerId, []);
33
+ acc.get(cur.indexerId).push(cur);
34
+ return acc;
35
+ }, new Map());
36
+ return flatMapAsync(Array.from(candidatesByIndexer.values()), async (candidates) => {
37
+ const assessments = [];
38
+ for (const candidate of candidates) {
39
+ assessments.push({
40
+ assessment: await assessCandidateCaching(candidate, searchee, infoHashesToExclude, guidInfoHashMap, options),
41
+ tracker: candidate.tracker,
42
+ });
43
+ }
44
+ return assessments;
45
+ });
46
+ }
47
+ async function findOnOtherSites(searchee, infoHashesToExclude, indexerSearchCount, cachedSearch, progress, options) {
48
+ // make sure searchee is in database
49
+ await db("searchee")
50
+ .insert({ name: searchee.title })
51
+ .onConflict("name")
52
+ .ignore();
53
+ const response = await searchTorznab(searchee, indexerSearchCount, cachedSearch, progress, options);
54
+ const cachedIndexers = cachedSearch.indexerCandidates.length;
55
+ const searchedIndexers = response.length - cachedIndexers;
56
+ cachedSearch.indexerCandidates = response;
57
+ const candidates = response.flatMap((e) => e.candidates);
58
+ if (response.length) {
59
+ logger.verbose({
60
+ label: `${searchee.label}/${Label.DECIDE}`,
61
+ message: `Assessing ${candidates.length} candidates for ${searchee.title} from ${searchedIndexers}|${cachedIndexers} indexers by search|cache`,
62
+ });
63
+ }
64
+ const assessments = await assessCandidates(candidates, searchee, infoHashesToExclude, options);
65
+ const allIndexers = await getAllIndexers();
66
+ const rateLimitedNames = new Set();
67
+ const { rateLimited, notRateLimited } = assessments.reduce((acc, cur, idx) => {
68
+ const candidate = candidates[idx];
69
+ if (cur.assessment.decision === Decision.RATE_LIMITED) {
70
+ const indexer = allIndexers.find((i) => i.id === candidate.indexerId);
71
+ rateLimitedNames.add(indexer.name ?? indexer.url);
72
+ acc.rateLimited.add(candidate.indexerId);
73
+ acc.notRateLimited.delete(candidate.indexerId);
74
+ }
75
+ return acc;
76
+ }, {
77
+ rateLimited: new Set(),
78
+ notRateLimited: new Set(response.map((r) => r.indexerId)),
79
+ });
80
+ const matches = assessments.filter((e) => isAnyMatchedDecision(e.assessment.decision));
81
+ const actionResults = await performActions(searchee, matches);
82
+ await updateSearchTimestamps(searchee.title, Array.from(notRateLimited));
83
+ await updateIndexerStatus(IndexerStatus.RATE_LIMITED, Date.now() + ms("1 hour"), Array.from(rateLimited), rateLimitedNames);
84
+ const zipped = zip(matches.map((m) => m.assessment), matches.map((m) => m.tracker), actionResults);
85
+ sendResultsNotification(searchee, zipped);
86
+ return { searchedIndexers, matches: matches.length };
87
+ }
88
+ async function findMatchesBatch(searchees, infoHashesToExclude, options) {
89
+ const { searchLimit } = getRuntimeConfig(options?.configOverride);
90
+ const indexerSearchCount = new Map();
91
+ let totalFound = 0;
92
+ const cachedSearch = {
93
+ q: null,
94
+ indexerCandidates: [],
95
+ lastSearch: 0,
96
+ };
97
+ for (const [i, searchee] of searchees.entries()) {
98
+ const progress = chalk.blue(`(${i + 1}/${searchees.length}) `);
99
+ const prevSearch = cachedSearch.lastSearch;
100
+ try {
101
+ const { searchedIndexers, matches } = await findOnOtherSites(searchee, infoHashesToExclude, indexerSearchCount, cachedSearch, progress, options);
102
+ totalFound += matches;
103
+ if (searchLimit &&
104
+ indexerSearchCount.size &&
105
+ Array.from(indexerSearchCount.values()).every((n) => n >= searchLimit)) {
106
+ logger.info({
107
+ label: searchee.label,
108
+ message: `Reached searchLimit of ${searchLimit} on all indexers`,
109
+ });
110
+ break;
111
+ }
112
+ // if all indexers were rate limited or cached, don't sleep
113
+ if (searchedIndexers === 0)
114
+ cachedSearch.lastSearch = prevSearch;
115
+ }
116
+ catch (e) {
117
+ const searcheeLog = getLogString(searchee, chalk.bold.white);
118
+ logger.error({
119
+ label: searchee.label,
120
+ message: `${progress}Error searching for ${searcheeLog}: ${e.message}`,
121
+ });
122
+ logger.debug(e);
123
+ }
124
+ }
125
+ return totalFound;
126
+ }
127
+ export async function searchForLocalTorrentByCriteria(criteria, options) {
128
+ const { maxDataDepth, searchLimit } = getRuntimeConfig();
129
+ const rawSearchees = [];
130
+ if (!criteria.path) {
131
+ rawSearchees.push(...(await getTorrentByCriteria(criteria)));
132
+ }
133
+ else {
134
+ const memoizedPaths = new Map();
135
+ const memoizedLengths = new Map();
136
+ rawSearchees.push(...(await mapAsync(await findPotentialNestedRoots(criteria.path, maxDataDepth), (path) => createSearcheeFromPath(path, memoizedPaths, memoizedLengths)))
137
+ .filter(isOk)
138
+ .map((r) => r.unwrap()));
139
+ }
140
+ const searchees = rawSearchees
141
+ .sort(comparing((searchee) => byClientHostPriority(searchee.clientHost), (searchee) => -searchee.files.length, // Assume searchees are complete
142
+ (searchee) => !searchee.infoHash))
143
+ .map((searchee) => ({
144
+ ...searchee,
145
+ label: Label.WEBHOOK,
146
+ }));
147
+ const allowSeasonPackEpisodes = Array.from(searchees
148
+ .reduce((acc, cur) => {
149
+ acc.set(cur.clientHost, (acc.get(cur.clientHost) ?? 0) + 1);
150
+ return acc;
151
+ }, new Map())
152
+ .values()).some((v) => v === 1);
153
+ const infoHashesToExclude = await getInfoHashesToExclude();
154
+ const indexerSearchCount = new Map();
155
+ let totalFound = 0;
156
+ let filtered = 0;
157
+ const cachedSearch = {
158
+ q: null,
159
+ indexerCandidates: [],
160
+ lastSearch: 0,
161
+ };
162
+ for (const [i, searchee] of searchees.entries()) {
163
+ const progress = chalk.blue(`(${i + 1}/${searchees.length}) `);
164
+ const prevSearch = cachedSearch.lastSearch;
165
+ try {
166
+ if (!(await filterByContent(searchee, {
167
+ configOverride: options.configOverride,
168
+ allowSeasonPackEpisodes,
169
+ ignoreCrossSeeds: options.ignoreCrossSeeds,
170
+ }))) {
171
+ filtered++;
172
+ continue;
173
+ }
174
+ const { matches, searchedIndexers } = await findOnOtherSites(searchee, infoHashesToExclude, indexerSearchCount, cachedSearch, progress, options);
175
+ totalFound += matches;
176
+ if (searchLimit &&
177
+ indexerSearchCount.size &&
178
+ Array.from(indexerSearchCount.values()).every((n) => n >= searchLimit)) {
179
+ logger.info({
180
+ label: searchee.label,
181
+ message: `Reached searchLimit of ${searchLimit} on all indexers`,
182
+ });
183
+ break;
184
+ }
185
+ // if all indexers were rate limited, don't sleep
186
+ if (searchedIndexers === 0)
187
+ cachedSearch.lastSearch = prevSearch;
188
+ }
189
+ catch (e) {
190
+ const searcheeLog = getLogString(searchee, chalk.bold.white);
191
+ logger.error({
192
+ label: searchee.label,
193
+ message: `${progress}Error searching for ${searcheeLog}: ${e.message}`,
194
+ });
195
+ logger.debug(e);
196
+ }
197
+ }
198
+ if (filtered === searchees.length)
199
+ return null;
200
+ return totalFound;
201
+ }
202
+ async function getSearcheesForCandidate(candidate, searcheeLabel) {
203
+ const candidateLog = `${chalk.bold.white(candidate.name)} from ${candidate.tracker}`;
204
+ const { keys, clientSearchees, dataSearchees } = await getSimilarByName(candidate.name);
205
+ const method = keys.length ? `[${keys}]` : "fuzzy fallback";
206
+ if (!clientSearchees.length && !dataSearchees.length) {
207
+ logger.verbose({
208
+ label: searcheeLabel,
209
+ message: `Did not find an existing entry using ${method} for ${candidateLog}`,
210
+ });
211
+ return null;
212
+ }
213
+ const searchees = filterDupesFromSimilar(await filterAsync([...clientSearchees, ...dataSearchees].map((searchee) => ({
214
+ ...searchee,
215
+ label: searcheeLabel,
216
+ })), filterByContent));
217
+ if (!searchees.length) {
218
+ logger.verbose({
219
+ label: searcheeLabel,
220
+ message: `No valid entries found using ${method} for ${candidateLog}`,
221
+ });
222
+ return null;
223
+ }
224
+ return { searchees, method };
225
+ }
226
+ async function getEnsembleForCandidate(candidate, searcheeLabel) {
227
+ const { seasonFromEpisodes } = getRuntimeConfig();
228
+ if (!seasonFromEpisodes)
229
+ return null;
230
+ const seasonKeys = getSeasonKeys(stripExtension(candidate.name));
231
+ if (!seasonKeys)
232
+ return null;
233
+ const method = "ensemble";
234
+ const candidateLog = `${chalk.bold.white(candidate.name)} from ${candidate.tracker}`;
235
+ const { ensembleTitles, keyTitles, season } = seasonKeys;
236
+ const keys = keyTitles.map((keyTitle) => `${keyTitle}.${season}`);
237
+ const ensemble = await db("ensemble").whereIn("ensemble", keys);
238
+ if (ensemble.length === 0) {
239
+ logger.verbose({
240
+ label: searcheeLabel,
241
+ message: `Did not find an ${method} [${ensembleTitles}] for ${candidateLog}`,
242
+ });
243
+ return null;
244
+ }
245
+ const duplicateFiles = new Set();
246
+ const entriesToDelete = new Set();
247
+ const hosts = new Map();
248
+ const filesWithElement = await reduceAsync(ensemble, async (acc, entry) => {
249
+ const path = entry.path;
250
+ if (await notExists(path)) {
251
+ entriesToDelete.add(path);
252
+ return acc;
253
+ }
254
+ const length = (await stat(path)).size;
255
+ const name = basename(path);
256
+ const element = entry.element;
257
+ const clientHost = entry.client_host;
258
+ const uniqueKey = `${clientHost}-${element}-${length}`;
259
+ if (duplicateFiles.has(uniqueKey))
260
+ return acc; // cross seeded file
261
+ duplicateFiles.add(uniqueKey);
262
+ if (clientHost) {
263
+ hosts.set(clientHost, (hosts.get(clientHost) ?? 0) + 1);
264
+ }
265
+ acc.push({ length, name, path, element });
266
+ return acc;
267
+ }, []);
268
+ await inBatches(Array.from(entriesToDelete), async (batch) => {
269
+ await db("data").whereIn("path", batch).del();
270
+ await db("ensemble").whereIn("path", batch).del();
271
+ });
272
+ if (filesWithElement.length === 0) {
273
+ logger.verbose({
274
+ label: searcheeLabel,
275
+ message: `Did not find any files for ${method} [${ensembleTitles}] for ${candidateLog}: sources may be incomplete or missing`,
276
+ });
277
+ return null;
278
+ }
279
+ // Get searchee.length by total size of each episode (average if multiple files for episode)
280
+ const uniqueElements = new Set(filesWithElement.map((f) => f.element));
281
+ const totalLength = Math.round([...uniqueElements].reduce((acc, cur) => {
282
+ const lengths = filesWithElement.reduce((lengths, f) => {
283
+ if (f.element === cur)
284
+ lengths.push(f.length);
285
+ return lengths;
286
+ }, []);
287
+ return acc + lengths.reduce((a, b) => a + b) / lengths.length;
288
+ }, 0));
289
+ const files = filesWithElement.map(({ element, ...f }) => f); // eslint-disable-line @typescript-eslint/no-unused-vars
290
+ const mtimeMs = await getNewestFileAge(files.map((f) => f.path));
291
+ const searchees = ensembleTitles.map((title) => ({
292
+ name: title,
293
+ title,
294
+ files,
295
+ length: totalLength,
296
+ mtimeMs,
297
+ clientHost: [...hosts].sort(comparing((host) => -host[1], (host) => byClientHostPriority(host[0])))[0]?.[0],
298
+ label: searcheeLabel,
299
+ }));
300
+ logger.verbose({
301
+ label: searcheeLabel,
302
+ message: `Using (${searchees.length}) ${method} [${ensembleTitles}] for ${candidateLog}: ${humanReadableSize(totalLength)} - ${files.length} files`,
303
+ });
304
+ return { searchees, method };
305
+ }
306
+ const checkNewCandidateMatchSemaphore = new AsyncSemaphore({
307
+ permits: 1,
308
+ lifetimeMs: ms(`1 minute`),
309
+ }); // Limit concurrent candidate processing to avoid bogarting the event loop
310
+ export async function checkNewCandidateMatch(candidate, searcheeLabel) {
311
+ const searchees = [];
312
+ const methods = [];
313
+ const semaphoreId = await checkNewCandidateMatchSemaphore.acquire();
314
+ try {
315
+ const lookup = await getSearcheesForCandidate(candidate, searcheeLabel);
316
+ if (lookup) {
317
+ searchees.push(...lookup.searchees);
318
+ methods.push(lookup.method);
319
+ }
320
+ const ensemble = await getEnsembleForCandidate(candidate, searcheeLabel);
321
+ if (ensemble) {
322
+ searchees.push(...ensemble.searchees);
323
+ methods.push(ensemble.method);
324
+ }
325
+ if (!searchees.length)
326
+ return { decision: null, actionResult: null };
327
+ }
328
+ finally {
329
+ checkNewCandidateMatchSemaphore.release(semaphoreId);
330
+ }
331
+ logger.verbose({
332
+ label: searcheeLabel,
333
+ message: `Unique entries (${searchees.length}) [${searchees.map((m) => m.title)}] using ${formatAsList(methods, { sort: true })} for ${chalk.bold.white(candidate.name)} from ${candidate.tracker}`,
334
+ });
335
+ searchees.sort(comparing((searchee) => byClientHostPriority(searchee.clientHost), (searchee) => !searchee.infoHash, // Prefer packs over ensemble
336
+ (searchee) => -searchee.files.length));
337
+ const infoHashesToExclude = await getInfoHashesToExclude();
338
+ const guidInfoHashMap = await getGuidInfoHashMap();
339
+ let decision = null;
340
+ let actionResult = null;
341
+ let matchedSearchee = null;
342
+ let matchedAssessment = null;
343
+ for (const searchee of searchees) {
344
+ await db("searchee")
345
+ .insert({ name: searchee.title })
346
+ .onConflict("name")
347
+ .ignore();
348
+ const assessment = await assessCandidateCaching(candidate, searchee, infoHashesToExclude, guidInfoHashMap);
349
+ if (assessment.decision === Decision.INFO_HASH_ALREADY_EXISTS) {
350
+ decision = assessment.decision;
351
+ break; // In client before rss/announce
352
+ }
353
+ if (!isAnyMatchedDecision(assessment.decision))
354
+ continue;
355
+ const actionReturn = await performAction(assessment.metafile, assessment.decision, searchee, candidate.tracker);
356
+ if (actionReturn.actionResult === SaveResult.SAVED) {
357
+ decision = assessment.decision;
358
+ actionResult = actionReturn.actionResult;
359
+ matchedSearchee = searchee;
360
+ matchedAssessment = assessment;
361
+ break;
362
+ }
363
+ if (assessment.decision !== Decision.MATCH_PARTIAL &&
364
+ (actionReturn.actionResult === InjectionResult.SUCCESS ||
365
+ actionReturn.actionResult === InjectionResult.ALREADY_EXISTS)) {
366
+ decision = assessment.decision;
367
+ actionResult = InjectionResult.SUCCESS;
368
+ matchedSearchee = searchee;
369
+ matchedAssessment = assessment;
370
+ break;
371
+ }
372
+ if (actionResult === InjectionResult.SUCCESS)
373
+ continue;
374
+ if (actionResult &&
375
+ actionReturn.actionResult === InjectionResult.FAILURE) {
376
+ continue;
377
+ }
378
+ if (actionResult === InjectionResult.ALREADY_EXISTS &&
379
+ actionReturn.actionResult === InjectionResult.TORRENT_NOT_COMPLETE) {
380
+ continue;
381
+ }
382
+ decision = assessment.decision;
383
+ actionResult = actionReturn.actionResult;
384
+ matchedSearchee = searchee;
385
+ matchedAssessment = assessment;
386
+ }
387
+ if (matchedSearchee) {
388
+ sendResultsNotification(matchedSearchee, [
389
+ [matchedAssessment, candidate.tracker, actionResult],
390
+ ]);
391
+ }
392
+ if (actionResult === InjectionResult.SUCCESS) {
393
+ void indexTorrentsAndDataDirs();
394
+ }
395
+ return { decision, actionResult };
396
+ }
397
+ export async function findAllSearchees(searcheeLabel) {
398
+ const { dataDirs, torrentDir, torrents, useClientTorrents } = getRuntimeConfig();
399
+ const clients = getClients();
400
+ let rawSearchees = [];
401
+ await withMutex(Mutex.CREATE_ALL_SEARCHEES, { useQueue: true }, async () => {
402
+ const explicitTorrents = Array.isArray(torrents)
403
+ ? torrents.map((torrent) => torrent.trim()).filter(Boolean)
404
+ : [];
405
+ if (explicitTorrents.length) {
406
+ const torrentInfos = await flatMapAsync(clients, (client) => client.getAllTorrents());
407
+ rawSearchees.push(...(await mapAsync(explicitTorrents, (torrent) => createSearcheeFromTorrentFile(torrent, torrentInfos)))
408
+ .filter(isOk)
409
+ .map((r) => r.unwrap()));
410
+ }
411
+ else {
412
+ if (useClientTorrents) {
413
+ rawSearchees = rawSearchees.concat(await flatMapAsync(clients, async (client) => (await client.getClientSearchees({
414
+ includeFiles: true,
415
+ includeTrackers: true,
416
+ })).searchees));
417
+ }
418
+ else if (torrentDir) {
419
+ rawSearchees = rawSearchees.concat(await loadTorrentDirLight(torrentDir));
420
+ }
421
+ if (dataDirs.length) {
422
+ const memoizedPaths = new Map();
423
+ const memoizedLengths = new Map();
424
+ rawSearchees = rawSearchees.concat((await mapAsync(await findSearcheesFromAllDataDirs(), (path) => createSearcheeFromPath(path, memoizedPaths, memoizedLengths)))
425
+ .filter(isOk)
426
+ .map((r) => r.unwrap()));
427
+ }
428
+ }
429
+ });
430
+ return rawSearchees.map((searchee) => ({
431
+ ...searchee,
432
+ label: searcheeLabel,
433
+ }));
434
+ }
435
+ async function findSearchableTorrents(options) {
436
+ const { excludeOlder, excludeRecentSearch, searchLimit } = getRuntimeConfig(options?.configOverride);
437
+ logger.info({
438
+ label: Label.SEARCH,
439
+ message: "Gathering searchees...",
440
+ });
441
+ const realSearchees = await findAllSearchees(Label.SEARCH);
442
+ const ensembleSearchees = await createEnsembleSearchees(realSearchees, {
443
+ useFilters: true,
444
+ });
445
+ const ignoring = [
446
+ (!excludeOlder || excludeOlder === Number.MAX_SAFE_INTEGER) &&
447
+ "excludeOlder",
448
+ (!excludeRecentSearch || excludeRecentSearch === 1) &&
449
+ "excludeRecentSearch",
450
+ ].filter(isTruthy);
451
+ logger.info({
452
+ label: Label.SEARCH,
453
+ message: `Filtering searchees based on config${ignoring.length ? ` (ignoring ${formatAsList(ignoring, { sort: true })})` : ""}...`,
454
+ });
455
+ const infoHashesToExclude = new Set(realSearchees.map((t) => t.infoHash).filter(isTruthy));
456
+ // Group the exact same search queries together for easy cache use later
457
+ const grouping = new Map();
458
+ const validSearchees = [
459
+ ...(await filterAsync(ensembleSearchees, (searchee) => filterByContent(searchee, {
460
+ configOverride: {},
461
+ allowSeasonPackEpisodes: false,
462
+ ignoreCrossSeeds: false,
463
+ blockListOnly: true, // Only option that matters
464
+ }))),
465
+ ...(await filterAsync(realSearchees, filterByContent)),
466
+ ];
467
+ for (const searchee of validSearchees) {
468
+ const key = await getSearchString(searchee);
469
+ if (!grouping.has(key)) {
470
+ grouping.set(key, []);
471
+ }
472
+ grouping.get(key).push(searchee);
473
+ }
474
+ for (const [key, groupedSearchees] of grouping) {
475
+ // If one searchee needs to be searched, use the candidates for all
476
+ const filteredSearchees = filterDupesFromSimilar(groupedSearchees);
477
+ const results = await mapAsync(filteredSearchees, (searchee) => filterTimestamps(searchee, options));
478
+ if (!results.some(isTruthy)) {
479
+ grouping.delete(key);
480
+ continue;
481
+ }
482
+ filteredSearchees.sort(comparing((searchee) => byClientHostPriority(searchee.clientHost), (searchee) => -searchee.files.length, // Assume searchees are complete
483
+ (searchee) => !searchee.infoHash));
484
+ grouping.set(key, filteredSearchees);
485
+ }
486
+ const finalSearchees = Array.from(grouping.values()).flat();
487
+ logger.info({
488
+ label: Label.SEARCH,
489
+ message: `Found ${realSearchees.length + ensembleSearchees.length} torrents, ${finalSearchees.length} suitable to search for matches using ${grouping.size} unique queries`,
490
+ });
491
+ if (searchLimit && grouping.size > searchLimit) {
492
+ logger.info({
493
+ label: Label.SEARCH,
494
+ message: `Limited to ${searchLimit} searches (unique queries) per indexer`,
495
+ });
496
+ }
497
+ return { searchees: finalSearchees, infoHashesToExclude };
498
+ }
499
+ export async function bulkSearch(options) {
500
+ const searchOptions = options?.configOverride
501
+ ? { configOverride: options.configOverride }
502
+ : undefined;
503
+ const { searchees, infoHashesToExclude } = await findSearchableTorrents(searchOptions);
504
+ const totalFound = await findMatchesBatch(searchees, infoHashesToExclude, options);
505
+ logger.info({
506
+ label: Label.SEARCH,
507
+ message: chalk.cyan(`Found ${chalk.bold.white(totalFound)} cross seeds from ${chalk.bold.white(searchees.length)} original torrents`),
508
+ });
509
+ }
510
+ export async function bulkSearchByNames(names, options) {
511
+ const normalizedNames = Array.from(new Set(names
512
+ .map((name) => name.trim())
513
+ .filter((name) => name.length > 0 && name.length <= 500)));
514
+ if (!normalizedNames.length) {
515
+ return { attempted: 0, totalFound: 0, requested: 0 };
516
+ }
517
+ const nameSet = new Set(normalizedNames);
518
+ const searchOptions = options?.configOverride
519
+ ? { configOverride: options.configOverride }
520
+ : undefined;
521
+ const { searchees, infoHashesToExclude } = await findSearchableTorrents(searchOptions);
522
+ const selectedSearchees = searchees.filter((searchee) => {
523
+ const titleOrName = searchee.title ?? searchee.name;
524
+ return titleOrName ? nameSet.has(titleOrName) : false;
525
+ });
526
+ if (!selectedSearchees.length) {
527
+ logger.warn({
528
+ label: Label.SEARCH,
529
+ message: `Manual bulk search requested for ${normalizedNames.length} items, but none were eligible after filtering`,
530
+ });
531
+ return {
532
+ attempted: 0,
533
+ totalFound: 0,
534
+ requested: normalizedNames.length,
535
+ };
536
+ }
537
+ logger.info({
538
+ label: Label.SEARCH,
539
+ message: `Starting manual bulk search for ${selectedSearchees.length}/${normalizedNames.length} selected items`,
540
+ });
541
+ const totalFound = await findMatchesBatch(selectedSearchees, infoHashesToExclude, searchOptions);
542
+ return {
543
+ attempted: selectedSearchees.length,
544
+ totalFound,
545
+ requested: normalizedNames.length,
546
+ };
547
+ }
548
+ export async function scanRssFeeds() {
549
+ const { dataDirs, torrentDir, useClientTorrents } = getRuntimeConfig();
550
+ await indexTorrentsAndDataDirs();
551
+ const enabledIndexers = await getEnabledIndexers();
552
+ if (!enabledIndexers.length ||
553
+ (!useClientTorrents && !torrentDir && !dataDirs.length)) {
554
+ logger.warn({
555
+ label: Label.RSS,
556
+ message: "RSS requires enabled indexers and at least one of useClientTorrents, torrentDir, or dataDirs to be set",
557
+ });
558
+ return;
559
+ }
560
+ logger.verbose({
561
+ label: Label.RSS,
562
+ message: "Querying RSS feeds...",
563
+ });
564
+ const lastRun = (await getJobLastRun(JobName.RSS)) ?? 0;
565
+ await indexTorrentsAndDataDirs();
566
+ let numCandidates = 0;
567
+ await mapAsync(await queryRssFeeds(lastRun, enabledIndexers), async (candidates) => {
568
+ for await (const candidate of candidates) {
569
+ await checkNewCandidateMatch(candidate, Label.RSS);
570
+ numCandidates++;
571
+ }
572
+ });
573
+ logger.info({
574
+ label: Label.RSS,
575
+ message: `RSS scan complete - checked ${numCandidates} new candidates since ${humanReadableDate(lastRun)}`,
576
+ });
577
+ }
578
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { MediaType } from "./constants.js";
2
+ import { RuntimeConfig } from "./runtimeConfig.js";
3
+ import { Searchee, SearcheeWithLabel } from "./searchee.js";
4
+ export declare function logFilterReason(reason: string, searchee: SearcheeWithLabel, mediaType: MediaType, options?: {
5
+ logWithoutSearcheeLabel?: boolean;
6
+ }): void;
7
+ export declare function isSingleEpisode(searchee: Searchee, mediaType: MediaType): boolean;
8
+ export declare function filterByContent(searchee: SearcheeWithLabel, options?: {
9
+ configOverride: Partial<RuntimeConfig>;
10
+ allowSeasonPackEpisodes: boolean;
11
+ ignoreCrossSeeds: boolean;
12
+ blockListOnly?: boolean;
13
+ logWithoutSearcheeLabel?: boolean;
14
+ }): Promise<boolean>;
15
+ export declare function findBlockedStringInReleaseMaybe(searchee: Searchee, blockList: string[]): string | undefined;
16
+ /**
17
+ * Filters duplicates from searchees that are for the same candidates,
18
+ * e.g. searchees for the same media but different resolutions.
19
+ * @param searchees - An array of searchees for a specific media.
20
+ * @returns An array of searchees that are unique from a matching perspective.
21
+ */
22
+ export declare function filterDupesFromSimilar<T extends Searchee>(searchees: T[]): T[];
23
+ export declare function filterTimestamps(searchee: SearcheeWithLabel, options?: {
24
+ configOverride: Partial<RuntimeConfig>;
25
+ }): Promise<boolean>;