diff --git a/packages/core/src/parser/file.ts b/packages/core/src/parser/file.ts index 41ae51ab..f1656013 100644 --- a/packages/core/src/parser/file.ts +++ b/packages/core/src/parser/file.ts @@ -1,8 +1,8 @@ import { PARSE_REGEX } from './regex.js'; import { ParsedFile } from '../db/schemas.js'; -// import ptt from './ptt.js'; -// import { parseTorrentTitle } from './parse-torrent-title/index.js'; import { parseTorrentTitle } from '@viren070/parse-torrent-title'; +import { FULL_LANGUAGE_MAPPING } from '../utils/languages.js'; +import { LANGUAGES } from '../utils/constants.js'; function matchPattern( filename: string, @@ -22,6 +22,45 @@ function matchMultiplePatterns( .map(([tag]) => tag); } +function mapLanguageCode(code: string): string { + switch (code.toLowerCase()) { + case 'zh-tw': + return 'zh'; + case 'es-419': + return 'es-MX'; + default: + return code; + } +} + +function convertLangCodeToName(code: string): string | undefined { + const parts = code.split('-'); + const possibleLangs = FULL_LANGUAGE_MAPPING.filter((language) => { + if (parts.length === 2) { + return ( + language.iso_639_1?.toLowerCase() === parts[0].toLowerCase() && + language.iso_3166_1?.toLowerCase() === parts[1].toLowerCase() + ); + } else { + return language.iso_639_1?.toLowerCase() === parts[0].toLowerCase(); + } + }); + let chosenLang = + possibleLangs.find((lang) => lang.flag_priority) || possibleLangs[0]; + if (chosenLang) { + const candidateLang = ( + chosenLang.internal_english_name || chosenLang.english_name + ) + .split(/;|\(/)[0] + .trim(); + if (LANGUAGES.includes(candidateLang as any)) { + return candidateLang; + } else { + return undefined; + } + } +} + class FileParser { static parse(filename: string): ParsedFile { const parsed = parseTorrentTitle(filename); @@ -51,10 +90,27 @@ class FileParser { ); const visualTags = matchMultiplePatterns(filename, PARSE_REGEX.visualTags); const audioTags = matchMultiplePatterns(filename, PARSE_REGEX.audioTags); - const languages = matchMultiplePatterns(filename, PARSE_REGEX.languages); + const mapParsedLanguageToKnown = (lang: string): string | undefined => { + switch (lang.toLowerCase()) { + case 'multi audio': + return 'Multi'; + case 'dual audio': + return 'Dual Audio'; + case 'multi subs': + return undefined; + default: + return convertLangCodeToName(mapLanguageCode(lang)); + } + }; - const getPaddedNumber = (number: number, length: number) => - number.toString().padStart(length, '0'); + const languages = [ + ...new Set([ + ...matchMultiplePatterns(filename, PARSE_REGEX.languages), + ...(parsed.languages || []) + .map(mapParsedLanguageToKnown) + .filter((lang): lang is string => !!lang), + ]), + ]; const releaseGroup = filename.match(PARSE_REGEX.releaseGroup)?.[1] ?? parsed.group; diff --git a/packages/frontend/next.config.ts b/packages/frontend/next.config.ts index 52a55c7f..a6eb8455 100644 --- a/packages/frontend/next.config.ts +++ b/packages/frontend/next.config.ts @@ -13,6 +13,8 @@ const nextConfig: NextConfig = { fs: false, './ptt.js': './ptt', './regex.js': './regex', + '../utils/languages.js': '../utils/languages', + '../utils/constants.js': '../utils/constants', }; return config; },