UNPKG

identify-media

Version:

Analyse file path and content to make search criteria for media APIs

107 lines (87 loc) 3.5 kB
const releaseYearRegex = /(((18|19|20)\d{2})-?((18|19|20)\d{2})?)[^a-zA-Z]/g; const matchLastYear = (name: string): {year: number, index: number} | undefined => { let result, regArr; while (regArr = releaseYearRegex.exec(name)) { result = {year: Number.parseInt(regArr[1], 10), index: regArr.index} } return result; } export const findYear = (name?: string): {restName?: string, year: number} | undefined => { if (!name) return undefined; const yearMatch = matchLastYear(name); if (!!yearMatch) { const restName = yearMatch.index === 0 ? undefined : name.slice(0, yearMatch.index); const year = yearMatch.year; return { restName, year } } return undefined; } const completeSeasonRegex = /((complete\s*)?(season\s*([0-9]+)?))/i; export const findSeason = (name: string): {season: number, restName?: string} | undefined => { const seasonArr = completeSeasonRegex.exec(name); if (!!seasonArr && !!seasonArr[4]) { const restName = seasonArr.index === 0 ? undefined : name.slice(0, seasonArr.index); const season = Number.parseInt(seasonArr[4]); return { restName, season } } return undefined; } const showSxxExxRegex = /\b(s[0-9]+)?(e[0-9]+)((\+e[0-9]+)*)/i; const showSSxEERegex = /(([0-9]+)x([0-9]+))((\+[0-9]+)*)/i; export const findSeasonEpisode = (name: string): {restName?: string, season?: number, episodes: number[]} | undefined => { const seArr = showSxxExxRegex.exec(name); if (!!seArr) { const restName = seArr.index === 0 ? undefined : name.slice(0, seArr.index); const season = seArr[1] ? Number.parseInt(seArr[1].slice(1), 10) : undefined; const episodes = [Number.parseInt(seArr[2].slice(1), 10)].concat(!!seArr[3] ? seArr[3].split('+').map((episode) => Number.parseInt(episode.slice(1), 10)).filter(Number.isInteger) : []); return { restName, season, episodes } } const sxeArr = showSSxEERegex.exec(name); if (!!sxeArr) { const restName = sxeArr.index === 0 ? undefined : name.slice(0, sxeArr.index); const season = Number.parseInt(sxeArr[2], 10); const episodes = [Number.parseInt(sxeArr[3], 10)].concat(!!sxeArr[4] ? sxeArr[4].split('+').map((episode) => Number.parseInt(episode, 10)).filter(Number.isInteger) : []); return { restName, season, episodes } } return undefined; } const episodeRegex = /^([0-9]+)/; const matchEpisode = (name: string, season: number, restName?: string): {restName?: string, episodes: [number]} | undefined => { const episodeArr = episodeRegex.exec(name); if (!!episodeArr) { return { restName, episodes: [Number.parseInt(episodeArr[1], 10)] }; } const index = name.indexOf(season.toString(10)); if (index !== -1) { return matchEpisode(name.slice(index+1), season, (restName || '') + season + name.slice(0, index)) } return undefined; } export const findEpisode = (name: string, season: number): {restName?: string, episodes: number[]} | undefined => { const index = name.indexOf(season.toString(10)); if (index !== -1) { return matchEpisode(name.slice(index+1), season, index === 0 ? undefined : name.slice(0, index)); } return undefined; }