cross-seed 6.0.0-1 → 6.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 (52) hide show
  1. package/dist/Result.js +17 -11
  2. package/dist/Result.js.map +1 -1
  3. package/dist/action.js +63 -39
  4. package/dist/action.js.map +1 -1
  5. package/dist/arr.js +191 -0
  6. package/dist/arr.js.map +1 -0
  7. package/dist/clients/Deluge.js +110 -59
  8. package/dist/clients/Deluge.js.map +1 -1
  9. package/dist/clients/QBittorrent.js +21 -18
  10. package/dist/clients/QBittorrent.js.map +1 -1
  11. package/dist/clients/RTorrent.js +3 -3
  12. package/dist/clients/RTorrent.js.map +1 -1
  13. package/dist/clients/TorrentClient.js.map +1 -1
  14. package/dist/clients/Transmission.js +3 -3
  15. package/dist/clients/Transmission.js.map +1 -1
  16. package/dist/cmd.js +9 -3
  17. package/dist/cmd.js.map +1 -1
  18. package/dist/config.template.cjs +43 -3
  19. package/dist/config.template.cjs.map +1 -1
  20. package/dist/configSchema.js +43 -27
  21. package/dist/configSchema.js.map +1 -1
  22. package/dist/configuration.js.map +1 -1
  23. package/dist/constants.js +64 -5
  24. package/dist/constants.js.map +1 -1
  25. package/dist/decide.js +128 -90
  26. package/dist/decide.js.map +1 -1
  27. package/dist/errors.js +5 -2
  28. package/dist/errors.js.map +1 -1
  29. package/dist/indexers.js +19 -0
  30. package/dist/indexers.js.map +1 -1
  31. package/dist/logger.js +15 -4
  32. package/dist/logger.js.map +1 -1
  33. package/dist/migrations/05-caps.js +16 -0
  34. package/dist/migrations/05-caps.js.map +1 -0
  35. package/dist/migrations/migrations.js +9 -1
  36. package/dist/migrations/migrations.js.map +1 -1
  37. package/dist/pipeline.js +22 -36
  38. package/dist/pipeline.js.map +1 -1
  39. package/dist/preFilter.js +14 -3
  40. package/dist/preFilter.js.map +1 -1
  41. package/dist/runtimeConfig.js.map +1 -1
  42. package/dist/searchee.js +7 -7
  43. package/dist/searchee.js.map +1 -1
  44. package/dist/startup.js +8 -0
  45. package/dist/startup.js.map +1 -1
  46. package/dist/torrent.js +18 -15
  47. package/dist/torrent.js.map +1 -1
  48. package/dist/torznab.js +189 -86
  49. package/dist/torznab.js.map +1 -1
  50. package/dist/utils.js +77 -20
  51. package/dist/utils.js.map +1 -1
  52. package/package.json +2 -1
package/dist/torznab.js CHANGED
@@ -1,22 +1,14 @@
1
1
  import ms from "ms";
2
2
  import xml2js from "xml2js";
3
- import { EP_REGEX, SEASON_REGEX, USER_AGENT } from "./constants.js";
3
+ import { scanAllArrsForMedia, getRelevantArrIds, formatFoundIds, } from "./arr.js";
4
+ import { EP_REGEX, SEASON_REGEX, UNKNOWN_TRACKER, USER_AGENT, } from "./constants.js";
4
5
  import { db } from "./db.js";
5
6
  import { CrossSeedError } from "./errors.js";
6
- import { getEnabledIndexers, IndexerStatus, updateIndexerStatus, } from "./indexers.js";
7
+ import { getAllIndexers, getEnabledIndexers, IndexerStatus, updateIndexerStatus, } from "./indexers.js";
7
8
  import { Label, logger } from "./logger.js";
8
9
  import { getRuntimeConfig } from "./runtimeConfig.js";
