--progress-template output is suppressed in non-TTY subprocesses
(yt-dlp issue #13649). The default [download] progress format
works reliably in pipes. Changes:
- Remove --progress-template from yt-dlp args entirely
- Keep --newline for newline-delimited output in pipe
- Fix progressRE regex to handle HLS format: ~ with leading
spaces before size (e.g. '~ 1.00KiB')
- Fix speed parsing in [download] fallback to handle multiple
leading spaces (e.g. 'at 976.20B/s')
- Fix ETA parsing to strip (frag n/m) suffix
- Filter Unknown/N/A speed/eta in [download] fallback
- Add test cases for real HLS fragment output format
- Fix progress template: remove spurious stderr: prefix and switch to
_percent_str/_speed_str/_eta_str keys (progress.percent outputs NA
for HLS streams with unknown total size)
- Update progress regex to match new template format:
DLPROG| 45.2%| 1.05MiB/s|00:45
- Fix context cancellation bug: clearActiveJob was cancelling dlCtx
before handleDownloadCompletion could send the document
- Update progress test cases to match new template output format
- Fix handleBackStep to redirect to download prompt when step state is nil
(previously silent no-op after container selection cleared the state)
- Improve formatLabel for audio-only entries without bitrate: use ID + extension
instead of generic 'audio', fixing duplicate entries in format list
- Add yt-dlp --progress-template for reliable JSON progress parsing across all
sites (fixes 0.0% progress on sites like xnxx.com where [download] lines
are absent); keep regex parser as fallback for older yt-dlp versions
- Add file size pre-check in handleContainerSelection before download starts
(previously checked only after download completed, wasting bandwidth)
- Clear stale active jobs and step state on /start for a clean slate
Telegram bot for downloading media from any site using yt-dlp.
Supports audio/video/both, quality selection, language picker,
container format selection, playlist pagination, progress updates,
per-user quotas, user preferences, download history, cancel at any step,
polling and webhook modes, proxy support, and SQLite persistence.