diff --git a/internal/playback/handler/hls_playlist.go b/internal/playback/handler/hls_playlist.go index 5af280f..23b6916 100644 --- a/internal/playback/handler/hls_playlist.go +++ b/internal/playback/handler/hls_playlist.go @@ -1,6 +1,7 @@ package handler import ( + "fmt" "net/http" "net/url" "strings" @@ -22,7 +23,7 @@ func isHLSPlaylistResponse(targetURL string, headers http.Header) bool { func (h *PlaybackHandler) rewriteHLSPlaylist(body string, playlistURL string, referer string) (string, error) { baseURL, err := url.Parse(playlistURL) if err != nil { - return "", err + return "", fmt.Errorf("parse playlist url %q: %w", playlistURL, err) } lines := strings.SplitAfter(body, "\n") @@ -47,7 +48,7 @@ func (h *PlaybackHandler) rewriteHLSPlaylist(body string, playlistURL string, re rewritten, err = h.proxyPlaylistURI(trimmed, baseURL, referer) } if err != nil { - return "", err + return "", fmt.Errorf("rewrite hls playlist line %q: %w", trimmed, err) } } out.WriteString(rewritten) @@ -76,7 +77,7 @@ func (h *PlaybackHandler) rewriteHLSQuotedURIs(line string, baseURL *url.URL, re } proxied, err := h.proxyPlaylistURI(remaining[:end], baseURL, referer) if err != nil { - return "", err + return "", fmt.Errorf("rewrite quoted hls uri %q: %w", remaining[:end], err) } out.WriteString(proxied) remaining = remaining[end:] @@ -86,11 +87,11 @@ func (h *PlaybackHandler) rewriteHLSQuotedURIs(line string, baseURL *url.URL, re func (h *PlaybackHandler) proxyPlaylistURI(rawURI string, baseURL *url.URL, referer string) (string, error) { target, err := baseURL.Parse(rawURI) if err != nil { - return "", err + return "", fmt.Errorf("parse hls uri %q: %w", rawURI, err) } token, err := h.svc.SignProxyToken(target.String(), referer, "stream") if err != nil { - return "", err + return "", fmt.Errorf("sign hls proxy token for %q: %w", target.String(), err) } params := url.Values{} params.Set("token", token) diff --git a/internal/playback/handler/proxy_request.go b/internal/playback/handler/proxy_request.go index ad81268..871f021 100644 --- a/internal/playback/handler/proxy_request.go +++ b/internal/playback/handler/proxy_request.go @@ -2,6 +2,7 @@ package handler import ( "context" + "fmt" netutil "mal/pkg/net" "net/http" ) @@ -9,7 +10,7 @@ import ( func newProxyRequest(ctx context.Context, targetURL string, referer string) (*http.Request, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, nil) if err != nil { - return nil, err + return nil, fmt.Errorf("build proxy request for %q: %w", targetURL, err) } if referer != "" { diff --git a/internal/playback/progress.go b/internal/playback/progress.go index cd35ad0..6494bb9 100644 --- a/internal/playback/progress.go +++ b/internal/playback/progress.go @@ -82,13 +82,13 @@ func (s *playbackService) CompleteAnime(ctx context.Context, userID string, anim CurrentTimeSeconds: entry.CurrentTimeSeconds, }) if err != nil { - return err + return fmt.Errorf("upsert completed watchlist entry user_id=%s anime_id=%d: %w", userID, animeID, err) } } return nil }); err != nil { - return err + return fmt.Errorf("complete anime transaction user_id=%s anime_id=%d: %w", userID, animeID, err) } if err := s.auditSvc.Record(ctx, domain.AuditEvent{ @@ -112,7 +112,7 @@ func (s *playbackService) SaveProgress(ctx context.Context, userID string, anime err := s.repo.InTx(ctx, func(txCtx context.Context, repo domain.PlaybackRepository) error { if _, err := repo.GetAnime(txCtx, animeID); err != nil { if _, err := repo.UpsertAnime(txCtx, minimalAnimeParams(animeID)); err != nil { - return err + return fmt.Errorf("upsert minimal anime %d: %w", animeID, err) } } @@ -124,10 +124,13 @@ func (s *playbackService) SaveProgress(ctx context.Context, userID string, anime CurrentTimeSeconds: timeSeconds, DurationSeconds: sql.NullFloat64{Valid: false}, }) - return err + if err != nil { + return fmt.Errorf("upsert continue watching entry user_id=%s anime_id=%d episode=%d: %w", userID, animeID, episode, err) + } + return nil }) if err != nil { - return err + return fmt.Errorf("save progress transaction user_id=%s anime_id=%d episode=%d: %w", userID, animeID, episode, err) } event := domain.AuditEvent{ @@ -166,7 +169,10 @@ func (s *playbackService) ensureAnimeRow(ctx context.Context, anime domain.Anime return nil } _, err := s.repo.UpsertAnime(ctx, animeParams(anime)) - return err + if err != nil { + return fmt.Errorf("upsert anime %d: %w", anime.MalID, err) + } + return nil } func animeParams(anime domain.Anime) db.UpsertAnimeParams { diff --git a/internal/playback/skip_segments.go b/internal/playback/skip_segments.go index 2cab708..f737a32 100644 --- a/internal/playback/skip_segments.go +++ b/internal/playback/skip_segments.go @@ -24,7 +24,7 @@ func normalizeSkipType(skipType string) (string, error) { case "ed", "ending", "outro": return "ed", nil default: - return "", fmt.Errorf("invalid skip_type") + return "", fmt.Errorf("invalid skip_type %q", skipType) } } @@ -33,19 +33,19 @@ func (s *playbackService) UpsertSkipSegmentOverride(ctx context.Context, userID return fmt.Errorf("not authenticated") } if animeID <= 0 || episode <= 0 { - return fmt.Errorf("invalid anime/episode") + return fmt.Errorf("invalid anime/episode: anime_id=%d episode=%d", animeID, episode) } t, err := normalizeSkipType(skipType) if err != nil { - return err + return fmt.Errorf("normalize skip type: %w", err) } if !(startTime >= 0) || !(endTime > startTime) { - return fmt.Errorf("invalid interval") + return fmt.Errorf("invalid interval: start=%f end=%f", startTime, endTime) } if endTime-startTime < 5 || endTime-startTime > 10*60 { - return fmt.Errorf("interval duration out of range") + return fmt.Errorf("interval duration out of range: duration=%f", endTime-startTime) } - return s.repo.UpsertSkipSegmentOverride(ctx, db.SkipSegmentOverrideRow{ + if err := s.repo.UpsertSkipSegmentOverride(ctx, db.SkipSegmentOverrideRow{ ID: uuid.New().String(), UserID: userID, AnimeID: animeID, @@ -53,7 +53,10 @@ func (s *playbackService) UpsertSkipSegmentOverride(ctx context.Context, userID SkipType: t, StartTime: startTime, EndTime: endTime, - }) + }); err != nil { + return fmt.Errorf("upsert skip segment override: %w", err) + } + return nil } func (s *playbackService) fetchSkipSegments(ctx context.Context, userID string, malID int, episode string) ([]domain.SkipSegment, error) {