feat(transcode): scale 2-pass progress to 50% per pass for total 100%

This commit is contained in:
PickleRick committed 2026-09-30 23:58:28 +02:00
1 parent 2daa75df60
commit 70f065a3a2
2 files changed
+87 -7

No files matched your search

@@ -156,6 +156,17 @@ const shouldCopyVideo = (videoStream, copyHevcBelowKbps, streams, format) => {
&& bitrateKbps > 0 && bitrateKbps < copyHevcBelowKbps;
};
const scalePassPercentage = (pass, percentage) => {
const p = Math.min(100, Math.max(0, Number(percentage) || 0));
if (pass === 1) {
return +(p * 0.5).toFixed(1);
}
if (pass === 2) {
return +(50 + p * 0.5).toFixed(1);
}
return p;
};
// ─── Plugin ───────────────────────────────────────────────────────────────────
const plugin = async (args) => {
@@ -297,9 +308,62 @@ const plugin = async (args) => {
}
const { CLI } = require('../../../../FlowHelpers/1.0.0/cliUtils');
const { updateProgress } = args;
// Scale 2-pass progress so Pass 1 counts for 0-50% and Pass 2 counts for 50-100%
const pass1UpdateWorker = (progressData) => {
if (typeof updateWorker !== 'function') return;
if (progressData && typeof progressData.percentage === 'number') {
updateWorker({
...progressData,
percentage: scalePassPercentage(1, progressData.percentage),
});
} else {
updateWorker(progressData);
}
};
const pass1UpdateProgress = (progressData) => {
if (typeof updateProgress !== 'function') return;
if (progressData && typeof progressData.progress === 'number') {
updateProgress({
...progressData,
progress: scalePassPercentage(1, progressData.progress),
});
} else {
updateProgress(progressData);
}
};
const pass2UpdateWorker = (progressData) => {
if (typeof updateWorker !== 'function') return;
if (progressData && typeof progressData.percentage === 'number') {
updateWorker({
...progressData,
percentage: scalePassPercentage(2, progressData.percentage),
});
} else {
updateWorker(progressData);
}
};
const pass2UpdateProgress = (progressData) => {
if (typeof updateProgress !== 'function') return;
if (progressData && typeof progressData.progress === 'number') {
updateProgress({
...progressData,
progress: scalePassPercentage(2, progressData.progress),
});
} else {
updateProgress(progressData);
}
};
// ══ PASS 1 ════════════════════════════════════════════════════════════════
jobLog('[transcode2PassX265] Starting Pass 1...\n');
pass1UpdateWorker({ percentage: 0 });
pass1UpdateProgress({ progress: 0 });
const pass1Cli = new CLI({
cli: args.ffmpegPath,
spawnArgs: [
@@ -317,16 +381,18 @@ const plugin = async (args) => {
WorkDir: workDir,
jobLog,
inputFileObj,
updateWorker,
updateWorker: pass1UpdateWorker,
logFullCliOutput: args.logFullCliOutput || false,
args,
args: { ...args, updateWorker: pass1UpdateWorker, updateProgress: pass1UpdateProgress },
});
const { cliExitCode: pass1Exit } = await pass1Cli.runCli();
if (pass1Exit !== 0) {
throw new Error(`[transcode2PassX265] Pass 1 failed with exit code ${pass1Exit}`);
}
jobLog('[transcode2PassX265] Pass 1 complete.\n');
pass1UpdateWorker({ percentage: 100 });
pass1UpdateProgress({ progress: 100 });
jobLog('[transcode2PassX265] Pass 1 complete (50% total progress).\n');
// ══ PASS 2 ════════════════════════════════════════════════════════════════
const audioArgs = buildAudioArgs(variables);
@@ -335,6 +401,9 @@ const plugin = async (args) => {
}
jobLog('[transcode2PassX265] Starting Pass 2...\n');
pass2UpdateWorker({ percentage: 0 });
pass2UpdateProgress({ progress: 0 });
const pass2Cli = new CLI({
cli: args.ffmpegPath,
spawnArgs: [
@@ -355,16 +424,18 @@ const plugin = async (args) => {
jobLog,
outputFilePath: outFile,
inputFileObj,
updateWorker,
updateWorker: pass2UpdateWorker,
logFullCliOutput: args.logFullCliOutput || false,
args,
args: { ...args, updateWorker: pass2UpdateWorker, updateProgress: pass2UpdateProgress },
});
const { cliExitCode: pass2Exit } = await pass2Cli.runCli();
if (pass2Exit !== 0) {
throw new Error(`[transcode2PassX265] Pass 2 failed with exit code ${pass2Exit}`);
}
jobLog('[transcode2PassX265] Pass 2 complete.\n');
pass2UpdateWorker({ percentage: 100 });
pass2UpdateProgress({ progress: 100 });
jobLog('[transcode2PassX265] Pass 2 complete (100% total progress).\n');
// ── Cleanup 2-pass log files and temporary input copy ────────────────────
[statsFile, `${statsFile}.mbtree`, `${statsFile}.cutree`].forEach((f) => {
@@ -389,3 +460,4 @@ const plugin = async (args) => {
module.exports.details = details;
module.exports.plugin = plugin;
module.exports.scalePassPercentage = scalePassPercentage;