cross-seed 7.0.0-1 → 7.0.0-3

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 (282) 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 +698 -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 +785 -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 +657 -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 +341 -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 +404 -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 +3 -0
  44. package/dist/db.js +216 -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/diff.d.ts +1 -0
  53. package/dist/diff.js +24 -0
  54. package/dist/diff.js.map +1 -0
  55. package/dist/errors.d.ts +3 -0
  56. package/dist/errors.js +7 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/indexers.d.ts +105 -0
  59. package/dist/indexers.js +248 -0
  60. package/dist/indexers.js.map +1 -0
  61. package/dist/inject.d.ts +2 -0
  62. package/dist/inject.js +594 -0
  63. package/dist/inject.js.map +1 -0
  64. package/dist/jobs.d.ts +29 -0
  65. package/dist/jobs.js +151 -0
  66. package/dist/jobs.js.map +1 -0
  67. package/dist/logger.d.ts +29 -0
  68. package/dist/logger.js +157 -0
  69. package/dist/logger.js.map +1 -0
  70. package/dist/migrations/00-initialSchema.d.ts +9 -0
  71. package/dist/migrations/00-initialSchema.js +30 -0
  72. package/dist/migrations/00-initialSchema.js.map +1 -0
  73. package/dist/migrations/01-jobs.d.ts +9 -0
  74. package/dist/migrations/01-jobs.js +12 -0
  75. package/dist/migrations/01-jobs.js.map +1 -0
  76. package/dist/migrations/02-timestamps.d.ts +9 -0
  77. package/dist/migrations/02-timestamps.js +21 -0
  78. package/dist/migrations/02-timestamps.js.map +1 -0
  79. package/dist/migrations/03-rateLimits.d.ts +9 -0
  80. package/dist/migrations/03-rateLimits.js +14 -0
  81. package/dist/migrations/03-rateLimits.js.map +1 -0
  82. package/dist/migrations/04-auth.d.ts +9 -0
  83. package/dist/migrations/04-auth.js +13 -0
  84. package/dist/migrations/04-auth.js.map +1 -0
  85. package/dist/migrations/05-caps.d.ts +9 -0
  86. package/dist/migrations/05-caps.js +16 -0
  87. package/dist/migrations/05-caps.js.map +1 -0
  88. package/dist/migrations/06-uniqueDecisions.d.ts +9 -0
  89. package/dist/migrations/06-uniqueDecisions.js +29 -0
  90. package/dist/migrations/06-uniqueDecisions.js.map +1 -0
  91. package/dist/migrations/07-limits.d.ts +9 -0
  92. package/dist/migrations/07-limits.js +12 -0
  93. package/dist/migrations/07-limits.js.map +1 -0
  94. package/dist/migrations/08-rss.d.ts +9 -0
  95. package/dist/migrations/08-rss.js +15 -0
  96. package/dist/migrations/08-rss.js.map +1 -0
  97. package/dist/migrations/09-clientAndDataSearchees.d.ts +9 -0
  98. package/dist/migrations/09-clientAndDataSearchees.js +34 -0
  99. package/dist/migrations/09-clientAndDataSearchees.js.map +1 -0
  100. package/dist/migrations/10-indexerNameAudioBookCaps.d.ts +9 -0
  101. package/dist/migrations/10-indexerNameAudioBookCaps.js +18 -0
  102. package/dist/migrations/10-indexerNameAudioBookCaps.js.map +1 -0
  103. package/dist/migrations/11-trackers.d.ts +9 -0
  104. package/dist/migrations/11-trackers.js +38 -0
  105. package/dist/migrations/11-trackers.js.map +1 -0
  106. package/dist/migrations/12-user-auth.d.ts +9 -0
  107. package/dist/migrations/12-user-auth.js +22 -0
  108. package/dist/migrations/12-user-auth.js.map +1 -0
  109. package/dist/migrations/13-settings.d.ts +9 -0
  110. package/dist/migrations/13-settings.js +23 -0
  111. package/dist/migrations/13-settings.js.map +1 -0
  112. package/dist/migrations/14-indexer-enabled-flag.d.ts +9 -0
  113. package/dist/migrations/14-indexer-enabled-flag.js +12 -0
  114. package/dist/migrations/14-indexer-enabled-flag.js.map +1 -0
  115. package/dist/migrations/15-remove-url-unique-constraint.d.ts +9 -0
  116. package/dist/migrations/15-remove-url-unique-constraint.js +14 -0
  117. package/dist/migrations/15-remove-url-unique-constraint.js.map +1 -0
  118. package/dist/migrations/16-prune-inactive-indexers.d.ts +9 -0
  119. package/dist/migrations/16-prune-inactive-indexers.js +17 -0
  120. package/dist/migrations/16-prune-inactive-indexers.js.map +1 -0
  121. package/dist/migrations/migrations.d.ts +13 -0
  122. package/dist/migrations/migrations.js +41 -0
  123. package/dist/migrations/migrations.js.map +1 -0
  124. package/dist/parseTorrent.d.ts +53 -0
  125. package/dist/parseTorrent.js +128 -0
  126. package/dist/parseTorrent.js.map +1 -0
  127. package/dist/pipeline.d.ts +41 -0
  128. package/dist/pipeline.js +574 -0
  129. package/dist/pipeline.js.map +1 -0
  130. package/dist/preFilter.d.ts +25 -0
  131. package/dist/preFilter.js +250 -0
  132. package/dist/preFilter.js.map +1 -0
  133. package/dist/problems/linking.d.ts +2 -0
  134. package/dist/problems/linking.js +80 -0
  135. package/dist/problems/linking.js.map +1 -0
  136. package/dist/problems/path.d.ts +22 -0
  137. package/dist/problems/path.js +96 -0
  138. package/dist/problems/path.js.map +1 -0
  139. package/dist/problems.d.ts +13 -0
  140. package/dist/problems.js +48 -0
  141. package/dist/problems.js.map +1 -0
  142. package/dist/pushNotifier.d.ts +19 -0
  143. package/dist/pushNotifier.js +137 -0
  144. package/dist/pushNotifier.js.map +1 -0
  145. package/dist/routes/baseApi.d.ts +2 -0
  146. package/dist/routes/baseApi.js +354 -0
  147. package/dist/routes/baseApi.js.map +1 -0
  148. package/dist/routes/indexerApi.d.ts +6 -0
  149. package/dist/routes/indexerApi.js +165 -0
  150. package/dist/routes/indexerApi.js.map +1 -0
  151. package/dist/routes/staticFrontendPlugin.d.ts +4 -0
  152. package/dist/routes/staticFrontendPlugin.js +63 -0
  153. package/dist/routes/staticFrontendPlugin.js.map +1 -0
  154. package/dist/runtimeConfig.d.ts +6 -0
  155. package/dist/runtimeConfig.js +27 -0
  156. package/dist/runtimeConfig.js.map +1 -0
  157. package/dist/searchee.d.ts +108 -0
  158. package/dist/searchee.js +689 -0
  159. package/dist/searchee.js.map +1 -0
  160. package/dist/server.d.ts +4 -0
  161. package/dist/server.js +65 -0
  162. package/dist/server.js.map +1 -0
  163. package/dist/services/indexerService.d.ts +96 -0
  164. package/dist/services/indexerService.js +287 -0
  165. package/dist/services/indexerService.js.map +1 -0
  166. package/dist/sessionCookies.d.ts +5 -0
  167. package/dist/sessionCookies.js +27 -0
  168. package/dist/sessionCookies.js.map +1 -0
  169. package/dist/startup.d.ts +25 -0
  170. package/dist/startup.js +157 -0
  171. package/dist/startup.js.map +1 -0
  172. package/dist/torrent.d.ts +69 -0
  173. package/dist/torrent.js +641 -0
  174. package/dist/torrent.js.map +1 -0
  175. package/dist/torznab.d.ts +60 -0
  176. package/dist/torznab.js +711 -0
  177. package/dist/torznab.js.map +1 -0
  178. package/dist/trpc/fastifyAdapter.d.ts +2 -0
  179. package/dist/trpc/fastifyAdapter.js +9 -0
  180. package/dist/trpc/fastifyAdapter.js.map +1 -0
  181. package/dist/trpc/index.d.ts +49 -0
  182. package/dist/trpc/index.js +53 -0
  183. package/dist/trpc/index.js.map +1 -0
  184. package/dist/trpc/routers/auth.d.ts +43 -0
  185. package/dist/trpc/routers/auth.js +116 -0
  186. package/dist/trpc/routers/auth.js.map +1 -0
  187. package/dist/trpc/routers/clients.d.ts +21 -0
  188. package/dist/trpc/routers/clients.js +65 -0
  189. package/dist/trpc/routers/clients.js.map +1 -0
  190. package/dist/trpc/routers/health.d.ts +14 -0
  191. package/dist/trpc/routers/health.js +20 -0
  192. package/dist/trpc/routers/health.js.map +1 -0
  193. package/dist/trpc/routers/index.d.ts +391 -0
  194. package/dist/trpc/routers/index.js +23 -0
  195. package/dist/trpc/routers/index.js.map +1 -0
  196. package/dist/trpc/routers/indexers.d.ts +75 -0
  197. package/dist/trpc/routers/indexers.js +79 -0
  198. package/dist/trpc/routers/indexers.js.map +1 -0
  199. package/dist/trpc/routers/jobs.d.ts +33 -0
  200. package/dist/trpc/routers/jobs.js +84 -0
  201. package/dist/trpc/routers/jobs.js.map +1 -0
  202. package/dist/trpc/routers/logs.d.ts +27 -0
  203. package/dist/trpc/routers/logs.js +91 -0
  204. package/dist/trpc/routers/logs.js.map +1 -0
  205. package/dist/trpc/routers/searchees.d.ts +51 -0
  206. package/dist/trpc/routers/searchees.js +156 -0
  207. package/dist/trpc/routers/searchees.js.map +1 -0
  208. package/dist/trpc/routers/settings.d.ts +83 -0
  209. package/dist/trpc/routers/settings.js +92 -0
  210. package/dist/trpc/routers/settings.js.map +1 -0
  211. package/dist/trpc/routers/stats.d.ts +42 -0
  212. package/dist/trpc/routers/stats.js +102 -0
  213. package/dist/trpc/routers/stats.js.map +1 -0
  214. package/dist/userAuth.d.ts +21 -0
  215. package/dist/userAuth.js +86 -0
  216. package/dist/userAuth.js.map +1 -0
  217. package/dist/utils/authUtils.d.ts +10 -0
  218. package/dist/utils/authUtils.js +24 -0
  219. package/dist/utils/authUtils.js.map +1 -0
  220. package/dist/utils/logWatcher.d.ts +28 -0
  221. package/dist/utils/logWatcher.js +218 -0
  222. package/dist/utils/logWatcher.js.map +1 -0
  223. package/dist/utils/object.d.ts +1 -0
  224. package/dist/utils/object.js +4 -0
  225. package/dist/utils/object.js.map +1 -0
  226. package/dist/utils.d.ts +175 -0
  227. package/dist/utils.js +660 -0
  228. package/dist/utils.js.map +1 -0
  229. package/package.json +17 -58
  230. package/LICENSE +0 -201
  231. package/README.md +0 -33
  232. package/dist/webui/assets/FieldInfo-Bxj_j8SJ.js +0 -1
  233. package/dist/webui/assets/Page-C3rteCZt.js +0 -1
  234. package/dist/webui/assets/array-field-DVSC6nHP.js +0 -1
  235. package/dist/webui/assets/badge-DTZMtS0e.js +0 -1
  236. package/dist/webui/assets/check-Bu3ldi63.js +0 -1
  237. package/dist/webui/assets/chevron-down-CRy8M0kJ.js +0 -1
  238. package/dist/webui/assets/clients-CW8oEZoQ.js +0 -1
  239. package/dist/webui/assets/connect-YBNsnjWT.js +0 -1
  240. package/dist/webui/assets/debug-mz8-WYZj.js +0 -1
  241. package/dist/webui/assets/directories-BSK28RgR.js +0 -1
  242. package/dist/webui/assets/duration-field-C6xoSlJg.js +0 -1
  243. package/dist/webui/assets/general-lJJxZhH7.js +0 -1
  244. package/dist/webui/assets/health-CXbsVrie.js +0 -1
  245. package/dist/webui/assets/index-Bi48hI2z.js +0 -54
  246. package/dist/webui/assets/index-C-Ul7GNg.css +0 -1
  247. package/dist/webui/assets/index-C2cH1Gst.js +0 -1
  248. package/dist/webui/assets/index-Cc5bDmJr.js +0 -1
  249. package/dist/webui/assets/jobs-CxmNab9w.js +0 -1
  250. package/dist/webui/assets/library-vaj2W8sE.js +0 -1
  251. package/dist/webui/assets/loader-circle-M0gu1gZ-.js +0 -1
  252. package/dist/webui/assets/logs-Cu9RyKS0.js +0 -1
  253. package/dist/webui/assets/search-2R5sIdT8.js +0 -1
  254. package/dist/webui/assets/select-field-BCqNLDrJ.js +0 -1
  255. package/dist/webui/assets/select-zHgqMzLj.js +0 -1
  256. package/dist/webui/assets/settings-CMYjpTbZ.js +0 -1
  257. package/dist/webui/assets/submit-button-BtcnyggQ.js +0 -1
  258. package/dist/webui/assets/switch-G0W3uJVN.js +0 -1
  259. package/dist/webui/assets/switch-field-IBd9ORNq.js +0 -1
  260. package/dist/webui/assets/table-DvgJU7Gh.js +0 -1
  261. package/dist/webui/assets/test-tube-BIwmoM45.js +0 -1
  262. package/dist/webui/assets/text-field-DruSbGhy.js +0 -1
  263. package/dist/webui/assets/time-BSMZjmyW.js +0 -1
  264. package/dist/webui/assets/trackers-D-OpAe63.js +0 -7
  265. package/dist/webui/assets/use-form-validation-context-BkAfWAh0.js +0 -1
  266. package/dist/webui/assets/use-settings-form-submit-CDRh-E9U.js +0 -2
  267. package/dist/webui/assets/useQuery-A4Hv_4uX.js +0 -1
  268. package/dist/webui/index.html +0 -13
  269. package/node_modules/@cross-seed/shared/dist/configSchema.d.ts +0 -261
  270. package/node_modules/@cross-seed/shared/dist/configSchema.d.ts.map +0 -1
  271. package/node_modules/@cross-seed/shared/dist/configSchema.js +0 -53
  272. package/node_modules/@cross-seed/shared/dist/configSchema.js.map +0 -1
  273. package/node_modules/@cross-seed/shared/dist/constants.d.ts +0 -122
  274. package/node_modules/@cross-seed/shared/dist/constants.d.ts.map +0 -1
  275. package/node_modules/@cross-seed/shared/dist/constants.js +0 -127
  276. package/node_modules/@cross-seed/shared/dist/constants.js.map +0 -1
  277. package/node_modules/@cross-seed/shared/dist/tsconfig.tsbuildinfo +0 -1
  278. package/node_modules/@cross-seed/shared/dist/utils.d.ts +0 -6
  279. package/node_modules/@cross-seed/shared/dist/utils.d.ts.map +0 -1
  280. package/node_modules/@cross-seed/shared/dist/utils.js +0 -9
  281. package/node_modules/@cross-seed/shared/dist/utils.js.map +0 -1
  282. package/node_modules/@cross-seed/shared/package.json +0 -22
