add some logging to ServeScrobble

This commit is contained in:
sentriz
2021-11-05 17:33:37 +00:00
parent c31b3b8d1f
commit 98cab93557
2 changed files with 22 additions and 16 deletions

View File

@@ -37,33 +37,34 @@ func (c *Controller) ServePing(r *http.Request) *spec.Response {
} }
func (c *Controller) ServeScrobble(r *http.Request) *spec.Response { func (c *Controller) ServeScrobble(r *http.Request) *spec.Response {
user := r.Context().Value(CtxUser).(*db.User)
params := r.Context().Value(CtxParams).(params.Params) params := r.Context().Value(CtxParams).(params.Params)
id, err := params.GetID("id") id, err := params.GetID("id")
if err != nil || id.Type != specid.Track { if err != nil || id.Type != specid.Track {
return spec.NewError(10, "please provide an valid `id` track parameter") return spec.NewError(10, "please provide an valid `id` track parameter")
} }
// fetch user to get lastfm session
user := r.Context().Value(CtxUser).(*db.User)
// fetch track for getting info to send to last.fm function
track := &db.Track{} track := &db.Track{}
c.DB. if err := c.DB.Preload("Album").Preload("Artist").First(track, id.Value).Error; err != nil {
Preload("Album"). return spec.NewError(0, "error finding track: %v", err)
Preload("Artist"). }
First(track, id.Value)
// clients will provide time in miliseconds, so use that or
// instead convert UnixNano to miliseconds
optStamp := params.GetOrTime("time", time.Now()) optStamp := params.GetOrTime("time", time.Now())
optSubmission := params.GetOrBool("submission", true) optSubmission := params.GetOrBool("submission", true)
var scrobbleErrs multierr.Err var scrobbleErrs multierr.Err
for _, scrobbler := range c.Scrobblers { for _, scrobbler := range c.Scrobblers {
if err := scrobbler.Scrobble(user, track, optStamp, optSubmission); err != nil { if err := scrobbler.Scrobble(user, track, optStamp, optSubmission); err != nil {
scrobbleErrs.Add(err) scrobbleErrs.Add(err)
} }
} }
if scrobbleErrs.Len() > 0 { if scrobbleErrs.Len() > 0 {
log.Printf("error when submitting: %v", scrobbleErrs) log.Printf("error when submitting: %v", scrobbleErrs)
return spec.NewError(0, "error when submitting: %v", scrobbleErrs) return spec.NewError(0, "error when submitting: %v", scrobbleErrs)
} }
return spec.NewResponse() return spec.NewResponse()
} }
@@ -88,9 +89,10 @@ func (c *Controller) ServeStartScan(r *http.Request) *spec.Response {
func (c *Controller) ServeGetScanStatus(r *http.Request) *spec.Response { func (c *Controller) ServeGetScanStatus(r *http.Request) *spec.Response {
var trackCount int var trackCount int
c.DB. if err := c.DB.Model(db.Track{}).Count(&trackCount).Error; err != nil {
Model(db.Track{}). return spec.NewError(0, "error finding track count: %v", err)
Count(&trackCount) }
sub := spec.NewResponse() sub := spec.NewResponse()
sub.ScanStatus = &spec.ScanStatus{ sub.ScanStatus = &spec.ScanStatus{
Scanning: scanner.IsScanning(), Scanning: scanner.IsScanning(),
@@ -103,6 +105,7 @@ func (c *Controller) ServeGetUser(r *http.Request) *spec.Response {
user := r.Context().Value(CtxUser).(*db.User) user := r.Context().Value(CtxUser).(*db.User)
hasLastFM := user.LastFMSession != "" hasLastFM := user.LastFMSession != ""
hasListenBrainz := user.ListenBrainzToken != "" hasListenBrainz := user.ListenBrainzToken != ""
sub := spec.NewResponse() sub := spec.NewResponse()
sub.User = &spec.User{ sub.User = &spec.User{
Username: user.Name, Username: user.Name,

View File

@@ -81,14 +81,17 @@ func (s *Scrobbler) Scrobble(user *db.User, track *db.Track, stamp time.Time, su
authHeader := fmt.Sprintf("Token %s", user.ListenBrainzToken) authHeader := fmt.Sprintf("Token %s", user.ListenBrainzToken)
req, _ := http.NewRequest(http.MethodPost, submitURL, &payloadBuf) req, _ := http.NewRequest(http.MethodPost, submitURL, &payloadBuf)
req.Header.Add("Authorization", authHeader) req.Header.Add("Authorization", authHeader)
res, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
if err != nil { if err != nil {
return fmt.Errorf("http post: %w", err) return fmt.Errorf("http post: %w", err)
} }
if res.StatusCode == http.StatusUnauthorized { defer resp.Body.Close()
return fmt.Errorf("unathorized error scrobbling to listenbrainz %w", ErrListenBrainz) switch {
case resp.StatusCode == http.StatusUnauthorized:
return fmt.Errorf("unathorized: %w", ErrListenBrainz)
case resp.StatusCode >= 200:
return fmt.Errorf("non >= 400: %d: %w", resp.StatusCode, ErrListenBrainz)
} }
res.Body.Close()
return nil return nil
} }