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
package/dist/utils.js ADDED
@@ -0,0 +1,648 @@
1
+ import chalk from "chalk";
2
+ import { distance } from "fastest-levenshtein";
3
+ import { access, constants, readdir, stat, unlink, writeFile, } from "fs/promises";
4
+ import path from "path";
5
+ import { ALL_EXTENSIONS, ALL_PARENTHESES_REGEX, ALL_SPACES_REGEX, ALL_SQUARE_BRACKETS_REGEX, ANIME_REGEX, EP_REGEX, JSON_VALUES_REGEX, LEVENSHTEIN_DIVISOR, MIN_VIDEO_QUERY_LENGTH, MOVIE_REGEX, NON_UNICODE_ALPHANUM_REGEX, RELEASE_GROUP_REGEX, REPACK_PROPER_REGEX, RESOLUTION_REGEX, SCENE_TITLE_REGEX, SEASON_REGEX, sourceRegexRemove, YEARS_REGEX, } from "./constants.js";
6
+ import { logger } from "./logger.js";
7
+ import { resultOf, resultOfErr } from "./Result.js";
8
+ import { getAllTitles } from "./searchee.js";
9
+ export function isTruthy(value) {
10
+ return Boolean(value);
11
+ }
12
+ // ==================================== OS ====================================
13
+ export async function exists(srcPath) {
14
+ try {
15
+ await access(srcPath);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ export async function notExists(srcPath) {
23
+ try {
24
+ await access(srcPath);
25
+ return false;
26
+ }
27
+ catch {
28
+ return true;
29
+ }
30
+ }
31
+ export async function verifyDir(srcDir, testSrcName, permissions) {
32
+ const logMissing = (message) => {
33
+ logger.error(`\tYour ${testSrcName} "${srcDir}" is not a valid directory on the filesystem: ${message}.`);
34
+ if (path.sep === "\\" &&
35
+ !srcDir.includes("\\") &&
36
+ !srcDir.includes("/")) {
37
+ logger.error("\tIt may not be formatted properly for Windows.\n" +
38
+ '\t\t\t\tMake sure to use "\\\\" or "/" for directory separators.');
39
+ }
40
+ };
41
+ const logPermissions = (message) => {
42
+ logger.error(`\tYour ${testSrcName} "${srcDir}" has invalid permissions: ${message}.`);
43
+ };
44
+ if (await notExists(srcDir)) {
45
+ logMissing("does not exist.");
46
+ return { ok: false, reason: "missing" };
47
+ }
48
+ let stats;
49
+ try {
50
+ stats = await stat(srcDir);
51
+ }
52
+ catch (error) {
53
+ const err = error;
54
+ if (err?.code === "ENOENT") {
55
+ logMissing(err.message ?? "does not exist.");
56
+ return { ok: false, reason: "missing", error };
57
+ }
58
+ logPermissions(err?.message ?? "stat failed.");
59
+ return { ok: false, reason: "unreadable", error };
60
+ }
61
+ if (!stats.isDirectory()) {
62
+ logger.error(`\tYour ${testSrcName} "${srcDir}" is not a directory on the filesystem.`);
63
+ return { ok: false, reason: "not-directory" };
64
+ }
65
+ if (permissions & constants.R_OK) {
66
+ try {
67
+ await readdir(srcDir);
68
+ }
69
+ catch (error) {
70
+ logger.debug(error);
71
+ logPermissions("no read permissions.");
72
+ return { ok: false, reason: "unreadable", error };
73
+ }
74
+ }
75
+ if (permissions & constants.W_OK) {
76
+ const tempFile = path.join(srcDir, testSrcName);
77
+ try {
78
+ await writeFile(tempFile, testSrcName);
79
+ if (await notExists(tempFile)) {
80
+ logPermissions("no write permissions - could not verify test file.");
81
+ return { ok: false, reason: "unwritable" };
82
+ }
83
+ await unlink(tempFile);
84
+ }
85
+ catch (error) {
86
+ logger.debug(error);
87
+ logPermissions("no write permissions.");
88
+ return { ok: false, reason: "unwritable", error };
89
+ }
90
+ }
91
+ return { ok: true, stats };
92
+ }
93
+ export function isChildPath(childPath, parentDirs) {
94
+ return parentDirs.some((parentDir) => {
95
+ const resolvedParent = path.resolve(parentDir);
96
+ const resolvedChild = path.resolve(childPath);
97
+ const relativePath = path.relative(resolvedParent, resolvedChild);
98
+ return (relativePath.length > 0 &&
99
+ !relativePath.startsWith("..") &&
100
+ !path.isAbsolute(relativePath));
101
+ });
102
+ }
103
+ export async function countDirEntriesRec(dirs, maxDataDepth) {
104
+ if (maxDataDepth === 0)
105
+ return 0;
106
+ let count = 0;
107
+ for (const dir of dirs) {
108
+ const newDirs = [];
109
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
110
+ count++;
111
+ if (entry.isDirectory())
112
+ newDirs.push(path.join(dir, entry.name));
113
+ }
114
+ count += await countDirEntriesRec(newDirs, maxDataDepth - 1);
115
+ }
116
+ return count;
117
+ }
118
+ // ================================ EXTENSIONS ================================
119
+ export function hasExt(files, exts) {
120
+ return files.some((f) => exts.includes(path.extname(f.name.toLowerCase())));
121
+ }
122
+ export function stripExtension(filename) {
123
+ for (const ext of ALL_EXTENSIONS) {
124
+ if (filename.endsWith(ext))
125
+ return path.basename(filename, ext);
126
+ }
127
+ return filename;
128
+ }
129
+ export function filesWithExt(files, exts) {
130
+ return files.filter((f) => exts.includes(path.extname(f.name.toLowerCase())));
131
+ }
132
+ export async function findAFileWithExt(dir, exts) {
133
+ try {
134
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
135
+ const fullPath = path.join(dir, entry.name);
136
+ if (entry.isFile() && exts.includes(path.extname(fullPath))) {
137
+ return fullPath;
138
+ }
139
+ if (entry.isDirectory()) {
140
+ const file = await findAFileWithExt(fullPath, exts);
141
+ if (file)
142
+ return file;
143
+ }
144
+ }
145
+ }
146
+ catch (e) {
147
+ logger.debug(e);
148
+ }
149
+ return null;
150
+ }
151
+ // =================================== TIME ===================================
152
+ export function nMsAgo(n) {
153
+ return Date.now() - n;
154
+ }
155
+ export function wait(n) {
156
+ return new Promise((resolve) => setTimeout(resolve, n));
157
+ }
158
+ /**
159
+ * Yield control to the event loop allowing all pending tasks to be processed
160
+ * regardless of the current phase.
161
+ * @param n Optional number of milliseconds to wait before yielding.
162
+ */
163
+ export async function yieldToEventLoop(n = 0) {
164
+ await wait(n);
165
+ return new Promise((resolve) => setImmediate(resolve));
166
+ }
167
+ export async function time(cb, times) {
168
+ const before = performance.now();
169
+ try {
170
+ return await cb();
171
+ }
172
+ finally {
173
+ times.push(performance.now() - before);
174
+ }
175
+ }
176
+ // ================================= LOGGING =================================
177
+ export function humanReadableDate(timestamp) {
178
+ return new Date(timestamp).toLocaleString("sv");
179
+ }
180
+ export function getLogString(searchee, color = chalk.reset) {
181
+ if (searchee.title === searchee.name) {
182
+ return searchee.infoHash || searchee.clientHost
183
+ ? `${color(searchee.title)} ${chalk.dim(`[${searchee.infoHash ? sanitizeInfoHash(searchee.infoHash) : ""}${searchee.clientHost ? `@${searchee.clientHost}` : ""}]`)}`
184
+ : searchee.path
185
+ ? color(searchee.path)
186
+ : color(searchee.title);
187
+ }
188
+ return searchee.infoHash || searchee.clientHost
189
+ ? `${color(searchee.title)} ${chalk.dim(`[${searchee.name} [${searchee.infoHash ? sanitizeInfoHash(searchee.infoHash) : ""}${searchee.clientHost ? `@${searchee.clientHost}` : ""}]]`)}`
190
+ : searchee.path
191
+ ? `${color(searchee.title)} ${chalk.dim(`[${searchee.path}]`)}`
192
+ : `${color(searchee.title)} ${chalk.dim(`[${searchee.name}]`)}`;
193
+ }
194
+ export function formatAsList(strings, options) {
195
+ if (options.sort)
196
+ strings.sort((a, b) => a.localeCompare(b));
197
+ return new Intl.ListFormat("en", {
198
+ style: options.style ?? "long",
199
+ type: options.type ?? "conjunction",
200
+ }).format(strings);
201
+ }
202
+ /**
203
+ * This cannot be done at the log level because of too many false positives.
204
+ * The caller will need to extract the infoHash from their specific syntax.
205
+ * @param infoHash The infoHash to sanitize
206
+ */
207
+ export function sanitizeInfoHash(infoHash) {
208
+ return `${infoHash.slice(0, 8)}...`;
209
+ }
210
+ // ================================== TITLES ==================================
211
+ export function areMediaTitlesSimilar(a, b) {
212
+ const matchA = a.match(EP_REGEX) ??
213
+ a.match(SEASON_REGEX) ??
214
+ a.match(MOVIE_REGEX) ??
215
+ a.match(ANIME_REGEX);
216
+ const matchB = b.match(EP_REGEX) ??
217
+ b.match(SEASON_REGEX) ??
218
+ b.match(MOVIE_REGEX) ??
219
+ b.match(ANIME_REGEX);
220
+ const titlesA = getAllTitles(matchA
221
+ ? [matchA.groups?.title, matchA.groups?.altTitle].filter(isTruthy)
222
+ : [a])
223
+ .map((title) => createKeyTitle(stripMetaFromName(title)))
224
+ .filter(isTruthy);
225
+ const titlesB = getAllTitles(matchB
226
+ ? [matchB.groups?.title, matchB.groups?.altTitle].filter(isTruthy)
227
+ : [b])
228
+ .map((title) => createKeyTitle(stripMetaFromName(title)))
229
+ .filter(isTruthy);
230
+ const maxDistanceA = Math.floor(titlesA.reduce((sum, title) => sum + title.length, 0) /
231
+ titlesA.length /
232
+ LEVENSHTEIN_DIVISOR);
233
+ const maxDistanceB = Math.floor(titlesB.reduce((sum, title) => sum + title.length, 0) /
234
+ titlesB.length /
235
+ LEVENSHTEIN_DIVISOR);
236
+ const maxDistance = Math.max(maxDistanceA, maxDistanceB);
237
+ return titlesA.some((titleA) => titlesB.some((titleB) => distance(titleA, titleB) <= maxDistance ||
238
+ titleA.includes(titleB) ||
239
+ titleB.includes(titleA)));
240
+ }
241
+ export function cleanseSeparators(str) {
242
+ return str
243
+ .replace(ALL_SQUARE_BRACKETS_REGEX, "") // bracketed text
244
+ .replace(/[._()[\]]/g, " ") // release delimiters (except '-')
245
+ .replace(ALL_SPACES_REGEX, " ") // normalize spaces
246
+ .replace(/^\s*-+|-+\s*$/g, "") // "trim()" hyphens
247
+ .trim();
248
+ }
249
+ export function cleanTitle(title) {
250
+ return cleanseSeparators(title).match(SCENE_TITLE_REGEX).groups.title;
251
+ }
252
+ export function reformatTitleForSearching(name) {
253
+ const seriesTitle = name.match(EP_REGEX)?.groups?.title ??
254
+ name.match(SEASON_REGEX)?.groups?.title;
255
+ if (seriesTitle) {
256
+ const title = cleanTitle(seriesTitle);
257
+ return title.length > 4
258
+ ? replaceLastOccurrence(title, YEARS_REGEX, "")
259
+ .replace(ALL_SPACES_REGEX, " ")
260
+ .trim()
261
+ : title;
262
+ }
263
+ return cleanTitle(name.match(MOVIE_REGEX)?.[0] ?? name);
264
+ }
265
+ export function createKeyTitle(title) {
266
+ const key = cleanTitle(title)
267
+ .replace(NON_UNICODE_ALPHANUM_REGEX, "")
268
+ .toLowerCase();
269
+ return key.length > 4
270
+ ? replaceLastOccurrence(key, YEARS_REGEX, "")
271
+ : key.length
272
+ ? key
273
+ : null;
274
+ }
275
+ export function isBadTitle(title) {
276
+ return ["season", "ep"].includes(title.toLowerCase());
277
+ }
278
+ /**
279
+ * Generates possible anime search queries from a given name.
280
+ * Only use if getMediaType returns anime as it's conditional on a few factors.
281
+ * @param stem The name without extension to generate queries from.
282
+ * @returns An array of possible search queries.
283
+ */
284
+ export function getAnimeQueries(stem) {
285
+ const animeQueries = [];
286
+ const { title, altTitle, release } = stem.match(ANIME_REGEX)?.groups ?? {};
287
+ if (title) {
288
+ const strippedTitle = cleanTitle(title);
289
+ animeQueries.push(`${strippedTitle.length ? strippedTitle : title} ${release}`);
290
+ }
291
+ if (altTitle) {
292
+ if (isBadTitle(altTitle))
293
+ return animeQueries;
294
+ const strippedAltTitle = cleanTitle(altTitle);
295
+ animeQueries.push(`${strippedAltTitle.length ? strippedAltTitle : altTitle} ${release}`);
296
+ }
297
+ return animeQueries;
298
+ }
299
+ /**
300
+ * Generates possible video search queries from a given name.
301
+ * Only use if getMediaType returns video as it's conditional on a few factors.
302
+ * @param stem The name without extension to generate queries from.
303
+ * @returns An array of possible search queries.
304
+ */
305
+ export function getVideoQueries(stem) {
306
+ // Anime that fails MediaType.ANIME often has `[group] Title (Extra Info)`
307
+ const noParentheses = cleanTitle(stripMetaFromName(stem
308
+ .replace(ALL_PARENTHESES_REGEX, "")
309
+ .replace(ALL_SPACES_REGEX, " ")
310
+ .trim()));
311
+ if (noParentheses.length >= MIN_VIDEO_QUERY_LENGTH)
312
+ return [noParentheses];
313
+ let videoQuery = cleanTitle(stripMetaFromName(stem));
314
+ if (videoQuery.length)
315
+ return [videoQuery];
316
+ videoQuery = stripMetaFromName(stem);
317
+ if (videoQuery.length)
318
+ return [videoQuery];
319
+ return [stem];
320
+ }
321
+ export function stripMetaFromName(name) {
322
+ return sourceRegexRemove(stripExtension(name)
323
+ .match(SCENE_TITLE_REGEX)
324
+ .groups.title.replace(RELEASE_GROUP_REGEX, "")
325
+ .replace(/\s*-\s*$/, "")
326
+ .replace(RESOLUTION_REGEX, "")
327
+ .replace(REPACK_PROPER_REGEX, ""));
328
+ }
329
+ // =================================== URLS ===================================
330
+ export function sanitizeUrl(url) {
331
+ if (typeof url === "string") {
332
+ url = new URL(url);
333
+ }
334
+ return url.origin + url.pathname;
335
+ }
336
+ export function getApikey(url) {
337
+ return new URL(url).searchParams.get("apikey");
338
+ }
339
+ export function extractCredentialsFromUrl(url, basePath) {
340
+ try {
341
+ const { origin, pathname, username, password } = new URL(url);
342
+ return resultOf({
343
+ username: decodeURIComponent(username),
344
+ password: decodeURIComponent(password),
345
+ href: basePath
346
+ ? origin + path.posix.join(pathname, basePath)
347
+ : pathname === "/"
348
+ ? origin
349
+ : origin + pathname,
350
+ });
351
+ }
352
+ catch (e) {
353
+ return resultOfErr("invalid URL");
354
+ }
355
+ }
356
+ // ================================ FUNCTIONAL ================================
357
+ export const tap = (fn) => (value) => {
358
+ fn(value);
359
+ return value;
360
+ };
361
+ export function fallback(...args) {
362
+ for (const arg of args) {
363
+ if (arg !== undefined)
364
+ return arg;
365
+ }
366
+ return undefined;
367
+ }
368
+ export function findFallback(arr, items, cb) {
369
+ for (const item of items) {
370
+ const found = arr.find((e) => cb(e, item));
371
+ if (found)
372
+ return found;
373
+ }
374
+ return undefined;
375
+ }
376
+ export async function inBatches(items, cb, options = { batchSize: 100 }) {
377
+ for (let i = 0; i < items.length; i += options.batchSize) {
378
+ await cb(items.slice(i, i + options.batchSize));
379
+ }
380
+ }
381
+ export async function fromBatches(items, cb, options = { batchSize: 100 }) {
382
+ const results = [];
383
+ for (let i = 0; i < items.length; i += options.batchSize) {
384
+ results.push(...(await cb(items.slice(i, i + options.batchSize))));
385
+ }
386
+ return results;
387
+ }
388
+ /**
389
+ * Makes comparators for `Array.prototype.sort`.
390
+ * Second getter will be used if the first is a tie, etc.
391
+ * Booleans are treated as 0 and 1,
392
+ * Ascending by default, use - or ! for descending.
393
+ * @param getters
394
+ */
395
+ export function comparing(...getters) {
396
+ return function compare(a, b) {
397
+ for (const getter of getters) {
398
+ const x = getter(a);
399
+ const y = getter(b);
400
+ if (x < y) {
401
+ return -1;
402
+ }
403
+ else if (x > y) {
404
+ return 1;
405
+ }
406
+ }
407
+ return 0;
408
+ };
409
+ }
410
+ // ================================== ASYNC ==================================
411
+ export async function filterAsync(arr, predicate) {
412
+ const results = await mapAsync(arr, predicate);
413
+ return arr.filter((_, index) => results[index]);
414
+ }
415
+ /**
416
+ * Filters an array asynchronously in batches, yielding to the event loop
417
+ * between batches to avoid blocking the event loop for too long.
418
+ * @param arr The array to filter.
419
+ * @param predicate The asynchronous predicate function to test each element.
420
+ * @param options.batchSize The size of each batch to process.
421
+ * @returns A promise that resolves to an array of elements that satisfy the predicate.
422
+ */
423
+ export async function filterAsyncYield(arr, predicate, options = { batchSize: 1000 }) {
424
+ const results = await fromBatches(arr, async (batch) => {
425
+ await yieldToEventLoop();
426
+ return Promise.all(batch.map(predicate));
427
+ }, options);
428
+ return arr.filter((_, index) => results[index]);
429
+ }
430
+ export async function mapAsync(arr, cb) {
431
+ return fromBatches(arr, async (batch) => Promise.all(batch.map(cb)), {
432
+ batchSize: 10000,
433
+ });
434
+ }
435
+ export async function flatMapAsync(arr, cb) {
436
+ return (await mapAsync(arr, cb)).flat();
437
+ }
438
+ export async function reduceAsync(arr, cb, initialValue) {
439
+ let accumulator = initialValue;
440
+ for (let index = 0; index < arr.length; index++) {
441
+ accumulator = await cb(accumulator, arr[index], index, arr);
442
+ }
443
+ return accumulator;
444
+ }
445
+ export async function findAsync(it, cb) {
446
+ for (const item of it) {
447
+ if (await cb(item))
448
+ return item;
449
+ }
450
+ return undefined;
451
+ }
452
+ export async function someAsync(it, cb) {
453
+ for (const item of it) {
454
+ if (await cb(item))
455
+ return true;
456
+ }
457
+ return false;
458
+ }
459
+ export async function everyAsync(it, cb) {
460
+ for (const item of it) {
461
+ if (!(await cb(item)))
462
+ return false;
463
+ }
464
+ return true;
465
+ }
466
+ /**
467
+ * Given multiple async iterables, this function will merge/interleave
468
+ * them all into one iterable, yielding on a first-come, first-serve basis.
469
+ * https://stackoverflow.com/questions/50585456/how-can-i-interleave-merge-async-iterables
470
+ */
471
+ export async function* combineAsyncIterables(asyncIterables) {
472
+ const asyncIterators = Array.from(asyncIterables, (o) => o[Symbol.asyncIterator]());
473
+ let unfinishedIterators = asyncIterators.length;
474
+ const alwaysPending = new Promise(() => { });
475
+ const getNext = (asyncIterator, index) => asyncIterator.next().then((result) => ({ index, result }));
476
+ const nextPromises = asyncIterators.map(getNext);
477
+ try {
478
+ while (unfinishedIterators) {
479
+ const { index, result } = await Promise.race(nextPromises);
480
+ if (result.done) {
481
+ nextPromises[index] = alwaysPending;
482
+ unfinishedIterators--;
483
+ }
484
+ else {
485
+ nextPromises[index] = getNext(asyncIterators[index], index);
486
+ yield result.value;
487
+ }
488
+ }
489
+ }
490
+ finally {
491
+ // cancel unfinished iterators if one throws
492
+ for (const [index, iterator] of asyncIterators.entries()) {
493
+ if (nextPromises[index] !== alwaysPending &&
494
+ iterator.return != null) {
495
+ // no await here - see https://github.com/tc39/proposal-async-iteration/issues/126
496
+ void iterator.return();
497
+ }
498
+ }
499
+ }
500
+ return;
501
+ }
502
+ // ================================= STRINGS =================================
503
+ export function capitalizeFirstLetter(string) {
504
+ return string.charAt(0).toUpperCase() + string.slice(1);
505
+ }
506
+ /**
507
+ * Replaces the last occurrence of a GLOBAL regex match in a string
508
+ * @param str The string to replace the last occurrence in
509
+ * @param globalRegExp The regex to match (must be global)
510
+ * @param newStr The string to replace the last occurrence with
511
+ */
512
+ export function replaceLastOccurrence(str, globalRegExp, newStr) {
513
+ const matches = Array.from(str.matchAll(globalRegExp));
514
+ if (matches.length === 0)
515
+ return str;
516
+ const lastMatch = matches[matches.length - 1];
517
+ const lastMatchIndex = lastMatch.index;
518
+ const lastMatchStr = lastMatch[0];
519
+ return (str.slice(0, lastMatchIndex) +
520
+ newStr +
521
+ str.slice(lastMatchIndex + lastMatchStr.length));
522
+ }
523
+ export function escapeUnescapedQuotesInJsonValues(jsonStr) {
524
+ return jsonStr.replace(JSON_VALUES_REGEX, (match, _p1, _offset, _str, groups) => {
525
+ const escapedValue = groups.value.replace(/(?<!\\)"/g, '\\"');
526
+ return match.replace(groups.value, escapedValue);
527
+ });
528
+ }
529
+ export function extractInt(str) {
530
+ return parseInt(str.match(/\d+/)[0]);
531
+ }
532
+ export function getPathParts(pathStr, dirnameFunc = path.dirname) {
533
+ const parts = [];
534
+ let parent = pathStr;
535
+ while (parent !== ".") {
536
+ parts.unshift(path.basename(parent));
537
+ const newParent = dirnameFunc(parent);
538
+ if (newParent === parent) {
539
+ parts.shift();
540
+ break;
541
+ }
542
+ parent = newParent;
543
+ }
544
+ return parts;
545
+ }
546
+ // ================================== MUTEX ==================================
547
+ export var Mutex;
548
+ (function (Mutex) {
549
+ Mutex["INDEX_TORRENTS_AND_DATA_DIRS"] = "INDEX_TORRENTS_AND_DATA_DIRS";
550
+ Mutex["CHECK_JOBS"] = "CHECK_JOBS";
551
+ Mutex["CREATE_ALL_SEARCHEES"] = "CREATE_ALL_SEARCHEES";
552
+ Mutex["GUID_INFO_HASH_MAP"] = "GUID_INFO_HASH_MAP";
553
+ Mutex["CLIENT_INJECTION"] = "CLIENT_INJECTION";
554
+ })(Mutex || (Mutex = {}));
555
+ const mutexes = new Map();
556
+ /**
557
+ * Executes a callback function within a mutex for the given name.
558
+ * @param name The name of the mutex to create/use.
559
+ * @param options.useQueue If false, concurrent calls will share the pending result.
560
+ * @param cb The callback to execute.
561
+ * @returns The result of the callback.
562
+ */
563
+ export async function withMutex(name, options, cb) {
564
+ const existingMutex = mutexes.get(name);
565
+ if (existingMutex) {
566
+ if (options.useQueue) {
567
+ while (mutexes.has(name))
568
+ await mutexes.get(name);
569
+ }
570
+ else {
571
+ return existingMutex;
572
+ }
573
+ }
574
+ const mutex = (async () => {
575
+ try {
576
+ return await cb();
577
+ }
578
+ finally {
579
+ mutexes.delete(name);
580
+ }
581
+ })();
582
+ mutexes.set(name, mutex);
583
+ return mutex;
584
+ }
585
+ /**
586
+ * An async safe semaphore implementation that preserves FIFO order.
587
+ * It uses an id for release to allow multiple releases (e.g try/finally with early releases).
588
+ * @param options.permits The number of concurrent permits.
589
+ * @param options.lifetimeMs Maximum lifetime of an acquire before automatic release.
590
+ */
591
+ export class AsyncSemaphore {
592
+ permits;
593
+ lifetimeMs;
594
+ acquired = new Set();
595
+ timers = new Map();
596
+ waiting = [];
597
+ counter = 0;
598
+ getNextId = () => {
599
+ if (this.counter === Number.MAX_SAFE_INTEGER)
600
+ this.counter = 0;
601
+ return ++this.counter;
602
+ };
603
+ constructor(options) {
604
+ this.permits = Math.floor(options.permits);
605
+ if (this.permits <= 0) {
606
+ throw new Error("Permits count must be positive");
607
+ }
608
+ this.lifetimeMs = options.lifetimeMs;
609
+ if (this.lifetimeMs && this.lifetimeMs <= 0) {
610
+ throw new Error("Lifetime must be positive");
611
+ }
612
+ }
613
+ acquire() {
614
+ return new Promise((resolve) => {
615
+ if (this.permits > 0) {
616
+ this.permits--;
617
+ const id = this.getNextId();
618
+ this.acquired.add(id);
619
+ if (this.lifetimeMs) {
620
+ this.timers.set(id, setTimeout(() => this.release(id), this.lifetimeMs));
621
+ }
622
+ resolve(id);
623
+ }
624
+ else {
625
+ this.waiting.push(resolve);
626
+ }
627
+ });
628
+ }
629
+ release(id) {
630
+ if (!this.acquired.has(id))
631
+ return;
632
+ this.acquired.delete(id);
633
+ clearTimeout(this.timers.get(id));
634
+ this.timers.delete(id);
635
+ if (this.waiting.length > 0) {
636
+ const newId = this.getNextId();
637
+ this.acquired.add(newId);
638
+ if (this.lifetimeMs) {
639
+ this.timers.set(newId, setTimeout(() => this.release(newId), this.lifetimeMs));
640
+ }
641
+ this.waiting.shift()(newId);
642
+ }
643
+ else {
644
+ this.permits++;
645
+ }
646
+ }
647
+ }
648
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}