refactor: wrap bare errors with context in playback package

This commit is contained in:
2026-06-16 10:42:37 +02:00
committed by Milas Holsting
parent 290dc36298
commit ca08af2dbb
4 changed files with 30 additions and 19 deletions

View File

@@ -1,6 +1,7 @@
package handler package handler
import ( import (
"fmt"
"net/http" "net/http"
"net/url" "net/url"
"strings" "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) { func (h *PlaybackHandler) rewriteHLSPlaylist(body string, playlistURL string, referer string) (string, error) {
baseURL, err := url.Parse(playlistURL) baseURL, err := url.Parse(playlistURL)
if err != nil { if err != nil {
return "", err return "", fmt.Errorf("parse playlist url %q: %w", playlistURL, err)
} }
lines := strings.SplitAfter(body, "\n") 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) rewritten, err = h.proxyPlaylistURI(trimmed, baseURL, referer)
} }
if err != nil { if err != nil {
return "", err return "", fmt.Errorf("rewrite hls playlist line %q: %w", trimmed, err)
} }
} }
out.WriteString(rewritten) 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) proxied, err := h.proxyPlaylistURI(remaining[:end], baseURL, referer)
if err != nil { if err != nil {
return "", err return "", fmt.Errorf("rewrite quoted hls uri %q: %w", remaining[:end], err)
} }
out.WriteString(proxied) out.WriteString(proxied)
remaining = remaining[end:] 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) { func (h *PlaybackHandler) proxyPlaylistURI(rawURI string, baseURL *url.URL, referer string) (string, error) {
target, err := baseURL.Parse(rawURI) target, err := baseURL.Parse(rawURI)
if err != nil { if err != nil {
return "", err return "", fmt.Errorf("parse hls uri %q: %w", rawURI, err)
} }
token, err := h.svc.SignProxyToken(target.String(), referer, "stream") token, err := h.svc.SignProxyToken(target.String(), referer, "stream")
if err != nil { if err != nil {
return "", err return "", fmt.Errorf("sign hls proxy token for %q: %w", target.String(), err)
} }
params := url.Values{} params := url.Values{}
params.Set("token", token) params.Set("token", token)

View File

@@ -2,6 +2,7 @@ package handler
import ( import (
"context" "context"
"fmt"
netutil "mal/pkg/net" netutil "mal/pkg/net"
"net/http" "net/http"
) )
@@ -9,7 +10,7 @@ import (
func newProxyRequest(ctx context.Context, targetURL string, referer string) (*http.Request, error) { func newProxyRequest(ctx context.Context, targetURL string, referer string) (*http.Request, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, nil)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("build proxy request for %q: %w", targetURL, err)
} }
if referer != "" { if referer != "" {

View File

@@ -82,13 +82,13 @@ func (s *playbackService) CompleteAnime(ctx context.Context, userID string, anim
CurrentTimeSeconds: entry.CurrentTimeSeconds, CurrentTimeSeconds: entry.CurrentTimeSeconds,
}) })
if err != nil { if err != nil {
return err return fmt.Errorf("upsert completed watchlist entry user_id=%s anime_id=%d: %w", userID, animeID, err)
} }
} }
return nil return nil
}); err != 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{ 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 { err := s.repo.InTx(ctx, func(txCtx context.Context, repo domain.PlaybackRepository) error {
if _, err := repo.GetAnime(txCtx, animeID); err != nil { if _, err := repo.GetAnime(txCtx, animeID); err != nil {
if _, err := repo.UpsertAnime(txCtx, minimalAnimeParams(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, CurrentTimeSeconds: timeSeconds,
DurationSeconds: sql.NullFloat64{Valid: false}, 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 { 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{ event := domain.AuditEvent{
@@ -166,7 +169,10 @@ func (s *playbackService) ensureAnimeRow(ctx context.Context, anime domain.Anime
return nil return nil
} }
_, err := s.repo.UpsertAnime(ctx, animeParams(anime)) _, 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 { func animeParams(anime domain.Anime) db.UpsertAnimeParams {

View File

@@ -24,7 +24,7 @@ func normalizeSkipType(skipType string) (string, error) {
case "ed", "ending", "outro": case "ed", "ending", "outro":
return "ed", nil return "ed", nil
default: 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") return fmt.Errorf("not authenticated")
} }
if animeID <= 0 || episode <= 0 { 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) t, err := normalizeSkipType(skipType)
if err != nil { if err != nil {
return err return fmt.Errorf("normalize skip type: %w", err)
} }
if !(startTime >= 0) || !(endTime > startTime) { 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 { 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(), ID: uuid.New().String(),
UserID: userID, UserID: userID,
AnimeID: animeID, AnimeID: animeID,
@@ -53,7 +53,10 @@ func (s *playbackService) UpsertSkipSegmentOverride(ctx context.Context, userID
SkipType: t, SkipType: t,
StartTime: startTime, StartTime: startTime,
EndTime: endTime, 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) { func (s *playbackService) fetchSkipSegments(ctx context.Context, userID string, malID int, episode string) ([]domain.SkipSegment, error) {