From a2a69c3fd9f0149650f8c53d985049a38f36f238 Mon Sep 17 00:00:00 2001 From: Thibaut Horel Date: Mon, 19 Jun 2017 22:21:33 -0400 Subject: Lastfm loved tracks import --- lfmclient.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 11 deletions(-) (limited to 'lfmclient.go') 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, <.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) { -- cgit v1.2.3-70-g09d2