fix: suppress context canceled logs

This commit is contained in:
2026-05-12 16:17:41 +02:00
parent 36d77ad793
commit 1e28e2597c
5 changed files with 99 additions and 31 deletions

View File

@@ -46,7 +46,9 @@ func (h *Handler) HandleCatalog(w http.ResponseWriter, r *http.Request) {
"User": user,
"CurrentPath": r.URL.Path,
}); err != nil {
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 {
if !errors.Is(err, context.Canceled) {
log.Printf("catalog %s error: %v", section, err)
}
if section != "Continue" {
writeInlineLoadError(w, "Failed to load "+section)
}
@@ -85,9 +89,11 @@ 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 {
if !errors.Is(err, context.Canceled) {
log.Printf("fragment render error: %v", err)
}
}
}
func (h *Handler) HandleDiscover(w http.ResponseWriter, r *http.Request) {
user := middleware.GetUser(r.Context())
@@ -96,7 +102,9 @@ func (h *Handler) HandleDiscover(w http.ResponseWriter, r *http.Request) {
"User": user,
"CurrentPath": r.URL.Path,
}); err != nil {
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 {
if !errors.Is(err, context.Canceled) {
log.Printf("discover %s error: %v", section, err)
}
writeInlineLoadError(w, "Failed to load "+section)
return
}
@@ -131,9 +141,11 @@ 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 {
if !errors.Is(err, context.Canceled) {
log.Printf("fragment render error: %v", err)
}
}
}
// HandleBrowse handles anime search/browse with filters. supports htmx partial loading.
func (h *Handler) HandleBrowse(w http.ResponseWriter, r *http.Request) {
@@ -322,7 +334,9 @@ func (h *Handler) HandleAnimeDetails(w http.ResponseWriter, r *http.Request) {
}
if err := g.Wait(); err != nil {
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 {
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 {
if !errors.Is(err, context.Canceled) {
log.Printf("anime details %s error: %v", section, err)
}
writeInlineLoadError(w, "Failed to load "+section)
return
}
@@ -369,9 +387,11 @@ 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 {
if !errors.Is(err, context.Canceled) {
log.Printf("fragment render error: %v", err)
}
}
}
func (h *Handler) HandleHTMLWatchOrder(w http.ResponseWriter, r *http.Request) {
animeIdStr := r.URL.Query().Get("animeId")
@@ -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 {
if !errors.Is(err, context.Canceled) {
log.Printf("watch order error: %v", err)
}
http.Error(w, `<div class="mt-8 text-sm text-red-400">Failed to load watch order.</div>`, http.StatusInternalServerError)
return
}
@@ -402,9 +424,11 @@ func (h *Handler) HandleHTMLWatchOrder(w http.ResponseWriter, r *http.Request) {
"AnimeID": id,
"WatchlistMap": watchlistMap,
}); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
}
func (h *Handler) HandleQuickSearch(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
@@ -418,11 +442,15 @@ 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 {
if !errors.Is(err, context.Canceled) {
log.Printf("quick search error: %v", err)
}
w.WriteHeader(http.StatusOK)
if err := writeJSON(w, []quickSearchResult{}); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("quick search encode error: %v", err)
}
}
return
}
output := make([]quickSearchResult, len(res.Animes))
@@ -436,36 +464,46 @@ func (h *Handler) HandleQuickSearch(w http.ResponseWriter, r *http.Request) {
}
w.WriteHeader(http.StatusOK)
if err := writeJSON(w, output); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("quick search encode error: %v", err)
}
}
}
func (h *Handler) HandleRandomAnime(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
anime, err := h.service.jikanClient.GetRandomAnime(r.Context())
if err != nil {
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 {
if !errors.Is(err, context.Canceled) {
log.Printf("random anime encode error: %v", err)
}
}
return
}
if anime.MalID == 0 {
w.WriteHeader(http.StatusNotFound)
if err := writeJSON(w, map[string]string{"error": "No anime found"}); err != nil {
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 {
if !errors.Is(err, context.Canceled) {
log.Printf("random anime encode error: %v", err)
}
}
}
func (h *Handler) HandleSearch(w http.ResponseWriter, r *http.Request) {
renderNotFoundPage(r, w)
@@ -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 {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
}
}

View File

@@ -1,6 +1,8 @@
package auth
import (
"context"
"errors"
"log"
"net/http"
@@ -20,9 +22,11 @@ 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 {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
}
// HandleLogin validates credentials and creates a session on success
func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) {
@@ -32,8 +36,10 @@ func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) {
"Username": "",
"CurrentPath": r.URL.Path,
}); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
return
}
@@ -46,8 +52,10 @@ func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) {
"Username": username,
"CurrentPath": r.URL.Path,
}); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
return
}
@@ -58,8 +66,10 @@ func (h *Handler) HandleLogin(w http.ResponseWriter, r *http.Request) {
"Username": username,
"CurrentPath": r.URL.Path,
}); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
return
}

View File

@@ -1,8 +1,10 @@
package playback
import (
"context"
"database/sql"
"encoding/json"
"errors"
"fmt"
"io"
"log"
@@ -33,9 +35,11 @@ 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 {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
}
// HandleWatchPage serves the anime watch page.
func (h *Handler) HandleWatchPage(w http.ResponseWriter, r *http.Request) {
@@ -204,9 +208,11 @@ func (h *Handler) HandleWatchPage(w http.ResponseWriter, r *http.Request) {
"WatchlistStatus": watchlistStatus,
"Seasons": allSeasons,
}); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
}
// HandleProxy proxies media requests through the backend to avoid CORS and hide source URLs.
func (h *Handler) HandleProxy(w http.ResponseWriter, r *http.Request) {
@@ -401,9 +407,11 @@ func (h *Handler) HandleEpisodeData(w http.ResponseWriter, r *http.Request) {
"segments": watchData.Segments,
"episode_title": "", // Find episode title if possible
}); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("watch page encode error: %v", err)
}
}
}
// HandleEpisodeThumbnails returns episode list for the thumbnail strip.
func (h *Handler) HandleEpisodeThumbnails(w http.ResponseWriter, r *http.Request) {
@@ -462,9 +470,11 @@ func (h *Handler) HandleEpisodeThumbnails(w http.ResponseWriter, r *http.Request
w.Header().Set("Content-Type", "application/json")
if err := writeJSON(w, results); err != nil {
if !errors.Is(err, context.Canceled) {
log.Printf("thumbnails encode error: %v", err)
}
}
}
func writeJSON(w http.ResponseWriter, v any) error {
return json.NewEncoder(w).Encode(v)

View File

@@ -1,7 +1,9 @@
package watchlist
import (
"context"
"encoding/json"
"errors"
"log"
"net/http"
"strconv"
@@ -120,8 +122,10 @@ 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 {
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 {
if !errors.Is(err, context.Canceled) {
log.Printf("render error: %v", err)
}
}
}

View File

@@ -272,8 +272,10 @@ func (c *Client) getWithCache(ctx context.Context, cacheKey string, ttl time.Dur
return nil
}
}
if !errors.Is(err, context.Canceled) {
log.Printf("jikan: stale cache unmarshal failed or empty, falling back to error: %v", err)
}
}
return err
}