| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using MediaBrowser.Controller.Net;
 
- using MediaBrowser.Model.Services;
 
- using Emby.Server.Implementations.HttpServer;
 
- 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;
 
-         }
 
-     }
 
- }
 
 
  |