diff options
| author | Thibaut Horel <thibaut.horel@gmail.com> | 2017-06-07 01:15:43 -0400 |
|---|---|---|
| committer | Thibaut Horel <thibaut.horel@gmail.com> | 2017-06-07 01:15:43 -0400 |
| commit | 3543fcb861a122fe3405bf42f83f6dbc56888b8c (patch) | |
| tree | 30ba1b2057e54754433b7ced0d90dc6993abf3f2 /lfmclient.go | |
| parent | b235490206f5aea8b1c618e7ffdae20ef052e78d (diff) | |
| download | lastfm-api-3543fcb861a122fe3405bf42f83f6dbc56888b8c.tar.gz | |
Get additional song metadata from last.fm
Diffstat (limited to 'lfmclient.go')
| -rw-r--r-- | lfmclient.go | 104 |
1 files changed, 88 insertions, 16 deletions
diff --git a/lfmclient.go b/lfmclient.go index 244ab8c..9c500b7 100644 --- a/lfmclient.go +++ b/lfmclient.go @@ -3,7 +3,9 @@ package main import ( "encoding/json" "io/ioutil" + "log" "net/http" + "strconv" ) type AlbumImage struct { @@ -11,12 +13,8 @@ type AlbumImage struct { Href string `json:"#text"` } -type TrackAlbum struct { - Images []AlbumImage `json:"image"` -} - -func (t TrackGetInfo) GetImage(size string) string { - images := t.Album.Images +func (a AlbumInfo) GetImage(size string) string { + images := a.Images for _, image := range images { if image.Size == size { return image.Href @@ -25,23 +23,97 @@ func (t TrackGetInfo) GetImage(size string) string { return "https://lastfm-img2.akamaized.net/i/u/64s/4128a6eb29f94943c9d206c08e625904.png" } -type TrackGetInfo struct { - Mbid string `json:"mbid"` - Album TrackAlbum `jon:"album"` +type AlbumInfo struct { + Images []AlbumImage `json:"image"` + Mbid string `json:"mbid"` + Name string `json:"title"` +} + +type ArtistInfo struct { + Name string `json:"name"` } -func (app *App) TrackInfo(track string, artist string) TrackGetInfo { +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("method", "track.getInfo") values.Add("api_key", app.Config.Lfm.ApiKey) - values.Add("artist", artist) - values.Add("track", track) 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) - var dst map[string]TrackGetInfo - json.Unmarshal(body, &dst) - return dst["track"] + 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 + } } |
