identify-media
Version:
Analyse file path and content to make search criteria for media APIs
107 lines (87 loc) • 3.5 kB
text/typescript
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;
}