diff options
Diffstat (limited to 'lfmclient.go')
| -rw-r--r-- | lfmclient.go | 129 |
1 files changed, 77 insertions, 52 deletions
diff --git a/lfmclient.go b/lfmclient.go index 9c500b7..41ecd37 100644 --- a/lfmclient.go +++ b/lfmclient.go @@ -2,35 +2,41 @@ package main import ( "encoding/json" + "fmt" "io/ioutil" "log" "net/http" - "strconv" ) -type AlbumImage struct { +type Image 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 []Image `json:"image"` + Mbid string + Name string `json:"title"` + Url string + Position `json:"@attr"` } -type AlbumInfo struct { - Images []AlbumImage `json:"image"` - Mbid string `json:"mbid"` - Name string `json:"title"` +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 `json:"name"` + Name string + Mbid string + Url string } type Position struct { @@ -38,12 +44,11 @@ type Position struct { } 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"` + Name string + Mbid string + Duration string + Artist ArtistInfo + Album AlbumInfo } func (app *App) LfmQuery(payload map[string]string) []byte { @@ -57,10 +62,21 @@ func (app *App) LfmQuery(payload map[string]string) []byte { r.URL.RawQuery = values.Encode() resp, _ := http.DefaultClient.Do(r) body, _ := ioutil.ReadAll(resp.Body) + resp.Body.Close() return body } -func (app *App) AlbumImage(artist, album string) string { +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, @@ -68,10 +84,10 @@ func (app *App) AlbumImage(artist, album string) string { }) var dst map[string]AlbumInfo json.Unmarshal(r, &dst) - return dst["album"].GetImage("medium") + return dst["album"] } -func (app *App) TrackInfo(artist, name string) *Scrobble { +func (app *App) TrackInfo(artist, name string) TrackInfo { r := app.LfmQuery(map[string]string{ "method": "track.getInfo", "artist": artist, @@ -80,40 +96,49 @@ func (app *App) TrackInfo(artist, name string) *Scrobble { }) 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 + 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 *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 { +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) } } - 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 + 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) } } |
