- Get top tracks pulling correctly :)
This commit is contained in:
Daniel Mason 2021-04-08 19:00:13 +12:00
parent 3f3296e649
commit 07bce0ebc2
Signed by: idanoo
GPG key ID: 387387CDBC02F132
9 changed files with 259 additions and 27 deletions

View file

@ -50,8 +50,11 @@ func HandleRequests(port string) {
// No Auth
v1.HandleFunc("/stats", limitMiddleware(handleStats, lightLimiter)).Methods("GET")
v1.HandleFunc("/profile/{username}", limitMiddleware(getProfile, lightLimiter)).Methods("GET")
v1.HandleFunc("/artist/top/{uuid}", limitMiddleware(getArtists, lightLimiter)).Methods("GET")
v1.HandleFunc("/artist/{uuid}", limitMiddleware(getArtist, lightLimiter)).Methods("GET")
v1.HandleFunc("/album/top/{uuid}", limitMiddleware(getArtists, lightLimiter)).Methods("GET")
v1.HandleFunc("/album/{uuid}", limitMiddleware(getAlbum, lightLimiter)).Methods("GET")
v1.HandleFunc("/track/top/{uuid}", limitMiddleware(getTracks, lightLimiter)).Methods("GET")
v1.HandleFunc("/track/{uuid}", limitMiddleware(getTrack, lightLimiter)).Methods("GET")
v1.HandleFunc("/register", limitMiddleware(handleRegister, heavyLimiter)).Methods("POST")
@ -533,6 +536,81 @@ func getTrack(w http.ResponseWriter, r *http.Request) {
w.Write(json)
}
// getArtists - Returns artist data for a user
func getArtists(w http.ResponseWriter, r *http.Request) {
var uuid string
for k, v := range mux.Vars(r) {
if k == "uuid" {
uuid = v
}
}
if uuid == "" {
throwOkError(w, "Invalid UUID")
return
}
artist, err := getArtistByUUID(uuid)
if err != nil {
throwOkError(w, err.Error())
return
}
json, _ := json.Marshal(&artist)
w.WriteHeader(http.StatusOK)
w.Write(json)
}
// getAlbums - Returns album data for a user
func getAlbums(w http.ResponseWriter, r *http.Request) {
var uuid string
for k, v := range mux.Vars(r) {
if k == "uuid" {
uuid = v
}
}
if uuid == "" {
throwOkError(w, "Invalid UUID")
return
}
album, err := getAlbumByUUID(uuid)
if err != nil {
throwOkError(w, err.Error())
return
}
json, _ := json.Marshal(&album)
w.WriteHeader(http.StatusOK)
w.Write(json)
}
// getTracks - Returns track data for a user
func getTracks(w http.ResponseWriter, r *http.Request) {
var uuid string
for k, v := range mux.Vars(r) {
if k == "uuid" {
uuid = v
}
}
if uuid == "" {
throwOkError(w, "Invalid UUID")
return
}
track, err := getTopTracks(uuid)
if err != nil {
throwOkError(w, err.Error())
return
}
json, _ := json.Marshal(&track)
w.WriteHeader(http.StatusOK)
w.Write(json)
}
// postSpotifyResponse - Oauth Response from Spotify
func postSpotifyReponse(w http.ResponseWriter, r *http.Request) {
err := connectSpotifyResponse(r)
@ -587,7 +665,7 @@ func getServerInfo(w http.ResponseWriter, r *http.Request) {
}
info := ServerInfo{
Version: "0.0.22",
Version: "0.0.23",
RegistrationEnabled: cachedRegistrationEnabled,
}

View file

@ -17,6 +17,16 @@ type Track struct {
SpotifyID string `json:"spotify_id"`
}
type TopTrack struct {
UUID string `json:"uuid"`
Name string `json:"name"`
Img string `json:"img"`
Plays int `json:"plays"`
}
type TopTracks struct {
Tracks map[int]TopTrack `json:"tracks"`
}
// insertTrack - This will return if it exists or create it based on MBID > Name
func insertTrack(name string, legnth int, mbid string, spotifyId string, album string, artists []string, tx *sql.Tx) (Track, error) {
track := Track{}
@ -164,3 +174,42 @@ func getTrackByUUID(uuid string) (Track, error) {
return track, nil
}
func getTopTracks(userUuid string) (TopTracks, error) {
var topTracks TopTracks
rows, err := db.Query("SELECT BIN_TO_UUID(`tracks`.`uuid`, true), `tracks`.`name`, IFNULL(`artists`.`img`,''), count(*) "+
"FROM `scrobbles` "+
"JOIN `tracks` ON `tracks`.`uuid` = `scrobbles`.`track` "+
"JOIN track_artist ON track_artist.track = tracks.uuid "+
"JOIN artists ON track_artist.artist = artists.uuid "+
"WHERE `user` = UUID_TO_BIN(?, true) "+
"GROUP BY `scrobbles`.`track` "+
"ORDER BY count(*) DESC "+
"LIMIT 14",
userUuid)
if err != nil {
log.Printf("Failed to fetch top tracks: %+v", err)
return topTracks, errors.New("Failed to fetch top tracks")
}
defer rows.Close()
i := 1
tempTracks := make(map[int]TopTrack)
for rows.Next() {
var track TopTrack
err := rows.Scan(&track.UUID, &track.Name, &track.Img, &track.Plays)
if err != nil {
log.Printf("Failed to fetch track: %+v", err)
return topTracks, errors.New("Failed to fetch track")
}
tempTracks[i] = track
i++
}
topTracks.Tracks = tempTracks
return topTracks, nil
}