aboutsummaryrefslogtreecommitdiffstats
path: root/lfmclient.go
diff options
context:
space:
mode:
authorThibaut Horel <thibaut.horel@gmail.com>2017-06-19 22:21:33 -0400
committerThibaut Horel <thibaut.horel@gmail.com>2017-06-19 22:21:33 -0400
commita2a69c3fd9f0149650f8c53d985049a38f36f238 (patch)
treef6a696fdece1aa12537c2c343e4162f52a3f2840 /lfmclient.go
parent458294c8de2af24313d5d3e430482fb187128434 (diff)
downloadlastfm-api-a2a69c3fd9f0149650f8c53d985049a38f36f238.tar.gz
Lastfm loved tracks import
Diffstat (limited to 'lfmclient.go')
-rw-r--r--lfmclient.go75
1 files changed, 64 insertions, 11 deletions
diff --git a/lfmclient.go b/lfmclient.go
index bbc0492..1ce822d 100644
--- a/lfmclient.go
+++ b/lfmclient.go
@@ -229,20 +229,73 @@ func (app *App) ImportRecentTracks(user *User) {
}
}
-func (app *App) LovedTracks(user string) []LovedTrack {
- r := app.LfmQuery(map[string]string{
- "method": "user.getLovedTracks",
- "limit": "100",
- "user": user,
- })
- var dst map[string]struct {
+type LovedTracks struct {
+ dst map[string]struct {
Attrs PageAttrs `json:"@attr"`
Tracks []LovedTrack `json:"track"`
}
- json.Unmarshal(r, &dst)
- root := dst["lovedtracks"]
- tracks := root.Tracks
- return tracks
+ payload map[string]string
+ page int
+ done bool
+ *App
+}
+
+func NewLovedTracks(name string, app *App) *LovedTracks {
+ lt := &LovedTracks{App: app, page: 1}
+ lt.payload = map[string]string{
+ "method": "user.getLovedTracks",
+ "limit": "200",
+ "user": name,
+ }
+ return lt
+}
+
+func (lt *LovedTracks) Next() []LovedTrack {
+ if lt.done {
+ return nil
+ }
+ lt.payload["page"] = strconv.Itoa(lt.page)
+ r := lt.App.LfmQuery(lt.payload)
+ json.Unmarshal(r, &lt.dst)
+ root := lt.dst["lovedtracks"]
+ totalPages, _ := strconv.Atoi(root.Attrs.TotalPages)
+ if totalPages == lt.page {
+ lt.done = true
+ }
+ lt.page++
+ return root.Tracks
+}
+
+func (app *App) ImportLovedTracks(user *User) {
+ s := &Session{
+ UserId: user.Id,
+ Client: "import",
+ ClientVersion: "",
+ Key: randomToken(16),
+ Protocol: "1.2.1",
+ }
+ app.PutSession(s)
+ ll, _ := app.LoveImportStats(user.LfmName)
+ lt := NewLovedTracks(user.LfmName, app)
+ ltracks := make([]LovedTrack, 0, 200)
+ li := LoveImport{Count: 0, LfmName: user.LfmName}
+ for tracks := lt.Next(); len(tracks) > 0; tracks = lt.Next() {
+ ltracks = ltracks[:0]
+ for _, t := range tracks {
+ if t.Date.ToTime().Before(ll.Time) {
+ break
+ }
+ ltracks = append(ltracks, t)
+ }
+ if err := app.InsertLovedTracks(ltracks, s); err != nil {
+ log.Println(err)
+ return
+ }
+ li.Count += len(ltracks)
+ }
+ if err := app.InsertLoveImport(&li); err != nil {
+ log.Println(err)
+ }
}
func (app *App) GetSong(s *Song) {