package jellyfin
import (
"net/http"
"time"
"github.com/gorilla/websocket"
"github.com/navidrome/navidrome/log"
)
const socketKeepAliveInterval = 60
const socketReadTimeout = 90 * time.Second
var socketUpgrader = websocket.Upgrader{
CheckOrigin: func(*http.Request) bool { return true },
}
func (api *Router) handleSocket(w http.ResponseWriter, r *http.Request) {
conn, err := socketUpgrader.Upgrade(w, r, nil)
if err != nil {
log.Warn(r.Context(), "Jellyfin API: WebSocket upgrade failed", err)
return
}
defer conn.Close()
if err := conn.WriteJSON(map[string]any{"MessageType": "ForceKeepAlive", "Data": socketKeepAliveInterval}); err != nil {
log.Warn(r.Context(), "Jellyfin API: WebSocket failed to send ForceKeepAlive", err)
return
}
for {
_ = conn.SetReadDeadline(time.Now().Add(socketReadTimeout))
var msg struct {
MessageType string `json:"MessageType"`
}
if err := conn.ReadJSON(&msg); err != nil {
return
}
if msg.MessageType == "KeepAlive" {
if err := conn.WriteJSON(map[string]any{"MessageType": "KeepAlive"}); err != nil {
return
}
}
}
}