9
- import { hasVideo } from "./searchee.js";
10
- import { getAnimeQueries, cleanseSeparators, getTag, MediaType, nMsAgo, reformatTitleForSearching, stripExtension, } from "./utils.js";
11
- function sanitizeUrl(url) {
12
- if (typeof url === "string") {
13
- url = new URL(url);
14
- }
15
- return url.origin + url.pathname;
16
- }
17
- function getApikey(url) {
18
- return new URL(url).searchParams.get("apikey");
19
- }
10
+ import { cleanseSeparators, formatAsList, getAnimeQueries, getApikey, getLogString, getMediaType, isTruthy, MediaType, nMsAgo, reformatTitleForSearching, sanitizeUrl, stripExtension, } from "./utils.js";
11
+ import chalk from "chalk";
20
12
  function parseTorznabResults(xml) {
21
13
  const items = xml?.rss?.channel?.[0]?.item;
22
14
  if (!items || !Array.isArray(items)) {
@@ -28,54 +20,108 @@ function parseTorznabResults(xml) {
28
20
  tracker: item?.prowlarrindexer?.[0]?._ ??
29
21
  item?.jackettindexer?.[0]?._ ??
30
22
  item?.indexer?.[0]?._ ??
31
- "Unknown tracker",
23
+ UNKNOWN_TRACKER,
32
24
  link: item.link[0],
33
25
  size: Number(item.size[0]),
34
26
  pubDate: new Date(item.pubDate[0]).getTime(),
35
27
  }));
36
28
  }
37
29
  function parseTorznabCaps(xml) {
38
- const capsSection = xml?.caps?.searching?.[0];
30
+ const searchingSection = xml?.caps?.searching?.[0];
39
31
  const isAvailable = (searchTechnique) => searchTechnique?.[0]?.$?.available === "yes";
32
+ function getSupportedIds(searchTechnique) {
33
+ const supportedParamsStr = searchTechnique?.[0]?.$?.supportedParams;
34
+ const supportedIds = supportedParamsStr
35
+ ?.split(",")
36
+ ?.filter((token) => token.includes("id")) ?? [];
37
+ return {
38
+ tvdbId: supportedIds.includes("tvdbid"),
39
+ tmdbId: supportedIds.includes("tmdbid"),
40
+ imdbId: supportedIds.includes("imdbid"),
41
+ };
42
+ }
43
+ const categoryCaps = xml?.caps?.categories?.[0]?.category;
44
+ function getCatCaps(item) {
45
+ const categoryNames = (item ?? []).map((category) => category.$.name);
46
+ function indexerDoesSupportCat(category) {
47
+ return categoryNames.some((cat) => cat.toLowerCase().includes(category));
48
+ }
49
+ return {
50
+ movie: indexerDoesSupportCat("movie"),
51
+ tv: indexerDoesSupportCat("tv"),
52
+ anime: indexerDoesSupportCat("anime"),
53
+ audio: indexerDoesSupportCat("audio"),
54
+ book: indexerDoesSupportCat("book"),
55
+ };
56
+ }
40
57
  return {
41
- search: Boolean(isAvailable(capsSection?.search)),
42
- tvSearch: Boolean(isAvailable(capsSection?.["tv-search"])),
43
- movieSearch: Boolean(isAvailable(capsSection?.["movie-search"])),
58
+ search: Boolean(isAvailable(searchingSection?.search)),
59
+ tvSearch: Boolean(isAvailable(searchingSection?.["tv-search"])),
60
+ movieSearch: Boolean(isAvailable(searchingSection?.["movie-search"])),
61
+ movieIdSearch: getSupportedIds(searchingSection?.["movie-search"]),
62
+ tvIdSearch: getSupportedIds(searchingSection?.["tv-search"]),
63
+ categories: getCatCaps(categoryCaps),
44
64
  };
45
65
  }
