@ctrl/video-filename-parser
Version:
A radarr style release name parser
55 lines (54 loc) • 1.92 kB
JavaScript
import { simplifyTitle } from '../title/cleanup.js';
import { normalizeSixDigitAirDate, parseGenericMatchCollection, } from './common.js';
import { rejectedPatterns, seasonPatterns } from './patterns.js';
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) {
if (pattern.stopOnNull === true) {
return 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) {
const isSpecialFullSeason = result.fullSeason === true &&
result.releaseTokens !== undefined &&
/Special/i.test(result.releaseTokens);
return {
releaseTitle: title,
seriesTitle: result.seriesName,
seasons: result.seasonNumbers ?? [],
episodeNumbers: result.episodeNumbers ?? [],
airDate: result.airDate ?? null,
fullSeason: isSpecialFullSeason ? false : (result.fullSeason ?? false),
isPartialSeason: result.isPartialSeason ?? false,
isMultiSeason: result.isMultiSeason ?? false,
isSeasonExtra: result.isSeasonExtra ?? false,
isSpecial: isSpecialFullSeason || (result.isSpecial ?? false),
seasonPart: result.seasonPart ?? 0,
};
}