Merge branch 'master' into use-development-exception-page
This commit is contained in:
commit
eadad73117
|
@ -43,6 +43,7 @@ using Emby.Server.Implementations.Playlists;
|
||||||
using Emby.Server.Implementations.ScheduledTasks;
|
using Emby.Server.Implementations.ScheduledTasks;
|
||||||
using Emby.Server.Implementations.Security;
|
using Emby.Server.Implementations.Security;
|
||||||
using Emby.Server.Implementations.Serialization;
|
using Emby.Server.Implementations.Serialization;
|
||||||
|
using Emby.Server.Implementations.Services;
|
||||||
using Emby.Server.Implementations.Session;
|
using Emby.Server.Implementations.Session;
|
||||||
using Emby.Server.Implementations.SocketSharp;
|
using Emby.Server.Implementations.SocketSharp;
|
||||||
using Emby.Server.Implementations.TV;
|
using Emby.Server.Implementations.TV;
|
||||||
|
@ -758,6 +759,7 @@ namespace Emby.Server.Implementations
|
||||||
CertificateInfo = GetCertificateInfo(true);
|
CertificateInfo = GetCertificateInfo(true);
|
||||||
Certificate = GetCertificate(CertificateInfo);
|
Certificate = GetCertificate(CertificateInfo);
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ServiceController>();
|
||||||
serviceCollection.AddSingleton<IHttpListener, WebSocketSharpListener>();
|
serviceCollection.AddSingleton<IHttpListener, WebSocketSharpListener>();
|
||||||
serviceCollection.AddSingleton<IHttpServer, HttpListenerHost>();
|
serviceCollection.AddSingleton<IHttpServer, HttpListenerHost>();
|
||||||
|
|
||||||
|
@ -1063,7 +1065,7 @@ namespace Emby.Server.Implementations
|
||||||
.Where(i => i != null)
|
.Where(i => i != null)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
HttpServer.Init(GetExports<IService>(false), GetExports<IWebSocketListener>(), GetUrlPrefixes());
|
HttpServer.Init(GetExportTypes<IService>(), GetExports<IWebSocketListener>(), GetUrlPrefixes());
|
||||||
|
|
||||||
LibraryManager.AddParts(
|
LibraryManager.AddParts(
|
||||||
GetExports<IResolverIgnoreRule>(),
|
GetExports<IResolverIgnoreRule>(),
|
||||||
|
@ -1507,18 +1509,10 @@ namespace Emby.Server.Implementations
|
||||||
public string GetLocalApiUrl(ReadOnlySpan<char> host)
|
public string GetLocalApiUrl(ReadOnlySpan<char> host)
|
||||||
{
|
{
|
||||||
var url = new StringBuilder(64);
|
var url = new StringBuilder(64);
|
||||||
if (EnableHttps)
|
url.Append(EnableHttps ? "https://" : "http://")
|
||||||
{
|
.Append(host)
|
||||||
url.Append("https://");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
url.Append("http://");
|
|
||||||
}
|
|
||||||
|
|
||||||
url.Append(host)
|
|
||||||
.Append(':')
|
.Append(':')
|
||||||
.Append(HttpPort);
|
.Append(EnableHttps ? HttpsPort : HttpPort);
|
||||||
|
|
||||||
string baseUrl = ServerConfigurationManager.Configuration.BaseUrl;
|
string baseUrl = ServerConfigurationManager.Configuration.BaseUrl;
|
||||||
if (baseUrl.Length != 0)
|
if (baseUrl.Length != 0)
|
||||||
|
|
|
@ -64,6 +64,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
IXmlSerializer xmlSerializer,
|
IXmlSerializer xmlSerializer,
|
||||||
IHttpListener socketListener,
|
IHttpListener socketListener,
|
||||||
ILocalizationManager localizationManager,
|
ILocalizationManager localizationManager,
|
||||||
|
ServiceController serviceController,
|
||||||
IHostEnvironment hostEnvironment)
|
IHostEnvironment hostEnvironment)
|
||||||
{
|
{
|
||||||
_appHost = applicationHost;
|
_appHost = applicationHost;
|
||||||
|
@ -75,6 +76,8 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
_jsonSerializer = jsonSerializer;
|
_jsonSerializer = jsonSerializer;
|
||||||
_xmlSerializer = xmlSerializer;
|
_xmlSerializer = xmlSerializer;
|
||||||
_socketListener = socketListener;
|
_socketListener = socketListener;
|
||||||
|
ServiceController = serviceController;
|
||||||
|
|
||||||
_socketListener.WebSocketConnected = OnWebSocketConnected;
|
_socketListener.WebSocketConnected = OnWebSocketConnected;
|
||||||
_hostEnvironment = hostEnvironment;
|
_hostEnvironment = hostEnvironment;
|
||||||
|
|
||||||
|
@ -95,7 +98,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
|
|
||||||
public string GlobalResponse { get; set; }
|
public string GlobalResponse { get; set; }
|
||||||
|
|
||||||
public ServiceController ServiceController { get; private set; }
|
public ServiceController ServiceController { get; }
|
||||||
|
|
||||||
public object CreateInstance(Type type)
|
public object CreateInstance(Type type)
|
||||||
{
|
{
|
||||||
|
@ -602,17 +605,15 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds the rest handlers.
|
/// Adds the rest handlers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="services">The services.</param>
|
/// <param name="serviceTypes">The service types to register with the <see cref="ServiceController"/>.</param>
|
||||||
/// <param name="listeners"></param>
|
/// <param name="listeners">The web socket listeners.</param>
|
||||||
/// <param name="urlPrefixes"></param>
|
/// <param name="urlPrefixes">The URL prefixes. See <see cref="UrlPrefixes"/>.</param>
|
||||||
public void Init(IEnumerable<IService> services, IEnumerable<IWebSocketListener> listeners, IEnumerable<string> urlPrefixes)
|
public void Init(IEnumerable<Type> serviceTypes, IEnumerable<IWebSocketListener> listeners, IEnumerable<string> urlPrefixes)
|
||||||
{
|
{
|
||||||
_webSocketListeners = listeners.ToArray();
|
_webSocketListeners = listeners.ToArray();
|
||||||
UrlPrefixes = urlPrefixes.ToArray();
|
UrlPrefixes = urlPrefixes.ToArray();
|
||||||
ServiceController = new ServiceController();
|
|
||||||
|
|
||||||
var types = services.Select(r => r.GetType());
|
ServiceController.Init(this, serviceTypes);
|
||||||
ServiceController.Init(this, types);
|
|
||||||
|
|
||||||
ResponseFilters = new Action<IRequest, HttpResponse, object>[]
|
ResponseFilters = new Action<IRequest, HttpResponse, object>[]
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
"Artists": "Umělci",
|
"Artists": "Umělci",
|
||||||
"AuthenticationSucceededWithUserName": "{0} úspěšně ověřen",
|
"AuthenticationSucceededWithUserName": "{0} úspěšně ověřen",
|
||||||
"Books": "Knihy",
|
"Books": "Knihy",
|
||||||
"CameraImageUploadedFrom": "Z {0} byla nahrána nová fotografie",
|
"CameraImageUploadedFrom": "Z {0} byla nahrána nová fotografie z fotoaparátu",
|
||||||
"Channels": "Kanály",
|
"Channels": "Kanály",
|
||||||
"ChapterNameValue": "Kapitola {0}",
|
"ChapterNameValue": "Kapitola {0}",
|
||||||
"Collections": "Kolekce",
|
"Collections": "Kolekce",
|
||||||
|
@ -92,5 +92,27 @@
|
||||||
"UserStoppedPlayingItemWithValues": "{0} zastavil přehrávání {1}",
|
"UserStoppedPlayingItemWithValues": "{0} zastavil přehrávání {1}",
|
||||||
"ValueHasBeenAddedToLibrary": "{0} byl přidán do vaší knihovny médií",
|
"ValueHasBeenAddedToLibrary": "{0} byl přidán do vaší knihovny médií",
|
||||||
"ValueSpecialEpisodeName": "Speciál - {0}",
|
"ValueSpecialEpisodeName": "Speciál - {0}",
|
||||||
"VersionNumber": "Verze {0}"
|
"VersionNumber": "Verze {0}",
|
||||||
|
"TaskDownloadMissingSubtitlesDescription": "Vyhledá na internetu chybějící titulky na základě nastavení metadat.",
|
||||||
|
"TaskDownloadMissingSubtitles": "Stáhnout chybějící titulky",
|
||||||
|
"TaskRefreshChannelsDescription": "Obnoví informace o internetových kanálech.",
|
||||||
|
"TaskRefreshChannels": "Obnovit kanály",
|
||||||
|
"TaskCleanTranscodeDescription": "Odstraní více než 1 den staré transkódované soubory.",
|
||||||
|
"TaskCleanTranscode": "Vyčistit adresář s transkódovaným obsahem",
|
||||||
|
"TaskUpdatePluginsDescription": "Stáhne a nainstaluje aktualizace zásuvných modulů, které mají nastavenou automatickou aktualizaci.",
|
||||||
|
"TaskUpdatePlugins": "Aktualizovat zásuvné moduly",
|
||||||
|
"TaskRefreshPeopleDescription": "Aktualizuje metadata umělců a režisérů ve Vaší knihovně médií.",
|
||||||
|
"TaskRefreshPeople": "Obnovit umělce",
|
||||||
|
"TaskCleanLogsDescription": "Odstraní soubory protokolu, které jsou starší více než {0} dní.",
|
||||||
|
"TaskCleanLogs": "Vyčistit adresář se souborem protokolu",
|
||||||
|
"TaskRefreshLibraryDescription": "Prohledá Vaši knihovnu médií zda neobsahuje nové soubory a obnoví metadatada.",
|
||||||
|
"TaskRefreshLibrary": "Prohledat knihovnu médií",
|
||||||
|
"TaskRefreshChapterImagesDescription": "Vytvoří náhledy videí, které obsahují kapitoly.",
|
||||||
|
"TaskRefreshChapterImages": "Extrahovat obrázky kapitol",
|
||||||
|
"TaskCleanCacheDescription": "Odstraní soubory mezipaměti, které systém již nebude potřebovat.",
|
||||||
|
"TaskCleanCache": "Vyčistit složku s mezipamětí",
|
||||||
|
"TasksChannelsCategory": "Internetové kanály",
|
||||||
|
"TasksApplicationCategory": "Aplikace",
|
||||||
|
"TasksLibraryCategory": "Knihovna",
|
||||||
|
"TasksMaintenanceCategory": "Údržba"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,14 +3,27 @@ using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Emby.Server.Implementations.HttpServer;
|
using Emby.Server.Implementations.HttpServer;
|
||||||
using MediaBrowser.Model.Services;
|
using MediaBrowser.Model.Services;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.Services
|
namespace Emby.Server.Implementations.Services
|
||||||
{
|
{
|
||||||
public delegate object ActionInvokerFn(object intance, object request);
|
public delegate object ActionInvokerFn(object intance, object request);
|
||||||
|
|
||||||
public delegate void VoidActionInvokerFn(object intance, object request);
|
public delegate void VoidActionInvokerFn(object intance, object request);
|
||||||
|
|
||||||
public class ServiceController
|
public class ServiceController
|
||||||
{
|
{
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="ServiceController"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="logger">The <see cref="ServiceController"/> logger.</param>
|
||||||
|
public ServiceController(ILogger<ServiceController> logger)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
public void Init(HttpListenerHost appHost, IEnumerable<Type> serviceTypes)
|
public void Init(HttpListenerHost appHost, IEnumerable<Type> serviceTypes)
|
||||||
{
|
{
|
||||||
foreach (var serviceType in serviceTypes)
|
foreach (var serviceType in serviceTypes)
|
||||||
|
@ -21,6 +34,13 @@ namespace Emby.Server.Implementations.Services
|
||||||
|
|
||||||
public void RegisterService(HttpListenerHost appHost, Type serviceType)
|
public void RegisterService(HttpListenerHost appHost, Type serviceType)
|
||||||
{
|
{
|
||||||
|
// Make sure the provided type implements IService
|
||||||
|
if (!typeof(IService).IsAssignableFrom(serviceType))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Tried to register a service that does not implement IService: {ServiceType}", serviceType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var processedReqs = new HashSet<Type>();
|
var processedReqs = new HashSet<Type>();
|
||||||
|
|
||||||
var actions = ServiceExecGeneral.Reset(serviceType);
|
var actions = ServiceExecGeneral.Reset(serviceType);
|
||||||
|
|
|
@ -308,8 +308,7 @@ namespace Jellyfin.Drawing.Skia
|
||||||
|
|
||||||
if (requiresTransparencyHack || forceCleanBitmap)
|
if (requiresTransparencyHack || forceCleanBitmap)
|
||||||
{
|
{
|
||||||
using (var stream = new SKFileStream(NormalizePath(path)))
|
using (var codec = SKCodec.Create(NormalizePath(path)))
|
||||||
using (var codec = SKCodec.Create(stream))
|
|
||||||
{
|
{
|
||||||
if (codec == null)
|
if (codec == null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,6 +21,7 @@ using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Extensions;
|
using MediaBrowser.Controller.Extensions;
|
||||||
using MediaBrowser.WebDashboard.Api;
|
using MediaBrowser.WebDashboard.Api;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
|
@ -275,10 +276,11 @@ namespace Jellyfin.Server
|
||||||
|
|
||||||
if (appHost.EnableHttps && appHost.Certificate != null)
|
if (appHost.EnableHttps && appHost.Certificate != null)
|
||||||
{
|
{
|
||||||
options.Listen(
|
options.Listen(address, appHost.HttpsPort, listenOptions =>
|
||||||
address,
|
{
|
||||||
appHost.HttpsPort,
|
listenOptions.UseHttps(appHost.Certificate);
|
||||||
listenOptions => listenOptions.UseHttps(appHost.Certificate));
|
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -289,9 +291,11 @@ namespace Jellyfin.Server
|
||||||
|
|
||||||
if (appHost.EnableHttps && appHost.Certificate != null)
|
if (appHost.EnableHttps && appHost.Certificate != null)
|
||||||
{
|
{
|
||||||
options.ListenAnyIP(
|
options.ListenAnyIP(appHost.HttpsPort, listenOptions =>
|
||||||
appHost.HttpsPort,
|
{
|
||||||
listenOptions => listenOptions.UseHttps(appHost.Certificate));
|
listenOptions.UseHttps(appHost.Certificate);
|
||||||
|
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -22,7 +22,6 @@ namespace MediaBrowser.Common.Net
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma warning restore CS1591
|
#pragma warning restore CS1591
|
||||||
#pragma warning restore SA1600
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the type of the content.
|
/// Gets or sets the type of the content.
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace MediaBrowser.Common.System
|
||||||
case OperatingSystemId.Linux: return "Linux";
|
case OperatingSystemId.Linux: return "Linux";
|
||||||
case OperatingSystemId.Darwin: return "macOS";
|
case OperatingSystemId.Darwin: return "macOS";
|
||||||
case OperatingSystemId.Windows: return "Windows";
|
case OperatingSystemId.Windows: return "Windows";
|
||||||
default: throw new Exception($"Unknown OS {Id}");
|
default: throw new PlatformNotSupportedException($"Unknown OS {Id}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,20 +53,20 @@ namespace MediaBrowser.Common.System
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
string osDescription = RuntimeInformation.OSDescription;
|
string osDescription = RuntimeInformation.OSDescription;
|
||||||
if (osDescription.IndexOf("linux", StringComparison.OrdinalIgnoreCase) != -1)
|
if (osDescription.Contains("linux", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return OperatingSystemId.Linux;
|
return OperatingSystemId.Linux;
|
||||||
}
|
}
|
||||||
else if (osDescription.IndexOf("darwin", StringComparison.OrdinalIgnoreCase) != -1)
|
else if (osDescription.Contains("darwin", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return OperatingSystemId.Darwin;
|
return OperatingSystemId.Darwin;
|
||||||
}
|
}
|
||||||
else if (osDescription.IndexOf("bsd", StringComparison.OrdinalIgnoreCase) != -1)
|
else if (osDescription.Contains("bsd", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return OperatingSystemId.BSD;
|
return OperatingSystemId.BSD;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception($"Can't resolve OS with description: '{osDescription}'");
|
throw new PlatformNotSupportedException($"Can't resolve OS with description: '{osDescription}'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace MediaBrowser.Controller.Net
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Inits this instance.
|
/// Inits this instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void Init(IEnumerable<IService> services, IEnumerable<IWebSocketListener> listener, IEnumerable<string> urlPrefixes);
|
void Init(IEnumerable<Type> serviceTypes, IEnumerable<IWebSocketListener> listener, IEnumerable<string> urlPrefixes);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If set, all requests will respond with this message
|
/// If set, all requests will respond with this message
|
||||||
|
|
Loading…
Reference in New Issue
Block a user