feat: stay in fullscreen when transitioning to next episode
This commit is contained in:
@@ -283,51 +283,6 @@ func (h *Handler) HandleSaveProgress(w http.ResponseWriter, r *http.Request) {
|
|||||||
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)
|
||||||
func (h *Handler) HandleEpisodeData(w http.ResponseWriter, r *http.Request) {
|
func (h *Handler) HandleEpisodeData(w http.ResponseWriter, r *http.Request) {
|
||||||
if r.Method != http.MethodGet {
|
if r.Method != http.MethodGet {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 => {
|
||||||
|
|||||||
Reference in New Issue
Block a user