cross-seed 7.0.0-1 → 7.0.0-2

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 (229) 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 +61 -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 +2 -2
@@ -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>;