perf: reduce watch progress saves and cache anime API responses
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -388,21 +388,21 @@ 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"`
|
||||||
TotalEpisodes int `json:"total_episodes"`
|
TotalEpisodes int `json:"total_episodes"`
|
||||||
InitialMode string `json:"initial_mode"`
|
InitialMode string `json:"initial_mode"`
|
||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
AvailableModes []string `json:"available_modes"`
|
AvailableModes []string `json:"available_modes"`
|
||||||
ModeSources map[string]shared.ModeSource `json:"mode_sources"`
|
ModeSources map[string]shared.ModeSource `json:"mode_sources"`
|
||||||
Segments []shared.SkipSegment `json:"segments"`
|
Segments []shared.SkipSegment `json:"segments"`
|
||||||
}{
|
}{
|
||||||
MalID: malID,
|
MalID: malID,
|
||||||
Title: data.Title,
|
Title: data.Title,
|
||||||
CurrentEpisode: data.CurrentEpisode,
|
CurrentEpisode: data.CurrentEpisode,
|
||||||
TotalEpisodes: anime.Episodes,
|
TotalEpisodes: anime.Episodes,
|
||||||
InitialMode: initialMode,
|
InitialMode: initialMode,
|
||||||
Token: token,
|
Token: token,
|
||||||
AvailableModes: data.AvailableModes,
|
AvailableModes: data.AvailableModes,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 => {
|
||||||
|
|||||||
Reference in New Issue
Block a user