Merge branch 'master' into use-development-exception-page

This commit is contained in:
Mark Monteiro 2020-04-02 13:51:53 -04:00
commit eadad73117
9 changed files with 77 additions and 38 deletions

View file

@ -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)

View file

@ -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>[]
{ {

View file

@ -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"
} }

View file

@ -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);

View file

@ -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)
{ {

View file

@ -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;
});
} }
} }
}) })

View file

@ -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.

View file

@ -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}'");
} }
} }
} }

View file

@ -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