diff --git a/app/download.go b/app/download.go index 5099deb..8c99f33 100644 --- a/app/download.go +++ b/app/download.go @@ -50,7 +50,7 @@ func startAsyncDownload(s *discordgo.Session, i *discordgo.InteractionCreate, ur go func() { // First update the original ephemeral message with "Processing..." _, err := s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{ - Content: ptr(fmt.Sprintf("šŸ”„ Processing download...\nURL: %s\nVideo: %s\nAudio: %s", url, videoFormatID, audioFormatID)), + Content: ptr(fmt.Sprintf("Downloading video: %s", renderProgressBar(0))), }) if err != nil { log.Printf("Error updating interaction: %v", err) @@ -63,24 +63,33 @@ func startAsyncDownload(s *discordgo.Session, i *discordgo.InteractionCreate, ur progressChan = nil continue } - // Update message w/ phase and real time progress - phaseEmoji := "ā¬" if prog.Phase == "post-processing" { - phaseEmoji = "āš™ļø" - } - content := fmt.Sprintf("%s %s\n%s @ %s [eta: %s]\nšŸ“„ %s", - phaseEmoji, - prog.Phase, - prog.Status, - prog.Percent, - prog.ETA, - prog.Filename) - _, err := s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{ - Content: ptr(content), - }) - if err != nil { - log.Printf("Error updating progress: %v", err) + phaseEmoji := "āš™ļø" + content := fmt.Sprintf("%s %s", + phaseEmoji, + prog.Phase) + _, err := s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{ + Content: ptr(content), + }) + if err != nil { + log.Printf("Error updating progress: %v", err) + } + } else { + phaseEmoji := "ā¬" + content := fmt.Sprintf("%s %s: %s [eta: %s]\nšŸ“„ %s", + phaseEmoji, + prog.Phase, + renderProgressBar(prog.PercentFloat), + prog.ETA, + prog.Filename) + _, err := s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{ + Content: ptr(content), + }) + if err != nil { + log.Printf("Error updating progress: %v", err) + } } + case result := <-resultChan: // Handle completion if result.Success { diff --git a/app/misc.go b/app/misc.go index 2afa308..abdaeec 100644 --- a/app/misc.go +++ b/app/misc.go @@ -1,6 +1,19 @@ package main +import ( + "fmt" + "strings" +) + // Helper function to create string pointer func ptr(s string) *string { return &s } + +const progressBarLength = 20 + +func renderProgressBar(percent float64) string { + filled := int(float64(progressBarLength) * percent / 100) + bar := strings.Repeat("ā–ˆ", filled) + strings.Repeat(" ", progressBarLength-filled) + return fmt.Sprintf("[%s] %.0f%%", bar, percent) +} diff --git a/app/types.go b/app/types.go index a0deeda..b889915 100644 --- a/app/types.go +++ b/app/types.go @@ -35,11 +35,12 @@ type FormatOptions struct { } type ProgressUpdate struct { - Status ytdlp.ProgressStatus - Percent string - ETA time.Duration - Filename string - Phase string + Status ytdlp.ProgressStatus + Percent string + PercentFloat float64 + ETA time.Duration + Filename string + Phase string } // InteractionState holds the state for a specific interaction diff --git a/app/ytdlp.go b/app/ytdlp.go index ae72ab3..9557b1b 100644 --- a/app/ytdlp.go +++ b/app/ytdlp.go @@ -124,11 +124,12 @@ func DownloadVideo(out_dir, temp_dir, url string, opts DownloadOptions, progress lastPhase = phase progressChan <- ProgressUpdate{ - Status: prog.Status, - Percent: prog.PercentString(), - ETA: prog.ETA(), - Filename: prog.Filename, - Phase: phase, + Status: prog.Status, + Percent: prog.PercentString(), + PercentFloat: prog.Percent(), + ETA: prog.ETA(), + Filename: prog.Filename, + Phase: phase, } }). Output("%(title)s.%(ext)s")