feat(parser): use parsed languages from parse-torrent-title

This commit is contained in:
Viren070
2025-11-21 22:40:05 +00:00
parent 6a5d38a797
commit 24d36a8ae3
2 changed files with 63 additions and 5 deletions
+61 -5
View File
@@ -1,8 +1,8 @@
import { PARSE_REGEX } from './regex.js'; import { PARSE_REGEX } from './regex.js';
import { ParsedFile } from '../db/schemas.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 { parseTorrentTitle } from '@viren070/parse-torrent-title';
import { FULL_LANGUAGE_MAPPING } from '../utils/languages.js';
import { LANGUAGES } from '../utils/constants.js';
function matchPattern( function matchPattern(
filename: string, filename: string,
@@ -22,6 +22,45 @@ function matchMultiplePatterns(
.map(([tag]) => tag); .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 { class FileParser {
static parse(filename: string): ParsedFile { static parse(filename: string): ParsedFile {
const parsed = parseTorrentTitle(filename); const parsed = parseTorrentTitle(filename);
@@ -51,10 +90,27 @@ class FileParser {
); );
const visualTags = matchMultiplePatterns(filename, PARSE_REGEX.visualTags); const visualTags = matchMultiplePatterns(filename, PARSE_REGEX.visualTags);
const audioTags = matchMultiplePatterns(filename, PARSE_REGEX.audioTags); 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) => const languages = [
number.toString().padStart(length, '0'); ...new Set([
...matchMultiplePatterns(filename, PARSE_REGEX.languages),
...(parsed.languages || [])
.map(mapParsedLanguageToKnown)
.filter((lang): lang is string => !!lang),
]),
];
const releaseGroup = const releaseGroup =
filename.match(PARSE_REGEX.releaseGroup)?.[1] ?? parsed.group; filename.match(PARSE_REGEX.releaseGroup)?.[1] ?? parsed.group;
+2
View File
@@ -13,6 +13,8 @@ const nextConfig: NextConfig = {
fs: false, fs: false,
'./ptt.js': './ptt', './ptt.js': './ptt',
'./regex.js': './regex', './regex.js': './regex',
'../utils/languages.js': '../utils/languages',
'../utils/constants.js': '../utils/constants',
}; };
return config; return config;
}, },