feat(downloads): granular post-processing phase labels

ffmpeg post-steps have no byte-progress, so instead of a silent 'Processing' the row now names
the current step (Merging / Extracting audio / Embedding thumbnail / Removing sponsors / Writing
metadata) with an indeterminate pulse. Byte-progress phases (video/audio) keep the % bar.
i18n en/hu/de.
This commit is contained in:
npeter83 2026-07-03 04:01:53 +02:00
parent 4b15d55092
commit fc69656d12
5 changed files with 39 additions and 8 deletions

View file

@ -246,15 +246,30 @@ def _make_progress_hook(job_id: int, asset_id: int):
return hook
def _pp_phase(pp: str) -> str:
"""Map a yt-dlp postprocessor class name to a user-facing phase label. ffmpeg post-steps
aren't byte-progress operations (no %), so the UI shows the step name + an indeterminate
pulse this makes the long merge/finalize legible instead of a silent 'Processing'."""
if "Merg" in pp:
return "merging"
if "ExtractAudio" in pp:
return "audio_extract"
if "Thumbnail" in pp:
return "thumbnail"
if "SponsorBlock" in pp or "ModifyChapters" in pp:
return "sponsorblock"
if "Metadata" in pp:
return "metadata"
return "processing"
def _make_pp_hook(job_id: int):
"""Postprocessor hook: surface the ffmpeg merge/convert/extract step so the bar shows a
'Merging/Processing' label instead of freezing at 100% after the streams finish."""
"""Postprocessor hook: surface the current ffmpeg step so the bar shows a concrete label
(Merging / Embedding thumbnail / ) instead of freezing at 100% after the streams finish."""
def hook(d: dict) -> None:
if d.get("status") in ("started", "processing"):
pp = d.get("postprocessor") or ""
phase = "merging" if "Merg" in pp else "processing"
_set_job(job_id, phase=phase, speed_bps=None, eta_s=None)
_set_job(job_id, phase=_pp_phase(d.get("postprocessor") or ""), speed_bps=None, eta_s=None)
return hook