diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index 9e1336f..c120ab9 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -55,15 +55,18 @@ func (c *Controller) ServeScrobble(r *http.Request) *spec.Response { Preload("Artist"). First(track, id) // scrobble with above info + opts := lastfm.ScrobbleOpts{ + Track: track, + // clients will provide time in miliseconds, so use that or + // instead convert UnixNano to miliseconds + StampMili: params.GetIntOr("time", int(time.Now().UnixNano()/1e6)), + Submission: params.GetOr("submission", "true") != "false", + } err = lastfm.Scrobble( c.DB.GetSetting("lastfm_api_key"), c.DB.GetSetting("lastfm_secret"), user.LastFMSession, - track, - // clients will provide time in miliseconds, so use that or - // instead convert UnixNano to miliseconds - params.GetIntOr("time", int(time.Now().UnixNano()/1e6)), - params.GetOr("submission", "true") != "false", + opts, ) if err != nil { return spec.NewError(0, "error when submitting: %v", err) diff --git a/server/lastfm/lastfm.go b/server/lastfm/lastfm.go index b2d87a7..0849814 100644 --- a/server/lastfm/lastfm.go +++ b/server/lastfm/lastfm.go @@ -23,42 +23,6 @@ var ( } ) -func GetSession(apiKey, secret, token string) (string, error) { - params := url.Values{} - params.Add("method", "auth.getSession") - params.Add("api_key", apiKey) - params.Add("token", token) - params.Add("api_sig", getParamSignature(params, secret)) - resp, err := makeRequest("GET", params) - if err != nil { - return "", errors.Wrap(err, "making session GET") - } - return resp.Session.Key, nil -} - -func Scrobble(apiKey, secret, session string, track *model.Track, - stampMili int, submission bool) error { - params := url.Values{} - if submission { - params.Add("method", "track.Scrobble") - // last.fm wants the timestamp in seconds - params.Add("timestamp", strconv.Itoa(stampMili/1e3)) - } else { - params.Add("method", "track.updateNowPlaying") - } - params.Add("api_key", apiKey) - params.Add("sk", session) - params.Add("artist", track.TagTrackArtist) - params.Add("track", track.TagTitle) - params.Add("trackNumber", strconv.Itoa(track.TagTrackNumber)) - params.Add("album", track.Album.TagTitle) - params.Add("mbid", track.Album.TagBrainzID) - params.Add("albumArtist", track.Artist.Name) - params.Add("api_sig", getParamSignature(params, secret)) - _, err := makeRequest("POST", params) - return err -} - func getParamSignature(params url.Values, secret string) string { // the parameters must be in order before hashing paramKeys := make([]string, 0) @@ -95,3 +59,44 @@ func makeRequest(method string, params url.Values) (*LastFM, error) { } return lastfm, nil } + +func GetSession(apiKey, secret, token string) (string, error) { + params := url.Values{} + params.Add("method", "auth.getSession") + params.Add("api_key", apiKey) + params.Add("token", token) + params.Add("api_sig", getParamSignature(params, secret)) + resp, err := makeRequest("GET", params) + if err != nil { + return "", errors.Wrap(err, "making session GET") + } + return resp.Session.Key, nil +} + +type ScrobbleOpts struct { + Track *model.Track + StampMili int + Submission bool +} + +func Scrobble(apiKey, secret, session string, opts ScrobbleOpts) error { + params := url.Values{} + if opts.Submission { + params.Add("method", "track.Scrobble") + // last.fm wants the timestamp in seconds + params.Add("timestamp", strconv.Itoa(opts.StampMili/1e3)) + } else { + params.Add("method", "track.updateNowPlaying") + } + params.Add("api_key", apiKey) + params.Add("sk", session) + params.Add("artist", opts.Track.TagTrackArtist) + params.Add("track", opts.Track.TagTitle) + params.Add("trackNumber", strconv.Itoa(opts.Track.TagTrackNumber)) + params.Add("album", opts.Track.Album.TagTitle) + params.Add("mbid", opts.Track.Album.TagBrainzID) + params.Add("albumArtist", opts.Track.Artist.Name) + params.Add("api_sig", getParamSignature(params, secret)) + _, err := makeRequest("POST", params) + return err +}