92 lines
1.8 KiB
Go
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]
|
|
}
|