UNPKG

@ctrl/video-filename-parser

Version:
96 lines (95 loc) 3.47 kB
const blurayExp = /\b(M?Blu-?Ray|HDDVD|BD|UHDBD|BDISO|BDMux|BD25|BD50|BR.?DISK|Bluray(1080|720)p?|BD(1080|720)p?)\b/i; export const webdlExp = /\b(WEB[-_. ]DL|HDRIP|WEBDL|WEB-DLMux|NF|APTV|NETFLIX|NetflixU?HD|DSNY|DSNP|HMAX|AMZN|AmazonHD|iTunesHD|MaxdomeHD|WebHD\b|[. ]WEB[. ](?:[xh]26[45]|DD5[. ]1)|\d+0p[. ]WEB[. ]|\b\s\/\sWEB\s\/\s\b|AMZN[. ]WEB[. ])\b/i; export var Source; (function (Source) { Source["BLURAY"] = "BLURAY"; Source["WEBDL"] = "WEBDL"; Source["WEBRIP"] = "WEBRIP"; Source["DVD"] = "DVD"; Source["CAM"] = "CAM"; Source["SCREENER"] = "SCREENER"; Source["PPV"] = "PPV"; Source["TELESYNC"] = "TELESYNC"; Source["TELECINE"] = "TELECINE"; Source["WORKPRINT"] = "WORKPRINT"; Source["TV"] = "TV"; })(Source || (Source = {})); const sourceGroupPatterns = [ { group: 'bluray', regex: blurayExp }, { group: 'webdl', regex: webdlExp }, { group: 'webrip', regex: /\b(WebRip|Web-Rip|WEBCap|WEBMux)\b/i }, { group: 'hdtv', regex: /\b(HDTV)\b/i }, { group: 'bdrip', regex: /\b(BDRip|UHDBDRip|HD[-_. ]?DVDRip)\b/i }, { group: 'brrip', regex: /\b(BRRip)\b/i }, { group: 'scr', regex: /\b(SCR|SCREENER|DVDSCR|(DVD|WEB).?SCREENER)\b/i }, { group: 'dvdr', regex: /\b(DVD-R|DVDR)\b/i }, { group: 'dvd', regex: /\b(DVD9?|DVDRip|NTSC|PAL|xvidvd|DvDivX)\b/i }, { group: 'dsr', regex: /\b(WS[-_. ]DSR|DSR)\b/i }, { group: 'regional', regex: /\b(R[0-9]{1}|REGIONAL)\b/i }, { group: 'ppv', regex: /\b(PPV)\b/i }, { group: 'ts', regex: /\b(TS|TELESYNC|HD-TS|HDTS|PDVD|TSRip|HDTSRip)\b/i }, { group: 'tc', regex: /\b(TC|TELECINE|HD-TC|HDTC)\b/i }, { group: 'cam', regex: /\b(CAMRIP|CAM|HDCAM|HD-CAM)\b/i }, { group: 'workprint', regex: /\b(WORKPRINT|WP)\b/i }, { group: 'pdtv', regex: /\b(PDTV)\b/i }, { group: 'sdtv', regex: /\b(SDTV)\b/i }, { group: 'tvrip', regex: /\b(TVRip)\b/i }, ]; const sourcePolicies = [ { source: Source.BLURAY, matches: groups => groups.bluray || groups.bdrip || groups.brrip, }, { source: Source.WEBRIP, matches: groups => groups.webrip, }, { source: Source.WEBDL, matches: groups => !groups.webrip && groups.webdl, }, { source: Source.DVD, matches: groups => groups.dvdr || (groups.dvd && !groups.scr), }, { source: Source.PPV, matches: groups => groups.ppv, }, { source: Source.WORKPRINT, matches: groups => groups.workprint, }, { source: Source.TV, matches: groups => groups.pdtv || groups.sdtv || groups.dsr || groups.tvrip || groups.hdtv, }, { source: Source.CAM, matches: groups => groups.cam, }, { source: Source.TELESYNC, matches: groups => groups.ts, }, { source: Source.TELECINE, matches: groups => groups.tc, }, { source: Source.SCREENER, matches: groups => groups.scr, }, ]; export function parseSourceGroups(title) { const normalizedName = title .replaceAll('_', ' ') .replaceAll('[', ' ') .replaceAll(']', ' ') .trim(); return Object.fromEntries(sourceGroupPatterns.map(({ group, regex }) => [group, regex.test(normalizedName)])); } export function parseSource(title, groups) { groups ??= parseSourceGroups(title); return sourcePolicies.filter(({ matches }) => matches(groups)).map(({ source }) => source); }