UNPKG

@ctrl/video-filename-parser

Version:
55 lines (54 loc) 1.92 kB
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, }; }