diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index 167e61d..11ad1b6 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -37,33 +37,34 @@ func (c *Controller) ServePing(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) + id, err := params.GetID("id") if err != nil || id.Type != specid.Track { 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{} - c.DB. - Preload("Album"). - Preload("Artist"). - First(track, id.Value) - // clients will provide time in miliseconds, so use that or - // instead convert UnixNano to miliseconds + if err := c.DB.Preload("Album").Preload("Artist").First(track, id.Value).Error; err != nil { + return spec.NewError(0, "error finding track: %v", err) + } + optStamp := params.GetOrTime("time", time.Now()) optSubmission := params.GetOrBool("submission", true) + var scrobbleErrs multierr.Err for _, scrobbler := range c.Scrobblers { if err := scrobbler.Scrobble(user, track, optStamp, optSubmission); err != nil { scrobbleErrs.Add(err) } } + if scrobbleErrs.Len() > 0 { log.Printf("error when submitting: %v", scrobbleErrs) return spec.NewError(0, "error when submitting: %v", scrobbleErrs) } + 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 { var trackCount int - c.DB. - Model(db.Track{}). - Count(&trackCount) + if err := c.DB.Model(db.Track{}).Count(&trackCount).Error; err != nil { + return spec.NewError(0, "error finding track count: %v", err) + } + sub := spec.NewResponse() sub.ScanStatus = &spec.ScanStatus{ Scanning: scanner.IsScanning(), @@ -103,6 +105,7 @@ func (c *Controller) ServeGetUser(r *http.Request) *spec.Response { user := r.Context().Value(CtxUser).(*db.User) hasLastFM := user.LastFMSession != "" hasListenBrainz := user.ListenBrainzToken != "" + sub := spec.NewResponse() sub.User = &spec.User{ Username: user.Name, diff --git a/server/scrobble/listenbrainz/listenbrainz.go b/server/scrobble/listenbrainz/listenbrainz.go index 2752f1a..e8a0a8e 100644 --- a/server/scrobble/listenbrainz/listenbrainz.go +++ b/server/scrobble/listenbrainz/listenbrainz.go @@ -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) req, _ := http.NewRequest(http.MethodPost, submitURL, &payloadBuf) req.Header.Add("Authorization", authHeader) - res, err := http.DefaultClient.Do(req) + resp, err := http.DefaultClient.Do(req) if err != nil { return fmt.Errorf("http post: %w", err) } - if res.StatusCode == http.StatusUnauthorized { - return fmt.Errorf("unathorized error scrobbling to listenbrainz %w", ErrListenBrainz) + defer resp.Body.Close() + 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 }