mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-29 11:36:36 +08:00
120 lines
3.2 KiB
Go
120 lines
3.2 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/ShukeBta/MediaStationGo/internal/service"
|
|
)
|
|
|
|
type embyPlayingReq struct {
|
|
ItemId string `json:"ItemId"`
|
|
PositionTicks int64 `json:"PositionTicks"`
|
|
RunTimeTicks int64 `json:"RunTimeTicks"`
|
|
}
|
|
|
|
func embyPlayingProgressHandler(svc *service.Container) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
uid := embyUserID(c)
|
|
if uid == "" {
|
|
c.Status(http.StatusUnauthorized)
|
|
return
|
|
}
|
|
var req embyPlayingReq
|
|
_ = c.ShouldBindJSON(&req)
|
|
if req.ItemId == "" {
|
|
req.ItemId = c.Query("ItemId")
|
|
}
|
|
if req.PositionTicks == 0 {
|
|
req.PositionTicks, _ = strconv.ParseInt(c.Query("PositionTicks"), 10, 64)
|
|
}
|
|
if req.RunTimeTicks == 0 {
|
|
req.RunTimeTicks, _ = strconv.ParseInt(c.Query("RunTimeTicks"), 10, 64)
|
|
}
|
|
if req.ItemId == "" {
|
|
c.Status(http.StatusOK)
|
|
return
|
|
}
|
|
clientInfo := embyClientInfoFromRequest(c)
|
|
if svc.Device != nil && svc.Device.IsDeviceKicked(c.Request.Context(), uid, clientInfo.DeviceID) {
|
|
c.Status(http.StatusUnauthorized)
|
|
return
|
|
}
|
|
_ = svc.Emby.RecordProgress(c.Request.Context(), uid, req.ItemId, req.PositionTicks, req.RunTimeTicks)
|
|
stopped := strings.Contains(strings.ToLower(c.FullPath()+" "+c.Request.URL.Path), "stopped")
|
|
if svc.Sessions != nil {
|
|
svc.Sessions.RecordPlayback(c.Request.Context(), uid, "",
|
|
clientInfo.DeviceID,
|
|
clientInfo.DeviceName,
|
|
clientInfo.Client,
|
|
c.ClientIP(),
|
|
req.ItemId,
|
|
req.PositionTicks,
|
|
req.RunTimeTicks,
|
|
stopped)
|
|
}
|
|
if svc.Device != nil && !stopped {
|
|
svc.Device.RecordPlayback(c.Request.Context(), uid,
|
|
clientInfo.DeviceID,
|
|
clientInfo.DeviceName,
|
|
clientInfo.Client)
|
|
}
|
|
c.Status(http.StatusNoContent)
|
|
}
|
|
}
|
|
|
|
func embyFavoriteHandler(svc *service.Container, fav bool) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
uid := c.Param("userId")
|
|
if uid == "" {
|
|
uid = embyUserID(c)
|
|
}
|
|
mid := c.Param("itemId")
|
|
if uid == "" || mid == "" {
|
|
c.Status(http.StatusBadRequest)
|
|
return
|
|
}
|
|
if err := svc.Emby.SetFavorite(c.Request.Context(), uid, mid, fav); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
out, _ := svc.Emby.Item(c.Request.Context(), mid, uid)
|
|
if out != nil {
|
|
c.JSON(http.StatusOK, out["UserData"])
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"IsFavorite": fav})
|
|
}
|
|
}
|
|
|
|
func embyMarkPlayedHandler(svc *service.Container, played bool) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
uid := c.Param("userId")
|
|
if uid == "" {
|
|
uid = embyUserID(c)
|
|
}
|
|
mid := c.Param("itemId")
|
|
if uid == "" || mid == "" {
|
|
c.Status(http.StatusBadRequest)
|
|
return
|
|
}
|
|
if err := svc.Emby.MarkPlayed(c.Request.Context(), uid, mid, played); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
if played && svc.Device != nil {
|
|
clientInfo := embyClientInfoFromRequest(c)
|
|
svc.Device.RecordPlayback(c.Request.Context(), uid, clientInfo.DeviceID, clientInfo.DeviceName, clientInfo.Client)
|
|
}
|
|
out, _ := svc.Emby.Item(c.Request.Context(), mid, uid)
|
|
if out != nil {
|
|
c.JSON(http.StatusOK, out["UserData"])
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"Played": played})
|
|
}
|
|
}
|