Add extra info to track page + API

This commit is contained in:
Daniel Mason 2021-08-12 20:52:47 +12:00
parent 97dd3e5bba
commit f914575e09
Signed by: idanoo
GPG key ID: 387387CDBC02F132
9 changed files with 3349 additions and 2525 deletions

View file

@ -554,12 +554,20 @@ func getTrack(w http.ResponseWriter, r *http.Request) {
return
}
// Load track obj
track, err := getTrackByUUID(uuid)
if err != nil {
throwOkError(w, err.Error())
return
}
// Load in Album/Artist info
err = track.loadExtraTrackInfo()
if err != nil {
throwOkError(w, err.Error())
return
}
json, _ := json.Marshal(&track)
w.WriteHeader(http.StatusOK)
w.Write(json)

View file

@ -9,13 +9,15 @@ import (
)
type Track struct {
UUID string `json:"uuid"`
Name string `json:"name"`
Length int `json:"length"`
Desc string `json:"desc"`
Img string `json:"img"`
MusicBrainzID string `json:"mbid"`
SpotifyID string `json:"spotify_id"`
UUID string `json:"uuid"`
Name string `json:"name"`
Length int `json:"length"`
Desc string `json:"desc"`
Img string `json:"img"`
MusicBrainzID string `json:"mbid"`
SpotifyID string `json:"spotify_id"`
Artists []Artist `json:"artists"` // Optional Artist
Albums []Album `json:"albums"` // Optional Albums
}
type TopTrack struct {
@ -219,3 +221,76 @@ func getTopTracks(userUuid string) (TopTracks, error) {
return topTracks, nil
}
func (track *Track) loadExtraTrackInfo() error {
err := track.getArtistsForTrack()
if err != nil {
return err
}
err = track.getAlbumsForTrack()
return err
}
func (track *Track) getArtistsForTrack() error {
artists := []Artist{}
rows, err := db.Query("SELECT BIN_TO_UUID(`track_artist`.`artist`, true) "+
"FROM `track_artist` "+
"WHERE `track_artist`.`track` = UUID_TO_BIN(?, true)",
track.UUID)
if err != nil {
log.Printf("Failed to fetch artists for track: %+v", err)
return errors.New("Failed to fetch top tracks")
}
defer rows.Close()
for rows.Next() {
var artistUUID string
err := rows.Scan(&artistUUID)
if err != nil {
log.Printf("Failed to fetch track_artist: %+v", err)
return errors.New("Failed to fetch track")
}
artist, err := getArtistByUUID(artistUUID)
if err != nil {
return err
}
artists = append(artists, artist)
}
track.Artists = artists
return nil
}
func (track *Track) getAlbumsForTrack() error {
albums := []Album{}
rows, err := db.Query("SELECT BIN_TO_UUID(`track_album`.`album`, true) "+
"FROM `track_album` "+
"WHERE `track_album`.`track` = UUID_TO_BIN(?, true)",
track.UUID)
if err != nil {
log.Printf("Failed to fetch album for track: %+v", err)
return errors.New("Failed to fetch top tracks")
}
defer rows.Close()
for rows.Next() {
var albumUUID string
err := rows.Scan(&albumUUID)
if err != nil {
log.Printf("Failed to fetch track_album: %+v", err)
return errors.New("Failed to fetch track")
}
album, err := getAlbumByUUID(albumUUID)
if err != nil {
return err
}
albums = append(albums, album)
}
track.Albums = albums
return nil
}

View file

@ -145,7 +145,7 @@ func filterSlice(s []string) []string {
}
var result []string
for item, _ := range m {
for item := range m {
result = append(result, item)
}