create scrobbleopts
This commit is contained in:
@@ -55,15 +55,18 @@ func (c *Controller) ServeScrobble(r *http.Request) *spec.Response {
|
|||||||
Preload("Artist").
|
Preload("Artist").
|
||||||
First(track, id)
|
First(track, id)
|
||||||
// scrobble with above info
|
// 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(
|
err = lastfm.Scrobble(
|
||||||
c.DB.GetSetting("lastfm_api_key"),
|
c.DB.GetSetting("lastfm_api_key"),
|
||||||
c.DB.GetSetting("lastfm_secret"),
|
c.DB.GetSetting("lastfm_secret"),
|
||||||
user.LastFMSession,
|
user.LastFMSession,
|
||||||
track,
|
opts,
|
||||||
// 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",
|
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return spec.NewError(0, "error when submitting: %v", err)
|
return spec.NewError(0, "error when submitting: %v", err)
|
||||||
|
|||||||
@@ -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 {
|
func getParamSignature(params url.Values, secret string) string {
|
||||||
// the parameters must be in order before hashing
|
// the parameters must be in order before hashing
|
||||||
paramKeys := make([]string, 0)
|
paramKeys := make([]string, 0)
|
||||||
@@ -95,3 +59,44 @@ func makeRequest(method string, params url.Values) (*LastFM, error) {
|
|||||||
}
|
}
|
||||||
return lastfm, nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user