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