cross-seed 7.0.0-1 → 7.0.0-10

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 +641 -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,165 @@
1
+ import { PROGRAM_VERSION } from "../constants.js";
2
+ import { Label, logger } from "../logger.js";
3
+ import { createIndexer, deleteIndexer, getIndexerById, indexerCreateSchema, indexerTestSchema, indexerUpdateSchema, listAllIndexers, testExistingIndexer, testNewIndexer, updateIndexer, } from "../services/indexerService.js";
4
+ import { authorize } from "../utils/authUtils.js";
5
+ // Helper function to parse and validate ID from route params
6
+ async function parseIdParam(idParam, reply) {
7
+ const id = parseInt(idParam, 10);
8
+ if (isNaN(id) || id <= 0) {
9
+ await reply.code(400).send({
10
+ code: "VALIDATION_ERROR",
11
+ message: "Invalid indexer ID",
12
+ });
13
+ return false;
14
+ }
15
+ return id;
16
+ }
17
+ /**
18
+ * Prowlarr Integration API Routes
19
+ * Base path: /api/indexer/v1
20
+ */
21
+ export async function indexerApiPlugin(app) {
22
+ /**
23
+ * Indexer management status for Prowlarr integration
24
+ */
25
+ app.get("/status", async (request, reply) => {
26
+ if (!(await authorize(request, reply)))
27
+ return;
28
+ const statusResponse = {
29
+ version: PROGRAM_VERSION,
30
+ appName: "cross-seed",
31
+ };
32
+ return reply.code(200).send(statusResponse);
33
+ });
34
+ /**
35
+ * List all indexers
36
+ */
37
+ app.get("", async (request, reply) => {
38
+ if (!(await authorize(request, reply)))
39
+ return;
40
+ const indexers = await listAllIndexers();
41
+ return reply.code(200).send(indexers);
42
+ });
43
+ /**
44
+ * Get single indexer by ID
45
+ */
46
+ app.get("/:id", async (request, reply) => {
47
+ if (!(await authorize(request, reply)))
48
+ return;
49
+ const id = await parseIdParam(request.params.id, reply);
50
+ if (!id)
51
+ return;
52
+ const result = await getIndexerById(id);
53
+ if (result.isOk()) {
54
+ return reply.code(200).send(result.unwrap());
55
+ }
56
+ const err = result.unwrapErr();
57
+ return reply.code(404).send(err);
58
+ });
59
+ /**
60
+ * Create new indexer
61
+ */
62
+ app.post("", async (request, reply) => {
63
+ if (!(await authorize(request, reply)))
64
+ return;
65
+ const validation = indexerCreateSchema.safeParse(request.body);
66
+ if (!validation.success) {
67
+ return reply.code(400).send({
68
+ code: "VALIDATION_ERROR",
69
+ message: validation.error.message,
70
+ });
71
+ }
72
+ const indexer = await createIndexer(validation.data);
73
+ return reply.code(200).send(indexer);
74
+ });
75
+ /**
76
+ * Update existing indexer
77
+ */
78
+ app.put("/:id", async (request, reply) => {
79
+ if (!(await authorize(request, reply)))
80
+ return;
81
+ const id = await parseIdParam(request.params.id, reply);
82
+ if (!id)
83
+ return;
84
+ // Ensure body ID matches URL ID
85
+ if (request.body.id !== id) {
86
+ return reply.code(400).send({
87
+ code: "VALIDATION_ERROR",
88
+ message: "ID in request body must match URL parameter",
89
+ });
90
+ }
91
+ const validation = indexerUpdateSchema.safeParse(request.body);
92
+ if (!validation.success) {
93
+ return reply.code(400).send({
94
+ code: "VALIDATION_ERROR",
95
+ message: validation.error.message,
96
+ });
97
+ }
98
+ const result = await updateIndexer(validation.data);
99
+ if (result.isOk()) {
100
+ return reply.code(200).send(result.unwrap());
101
+ }
102
+ const err = result.unwrapErr();
103
+ return reply.code(404).send(err);
104
+ });
105
+ /**
106
+ * Delete indexer
107
+ */
108
+ app.delete("/:id", async (request, reply) => {
109
+ if (!(await authorize(request, reply)))
110
+ return;
111
+ const id = await parseIdParam(request.params.id, reply);
112
+ if (!id)
113
+ return;
114
+ const result = await deleteIndexer(id);
115
+ if (result.isOk()) {
116
+ return reply.code(200).send(result.unwrap());
117
+ }
118
+ const err = result.unwrapErr();
119
+ return reply.code(404).send(err);
120
+ });
121
+ /**
122
+ * Test indexer connection
123
+ */
124
+ app.post("/test", async (request, reply) => {
125
+ if (!(await authorize(request, reply)))
126
+ return;
127
+ let result;
128
+ if (request.body.id) {
129
+ // Test existing indexer
130
+ result = await testExistingIndexer(request.body.id);
131
+ }
132
+ else {
133
+ // Test new indexer configuration
134
+ const validation = indexerTestSchema.safeParse(request.body);
135
+ if (!validation.success) {
136
+ return reply.code(400).send({
137
+ code: "VALIDATION_ERROR",
138
+ message: validation.error.message,
139
+ });
140
+ }
141
+ result = await testNewIndexer(validation.data);
142
+ }
143
+ if (result.isOk()) {
144
+ const success = result.unwrap();
145
+ return reply.code(200).send({
146
+ ok: true,
147
+ message: success.message,
148
+ });
149
+ }
150
+ const err = result.unwrapErr();
151
+ if (err.code === "INDEXER_NOT_FOUND") {
152
+ return reply.code(404).send(err);
153
+ }
154
+ logger.warn({
155
+ label: Label.SERVER,
156
+ message: `Connection test failed: ${err.message}`,
157
+ });
158
+ return reply.code(200).send({
159
+ ok: false,
160
+ code: err.code,
161
+ message: err.message,
162
+ });
163
+ });
164
+ }
165
+ //# sourceMappingURL=indexerApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexerApi.js","sourceRoot":"","sources":["../../src/routes/indexerApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { FastifyInstance } from "fastify";
2
+ export declare function staticFrontendPlugin(app: FastifyInstance, { basePath }: {
3
+ basePath: string;
4
+ }): Promise<void>;
@@ -0,0 +1,61 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { extname, join } from "path";
3
+ import { isTruthy } from "../utils.js";
4
+ const SENTINEL_BASE_PATH = "/__CROSS_SEED_BASE_PATH__";
5
+ const STATIC_ROOT = join(import.meta.dirname, "..", "..", "dist", "webui");
6
+ const INDEX_HTML_PATH = join(STATIC_ROOT, "index.html");
7
+ const UTF8 = { encoding: "utf-8" };
8
+ const MIME_TYPES = {
9
+ ".html": "text/html",
10
+ ".css": "text/css",
11
+ ".js": "application/javascript",
12
+ ".mjs": "application/javascript",
13
+ ".json": "application/json",
14
+ ".png": "image/png",
15
+ ".jpg": "image/jpeg",
16
+ ".jpeg": "image/jpeg",
17
+ ".svg": "image/svg+xml",
18
+ ".ico": "image/x-icon",
19
+ };
20
+ function injectBasePath(content, ext, basePath) {
21
+ if (ext === ".html" ||
22
+ ext === ".css" ||
23
+ ext === ".js" ||
24
+ ext === ".mjs" ||
25
+ ext === ".json") {
26
+ return content.replaceAll(SENTINEL_BASE_PATH, basePath);
27
+ }
28
+ return content;
29
+ }
30
+ function getContentType(ext) {
31
+ return MIME_TYPES[ext] || "application/octet-stream";
32
+ }
33
+ export async function staticFrontendPlugin(app, { basePath }) {
34
+ // Custom static file handler that replaces sentinel values
35
+ app.get("*", async (request, reply) => {
36
+ const basePathRelativeUrl = request.url.startsWith(basePath)
37
+ ? request.url.slice(basePath.length)
38
+ : "MALFORMED_REQUEST_URL"; // should never happen because this route is only registered under basePath
39
+ const desiredFilePath = join(STATIC_ROOT, ...basePathRelativeUrl.split("/").filter(isTruthy));
40
+ let fileContents;
41
+ let fileExtension;
42
+ try {
43
+ fileContents = await readFile(desiredFilePath, UTF8);
44
+ fileExtension = extname(desiredFilePath);
45
+ }
46
+ catch (e) {
47
+ if (e.code == "ENOENT" ||
48
+ e.code == "EISDIR") {
49
+ fileContents = await readFile(INDEX_HTML_PATH, UTF8);
50
+ fileExtension = ".html";
51
+ }
52
+ else {
53
+ throw e;
54
+ }
55
+ }
56
+ return reply
57
+ .type(getContentType(fileExtension))
58
+ .send(injectBasePath(fileContents, fileExtension, basePath));
59
+ });
60
+ }
61
+ //# sourceMappingURL=staticFrontendPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticFrontendPlugin.js","sourceRoot":"","sources":["../../src/routes/staticFrontendPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AACvD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3E,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AACxD,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAW,CAAC;AAC5C,MAAM,UAAU,GAA2B;IAC1C,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EAAE,wBAAwB;IAChC,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;CACtB,CAAC;AAEF,SAAS,cAAc,CACtB,OAAe,EACf,GAAW,EACX,QAAgB;IAEhB,IACC,GAAG,KAAK,OAAO;QACf,GAAG,KAAK,MAAM;QACd,GAAG,KAAK,KAAK;QACb,GAAG,KAAK,MAAM;QACd,GAAG,KAAK,OAAO,EACd,CAAC;QACF,OAAO,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IAClC,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,GAAoB,EACpB,EAAE,QAAQ,EAAwB;IAElC,2DAA2D;IAC3D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACrC,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC3D,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpC,CAAC,CAAC,uBAAuB,CAAC,CAAC,2EAA2E;QACvG,MAAM,eAAe,GAAG,IAAI,CAC3B,WAAW,EACX,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAClD,CAAC;QACF,IAAI,YAAoB,CAAC;QACzB,IAAI,aAAqB,CAAC;QAE1B,IAAI,CAAC;YACJ,YAAY,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YACrD,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IACE,CAAoB,CAAC,IAAI,IAAI,QAAQ;gBACrC,CAAoB,CAAC,IAAI,IAAI,QAAQ,EACrC,CAAC;gBACF,YAAY,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;gBACrD,aAAa,GAAG,OAAO,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,CAAC;YACT,CAAC;QACF,CAAC;QAED,OAAO,KAAK;aACV,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;aACnC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Problem } from "./problems.js";
2
+ import type { RuntimeConfig } from "@cross-seed/shared/configSchema";
3
+ export type { RuntimeConfig };
4
+ export declare function setRuntimeConfig(configObj: RuntimeConfig): void;
5
+ export declare function getRuntimeConfig(configOverride?: Partial<RuntimeConfig>): RuntimeConfig;
6
+ export declare function collectRecommendationProblems(): Problem[];
@@ -0,0 +1,27 @@
1
+ import { MatchMode } from "./constants.js";
2
+ import { omitUndefined } from "./utils/object.js";
3
+ let runtimeConfig;
4
+ export function setRuntimeConfig(configObj) {
5
+ runtimeConfig = configObj;
6
+ }
7
+ export function getRuntimeConfig(configOverride = {}) {
8
+ return {
9
+ ...runtimeConfig,
10
+ ...omitUndefined(configOverride),
11
+ };
12
+ }
13
+ export function collectRecommendationProblems() {
14
+ const { matchMode } = getRuntimeConfig();
15
+ if (matchMode === MatchMode.PARTIAL)
16
+ return [];
17
+ return [
18
+ {
19
+ id: "recommendation:partial-matching",
20
+ severity: "info",
21
+ summary: "Enable partial matching for better results",
22
+ details: "Partial matching skips tiny files and improves match success. Enable it under Settings → Search & RSS when linking is available.",
23
+ metadata: { recommendation: true },
24
+ },
25
+ ];
26
+ }
27
+ //# sourceMappingURL=runtimeConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeConfig.js","sourceRoot":"","sources":["../src/runtimeConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,IAAI,aAA4B,CAAC;AAEjC,MAAM,UAAU,gBAAgB,CAAC,SAAwB;IACxD,aAAa,GAAG,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,iBAAyC,EAAE;IAE3C,OAAO;QACN,GAAG,aAAa;QAChB,GAAG,aAAa,CAAC,cAAc,CAAC;KAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC5C,MAAM,EAAE,SAAS,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACzC,IAAI,SAAS,KAAK,SAAS,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAE/C,OAAO;QACN;YACC,EAAE,EAAE,iCAAiC;YACrC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,4CAA4C;YACrD,OAAO,EACN,kIAAkI;YACnI,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;SAClC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { TorrentMetadataInClient } from "./clients/TorrentClient.js";
2
+ import type { Problem } from "./problems.js";
3
+ import { MediaType } from "./constants.js";
4
+ import { Label } from "./logger.js";
5
+ import { Metafile } from "./parseTorrent.js";
6
+ import { Result } from "./Result.js";
7
+ import { WithRequired, WithUndefined } from "./utils.js";
8
+ export interface File {
9
+ name: string;
10
+ path: string;
11
+ length: number;
12
+ }
13
+ export type SearcheeLabel = Label.SEARCH | Label.RSS | Label.INJECT | Label.ANNOUNCE | Label.WEBHOOK;
14
+ export interface Searchee {
15
+ /**
16
+ * If searchee is torrent based, !infoHash && !path for virtual
17
+ */
18
+ infoHash?: string;
19
+ /**
20
+ * If searchee is data based, !infoHash && !path for virtual
21
+ */
22
+ path?: string;
23
+ files: File[];
24
+ /**
25
+ * Original name. Use when interacting with path on disk or client logging
26
+ * e.g. during the action stage for sourceRoot
27
+ */
28
+ name: string;
29
+ /**
30
+ * Usually name but can differ if we can parse something better.
31
+ * e.g. Season 7 -> Show S7
32
+ */
33
+ title: string;
34
+ length: number;
35
+ mtimeMs?: number;
36
+ clientHost?: string;
37
+ savePath?: string;
38
+ category?: string;
39
+ tags?: string[];
40
+ trackers?: string[];
41
+ label?: SearcheeLabel;
42
+ }
43
+ export type SearcheeWithInfoHash = WithRequired<Searchee, "infoHash">;
44
+ export type SearcheeWithoutInfoHash = WithUndefined<Searchee, "infoHash">;
45
+ export type SearcheeClient = WithRequired<Searchee, "infoHash" | "clientHost" | "savePath" | "trackers">;
46
+ export type SearcheeVirtual = WithUndefined<Searchee, "infoHash" | "path">;
47
+ export type SearcheeWithLabel = WithRequired<Searchee, "label">;
48
+ export declare function hasInfoHash(searchee: Searchee): searchee is SearcheeWithInfoHash;
49
+ export declare enum SearcheeSource {
50
+ CLIENT = "torrentClient",
51
+ TORRENT = "torrentFile",
52
+ DATA = "dataDir",
53
+ VIRTUAL = "virtual"
54
+ }
55
+ export declare function getSearcheeSource(searchee: Searchee): SearcheeSource;
56
+ export declare function getMediaType({ title, files }: Searchee): MediaType;
57
+ export declare function getFuzzySizeFactor(searchee: Searchee): number;
58
+ export declare function getMinSizeRatio(searchee: Searchee): number;
59
+ export declare function getRoot({ path }: File, options?: {
60
+ dirname: (path: string) => string;
61
+ isAbsolute: (path: string) => boolean;
62
+ }): Result<string, Error>;
63
+ export declare function getRootFolder(file: File): Result<string | null, Error>;
64
+ export declare function getLargestFile(files: File[]): File;
65
+ export declare function getNewestFileAge(absoluteFilePaths: string[]): Promise<number>;
66
+ export declare function getSearcheeNewestFileAge(searchee: SearcheeWithoutInfoHash): Promise<number>;
67
+ export declare function getFilesFromDataRoot(rootPath: string, memoizedPaths: Map<string, string[]>, memoizedLengths: Map<string, number>): Promise<File[]>;
68
+ /**
69
+ * Parse title from SXX or Season XX. Return null if no title found.
70
+ * Also tries to parse titles that are just `Show`, returns `Show` if better not found.
71
+ * @param name Original name of the searchee/metafile
72
+ * @param files files in the searchee
73
+ * @param path if data based, the path to the searchee
74
+ */
75
+ export declare function parseTitle(name: string, files: File[], path?: string): string | null;
76
+ export declare function updateSearcheeClientDB(clientHost: string, newSearchees: SearcheeClient[], infoHashes: Set<string>): Promise<void>;
77
+ export declare function createSearcheeFromDB(dbTorrent: any): SearcheeClient;
78
+ export declare function createSearcheeFromMetafile(meta: Metafile): Result<SearcheeWithInfoHash, Error>;
79
+ export declare function createSearcheeFromTorrentFile(filePath: string, torrentInfos: TorrentMetadataInClient[]): Promise<Result<SearcheeWithInfoHash, Error>>;
80
+ export declare function createSearcheeFromPath(root: string, memoizedPaths?: Map<string, string[]>, memoizedLengths?: Map<string, number>): Promise<Result<SearcheeWithoutInfoHash, Error>>;
81
+ export declare function getAllTitles(titles: string[]): string[];
82
+ export declare function getMovieKeys(stem: string): {
83
+ ensembleTitles: string[];
84
+ keyTitles: string[];
85
+ year: number;
86
+ } | null;
87
+ export declare function getSeasonKeys(stem: string): {
88
+ ensembleTitles: string[];
89
+ keyTitles: string[];
90
+ season: string;
91
+ } | null;
92
+ export declare function getEpisodeKeys(stem: string): {
93
+ ensembleTitles: string[];
94
+ keyTitles: string[];
95
+ season: string | undefined;
96
+ episode: number | string;
97
+ } | null;
98
+ export declare function getAnimeKeys(stem: string): {
99
+ ensembleTitles: string[];
100
+ keyTitles: string[];
101
+ release: number;
102
+ } | null;
103
+ export declare function getReleaseGroup(stem: string): string | null;
104
+ export declare function getKeyMetaInfo(stem: string): string;
105
+ export declare function createEnsembleSearchees(allSearchees: SearcheeWithLabel[], options: {
106
+ useFilters: boolean;
107
+ }): Promise<SearcheeWithLabel[]>;
108
+ export declare function collectSearcheeProblems(): Promise<Problem[]>;