create scrobbleopts

This commit is contained in:
sentriz
2020-02-09 17:09:00 +00:00
parent 754067d64a
commit 36829c69e3
2 changed files with 49 additions and 41 deletions

View File

@@ -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)

View File

@@ -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
}