commit c042d12244a3ce3e728da4721f0272e027dd5cb9
parent a67e817dcdcf2ecd5a37f986424f14c750db53d7
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Wed, 29 Jul 2026 11:53:22 -0400
Progress counted already-fresh videos against a target that excluded them
The bar's target is `countMissingDigests` — videos that were NOT fresh when the
job was sized. The runner then reported `succeeded + shared + fresh` against it,
but `fresh` counts videos the batch found already current, which were never in
that target. On a channel that is mostly done — 90 fresh, 10 to do — the bar
would report 100 against a target of 10.
`skipped` belongs in the count and was missing: a mirror whose canonical owns
the digest, or a video with no transcript, was included in the target and is
resolved even though nothing generated it. Without it the bar stalls short of
complete forever on any channel with cluster mirrors, which after the id-vs-dir
fix is most of the Rumble ones.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat:
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/common/controller/digestBatch.ts b/common/controller/digestBatch.ts
@@ -330,7 +330,16 @@ export async function runDigestBatch(
let resolvedAudioSeconds = 0;
const reportProgress = (): void => {
if (!opts.setProgress) return;
- const done = result.succeeded + result.shared + result.fresh;
+ // Counted against the TARGET, which is the count of videos that were not
+ // fresh when the job was sized. So:
+ // succeeded + shared — work this run did, and did against the target;
+ // skipped — was in the target and is resolved anyway (a mirror
+ // its canonical owns, or a video with no transcript);
+ // without it the bar stalls short of done forever.
+ // `fresh` is deliberately EXCLUDED: a video already fresh was never in the
+ // target, and counting it would drive the bar past 100% on any channel that
+ // is mostly done — 90 fresh of 100 would report 100/10.
+ const done = result.succeeded + result.shared + result.skipped;
const remainingAudioSeconds = Math.max(
0,
totalAudioSeconds - resolvedAudioSeconds,