@@ -0,0 +1,105 @@
1
+ import type { Problem } from "./problems.js";
2
+ export declare enum IndexerStatus {
3
+ /**
4
+ * equivalent to null
5
+ */
6
+ OK = "OK",
7
+ RATE_LIMITED = "RATE_LIMITED",
8
+ UNKNOWN_ERROR = "UNKNOWN_ERROR"
9
+ }
10
+ export interface DbIndexer {
11
+ id: number;
12
+ name: string | null;
13
+ url: string;
14
+ apikey: string;
15
+ trackers: string | null;
16
+ /**
17
+ * When false, the indexer has been disabled by the user and should not be
18
+ * used for searching or RSS, but can be used for fetching caps or
19
+ * cross-seed restore.
20
+ * Corresponds to indexer enabled bit in Prowlarr.
21
+ */
22
+ enabled: boolean;
23
+ status: IndexerStatus;
24
+ retryAfter: number;
25
+ searchCap: boolean;
26
+ tvSearchCap: boolean;
27
+ movieSearchCap: boolean;
28
+ musicSearchCap: boolean;
29
+ audioSearchCap: boolean;
30
+ bookSearchCap: boolean;
31
+ tvIdCaps: string | null;
32
+ movieIdCaps: string | null;
33
+ catCaps: string | null;
34
+ limitsCaps: string | null;
35
+ }
36
+ export interface IndexerCategories {
37
+ tv: boolean;
38
+ movie: boolean;
39
+ anime: boolean;
40
+ xxx: boolean;
41
+ audio: boolean;
42
+ book: boolean;
43
+ /**
44
+ * If the indexer has a category not covered by the above.
45
+ */
46
+ additional: boolean;
47
+ }
48
+ export interface IndexerLimits {
49
+ default: number;
50
+ max: number;
51
+ }
52
+ export interface Caps {
53
+ search: boolean;
54
+ tvSearch: boolean;
55
+ movieSearch: boolean;
56
+ musicSearch: boolean;
57
+ audioSearch: boolean;
58
+ bookSearch: boolean;
59
+ movieIdSearch: IdSearchCaps;
60
+ tvIdSearch: IdSearchCaps;
61
+ categories: IndexerCategories;
62
+ limits: IndexerLimits;
63
+ }
64
+ export interface IdSearchCaps {
65
+ tvdbId?: boolean;
66
+ tmdbId?: boolean;
67
+ imdbId?: boolean;
68
+ tvMazeId?: boolean;
69
+ }
70
+ export interface Indexer {
71
+ id: number;
72
+ name: string | null;
73
+ url: string;
74
+ apikey: string;
75
+ trackers: string[] | null;
76
+ enabled: boolean;
77
+ status: IndexerStatus;
78
+ retryAfter: number;
79
+ searchCap: boolean;
80
+ tvSearchCap: boolean;
81
+ movieSearchCap: boolean;
82
+ musicSearchCap: boolean;
83
+ audioSearchCap: boolean;
84
+ bookSearchCap: boolean;
85
+ tvIdCaps: IdSearchCaps;
86
+ movieIdCaps: IdSearchCaps;
87
+ categories: IndexerCategories;
88
+ limits: IndexerLimits;
89
+ }
90
+ export declare const ALL_CAPS: Caps;
91
+ export declare function deserialize(dbIndexer: DbIndexer): Indexer;
92
+ /**
93
+ * All indexers that users currently have configured regardless of whether they are working.
94
+ */
95
+ export declare function getAllIndexers(): Promise<Indexer[]>;
96
+ /**
97
+ * Indexers that are currently working and enabled.
98
+ */
99
+ export declare function getEnabledIndexers(): Promise<Indexer[]>;
100
+ export declare function updateIndexerStatus(status: IndexerStatus, retryAfter: number, indexerIds: number[], indexerNames: Set<string>): Promise<void>;
101
+ export declare function updateSearchTimestamps(name: string, indexerIds: number[]): Promise<void>;
102
+ export declare function updateIndexerCapsById(indexerId: number, caps: Caps): Promise<void>;
103
+ export declare function clearIndexerFailures(): Promise<void>;
104
+ export declare function getHostToNameMap(): Promise<Map<string, string>>;
105
+ export declare function collectIndexerProblems(): Promise<Problem[]>;
@@ -0,0 +1,248 @@
1
+ import { db } from "./db.js";
2
+ import { Label, logger } from "./logger.js";
3
+ import { humanReadableDate } from "./utils.js";
4
+ export var IndexerStatus;
5
+ (function (IndexerStatus) {
6
+ /**
7
+ * equivalent to null
8
+ */
9
+ IndexerStatus["OK"] = "OK";
10
+ IndexerStatus["RATE_LIMITED"] = "RATE_LIMITED";
11
+ IndexerStatus["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
12
+ })(IndexerStatus || (IndexerStatus = {}));
13
+ const allFields = {
14
+ id: "id",
15
+ url: "url",
16
+ name: "name",
17
+ apikey: "apikey",
18
+ trackers: "trackers",
19
+ enabled: "enabled",
20
+ status: "status",
21
+ retryAfter: "retry_after",
22
+ searchCap: "search_cap",
23
+ tvSearchCap: "tv_search_cap",
24
+ movieSearchCap: "movie_search_cap",
25
+ musicSearchCap: "music_search_cap",
26
+ audioSearchCap: "audio_search_cap",
27
+ bookSearchCap: "book_search_cap",
28
+ tvIdCaps: "tv_id_caps",
29
+ movieIdCaps: "movie_id_caps",
30
+ catCaps: "cat_caps",
31
+ limitsCaps: "limits_caps",
32
+ };
33
+ export const ALL_CAPS = {
34
+ limits: {
35
+ default: 100,
36
+ max: 100,
37
+ },
38
+ search: true,
39
+ categories: {
40
+ tv: true,
41
+ movie: true,
42
+ anime: true,
43
+ xxx: true,
44
+ audio: true,
45
+ book: true,
46
+ additional: true,
47
+ },
48
+ tvSearch: true,
49
+ movieSearch: true,
50
+ musicSearch: true,
51
+ audioSearch: true,
52
+ bookSearch: true,
53
+ movieIdSearch: {
54
+ tvdbId: true,
55
+ tmdbId: true,
56
+ imdbId: true,
57
+ tvMazeId: true,
58
+ },
59
+ tvIdSearch: {
60
+ tvdbId: true,
61
+ tmdbId: true,
62
+ imdbId: true,
63
+ tvMazeId: true,
64
+ },
65
+ };
66
+ export function deserialize(dbIndexer) {
67
+ const { trackers, tvIdCaps, movieIdCaps, catCaps, limitsCaps, ...rest } = dbIndexer;
68
+ return {
69
+ ...rest,
70
+ enabled: Boolean(rest.enabled),
71
+ searchCap: Boolean(rest.searchCap),
72
+ tvSearchCap: Boolean(rest.tvSearchCap),
73
+ movieSearchCap: Boolean(rest.movieSearchCap),
74
+ musicSearchCap: Boolean(rest.musicSearchCap),
75
+ audioSearchCap: Boolean(rest.audioSearchCap),
76
+ bookSearchCap: Boolean(rest.bookSearchCap),
77
+ trackers: JSON.parse(trackers ?? "null"),
78
+ tvIdCaps: JSON.parse(tvIdCaps ?? "null"),
79
+ movieIdCaps: JSON.parse(movieIdCaps ?? "null"),
80
+ categories: JSON.parse(catCaps ?? "null"),
81
+ limits: JSON.parse(limitsCaps ?? "null"),
82
+ };
83
+ }
84
+ /**
85
+ * All indexers that users currently have configured regardless of whether they are working.
86
+ */
87
+ export async function getAllIndexers() {
88
+ return (await db("indexer").select(allFields)).map(deserialize);
89
+ }
90
+ /**
91
+ * Indexers that are currently working and enabled.
92
+ */
93
+ export async function getEnabledIndexers() {
94
+ return (await db("indexer")
95
+ .whereNot({
96
+ search_cap: null,
97
+ tv_search_cap: null,
98
+ movie_search_cap: null,
99
+ music_search_cap: null,
100
+ audio_search_cap: null,
101
+ book_search_cap: null,
102
+ tv_id_caps: null,
103
+ movie_id_caps: null,
104
+ cat_caps: null,
105
+ limits_caps: null,
106
+ })
107
+ .where({ enabled: true, search_cap: true })
108
+ .where((i) => i
109
+ .where({ status: null })
110
+ .orWhere({ status: IndexerStatus.OK })
111
+ .orWhere("retry_after", "<", Date.now()))
112
+ .select(allFields)).map(deserialize);
113
+ }
114
+ export async function updateIndexerStatus(status, retryAfter, indexerIds, indexerNames) {
115
+ if (indexerIds.length > 0) {
116
+ logger.verbose({
117
+ label: Label.TORZNAB,
118
+ message: `Snoozing indexers [${Array.from(indexerNames).join(", ")}] with ${status} until ${humanReadableDate(retryAfter)}`,
119
+ });
120
+ await db("indexer").whereIn("id", indexerIds).update({
121
+ retry_after: retryAfter,
122
+ status,
123
+ });
124
+ }
125
+ }
126
+ export async function updateSearchTimestamps(name, indexerIds) {
127
+ for (const indexerId of indexerIds) {
128
+ await db.transaction(async (trx) => {
129
+ const now = Date.now();
130
+ const { id: searchee_id } = (await trx("searchee")
131
+ .where({ name })
132
+ .select("id")
133
+ .first());
134
+ await trx("timestamp")
135
+ .insert({
136
+ searchee_id,
137
+ indexer_id: indexerId,
138
+ last_searched: now,
139
+ first_searched: now,
140
+ })
141
+ .onConflict(["searchee_id", "indexer_id"])
142
+ .merge(["last_searched"]);
143
+ });
144
+ }
145
+ }
146
+ export async function updateIndexerCapsById(indexerId, caps) {
147
+ await db("indexer")
148
+ .where({ id: indexerId })
149
+ .update({
150
+ search_cap: caps.search,
151
+ tv_search_cap: caps.tvSearch,
152
+ movie_search_cap: caps.movieSearch,
153
+ music_search_cap: caps.musicSearch,
154
+ audio_search_cap: caps.audioSearch,
155
+ book_search_cap: caps.bookSearch,
156
+ movie_id_caps: JSON.stringify(caps.movieIdSearch),
157
+ tv_id_caps: JSON.stringify(caps.tvIdSearch),
158
+ cat_caps: JSON.stringify(caps.categories),
159
+ limits_caps: JSON.stringify(caps.limits),
160
+ });
161
+ }
162
+ export async function clearIndexerFailures() {
163
+ await db("indexer").update({
164
+ status: null,
165
+ retry_after: null,
166
+ });
167
+ }
168
+ export async function getHostToNameMap() {
169
+ const hostToName = new Map();
170
+ for (const indexer of await getAllIndexers()) {
171
+ if (!indexer.name || !indexer.trackers)
172
+ continue;
173
+ for (const trackerHost of indexer.trackers) {
174
+ if (hostToName.has(trackerHost))
175
+ continue;
176
+ hostToName.set(trackerHost, indexer.name);
177
+ }
178
+ }
179
+ return hostToName;
180
+ }
181
+ function indexerProblemId(suffix, indexerId) {
182
+ return `indexer:${suffix}:${indexerId}`;
183
+ }
184
+ function indexerDisplayName(url, name) {
185
+ return name?.trim() || url;
186
+ }
187
+ export async function collectIndexerProblems() {
188
+ const problems = [];
189
+ const indexers = await getAllIndexers();
190
+ if (!indexers.length) {
191
+ problems.push({
192
+ id: "indexer:none-configured",
193
+ severity: "error",
194
+ summary: "No indexers configured.",
195
+ details: "Add at least one indexer so cross-seed can search for releases.",
196
+ });
197
+ return problems;
198
+ }
199
+ const enabledIndexers = await getEnabledIndexers();
200
+ if (!enabledIndexers.length) {
201
+ problems.push({
202
+ id: "indexer:none-enabled",
203
+ severity: "error",
204
+ summary: "All configured indexers are disabled.",
205
+ details: "Enable at least one indexer so cross-seed can run searches.",
206
+ });
207
+ }
208
+ const now = Date.now();
209
+ for (const indexer of indexers) {
210
+ const name = indexerDisplayName(indexer.url, indexer.name);
211
+ if (!indexer.searchCap) {
212
+ problems.push({
213
+ id: indexerProblemId("no-search-cap", indexer.id),
214
+ severity: "warning",
215
+ summary: `Indexer "${name}" does not support searching.`,
216
+ details: "Update the indexer's capabilities (caps) in Prowlarr/Jackett or disable it for searching.",
217
+ });
218
+ }
219
+ if (indexer.status === IndexerStatus.RATE_LIMITED &&
220
+ typeof indexer.retryAfter === "number" &&
221
+ indexer.retryAfter > now) {
222
+ problems.push({
223
+ id: indexerProblemId("rate-limited", indexer.id),
224
+ severity: "warning",
225
+ summary: `Indexer "${name}" is rate limited.`,
226
+ details: `Cross-seed will retry after ${humanReadableDate(indexer.retryAfter)}.`,
227
+ });
228
+ }
229
+ if (indexer.status === IndexerStatus.UNKNOWN_ERROR) {
230
+ problems.push({
231
+ id: indexerProblemId("unknown-error", indexer.id),
232
+ severity: "warning",
233
+ summary: `Indexer "${name}" recently failed.`,
234
+ details: "Check logs for the underlying error and verify the indexer configuration.",
235
+ });
236
+ }
237
+ if (!indexer.enabled) {
238
+ problems.push({
239
+ id: indexerProblemId("disabled", indexer.id),
240
+ severity: "info",
241
+ summary: `Indexer "${name}" is disabled.`,
242
+ details: "Re-enable the indexer if you want cross-seed to include it in searches.",
243
+ });
244
+ }
245
+ }
246
+ return problems;
247
+ }
248
+ //# sourceMappingURL=indexers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexers.js","sourceRoot":"","sources":["../src/indexers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function injectSavedTorrents(): Promise<void>;
2
+ export declare function restoreFromTorrentCache(): Promise<void>;