46
- function createTorznabSearchQueries(searchee, caps) {
47
- const nameWithoutExtension = stripExtension(searchee.name);
48
- const isVideo = hasVideo(searchee);
66
+ async function createTorznabSearchQueries(searchee, mediaType, caps, parsedMedia) {
67
+ const stem = stripExtension(searchee.name);
49
68
  const extractNumber = (str) => parseInt(str.match(/\d+/)[0]);
50
- const mediaType = getTag(nameWithoutExtension, isVideo);
69
+ let relevantIds = {};
70
+ if (parsedMedia) {
71
+ relevantIds = await getRelevantArrIds(caps, parsedMedia);
72
+ }
73
+ const useIds = Object.values(relevantIds).some(isTruthy);
51
74
  if (mediaType === MediaType.EPISODE && caps.tvSearch) {
52
- const match = nameWithoutExtension.match(EP_REGEX);
75
+ const match = stem.match(EP_REGEX);
76
+ const groups = match.groups;
53
77
  return [
54
78
  {
55
79
  t: "tvsearch",
56
- q: cleanseSeparators(match.groups.title),
57
- season: match.groups.season
58
- ? extractNumber(match.groups.season)
59
- : match.groups.year,
60
- ep: match.groups.episode
61
- ? extractNumber(match.groups.episode)
62
- : `${match.groups.month}/${match.groups.day}`,
80
+ q: useIds ? undefined : cleanseSeparators(groups.title),
81
+ season: groups.season
82
+ ? extractNumber(groups.season)
83
+ : groups.year,
84
+ ep: groups.episode
85
+ ? extractNumber(groups.episode)
86
+ : `${groups.month}/${groups.day}`,
87
+ ...relevantIds,
63
88
  },
64
89
  ];
65
90
  }
66
91
  else if (mediaType === MediaType.SEASON && caps.tvSearch) {
67
- const match = nameWithoutExtension.match(SEASON_REGEX);
92
+ const match = stem.match(SEASON_REGEX);
93
+ const groups = match.groups;
68
94
  return [
69
95
  {
70
96
  t: "tvsearch",
71
- q: cleanseSeparators(match.groups.title),
72
- season: extractNumber(match.groups.season),
97
+ q: useIds ? undefined : cleanseSeparators(groups.title),
98
+ season: extractNumber(groups.season),
99
+ ...relevantIds,
73
100
  },
74
101
  ];
75
102
  }
103
+ else if (mediaType === MediaType.MOVIE && caps.movieSearch) {
104
+ return [
105
+ {
106
+ t: "movie",
107
+ q: useIds ? undefined : reformatTitleForSearching(stem),
108
+ ...relevantIds,
109
+ },
110
+ ];
111
+ }
112
+ if (useIds && caps.tvSearch && parsedMedia?.series) {
113
+ const eps = parsedMedia.episodes;
114
+ const season = eps.length > 0 ? eps[0].seasonNumber : undefined;
115
+ const ep = eps.length === 1 ? eps[0].episodeNumber : undefined;
116
+ return [
117
+ { t: "tvsearch", q: undefined, season, ep, ...relevantIds },
118
+ ];
119
+ }
120
+ else if (useIds && caps.movieSearch && parsedMedia?.movie) {
121
+ return [{ t: "movie", q: undefined, ...relevantIds }];
122
+ }
76
123
  else if (mediaType === MediaType.ANIME) {
77
- const animeQueries = getAnimeQueries(nameWithoutExtension);
78
- return animeQueries.map((animeQuery) => ({
124
+ return getAnimeQueries(stem).map((animeQuery) => ({
79
125
  t: "search",
80
126
  q: animeQuery,
81
127
  }));
@@ -84,52 +130,50 @@ function createTorznabSearchQueries(searchee, caps) {
84
130
  return [
85
131
  {
86
132
  t: "search",
87
- q: reformatTitleForSearching(nameWithoutExtension),
133
+ q: reformatTitleForSearching(stem),
88
134
  },
89
135
  ];
90
136
  }
91
137
  }
138
+ export function indexerDoesSupportMediaType(mediaType, caps) {
139
+ switch (mediaType) {
140
+ case MediaType.EPISODE:
141
+ case MediaType.SEASON:
142
+ return caps.tv;
143
+ case MediaType.MOVIE: // Should get most anime movies
144
+ return caps.movie;
145
+ case MediaType.ANIME: // All? indexers support anime (sometimes no cat)
146
+ return caps.anime || caps.tv || caps.movie;
147
+ case MediaType.AUDIO:
148
+ return caps.audio;
149
+ case MediaType.BOOK:
150
+ return caps.book;
151
+ case MediaType.OTHER:
152
+ return true;
153
+ }
154
+ }
92
155
  export async function queryRssFeeds() {
93
- const candidatesByUrl = await makeRequests(await getEnabledIndexers(), () => [{ t: "search", q: "" }]);
156
+ const candidatesByUrl = await makeRequests(await getEnabledIndexers(), async () => [{ t: "search", q: "" }]);
94
157
  return candidatesByUrl.flatMap((e) => e.candidates);
95
158
  }
96
- export async function searchTorznab(searchee) {
97
- const { excludeRecentSearch, excludeOlder, torznab } = getRuntimeConfig();
159
+ export async function searchTorznab(searchee, progress) {
160
+ const { torznab } = getRuntimeConfig();
98
161
  if (torznab.length === 0) {
99
162
  throw new Error("no indexers are available");
100
163
  }
101
- const enabledIndexers = await getEnabledIndexers();
102
- const name = searchee.name;
103
- // search history for name across all indexers
104
- const timestampDataSql = await db("searchee")
105
- .join("timestamp", "searchee.id", "timestamp.searchee_id")
106
- .join("indexer", "timestamp.indexer_id", "indexer.id")
107
- .whereIn("indexer.id", enabledIndexers.map((i) => i.id))
108
- .andWhere({ name })
109
- .select({
110
- indexerId: "indexer.id",
111
- firstSearched: "timestamp.first_searched",
112
- lastSearched: "timestamp.last_searched",
113
- });
114
- const indexersToUse = enabledIndexers.filter((indexer) => {
115
- const entry = timestampDataSql.find((entry) => entry.indexerId === indexer.id);
116
- return (!entry ||
117
- ((!excludeOlder || entry.firstSearched > nMsAgo(excludeOlder)) &&
118
- (!excludeRecentSearch ||
119
- entry.lastSearched < nMsAgo(excludeRecentSearch))));
164
+ const mediaType = getMediaType(searchee);
165
+ const { indexersToUse, parsedMedia } = await getAndLogIndexers(searchee, mediaType, progress);
166
+ return await makeRequests(indexersToUse, async (indexer) => {
167
+ const caps = {
168
+ search: indexer.searchCap,
169
+ tvSearch: indexer.tvSearchCap,
170
+ movieSearch: indexer.movieSearchCap,
171
+ tvIdSearch: JSON.parse(indexer.tvIdCaps),
172
+ movieIdSearch: JSON.parse(indexer.movieIdCaps),
173
+ categories: JSON.parse(indexer.categories),
174
+ };
175
+ return await createTorznabSearchQueries(searchee, mediaType, caps, parsedMedia);
120
176
  });
121
- const timestampCallout = " (filtered by timestamps)";
122
- logger.info({
123
- label: Label.TORZNAB,
124
- message: `Searching ${indexersToUse.length} indexers for ${name}${indexersToUse.length < enabledIndexers.length
125
- ? timestampCallout
126
- : ""}`,
127
- });
128
- return makeRequests(indexersToUse, (indexer) => createTorznabSearchQueries(searchee, {
129
- search: indexer.searchCap,
130
- tvSearch: indexer.tvSearchCap,
131
- movieSearch: indexer.movieSearchCap,
132
- }));
133
177
  }
134
178
  export async function syncWithDb() {
135
179
  const { torznab } = getRuntimeConfig();
@@ -144,7 +188,10 @@ export async function syncWithDb() {
144
188
  retryAfter: "retry_after",
145
189
  searchCap: "search_cap",
146
190
  tvSearchCap: "tv_search_cap",
191
+ tvIdCaps: "tv_id_caps",
147
192
  movieSearchCap: "movie_search_cap",
193
+ movieIdCaps: "movie_id_caps",
194
+ categories: "cat_caps",
148
195
  });
149
196
  const inConfigButNotInDb = torznab.filter((configIndexer) => !dbIndexers.some((dbIndexer) => dbIndexer.url === sanitizeUrl(configIndexer)));
150
197
  const inDbButNotInConfig = dbIndexers.filter((dbIndexer) => !torznab.some((configIndexer) => sanitizeUrl(configIndexer) === dbIndexer.url));
@@ -186,7 +233,7 @@ export async function syncWithDb() {
186
233
  .update({ status: IndexerStatus.OK });
187
234
  });
188
235
  }
189
- function assembleUrl(urlStr, apikey, params) {
236
+ export function assembleUrl(urlStr, apikey, params) {
190
237
  const url = new URL(urlStr);
191
238
  const searchParams = new URLSearchParams();
192
239
  searchParams.set("apikey", apikey);
@@ -204,14 +251,14 @@ async function fetchCaps(indexer) {
204
251
  }
205
252
  catch (e) {
206
253
  const error = new Error(`Indexer ${indexer.url} failed to respond, check verbose logs`);
207
- logger.error(error);
254
+ logger.error(error.message);
208
255
  logger.debug(e);
209
256
  throw error;
210
257
  }
211
258
  const responseText = await response.text();
212
259
  if (!response.ok) {
213
260
  const error = new Error(`Indexer ${indexer.url} responded with code ${response.status} when fetching caps, check verbose logs`);
214
- logger.error(error);
261
+ logger.error(error.message);
215
262
  logger.debug(`Response body first 1000 characters: ${responseText.substring(0, 1000)}`);
216
263
  throw error;
217
264
  }
@@ -221,7 +268,7 @@ async function fetchCaps(indexer) {
221
268
  }
222
269
  catch (_) {
223
270
  const error = new Error(`Indexer ${indexer.url} responded with invalid XML when fetching caps, check verbose logs`);
224
- logger.error(error);
271
+ logger.error(error.message);
225
272
  logger.debug(`Response body first 1000 characters: ${responseText.substring(0, 1000)}`);
226
273
  throw error;
227
274
  }
@@ -241,10 +288,15 @@ async function updateCaps(indexers) {
241
288
  const outcomes = await Promise.allSettled(indexers.map((indexer) => fetchCaps(indexer)));
242
289
  const { fulfilled } = collateOutcomes(indexers.map((i) => i.id), outcomes);
243
290
  for (const [indexerId, caps] of fulfilled) {
244
- await db("indexer").where({ id: indexerId }).update({
291
+ await db("indexer")
292
+ .where({ id: indexerId })
293
+ .update({
245
294
  search_cap: caps.search,
246
295
  tv_search_cap: caps.tvSearch,
247
296
  movie_search_cap: caps.movieSearch,
297
+ movie_id_caps: JSON.stringify(caps.movieIdSearch),
298
+ tv_id_caps: JSON.stringify(caps.tvIdSearch),
299
+ cat_caps: JSON.stringify(caps.categories),
248
300
  });
249
301
  }
250
302
  }
@@ -262,16 +314,8 @@ export async function validateTorznabUrls() {
262
314
  }
263
315
  }
264
316
  await syncWithDb();
265
- const enabledIndexersWithoutCaps = await db("indexer")
266
- .where({
267
- active: true,
268
- search_cap: null,
269
- tv_search_cap: null,
270
- movie_search_cap: null,
271
- })
272
- .orWhere({ search_cap: false, active: true })
273
- .select({ id: "id", url: "url", apikey: "apikey" });
274
- await updateCaps(enabledIndexersWithoutCaps);
317
+ const allIndexers = await getAllIndexers();
318
+ await updateCaps(allIndexers);
275
319
  const indexersWithoutSearch = await db("indexer")
276
320
  .where({ search_cap: false, active: true })
277
321
  .select({ id: "id", url: "url" });
@@ -285,7 +329,7 @@ export async function validateTorznabUrls() {
285
329
  }
286
330
  async function makeRequests(indexers, getQueries) {
287
331
  const { searchTimeout } = getRuntimeConfig();
288
- const searchUrls = indexers.flatMap((indexer) => getQueries(indexer).map((query) => assembleUrl(indexer.url, indexer.apikey, query)));
332
+ const searchUrls = await Promise.all(indexers.flatMap(async (indexer) => (await getQueries(indexer)).map((query) => assembleUrl(indexer.url, indexer.apikey, query)))).then((urls) => urls.flat());
289
333
  searchUrls.forEach((message) => void logger.verbose({ label: Label.TORZNAB, message }));
290
334
  const abortControllers = searchUrls.map(() => new AbortController());
291
335
  if (typeof searchTimeout === "number") {
@@ -330,4 +374,63 @@ async function makeRequests(indexers, getQueries) {
330
374
  candidates: results,
331
375
  }));
332
376
  }
377
+ async function getAndLogIndexers(searchee, mediaType, progress) {
378
+ const { excludeRecentSearch, excludeOlder } = getRuntimeConfig();
379
+ const searcheeLog = getLogString(searchee, chalk.bold.white);
380
+ const mediaTypeLog = chalk.white(mediaType.toUpperCase());
381
+ const enabledIndexers = await getEnabledIndexers();
382
+ // search history for name across all indexers
383
+ const name = searchee.name;
384
+ const timestampDataSql = await db("searchee")
385
+ .join("timestamp", "searchee.id", "timestamp.searchee_id")
386
+ .join("indexer", "timestamp.indexer_id", "indexer.id")
387
+ .whereIn("indexer.id", enabledIndexers.map((i) => i.id))
388
+ .andWhere({ name })
389
+ .select({
390
+ indexerId: "indexer.id",
391
+ firstSearched: "timestamp.first_searched",
392
+ lastSearched: "timestamp.last_searched",
393
+ });
394
+ const skipBefore = excludeOlder
395
+ ? nMsAgo(excludeOlder)
396
+ : Number.NEGATIVE_INFINITY;
397
+ const skipAfter = excludeRecentSearch
398
+ ? nMsAgo(excludeRecentSearch)
399
+ : Number.POSITIVE_INFINITY;
400
+ const timeFilteredIndexers = enabledIndexers.filter((indexer) => {
401
+ const entry = timestampDataSql.find((entry) => entry.indexerId === indexer.id);
402
+ if (!entry)
403
+ return true;
404
+ if (entry.firstSearched < skipBefore)
405
+ return false;
406
+ if (entry.lastSearched > skipAfter)
407
+ return false;
408
+ return true;
409
+ });
410
+ const indexersToUse = timeFilteredIndexers.filter((indexer) => {
411
+ return indexerDoesSupportMediaType(mediaType, JSON.parse(indexer.categories));
412
+ });
413
+ const filteringCauses = [
414
+ enabledIndexers.length > timeFilteredIndexers.length && "timestamps",
415
+ timeFilteredIndexers.length > indexersToUse.length && "category",
416
+ ].filter(isTruthy);
417
+ const reasonStr = filteringCauses.length
418
+ ? ` (filtered by ${formatAsList(filteringCauses)})`
419
+ : "";
420
+ if (indexersToUse.length === 0) {
421
+ logger.info(`${progress}Skipped searching on indexers for ${searcheeLog}${reasonStr} | MediaType: ${mediaTypeLog} | IDs: N/A`);
422
+ return { indexersToUse };
423
+ }
424
+ // Parse media from arrs
425
+ const res = await scanAllArrsForMedia(searchee, mediaType);
426
+ const parsedMedia = res.isOk() ? res.unwrap() : undefined;
427
+ const ids = parsedMedia?.movie ?? parsedMedia?.series;
428
+ const idsStr = ids ? formatFoundIds(ids) : "NONE";
429
+ logger.info(`${progress}Searching for ${searcheeLog} | MediaType: ${mediaTypeLog} | IDs: ${idsStr}`);
430
+ logger.verbose({
431
+ label: Label.TORZNAB,
432
+ message: `Using ${indexersToUse.length} indexers for ${searcheeLog}${reasonStr}`,
433
+ });
434
+ return { indexersToUse, parsedMedia };
435
+ }
333
436
  //# sourceMappingURL=torznab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"torznab.js","sourceRoot":"","sources":["../src/torznab.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"torznab.js","sourceRoot":"","sources":["../src/torznab.ts"],"names":[],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -1,19 +1,23 @@
1
1
  import path, { basename } from "path";
2
- import { EP_REGEX, MOVIE_REGEX, SEASON_REGEX, ANIME_REGEX, VIDEO_EXTENSIONS, Decision, } from "./constants.js";
2
+ import { ALL_EXTENSIONS, ANIME_REGEX, AUDIO_EXTENSIONS, BOOK_EXTENSIONS, Decision, EP_REGEX, MOVIE_REGEX, SCENE_TITLE_REGEX, SEASON_REGEX, VIDEO_EXTENSIONS, } from "./constants.js";
3
3
  import { resultOf, resultOfErr } from "./Result.js";
4
+ import { Metafile } from "./parseTorrent.js";
5
+ import chalk from "chalk";
4
6
  export var MediaType;
5
7
  (function (MediaType) {
6
8
  MediaType["EPISODE"] = "episode";
7
9
  MediaType["SEASON"] = "pack";
8
10
  MediaType["MOVIE"] = "movie";
9
11
  MediaType["ANIME"] = "anime";
12
+ MediaType["AUDIO"] = "audio";
13
+ MediaType["BOOK"] = "book";
10
14
  MediaType["OTHER"] = "unknown";
11
15
  })(MediaType || (MediaType = {}));
12
16
  export function isTruthy(value) {
13
17
  return Boolean(value);
14
18
  }
15
19
  export function stripExtension(filename) {
16
- for (const ext of VIDEO_EXTENSIONS) {
20
+ for (const ext of ALL_EXTENSIONS) {
17
21
  if (filename.endsWith(ext))
18
22
  return basename(filename, ext);
19
23
  }
@@ -29,26 +33,51 @@ export function humanReadableSize(bytes) {
29
33
  const k = 1000;
30
34
  const sizes = ["B", "kB", "MB", "GB", "TB"];
31
35
  // engineering notation: (coefficient) * 1000 ^ (exponent)
32
- const exponent = Math.floor(Math.log(bytes) / Math.log(k));
36
+ const exponent = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
33
37
  const coefficient = bytes / Math.pow(k, exponent);
34
38
  return `${parseFloat(coefficient.toFixed(2))} ${sizes[exponent]}`;
35
39
  }
36
- export function getTag(name, isVideo) {
37
- return EP_REGEX.test(name)
38
- ? MediaType.EPISODE
39
- : SEASON_REGEX.test(name)
40
- ? MediaType.SEASON
41
- : MOVIE_REGEX.test(name)
42
- ? MediaType.MOVIE
43
- : isVideo && ANIME_REGEX.test(name)
44
- ? MediaType.ANIME
45
- : MediaType.OTHER;
40
+ export function getMediaType(searchee) {
41
+ function hasExt(searchee, exts) {
42
+ return searchee.files.some((f) => exts.includes(path.extname(f.name)));
43
+ }
44
+ const stem = stripExtension(searchee.name);
45
+ const hasVideoExtensions = hasExt(searchee, VIDEO_EXTENSIONS);
46
+ function unsupportedMediaType(searchee) {
47
+ //any unsupported media that needs to be identified goes here
48
+ if (hasExt(searchee, AUDIO_EXTENSIONS)) {
49
+ return MediaType.AUDIO;
50
+ }
51
+ else if (hasExt(searchee, BOOK_EXTENSIONS)) {
52
+ return MediaType.BOOK;
53
+ }
54
+ else {
55
+ return MediaType.OTHER;
56
+ }
57
+ }
58
+ // put new supported media type cases in this switch
59
+ if (EP_REGEX.test(stem)) {
60
+ return MediaType.EPISODE;
61
+ }
62
+ else if (SEASON_REGEX.test(stem)) {
63
+ return MediaType.SEASON;
64
+ }
65
+ else if (hasVideoExtensions) {
66
+ if (MOVIE_REGEX.test(stem))
67
+ return MediaType.MOVIE;
68
+ if (ANIME_REGEX.test(stem))
69
+ return MediaType.ANIME;
70
+ return unsupportedMediaType(searchee);
71
+ }
72
+ else {
73
+ return unsupportedMediaType(searchee);
74
+ }
46
75
  }
47
76
  export function shouldRecheck(decision) {
48
77
  switch (decision) {
49
78
  case Decision.MATCH:
50
- return false;
51
79
  case Decision.MATCH_SIZE_ONLY:
80
+ return false;
52
81
  case Decision.MATCH_PARTIAL:
53
82
  default:
54
83
  return true;
@@ -63,6 +92,15 @@ export async function time(cb, times) {
63
92
  times.push(performance.now() - before);
64
93
  }
65
94
  }
95
+ export function sanitizeUrl(url) {
96
+ if (typeof url === "string") {
97
+ url = new URL(url);
98
+ }
99
+ return url.origin + url.pathname;
100
+ }
101
+ export function getApikey(url) {
102
+ return new URL(url).searchParams.get("apikey");
103
+ }
66
104
  export function cleanseSeparators(str) {
67
105
  return str
68
106
  .replace(/\[.*?\]|「.*?」|「.*?」|【.*?】/g, "")
@@ -71,23 +109,29 @@ export function cleanseSeparators(str) {
71
109
  .trim();
72
110
  }
73
111
  export function getAnimeQueries(name) {
74
- // Only use if getTag returns anime as it's conditional on a few factors
112
+ // Only use if getMediaType returns anime as it's conditional on a few factors
75
113
  const animeQueries = [];
76
114
  const { title, altTitle, release } = name.match(ANIME_REGEX)?.groups ?? {};
77
115
  if (title) {
78
116
  animeQueries.push(cleanseSeparators(`${title} ${release}`));
79
117
  }
80
118
  if (altTitle) {
119
+ // Edge cases from regex
120
+ if (altTitle.toLowerCase() === "season")
121
+ return animeQueries;
122
+ if (altTitle.toLowerCase() === "ep")
123
+ return animeQueries;
81
124
  animeQueries.push(cleanseSeparators(`${altTitle} ${release}`));
82
125
  }
83
126
  return animeQueries;
84
127
  }
85
128
  export function reformatTitleForSearching(name) {
86
- const seasonMatch = name.match(SEASON_REGEX);
87
- const movieMatch = name.match(MOVIE_REGEX);
88
- const episodeMatch = name.match(EP_REGEX);
89
- const fullMatch = episodeMatch?.[0] ?? seasonMatch?.[0] ?? movieMatch?.[0] ?? name;
90
- return cleanseSeparators(fullMatch);
129
+ // use lazy regex evaluation
130
+ const fullMatch = name.match(EP_REGEX)?.[0] ??
131
+ name.match(SEASON_REGEX)?.[0] ??
132
+ name.match(MOVIE_REGEX)?.[0] ??
133
+ name;
134
+ return cleanseSeparators(fullMatch).match(SCENE_TITLE_REGEX).groups.title;
91
135
  }
92
136
  export const tap = (fn) => (value) => {
93
137
  fn(value);
@@ -101,6 +145,16 @@ export function humanReadableDate(timestamp) {
101
145
  // swedish conventions roughly follow the iso format!
102
146
  return new Date(timestamp).toLocaleString("sv");
103
147
  }
148
+ export function getLogString(data, color) {
149
+ if (data instanceof Metafile) {
150
+ return `${color(data.name)} ${chalk.dim(`[${data.infoHash.slice(0, 8)}...]`)}`;
151
+ }
152
+ return data.infoHash
153
+ ? `${color(data.name)} ${chalk.dim(`[${data.infoHash.slice(0, 8)}...]`)}`
154
+ : data.path
155
+ ? color(data.path)
156
+ : color(data.name);
157
+ }
104
158
  export function formatAsList(strings) {
105
159
  return new Intl.ListFormat("en", {
106
160
  style: "long",
@@ -131,4 +185,7 @@ export function extractCredentialsFromUrl(url, basePath) {
131
185
  return resultOfErr("invalid URL");
132
186
  }
133
187
  }
188
+ export function capitalizeFirstLetter(string) {
189
+ return string.charAt(0).toUpperCase() + string.slice(1);
190
+ }
134
191
  //# sourceMappingURL=utils.js.map