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,9 @@
1
+ import Knex from "knex";
2
+ declare function up(knex: Knex.Knex): Promise<void>;
3
+ declare function down(knex: Knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,15 @@
1
+ async function up(knex) {
2
+ await knex.schema.createTable("rss", (table) => {
3
+ table
4
+ .integer("indexer_id")
5
+ .references("id")
6
+ .inTable("indexer")
7
+ .primary();
8
+ table.string("last_seen_guid");
9
+ });
10
+ }
11
+ async function down(knex) {
12
+ return knex.schema.dropTable("rss");
13
+ }
14
+ export default { name: "08-rss", up, down };
15
+ //# sourceMappingURL=08-rss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"08-rss.js","sourceRoot":"","sources":["../../src/migrations/08-rss.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QAC9C,KAAK;aACH,OAAO,CAAC,YAAY,CAAC;aACrB,UAAU,CAAC,IAAI,CAAC;aAChB,OAAO,CAAC,SAAS,CAAC;aAClB,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import Knex from "knex";
2
+ declare function up(knex: Knex.Knex): Promise<void>;
3
+ declare function down(knex: Knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,34 @@
1
+ async function up(knex) {
2
+ await knex.schema.createTable("client_searchee", (table) => {
3
+ table.string("client_host");
4
+ table.string("info_hash").index();
5
+ table.primary(["client_host", "info_hash"]);
6
+ table.string("name");
7
+ table.string("title");
8
+ table.json("files");
9
+ table.integer("length");
10
+ table.string("save_path");
11
+ table.string("category");
12
+ table.json("tags");
13
+ table.json("trackers");
14
+ });
15
+ await knex.schema.createTable("data", (table) => {
16
+ table.string("path").primary();
17
+ table.string("title");
18
+ });
19
+ await knex.schema.createTable("ensemble", (table) => {
20
+ table.string("client_host");
21
+ table.string("path").index();
22
+ table.primary(["client_host", "path"]);
23
+ table.string("info_hash").index();
24
+ table.string("ensemble");
25
+ table.string("element");
26
+ });
27
+ }
28
+ async function down(knex) {
29
+ void knex.schema.dropTable("client_searchee");
30
+ void knex.schema.dropTable("data");
31
+ void knex.schema.dropTable("ensemble");
32
+ }
33
+ export default { name: "09-clientAndDataSearchees", up, down };
34
+ //# sourceMappingURL=09-clientAndDataSearchees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"09-clientAndDataSearchees.js","sourceRoot":"","sources":["../../src/migrations/09-clientAndDataSearchees.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1D,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1B,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/C,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/B,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QACnD,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import Knex from "knex";
2
+ declare function up(knex: Knex.Knex): Promise<void>;
3
+ declare function down(knex: Knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,18 @@
1
+ async function up(knex) {
2
+ await knex.schema.alterTable("indexer", (table) => {
3
+ table.string("name").after("id");
4
+ table.boolean("music_search_cap").nullable().after("movie_search_cap");
5
+ table.boolean("audio_search_cap").nullable().after("music_search_cap");
6
+ table.boolean("book_search_cap").nullable().after("audio_search_cap");
7
+ });
8
+ }
9
+ async function down(knex) {
10
+ return knex.schema.table("indexer", function (table) {
11
+ table.dropColumn("name");
12
+ table.dropColumn("music_search_cap");
13
+ table.dropColumn("audio_search_cap");
14
+ table.dropColumn("book_search_cap");
15
+ });
16
+ }
17
+ export default { name: "10-indexerNameAudioBookCaps", up, down };
18
+ //# sourceMappingURL=10-indexerNameAudioBookCaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"10-indexerNameAudioBookCaps.js","sourceRoot":"","sources":["../../src/migrations/10-indexerNameAudioBookCaps.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACvE,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACvE,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,KAAK;QAClD,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACzB,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACrC,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACrC,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import Knex from "knex";
2
+ declare function up(knex: Knex.Knex): Promise<void>;
3
+ declare function down(knex: Knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,38 @@
1
+ import { basename, join } from "path";
2
+ import { existsSync } from "fs";
3
+ import { rename } from "fs/promises";
4
+ import { appDir } from "../configuration.js";
5
+ import { TORRENT_CACHE_FOLDER } from "../constants.js";
6
+ import { getCachedTorrentName } from "../decide.js";
7
+ import { findAllTorrentFilesInDir, parseMetadataFromFilename, } from "../torrent.js";
8
+ async function up(knex) {
9
+ const torrentCacheDir = join(appDir(), TORRENT_CACHE_FOLDER);
10
+ if (existsSync(torrentCacheDir)) {
11
+ const torrentPaths = await findAllTorrentFilesInDir(torrentCacheDir);
12
+ for (const torrentPath of torrentPaths) {
13
+ const { infoHash } = parseMetadataFromFilename(basename(torrentPath));
14
+ if (!infoHash)
15
+ continue;
16
+ await rename(torrentPath, join(torrentCacheDir, getCachedTorrentName(infoHash)));
17
+ }
18
+ }
19
+ await knex.schema.alterTable("indexer", (table) => {
20
+ table.json("trackers").after("apikey");
21
+ });
22
+ await knex.schema.alterTable("decision", (table) => {
23
+ table.index(["info_hash", "guid"], "idx_decision_info_hash_guid");
24
+ table.index("info_hash", "idx_decision_info_hash");
25
+ table.index("guid", "idx_decision_guid");
26
+ });
27
+ }
28
+ async function down(knex) {
29
+ await knex.schema.alterTable("indexer", function (table) {
30
+ table.dropColumn("trackers");
31
+ });
32
+ await knex.schema.alterTable("decision", (table) => {
33
+ table.dropIndex("guid", "idx_decision_guid");
34
+ table.dropIndex(["info_hash", "guid"], "idx_decision_info_hash_guid");
35
+ });
36
+ }
37
+ export default { name: "11-trackers", up, down };
38
+ //# sourceMappingURL=11-trackers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"11-trackers.js","sourceRoot":"","sources":["../../src/migrations/11-trackers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EACN,wBAAwB,EACxB,yBAAyB,GACzB,MAAM,eAAe,CAAC;AAEvB,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,eAAe,CAAC,CAAC;QACrE,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,yBAAyB,CAC7C,QAAQ,CAAC,WAAW,CAAC,CACrB,CAAC;YACF,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,MAAM,CACX,WAAW,EACX,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CACrD,CAAC;QACH,CAAC;IACF,CAAC;IAED,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAClE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QACnD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,KAAK;QACtD,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC7C,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,6BAA6B,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import Knex from "knex";
2
+ declare function up(knex: Knex.Knex): Promise<void>;
3
+ declare function down(knex: Knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,22 @@
1
+ async function up(knex) {
2
+ // Create user table (singular naming)
3
+ await knex.schema.createTable("user", (table) => {
4
+ table.increments("id").primary();
5
+ table.string("username").unique().notNullable();
6
+ table.string("password").notNullable();
7
+ table.timestamp("created_at").defaultTo(knex.fn.now()).notNullable();
8
+ });
9
+ // Create session table (singular naming)
10
+ await knex.schema.createTable("session", (table) => {
11
+ table.string("id").primary();
12
+ table.integer("user_id").notNullable().references("id").inTable("user");
13
+ table.integer("expires_at").notNullable();
14
+ table.integer("created_at").notNullable();
15
+ });
16
+ }
17
+ async function down(knex) {
18
+ await knex.schema.dropTable("session");
19
+ await knex.schema.dropTable("user");
20
+ }
21
+ export default { name: "12-user-auth", up, down };
22
+ //# sourceMappingURL=12-user-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"12-user-auth.js","sourceRoot":"","sources":["../../src/migrations/12-user-auth.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,sCAAsC;IACtC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/C,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1C,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import Knex from "knex";
2
+ declare function up(knex: Knex.Knex): Promise<void>;
3
+ declare function down(knex: Knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,23 @@
1
+ async function up(knex) {
2
+ await knex.schema.alterTable("settings", (table) => {
3
+ table.json("settings_json");
4
+ });
5
+ // Add performance indices for stats queries
6
+ await knex.schema.alterTable("decision", (table) => {
7
+ table.index("decision", "idx_decision_decision");
8
+ table.index("last_seen", "idx_decision_last_seen");
9
+ table.index(["decision", "last_seen"], "idx_decision_decision_last_seen");
10
+ });
11
+ }
12
+ async function down(knex) {
13
+ await knex.schema.alterTable("decision", (table) => {
14
+ table.dropIndex(["decision", "last_seen"], "idx_decision_decision_last_seen");
15
+ table.dropIndex("last_seen", "idx_decision_last_seen");
16
+ table.dropIndex("decision", "idx_decision_decision");
17
+ });
18
+ await knex.schema.alterTable("settings", (table) => {
19
+ table.dropColumn("settings_json");
20
+ });
21
+ }
22
+ export default { name: "13-settings", up, down };
23
+ //# sourceMappingURL=13-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"13-settings.js","sourceRoot":"","sources":["../../src/migrations/13-settings.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;QACjD,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QACnD,KAAK,CAAC,KAAK,CACV,CAAC,UAAU,EAAE,WAAW,CAAC,EACzB,iCAAiC,CACjC,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,SAAS,CACd,CAAC,UAAU,EAAE,WAAW,CAAC,EACzB,iCAAiC,CACjC,CAAC;QACF,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QACvD,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import knex from "knex";
2
+ export declare function up(knex: knex.Knex): Promise<void>;
3
+ export declare function down(knex: knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,12 @@
1
+ export async function up(knex) {
2
+ await knex.schema.alterTable("indexer", (table) => {
3
+ table.boolean("enabled").notNullable().defaultTo(true);
4
+ });
5
+ }
6
+ export async function down(knex) {
7
+ await knex.schema.alterTable("indexer", (table) => {
8
+ table.dropColumn("enabled");
9
+ });
10
+ }
11
+ export default { name: "14-indexer-enabled-flag", up, down };
12
+ //# sourceMappingURL=14-indexer-enabled-flag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"14-indexer-enabled-flag.js","sourceRoot":"","sources":["../../src/migrations/14-indexer-enabled-flag.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAe;IACvC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAe;IACzC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import Knex from "knex";
2
+ declare function up(knex: Knex.Knex): Promise<void>;
3
+ declare function down(knex: Knex.Knex): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,14 @@
1
+ async function up(knex) {
2
+ // Drop the unique constraint on the url column
3
+ await knex.schema.alterTable("indexer", (table) => {
4
+ table.dropUnique(["url"]);
5
+ });
6
+ }
7
+ async function down(knex) {
8
+ // Re-add the unique constraint on the url column
9
+ await knex.schema.alterTable("indexer", (table) => {
10
+ table.unique(["url"]);
11
+ });
12
+ }
13
+ export default { name: "15-remove-url-unique-constraint", up, down };
14
+ //# sourceMappingURL=15-remove-url-unique-constraint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"15-remove-url-unique-constraint.js","sourceRoot":"","sources":["../../src/migrations/15-remove-url-unique-constraint.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,+CAA+C;IAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,iDAAiD;IACjD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,iCAAiC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import knex from "knex";
2
+ export declare function up(knex: knex.Knex): Promise<void>;
3
+ export declare function down(): Promise<void>;
4
+ declare const _default: {
5
+ name: string;
6
+ up: typeof up;
7
+ down: typeof down;
8
+ };
9
+ export default _default;
@@ -0,0 +1,17 @@
1
+ export async function up(knex) {
2
+ await knex.transaction(async (trx) => {
3
+ const inactiveIds = await trx("indexer")
4
+ .whereRaw("active = 0")
5
+ .select("id");
6
+ if (inactiveIds.length) {
7
+ const ids = inactiveIds.map((row) => row.id);
8
+ await trx("timestamp").whereIn("indexer_id", ids).del();
9
+ await trx("rss").whereIn("indexer_id", ids).del();
10
+ await trx("indexer").whereIn("id", ids).del();
11
+ }
12
+ await trx.raw("UPDATE indexer SET active = NULL");
13
+ });
14
+ }
15
+ export async function down() { }
16
+ export default { name: "16-prune-inactive-indexers", up, down };
17
+ //# sourceMappingURL=16-prune-inactive-indexers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"16-prune-inactive-indexers.js","sourceRoot":"","sources":["../../src/migrations/16-prune-inactive-indexers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAe;IACvC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC;aACtC,QAAQ,CAAC,YAAY,CAAC;aACtB,MAAM,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACxD,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClD,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,GAAG,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,KAAmB,CAAC;AAE9C,eAAe,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const migrations: {
2
+ getMigrations: () => Promise<({
3
+ name: string;
4
+ up: (knex: import("knex").Knex) => Promise<void>;
5
+ down: (knex: import("knex").Knex) => Promise<void>;
6
+ } | {
7
+ name: string;
8
+ up: (knex: import("knex").Knex) => Promise<void>;
9
+ down: () => void;
10
+ })[]>;
11
+ getMigrationName: (migration: any) => any;
12
+ getMigration: (migration: any) => any;
13
+ };
@@ -0,0 +1,41 @@
1
+ import initialSchema from "./00-initialSchema.js";
2
+ import jobs from "./01-jobs.js";
3
+ import timestamps from "./02-timestamps.js";
4
+ import rateLimits from "./03-rateLimits.js";
5
+ import auth from "./04-auth.js";
6
+ import caps from "./05-caps.js";
7
+ import uniqueDecisions from "./06-uniqueDecisions.js";
8
+ import limits from "./07-limits.js";
9
+ import rss from "./08-rss.js";
10
+ import clientAndDataSearchees from "./09-clientAndDataSearchees.js";
11
+ import indexerNameAudioBookCaps from "./10-indexerNameAudioBookCaps.js";
12
+ import trackers from "./11-trackers.js";
13
+ import userAuth from "./12-user-auth.js";
14
+ import settings from "./13-settings.js";
15
+ import indexerEnabledFlag from "./14-indexer-enabled-flag.js";
16
+ import removeUrlUniqueConstraint from "./15-remove-url-unique-constraint.js";
17
+ import pruneInactiveIndexers from "./16-prune-inactive-indexers.js";
18
+ export const migrations = {
19
+ getMigrations: () => Promise.resolve([
20
+ initialSchema,
21
+ jobs,
22
+ timestamps,
23
+ rateLimits,
24
+ auth,
25
+ caps,
26
+ uniqueDecisions,
27
+ limits,
28
+ rss,
29
+ clientAndDataSearchees,
30
+ indexerNameAudioBookCaps,
31
+ trackers,
32
+ userAuth,
33
+ settings,
34
+ indexerEnabledFlag,
35
+ removeUrlUniqueConstraint,
36
+ pruneInactiveIndexers,
37
+ ]),
38
+ getMigrationName: (migration) => migration.name,
39
+ getMigration: (migration) => migration,
40
+ };
41
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,IAAI,MAAM,cAAc,CAAC;AAChC,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAC5C,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAC5C,OAAO,IAAI,MAAM,cAAc,CAAC;AAChC,OAAO,IAAI,MAAM,cAAc,CAAC;AAChC,OAAO,eAAe,MAAM,yBAAyB,CAAC;AACtD,OAAO,MAAM,MAAM,gBAAgB,CAAC;AACpC,OAAO,GAAG,MAAM,aAAa,CAAC;AAC9B,OAAO,sBAAsB,MAAM,gCAAgC,CAAC;AACpE,OAAO,wBAAwB,MAAM,kCAAkC,CAAC;AACxE,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AACxC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AACxC,OAAO,kBAAkB,MAAM,8BAA8B,CAAC;AAC9D,OAAO,yBAAyB,MAAM,sCAAsC,CAAC;AAC7E,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AAEpE,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,aAAa,EAAE,GAAG,EAAE,CACnB,OAAO,CAAC,OAAO,CAAC;QACf,aAAa;QACb,IAAI;QACJ,UAAU;QACV,UAAU;QACV,IAAI;QACJ,IAAI;QACJ,eAAe;QACf,MAAM;QACN,GAAG;QACH,sBAAsB;QACtB,wBAAwB;QACxB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,kBAAkB;QAClB,yBAAyB;QACzB,qBAAqB;KACrB,CAAC;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI;IAC/C,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS;CACtC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { File } from "./searchee.js";
2
+ interface TorrentDirent {
3
+ length: number;
4
+ path?: Buffer[];
5
+ "path.utf-8"?: Buffer[];
6
+ }
7
+ export interface Torrent {
8
+ info: {
9
+ "name.utf-8"?: Buffer;
10
+ name?: Buffer;
11
+ "piece length": number;
12
+ pieces: Buffer;
13
+ files?: TorrentDirent[];
14
+ length?: number;
15
+ private: number;
16
+ };
17
+ comment?: Buffer | string;
18
+ announce?: Buffer;
19
+ "announce-list"?: Buffer[][];
20
+ }
21
+ /**
22
+ * "Fastresume" for all clients. Used to get torrent info.
23
+ * qBittorrent: .fastresume, Transmission: .resume, rTorrent: .rtorrent
24
+ * Deluge doesn't store labels in fastresume, but in label.conf
25
+ */
26
+ interface TorrentMetadata {
27
+ trackers?: Buffer[][];
28
+ "qBt-category"?: Buffer;
29
+ "qBt-tags"?: Buffer;
30
+ }
31
+ export declare function updateMetafileMetadata(metafile: Metafile, metadata: TorrentMetadata): void;
32
+ export declare function sanitizeTrackerUrl(url: string): string | null;
33
+ export declare class Metafile {
34
+ infoHash: string;
35
+ length: number;
36
+ name: string;
37
+ /**
38
+ * Always name, exists for compatibility with Searchee
39
+ */
40
+ title: string;
41
+ pieceLength: number;
42
+ files: File[];
43
+ isSingleFileTorrent: boolean;
44
+ category?: string;
45
+ tags?: string[];
46
+ trackers: string[];
47
+ raw: Torrent;
48
+ constructor(raw: Torrent);
49
+ static decode(buf: Buffer): Metafile;
50
+ getFileSystemSafeName(): string;
51
+ encode(): Buffer;
52
+ }
53
+ export {};
@@ -0,0 +1,128 @@
1
+ import bencode from "bencode";
2
+ import { createHash } from "crypto";
3
+ import { join } from "path";
4
+ import { parseTitle } from "./searchee.js";
5
+ import { fallback, isTruthy } from "./utils.js";
6
+ export function updateMetafileMetadata(metafile, metadata) {
7
+ if (metadata["qBt-category"]) {
8
+ metafile.category = metadata["qBt-category"].toString();
9
+ }
10
+ if (metadata["qBt-tags"]) {
11
+ metafile.tags = metadata["qBt-tags"].toString().split(",");
12
+ }
13
+ if (metadata.trackers) {
14
+ metafile.trackers = metadata.trackers
15
+ .map((tier) => sanitizeTrackerUrls(tier))
16
+ .flat();
17
+ }
18
+ }
19
+ export function sanitizeTrackerUrl(url) {
20
+ try {
21
+ return new URL(url).host;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function sanitizeTrackerUrls(urls) {
28
+ return urls
29
+ .map((url) => sanitizeTrackerUrl(url.toString()))
30
+ .filter(isTruthy);
31
+ }
32
+ function sumLength(sum, file) {
33
+ return sum + file.length;
34
+ }
35
+ function ensure(bool, fieldName) {
36
+ if (!bool)
37
+ throw new Error(`Torrent is missing required field: ${fieldName}`);
38
+ }
39
+ function sha1(buf) {
40
+ const hash = createHash("sha1");
41
+ hash.update(new Uint8Array(buf));
42
+ return hash.digest("hex");
43
+ }
44
+ export class Metafile {
45
+ infoHash;
46
+ length;
47
+ name;
48
+ /**
49
+ * Always name, exists for compatibility with Searchee
50
+ */
51
+ title;
52
+ pieceLength;
53
+ files;
54
+ isSingleFileTorrent;
55
+ category;
56
+ tags;
57
+ trackers;
58
+ raw;
59
+ constructor(raw) {
60
+ ensure(raw.info, "info");
61
+ ensure(raw.info["name.utf-8"] || raw.info.name, "info.name");
62
+ ensure(raw.info["piece length"], "info['piece length']");
63
+ ensure(raw.info.pieces, "info.pieces");
64
+ if (raw.info.files) {
65
+ raw.info.files.forEach((file) => {
66
+ ensure(typeof file.length === "number", "info.files[0].length");
67
+ ensure(file["path.utf-8"] || file.path, "info.files[0].path");
68
+ });
69
+ }
70
+ else {
71
+ ensure(typeof raw.info.length === "number", "info.length");
72
+ }
73
+ this.raw = raw;
74
+ this.infoHash = sha1(bencode.encode(raw.info));
75
+ this.name = fallback(raw.info["name.utf-8"], raw.info.name).toString();
76
+ this.pieceLength = raw.info["piece length"];
77
+ if (!raw.info.files) {
78
+ // length exists if files doesn't exist
79
+ const length = raw.info.length;
80
+ this.files = [
81
+ {
82
+ name: this.name,
83
+ path: this.name,
84
+ length: length,
85
+ },
86
+ ];
87
+ this.length = length;
88
+ this.isSingleFileTorrent = true;
89
+ }
90
+ else {
91
+ this.files = raw.info.files
92
+ .map((file) => {
93
+ const rawPathSegments = fallback(file["path.utf-8"], file.path);
94
+ const pathSegments = rawPathSegments.map((buf) => {
95
+ const seg = buf.toString();
96
+ // convention for zero-length path segments is to treat them as underscores
97
+ return seg === "" ? "_" : seg;
98
+ });
99
+ return {
100
+ name: pathSegments[pathSegments.length - 1],
101
+ length: file.length,
102
+ path: join(this.name, ...pathSegments),
103
+ };
104
+ })
105
+ .sort((a, b) => a.path.localeCompare(b.path));
106
+ this.length = this.files.reduce(sumLength, 0);
107
+ this.isSingleFileTorrent = false;
108
+ }
109
+ this.title = parseTitle(this.name, this.files) ?? this.name;
110
+ const announceList = raw["announce-list"];
111
+ this.trackers =
112
+ Array.isArray(announceList) && announceList.length > 0
113
+ ? announceList.map((tier) => sanitizeTrackerUrls(tier)).flat()
114
+ : raw.announce
115
+ ? sanitizeTrackerUrls([raw.announce])
116
+ : [];
117
+ }
118
+ static decode(buf) {
119
+ return new Metafile(bencode.decode(buf));
120
+ }
121
+ getFileSystemSafeName() {
122
+ return this.name.replace("/", "");
123
+ }
124
+ encode() {
125
+ return bencode.encode(this.raw);
126
+ }
127
+ }
128
+ //# sourceMappingURL=parseTorrent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTorrent.js","sourceRoot":"","sources":["../src/parseTorrent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { ActionResult, Decision, DecisionAnyMatch } from "./constants.js";
2
+ import { ResultAssessment } from "./decide.js";
3
+ import { RuntimeConfig } from "./runtimeConfig.js";
4
+ import { SearcheeLabel, SearcheeWithLabel } from "./searchee.js";
5
+ import { TorrentLocator } from "./torrent.js";
6
+ import { WithRequired } from "./utils.js";
7
+ export interface Candidate {
8
+ name: string;
9
+ guid: string;
10
+ link: string;
11
+ tracker: string;
12
+ size?: number;
13
+ pubDate?: number;
14
+ indexerId?: number;
15
+ cookie?: string;
16
+ }
17
+ export type CandidateWithIndexerId = WithRequired<Candidate, "indexerId">;
18
+ export interface AssessmentWithTracker {
19
+ assessment: ResultAssessment;
20
+ tracker: string;
21
+ }
22
+ export declare function searchForLocalTorrentByCriteria(criteria: TorrentLocator, options: {
23
+ configOverride: Partial<RuntimeConfig>;
24
+ ignoreCrossSeeds: boolean;
25
+ }): Promise<number | null>;
26
+ export declare function checkNewCandidateMatch(candidate: Candidate, searcheeLabel: SearcheeLabel): Promise<{
27
+ decision: DecisionAnyMatch | Decision.INFO_HASH_ALREADY_EXISTS | null;
28
+ actionResult: ActionResult | null;
29
+ }>;
30
+ export declare function findAllSearchees(searcheeLabel: SearcheeLabel): Promise<SearcheeWithLabel[]>;
31
+ export declare function bulkSearch(options?: {
32
+ configOverride: Partial<RuntimeConfig>;
33
+ }): Promise<void>;
34
+ export declare function bulkSearchByNames(names: string[], options?: {
35
+ configOverride?: Partial<RuntimeConfig>;
36
+ }): Promise<{
37
+ attempted: number;
38
+ totalFound: number;
39
+ requested: number;
40
+ }>;
41
+ export declare function scanRssFeeds(): Promise<void>;