package main import ( "encoding/json" "io/ioutil" "log" "net/http" "strconv" ) type AlbumImage struct { Size string `json:"size"` Href string `json:"#text"` } 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" } type AlbumInfo struct { Images []AlbumImage `json:"image"` Mbid string `json:"mbid"` Name string `json:"title"` } type ArtistInfo struct { Name string `json:"name"` } type Position struct { TrackNumber string `json:"position"` } type TrackInfo struct { Name string `json:"name"` Mbid string `json:"mbid"` Duration string `json:"duration"` Artist ArtistInfo `json:"artist"` Album AlbumInfo `json:"album"` Position `json:"@attr"` } 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) return body } func (app *App) AlbumImage(artist, album string) string { 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"].GetImage("medium") } func (app *App) TrackInfo(artist, name string) *Scrobble { r := app.LfmQuery(map[string]string{ "method": "track.getInfo", "artist": artist, "track": name, "autocorrect": "1", }) var dst map[string]TrackInfo json.Unmarshal(r, &dst) track := dst["track"] duration, _ := strconv.Atoi(track.Duration) position, _ := strconv.Atoi(track.TrackNumber) s := &Scrobble{ Artist: NewCorrectable(track.Artist.Name), Album: NewCorrectable(track.Album.Name), TrackName: NewCorrectable(track.Name), Duration: duration * 1000, TrackNumber: position, Mbid: track.Mbid, Image: track.Album.GetImage("medium"), } return s } func (app *App) GetSong(s *Scrobble) { var err error if s.Album.Name != "" { id, _ := app.GetSongId(s.Artist.Name, s.Album.Name, s.TrackName.Name) if id == 0 { s.Image = app.AlbumImage(s.Artist.Name, s.Album.Name) id, err = app.InsertSong(s) if err != nil { log.Println(err) } } s.SongId = id } else { s2 := app.TrackInfo(s.Artist.Name, s.TrackName.Name) id, err := app.InsertSong(s2) if err != nil { log.Println(err) } s.SongId = id } }