mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-02 09:08:35 +02:00
196 lines
5.6 KiB
Go
196 lines
5.6 KiB
Go
package gobackend
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type deezerTrack struct {
|
|
ID int64 `json:"id"`
|
|
Title string `json:"title"`
|
|
Duration int `json:"duration"`
|
|
TrackPosition int `json:"track_position"`
|
|
DiskNumber int `json:"disk_number"`
|
|
ISRC string `json:"isrc"`
|
|
Link string `json:"link"`
|
|
ReleaseDate string `json:"release_date"`
|
|
ExplicitLyrics bool `json:"explicit_lyrics"`
|
|
ExplicitContentLyrics int `json:"explicit_content_lyrics"`
|
|
Artist deezerArtist `json:"artist"`
|
|
Album deezerAlbumSimple `json:"album"`
|
|
Contributors []deezerArtist `json:"contributors"`
|
|
}
|
|
|
|
// deezerTrackIsExplicit maps Deezer's parental-advisory fields to a boolean:
|
|
// explicit_lyrics is the boolean flag, explicit_content_lyrics uses 1 to mean
|
|
// explicit (0 = clean, 2 = unknown).
|
|
func deezerTrackIsExplicit(track deezerTrack) bool {
|
|
return track.ExplicitLyrics || track.ExplicitContentLyrics == 1
|
|
}
|
|
|
|
type deezerArtist struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Picture string `json:"picture"`
|
|
PictureMedium string `json:"picture_medium"`
|
|
PictureBig string `json:"picture_big"`
|
|
PictureXL string `json:"picture_xl"`
|
|
NbFan int `json:"nb_fan"`
|
|
}
|
|
|
|
type deezerAlbumSimple struct {
|
|
ID int64 `json:"id"`
|
|
Title string `json:"title"`
|
|
Cover string `json:"cover"`
|
|
CoverMedium string `json:"cover_medium"`
|
|
CoverBig string `json:"cover_big"`
|
|
CoverXL string `json:"cover_xl"`
|
|
ReleaseDate string `json:"release_date"`
|
|
RecordType string `json:"record_type"`
|
|
}
|
|
|
|
// deezerTrackArtistDisplay returns the display artist string for a track,
|
|
// preferring the Contributors list (comma-joined) when available, falling
|
|
// back to the primary Artist.Name.
|
|
func deezerTrackArtistDisplay(track deezerTrack) string {
|
|
if len(track.Contributors) > 0 {
|
|
names := make([]string, len(track.Contributors))
|
|
for i, a := range track.Contributors {
|
|
names[i] = a.Name
|
|
}
|
|
return strings.Join(names, ", ")
|
|
}
|
|
return track.Artist.Name
|
|
}
|
|
|
|
func (c *DeezerClient) convertTrack(track deezerTrack) TrackMetadata {
|
|
artistName := deezerTrackArtistDisplay(track)
|
|
|
|
albumImage := track.Album.CoverXL
|
|
if albumImage == "" {
|
|
albumImage = track.Album.CoverBig
|
|
}
|
|
if albumImage == "" {
|
|
albumImage = track.Album.CoverMedium
|
|
}
|
|
if albumImage == "" {
|
|
albumImage = track.Album.Cover
|
|
}
|
|
|
|
releaseDate := track.ReleaseDate
|
|
if releaseDate == "" {
|
|
releaseDate = track.Album.ReleaseDate
|
|
}
|
|
|
|
return TrackMetadata{
|
|
SpotifyID: fmt.Sprintf("deezer:%d", track.ID),
|
|
Artists: artistName,
|
|
Name: track.Title,
|
|
AlbumName: track.Album.Title,
|
|
AlbumArtist: track.Artist.Name,
|
|
DurationMS: track.Duration * 1000,
|
|
Images: albumImage,
|
|
ReleaseDate: releaseDate,
|
|
TrackNumber: track.TrackPosition,
|
|
DiscNumber: track.DiskNumber,
|
|
ExternalURL: track.Link,
|
|
ISRC: track.ISRC,
|
|
AlbumID: fmt.Sprintf("deezer:%d", track.Album.ID),
|
|
ArtistID: fmt.Sprintf("deezer:%d", track.Artist.ID),
|
|
Explicit: deezerTrackIsExplicit(track),
|
|
}
|
|
}
|
|
|
|
type deezerGenre struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type deezerAlbumFull struct {
|
|
ID int64 `json:"id"`
|
|
Title string `json:"title"`
|
|
Cover string `json:"cover"`
|
|
CoverMedium string `json:"cover_medium"`
|
|
CoverBig string `json:"cover_big"`
|
|
CoverXL string `json:"cover_xl"`
|
|
ReleaseDate string `json:"release_date"`
|
|
NbTracks int `json:"nb_tracks"`
|
|
RecordType string `json:"record_type"`
|
|
Label string `json:"label"`
|
|
Copyright string `json:"copyright"`
|
|
Genres struct {
|
|
Data []deezerGenre `json:"data"`
|
|
} `json:"genres"`
|
|
Artist deezerArtist `json:"artist"`
|
|
Contributors []deezerArtist `json:"contributors"`
|
|
Tracks struct {
|
|
Data []deezerTrack `json:"data"`
|
|
} `json:"tracks"`
|
|
}
|
|
|
|
type deezerArtistFull struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Picture string `json:"picture"`
|
|
PictureMedium string `json:"picture_medium"`
|
|
PictureBig string `json:"picture_big"`
|
|
PictureXL string `json:"picture_xl"`
|
|
NbFan int `json:"nb_fan"`
|
|
NbAlbum int `json:"nb_album"`
|
|
}
|
|
|
|
type deezerPlaylistFull struct {
|
|
ID int64 `json:"id"`
|
|
Title string `json:"title"`
|
|
Picture string `json:"picture"`
|
|
PictureMedium string `json:"picture_medium"`
|
|
PictureBig string `json:"picture_big"`
|
|
PictureXL string `json:"picture_xl"`
|
|
NbTracks int `json:"nb_tracks"`
|
|
Creator struct {
|
|
Name string `json:"name"`
|
|
} `json:"creator"`
|
|
Tracks struct {
|
|
Data []deezerTrack `json:"data"`
|
|
} `json:"tracks"`
|
|
}
|
|
|
|
func (c *DeezerClient) getBestArtistImage(artist deezerArtist) string {
|
|
if artist.PictureXL != "" {
|
|
return artist.PictureXL
|
|
}
|
|
if artist.PictureBig != "" {
|
|
return artist.PictureBig
|
|
}
|
|
if artist.PictureMedium != "" {
|
|
return artist.PictureMedium
|
|
}
|
|
return artist.Picture
|
|
}
|
|
|
|
func (c *DeezerClient) getBestArtistImageFull(artist deezerArtistFull) string {
|
|
if artist.PictureXL != "" {
|
|
return artist.PictureXL
|
|
}
|
|
if artist.PictureBig != "" {
|
|
return artist.PictureBig
|
|
}
|
|
if artist.PictureMedium != "" {
|
|
return artist.PictureMedium
|
|
}
|
|
return artist.Picture
|
|
}
|
|
|
|
func (c *DeezerClient) getBestAlbumImage(album deezerAlbumFull) string {
|
|
if album.CoverXL != "" {
|
|
return album.CoverXL
|
|
}
|
|
if album.CoverBig != "" {
|
|
return album.CoverBig
|
|
}
|
|
if album.CoverMedium != "" {
|
|
return album.CoverMedium
|
|
}
|
|
return album.Cover
|
|
}
|