ApiApplicationBuilderExtensions.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using Jellyfin.Server.Middleware;
  2. using MediaBrowser.Controller.Configuration;
  3. using Microsoft.AspNetCore.Builder;
  4. namespace Jellyfin.Server.Extensions
  5. {
  6. /// <summary>
  7. /// Extensions for adding API specific functionality to the application pipeline.
  8. /// </summary>
  9. public static class ApiApplicationBuilderExtensions
  10. {
  11. /// <summary>
  12. /// Adds swagger and swagger UI to the application pipeline.
  13. /// </summary>
  14. /// <param name="applicationBuilder">The application builder.</param>
  15. /// <param name="serverConfigurationManager">The server configuration.</param>
  16. /// <returns>The updated application builder.</returns>
  17. public static IApplicationBuilder UseJellyfinApiSwagger(
  18. this IApplicationBuilder applicationBuilder,
  19. IServerConfigurationManager serverConfigurationManager)
  20. {
  21. // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
  22. // specifying the Swagger JSON endpoint.
  23. var baseUrl = serverConfigurationManager.Configuration.BaseUrl.Trim('/');
  24. if (!string.IsNullOrEmpty(baseUrl))
  25. {
  26. baseUrl += '/';
  27. }
  28. return applicationBuilder
  29. .UseSwagger(c =>
  30. {
  31. // Custom path requires {documentName}, SwaggerDoc documentName is 'api-docs'
  32. c.RouteTemplate = $"/{baseUrl}{{documentName}}/openapi.json";
  33. })
  34. .UseSwaggerUI(c =>
  35. {
  36. c.DocumentTitle = "Jellyfin API";
  37. c.SwaggerEndpoint($"/{baseUrl}api-docs/openapi.json", "Jellyfin API");
  38. c.RoutePrefix = $"{baseUrl}api-docs/swagger";
  39. c.InjectStylesheet($"/{baseUrl}api-docs/swagger/custom.css");
  40. })
  41. .UseReDoc(c =>
  42. {
  43. c.DocumentTitle = "Jellyfin API";
  44. c.SpecUrl($"/{baseUrl}api-docs/openapi.json");
  45. c.RoutePrefix = $"{baseUrl}api-docs/redoc";
  46. c.InjectStylesheet($"/{baseUrl}api-docs/redoc/custom.css");
  47. });
  48. }
  49. /// <summary>
  50. /// Adds IP based access validation to the application pipeline.
  51. /// </summary>
  52. /// <param name="appBuilder">The application builder.</param>
  53. /// <returns>The updated application builder.</returns>
  54. public static IApplicationBuilder UseIpBasedAccessValidation(this IApplicationBuilder appBuilder)
  55. {
  56. return appBuilder.UseMiddleware<IpBasedAccessValidationMiddleware>();
  57. }
  58. /// <summary>
  59. /// Adds LAN based access filtering to the application pipeline.
  60. /// </summary>
  61. /// <param name="appBuilder">The application builder.</param>
  62. /// <returns>The updated application builder.</returns>
  63. public static IApplicationBuilder UseLanFiltering(this IApplicationBuilder appBuilder)
  64. {
  65. return appBuilder.UseMiddleware<LanFilteringMiddleware>();
  66. }
  67. /// <summary>
  68. /// Adds base url redirection to the application pipeline.
  69. /// </summary>
  70. /// <param name="appBuilder">The application builder.</param>
  71. /// <returns>The updated application builder.</returns>
  72. public static IApplicationBuilder UseBaseUrlRedirection(this IApplicationBuilder appBuilder)
  73. {
  74. return appBuilder.UseMiddleware<BaseUrlRedirectionMiddleware>();
  75. }
  76. /// <summary>
  77. /// Adds a custom message during server startup to the application pipeline.
  78. /// </summary>
  79. /// <param name="appBuilder">The application builder.</param>
  80. /// <returns>The updated application builder.</returns>
  81. public static IApplicationBuilder UseServerStartupMessage(this IApplicationBuilder appBuilder)
  82. {
  83. return appBuilder.UseMiddleware<ServerStartupMessageMiddleware>();
  84. }
  85. /// <summary>
  86. /// Adds a WebSocket request handler to the application pipeline.
  87. /// </summary>
  88. /// <param name="appBuilder">The application builder.</param>
  89. /// <returns>The updated application builder.</returns>
  90. public static IApplicationBuilder UseWebSocketHandler(this IApplicationBuilder appBuilder)
  91. {
  92. return appBuilder.UseMiddleware<WebSocketHandlerMiddleware>();
  93. }
  94. }
  95. }