/** * @name 06_pgs2srt_OCR_Strip * @description Ruft pgs2srt OCR+Strip auf der Zieldatei nach Finalize_Move auf. * Extrahiert PGS/Bild-Untertitel als SRT-Sidecars und entfernt sie aus dem MKV. * Fehlertolerant: bei OCR-Fehler bleibt die MKV unveraendert, Import wird nicht blockiert. * Voraussetzung: pgs2srt-Container hat /tdarr-Volume gemountet. * @author Sascha + Trulla * @revision 1 * @output OK (OCR abgeschlossen oder keine Subs) * @output Fehler (MKV unveraendert, Import fortsetzen) * @param {string} Pgs2srtUrl pgs2srt API URL (Default http://10.2.1.104:8095) * @param {string} Langs Komma-getrennte Sprachen (Default ger,eng) */ function Script(Pgs2srtUrl, Langs) { Pgs2srtUrl = Pgs2srtUrl || 'http://10.2.1.104:8095'; Langs = Langs || 'ger,eng'; let workingFile = Variables['file.FullName'] || Flow.WorkingFile; if (!workingFile) { Logger.ELog('pgs2srt: keine Working File'); return 2; } // pgs2srt sieht das /tdarr-Volume. FileFlows sieht ebenfalls /tdarr. // Die Pfade sollten identisch sein. Wenn nicht, ist das ein Konfigurationsfehler. // Pruefe ob der Pfad unter /tdarr liegt (typisch nach Finalize_Move). if (workingFile.indexOf('/tdarr/') !== 0) { Logger.WLog('pgs2srt: Working File liegt nicht unter /tdarr/ (' + workingFile + ') - Skip OCR'); return 1; } let langArray = Langs.split(',').map(function(s) { return s.trim(); }); // HTTP-Request an pgs2srt: POST /api/ocr-and-strip // Body: {"path": "", "langs": ["ger","eng"]} let body = JSON.stringify({ path: workingFile, langs: langArray }); Logger.ILog('pgs2srt: OCR+Strip fuer ' + workingFile + ' (langs=' + Langs + ')'); // FileFlows Flow.Execute kann keine HTTP-Requests direkt. // Verwende curl als Command. let curlPath = '/usr/bin/curl'; let args = [ '-sS', '-X', 'POST', '-H', 'Content-Type: application/json', '-d', body, '--max-time', '600', Pgs2srtUrl + '/api/ocr-and-strip' ]; let result = Flow.Execute({ command: curlPath, argumentList: args }); if (!result || result.exitCode !== 0) { Logger.WLog('pgs2srt: HTTP-Request fehlgeschlagen (exit=' + (result ? result.exitCode : '?') + ') - MKV bleibt unveraendert'); if (result && result.standardError) Logger.WLog(result.standardError); return 2; } // Antwort parsen let responseText = result.standardOutput || result.output || ''; Logger.ILog('pgs2srt: Response: ' + responseText.substring(0, 500)); var response; try { response = JSON.parse(responseText); } catch (e) { Logger.WLog('pgs2srt: JSON-Parse-Fehler - MKV bleibt unveraendert'); return 2; } let status = response.status || ''; if (status === 'ok') { Logger.ILog('pgs2srt: OCR erfolgreich (' + response.message + ')'); return 1; } else if (status === 'no_subs') { Logger.ILog('pgs2srt: keine Untertitel gefunden - OK'); return 1; } else if (status === 'partial') { Logger.WLog('pgs2srt: Teilweise erfolgreich (' + response.message + ') - MKV verarbeitet, einige Subs fehlen'); return 1; } else if (status === 'error') { Logger.WLog('pgs2srt: Fehler (' + (response.message || '?') + ') - MKV bleibt unveraendert'); return 2; } else { Logger.WLog('pgs2srt: Unbekannte Antwort (' + status + ') - MKV bleibt unveraendert'); return 2; } }