| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | #pragma warning disable CS1591using System;using System.Collections.Generic;using System.Linq;using Emby.Server.Implementations.HttpServer;using MediaBrowser.Controller.Net;using MediaBrowser.Model.Services;namespace Emby.Server.Implementations.Services{    [Route("/swagger", "GET", Summary = "Gets the swagger specifications")]    [Route("/swagger.json", "GET", Summary = "Gets the swagger specifications")]    public class GetSwaggerSpec : IReturn<SwaggerSpec>    {    }    public class SwaggerSpec    {        public string swagger { get; set; }        public string[] schemes { get; set; }        public SwaggerInfo info { get; set; }        public string host { get; set; }        public string basePath { get; set; }        public SwaggerTag[] tags { get; set; }        public IDictionary<string, Dictionary<string, SwaggerMethod>> paths { get; set; }        public Dictionary<string, SwaggerDefinition> definitions { get; set; }        public SwaggerComponents components { get; set; }    }    public class SwaggerComponents    {        public Dictionary<string, SwaggerSecurityScheme> securitySchemes { get; set; }    }    public class SwaggerSecurityScheme    {        public string name { get; set; }        public string type { get; set; }        public string @in { get; set; }    }    public class SwaggerInfo    {        public string description { get; set; }        public string version { get; set; }        public string title { get; set; }        public string termsOfService { get; set; }        public SwaggerConcactInfo contact { get; set; }    }    public class SwaggerConcactInfo    {        public string email { get; set; }        public string name { get; set; }        public string url { get; set; }    }    public class SwaggerTag    {        public string description { get; set; }        public string name { get; set; }    }    public class SwaggerMethod    {        public string summary { get; set; }        public string description { get; set; }        public string[] tags { get; set; }        public string operationId { get; set; }        public string[] consumes { get; set; }        public string[] produces { get; set; }        public SwaggerParam[] parameters { get; set; }        public Dictionary<string, SwaggerResponse> responses { get; set; }        public Dictionary<string, string[]>[] security { get; set; }    }    public class SwaggerParam    {        public string @in { get; set; }        public string name { get; set; }        public string description { get; set; }        public bool required { get; set; }        public string type { get; set; }        public string collectionFormat { get; set; }    }    public class SwaggerResponse    {        public string description { get; set; }        // ex. "$ref":"#/definitions/Pet"        public Dictionary<string, string> schema { get; set; }    }    public class SwaggerDefinition    {        public string type { get; set; }        public Dictionary<string, SwaggerProperty> properties { get; set; }    }    public class SwaggerProperty    {        public string type { get; set; }        public string format { get; set; }        public string description { get; set; }        public string[] @enum { get; set; }        public string @default { get; set; }    }    public class SwaggerService : IService, IRequiresRequest    {        private readonly IHttpServer _httpServer;        private SwaggerSpec _spec;        public IRequest Request { get; set; }        public SwaggerService(IHttpServer httpServer)        {            _httpServer = httpServer;        }        public object Get(GetSwaggerSpec request)        {            return _spec ?? (_spec = GetSpec());        }        private SwaggerSpec GetSpec()        {            string host = null;            Uri uri;            if (Uri.TryCreate(Request.RawUrl, UriKind.Absolute, out uri))            {                host = uri.Host;            }            var securitySchemes = new Dictionary<string, SwaggerSecurityScheme>();            securitySchemes["api_key"] = new SwaggerSecurityScheme            {                name = "api_key",                type = "apiKey",                @in = "query"            };            var spec = new SwaggerSpec            {                schemes = new[] { "http" },                tags = GetTags(),                swagger = "2.0",                info = new SwaggerInfo                {                    title = "Jellyfin Server API",                    version = "1.0.0",                    description = "Explore the Jellyfin Server API",                    contact = new SwaggerConcactInfo                    {                        name = "Jellyfin Community",                        url = "https://jellyfin.readthedocs.io/en/latest/user-docs/getting-help/"                    }                },                paths = GetPaths(),                definitions = GetDefinitions(),                basePath = "/jellyfin",                host = host,                components = new SwaggerComponents                {                    securitySchemes = securitySchemes                }            };            return spec;        }        private SwaggerTag[] GetTags()        {            return Array.Empty<SwaggerTag>();        }        private Dictionary<string, SwaggerDefinition> GetDefinitions()        {            return new Dictionary<string, SwaggerDefinition>();        }        private IDictionary<string, Dictionary<string, SwaggerMethod>> GetPaths()        {            var paths = new SortedDictionary<string, Dictionary<string, SwaggerMethod>>();            // REVIEW: this can be done better            var all = ((HttpListenerHost)_httpServer).ServiceController.RestPathMap.OrderBy(i => i.Key, StringComparer.OrdinalIgnoreCase).ToList();            foreach (var current in all)            {                foreach (var info in current.Value)                {                    if (info.IsHidden)                    {                        continue;                    }                    if (info.Path.StartsWith("/mediabrowser", StringComparison.OrdinalIgnoreCase)                        || info.Path.StartsWith("/jellyfin", StringComparison.OrdinalIgnoreCase))                    {                        continue;                    }                    paths[info.Path] = GetPathInfo(info);                }            }            return paths;        }        private Dictionary<string, SwaggerMethod> GetPathInfo(RestPath info)        {            var result = new Dictionary<string, SwaggerMethod>();            foreach (var verb in info.Verbs)            {                var responses = new Dictionary<string, SwaggerResponse>                {                    { "200", new SwaggerResponse { description = "OK" } }                };                var apiKeySecurity = new Dictionary<string, string[]>                {                    { "api_key",  Array.Empty<string>() }                };                result[verb.ToLowerInvariant()] = new SwaggerMethod                {                    summary = info.Summary,                    description = info.Description,                    produces = new[] { "application/json" },                    consumes = new[] { "application/json" },                    operationId = info.RequestType.Name,                    tags = Array.Empty<string>(),                    parameters = Array.Empty<SwaggerParam>(),                    responses = responses,                    security = new[] { apiKeySecurity }                };            }            return result;        }    }}
 |