From ec43dfce701a5afe9e7c52e2a9d5eb886d3d951e Mon Sep 17 00:00:00 2001
From: nilaoda <nilaoda@live.com>
Date: Fri, 2 Dec 2022 22:09:42 +0800
Subject: [PATCH] =?UTF-8?q?=E8=AF=AD=E8=A8=80=E6=A0=87=E7=AD=BE=E8=AF=86?=
 =?UTF-8?q?=E5=88=AB=E5=85=A8=E9=83=A8=E6=9C=AC=E5=9C=B0=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../DownloadManager/SimpleDownloadManager.cs  |   3 +-
 .../SimpleLiveRecordManager2.cs               |   3 +-
 src/N_m3u8DL-RE/Entity/OutputFile.cs          |   4 +-
 src/N_m3u8DL-RE/Util/LanguageCodeUtil.cs      | 546 ++++++++++++++++++
 src/N_m3u8DL-RE/Util/MergeUtil.cs             |  72 +--
 5 files changed, 555 insertions(+), 73 deletions(-)
 create mode 100644 src/N_m3u8DL-RE/Util/LanguageCodeUtil.cs

diff --git a/src/N_m3u8DL-RE/DownloadManager/SimpleDownloadManager.cs b/src/N_m3u8DL-RE/DownloadManager/SimpleDownloadManager.cs
index 1f2fa29..facc79a 100644
--- a/src/N_m3u8DL-RE/DownloadManager/SimpleDownloadManager.cs
+++ b/src/N_m3u8DL-RE/DownloadManager/SimpleDownloadManager.cs
@@ -621,7 +621,8 @@ namespace N_m3u8DL_RE.DownloadManager
                     FilePath = output,
                     LangCode = streamSpec.Language,
                     Description = streamSpec.Name,
-                    Mediainfos = mediaInfos
+                    Mediainfos = mediaInfos,
+                    MediaType = streamSpec.MediaType,
                 });
 
             return true;
diff --git a/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs b/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs
index 3e9a360..8e47833 100644
--- a/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs
+++ b/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs
@@ -620,7 +620,8 @@ namespace N_m3u8DL_RE.DownloadManager
                     FilePath = fileOutputStream.Name,
                     LangCode = streamSpec.Language,
                     Description = streamSpec.Name,
-                    Mediainfos = mediaInfos
+                    Mediainfos = mediaInfos,
+                    MediaType = streamSpec.MediaType,
                 });
                 fileOutputStream.Close();
                 fileOutputStream.Dispose();
