using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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 { } 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 Dictionary> paths { get; set; } public Dictionary definitions { 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 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 responses { 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 schema { get; set; } } public class SwaggerDefinition { public string type { get; set; } public Dictionary 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 SwaggerSpec _spec; public IRequest Request { get; set; } 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 spec = new SwaggerSpec { schemes = new[] { "http" }, tags = GetTags(), swagger = "2.0", info = new SwaggerInfo { title = "Emby Server API", version = "1.0.0", description = "Explore the Emby Server API", contact = new SwaggerConcactInfo { email = "api@emby.media" }, termsOfService = "https://emby.media/terms" }, paths = GetPaths(), definitions = GetDefinitions(), basePath = "/emby", host = host }; return spec; } private SwaggerTag[] GetTags() { return new SwaggerTag[] { }; } private Dictionary GetDefinitions() { return new Dictionary(); } private Dictionary> GetPaths() { var paths = new Dictionary>(); var all = ServiceController.Instance.RestPathMap.ToList(); foreach (var current in all) { foreach (var info in current.Value) { if (info.Path.StartsWith("/mediabrowser", StringComparison.OrdinalIgnoreCase)) { continue; } if (info.Path.StartsWith("/emby", StringComparison.OrdinalIgnoreCase)) { continue; } paths[info.Path] = GetPathInfo(info); } } return paths; } private Dictionary GetPathInfo(RestPath info) { var result = new Dictionary(); foreach (var verb in info.Verbs) { var responses = new Dictionary { }; responses["200"] = new SwaggerResponse { description = "OK" }; result[verb.ToLower()] = new SwaggerMethod { summary = info.Summary, produces = new[] { "application/json", "application/xml" }, consumes = new[] { "application/json", "application/xml" }, operationId = info.RequestType.Name, tags = new string[] { }, parameters = new SwaggerParam[] { }, responses = responses }; } return result; } } }