package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" ) type Image struct { Size string `json:"size"` Href string `json:"#text"` } type AlbumInfo struct { Images []Image `json:"image"` Mbid string Name string `json:"title"` Url string Position `json:"@attr"` } type Date struct { Date string `json:"#text"` Uts string } type PageAttrs struct { TotalPages string Total string Page string User string } type ArtistInfo struct { Name string Mbid string Url string } type Position struct { TrackNumber string `json:"position"` } type TrackInfo struct { Name string Mbid string Duration string Artist ArtistInfo Album AlbumInfo } func (app *App) LfmQuery(payload map[string]string) []byte { r, _ := http.NewRequest("GET", "http://ws.audioscrobbler.com/2.0/", nil) values := r.URL.Query() values.Add("api_key", app.Config.Lfm.ApiKey) values.Add("format", "json") for key, value := range payload { values.Add(key, value) } r.URL.RawQuery = values.Encode() resp, _ := http.DefaultClient.Do(r) body, _ := ioutil.ReadAll(resp.Body) resp.Body.Close() return body } func (a AlbumInfo) GetImage(size string) string { images := a.Images for _, image := range images { if image.Size == size { return image.Href } } return "https://lastfm-img2.akamaized.net/i/u/64s/4128a6eb29f94943c9d206c08e625904.png" } func (app *App) AlbumInfo(artist, album string) AlbumInfo { r := app.LfmQuery(map[string]string{ "method": "album.getInfo", "artist": artist, "album": album, }) var dst map[string]AlbumInfo json.Unmarshal(r, &dst) return dst["album"] } func (app *App) TrackInfo(artist, name string) TrackInfo { r := app.LfmQuery(map[string]string{ "method": "track.getInfo", "artist": artist, "track": name, "autocorrect": "1", }) var dst map[string]TrackInfo json.Unmarshal(r, &dst) return dst["track"] } func (app *App) RecentTracks(user string) { r := app.LfmQuery(map[string]string{ "method": "user.getRecentTracks", "limit": "10", "user": user, }) fmt.Println(string(r)) } func (app *App) LovedTracks(user string) []TrackInfo { r := app.LfmQuery(map[string]string{ "method": "user.getLovedTracks", "limit": "100", "user": user, }) var dst map[string]struct { Attrs PageAttrs `json:"@attr"` Tracks []TrackInfo `json:"track"` } json.Unmarshal(r, &dst) root := dst["lovedtracks"] tracks := root.Tracks return tracks } func (app *App) GetSong(s *Song) { if s.Album != "" { if app.GetSongId(s) != nil { if s.Image == "" { s.Image = app.AlbumInfo(s.Artist, s.Album).GetImage("medium") } if err := app.InsertSong(s); err != nil { log.Println(err) } } } else { t := app.TrackInfo(s.Artist, s.Name) s.Album = t.Album.Name s.Mbid = t.Mbid s.Image = t.Album.GetImage("medium") app.InsertSong(s) } }