Fix language code matching (ISO639-2 synonyms)

This commit is contained in:
2025-04-13 21:35:20 +00:00
parent bfe40864d8
commit 2033a30ddb

View File

@@ -359,7 +359,8 @@ sealed class CinemaMediaSourceManager : IMediaSourceManager
if (m.subtitles != null && subtitleLang != null)
foreach (StreamSubtitle j in m.subtitles)
if (ISO639_1ToISO639_2(j.language) == subtitleLang)
if (ISO639_1ToISO639_2(j.language).Primary == subtitleLang
|| ISO639_1ToISO639_2(j.language).Synonym == subtitleLang)
{
score += 4; // proper subtitles are preferred but much better resulution still rules
break;
@@ -367,7 +368,8 @@ sealed class CinemaMediaSourceManager : IMediaSourceManager
if (m.audio != null && audioLang != null)
foreach (StreamAudio j in m.audio)
if (ISO639_1ToISO639_2(j.language) == audioLang)
if (ISO639_1ToISO639_2(j.language).Primary == audioLang
|| ISO639_1ToISO639_2(j.language).Synonym == audioLang)
{
score += 25; // proper audio channel overrides resolution and other minor bonuses
break;
@@ -649,7 +651,7 @@ sealed class CinemaMediaSourceManager : IMediaSourceManager
MediaStream a = new MediaStream();
a.Index = -1;
a.Type = MediaStreamType.Subtitle;
a.Language = ISO639_1ToISO639_2(j.language);
a.Language = ISO639_1ToISO639_2(j.language).Primary;
a.IsForced = j.forced;
a.DeliveryUrl = j.src;
a.IsExternalUrl = true;
@@ -705,7 +707,7 @@ sealed class CinemaMediaSourceManager : IMediaSourceManager
MediaStream a = new MediaStream();
a.Index = uniqueId--;
a.Type = MediaStreamType.Audio;
a.Language = ISO639_1ToISO639_2(j.language);
a.Language = ISO639_1ToISO639_2(j.language).Primary;
a.Codec = j.codec;
a.Channels = j.channels;
@@ -721,7 +723,7 @@ sealed class CinemaMediaSourceManager : IMediaSourceManager
MediaStream a = new MediaStream();
a.Index = uniqueId--;
a.Type = MediaStreamType.Subtitle;
a.Language = ISO639_1ToISO639_2(j.language);
a.Language = ISO639_1ToISO639_2(j.language).Primary;
a.IsForced = j.forced;
a.DeliveryUrl = j.src;
a.IsExternalUrl = true;
@@ -904,195 +906,195 @@ sealed class CinemaMediaSourceManager : IMediaSourceManager
/// <summary>
/// Converts two-letter 639-1 language code to three letter 639-2.
/// </summary>
private static string? ISO639_1ToISO639_2(string? twoLetter639_1)
private static (string? Primary, string? Synonym) ISO639_1ToISO639_2(string? twoLetter639_1)
{
// Based on https://www.loc.gov/standards/iso639-2/php/code_list-utf8.php
switch (twoLetter639_1)
{
case "aa": return "aar";
case "ab": return "abk";
case "af": return "afr";
case "ak": return "aka";
case "sq": return "alb";
case "am": return "amh";
case "ar": return "ara";
case "an": return "arg";
case "hy": return "arm";
case "as": return "asm";
case "av": return "ava";
case "ae": return "ave";
case "ay": return "aym";
case "az": return "aze";
case "ba": return "bak";
case "bm": return "bam";
case "eu": return "baq";
case "be": return "bel";
case "bn": return "ben";
case "bi": return "bis";
case "bo": return "tib";
case "bs": return "bos";
case "br": return "bre";
case "bg": return "bul";
case "my": return "bur";
case "ca": return "cat";
case "cs": return "cze";
case "ch": return "cha";
case "ce": return "che";
case "zh": return "chi";
case "cu": return "chu";
case "cv": return "chv";
case "kw": return "cor";
case "co": return "cos";
case "cr": return "cre";
case "cy": return "wel";
case "da": return "dan";
case "de": return "ger";
case "dv": return "div";
case "nl": return "dut";
case "dz": return "dzo";
case "el": return "gre";
case "en": return "eng";
case "eo": return "epo";
case "et": return "est";
case "ee": return "ewe";
case "fo": return "fao";
case "fa": return "per";
case "fj": return "fij";
case "fi": return "fin";
case "fr": return "fre";
case "fy": return "fry";
case "ff": return "ful";
case "ka": return "geo";
case "gd": return "gla";
case "ga": return "gle";
case "gl": return "glg";
case "gv": return "glv";
case "gn": return "grn";
case "gu": return "guj";
case "ht": return "hat";
case "ha": return "hau";
case "he": return "heb";
case "hz": return "her";
case "hi": return "hin";
case "ho": return "hmo";
case "hr": return "hrv";
case "hu": return "hun";
case "ig": return "ibo";
case "is": return "ice";
case "io": return "ido";
case "ii": return "iii";
case "iu": return "iku";
case "ie": return "ile";
case "ia": return "ina";
case "id": return "ind";
case "ik": return "ipk";
case "it": return "ita";
case "jv": return "jav";
case "ja": return "jpn";
case "kl": return "kal";
case "kn": return "kan";
case "ks": return "kas";
case "kr": return "kau";
case "kk": return "kaz";
case "km": return "khm";
case "ki": return "kik";
case "rw": return "kin";
case "ky": return "kir";
case "kv": return "kom";
case "kg": return "kon";
case "ko": return "kor";
case "kj": return "kua";
case "ku": return "kur";
case "lo": return "lao";
case "la": return "lat";
case "lv": return "lav";
case "li": return "lim";
case "ln": return "lin";
case "lt": return "lit";
case "lb": return "ltz";
case "lu": return "lub";
case "lg": return "lug";
case "mk": return "mac";
case "mh": return "mah";
case "ml": return "mal";
case "mi": return "mao";
case "mr": return "mar";
case "ms": return "may";
case "mg": return "mlg";
case "mt": return "mlt";
case "mn": return "mon";
case "na": return "nau";
case "nv": return "nav";
case "nr": return "nbl";
case "nd": return "nde";
case "ng": return "ndo";
case "ne": return "nep";
case "nn": return "nno";
case "nb": return "nob";
case "no": return "nor";
case "ny": return "nya";
case "oc": return "oci";
case "oj": return "oji";
case "or": return "ori";
case "om": return "orm";
case "os": return "oss";
case "pa": return "pan";
case "pi": return "pli";
case "pl": return "pol";
case "pt": return "por";
case "ps": return "pus";
case "qu": return "que";
case "rm": return "roh";
case "ro": return "rum";
case "rn": return "run";
case "ru": return "rus";
case "sg": return "sag";
case "sa": return "san";
case "si": return "sin";
case "sk": return "slo";
case "sl": return "slv";
case "se": return "sme";
case "sm": return "smo";
case "sn": return "sna";
case "sd": return "snd";
case "so": return "som";
case "st": return "sot";
case "es": return "spa";
case "sc": return "srd";
case "sr": return "srp";
case "ss": return "ssw";
case "su": return "sun";
case "sw": return "swa";
case "sv": return "swe";
case "ty": return "tah";
case "ta": return "tam";
case "tt": return "tat";
case "te": return "tel";
case "tg": return "tgk";
case "tl": return "tgl";
case "th": return "tha";
case "ti": return "tir";
case "to": return "ton";
case "tn": return "tsn";
case "ts": return "tso";
case "tk": return "tuk";
case "tr": return "tur";
case "tw": return "twi";
case "ug": return "uig";
case "uk": return "ukr";
case "ur": return "urd";
case "uz": return "uzb";
case "ve": return "ven";
case "vi": return "vie";
case "vo": return "vol";
case "wa": return "wln";
case "wo": return "wol";
case "xh": return "xho";
case "yi": return "yid";
case "yo": return "yor";
case "za": return "zha";
case "zu": return "zul";
default: return twoLetter639_1;
case "aa": return ("aar", null);
case "ab": return ("abk", null);
case "af": return ("afr", null);
case "ak": return ("aka", null);
case "sq": return ("alb", "sqi");
case "am": return ("amh", null);
case "ar": return ("ara", null);
case "an": return ("arg", null);
case "hy": return ("arm", "hye");
case "as": return ("asm", null);
case "av": return ("ava", null);
case "ae": return ("ave", null);
case "ay": return ("aym", null);
case "az": return ("aze", null);
case "ba": return ("bak", null);
case "bm": return ("bam", null);
case "eu": return ("baq", "eus");
case "be": return ("bel", null);
case "bn": return ("ben", null);
case "bi": return ("bis", null);
case "bo": return ("tib", "bod");
case "bs": return ("bos", null);
case "br": return ("bre", null);
case "bg": return ("bul", null);
case "my": return ("bur", "mya");
case "ca": return ("cat", null);
case "cs": return ("cze", "ces");
case "ch": return ("cha", null);
case "ce": return ("che", null);
case "zh": return ("chi", "zho");
case "cu": return ("chu", null);
case "cv": return ("chv", null);
case "kw": return ("cor", null);
case "co": return ("cos", null);
case "cr": return ("cre", null);
case "cy": return ("wel", "cym");
case "da": return ("dan", null);
case "de": return ("ger", "deu");
case "dv": return ("div", null);
case "nl": return ("dut", "nld");
case "dz": return ("dzo", null);
case "el": return ("gre", "ell");
case "en": return ("eng", null);
case "eo": return ("epo", null);
case "et": return ("est", null);
case "ee": return ("ewe", null);
case "fo": return ("fao", null);
case "fa": return ("per", "fas");
case "fj": return ("fij", null);
case "fi": return ("fin", null);
case "fr": return ("fre", "fra");
case "fy": return ("fry", null);
case "ff": return ("ful", null);
case "ka": return ("geo", "kat");
case "gd": return ("gla", null);
case "ga": return ("gle", null);
case "gl": return ("glg", null);
case "gv": return ("glv", null);
case "gn": return ("grn", null);
case "gu": return ("guj", null);
case "ht": return ("hat", null);
case "ha": return ("hau", null);
case "he": return ("heb", null);
case "hz": return ("her", null);
case "hi": return ("hin", null);
case "ho": return ("hmo", null);
case "hr": return ("hrv", null);
case "hu": return ("hun", null);
case "ig": return ("ibo", null);
case "is": return ("ice", "isl");
case "io": return ("ido", null);
case "ii": return ("iii", null);
case "iu": return ("iku", null);
case "ie": return ("ile", null);
case "ia": return ("ina", null);
case "id": return ("ind", null);
case "ik": return ("ipk", null);
case "it": return ("ita", null);
case "jv": return ("jav", null);
case "ja": return ("jpn", null);
case "kl": return ("kal", null);
case "kn": return ("kan", null);
case "ks": return ("kas", null);
case "kr": return ("kau", null);
case "kk": return ("kaz", null);
case "km": return ("khm", null);
case "ki": return ("kik", null);
case "rw": return ("kin", null);
case "ky": return ("kir", null);
case "kv": return ("kom", null);
case "kg": return ("kon", null);
case "ko": return ("kor", null);
case "kj": return ("kua", null);
case "ku": return ("kur", null);
case "lo": return ("lao", null);
case "la": return ("lat", null);
case "lv": return ("lav", null);
case "li": return ("lim", null);
case "ln": return ("lin", null);
case "lt": return ("lit", null);
case "lb": return ("ltz", null);
case "lu": return ("lub", null);
case "lg": return ("lug", null);
case "mk": return ("mac", "mkd");
case "mh": return ("mah", null);
case "ml": return ("mal", null);
case "mi": return ("mao", "mri");
case "mr": return ("mar", null);
case "ms": return ("may", "msa");
case "mg": return ("mlg", null);
case "mt": return ("mlt", null);
case "mn": return ("mon", null);
case "na": return ("nau", null);
case "nv": return ("nav", null);
case "nr": return ("nbl", null);
case "nd": return ("nde", null);
case "ng": return ("ndo", null);
case "ne": return ("nep", null);
case "nn": return ("nno", null);
case "nb": return ("nob", null);
case "no": return ("nor", null);
case "ny": return ("nya", null);
case "oc": return ("oci", null);
case "oj": return ("oji", null);
case "or": return ("ori", null);
case "om": return ("orm", null);
case "os": return ("oss", null);
case "pa": return ("pan", null);
case "pi": return ("pli", null);
case "pl": return ("pol", null);
case "pt": return ("por", null);
case "ps": return ("pus", null);
case "qu": return ("que", null);
case "rm": return ("roh", null);
case "ro": return ("rum", "ron");
case "rn": return ("run", null);
case "ru": return ("rus", null);
case "sg": return ("sag", null);
case "sa": return ("san", null);
case "si": return ("sin", null);
case "sk": return ("slo", "slk");
case "sl": return ("slv", null);
case "se": return ("sme", null);
case "sm": return ("smo", null);
case "sn": return ("sna", null);
case "sd": return ("snd", null);
case "so": return ("som", null);
case "st": return ("sot", null);
case "es": return ("spa", null);
case "sc": return ("srd", null);
case "sr": return ("srp", null);
case "ss": return ("ssw", null);
case "su": return ("sun", null);
case "sw": return ("swa", null);
case "sv": return ("swe", null);
case "ty": return ("tah", null);
case "ta": return ("tam", null);
case "tt": return ("tat", null);
case "te": return ("tel", null);
case "tg": return ("tgk", null);
case "tl": return ("tgl", null);
case "th": return ("tha", null);
case "ti": return ("tir", null);
case "to": return ("ton", null);
case "tn": return ("tsn", null);
case "ts": return ("tso", null);
case "tk": return ("tuk", null);
case "tr": return ("tur", null);
case "tw": return ("twi", null);
case "ug": return ("uig", null);
case "uk": return ("ukr", null);
case "ur": return ("urd", null);
case "uz": return ("uzb", null);
case "ve": return ("ven", null);
case "vi": return ("vie", null);
case "vo": return ("vol", null);
case "wa": return ("wln", null);
case "wo": return ("wol", null);
case "xh": return ("xho", null);
case "yi": return ("yid", null);
case "yo": return ("yor", null);
case "za": return ("zha", null);
case "zu": return ("zul", null);
default: return (twoLetter639_1, null);
}
}