feat: stay in fullscreen when transitioning to next episode

This commit is contained in:
2026-04-26 20:38:09 +02:00
parent 42c71c190c
commit caef6c096c
3 changed files with 25 additions and 57 deletions

View File

@@ -280,52 +280,7 @@ func (h *Handler) HandleSaveProgress(w http.ResponseWriter, r *http.Request) {
return return
} }
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
}
func (h *Handler) HandleCompleteAnime(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
user := middleware.GetUser(r.Context())
if user == nil {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
type completeAnimeRequest struct {
MalID int `json:"mal_id"`
Episode int `json:"episode"`
}
var payload completeAnimeRequest
if err := json.NewDecoder(r.Body).Decode(&payload); err != nil {
http.Error(w, "invalid payload", http.StatusBadRequest)
return
}
if payload.MalID <= 0 || payload.Episode <= 0 {
http.Error(w, "invalid payload", http.StatusBadRequest)
return
}
animeID := int64(payload.MalID)
animeSeed, err := h.ensureAnimeSeed(r.Context(), payload.MalID)
if err != nil {
log.Printf("complete anime failed to resolve anime user_id=%s mal_id=%d err=%v", user.ID, payload.MalID, err)
http.Error(w, "failed to mark anime completed", http.StatusInternalServerError)
return
}
if err := h.svc.CompleteAnime(r.Context(), user.ID, animeID, payload.Episode, animeSeed); err != nil {
log.Printf("complete anime failed user_id=%s mal_id=%d err=%v", user.ID, payload.MalID, err)
http.Error(w, "failed to mark anime completed", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusNoContent)
} }
// HandleEpisodeData returns JSON for episode data (for in-player transitions) // HandleEpisodeData returns JSON for episode data (for in-player transitions)

View File

@@ -82,6 +82,7 @@ func NewRouter(cfg Config) http.Handler {
mux.HandleFunc("/api/watch-progress", playbackHandler.HandleSaveProgress) mux.HandleFunc("/api/watch-progress", playbackHandler.HandleSaveProgress)
mux.HandleFunc("/api/watch-complete", playbackHandler.HandleCompleteAnime) mux.HandleFunc("/api/watch-complete", playbackHandler.HandleCompleteAnime)
mux.HandleFunc("/api/watch/episode/", playbackHandler.HandleEpisodeData) mux.HandleFunc("/api/watch/episode/", playbackHandler.HandleEpisodeData)
mux.HandleFunc("/api/watch/episode/", playbackHandler.HandleEpisodeData)
// Auth Endpoints // Auth Endpoints
mux.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {

View File

@@ -32,6 +32,18 @@ interface EpisodeData {
segments: SkipSegment[] segments: SkipSegment[]
} }
interface EpisodeData {
mal_id: number
title: string
current_episode: string
total_episodes: number
initial_mode: string
token: string
available_modes: string[]
mode_sources: Record<string, ModeSource>
segments: SkipSegment[]
}
let playerInitialized = false let playerInitialized = false
const initPlayer = (): void => { const initPlayer = (): void => {