perf: reduce watch progress saves and cache anime API responses

This commit is contained in:
2026-04-26 18:46:54 +02:00
parent df9309282b
commit d6457541ce
4 changed files with 22 additions and 18 deletions

View File

@@ -265,6 +265,9 @@ func (h *Handler) HandleAPIAnime(w http.ResponseWriter, r *http.Request) {
} }
statuses := h.watchlistMap(r.Context(), userIDFromRequest(r)) statuses := h.watchlistMap(r.Context(), userIDFromRequest(r))
w.Header().Set("Cache-Control", "public, max-age=3600")
switch section { switch section {
case "relations": case "relations":
relations, err := h.jikanClient.GetFullRelations(r.Context(), id) relations, err := h.jikanClient.GetFullRelations(r.Context(), id)
@@ -313,15 +316,14 @@ func (h *Handler) HandleAPIAnime(w http.ResponseWriter, r *http.Request) {
func (h *Handler) HandleAPIEpisodes(w http.ResponseWriter, r *http.Request) { func (h *Handler) HandleAPIEpisodes(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path[len("/api/episodes/"):] path := r.URL.Path[len("/api/episodes/"):]
path = strings.Trim(path, "/")
id, err := strconv.Atoi(path) id, err := strconv.Atoi(path)
if err != nil || id <= 0 { if err != nil || id <= 0 {
http.Error(w, "invalid id", http.StatusBadRequest) http.Error(w, "invalid id", http.StatusBadRequest)
return return
} }
currentEpisode := r.URL.Query().Get("current") w.Header().Set("Cache-Control", "public, max-age=3600")
episodes, err := h.getEpisodes(r.Context(), id) episodes, err := h.getEpisodes(r.Context(), id)
if err != nil { if err != nil {
log.Printf("episodes error: %v", err) log.Printf("episodes error: %v", err)

View File

@@ -388,7 +388,7 @@ func (h *Handler) HandleEpisodeData(w http.ResponseWriter, r *http.Request) {
token = source.Token token = source.Token
} }
response := struct { response := struct {
MalID int `json:"mal_id"` MalID int `json:"mal_id"`
Title string `json:"title"` Title string `json:"title"`
CurrentEpisode string `json:"current_episode"` CurrentEpisode string `json:"current_episode"`

View File

@@ -69,8 +69,10 @@ func RequestLogger(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now() start := time.Now()
if strings.HasPrefix(r.URL.Path, "/dist/static/") || if strings.HasPrefix(r.URL.Path, "/dist/") ||
strings.HasPrefix(r.URL.Path, "/static/") || strings.HasPrefix(r.URL.Path, "/static/") ||
strings.HasPrefix(r.URL.Path, "/watch/proxy/stream") ||
strings.HasPrefix(r.URL.Path, "/watch/proxy/segment") ||
r.URL.Path == "/favicon.ico" { r.URL.Path == "/favicon.ico" {
next.ServeHTTP(w, r) next.ServeHTTP(w, r)
return return

View File

@@ -404,7 +404,7 @@ const initPlayer = (): void => {
if (!Number.isInteger(episodeNumber) || episodeNumber <= 0) return if (!Number.isInteger(episodeNumber) || episodeNumber <= 0) return
const safeTime = displayTimeFromAbsolute(video.currentTime) const safeTime = displayTimeFromAbsolute(video.currentTime)
if (lastSavedProgress.episode === currentEpisode && Math.abs(lastSavedProgress.seconds - safeTime) < 2) { if (lastSavedProgress.episode === currentEpisode && Math.abs(lastSavedProgress.seconds - safeTime) < 5) {
return return
} }
@@ -433,7 +433,7 @@ const initPlayer = (): void => {
progressSaveTimer = window.setTimeout(() => { progressSaveTimer = window.setTimeout(() => {
progressSaveTimer = undefined progressSaveTimer = undefined
saveProgress() saveProgress()
}, 1500) }, 30000)
} }
const parseEpisodeFromWatchHref = (href: string): number | null => { const parseEpisodeFromWatchHref = (href: string): number | null => {