From 148e8e9daf5345d85c36f5c3c7574b1d0f0448e5 Mon Sep 17 00:00:00 2001
From: matt1432 <matt@nelim.org>
Date: Sat, 30 Mar 2024 02:28:22 -0400
Subject: [PATCH] feat(node-syncsub): improve language logic

---
 .../syncing/node-syncsub/lang-codes.ts        | 186 ++++++++++++++++++
 .../subtitles/syncing/node-syncsub/main.ts    |  20 +-
 2 files changed, 192 insertions(+), 14 deletions(-)
 create mode 100644 devices/nos/modules/subtitles/syncing/node-syncsub/lang-codes.ts

diff --git a/devices/nos/modules/subtitles/syncing/node-syncsub/lang-codes.ts b/devices/nos/modules/subtitles/syncing/node-syncsub/lang-codes.ts
new file mode 100644
index 00000000..ace9612f
--- /dev/null
+++ b/devices/nos/modules/subtitles/syncing/node-syncsub/lang-codes.ts
@@ -0,0 +1,186 @@
+export const iso6391To3 = new Map([
+    ['aa', 'aar'],
+    ['ab', 'abk'],
+    ['af', 'afr'],
+    ['ak', 'aka'],
+    ['am', 'amh'],
+    ['ar', 'ara'],
+    ['an', 'arg'],
+    ['as', 'asm'],
+    ['av', 'ava'],
+    ['ae', 'ave'],
+    ['ay', 'aym'],
+    ['az', 'aze'],
+    ['ba', 'bak'],
+    ['bm', 'bam'],
+    ['be', 'bel'],
+    ['bn', 'ben'],
+    ['bi', 'bis'],
+    ['bo', 'bod'],
+    ['bs', 'bos'],
+    ['br', 'bre'],
+    ['bg', 'bul'],
+    ['ca', 'cat'],
+    ['cs', 'ces'],
+    ['ch', 'cha'],
+    ['ce', 'che'],
+    ['cu', 'chu'],
+    ['cv', 'chv'],
+    ['kw', 'cor'],
+    ['co', 'cos'],
+    ['cr', 'cre'],
+    ['cy', 'cym'],
+    ['da', 'dan'],
+    ['de', 'deu'],
+    ['dv', 'div'],
+    ['dz', 'dzo'],
+    ['el', 'ell'],
+    ['en', 'eng'],
+    ['eo', 'epo'],
+    ['et', 'est'],
+    ['eu', 'eus'],
+    ['ee', 'ewe'],
+    ['fo', 'fao'],
+    ['fa', 'fas'],
+    ['fj', 'fij'],
+    ['fi', 'fin'],
+    ['fr', 'fra'],
+    ['fy', 'fry'],
+    ['ff', 'ful'],
+    ['gd', 'gla'],
+    ['ga', 'gle'],
+    ['gl', 'glg'],
+    ['gv', 'glv'],
+    ['gn', 'grn'],
+    ['gu', 'guj'],
+    ['ht', 'hat'],
+    ['ha', 'hau'],
+    ['sh', 'hbs'],
+    ['he', 'heb'],
+    ['hz', 'her'],
+    ['hi', 'hin'],
+    ['ho', 'hmo'],
+    ['hr', 'hrv'],
+    ['hu', 'hun'],
+    ['hy', 'hye'],
+    ['ig', 'ibo'],
+    ['io', 'ido'],
+    ['ii', 'iii'],
+    ['iu', 'iku'],
+    ['ie', 'ile'],
+    ['ia', 'ina'],
+    ['id', 'ind'],
+    ['ik', 'ipk'],
+    ['is', 'isl'],
+    ['it', 'ita'],
+    ['jv', 'jav'],
+    ['ja', 'jpn'],
+    ['kl', 'kal'],
+    ['kn', 'kan'],
+    ['ks', 'kas'],
+    ['ka', 'kat'],
+    ['kr', 'kau'],
+    ['kk', 'kaz'],
+    ['km', 'khm'],
+    ['ki', 'kik'],
+    ['rw', 'kin'],
+    ['ky', 'kir'],
+    ['kv', 'kom'],
+    ['kg', 'kon'],
+    ['ko', 'kor'],
+    ['kj', 'kua'],
+    ['ku', 'kur'],
+    ['lo', 'lao'],
+    ['la', 'lat'],
+    ['lv', 'lav'],
+    ['li', 'lim'],
+    ['ln', 'lin'],
+    ['lt', 'lit'],
+    ['lb', 'ltz'],
+    ['lu', 'lub'],
+    ['lg', 'lug'],
+    ['mh', 'mah'],
+    ['ml', 'mal'],
+    ['mr', 'mar'],
+    ['mk', 'mkd'],
+    ['mg', 'mlg'],
+    ['mt', 'mlt'],
+    ['mn', 'mon'],
+    ['mi', 'mri'],
+    ['ms', 'msa'],
+    ['my', 'mya'],
+    ['na', 'nau'],
+    ['nv', 'nav'],
+    ['nr', 'nbl'],
+    ['nd', 'nde'],
+    ['ng', 'ndo'],
+    ['ne', 'nep'],
+    ['nl', 'nld'],
+    ['nn', 'nno'],
+    ['nb', 'nob'],
+    ['no', 'nor'],
+    ['ny', 'nya'],
+    ['oc', 'oci'],
+    ['oj', 'oji'],
+    ['or', 'ori'],
+    ['om', 'orm'],
+    ['os', 'oss'],
+    ['pa', 'pan'],
+    ['pi', 'pli'],
+    ['pl', 'pol'],
+    ['pt', 'por'],
+    ['ps', 'pus'],
+    ['qu', 'que'],
+    ['rm', 'roh'],
+    ['ro', 'ron'],
+    ['rn', 'run'],
+    ['ru', 'rus'],
+    ['sg', 'sag'],
+    ['sa', 'san'],
+    ['si', 'sin'],
+    ['sk', 'slk'],
+    ['sl', 'slv'],
+    ['se', 'sme'],
+    ['sm', 'smo'],
+    ['sn', 'sna'],
+    ['sd', 'snd'],
+    ['so', 'som'],
+    ['st', 'sot'],
+    ['es', 'spa'],
+    ['sq', 'sqi'],
+    ['sc', 'srd'],
+    ['sr', 'srp'],
+    ['ss', 'ssw'],
+    ['su', 'sun'],
+    ['sw', 'swa'],
+    ['sv', 'swe'],
+    ['ty', 'tah'],
+    ['ta', 'tam'],
+    ['tt', 'tat'],
+    ['te', 'tel'],
+    ['tg', 'tgk'],
+    ['tl', 'tgl'],
+    ['th', 'tha'],
+    ['ti', 'tir'],
+    ['to', 'ton'],
+    ['tn', 'tsn'],
+    ['ts', 'tso'],
+    ['tk', 'tuk'],
+    ['tr', 'tur'],
+    ['tw', 'twi'],
+    ['ug', 'uig'],
+    ['uk', 'ukr'],
+    ['ur', 'urd'],
+    ['uz', 'uzb'],
+    ['ve', 'ven'],
+    ['vi', 'vie'],
+    ['vo', 'vol'],
+    ['wa', 'wln'],
+    ['wo', 'wol'],
+    ['xh', 'xho'],
+    ['yi', 'yid'],
+    ['yo', 'yor'],
+    ['za', 'zha'],
+    ['zh', 'zho'],
+    ['zu', 'zul'],
+]);
diff --git a/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts b/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
index 0acc706d..e1c295f8 100755
--- a/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
+++ b/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
@@ -1,6 +1,7 @@
 import { readdir } from 'fs';
 import { ffprobe } from 'fluent-ffmpeg';
 import { spawn } from 'child_process';
