74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package deezer
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"path"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/flytam/filenamify"
|
||
)
|
||
|
||
type Artist struct {
|
||
Results struct {
|
||
Data struct {
|
||
Name string `json:"ART_NAME"`
|
||
} `json:"DATA"`
|
||
Tracks struct {
|
||
Data []*Track `json:"data"`
|
||
} `json:"TOP"`
|
||
} `json:"results"`
|
||
}
|
||
|
||
func (a *Artist) String() string {
|
||
tracks := a.Results.Tracks.Data
|
||
count := len(tracks)
|
||
|
||
totalSec := 0
|
||
for _, t := range tracks {
|
||
if d, err := strconv.Atoi(t.Duration); err == nil {
|
||
totalSec += d
|
||
}
|
||
}
|
||
|
||
limit := min(3, count)
|
||
|
||
var b strings.Builder
|
||
fmt.Fprintf(&b, "============= [ Artist Info ] =============\n")
|
||
fmt.Fprintf(&b, "Artist: %s\n", a.Results.Data.Name)
|
||
fmt.Fprintf(&b, "Tracks: %d\n", count)
|
||
fmt.Fprintf(&b, "Playtime: %s\n", time.Duration(totalSec)*time.Second)
|
||
fmt.Fprintf(&b, "-------------------------------------------\n")
|
||
fmt.Fprintf(&b, "Top %d most popular tracks:\n", limit)
|
||
for i := 0; i < limit; i++ {
|
||
t := tracks[i]
|
||
fmt.Fprintf(&b, " %2d. %s – %s\n", i+1, t.Artist, t.GetTitle())
|
||
}
|
||
fmt.Fprintf(&b, "===========================================\n")
|
||
|
||
return b.String()
|
||
}
|
||
|
||
func (a *Artist) GetTitle() string {
|
||
return a.Results.Data.Name
|
||
}
|
||
|
||
func (a *Artist) GetTracks() []*Track {
|
||
return a.Results.Tracks.Data
|
||
}
|
||
|
||
func (a *Artist) SetTracks(t []*Track) {
|
||
a.Results.Tracks.Data = t
|
||
}
|
||
|
||
func (a *Artist) GetOutputDir(outputDir string) string {
|
||
base, _ := filenamify.Filenamify(a.Results.Data.Name, filenamify.Options{})
|
||
return path.Join(outputDir, base)
|
||
}
|
||
|
||
func (a *Artist) Unmarshal(data []byte) error {
|
||
return json.Unmarshal(data, a)
|
||
}
|