Files
godeez/internal/deezer/track.go
T

92 lines
1.8 KiB
Go

package deezer
import (
"encoding/json"
"fmt"
"strconv"
"github.com/flytam/filenamify"
)
type Contributors struct {
MainArtists []string `json:"main_artist"`
Composers []string `json:"composer"`
Authors []string `json:"author"`
}
func (c *Contributors) UnmarshalJSON(data []byte) error {
if string(data) == "[]" {
*c = Contributors{}
return nil
}
type Alias Contributors
aux := (*Alias)(c)
return json.Unmarshal(data, aux)
}
type Track struct {
ID string `json:"SNG_ID"`
Artist string `json:"ART_NAME"`
Title string `json:"SNG_TITLE"`
Version string `json:"VERSION"`
Cover string `json:"ALB_PICTURE"`
Contributors Contributors `json:"SNG_CONTRIBUTORS"`
Duration string `json:"DURATION"`
Gain string `json:"GAIN"`
ISRC string `json:"ISRC"`
TrackNumber string `json:"TRACK_NUMBER"`
TrackToken string `json:"TRACK_TOKEN"`
}
func (t *Track) FullTitle() string {
if t.Version != "" {
return t.Title + " " + t.Version
}
return t.Title
}
func (t *Track) Filename(kind Kind, format string) string {
ext := "mp3"
switch format {
case "FLAC":
ext = "flac"
case "WAV":
ext = "wav"
}
prefix := ""
if kind == KindAlbum {
if n, err := strconv.Atoi(t.TrackNumber); err == nil {
prefix = fmt.Sprintf("%02d. ", n)
} else {
prefix = t.TrackNumber + ". "
}
}
base := fmt.Sprintf("%s%s - %s", prefix, t.Artist, t.FullTitle())
base, _ = filenamify.Filenamify(base, filenamify.Options{MaxLength: 255})
base = truncateBytes(base, 255-len(ext)-1-len("-id3v2"))
return base + "." + ext
}
func truncateBytes(s string, maxLen int) string {
if maxLen <= 0 {
return ""
}
if len(s) <= maxLen {
return s
}
last := 0
for i := range s {
if i > maxLen {
return s[:last]
}
last = i
}
return s[:last]
}