import { PARSE_REGEX } from './regex'; import * as PTT from 'parse-torrent-title'; import { ParsedFile } from '../db'; function matchPattern( filename: string, patterns: Record ): string | undefined { return Object.entries(patterns).find(([_, pattern]) => pattern.test(filename) )?.[0]; } function matchMultiplePatterns( filename: string, patterns: Record ): string[] { return Object.entries(patterns) .filter(([_, pattern]) => pattern.test(filename)) .map(([tag]) => tag); } class FileParser { static parse(filename: string): ParsedFile { const parsed = PTT.parse(filename); // prevent the title from being parsed for info if (parsed.title && parsed.title.length > 4) { filename = filename.replace(parsed.title, '').trim(); filename = filename.replace(/\s+/g, '.').replace(/^\.+|\.+$/g, ''); } const resolution = matchPattern(filename, PARSE_REGEX.resolutions); const quality = matchPattern(filename, PARSE_REGEX.qualities); const encode = matchPattern(filename, PARSE_REGEX.encodes); const audioChannels = matchMultiplePatterns( filename, PARSE_REGEX.audioChannels ); const visualTags = matchMultiplePatterns(filename, PARSE_REGEX.visualTags); const audioTags = matchMultiplePatterns(filename, PARSE_REGEX.audioTags); const languages = matchMultiplePatterns(filename, PARSE_REGEX.languages); const getPaddedNumber = (number: number, length: number) => number.toString().padStart(length, '0'); const releaseGroup = parsed.group; const title = parsed.title; const year = parsed.year ? parsed.year.toString() : undefined; const season = parsed.season; const seasons = parsed.seasons; const episode = parsed.episode; const formattedSeasonString = seasons?.length ? seasons.length === 1 ? `S${getPaddedNumber(seasons[0], 2)}` : `S${getPaddedNumber(seasons[0], 2)}-${getPaddedNumber( seasons[seasons.length - 1], 2 )}` : season ? `S${getPaddedNumber(season, 2)}` : undefined; const formattedEpisodeString = episode ? `E${getPaddedNumber(episode, 2)}` : undefined; const seasonEpisode = [ formattedSeasonString, formattedEpisodeString, ].filter((v) => v !== undefined); return { resolution, quality, languages, encode, audioChannels, audioTags, visualTags, releaseGroup, title, year, season, seasons, episode, seasonEpisode, }; } } export default FileParser;