cross-seed 6.0.0-3 → 6.0.0-30
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.
- package/dist/Result.js +17 -11
- package/dist/Result.js.map +1 -1
- package/dist/action.js +158 -47
- package/dist/action.js.map +1 -1
- package/dist/arr.js +200 -0
- package/dist/arr.js.map +1 -0
- package/dist/clients/Deluge.js +129 -71
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +74 -58
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +12 -10
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +10 -10
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +16 -16
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +83 -46
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +97 -13
- package/dist/configSchema.js.map +1 -1
- package/dist/configuration.js +3 -0
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +100 -6
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +4 -5
- package/dist/dataFiles.js.map +1 -1
- package/dist/decide.js +263 -158
- package/dist/decide.js.map +1 -1
- package/dist/diff.js +12 -2
- package/dist/diff.js.map +1 -1
- package/dist/errors.js +5 -2
- package/dist/errors.js.map +1 -1
- package/dist/indexers.js +31 -4
- package/dist/indexers.js.map +1 -1
- package/dist/jobs.js +2 -0
- package/dist/jobs.js.map +1 -1
- package/dist/logger.js +19 -5
- package/dist/logger.js.map +1 -1
- package/dist/migrations/05-caps.js +16 -0
- package/dist/migrations/05-caps.js.map +1 -0
- package/dist/migrations/06-uniqueDecisions.js +29 -0
- package/dist/migrations/06-uniqueDecisions.js.map +1 -0
- package/dist/migrations/migrations.js +11 -1
- package/dist/migrations/migrations.js.map +1 -1
- package/dist/parseTorrent.js +5 -0
- package/dist/parseTorrent.js.map +1 -1
- package/dist/pipeline.js +181 -85
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +130 -52
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +4 -2
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/searchee.js +203 -13
- package/dist/searchee.js.map +1 -1
- package/dist/server.js +22 -15
- package/dist/server.js.map +1 -1
- package/dist/startup.js +2 -0
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +84 -39
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +285 -95
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +155 -31
- package/dist/utils.js.map +1 -1
- package/package.json +3 -1
package/dist/preFilter.js
CHANGED
@@ -1,61 +1,105 @@
|
|
1
1
|
import ms from "ms";
|
2
|
-
import {
|
3
|
-
import {
|
2
|
+
import { basename, dirname } from "path";
|
3
|
+
import { statSync } from "fs";
|
4
|
+
import { ARR_DIR_REGEX, SONARR_SUBFOLDERS_REGEX, SEASON_REGEX, VIDEO_EXTENSIONS, VIDEO_DISC_EXTENSIONS, } from "./constants.js";
|
4
5
|
import { db } from "./db.js";
|
5
6
|
import { getEnabledIndexers } from "./indexers.js";
|
6
7
|
import { Label, logger } from "./logger.js";
|
7
8
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
8
|
-
import {
|
9
|
-
import
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
import { indexerDoesSupportMediaType } from "./torznab.js";
|
10
|
+
import { filesWithExt, getLogString, getMediaType, hasExt, humanReadableDate, MediaType, nMsAgo, } from "./utils.js";
|
11
|
+
const MAX_INT = Number.MAX_SAFE_INTEGER;
|
12
|
+
function logReason(reason, searchee, mediaType) {
|
13
|
+
logger.verbose({
|
14
|
+
label: Label.PREFILTER,
|
15
|
+
message: `${getLogString(searchee)} | MediaType: ${mediaType.toUpperCase()} - was not selected for searching because ${reason}`,
|
16
|
+
});
|
17
|
+
}
|
18
|
+
export function isSingleEpisode(searchee, mediaType) {
|
19
|
+
if (mediaType === MediaType.EPISODE)
|
20
|
+
return true;
|
21
|
+
if (mediaType !== MediaType.ANIME)
|
22
|
+
return false;
|
23
|
+
return filesWithExt(searchee.files, VIDEO_EXTENSIONS).length === 1;
|
24
|
+
// if (m === MediaType.EPISODE) return true;
|
25
|
+
// if (!(m === MediaType.ANIME || m === MediaType.VIDEO)) return false;
|
26
|
+
// if (searchee.files.length === 1 && m === MediaType.ANIME) return true;
|
27
|
+
// if (searchee.files.length > 5) return false; // Probably a pack, allow extra files
|
28
|
+
// To check arrs use: return parsedMedia?.episodes?.length === 1, uncomment above
|
29
|
+
}
|
30
|
+
export function filterByContent(searchee, includeEpisodes) {
|
31
|
+
const { fuzzySizeThreshold, includeNonVideos, includeSingleEpisodes, blockList, } = getRuntimeConfig();
|
32
|
+
const mediaType = getMediaType(searchee);
|
18
33
|
const blockedNote = findBlockedStringInReleaseMaybe(searchee, blockList);
|
19
34
|
if (blockedNote) {
|
20
|
-
logReason(`it matched the blocklist - ("${blockedNote}")
|
35
|
+
logReason(`it matched the blocklist - ("${blockedNote}")`, searchee, mediaType);
|
21
36
|
return false;
|
22
37
|
}
|
23
|
-
|
24
|
-
|
38
|
+
if ((!includeEpisodes || !includeSingleEpisodes) &&
|
39
|
+
searchee.path &&
|
25
40
|
searchee.files.length === 1 &&
|
26
|
-
SEASON_REGEX.test(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
41
|
+
(SEASON_REGEX.test(basename(dirname(searchee.path))) ||
|
42
|
+
SONARR_SUBFOLDERS_REGEX.test(basename(dirname(searchee.path))))) {
|
43
|
+
logReason("it is a season pack episode", searchee, mediaType);
|
44
|
+
return false;
|
45
|
+
}
|
46
|
+
if (!includeSingleEpisodes &&
|
47
|
+
searchee.label !== Label.ANNOUNCE &&
|
48
|
+
isSingleEpisode(searchee, mediaType)) {
|
49
|
+
logReason("it is a single episode", searchee, mediaType);
|
32
50
|
return false;
|
33
51
|
}
|
34
|
-
|
35
|
-
|
52
|
+
const nonVideoSizeRatio = searchee.files.reduce((acc, cur) => {
|
53
|
+
if (!hasExt([cur], [...VIDEO_EXTENSIONS, ...VIDEO_DISC_EXTENSIONS])) {
|
54
|
+
return acc + cur.length;
|
55
|
+
}
|
56
|
+
return acc;
|
57
|
+
}, 0) / searchee.length;
|
58
|
+
if (!includeNonVideos && nonVideoSizeRatio > fuzzySizeThreshold) {
|
59
|
+
logReason(`nonVideoSizeRatio ${nonVideoSizeRatio} > ${fuzzySizeThreshold} fuzzySizeThreshold`, searchee, mediaType);
|
36
60
|
return false;
|
37
61
|
}
|
38
|
-
|
39
|
-
|
40
|
-
|
62
|
+
if (searchee.path &&
|
63
|
+
statSync(searchee.path).isDirectory() &&
|
64
|
+
ARR_DIR_REGEX.test(basename(searchee.path)) &&
|
65
|
+
nonVideoSizeRatio < 0.02 &&
|
66
|
+
!(searchee.files.length > 1 &&
|
67
|
+
SONARR_SUBFOLDERS_REGEX.test(basename(searchee.path)))) {
|
68
|
+
logReason("it looks like an arr movie/series directory", searchee, mediaType);
|
41
69
|
return false;
|
42
70
|
}
|
43
71
|
return true;
|
44
72
|
}
|
45
73
|
export function findBlockedStringInReleaseMaybe(searchee, blockList) {
|
46
74
|
return blockList.find((blockedStr) => {
|
47
|
-
return (searchee.
|
75
|
+
return (searchee.title.includes(blockedStr) ||
|
76
|
+
(searchee.path &&
|
77
|
+
basename(dirname(searchee.path)).includes(blockedStr)) ||
|
48
78
|
blockedStr === searchee.infoHash);
|
49
79
|
});
|
50
80
|
}
|
51
|
-
|
81
|
+
/**
|
82
|
+
* Filters duplicates from searchees that should be for different candidates,
|
83
|
+
* e.g. all searchees created by cross-seed.
|
84
|
+
* @param searchees - An array of searchees to filter duplicates from.
|
85
|
+
* @returns An array of searchees with duplicates removed, preferring infoHash.
|
86
|
+
*/
|
87
|
+
export function filterDupesByName(searchees) {
|
52
88
|
const duplicateMap = searchees.reduce((acc, cur) => {
|
53
|
-
const entry = acc.get(cur.
|
89
|
+
const entry = acc.get(cur.title);
|
54
90
|
if (entry === undefined) {
|
55
|
-
acc.set(cur.
|
91
|
+
acc.set(cur.title, cur);
|
92
|
+
return acc;
|
93
|
+
}
|
94
|
+
if (cur.files.length > entry.files.length) {
|
95
|
+
acc.set(cur.title, cur);
|
96
|
+
return acc;
|
56
97
|
}
|
57
|
-
|
58
|
-
acc
|
98
|
+
if (cur.files.length < entry.files.length) {
|
99
|
+
return acc;
|
100
|
+
}
|
101
|
+
if (cur.infoHash && !entry.infoHash) {
|
102
|
+
acc.set(cur.title, cur);
|
59
103
|
}
|
60
104
|
return acc;
|
61
105
|
}, new Map());
|
@@ -69,9 +113,39 @@ export function filterDupes(searchees) {
|
|
69
113
|
}
|
70
114
|
return filtered;
|
71
115
|
}
|
116
|
+
/**
|
117
|
+
* Filters duplicates from searchees that are for the same candidates,
|
118
|
+
* e.g. searchees for the same media but different resolutions.
|
119
|
+
* @param searchees - An array of searchees for a specific media.
|
120
|
+
* @returns An array of searchees that are unique from a matching perspective.
|
121
|
+
*/
|
122
|
+
export function filterDupesFromSimilar(searchees) {
|
123
|
+
const filteredSearchees = [];
|
124
|
+
for (const searchee of searchees) {
|
125
|
+
const isDupe = filteredSearchees.some((s) => {
|
126
|
+
if (searchee.length !== s.length)
|
127
|
+
return false;
|
128
|
+
if (searchee.files.length !== s.files.length)
|
129
|
+
return false;
|
130
|
+
const potentialFiles = s.files.map((f) => f.length);
|
131
|
+
return searchee.files.every((file) => {
|
132
|
+
const index = potentialFiles.indexOf(file.length);
|
133
|
+
if (index === -1)
|
134
|
+
return false;
|
135
|
+
potentialFiles.splice(index, 1);
|
136
|
+
return true;
|
137
|
+
});
|
138
|
+
});
|
139
|
+
if (!isDupe) {
|
140
|
+
filteredSearchees.push(searchee);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
return filteredSearchees;
|
144
|
+
}
|
72
145
|
export async function filterTimestamps(searchee) {
|
73
146
|
const { excludeOlder, excludeRecentSearch } = getRuntimeConfig();
|
74
147
|
const enabledIndexers = await getEnabledIndexers();
|
148
|
+
const mediaType = getMediaType(searchee);
|
75
149
|
const timestampDataSql = (await db("searchee")
|
76
150
|
// @ts-expect-error crossJoin supports string
|
77
151
|
.crossJoin("indexer")
|
@@ -79,32 +153,36 @@ export async function filterTimestamps(searchee) {
|
|
79
153
|
"timestamp.indexer_id": "indexer.id",
|
80
154
|
"timestamp.searchee_id": "searchee.id",
|
81
155
|
})
|
82
|
-
.where("searchee.name", searchee.
|
83
|
-
.whereIn("indexer.id", enabledIndexers
|
156
|
+
.where("searchee.name", searchee.title)
|
157
|
+
.whereIn("indexer.id", enabledIndexers
|
158
|
+
.filter((indexer) => indexerDoesSupportMediaType(mediaType, JSON.parse(indexer.categories)))
|
159
|
+
.map((indexer) => indexer.id))
|
84
160
|
.min({
|
85
|
-
|
161
|
+
earliest_first_search: db.raw(`coalesce(timestamp.first_searched, ${MAX_INT})`),
|
162
|
+
})
|
163
|
+
.max({
|
164
|
+
latest_first_search: db.raw(`coalesce(timestamp.first_searched, ${MAX_INT})`),
|
86
165
|
})
|
87
166
|
.min({
|
88
|
-
|
167
|
+
earliest_last_search: db.raw("coalesce(timestamp.last_searched, 0)"),
|
89
168
|
})
|
90
169
|
.first());
|
91
|
-
const {
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
logReason(`its first search timestamp ${humanReadableDate(first_searched_any)} is older than ${ms(excludeOlder, { long: true })} ago`);
|
102
|
-
return false;
|
170
|
+
const { earliest_first_search, latest_first_search, earliest_last_search } = timestampDataSql;
|
171
|
+
const skipBefore = excludeOlder
|
172
|
+
? nMsAgo(excludeOlder)
|
173
|
+
: Number.NEGATIVE_INFINITY;
|
174
|
+
// Don't exclude if new indexer was added
|
175
|
+
if (!latest_first_search || latest_first_search !== MAX_INT) {
|
176
|
+
if (earliest_first_search && earliest_first_search < skipBefore) {
|
177
|
+
logReason(`its first search timestamp ${humanReadableDate(earliest_first_search)} is older than ${ms(excludeOlder, { long: true })} ago`, searchee, mediaType);
|
178
|
+
return false;
|
179
|
+
}
|
103
180
|
}
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
181
|
+
const skipAfter = excludeRecentSearch
|
182
|
+
? nMsAgo(excludeRecentSearch)
|
183
|
+
: Number.POSITIVE_INFINITY;
|
184
|
+
if (earliest_last_search && earliest_last_search > skipAfter) {
|
185
|
+
logReason(`its last search timestamp ${humanReadableDate(earliest_last_search)} is newer than ${ms(excludeRecentSearch, { long: true })} ago`, searchee, mediaType);
|
108
186
|
return false;
|
109
187
|
}
|
110
188
|
return true;
|
package/dist/preFilter.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"preFilter.js","sourceRoot":"","sources":["../src/preFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
1
|
+
{"version":3,"file":"preFilter.js","sourceRoot":"","sources":["../src/preFilter.ts"],"names":[],"mappings":"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"}
|
package/dist/pushNotifier.js
CHANGED
@@ -43,12 +43,13 @@ export class PushNotifier {
|
|
43
43
|
}
|
44
44
|
}
|
45
45
|
}
|
46
|
-
export function sendResultsNotification(searchee, results
|
47
|
-
const
|
46
|
+
export function sendResultsNotification(searchee, results) {
|
47
|
+
const source = searchee.label;
|
48
48
|
const notableSuccesses = results.filter(([, , actionResult]) => actionResult === InjectionResult.SUCCESS ||
|
49
49
|
actionResult === SaveResult.SAVED);
|
50
50
|
const failures = results.filter(([, , actionResult]) => actionResult === InjectionResult.FAILURE);
|
51
51
|
if (notableSuccesses.length) {
|
52
|
+
const name = notableSuccesses[0][0].metafile.name;
|
52
53
|
const numTrackers = notableSuccesses.length;
|
53
54
|
const infoHashes = notableSuccesses.map(([assessment]) => assessment.metafile.infoHash);
|
54
55
|
const trackers = notableSuccesses.map(([, tracker]) => tracker);
|
@@ -69,6 +70,7 @@ export function sendResultsNotification(searchee, results, source) {
|
|
69
70
|
});
|
70
71
|
}
|
71
72
|
if (failures.length) {
|
73
|
+
const name = failures[0][0].metafile.name;
|
72
74
|
const numTrackers = failures.length;
|
73
75
|
const infoHashes = failures.map(([assessment]) => assessment.metafile.infoHash);
|
74
76
|
const trackers = failures.map(([, tracker]) => tracker);
|
package/dist/pushNotifier.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"pushNotifier.js","sourceRoot":"","sources":["../src/pushNotifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,eAAe,EACf,UAAU,EACV,YAAY,EACZ,UAAU,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,
|
1
|
+
{"version":3,"file":"pushNotifier.js","sourceRoot":"","sources":["../src/pushNotifier.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"runtimeConfig.js","sourceRoot":"","sources":["../src/runtimeConfig.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"runtimeConfig.js","sourceRoot":"","sources":["../src/runtimeConfig.ts"],"names":[],"mappings":"AAwCA,IAAI,aAA4B,CAAC;AAEjC,MAAM,UAAU,gBAAgB,CAAC,SAAwB;IACxD,aAAa,GAAG,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC/B,OAAO,aAAa,CAAC;AACtB,CAAC"}
|
package/dist/searchee.js
CHANGED
@@ -1,14 +1,29 @@
|
|
1
1
|
import { readdirSync, statSync } from "fs";
|
2
|
-
import { basename,
|
3
|
-
import { VIDEO_EXTENSIONS } from "./constants.js";
|
4
|
-
import { logger } from "./logger.js";
|
2
|
+
import { basename, dirname, join, relative } from "path";
|
3
|
+
import { ANIME_REGEX, ANIME_GROUP_REGEX, ARR_DIR_REGEX, EP_REGEX, RELEASE_GROUP_REGEX, SEASON_REGEX, RES_STRICT_REGEX, parseSource, SONARR_SUBFOLDERS_REGEX, MOVIE_REGEX, VIDEO_EXTENSIONS, } from "./constants.js";
|
4
|
+
import { Label, logger } from "./logger.js";
|
5
5
|
import { resultOf, resultOfErr } from "./Result.js";
|
6
6
|
import { parseTorrentFromFilename } from "./torrent.js";
|
7
|
+
import { createKeyTitle, extractInt, filesWithExt, getLogString, hasExt, isBadTitle, } from "./utils.js";
|
7
8
|
export function hasInfoHash(searchee) {
|
8
9
|
return searchee.infoHash != null;
|
9
10
|
}
|
10
|
-
|
11
|
-
|
11
|
+
var SearcheeSource;
|
12
|
+
(function (SearcheeSource) {
|
13
|
+
SearcheeSource["TORRENT"] = "torrentDir";
|
14
|
+
SearcheeSource["DATA"] = "dataDir";
|
15
|
+
SearcheeSource["VIRTUAL"] = "virtual";
|
16
|
+
})(SearcheeSource || (SearcheeSource = {}));
|
17
|
+
export function getSearcheeSource(searchee) {
|
18
|
+
if (searchee.infoHash) {
|
19
|
+
return SearcheeSource.TORRENT;
|
20
|
+
}
|
21
|
+
else if (searchee.path) {
|
22
|
+
return SearcheeSource.DATA;
|
23
|
+
}
|
24
|
+
else {
|
25
|
+
return SearcheeSource.VIRTUAL;
|
26
|
+
}
|
12
27
|
}
|
13
28
|
function getFileNamesFromRootRec(root, isDirHint) {
|
14
29
|
const isDir = isDirHint !== undefined ? isDirHint : statSync(root).isDirectory();
|
@@ -27,18 +42,82 @@ function getFilesFromDataRoot(rootPath) {
|
|
27
42
|
length: statSync(file).size,
|
28
43
|
}));
|
29
44
|
}
|
45
|
+
/**
|
46
|
+
* Parse title from SXX or Season XX. Return null if no title found.
|
47
|
+
* Also tries to parse titles that are just `Show`, returns `Show` if better not found.
|
48
|
+
* @param files files in the searchee
|
49
|
+
* @param options.seasonMatch if the searchee is a `Season X` folder
|
50
|
+
* @param options.path if data based, the path to the searchee
|
51
|
+
*/
|
52
|
+
function parseTitle(files, seasonMatch, path) {
|
53
|
+
const videoFiles = filesWithExt(files, VIDEO_EXTENSIONS);
|
54
|
+
for (const videoFile of videoFiles) {
|
55
|
+
const ep = videoFile.name.match(EP_REGEX);
|
56
|
+
if (ep) {
|
57
|
+
const seasonVal = ep.groups.season ??
|
58
|
+
ep.groups.year ??
|
59
|
+
seasonMatch?.groups.seasonNum;
|
60
|
+
const season = seasonVal ? `S${extractInt(seasonVal)}` : "";
|
61
|
+
const episode = videoFiles.length === 1
|
62
|
+
? `E${ep.groups.episode ? extractInt(ep.groups.episode) : `${ep.groups.month}.${ep.groups.day}`}`
|
63
|
+
: "";
|
64
|
+
if (season.length || episode.length || !seasonMatch) {
|
65
|
+
return `${ep.groups.title} ${season}${episode}`.trim();
|
66
|
+
}
|
67
|
+
}
|
68
|
+
if (path && seasonMatch) {
|
69
|
+
const title = basename(dirname(path)).match(ARR_DIR_REGEX)?.groups
|
70
|
+
?.title;
|
71
|
+
if (title?.length) {
|
72
|
+
return `${title} S${seasonMatch.groups.seasonNum}`;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
const anime = videoFile.name.match(ANIME_REGEX);
|
76
|
+
if (anime) {
|
77
|
+
const season = seasonMatch
|
78
|
+
? `S${seasonMatch.groups.seasonNum}`
|
79
|
+
: "";
|
80
|
+
if (season.length || !seasonMatch) {
|
81
|
+
return `${anime.groups.title} ${season}`.trim();
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
return null;
|
86
|
+
}
|
30
87
|
export function createSearcheeFromMetafile(meta) {
|
31
|
-
|
88
|
+
const seasonMatch = meta.name.length < 12 ? meta.name.match(SONARR_SUBFOLDERS_REGEX) : null;
|
89
|
+
if (!seasonMatch &&
|
90
|
+
(meta.name.match(/\d/) || !hasExt(meta.files, VIDEO_EXTENSIONS))) {
|
91
|
+
return resultOf({
|
92
|
+
files: meta.files,
|
93
|
+
infoHash: meta.infoHash,
|
94
|
+
name: meta.name,
|
95
|
+
title: meta.name,
|
96
|
+
length: meta.length,
|
97
|
+
});
|
98
|
+
}
|
99
|
+
const title = parseTitle(meta.files, seasonMatch) ??
|
100
|
+
(!seasonMatch ? meta.name : null);
|
101
|
+
if (!title) {
|
102
|
+
const msg = `Could not find title for ${getLogString(meta)} from child files`;
|
103
|
+
logger.verbose({
|
104
|
+
label: Label.PREFILTER,
|
105
|
+
message: msg,
|
106
|
+
});
|
107
|
+
return resultOfErr(new Error(msg));
|
108
|
+
}
|
109
|
+
return resultOf({
|
32
110
|
files: meta.files,
|
33
111
|
infoHash: meta.infoHash,
|
34
112
|
name: meta.name,
|
113
|
+
title,
|
35
114
|
length: meta.length,
|
36
|
-
};
|
115
|
+
});
|
37
116
|
}
|
38
117
|
export async function createSearcheeFromTorrentFile(filepath) {
|
39
118
|
try {
|
40
119
|
const meta = await parseTorrentFromFilename(filepath);
|
41
|
-
return
|
120
|
+
return createSearcheeFromMetafile(meta);
|
42
121
|
}
|
43
122
|
catch (e) {
|
44
123
|
logger.error(`Failed to parse ${basename(filepath)}`);
|
@@ -46,13 +125,124 @@ export async function createSearcheeFromTorrentFile(filepath) {
|
|
46
125
|
return resultOfErr(e);
|
47
126
|
}
|
48
127
|
}
|
49
|
-
export async function createSearcheeFromPath(
|
50
|
-
const
|
128
|
+
export async function createSearcheeFromPath(root) {
|
129
|
+
const files = getFilesFromDataRoot(root);
|
130
|
+
if (files.length === 0) {
|
131
|
+
const msg = `No files found in ${root}`;
|
132
|
+
logger.verbose({
|
133
|
+
label: Label.PREFILTER,
|
134
|
+
message: msg,
|
135
|
+
});
|
136
|
+
return resultOfErr(new Error(msg));
|
137
|
+
}
|
138
|
+
const totalLength = files.reduce((runningTotal, file) => runningTotal + file.length, 0);
|
139
|
+
const baseName = basename(root);
|
140
|
+
const seasonMatch = baseName.length < 12 ? baseName.match(SONARR_SUBFOLDERS_REGEX) : null;
|
141
|
+
if (!seasonMatch &&
|
142
|
+
(baseName.match(/\d/) || !hasExt(files, VIDEO_EXTENSIONS))) {
|
143
|
+
return resultOf({
|
144
|
+
files: files,
|
145
|
+
path: root,
|
146
|
+
name: baseName,
|
147
|
+
title: baseName,
|
148
|
+
length: totalLength,
|
149
|
+
});
|
150
|
+
}
|
151
|
+
const title = parseTitle(files, seasonMatch, root) ??
|
152
|
+
(!seasonMatch ? baseName : null);
|
153
|
+
if (!title) {
|
154
|
+
const msg = `Could not find title for ${root} in parent directory or child files`;
|
155
|
+
logger.verbose({
|
156
|
+
label: Label.PREFILTER,
|
157
|
+
message: msg,
|
158
|
+
});
|
159
|
+
return resultOfErr(new Error(msg));
|
160
|
+
}
|
51
161
|
return resultOf({
|
52
|
-
files:
|
53
|
-
path:
|
54
|
-
name:
|
162
|
+
files: files,
|
163
|
+
path: root,
|
164
|
+
name: baseName,
|
165
|
+
title,
|
55
166
|
length: totalLength,
|
56
167
|
});
|
57
168
|
}
|
169
|
+
export function getKeyMetaInfo(stem) {
|
170
|
+
const resM = stem.match(RES_STRICT_REGEX)?.groups?.res;
|
171
|
+
const res = resM ? `.${resM}` : "";
|
172
|
+
const sourceM = parseSource(stem);
|
173
|
+
const source = sourceM ? `.${sourceM}` : "";
|
174
|
+
const groupM = stem.match(RELEASE_GROUP_REGEX)?.groups?.group;
|
175
|
+
if (groupM) {
|
176
|
+
return `${res}${source}-${groupM}`.toLowerCase();
|
177
|
+
}
|
178
|
+
const groupAnimeM = stem.match(ANIME_GROUP_REGEX)?.groups?.group;
|
179
|
+
if (groupAnimeM) {
|
180
|
+
return `${res}${source}-${groupAnimeM}`.toLowerCase();
|
181
|
+
}
|
182
|
+
return `${res}${source}`.toLowerCase();
|
183
|
+
}
|
184
|
+
export function getMovieKey(stem) {
|
185
|
+
const match = stem.match(MOVIE_REGEX);
|
186
|
+
if (!match)
|
187
|
+
return null;
|
188
|
+
const keyTitle = createKeyTitle(match.groups.title);
|
189
|
+
if (!keyTitle)
|
190
|
+
return null;
|
191
|
+
const year = extractInt(match.groups.year);
|
192
|
+
const ensembleTitle = `${match.groups.title}.${year}`;
|
193
|
+
return { ensembleTitle, keyTitle, year };
|
194
|
+
}
|
195
|
+
export function getSeasonKey(stem) {
|
196
|
+
const match = stem.match(SEASON_REGEX);
|
197
|
+
if (!match)
|
198
|
+
return null;
|
199
|
+
const keyTitle = createKeyTitle(match.groups.title);
|
200
|
+
if (!keyTitle)
|
201
|
+
return null;
|
202
|
+
const season = `S${extractInt(match.groups.season)}`;
|
203
|
+
const ensembleTitle = `${match.groups.title}.${season}`;
|
204
|
+
return { ensembleTitle, keyTitle, season };
|
205
|
+
}
|
206
|
+
export function getEpisodeKey(stem) {
|
207
|
+
const match = stem.match(EP_REGEX);
|
208
|
+
if (!match)
|
209
|
+
return null;
|
210
|
+
const keyTitle = createKeyTitle(match.groups.title);
|
211
|
+
if (!keyTitle)
|
212
|
+
return null;
|
213
|
+
const season = match.groups.season
|
214
|
+
? `S${extractInt(match.groups.season)}`
|
215
|
+
: match.groups.year
|
216
|
+
? `S${match.groups.year}`
|
217
|
+
: undefined;
|
218
|
+
const ensembleTitle = `${match.groups.title}${season ? `.${season}` : ""}`;
|
219
|
+
const episode = match.groups.episode
|
220
|
+
? extractInt(match.groups.episode)
|
221
|
+
: `${match.groups.month}.${match.groups.day}`;
|
222
|
+
return { ensembleTitle, keyTitle, season, episode };
|
223
|
+
}
|
224
|
+
export function getAnimeKeys(stem) {
|
225
|
+
const match = stem.match(ANIME_REGEX);
|
226
|
+
if (!match)
|
227
|
+
return null;
|
228
|
+
const firstTitle = match.groups.title;
|
229
|
+
const altTitle = match.groups.altTitle;
|
230
|
+
const keyTitles = [];
|
231
|
+
const ensembleTitles = [];
|
232
|
+
for (const title of [firstTitle, altTitle]) {
|
233
|
+
if (!title)
|
234
|
+
continue;
|
235
|
+
if (isBadTitle(title))
|
236
|
+
continue;
|
237
|
+
const keyTitle = createKeyTitle(title);
|
238
|
+
if (!keyTitle)
|
239
|
+
return null;
|
240
|
+
keyTitles.push(keyTitle);
|
241
|
+
ensembleTitles.push(title);
|
242
|
+
}
|
243
|
+
if (keyTitles.length === 0)
|
244
|
+
return null;
|
245
|
+
const release = extractInt(match.groups.release);
|
246
|
+
return { ensembleTitles, keyTitles, release };
|
247
|
+
}
|
58
248
|
//# sourceMappingURL=searchee.js.map
|
package/dist/searchee.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"searchee.js","sourceRoot":"","sources":["../src/searchee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzD,OAAO,
|
1
|
+
{"version":3,"file":"searchee.js","sourceRoot":"","sources":["../src/searchee.ts"],"names":[],"mappings":"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"}
|