From 1e28e2597c76fc414a34083ae018c0f170be9794 Mon Sep 17 00:00:00 2001 From: mkelvers Date: Tue, 12 May 2026 16:17:41 +0200 Subject: [PATCH] fix: suppress context canceled logs --- api/anime/handler.go | 80 +++++++++++++++++++++++++++--------- api/auth/handler.go | 18 ++++++-- api/playback/handler.go | 18 ++++++-- api/watchlist/handler.go | 10 ++++- integrations/jikan/client.go | 4 +- 5 files changed, 99 insertions(+), 31 deletions(-) diff --git a/api/anime/handler.go b/api/anime/handler.go index d9e55ad..cc3d57d 100644 --- a/api/anime/handler.go +++ b/api/anime/handler.go @@ -46,7 +46,9 @@ func (h *Handler) HandleCatalog(w http.ResponseWriter, r *http.Request) { "User": user, "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } @@ -73,7 +75,9 @@ func (h *Handler) renderCatalogSection(w http.ResponseWriter, r *http.Request, s data, err := h.service.GetCatalogSection(r.Context(), userID, section) if err != nil { - log.Printf("catalog %s error: %v", section, err) + if !errors.Is(err, context.Canceled) { + log.Printf("catalog %s error: %v", section, err) + } if section != "Continue" { writeInlineLoadError(w, "Failed to load "+section) } @@ -85,7 +89,9 @@ func (h *Handler) renderCatalogSection(w http.ResponseWriter, r *http.Request, s // render section as htmx partial, not full page if err := templates.GetRenderer().ExecuteFragment(r.Context(), w, "index.gohtml", "catalog_section", data); err != nil { - log.Printf("fragment render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("fragment render error: %v", err) + } } } @@ -96,7 +102,9 @@ func (h *Handler) HandleDiscover(w http.ResponseWriter, r *http.Request) { "User": user, "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } @@ -122,7 +130,9 @@ func (h *Handler) renderDiscoverSection(w http.ResponseWriter, r *http.Request, data, err := h.service.GetDiscoverSection(r.Context(), userID, section) if err != nil { - log.Printf("discover %s error: %v", section, err) + if !errors.Is(err, context.Canceled) { + log.Printf("discover %s error: %v", section, err) + } writeInlineLoadError(w, "Failed to load "+section) return } @@ -131,7 +141,9 @@ func (h *Handler) renderDiscoverSection(w http.ResponseWriter, r *http.Request, data["Section"] = section if err := templates.GetRenderer().ExecuteFragment(r.Context(), w, "discover.gohtml", "discover_section", data); err != nil { - log.Printf("fragment render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("fragment render error: %v", err) + } } } @@ -322,7 +334,9 @@ func (h *Handler) HandleAnimeDetails(w http.ResponseWriter, r *http.Request) { } if err := g.Wait(); err != nil { - log.Printf("anime details fetch error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("anime details fetch error: %v", err) + } renderNotFoundPage(r, w) return } @@ -335,7 +349,9 @@ func (h *Handler) HandleAnimeDetails(w http.ResponseWriter, r *http.Request) { "WatchlistIDs": watchlistIDs, "EpisodesCount": episodesCount, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } @@ -357,7 +373,9 @@ func (h *Handler) renderAnimeDetailsSection(w http.ResponseWriter, r *http.Reque } if err != nil { - log.Printf("anime details %s error: %v", section, err) + if !errors.Is(err, context.Canceled) { + log.Printf("anime details %s error: %v", section, err) + } writeInlineLoadError(w, "Failed to load "+section) return } @@ -369,7 +387,9 @@ func (h *Handler) renderAnimeDetailsSection(w http.ResponseWriter, r *http.Reque // render htmx partial for the section if err := templates.GetRenderer().ExecuteFragment(ctx, w, "anime.gohtml", tplName, data); err != nil { - log.Printf("fragment render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("fragment render error: %v", err) + } } } @@ -383,7 +403,9 @@ func (h *Handler) HandleHTMLWatchOrder(w http.ResponseWriter, r *http.Request) { relations, err := h.service.jikanClient.GetFullRelations(r.Context(), id) if err != nil { - log.Printf("watch order error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("watch order error: %v", err) + } http.Error(w, `
Failed to load watch order.
`, http.StatusInternalServerError) return } @@ -402,7 +424,9 @@ func (h *Handler) HandleHTMLWatchOrder(w http.ResponseWriter, r *http.Request) { "AnimeID": id, "WatchlistMap": watchlistMap, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } } @@ -418,10 +442,14 @@ func (h *Handler) HandleQuickSearch(w http.ResponseWriter, r *http.Request) { } res, err := h.service.jikanClient.SearchAdvanced(r.Context(), query, "", "", "", "", nil, true, 1, 5) if err != nil { - log.Printf("quick search error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("quick search error: %v", err) + } w.WriteHeader(http.StatusOK) if err := writeJSON(w, []quickSearchResult{}); err != nil { - log.Printf("quick search encode error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("quick search encode error: %v", err) + } } return } @@ -436,7 +464,9 @@ func (h *Handler) HandleQuickSearch(w http.ResponseWriter, r *http.Request) { } w.WriteHeader(http.StatusOK) if err := writeJSON(w, output); err != nil { - log.Printf("quick search encode error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("quick search encode error: %v", err) + } } } @@ -445,10 +475,14 @@ func (h *Handler) HandleRandomAnime(w http.ResponseWriter, r *http.Request) { anime, err := h.service.jikanClient.GetRandomAnime(r.Context()) if err != nil { - log.Printf("random anime error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("random anime error: %v", err) + } w.WriteHeader(http.StatusInternalServerError) if err := writeJSON(w, map[string]string{"error": "Failed to fetch random anime"}); err != nil { - log.Printf("random anime encode error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("random anime encode error: %v", err) + } } return } @@ -456,14 +490,18 @@ func (h *Handler) HandleRandomAnime(w http.ResponseWriter, r *http.Request) { if anime.MalID == 0 { w.WriteHeader(http.StatusNotFound) if err := writeJSON(w, map[string]string{"error": "No anime found"}); err != nil { - log.Printf("random anime encode error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("random anime encode error: %v", err) + } } return } w.WriteHeader(http.StatusOK) if err := writeJSON(w, map[string]any{"data": anime}); err != nil { - log.Printf("random anime encode error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("random anime encode error: %v", err) + } } } @@ -476,7 +514,9 @@ func renderNotFoundPage(r *http.Request, w http.ResponseWriter) { if err := templates.GetRenderer().ExecuteTemplate(r.Context(), w, "not_found.gohtml", map[string]any{ "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } diff --git a/api/auth/handler.go b/api/auth/handler.go index 50cb360..fbc8d85 100644 --- a/api/auth/handler.go +++ b/api/auth/handler.go @@ -1,6 +1,8 @@ package auth import ( + "context" + "errors" "log" "net/http" @@ -20,7 +22,9 @@ func (h *Handler) HandleLoginPage(w http.ResponseWriter, r *http.Request) { if err := templates.GetRenderer().ExecuteTemplate(r.Context(), w, "login.gohtml", map[string]any{ "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } } @@ -32,7 +36,9 @@ func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) { "Username": "", "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } return } @@ -46,7 +52,9 @@ func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) { "Username": username, "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } return } @@ -58,7 +66,9 @@ func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) { "Username": username, "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } return } diff --git a/api/playback/handler.go b/api/playback/handler.go index b07e2a1..73aa150 100644 --- a/api/playback/handler.go +++ b/api/playback/handler.go @@ -1,8 +1,10 @@ package playback import ( + "context" "database/sql" "encoding/json" + "errors" "fmt" "io" "log" @@ -33,7 +35,9 @@ func renderNotFoundPage(r *http.Request, w http.ResponseWriter) { if err := templates.GetRenderer().ExecuteTemplate(r.Context(), w, "not_found.gohtml", map[string]any{ "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } } @@ -204,7 +208,9 @@ func (h *Handler) HandleWatchPage(w http.ResponseWriter, r *http.Request) { "WatchlistStatus": watchlistStatus, "Seasons": allSeasons, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } } @@ -401,7 +407,9 @@ func (h *Handler) HandleEpisodeData(w http.ResponseWriter, r *http.Request) { "segments": watchData.Segments, "episode_title": "", // Find episode title if possible }); err != nil { - log.Printf("watch page encode error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("watch page encode error: %v", err) + } } } @@ -462,7 +470,9 @@ func (h *Handler) HandleEpisodeThumbnails(w http.ResponseWriter, r *http.Request w.Header().Set("Content-Type", "application/json") if err := writeJSON(w, results); err != nil { - log.Printf("thumbnails encode error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("thumbnails encode error: %v", err) + } } } diff --git a/api/watchlist/handler.go b/api/watchlist/handler.go index 67e7fb5..f060cb3 100644 --- a/api/watchlist/handler.go +++ b/api/watchlist/handler.go @@ -1,7 +1,9 @@ package watchlist import ( + "context" "encoding/json" + "errors" "log" "net/http" "strconv" @@ -120,7 +122,9 @@ func (h *Handler) HandleGetWatchlist(w http.ResponseWriter, r *http.Request) { if err := templates.GetRenderer().ExecuteTemplate(r.Context(), w, "not_found.gohtml", map[string]any{ "CurrentPath": r.URL.Path, }); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } return } @@ -163,6 +167,8 @@ func (h *Handler) HandleGetWatchlist(w http.ResponseWriter, r *http.Request) { } if err := templates.GetRenderer().ExecuteTemplate(r.Context(), w, templateName, data); err != nil { - log.Printf("render error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("render error: %v", err) + } } } diff --git a/integrations/jikan/client.go b/integrations/jikan/client.go index 8a29210..1c88d76 100644 --- a/integrations/jikan/client.go +++ b/integrations/jikan/client.go @@ -272,7 +272,9 @@ func (c *Client) getWithCache(ctx context.Context, cacheKey string, ttl time.Dur return nil } } - log.Printf("jikan: stale cache unmarshal failed or empty, falling back to error: %v", err) + if !errors.Is(err, context.Canceled) { + log.Printf("jikan: stale cache unmarshal failed or empty, falling back to error: %v", err) + } } return err }