+import { iso6391To3 } from './lang-codes';
 
 const SUB_EXT_LENGTH = 7;
 
@@ -22,18 +23,9 @@ const main = () => {
             !f.endsWith('.srt'))[0]}`;
 
         ffprobe(VIDEO, (_e, data) => {
-            const other = (lang: string) => lang === 'fre' ? 'eng' : 'fre';
+            const LANG = iso6391To3.get(FILE.split('.').at(-2) ?? 'en') ?? 'eng';
 
-            let lang = FILE.split('.').at(-2) ?? 'en';
-
-            if (lang === 'fr') {
-                lang = 'fre';
-            }
-            else if (lang === 'en') {
-                lang = 'eng';
-            }
-
-            const OUT_FILE = `${BASE_NAME}.synced.${lang.substring(0, 2)}.srt`;
+            const OUT_FILE = `${BASE_NAME}.synced.${LANG.substring(0, 2)}.srt`;
             const OUT_PATH = `${DIR}/${OUT_FILE}`;
 
             if (files.includes(OUT_FILE)) {
@@ -47,14 +39,14 @@ const main = () => {
 
             const cmd = [
                 '--cli sync',
-                `--sub-lang ${lang}`,
+                `--sub-lang ${LANG}`,
 
-                `--ref-stream-by-lang ${availLangs.includes(lang) ? lang : other(lang)}`,
+                `--ref-stream-by-lang ${availLangs.includes(LANG) ? LANG : availLangs[0]}`,
                 '--ref-stream-by-type "audio"',
 
                 `--sub '${FILE}'`,
                 `--out '${OUT_PATH}'`,
-                // `--out '${PATH}'`,
+                // `--out '${OUT_PATH}'`,
                 `--ref '${VIDEO}'`,
 
                 // '--overwrite',