From 1c214aaaddc9ef8d6bdc886aa5b22245cb7b2b47 Mon Sep 17 00:00:00 2001 From: matt1432 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); + }); + } } }); });