diff --git a/src/N_m3u8DL-RE/Entity/OutputFile.cs b/src/N_m3u8DL-RE/Entity/OutputFile.cs
index 66f3cb2..cc37050 100644
--- a/src/N_m3u8DL-RE/Entity/OutputFile.cs
+++ b/src/N_m3u8DL-RE/Entity/OutputFile.cs
@@ -1,4 +1,5 @@
-using System;
+using N_m3u8DL_RE.Common.Enum;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -8,6 +9,7 @@ namespace N_m3u8DL_RE.Entity
 {
     internal class OutputFile
     {
+        public MediaType? MediaType { get; set; }
         public required int Index { get; set; }
         public required string FilePath { get; set; }
         public string? LangCode { get; set; }
diff --git a/src/N_m3u8DL-RE/Util/LanguageCodeUtil.cs b/src/N_m3u8DL-RE/Util/LanguageCodeUtil.cs
new file mode 100644
index 0000000..d8263d5
--- /dev/null
+++ b/src/N_m3u8DL-RE/Util/LanguageCodeUtil.cs
@@ -0,0 +1,546 @@
+using N_m3u8DL_RE.Entity;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace N_m3u8DL_RE.Util
+{
+    class Language
+    {
+        public string Code;
+        public string ExtendCode;
+        public string Description;
+        public string DescriptionAudio;
+
+        public Language(string extendCode, string code, string desc, string descA)
+        {
+            Code = code;
+            ExtendCode = extendCode;
+            Description = desc;
+            DescriptionAudio = descA;
+        }
+    }
+
+    internal class LanguageCodeUtil
+    {
+        private LanguageCodeUtil() { }
+
+        private readonly static List<Language> ALL_LANGS = @"
+af;afr;Afrikaans;Afrikaans
+af-ZA;afr;Afrikaans (South Africa);Afrikaans (South Africa)
+am;amh;Amharic;Amharic
+am-ET;amh;Amharic (Ethiopia);Amharic (Ethiopia)
+ar;ara;Arabic;Arabic
+ar-SA;ara;Arabic (Saudi Arabia);Arabic (Saudi Arabia)
+ar-IQ;ara;Arabic (Iraq);Arabic (Iraq)
+ar-EG;ara;Arabic (Egypt);Arabic (Egypt)
+ar-LY;ara;Arabic (Libya);Arabic (Libya)
+ar-DZ;ara;Arabic (Algeria);Arabic (Algeria)
+ar-MA;ara;Arabic (Morocco);Arabic (Morocco)
+ar-TN;ara;Arabic (Tunisia);Arabic (Tunisia)
+ar-OM;ara;Arabic (Oman);Arabic (Oman)
+ar-YE;ara;Arabic (Yemen);Arabic (Yemen)
+ar-SY;ara;Arabic (Syria);Arabic (Syria)
+ar-JO;ara;Arabic (Jordan);Arabic (Jordan)
+ar-LB;ara;Arabic (Lebanon);Arabic (Lebanon)
+ar-KW;ara;Arabic (Kuwait);Arabic (Kuwait)
+ar-AE;ara;Arabic (United Arab Emirates);Arabic (United Arab Emirates)
+ar-BH;ara;Arabic (Bahrain);Arabic (Bahrain)
+ar-QA;ara;Arabic (Qatar);Arabic (Qatar)
+as;asm;Assamese;Assamese
+as-IN;asm;Assamese (India);Assamese (India)
+az;aze;Azerbaijani;Azerbaijani
+az-Latn-AZ;aze;Azerbaijani (Latin, Azerbaijan);Azerbaijani (Latin, Azerbaijan)
+az-Cyrl-AZ;aze;Azerbaijani (Cyrillic, Azerbaijan);Azerbaijani (Cyrillic, Azerbaijan)
+az-Cyrl;aze;Azerbaijani (Cyrillic);Azerbaijani (Cyrillic)
+az-Latn;aze;Azerbaijani (Latin);Azerbaijani (Latin)
+be;bel;Belarusian;Belarusian
+be-BY;bel;Belarusian (Belarus);Belarusian (Belarus)
+bg;bul;Bulgarian;Bulgarian
+bg-BG;bul;Bulgarian (Bulgaria);Bulgarian (Bulgaria)
+bn;ben;Bangla;Bangla
+bn-IN;ben;Bangla (India);Bangla (India)
+bn-BD;ben;Bangla (Bangladesh);Bangla (Bangladesh)
+bo;bod;Tibetan;Tibetan
+bo-CN;bod;Tibetan (China);Tibetan (China)
+br;bre;Breton;Breton
+br-FR;bre;Breton (France);Breton (France)
+bs-Latn-BA;bos;Bosnian (Latin, Bosnia & Herzegovina);Bosnian (Latin, Bosnia & Herzegovina)
+bs-Cyrl-BA;bos;Bosnian (Cyrillic, Bosnia & Herzegovina);Bosnian (Cyrillic, Bosnia & Herzegovina)
+bs-Cyrl;bos;Bosnian (Cyrillic);Bosnian (Cyrillic)
+bs-Latn;bos;Bosnian (Latin);Bosnian (Latin)
+bs;bos;Bosnian;Bosnian
+ca;cat;Catalan;Catalan
+ca-ES;cat;Catalan (Spain);Catalan (Spain)
+ca-ES-valencia;cat;Catalan (Spain);Catalan (Spain)
+chr;chr;Cherokee;Cherokee
+cs;ces;Czech;Czech
+cs-CZ;ces;Czech (Czech Republic);Czech (Czech Republic)
+cy;cym;Welsh;Welsh
+cy-GB;cym;Welsh (United Kingdom);Welsh (United Kingdom)
+da;dan;Danish;Danish
+da-DK;dan;Danish (Denmark);Danish (Denmark)
+de;deu;German;German
+de-DE;deu;German (Germany);German (Germany)
+de-CH;deu;German (Switzerland);German (Switzerland)
+de-AT;deu;German (Austria);German (Austria)
+de-LU;deu;German (Luxembourg);German (Luxembourg)
+de-LI;deu;German (Liechtenstein);German (Liechtenstein)
+dsb-DE;dsb;Lower Sorbian (Germany);Lower Sorbian (Germany)
+dsb;dsb;Lower Sorbian;Lower Sorbian
+el;ell;Greek;Greek
+el-GR;ell;Greek (Greece);Greek (Greece)
+en;eng;English;English
+en-US;eng;English (United States);English (United States)
+en-GB;eng;English (United Kingdom);English (United Kingdom)
+en-AU;eng;English (Australia);English (Australia)
+en-CA;eng;English (Canada);English (Canada)
+en-NZ;eng;English (New Zealand);English (New Zealand)
+en-IE;eng;English (Ireland);English (Ireland)
+en-ZA;eng;English (South Africa);English (South Africa)
+en-JM;eng;English (Jamaica);English (Jamaica)
+en-BZ;eng;English (Belize);English (Belize)
+en-TT;eng;English (Trinidad & Tobago);English (Trinidad & Tobago)
+en-ZW;eng;English (Zimbabwe);English (Zimbabwe)
+en-PH;eng;English (Philippines);English (Philippines)
+en-HK;eng;English (Hong Kong SAR China);English (Hong Kong SAR China)
+en-IN;eng;English (India);English (India)
+en-MY;eng;English (Malaysia);English (Malaysia)
+en-SG;eng;English (Singapore);English (Singapore)
+es;spa;Spanish;Spanish
+es-MX;spa;Spanish (Mexico);Spanish (Mexico)
+es-ES;spa;Spanish (Spain);Spanish (Spain)
+es-GT;spa;Spanish (Guatemala);Spanish (Guatemala)
+es-CR;spa;Spanish (Costa Rica);Spanish (Costa Rica)
+es-PA;spa;Spanish (Panama);Spanish (Panama)
+es-DO;spa;Spanish (Dominican Republic);Spanish (Dominican Republic)
+es-VE;spa;Spanish (Venezuela);Spanish (Venezuela)
+es-CO;spa;Spanish (Colombia);Spanish (Colombia)
+es-PE;spa;Spanish (Peru);Spanish (Peru)
+es-AR;spa;Spanish (Argentina);Spanish (Argentina)
+es-EC;spa;Spanish (Ecuador);Spanish (Ecuador)
+es-CL;spa;Spanish (Chile);Spanish (Chile)
+es-UY;spa;Spanish (Uruguay);Spanish (Uruguay)
+es-PY;spa;Spanish (Paraguay);Spanish (Paraguay)
+es-BO;spa;Spanish (Bolivia);Spanish (Bolivia)
+es-SV;spa;Spanish (El Salvador);Spanish (El Salvador)
+es-HN;spa;Spanish (Honduras);Spanish (Honduras)
+es-NI;spa;Spanish (Nicaragua);Spanish (Nicaragua)
+es-PR;spa;Spanish (Puerto Rico);Spanish (Puerto Rico)
+es-US;spa;Spanish (United States);Spanish (United States)
+es-CU;spa;Spanish (Cuba);Spanish (Cuba)
+et;est;Estonian;Estonian
+et-EE;est;Estonian (Estonia);Estonian (Estonia)
+eu;eus;Basque;Basque
+eu-ES;eus;Basque (Spain);Basque (Spain)
+fa;fas;Persian;Persian
+fa-IR;fas;Persian (Iran);Persian (Iran)
+ff;ful;Fulah;Fulah
+fi;fin;Finnish;Finnish
+fi-FI;fin;Finnish (Finland);Finnish (Finland)
+fil;fil;Filipino;Filipino
+fil-PH;fil;Filipino (Philippines);Filipino (Philippines)
+fo;fao;Faroese;Faroese
+fo-FO;fao;Faroese (Faroe Islands);Faroese (Faroe Islands)
+fr;fra;French;French
+fr-FR;fra;French (France);French (France)
+fr-BE;fra;French (Belgium);French (Belgium)
+fr-CA;fra;French (Canada);French (Canada)
+fr-CH;fra;French (Switzerland);French (Switzerland)
+fr-LU;fra;French (Luxembourg);French (Luxembourg)
+fr-MC;fra;French (Monaco);French (Monaco)
+fr-RE;fra;French (Réunion);French (Réunion)
+fr-CD;fra;French (Congo - Kinshasa);French (Congo - Kinshasa)
+fr-SN;fra;French (Senegal);French (Senegal)
+fr-CM;fra;French (Cameroon);French (Cameroon)
+fr-CI;fra;French (Côte d’Ivoire);French (Côte d’Ivoire)
+fr-ML;fra;French (Mali);French (Mali)
+fr-MA;fra;French (Morocco);French (Morocco)
+fr-HT;fra;French (Haiti);French (Haiti)
+fy;fry;Western Frisian;Western Frisian
+fy-NL;fry;Western Frisian (Netherlands);Western Frisian (Netherlands)
+ga;gle;Irish;Irish
+ga-IE;gle;Irish (Ireland);Irish (Ireland)
+gd;gla;Scottish Gaelic;Scottish Gaelic
+gd-GB;gla;Scottish Gaelic (United Kingdom);Scottish Gaelic (United Kingdom)
+gl;glg;Galician;Galician
+gl-ES;glg;Galician (Spain);Galician (Spain)
+gsw;gsw;Swiss German;Swiss German
+gsw-FR;gsw;Swiss German (France);Swiss German (France)
+gu;guj;Gujarati;Gujarati
+gu-IN;guj;Gujarati (India);Gujarati (India)
+ha;hau;Hausa;Hausa
+ha-Latn-NG;hau;Hausa (Latin, Nigeria);Hausa (Latin, Nigeria)
+ha-Latn;hau;Hausa (Latin);Hausa (Latin)
+haw;haw;Hawaiian;Hawaiian
+haw-US;haw;Hawaiian (United States);Hawaiian (United States)
+he;heb;Hebrew;Hebrew
+he-IL;heb;Hebrew (Israel);Hebrew (Israel)
+hi;hin;Hindi;Hindi
+hi-IN;hin;Hindi (India);Hindi (India)
+hr;hrv;Croatian;Croatian
+hr-HR;hrv;Croatian (Croatia);Croatian (Croatia)
+hr-BA;hrv;Croatian (Bosnia & Herzegovina);Croatian (Bosnia & Herzegovina)
+hsb;hsb;Upper Sorbian;Upper Sorbian
+hsb-DE;hsb;Upper Sorbian (Germany);Upper Sorbian (Germany)
+hu;hun;Hungarian;Hungarian
+hu-HU;hun;Hungarian (Hungary);Hungarian (Hungary)
+hy;hye;Armenian;Armenian
+hy-AM;hye;Armenian (Armenia);Armenian (Armenia)
+id;ind;Indonesian;Indonesian
+id-ID;ind;Indonesian (Indonesia);Indonesian (Indonesia)
+ig;ibo;Igbo;Igbo
+ig-NG;ibo;Igbo (Nigeria);Igbo (Nigeria)
+ii;iii;Sichuan Yi;Sichuan Yi
+ii-CN;iii;Sichuan Yi (China);Sichuan Yi (China)
+is;isl;Icelandic;Icelandic
+is-IS;isl;Icelandic (Iceland);Icelandic (Iceland)
+it;ita;Italian;Italian
+it-IT;ita;Italian (Italy);Italian (Italy)
+it-CH;ita;Italian (Switzerland);Italian (Switzerland)
+ja;jpn;Japanese;Japanese
+ja-JP;jpn;Japanese (Japan);Japanese (Japan)
+ka;kat;Georgian;Georgian
+ka-GE;kat;Georgian (Georgia);Georgian (Georgia)
+kk;kaz;Kazakh;Kazakh
+kk-KZ;kaz;Kazakh (Kazakhstan);Kazakh (Kazakhstan)
+kl;kal;Kalaallisut;Kalaallisut
+kl-GL;kal;Kalaallisut (Greenland);Kalaallisut (Greenland)
+km;khm;Khmer;Khmer
+km-KH;khm;Khmer (Cambodia);Khmer (Cambodia)
+kn;kan;Kannada;Kannada
+kn-IN;kan;Kannada (India);Kannada (India)
+ko;kor;Korean;Korean
+ko-KR;kor;Korean (South Korea);Korean (South Korea)
+kok;kok;Konkani;Konkani
+kok-IN;kok;Konkani (India);Konkani (India)
+ky;kir;Kyrgyz;Kyrgyz
+ky-KG;kir;Kyrgyz (Kyrgyzstan);Kyrgyz (Kyrgyzstan)
+lb;ltz;Luxembourgish;Luxembourgish
+lb-LU;ltz;Luxembourgish (Luxembourg);Luxembourgish (Luxembourg)
+lo;lao;Lao;Lao
+lo-LA;lao;Lao (Laos);Lao (Laos)
+lt;lit;Lithuanian;Lithuanian
+lt-LT;lit;Lithuanian (Lithuania);Lithuanian (Lithuania)
+lv;lav;Latvian;Latvian
+lv-LV;lav;Latvian (Latvia);Latvian (Latvia)
+mk;mkd;Macedonian;Macedonian
+mk-MK;mkd;Macedonian (Macedonia);Macedonian (Macedonia)
+ml;mal;Malayalam;Malayalam
+ml-IN;mal;Malayalam (India);Malayalam (India)
+mn;mon;Mongolian;Mongolian
+mn-MN;mon;Mongolian (Mongolia);Mongolian (Mongolia)
+mn-Cyrl;mon;Mongolian (Cyrillic);Mongolian (Cyrillic)
+mr;mar;Marathi;Marathi
+mr-IN;mar;Marathi (India);Marathi (India)
+ms;msa;Malay;Malay
+ms-MY;msa;Malay (Malaysia);Malay (Malaysia)
+ms-BN;msa;Malay (Brunei);Malay (Brunei)
+mt;mlt;Maltese;Maltese
+mt-MT;mlt;Maltese (Malta);Maltese (Malta)
+my;mya;Burmese;Burmese
+my-MM;mya;Burmese (Myanmar (Burma));Burmese (Myanmar (Burma))
+no;nob;Norwegian;Norwegian
+nb-NO;nob;Norwegian Bokmål (Norway);Norwegian Bokmål (Norway)
+nb;nob;Norwegian Bokmål;Norwegian Bokmål
+ne;nep;Nepali;Nepali
+ne-NP;nep;Nepali (Nepal);Nepali (Nepal)
+ne-IN;nep;Nepali (India);Nepali (India)
+nl;nld;Dutch;Dutch
+nl-NL;nld;Dutch (Netherlands);Dutch (Netherlands)
+nl-BE;nld;Dutch (Belgium);Dutch (Belgium)
+nn-NO;nno;Norwegian Nynorsk (Norway);Norwegian Nynorsk (Norway)
+nn;nno;Norwegian Nynorsk;Norwegian Nynorsk
+nso;nso;Northern Sotho;Northern Sotho
+nso-ZA;nso;Northern Sotho (South Africa);Northern Sotho (South Africa)
+om;orm;Oromo;Oromo
+om-ET;orm;Oromo (Ethiopia);Oromo (Ethiopia)
+or;ori;Odia;Odia
+or-IN;ori;Odia (India);Odia (India)
+pa;pan;Punjabi;Punjabi
+pa-Arab-PK;pan;Punjabi (Arabic, Pakistan);Punjabi (Arabic, Pakistan)
+pa-Arab;pan;Punjabi (Arabic);Punjabi (Arabic)
+pl;pol;Polish;Polish
+pl-PL;pol;Polish (Poland);Polish (Poland)
+ps;pus;Pashto;Pashto
+ps-AF;pus;Pashto (Afghanistan);Pashto (Afghanistan)
+pt;por;Portuguese;Portuguese
+pt-BR;por;Portuguese (Brazil);Portuguese (Brazil)
+pt-PT;por;Portuguese (Portugal);Portuguese (Portugal)
+rm;roh;Romansh;Romansh
+rm-CH;roh;Romansh (Switzerland);Romansh (Switzerland)
+ro;ron;Romanian;Romanian
+ro-RO;ron;Romanian (Romania);Romanian (Romania)
+ro-MD;ron;Romanian (Moldova);Romanian (Moldova)
+ru;rus;Russian;Russian
+ru-RU;rus;Russian (Russia);Russian (Russia)
+ru-MD;rus;Russian (Moldova);Russian (Moldova)
+rw;kin;Kinyarwanda;Kinyarwanda
+rw-RW;kin;Kinyarwanda (Rwanda);Kinyarwanda (Rwanda)
+sah;sah;Sakha;Sakha
+sah-RU;sah;Sakha (Russia);Sakha (Russia)
+se;sme;Northern Sami;Northern Sami
+se-NO;sme;Northern Sami (Norway);Northern Sami (Norway)
+se-SE;sme;Northern Sami (Sweden);Northern Sami (Sweden)
+se-FI;sme;Northern Sami (Finland);Northern Sami (Finland)
+si;sin;Sinhala;Sinhala
+si-LK;sin;Sinhala (Sri Lanka);Sinhala (Sri Lanka)
+sk;slk;Slovak;Slovak
+sk-SK;slk;Slovak (Slovakia);Slovak (Slovakia)
+sl;slv;Slovenian;Slovenian
+sl-SI;slv;Slovenian (Slovenia);Slovenian (Slovenia)
+smn-FI;smn;Inari Sami (Finland);Inari Sami (Finland)
+smn;smn;Inari Sami;Inari Sami
+so;som;Somali;Somali
+so-SO;som;Somali (Somalia);Somali (Somalia)
+sq;sqi;Albanian;Albanian
+sq-AL;sqi;Albanian (Albania);Albanian (Albania)
+sr-Latn-BA;srp;Serbian (Latin, Bosnia & Herzegovina);Serbian (Latin, Bosnia & Herzegovina)
+sr-Cyrl-BA;srp;Serbian (Cyrillic, Bosnia & Herzegovina);Serbian (Cyrillic, Bosnia & Herzegovina)
+sr-Latn-RS;srp;Serbian (Latin, Serbia);Serbian (Latin, Serbia)
+sr-Cyrl-RS;srp;Serbian (Cyrillic, Serbia);Serbian (Cyrillic, Serbia)
+sr-Latn-ME;srp;Serbian (Latin, Montenegro);Serbian (Latin, Montenegro)
+sr-Cyrl-ME;srp;Serbian (Cyrillic, Montenegro);Serbian (Cyrillic, Montenegro)
+sr-Cyrl;srp;Serbian (Cyrillic);Serbian (Cyrillic)
+sr-Latn;srp;Serbian (Latin);Serbian (Latin)
+sr;srp;Serbian;Serbian
+st;sot;Southern Sotho;Southern Sotho
+st-ZA;sot;Southern Sotho (South Africa);Southern Sotho (South Africa)
+sv;swe;Swedish;Swedish
+sv-SE;swe;Swedish (Sweden);Swedish (Sweden)
+sv-FI;swe;Swedish (Finland);Swedish (Finland)
+sw;swa;Swahili;Swahili
+sw-KE;swa;Swahili (Kenya);Swahili (Kenya)
+ta;tam;Tamil;Tamil
+ta-IN;tam;Tamil (India);Tamil (India)
+ta-LK;tam;Tamil (Sri Lanka);Tamil (Sri Lanka)
+te;tel;Telugu;Telugu
+te-IN;tel;Telugu (India);Telugu (India)
+tg;tgk;Tajik;Tajik
+tg-Cyrl-TJ;tgk;Tajik (Cyrillic, Tajikistan);Tajik (Cyrillic, Tajikistan)
+tg-Cyrl;tgk;Tajik (Cyrillic);Tajik (Cyrillic)
+th;tha;Thai;Thai
+th-TH;tha;Thai (Thailand);Thai (Thailand)
+ti;tir;Tigrinya;Tigrinya
+ti-ET;tir;Tigrinya (Ethiopia);Tigrinya (Ethiopia)
+ti-ER;tir;Tigrinya (Eritrea);Tigrinya (Eritrea)
+tk;tuk;Turkmen;Turkmen
+tk-TM;tuk;Turkmen (Turkmenistan);Turkmen (Turkmenistan)
+tn;tsn;Tswana;Tswana
+tn-ZA;tsn;Tswana (South Africa);Tswana (South Africa)
+tn-BW;tsn;Tswana (Botswana);Tswana (Botswana)
+tr;tur;Turkish;Turkish
+tr-TR;tur;Turkish (Turkey);Turkish (Turkey)
+ts;tso;Tsonga;Tsonga
+ts-ZA;tso;Tsonga (South Africa);Tsonga (South Africa)
+tzm;tzm;Central Atlas Tamazight;Central Atlas Tamazight
+tzm-Latn;tzm;Central Atlas Tamazight (Latin);Central Atlas Tamazight (Latin)
+ug;uig;Uyghur;Uyghur
+ug-CN;uig;Uyghur (China);Uyghur (China)
+uk;ukr;Ukrainian;Ukrainian
+uk-UA;ukr;Ukrainian (Ukraine);Ukrainian (Ukraine)
+ur;urd;Urdu;Urdu
+ur-PK;urd;Urdu (Pakistan);Urdu (Pakistan)
+ur-IN;urd;Urdu (India);Urdu (India)
+uz;uzb;Uzbek;Uzbek
+uz-Latn-UZ;uzb;Uzbek (Latin, Uzbekistan);Uzbek (Latin, Uzbekistan)
+uz-Cyrl-UZ;uzb;Uzbek (Cyrillic, Uzbekistan);Uzbek (Cyrillic, Uzbekistan)
+uz-Cyrl;uzb;Uzbek (Cyrillic);Uzbek (Cyrillic)
+uz-Latn;uzb;Uzbek (Latin);Uzbek (Latin)
+vi;vie;Vietnamese;Vietnamese
+vi-VN;vie;Vietnamese (Vietnam);Vietnamese (Vietnam)
+xh;xho;Xhosa;Xhosa
+xh-ZA;xho;Xhosa (South Africa);Xhosa (South Africa)
+yo;yor;Yoruba;Yoruba
+yo-NG;yor;Yoruba (Nigeria);Yoruba (Nigeria)
+zu;zul;Zulu;Zulu
+zu-ZA;zul;Zulu (South Africa);Zulu (South Africa)
+
+
+zho;chi;中文;中文
+chi;chi;中文;中文
+chs;chi;中文(简体);中文
+zh-CN;chi;中文(简体);中文
+zh-SG;chi;中文(简体, 新加坡);中文
+zh-MO;chi;中文(繁體, 澳門);中文
+zh-Hans;chi;中文(简体);中文
+zh-Hant;chi;中文(繁體);中文
+zh-TW;chi;中文(繁體, 台灣);中文
+zh-Hant-TW;chi;中文(繁體, 台灣);中文
+zh-HK;chi;中文(繁體, 香港);中文
+zh-Hant-HK;chi;中文(繁體, 香港);中文
+yue;chi;中文(繁體);粵語
+cmn;chi;中文(简体);普通话
+cmn-Hans;chi;中文(简体);普通话
+cmn-Hant;chi;中文(繁體);普通話
+Cantonese;chi;中文;粵語
+Mandarin;chi;中文;普通话
+Vietnamese;vie;Vietnamese;Vietnamese
+English;eng;English;English
+Thai;tha;Thai;Thai
+CN;chi;中文(繁體);中文
+CC;chi;中文(繁體);中文
+CZ;chi;中文(简体);中文
+"
+.Trim().Replace("\r", "").Split('\n').Where(x => !string.IsNullOrWhiteSpace(x)).Select(x =>
+{
+    var arr = x.Trim().Split(';');
+    return new Language(arr[0].Trim(), arr[1].Trim(), arr[2].Trim(), arr[3].Trim());
+}).ToList();
+
+        private static Dictionary<string, string> CODE_MAP = @"
+iv;IVL
+ar;ara
+bg;bul
+ca;cat
+zh;zho
+cs;ces
+da;dan
+de;deu
+el;ell
+en;eng
+es;spa
+fi;fin
+fr;fra
+he;heb
+hu;hun
+is;isl
+it;ita
+ja;jpn
+ko;kor
+nl;nld
+nb;nob
+pl;pol
+pt;por
+rm;roh
+ro;ron
+ru;rus
+hr;hrv
+sk;slk
+sq;sqi
+sv;swe
+th;tha
+tr;tur
+ur;urd
+id;ind
+uk;ukr
+be;bel
+sl;slv
+et;est
+lv;lav
+lt;lit
+tg;tgk
+fa;fas
+vi;vie
+hy;hye
+az;aze
+eu;eus
+mk;mkd
+st;sot
+ts;tso
+tn;tsn
+xh;xho
+zu;zul
+af;afr
+ka;kat
+fo;fao
+hi;hin
+mt;mlt
+se;sme
+ga;gle
+ms;msa
+kk;kaz
+ky;kir
+sw;swa
+tk;tuk
+uz;uzb
+bn;ben
+pa;pan
+gu;guj
+or;ori
+ta;tam
+te;tel
+kn;kan
+ml;mal
+as;asm
+mr;mar
+mn;mon
+bo;bod
+cy;cym
+km;khm
+lo;lao
+my;mya
+gl;glg
+si;sin
+am;amh
+ne;nep
+fy;fry
+ps;pus
+ff;ful
+ha;hau
+yo;yor
+lb;ltz
+kl;kal
+ig;ibo
+om;orm
+ti;tir
+so;som
+ii;iii
+br;bre
+ug;uig
+rw;kin
+gd;gla
+nn;nno
+bs;bos
+sr;srp
+"
+.Trim().Replace("\r", "").Split('\n').Where(x => !string.IsNullOrWhiteSpace(x)).Select(x => x.Trim()).ToDictionary(x => x.Split(';').First().Trim(), x => x.Split(';').Last().Trim());
+
+
+        private static string ConvertTwoToThree(string input)
+        {
+            if (CODE_MAP.TryGetValue(input, out var code)) return code;
+            return input;
+        }
+
+        /// <summary>
+        /// 转换 ISO 639-1 => ISO 639-2
+        /// 且当Description为空时将DisplayName写入
+        /// </summary>
+        /// <param name="outputFile"></param>
+        public static void ConvertLangCodeAndDisplayName(OutputFile outputFile)
+        {
+            if (string.IsNullOrEmpty(outputFile.LangCode) || outputFile.MediaType == null) return;
+            var originalLangCode = outputFile.LangCode;
+
+            if (string.IsNullOrEmpty(outputFile.Description))
+            {
+                //先直接查找
+                var lang = ALL_LANGS.FirstOrDefault(a => a.ExtendCode.Equals(outputFile.LangCode, StringComparison.OrdinalIgnoreCase) || a.Code.Equals(outputFile.LangCode, StringComparison.OrdinalIgnoreCase));
+                //处理特殊的扩展语言标记
+                if (lang == null)
+                {
+                    //2位转3位
+                    var l = ConvertTwoToThree(outputFile.LangCode.Split('-').First());
+                    lang = ALL_LANGS.FirstOrDefault(a => a.ExtendCode.Equals(l, StringComparison.OrdinalIgnoreCase) || a.Code.Equals(l, StringComparison.OrdinalIgnoreCase));
+                }
+
+                if (lang != null)
+                {
+                    outputFile.LangCode = lang.Code;
+                    outputFile.Description = outputFile.MediaType == Common.Enum.MediaType.SUBTITLES ? lang.Description : lang.DescriptionAudio;
+                }
+                else
+                {
+                    outputFile.LangCode = "und"; //无法识别直接置为und
+                }
+            }
+
+            //无描述,则把LangCode当作描述
+            if (string.IsNullOrEmpty(outputFile.Description)) outputFile.Description = originalLangCode;
+        }
+    }
+}
diff --git a/src/N_m3u8DL-RE/Util/MergeUtil.cs b/src/N_m3u8DL-RE/Util/MergeUtil.cs
index b148011..147d094 100644
--- a/src/N_m3u8DL-RE/Util/MergeUtil.cs
+++ b/src/N_m3u8DL-RE/Util/MergeUtil.cs
@@ -204,7 +204,7 @@ namespace N_m3u8DL_RE.Util
             for (int i = 0; i < files.Length; i++)
             {
                 //转换语言代码
-                ConvertLangCodeAndDisplayName(files[i]);
+                LanguageCodeUtil.ConvertLangCodeAndDisplayName(files[i]);
                 command.Append($" -metadata:s:{streamIndex} language=\"{files[i].LangCode ?? "und"}\" ");
                 if (!string.IsNullOrEmpty(files[i].Description))
                 {
@@ -240,7 +240,7 @@ namespace N_m3u8DL_RE.Util
             for (int i = 0; i < files.Length; i++)
             {
                 //转换语言代码
-                ConvertLangCodeAndDisplayName(files[i]);
+                LanguageCodeUtil.ConvertLangCodeAndDisplayName(files[i]);
                 command.Append($" --language 0:\"{files[i].LangCode ?? "und"}\" ");
                 if (!string.IsNullOrEmpty(files[i].Description))
                     command.Append($" --track-name 0:\"{files[i].Description}\" ");
@@ -251,73 +251,5 @@ namespace N_m3u8DL_RE.Util
 
             return code == 0;
         }
-
-        /// <summary>
-        /// 转换 ISO 639-1 => ISO 639-2
-        /// 且当Description为空时将DisplayName写入
-        /// </summary>
-        /// <param name="outputFile"></param>
-        private static void ConvertLangCodeAndDisplayName(OutputFile outputFile)
-        {
-            if (string.IsNullOrEmpty(outputFile.LangCode)) return;
-            var originalLangCode = outputFile.LangCode;
-
-            // zh-cn => zh
-            outputFile.LangCode = outputFile.LangCode.Split('-')[0];
-            // ENG => eng
-            if (outputFile.LangCode.ToUpper() == outputFile.LangCode) outputFile.LangCode = outputFile.LangCode.ToLower();
-
-            CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
-            foreach (var c in cultures)
-            {
-                if (outputFile.LangCode == c.TwoLetterISOLanguageName)
-                {
-                    outputFile.LangCode = c.ThreeLetterISOLanguageName;
-                    if (string.IsNullOrEmpty(outputFile.Description))
-                    {
-                        outputFile.Description = c.DisplayName;
-                    }
-                    break;
-                }
-                else if (outputFile.LangCode == c.ThreeLetterISOLanguageName)
-                {
-                    if (string.IsNullOrEmpty(outputFile.Description))
-                    {
-                        outputFile.Description = c.DisplayName;
-                    }
-                    break;
-                }
-            }
-
-            //有的播放器不识别zho,统一转为chi
-            if (outputFile.LangCode == "zho") outputFile.LangCode = "chi";
-            else if (outputFile.LangCode == "cmn") outputFile.LangCode = "chi";
-            else if (outputFile.LangCode == "yue") outputFile.LangCode = "chi";
-            else if (outputFile.LangCode == "cn") outputFile.LangCode = "chi";
-            else if (outputFile.LangCode == "cz") outputFile.LangCode = "chi";
-            else if (outputFile.LangCode == "Cantonese" || outputFile.LangCode == "Mandarin")
-            {
-                outputFile.Description = outputFile.LangCode;
-                outputFile.LangCode = "chi";
-            }
-            else if (outputFile.LangCode == "Vietnamese")
-            {
-                outputFile.Description = outputFile.LangCode;
-                outputFile.LangCode = "vie";
-            }
-            else if (outputFile.LangCode == "English")
-            {
-                outputFile.Description = outputFile.LangCode;
-                outputFile.LangCode = "eng";
-            }
-            else if (outputFile.LangCode == "Thai")
-            {
-                outputFile.Description = outputFile.LangCode;
-                outputFile.LangCode = "tha";
-            }
-
-            //无描述,则把LangCode当作描述
-            if (string.IsNullOrEmpty(outputFile.Description)) outputFile.Description = originalLangCode;
-        }
     }
 }