use centralized language map

This commit is contained in:
Pas 2025-08-03 16:13:31 -06:00
parent 401f38a9d5
commit 64078d8466
4 changed files with 84 additions and 141 deletions

View file

@ -30,6 +30,79 @@ export function getCaptionTypeFromUrl(url: string): CaptionType | null {
}
export function labelToLanguageCode(label: string): string | null {
// extra language codes
const languageMap: Record<string, string> = {
'chinese - hong kong': 'zh',
'chinese - traditional': 'zh',
czech: 'cs',
danish: 'da',
dutch: 'nl',
english: 'en',
'english - sdh': 'en',
finnish: 'fi',
french: 'fr',
german: 'de',
greek: 'el',
hungarian: 'hu',
italian: 'it',
korean: 'ko',
norwegian: 'no',
polish: 'pl',
portuguese: 'pt',
'portuguese - brazilian': 'pt',
romanian: 'ro',
'spanish - european': 'es',
'spanish - latin american': 'es',
spanish: 'es',
swedish: 'sv',
turkish: 'tr',
اَلْعَرَبِيَّةُ: 'ar',
: 'bn',
filipino: 'tl',
indonesia: 'id',
اردو: 'ur',
English: 'en',
Arabic: 'ar',
Bosnian: 'bs',
Bulgarian: 'bg',
Croatian: 'hr',
Czech: 'cs',
Danish: 'da',
Dutch: 'nl',
Estonian: 'et',
Finnish: 'fi',
French: 'fr',
German: 'de',
Greek: 'el',
Hebrew: 'he',
Hungarian: 'hu',
Indonesian: 'id',
Italian: 'it',
Norwegian: 'no',
Persian: 'fa',
Polish: 'pl',
Portuguese: 'pt',
'Protuguese (BR)': 'pt-br',
Romanian: 'ro',
Russian: 'ru',
russian: 'ru',
Serbian: 'sr',
Slovenian: 'sl',
Spanish: 'es',
Swedish: 'sv',
Thai: 'th',
Turkish: 'tr',
// Simple language codes
ng: 'en',
re: 'fr',
pa: 'es',
};
// First try our mapping
const mappedCode = languageMap[label.toLowerCase()];
if (mappedCode) return mappedCode;
// Fallback to ISO6391 library
const code = ISO6391.getCode(label);
if (code.length === 0) return null;
return code;

View file

@ -1,73 +1,11 @@
import { flags } from '@/entrypoint/utils/targets';
import { EmbedOutput, makeEmbed } from '@/providers/base';
import { labelToLanguageCode } from '@/providers/captions';
import { NotFoundError } from '@/utils/errors';
import { createM3U8ProxyUrl } from '@/utils/proxy';
const BaseUrl = 'https://player.vidzee.wtf/api/server';
const languageMap: Record<string, string> = {
'chinese - hong kong': 'zh',
'chinese - traditional': 'zh',
czech: 'cs',
danish: 'da',
dutch: 'nl',
english: 'en',
'english - sdh': 'en',
finnish: 'fi',
french: 'fr',
german: 'de',
greek: 'el',
hungarian: 'hu',
italian: 'it',
korean: 'ko',
norwegian: 'no',
polish: 'pl',
portuguese: 'pt',
'portuguese - brazilian': 'pt',
romanian: 'ro',
'spanish - european': 'es',
'spanish - latin american': 'es',
spanish: 'es',
swedish: 'sv',
turkish: 'tr',
اَلْعَرَبِيَّةُ: 'ar',
: 'bn',
filipino: 'tl',
indonesia: 'id',
اردو: 'ur',
English: 'en',
Arabic: 'ar',
Bosnian: 'bs',
Bulgarian: 'bg',
Croatian: 'hr',
Czech: 'cs',
Danish: 'da',
Dutch: 'nl',
Estonian: 'et',
Finnish: 'fi',
French: 'fr',
German: 'de',
Greek: 'el',
Hebrew: 'he',
Hungarian: 'hu',
Indonesian: 'id',
Italian: 'it',
Norwegian: 'no',
Persian: 'fa',
Polish: 'pl',
Portuguese: 'pt',
'Protuguese (BR)': 'pt-br',
Romanian: 'ro',
Russian: 'ru',
russian: 'ru',
Serbian: 'sr',
Slovenian: 'sl',
Spanish: 'es',
Swedish: 'sv',
Thai: 'th',
Turkish: 'tr',
};
export const vidzeeServer1Embed = makeEmbed({
id: 'vidzee-server1',
name: 'Server 1',
@ -100,12 +38,11 @@ export const vidzeeServer1Embed = makeEmbed({
const captions =
data.tracks?.map((track: { lang: string; url: string }, i: number) => {
const languageBase = track.lang.toLowerCase();
return {
id: i,
type: 'vtt',
url: track.url,
language: languageMap[languageBase] || 'unknown',
language: labelToLanguageCode(track.lang) || 'unknown',
};
}) || [];
@ -160,12 +97,11 @@ export const vidzeeServer2Embed = makeEmbed({
const captions =
data.tracks?.map((track: { lang: string; url: string }, i: number) => {
const languageBase = track.lang.toLowerCase();
return {
id: i,
type: 'vtt',
url: track.url,
language: languageMap[languageBase] || 'unknown',
language: labelToLanguageCode(track.lang) || 'unknown',
};
}) || [];

View file

@ -2,6 +2,7 @@ import { load } from 'cheerio';
import { flags } from '@/entrypoint/utils/targets';
import { SourcererOutput, makeSourcerer } from '@/providers/base';
import { labelToLanguageCode } from '@/providers/captions';
import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context';
import { NotFoundError } from '@/utils/errors';
@ -27,17 +28,11 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis
const encodedUrl = proxyUrl.searchParams.get('url') || '';
const playlist = decodeURIComponent(encodedUrl);
const isoLanguageMap: Record<string, string> = {
ng: 'en',
re: 'fr',
pa: 'es',
};
const captions = $('media-provider track')
.map((_, el) => {
const url = $(el).attr('src') || '';
const rawLang = $(el).attr('lang') || 'unknown';
const languageCode = isoLanguageMap[rawLang] || rawLang;
const languageCode = labelToLanguageCode(rawLang) || rawLang;
const isVtt = url.endsWith('.vtt') ? 'vtt' : 'srt';
return {

View file

@ -79,81 +79,20 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext): Pr
const streamResJson: InfoResponse = JSON.parse(streamRes);
const languageMap: Record<string, string> = {
'chinese - hong kong': 'zh',
'chinese - traditional': 'zh',
czech: 'cs',
danish: 'da',
dutch: 'nl',
english: 'en',
'english - sdh': 'en',
finnish: 'fi',
french: 'fr',
german: 'de',
greek: 'el',
hungarian: 'hu',
italian: 'it',
korean: 'ko',
norwegian: 'no',
polish: 'pl',
portuguese: 'pt',
'portuguese - brazilian': 'pt',
romanian: 'ro',
'spanish - european': 'es',
'spanish - latin american': 'es',
swedish: 'sv',
turkish: 'tr',
اَلْعَرَبِيَّةُ: 'ar',
: 'bn',
filipino: 'tl',
indonesia: 'id',
اردو: 'ur',
English: 'en',
Arabic: 'ar',
Bosnian: 'bs',
Bulgarian: 'bg',
Croatian: 'hr',
Czech: 'cs',
Danish: 'da',
Dutch: 'nl',
Estonian: 'et',
Finnish: 'fi',
French: 'fr',
German: 'de',
Greek: 'el',
Hebrew: 'he',
Hungarian: 'hu',
Indonesian: 'id',
Italian: 'it',
Norwegian: 'no',
Persian: 'fa',
Polish: 'pl',
Portuguese: 'pt',
'Protuguese (BR)': 'pt-br',
Romanian: 'ro',
Russian: 'ru',
Serbian: 'sr',
Slovenian: 'sl',
Spanish: 'es',
Swedish: 'sv',
Thai: 'th',
Turkish: 'tr',
};
const captions: Caption[] = [];
if (Array.isArray(streamResJson.subs)) {
for (const sub of streamResJson.subs) {
// Some subtitles are named <Language>.srt, some are named <LanguageCode>:hi, or just <LanguageCode>
let language: string | null = '';
if (sub.name.includes('.srt')) {
const langName = sub.name.split('.srt')[0].toLowerCase().trim();
language = languageMap[langName] || labelToLanguageCode(langName);
const langName = sub.name.split('.srt')[0].trim();
language = labelToLanguageCode(langName);
} else if (sub.name.includes(':')) {
const langName = sub.name.split(':')[0].toLowerCase().trim();
language = languageMap[langName] || labelToLanguageCode(langName);
const langName = sub.name.split(':')[0].trim();
language = labelToLanguageCode(langName);
} else {
const langName = sub.name.toLowerCase().trim();
language = languageMap[langName] || labelToLanguageCode(langName);
const langName = sub.name.trim();
language = labelToLanguageCode(langName);
}
if (!language) continue;