72 lines
3.5 KiB
JavaScript
72 lines
3.5 KiB
JavaScript
function Script(MinHeight, MaxHeight, MinBitrateMbps)
|
|
{
|
|
MinHeight = MinHeight || 720;
|
|
MaxHeight = MaxHeight || 1080;
|
|
MinBitrateMbps = MinBitrateMbps || 8;
|
|
|
|
// Variables.vi.VideoInfo ist im ScriptNode leer (verifiziert 2026-07-06) -> ffprobe direkt.
|
|
function probeInfo() {
|
|
var probe = null;
|
|
try { probe = Flow.GetToolPath('ffprobe'); } catch (e) {}
|
|
if (!probe) probe = Variables['ffprobe'] || 'ffprobe';
|
|
var res = Flow.Execute({
|
|
command: probe,
|
|
argumentList: ['-v', 'quiet', '-print_format', 'json',
|
|
'-show_format', '-show_streams', Flow.WorkingFile]
|
|
});
|
|
if (!res || res.exitCode !== 0) { Logger.WLog('ffprobe fehlgeschlagen'); return null; }
|
|
var j;
|
|
try { j = JSON.parse(res.standardOutput || res.output || ''); } catch (e) { Logger.WLog('ffprobe JSON-Fehler: ' + e); return null; }
|
|
var streams = j.streams || [];
|
|
var fmtBr = parseInt((j.format && j.format.bit_rate) || 0, 10) || 0;
|
|
function tagBps(s) { var t = s.tags || {}; return parseInt(t.BPS || t['BPS-eng'] || t.bps || 0, 10) || 0; }
|
|
var vids = [], auds = [];
|
|
for (var i = 0; i < streams.length; i++) {
|
|
var s = streams[i], disp = s.disposition || {};
|
|
if (s.codec_type === 'video') {
|
|
if (disp.attached_pic === 1 || s.codec_name === 'mjpeg' || s.codec_name === 'png') continue;
|
|
vids.push({ Width: s.width || 0, Height: s.height || 0, Codec: (s.codec_name || ''), Bitrate: tagBps(s) || 0 });
|
|
} else if (s.codec_type === 'audio') {
|
|
var t = s.tags || {};
|
|
auds.push({ Language: t.language || '', Codec: (s.codec_name || '') });
|
|
}
|
|
}
|
|
return { Bitrate: fmtBr, VideoStreams: vids, AudioStreams: auds };
|
|
}
|
|
|
|
let vi = probeInfo();
|
|
let v = (vi && vi.VideoStreams && vi.VideoStreams.length > 0) ? vi.VideoStreams[0] : null;
|
|
|
|
if (!v) {
|
|
Logger.ELog('Kein Video-Stream ermittelbar (ffprobe) - 1:1 Move');
|
|
return 2;
|
|
}
|
|
|
|
let height = v.Height || 0;
|
|
let codec = (v.Codec || '').toLowerCase();
|
|
let bitrateBps = v.Bitrate || 0;
|
|
if (bitrateBps <= 0 && vi.Bitrate) bitrateBps = Math.round(vi.Bitrate * 0.92);
|
|
let bitrateMbps = bitrateBps > 0 ? (bitrateBps / 1000000) : 0;
|
|
|
|
// DE-Spur pruefen - ohne DE macht der HEVC-Encoder keinen Sinn.
|
|
let audioStreams = (vi && vi.AudioStreams) ? vi.AudioStreams : [];
|
|
let hasGerman = audioStreams.some(function (a) {
|
|
let lang = (a.Language || '').toLowerCase().trim();
|
|
return lang === 'ger' || lang === 'deu' || lang === 'de';
|
|
});
|
|
|
|
let inRange = (height >= MinHeight && height <= MaxHeight);
|
|
let highBR = bitrateMbps > MinBitrateMbps;
|
|
|
|
Logger.ILog('Video: codec=' + codec + ' height=' + height + ' bitrate=' +
|
|
(bitrateMbps > 0 ? bitrateMbps.toFixed(2) + ' Mbit/s' : 'unbekannt'));
|
|
Logger.ILog('Checks: inRange[' + MinHeight + '-' + MaxHeight + ']=' + inRange +
|
|
' >' + MinBitrateMbps + 'Mbit=' + highBR + ' DE=' + hasGerman);
|
|
|
|
if (!inRange) { Logger.ILog('Hoehe ' + height + ' ausserhalb ' + MinHeight + '-' + MaxHeight + ' - 1:1 Move'); return 2; }
|
|
if (!highBR) { Logger.ILog('Bitrate <= ' + MinBitrateMbps + ' Mbit/s - 1:1 Move'); return 2; }
|
|
if (!hasGerman) { Logger.ILog('Keine deutsche Audiospur - 1:1 Move'); return 2; }
|
|
|
|
Logger.ILog('-> 1080p Re-Encode Kandidat fuer HEVC NVENC');
|
|
return 1;
|
|
}
|