package handler import ( "net/http" "strings" "github.com/gin-gonic/gin" "github.com/ShukeBta/MediaStationGo/internal/service" ) func embySystemInfoHandler(svc *service.Container) gin.HandlerFunc { return func(c *gin.Context) { c.JSON(http.StatusOK, embyWithRequestAddress(c, svc.Emby.SystemInfo())) } } func embySystemInfoPublicHandler(svc *service.Container) gin.HandlerFunc { return func(c *gin.Context) { c.JSON(http.StatusOK, embyWithRequestAddress(c, svc.Emby.SystemInfoPublic())) } } func embyRequestBaseURL(c *gin.Context) string { proto := strings.TrimSpace(c.GetHeader("X-Forwarded-Proto")) if proto == "" { if c.Request != nil && c.Request.TLS != nil { proto = "https" } else { proto = "http" } } if comma := strings.Index(proto, ","); comma >= 0 { proto = strings.TrimSpace(proto[:comma]) } host := strings.TrimSpace(c.GetHeader("X-Forwarded-Host")) if host == "" && c.Request != nil { host = strings.TrimSpace(c.Request.Host) } if host == "" { return "" } return strings.TrimRight(proto+"://"+host, "/") } func embyWithRequestAddress(c *gin.Context, payload map[string]any) map[string]any { out := make(map[string]any, len(payload)+2) for key, value := range payload { out[key] = value } if address := embyRequestBaseURL(c); address != "" { out["LocalAddress"] = address out["WanAddress"] = address out["PublishedServerUrl"] = address } return out } func embySystemEndpointHandler(_ *service.Container) gin.HandlerFunc { return func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "IsLocal": true, "IsInNetwork": true, }) } } func embyPingHandler(_ *service.Container) gin.HandlerFunc { return func(c *gin.Context) { // Emby/Jellyfin 期望 plain text "Emby Server" c.String(http.StatusOK, "Emby Server") } } func embyRootHandler(svc *service.Container) gin.HandlerFunc { return func(c *gin.Context) { c.JSON(http.StatusOK, embyPublicSystemInfoPayload(c, svc)) } } func embyPublicSystemInfoPayload(c *gin.Context, svc *service.Container) map[string]any { if svc != nil && svc.Emby != nil { return embyWithRequestAddress(c, svc.Emby.SystemInfoPublic()) } return embyWithRequestAddress(c, map[string]any{ "Id": "mediastation-go-001", "ServerId": "mediastation-go-001", "ServerName": "MediaStationGo", "Version": "4.8.10.0", "ServerVersion": "4.8.10.0", "ProductName": "Emby Server", "OperatingSystem": "Windows", "SupportsHttps": false, "SupportsAutoDiscovery": true, "StartupWizardCompleted": true, }) }