mirror of
https://github.com/idanoo/GoScrobble
synced 2025-07-01 13:42:20 +00:00
0.0.23
- Get top tracks pulling correctly :)
This commit is contained in:
parent
3f3296e649
commit
07bce0ebc2
9 changed files with 259 additions and 27 deletions
|
@ -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,
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue