Files
godeez/internal/downloader/progress.go
T

120 lines
2.6 KiB
Go

package downloader
import (
"fmt"
"math/rand"
"os"
"time"
"github.com/briandowns/spinner"
"github.com/mathismqn/godeez/internal/deezer"
)
type downloadResult struct {
skipped bool
path string
warnings []string
err error
}
type downloadStats struct {
downloaded int
skipped int
failed int
warnings int
}
type progressTracker struct {
stats downloadStats
totalTracks int
resourceType string
}
func newProgressTracker(totalTracks int, resourceType string) *progressTracker {
return &progressTracker{
totalTracks: totalTracks,
resourceType: resourceType,
}
}
func (pt *progressTracker) startDownload(index int, track *deezer.Track) *spinner.Spinner {
trackProgress := fmt.Sprintf("[%d/%d]", index+1, pt.totalTracks)
sp := spinner.New(spinner.CharSets[14], 100*time.Millisecond)
sp.Writer = os.Stdout
sp.Prefix = trackProgress + " "
sp.Suffix = fmt.Sprintf(" Downloading: %s - %s", track.Artist, track.GetTitle())
sp.Start()
return sp
}
func (pt *progressTracker) handleResult(index int, track *deezer.Track, result downloadResult) {
trackProgress := fmt.Sprintf("[%d/%d]", index+1, pt.totalTracks)
trackTitle := track.GetTitle()
if result.skipped {
pt.stats.skipped++
fmt.Printf("%s ↷ Skipped: %s - %s\n Already exists at: %s\n",
trackProgress, track.Artist, trackTitle, result.path)
return
}
if result.err != nil {
pt.stats.failed++
fmt.Printf("%s ✖ Failed: %s - %s:\n Error: %v\n",
trackProgress, track.Artist, trackTitle, result.err)
return
}
pt.stats.downloaded++
if len(result.warnings) > 0 {
pt.stats.warnings++
}
symbol := "✔"
if len(result.warnings) > 0 {
symbol = "⚠"
}
fmt.Printf("%s %s Downloaded: %s - %s\n", trackProgress, symbol, track.Artist, trackTitle)
for _, w := range result.warnings {
fmt.Printf(" Warning: %s\n", w)
}
}
func (pt *progressTracker) printSummary(outputDir string, elapsed time.Duration) {
if pt.resourceType != "track" {
warningsLine := ""
if pt.stats.warnings > 0 {
warningsLine = fmt.Sprintf("\nWarnings: %d", pt.stats.warnings)
}
fmt.Printf(`
================== [ Summary ] ==================
Downloaded: %d
Skipped: %d
Failed: %d%s
Elapsed time: %s
Files saved to: %s
=================================================
`,
pt.stats.downloaded,
pt.stats.skipped,
pt.stats.failed,
warningsLine,
elapsed.Round(time.Second),
outputDir,
)
if pt.stats.downloaded > 0 {
pt.showSupportMessage()
}
}
}
func (*progressTracker) showSupportMessage() {
if rand.Float64() < 0.1 {
fmt.Println("\n⭐ Enjoying GoDeez? Star it on GitHub: https://github.com/mathismqn/godeez")
}
}