@ctrl/video-filename-parser
Version:
A radarr style release name parser
54 lines (53 loc) • 1.84 kB
JavaScript
import { completeRange, normalizeSixDigitAirDate, parseGenericMatchCollection, } from './season/common.js';
import { rejectedPatterns, seasonPatterns } from './season/patterns.js';
import { simplifyTitle } from './simplifyTitle.js';
export { completeRange };
export function parseSeason(title) {
if (!preValidation(title)) {
return null;
}
const simpleTitle = normalizeSixDigitAirDate(title, simplifyTitle(title));
for (const pattern of seasonPatterns) {
const match = pattern.regex.exec(simpleTitle);
if (!match?.groups) {
continue;
}
const result = pattern.parse(match, simpleTitle);
if (result === null) {
continue;
}
return toSeason(title, result);
}
return null;
}
export function parseMatchCollection(match, simpleTitle) {
return parseGenericMatchCollection(match, simpleTitle);
}
function preValidation(title) {
for (const exp of rejectedPatterns) {
const match = exp.exec(title);
if (match !== null) {
return false;
}
}
return true;
}
function toSeason(title, result) {
if (result.fullSeason && result.releaseTokens && /Special/i.test(result.releaseTokens)) {
result.fullSeason = false;
result.isSpecial = true;
}
return {
releaseTitle: title,
seriesTitle: result.seriesName,
seasons: result.seasonNumbers ?? [],
episodeNumbers: result.episodeNumbers ?? [],
airDate: result.airDate ?? null,
fullSeason: result.fullSeason ?? false,
isPartialSeason: result.isPartialSeason ?? false,
isMultiSeason: result.isMultiSeason ?? false,
isSeasonExtra: result.isSeasonExtra ?? false,
isSpecial: result.isSpecial ?? false,
seasonPart: result.seasonPart ?? 0,
};
}