fix: progress always at 0% and context cancelled before sendDocument
All checks were successful
CI / build (push) Successful in 50s

- 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
This commit is contained in:
2026-06-25 23:49:27 +03:30
parent 37e7f918d0
commit 7c02cd3d89
4 changed files with 22 additions and 8 deletions

View File

@@ -12,7 +12,7 @@ import (
) )
var progressRE = regexp.MustCompile(`\[\w+\]\s+([\d.]+)%\s+of\s+~?([\d.]+)(\w+)`) var progressRE = regexp.MustCompile(`\[\w+\]\s+([\d.]+)%\s+of\s+~?([\d.]+)(\w+)`)
var progressTemplateRE = regexp.MustCompile(`^DLPROG\|([\d.]+)\|(.*?)\|(.*)$`) var progressTemplateRE = regexp.MustCompile(`^DLPROG\|\s*([\d.]+)%\|\s*(.*?)\s*\|(.*)$`)
type progressUpdate struct { type progressUpdate struct {
pct float64 pct float64

View File

@@ -109,21 +109,21 @@ func TestParseProgressTemplate(t *testing.T) {
hasRes bool hasRes bool
}{ }{
{ {
line: "DLPROG|45.2|2.34MiB/s|00:45", line: "DLPROG| 45.2%| 2.34MiB/s|00:45",
pct: 45.2, pct: 45.2,
speed: "2.34MiB/s", speed: "2.34MiB/s",
eta: "00:45", eta: "00:45",
hasRes: true, hasRes: true,
}, },
{ {
line: "DLPROG|100.0|5.00MiB/s|00:00", line: "DLPROG|100.0%| 5.00MiB/s|00:00",
pct: 100.0, pct: 100.0,
speed: "5.00MiB/s", speed: "5.00MiB/s",
eta: "00:00", eta: "00:00",
hasRes: true, hasRes: true,
}, },
{ {
line: "DLPROG|0.0||", line: "DLPROG| 0.0%||",
pct: 0.0, pct: 0.0,
speed: "", speed: "",
eta: "", eta: "",
@@ -142,12 +142,26 @@ func TestParseProgressTemplate(t *testing.T) {
hasRes: false, hasRes: false,
}, },
{ {
line: "DLPROG|50.0|Unknown|Unknown", line: "DLPROG| 50.0%| Unknown|Unknown",
pct: 50.0, pct: 50.0,
speed: "", speed: "",
eta: "", eta: "",
hasRes: true, hasRes: true,
}, },
{
line: "DLPROG| 16.7%| 1.05KiB/s|Unknown",
pct: 16.7,
speed: "1.05KiB/s",
eta: "",
hasRes: true,
},
{
line: "DLPROG| 11.1%| 754.59KiB/s|00:08",
pct: 11.1,
speed: "754.59KiB/s",
eta: "00:08",
hasRes: true,
},
} }
for _, tt := range tests { for _, tt := range tests {
got := parseProgressTemplate(tt.line) got := parseProgressTemplate(tt.line)

View File

@@ -285,7 +285,7 @@ func (c *Client) StartDownload(job *domain.DownloadJob, downloadDir string) (<-c
// Progress reporting using progress-template for machine-readable output // Progress reporting using progress-template for machine-readable output
args = append(args, "--newline") args = append(args, "--newline")
args = append(args, "--progress-template", "stderr:DLPROG|%(progress.percent)s|%(progress.speed)s|%(progress.eta)s") args = append(args, "--progress-template", "DLPROG|%(progress._percent_str)s|%(progress._speed_str)s|%(progress._eta_str)s")
// Language selection if specified // Language selection if specified
if job.Language != "" { if job.Language != "" {

View File

@@ -400,11 +400,11 @@ func (h *Handler) runDownload(ctx context.Context, job *domain.DownloadJob) {
h.trackDownloadProgress(ctx, job, updates) h.trackDownloadProgress(ctx, job, updates)
h.clearActiveJob(job.UserID)
if job.Status == domain.StatusCompleted { if job.Status == domain.StatusCompleted {
h.handleDownloadCompletion(ctx, job) h.handleDownloadCompletion(ctx, job)
} }
h.clearActiveJob(job.UserID)
} }
// trackDownloadProgress reads progress updates from yt-dlp and updates the Telegram message. // trackDownloadProgress reads progress updates from yt-dlp and updates the Telegram message.