aboutsummaryrefslogtreecommitdiffstats
path: root/lfmclient.go
diff options
context:
space:
mode:
Diffstat (limited to 'lfmclient.go')
-rw-r--r--lfmclient.go129
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)
}
}