120 lines
2.6 KiB
Go
120 lines
2.6 KiB
Go
package download
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand/v2"
|
|
"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
|
|
kind deezer.Kind
|
|
}
|
|
|
|
func newProgressTracker(totalTracks int, kind deezer.Kind) *progressTracker {
|
|
return &progressTracker{
|
|
totalTracks: totalTracks,
|
|
kind: kind,
|
|
}
|
|
}
|
|
|
|
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.FullTitle())
|
|
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.FullTitle()
|
|
|
|
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.kind != deezer.KindTrack {
|
|
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")
|
|
}
|
|
}
|