From 1c214aaaddc9ef8d6bdc886aa5b22245cb7b2b47 Mon Sep 17 00:00:00 2001
From: matt1432 <matt@nelim.org>
Date: Mon, 1 Apr 2024 18:40:15 -0400
Subject: [PATCH] feat(node-sub): add warning when no SRT subs found

---
 .../nos/modules/subtitles/syncing/default.nix |  6 +-
 .../subtitles/syncing/node-syncsub/main.ts    | 85 ++++++++++---------
 2 files changed, 49 insertions(+), 42 deletions(-)

diff --git a/devices/nos/modules/subtitles/syncing/default.nix b/devices/nos/modules/subtitles/syncing/default.nix
index 3e64b5e0..68133e6d 100644
--- a/devices/nos/modules/subtitles/syncing/default.nix
+++ b/devices/nos/modules/subtitles/syncing/default.nix
@@ -31,9 +31,9 @@ in {
       ];
 
       script = ''
-        # find /data/anime  -name '*.srt' -exec node-syncsub "{}" \;
-        # find /data/movies -name '*.srt' -exec node-syncsub "{}" \;
-        # find /data/tv     -name '*.srt' -exec node-syncsub "{}" \;
+        find /data/movies -name '*.mkv' -printf "%h\0" | xargs -0 -I '{}' node-syncsub '{}' "eng,fra"
+        # find /data/anime -name '*.mkv' -printf "%h\0" | xargs -0 -I '{}' node-syncsub '{}' "eng,fra"
+        # find /data/tv -name '*.mkv' -printf "%h\0" | xargs -0 -I '{}' node-syncsub '{}' "eng,fra"
       '';
     };
     timers.subsync-job = {
diff --git a/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts b/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
index a395ab44..37b83b01 100755
--- a/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
+++ b/devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
@@ -101,7 +101,7 @@ async function main() {
     ffProbe(VIDEO, (_e, data) => {
         const AVAIL_LANGS = data.streams
             .filter((s) => s.codec_type === 'audio')
-            .map((s) => s['tags']['language']);
+            .map((s) => s['tags'] && s['tags']['language']);
 
         // Sync subtitles one by one
         langs.forEach(async(lang) => {
@@ -131,46 +131,53 @@ async function main() {
                 });
             }
             else {
-                let stream = data.streams.find((s) => {
-                    return s['tags']['language'] === lang &&
-                           s.disposition?.forced === 0 &&
+                let subs = data.streams.filter((s) => {
+                    return s['tags'] &&
+                           s['tags']['language'] &&
+                           s['tags']['language'] === lang &&
                            s.codec_type === 'subtitle';
-                })?.index ?? -1;
-
-                if (stream === -1) {
-                    stream = data.streams.find((s) => {
-                        return s['tags']['language'] === lang &&
-                               s.codec_type === 'subtitle';
-                    })?.index ?? -1;
-                }
-
-                if (stream === -1) {
-                    console.warn(`No subtitle tracks were found for ${lang}`);
-
-                    return;
-                }
-
-                // Extract subtitles
-                spawn('ffmpeg', [
-                    '-i', `'${VIDEO}'`,
-                    '-map', `"0:${stream}"`, `'${IN_FILE}'`,
-                ], SPAWN_OPTS);
-
-                // Delete subtitles from video
-                spawn('mv', [`'${VIDEO}'`, `'${VIDEO}.bak'`], SPAWN_OPTS);
-
-                spawn('ffmpeg', [
-                    '-i', `'${VIDEO}.bak'`,
-                    '-map', '0',
-                    '-map', `-0:${stream}`,
-                    '-c', 'copy', `'${VIDEO}'`,
-                ], SPAWN_OPTS);
-
-                spawn('rm', [`'${VIDEO}.bak'`], SPAWN_OPTS);
-
-                runSubSync(cmd, async() => {
-                    await mv(IN_FILE, OUT_FILE);
                 });
+
+                const pgs = subs.filter((s) => s.codec_name === 'hdmv_pgs_subtitle');
+
+                // If we only have PGS subs, warn user
+                if (pgs.length === subs.length) {
+                    console.warn(`No SRT subtitle tracks were found for ${lang}`);
+                }
+                // Remove PGS streams from subs
+                subs = subs.filter((s) => s.codec_name !== 'hdmv_pgs_subtitle');
+
+                // Prefer normal subs
+                if (subs.length !== 1) {
+                    subs = subs.filter((s) => s.disposition?.forced === 0);
+                }
+
+                if (subs.length === 0) {
+                    console.warn(`No subtitle tracks were found for ${lang}`);
+                }
+                else {
+                    // Extract subtitles
+                    spawn('ffmpeg', [
+                        '-i', `'${VIDEO}'`,
+                        '-map', `"0:${subs[0].index}"`, `'${IN_FILE}'`,
+                    ], SPAWN_OPTS);
+
+                    // Delete subtitles from video
+                    spawn('mv', [`'${VIDEO}'`, `'${VIDEO}.bak'`], SPAWN_OPTS);
+
+                    spawn('ffmpeg', [
+                        '-i', `'${VIDEO}.bak'`,
+                        '-map', '0',
+                        '-map', `-0:${subs[0].index}`,
+                        '-c', 'copy', `'${VIDEO}'`,
+                    ], SPAWN_OPTS);
+
+                    spawn('rm', [`'${VIDEO}.bak'`], SPAWN_OPTS);
+
+                    runSubSync(cmd, async() => {
+                        await mv(IN_FILE, OUT_FILE);
+                    });
+                }
             }
         });
     });