101 lines
3.1 KiB
JavaScript
101 lines
3.1 KiB
JavaScript
const { parse } = require('parse-torrent-title');
|
|
const { isExtension } = require("./extension");
|
|
const { Providers } = require("./filter");
|
|
const { languageFromCode } = require("./languages");
|
|
|
|
const languageMapping = {
|
|
'english': 'eng',
|
|
'japanese': 'jpn',
|
|
'russian': 'rus',
|
|
'italian': 'ita',
|
|
'portuguese': 'por',
|
|
'spanish': 'spa',
|
|
'latino': 'lat',
|
|
'korean': 'kor',
|
|
'chinese': 'zho',
|
|
'taiwanese': 'zht',
|
|
'french': 'fre',
|
|
'german': 'ger',
|
|
'dutch': 'dut',
|
|
'hindi': 'hin ',
|
|
'telugu': 'tel',
|
|
'tamil': 'tam',
|
|
'polish': 'pol',
|
|
'lithuanian': 'lit',
|
|
'latvian': 'lav',
|
|
'estonian': 'est',
|
|
'czech': 'cze',
|
|
'slovakian': 'slo',
|
|
'slovenian': 'slv',
|
|
'hungarian': 'hun',
|
|
'romanian': 'rum',
|
|
'bulgarian': 'bul',
|
|
'serbian': 'scc',
|
|
'croatian': 'hrv',
|
|
'ukrainian': 'ukr',
|
|
'greek': 'ell',
|
|
'danish': 'dan',
|
|
'finnish': 'fin',
|
|
'swedish': 'swe',
|
|
'norwegian': 'nor',
|
|
'turkish': 'tur',
|
|
'arabic': 'ara',
|
|
'persian': 'per',
|
|
'hebrew': 'heb',
|
|
'vietnamese': 'vie',
|
|
'indonesian': 'ind',
|
|
'thai': 'tha'
|
|
}
|
|
|
|
const ignoreSet = new Set(['dubbed', 'multi audio', 'multi subs', 'dual audio']);
|
|
const allowedExtensions = ['srt', 'vtt', 'ass', 'ssa'];
|
|
|
|
function getSubtitles(record) {
|
|
if (!record.subtitles || !record.subtitles.length) {
|
|
return null;
|
|
}
|
|
return record.subtitles
|
|
.filter(subtitle => isExtension(subtitle.title, allowedExtensions))
|
|
.sort((a, b) => b.size - a.size)
|
|
.map(subtitle => ({
|
|
infoHash: subtitle.infoHash,
|
|
fileIndex: subtitle.fileIndex,
|
|
title: subtitle.title,
|
|
lang: parseLanguage(subtitle.title, record),
|
|
}));
|
|
}
|
|
|
|
function parseLanguage(title, record) {
|
|
const subtitlePathParts = title.split('/');
|
|
const subtitleFileName = subtitlePathParts.pop();
|
|
const subtitleTitleNoExt = title.replace(/\.\w{2,5}$/, '');
|
|
const videoFileName = record.title.split('/').pop().replace(/\.\w{2,5}$/, '');
|
|
const fileNameLanguage = getSingleLanguage(subtitleFileName.replace(videoFileName, ''));
|
|
if (fileNameLanguage) {
|
|
return fileNameLanguage;
|
|
}
|
|
const videoTitleNoExt = record.title.replace(/\.\w{2,5}$/, '');
|
|
if (subtitleTitleNoExt === record.title || subtitleTitleNoExt === videoTitleNoExt) {
|
|
const provider = Providers.options.find(provider => provider.label === record.torrent.provider);
|
|
return provider?.foreign && languageFromCode(provider.foreign) || 'eng';
|
|
}
|
|
const folderName = subtitlePathParts.join('/');
|
|
const folderNameLanguage = getSingleLanguage(folderName.replace(videoFileName, ''));
|
|
if (folderNameLanguage) {
|
|
return folderNameLanguage
|
|
}
|
|
return getFileNameLanguageCode(subtitleFileName) || 'Unknown';
|
|
}
|
|
|
|
function getSingleLanguage(title) {
|
|
const parsedInfo = parse(title);
|
|
const languages = (parsedInfo.languages || []).filter(language => !ignoreSet.has(language));
|
|
return languages.length === 1 ? languageMapping[languages[0]] : undefined;
|
|
}
|
|
|
|
function getFileNameLanguageCode(fileName) {
|
|
const match = fileName.match(/(?:(?:^|[._ ])([A-Za-z][a-z]{1,2})|\[([a-z]{2,3})])\.\w{3,4}$/);
|
|
return match && match[1].toLowerCase();
|
|
}
|
|
|
|
module.exports = { getSubtitles } |