tdarr/fileflows/scripts/06_pgs2srt_OCR_Strip.js

93 lines
No EOL
3.5 KiB
JavaScript

/**
* @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": "<workingFile>", "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;
}
}