@ -1,3 +1,5 @@
#nullable disable
#pragma warning disable CS1591
using System ;
@ -36,7 +38,6 @@ using Emby.Server.Implementations.Playlists;
using Emby.Server.Implementations.Plugins ;
using Emby.Server.Implementations.QuickConnect ;
using Emby.Server.Implementations.ScheduledTasks ;
using Emby.Server.Implementations.Security ;
using Emby.Server.Implementations.Serialization ;
using Emby.Server.Implementations.Session ;
using Emby.Server.Implementations.SyncPlay ;
@ -57,7 +58,6 @@ using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Chapters ;
using MediaBrowser.Controller.Collections ;
using MediaBrowser.Controller.Configuration ;
using MediaBrowser.Controller.Devices ;
using MediaBrowser.Controller.Dlna ;
using MediaBrowser.Controller.Drawing ;
using MediaBrowser.Controller.Dto ;
@ -73,7 +73,6 @@ using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Providers ;
using MediaBrowser.Controller.QuickConnect ;
using MediaBrowser.Controller.Resolvers ;
using MediaBrowser.Controller.Security ;
using MediaBrowser.Controller.Session ;
using MediaBrowser.Controller.Sorting ;
using MediaBrowser.Controller.Subtitles ;
@ -101,7 +100,6 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection ;
using Microsoft.Extensions.Logging ;
using Prometheus.DotNetRuntime ;
using OperatingSystem = MediaBrowser . Common . System . OperatingSystem ;
using WebSocketManager = Emby . Server . Implementations . HttpServer . WebSocketManager ;
namespace Emby.Server.Implementations
@ -116,6 +114,11 @@ namespace Emby.Server.Implementations
/// </summary>
private static readonly string [ ] _relevantEnvVarPrefixes = { "JELLYFIN_" , "DOTNET_" , "ASPNETCORE_" } ;
/// <summary>
/// The disposable parts.
/// </summary>
private readonly List < IDisposable > _disposableParts = new List < IDisposable > ( ) ;
private readonly IFileSystem _fileSystemManager ;
private readonly IConfiguration _startupConfig ;
private readonly IXmlSerializer _xmlSerializer ;
@ -127,6 +130,62 @@ namespace Emby.Server.Implementations
private ISessionManager _sessionManager ;
private string [ ] _urlPrefixes ;
/// <summary>
/// Gets or sets all concrete types.
/// </summary>
/// <value>All concrete types.</value>
private Type [ ] _allConcreteTypes ;
private DeviceId _deviceId ;
private bool _disposed = false ;
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationHost"/> class.
/// </summary>
/// <param name="applicationPaths">Instance of the <see cref="IServerApplicationPaths"/> interface.</param>
/// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
/// <param name="options">Instance of the <see cref="IStartupOptions"/> interface.</param>
/// <param name="startupConfig">The <see cref="IConfiguration" /> interface.</param>
/// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
/// <param name="serviceCollection">Instance of the <see cref="IServiceCollection"/> interface.</param>
public ApplicationHost (
IServerApplicationPaths applicationPaths ,
ILoggerFactory loggerFactory ,
IStartupOptions options ,
IConfiguration startupConfig ,
IFileSystem fileSystem ,
IServiceCollection serviceCollection )
{
ApplicationPaths = applicationPaths ;
LoggerFactory = loggerFactory ;
_startupOptions = options ;
_startupConfig = startupConfig ;
_fileSystemManager = fileSystem ;
ServiceCollection = serviceCollection ;
Logger = LoggerFactory . CreateLogger < ApplicationHost > ( ) ;
fileSystem . AddShortcutHandler ( new MbLinkShortcutHandler ( fileSystem ) ) ;
ApplicationVersion = typeof ( ApplicationHost ) . Assembly . GetName ( ) . Version ;
ApplicationVersionString = ApplicationVersion . ToString ( 3 ) ;
ApplicationUserAgent = Name . Replace ( ' ' , '-' ) + "/" + ApplicationVersionString ;
_xmlSerializer = new MyXmlSerializer ( ) ;
ConfigurationManager = new ServerConfigurationManager ( ApplicationPaths , LoggerFactory , _xmlSerializer , _fileSystemManager ) ;
_pluginManager = new PluginManager (
LoggerFactory . CreateLogger < PluginManager > ( ) ,
this ,
ConfigurationManager . Configuration ,
ApplicationPaths . PluginsPath ,
ApplicationVersion ) ;
}
/// <summary>
/// Occurs when [has pending restart changed].
/// </summary>
public event EventHandler HasPendingRestartChanged ;
/// <summary>
/// Gets a value indicating whether this instance can self restart.
/// </summary>
@ -148,13 +207,7 @@ namespace Emby.Server.Implementations
return false ;
}
if ( OperatingSystem . Id = = OperatingSystemId . Windows
| | OperatingSystem . Id = = OperatingSystemId . Darwin )
{
return true ;
}
return false ;
return OperatingSystem . IsWindows ( ) | | OperatingSystem . IsMacOS ( ) ;
}
}
@ -163,11 +216,6 @@ namespace Emby.Server.Implementations
/// </summary>
public INetworkManager NetManager { get ; internal set ; }
/// <summary>
/// Occurs when [has pending restart changed].
/// </summary>
public event EventHandler HasPendingRestartChanged ;
/// <summary>
/// Gets a value indicating whether this instance has changes that require the entire application to restart.
/// </summary>
@ -195,22 +243,11 @@ namespace Emby.Server.Implementations
/// <value>The application paths.</value>
protected IServerApplicationPaths ApplicationPaths { get ; set ; }
/// <summary>
/// Gets or sets all concrete types.
/// </summary>
/// <value>All concrete types.</value>
private Type [ ] _allConcreteTypes ;
/// <summary>
/// The disposable parts.
/// </summary>
private readonly List < IDisposable > _disposableParts = new List < IDisposable > ( ) ;
/// <summary>
/// Gets or sets the configuration manager.
/// </summary>
/// <value>The configuration manager.</value>
p rotected I ConfigurationManager ConfigurationManager { get ; set ; }
public ServerConfigurationManager ConfigurationManager { get ; set ; }
/// <summary>
/// Gets or sets the service provider.
@ -232,69 +269,54 @@ namespace Emby.Server.Implementations
/// </summary>
public string PublishedServerUrl = > _startupOptions . PublishedServerUrl ? ? _startupConfig [ UdpServer . AddressOverrideConfigKey ] ;
/// <inheritdoc />
public Version ApplicationVersion { get ; }
/// <inheritdoc />
public string ApplicationVersionString { get ; }
/// <summary>
/// Gets the server configuration manager.
/// Gets the current application user agent .
/// </summary>
/// <value>The server configuration manager.</value>
public IServerConfigurationManager ServerConfigurationManager = > ( IServerConfigurationManager ) ConfigurationManager ;
/// <value>The application user agent .</value>
public string ApplicationUserAgent { get ; }
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationHost"/> class.
/// Gets the email address for use within a comment section of a user agent field.
/// Presently used to provide contact information to MusicBrainz service.
/// </summary>
/// <param name="applicationPaths">Instance of the <see cref="IServerApplicationPaths"/> interface.</param>
/// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
/// <param name="options">Instance of the <see cref="IStartupOptions"/> interface.</param>
/// <param name="startupConfig">The <see cref="IConfiguration" /> interface.</param>
/// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
/// <param name="serviceCollection">Instance of the <see cref="IServiceCollection"/> interface.</param>
public ApplicationHost (
IServerApplicationPaths applicationPaths ,
ILoggerFactory loggerFactory ,
IStartupOptions options ,
IConfiguration startupConfig ,
IFileSystem fileSystem ,
IServiceCollection serviceCollection )
{
_xmlSerializer = new MyXmlSerializer ( ) ;
ServiceCollection = serviceCollection ;
ApplicationPaths = applicationPaths ;
LoggerFactory = loggerFactory ;
_fileSystemManager = fileSystem ;
public string ApplicationUserAgentAddress = > "team@jellyfin.org" ;
ConfigurationManager = new ServerConfigurationManager ( ApplicationPaths , LoggerFactory , _xmlSerializer , _fileSystemManager ) ;
// Have to migrate settings here as migration subsystem not yet initialised.
MigrateNetworkConfiguration ( ) ;
/// <summary>
/// Gets the current application name.
/// </summary>
/// <value>The application name.</value>
public string ApplicationProductName { get ; } = FileVersionInfo . GetVersionInfo ( Assembly . GetEntryAssembly ( ) . Location ) . ProductName ;
// Have to pre-register the NetworkConfigurationFactory, as the configuration sub-system is not yet initialised.
ConfigurationManager . RegisterConfiguration < NetworkConfigurationFactory > ( ) ;
NetManager = new NetworkManager ( ( IServerConfigurationManager ) ConfigurationManager , LoggerFactory . CreateLogger < NetworkManager > ( ) ) ;
public string SystemId
{
get
{
_deviceId ? ? = new DeviceId ( ApplicationPaths , LoggerFactory ) ;
Logger = LoggerFactory . CreateLogger < ApplicationHost > ( ) ;
return _deviceId . Value ;
}
}
_startupOptions = options ;
_startupConfig = startupConfig ;
/// <inheritdoc/>
public string Name = > ApplicationProductName ;
// Initialize runtime stat collection
if ( ServerConfigurationManager . Configuration . EnableMetrics )
{
DotNetRuntimeStatsBuilder . Default ( ) . StartCollecting ( ) ;
}
private CertificateInfo CertificateInfo { get ; set ; }
fileSystem . AddShortcutHandler ( new MbLinkShortcutHandler ( fileSystem ) ) ;
public X509Certificate2 Certificate { get ; private set ; }
ApplicationVersion = typeof ( ApplicationHost ) . Assembly . GetName ( ) . Version ;
ApplicationVersionString = ApplicationVersion . ToString ( 3 ) ;
ApplicationUserAgent = Name . Replace ( ' ' , '-' ) + "/" + ApplicationVersionString ;
/// <inheritdoc/>
public bool ListenWithHttps = > Certificate ! = null & & ConfigurationManager . GetNetworkConfiguration ( ) . EnableHttps ;
_pluginManager = new PluginManager (
LoggerFactory . CreateLogger < PluginManager > ( ) ,
this ,
ServerConfigurationManager . Configuration ,
ApplicationPaths . PluginsPath ,
ApplicationVersion ) ;
}
public string FriendlyName = >
string . IsNullOrEmpty ( ConfigurationManager . Configuration . ServerName )
? Environment . MachineName
: ConfigurationManager . Configuration . ServerName ;
/// <summary>
/// Temporary function to migration network settings out of system.xml and into network.xml.
@ -306,9 +328,9 @@ namespace Emby.Server.Implementations
if ( ! File . Exists ( path ) )
{
var networkSettings = new NetworkConfiguration ( ) ;
ClassMigrationHelper . CopyProperties ( Server ConfigurationManager. Configuration , networkSettings ) ;
ClassMigrationHelper . CopyProperties ( ConfigurationManager. Configuration , networkSettings ) ;
_xmlSerializer . SerializeToFile ( networkSettings , path ) ;
Logger ? .LogDebug ( "Successfully migrated network settings." ) ;
Logger .LogDebug ( "Successfully migrated network settings." ) ;
}
}
@ -328,48 +350,6 @@ namespace Emby.Server.Implementations
. Replace ( appPaths . InternalMetadataPath , appPaths . VirtualInternalMetadataPath , StringComparison . OrdinalIgnoreCase ) ;
}
/// <inheritdoc />
public Version ApplicationVersion { get ; }
/// <inheritdoc />
public string ApplicationVersionString { get ; }
/// <summary>
/// Gets the current application user agent.
/// </summary>
/// <value>The application user agent.</value>
public string ApplicationUserAgent { get ; }
/// <summary>
/// Gets the email address for use within a comment section of a user agent field.
/// Presently used to provide contact information to MusicBrainz service.
/// </summary>
public string ApplicationUserAgentAddress = > "team@jellyfin.org" ;
/// <summary>
/// Gets the current application name.
/// </summary>
/// <value>The application name.</value>
public string ApplicationProductName { get ; } = FileVersionInfo . GetVersionInfo ( Assembly . GetEntryAssembly ( ) . Location ) . ProductName ;
private DeviceId _deviceId ;
public string SystemId
{
get
{
if ( _deviceId = = null )
{
_deviceId = new DeviceId ( ApplicationPaths , LoggerFactory ) ;
}
return _deviceId . Value ;
}
}
/// <inheritdoc/>
public string Name = > ApplicationProductName ;
/// <summary>
/// Creates an instance of type and resolves all constructor dependencies.
/// </summary>
@ -393,10 +373,7 @@ namespace Emby.Server.Implementations
/// <returns>System.Object.</returns>
protected object CreateInstanceSafe ( Type type )
{
if ( _creatingInstances = = null )
{
_creatingInstances = new List < Type > ( ) ;
}
_creatingInstances ? ? = new List < Type > ( ) ;
if ( _creatingInstances . IndexOf ( type ) ! = - 1 )
{
@ -490,6 +467,7 @@ namespace Emby.Server.Implementations
/// <summary>
/// Runs the startup tasks.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns><see cref="Task" />.</returns>
public async Task RunStartupTasksAsync ( CancellationToken cancellationToken )
{
@ -503,7 +481,7 @@ namespace Emby.Server.Implementations
_mediaEncoder . SetFFmpegPath ( ) ;
Logger . LogInformation ( "ServerId: { 0 }", SystemId ) ;
Logger . LogInformation ( "ServerId: { ServerId }", SystemId ) ;
var entryPoints = GetExports < IServerEntryPoint > ( ) ;
@ -545,7 +523,21 @@ namespace Emby.Server.Implementations
/// <inheritdoc/>
public void Init ( )
{
var networkConfiguration = ServerConfigurationManager . GetNetworkConfiguration ( ) ;
DiscoverTypes ( ) ;
ConfigurationManager . AddParts ( GetExports < IConfigurationFactory > ( ) ) ;
// Have to migrate settings here as migration subsystem not yet initialised.
MigrateNetworkConfiguration ( ) ;
NetManager = new NetworkManager ( ConfigurationManager , LoggerFactory . CreateLogger < NetworkManager > ( ) ) ;
// Initialize runtime stat collection
if ( ConfigurationManager . Configuration . EnableMetrics )
{
DotNetRuntimeStatsBuilder . Default ( ) . StartCollecting ( ) ;
}
var networkConfiguration = ConfigurationManager . GetNetworkConfiguration ( ) ;
HttpPort = networkConfiguration . HttpServerPortNumber ;
HttpsPort = networkConfiguration . HttpsPortNumber ;
@ -563,8 +555,6 @@ namespace Emby.Server.Implementations
} ;
Certificate = GetCertificate ( CertificateInfo ) ;
DiscoverTypes ( ) ;
RegisterServices ( ) ;
_pluginManager . RegisterServices ( ServiceCollection ) ;
@ -579,7 +569,8 @@ namespace Emby.Server.Implementations
ServiceCollection . AddMemoryCache ( ) ;
ServiceCollection . AddSingleton ( ConfigurationManager ) ;
ServiceCollection . AddSingleton < IServerConfigurationManager > ( ConfigurationManager ) ;
ServiceCollection . AddSingleton < IConfigurationManager > ( ConfigurationManager ) ;
ServiceCollection . AddSingleton < IApplicationHost > ( this ) ;
ServiceCollection . AddSingleton < IPluginManager > ( _pluginManager ) ;
ServiceCollection . AddSingleton < IApplicationPaths > ( ApplicationPaths ) ;
@ -606,8 +597,6 @@ namespace Emby.Server.Implementations
ServiceCollection . AddSingleton < IServerApplicationHost > ( this ) ;
ServiceCollection . AddSingleton < IServerApplicationPaths > ( ApplicationPaths ) ;
ServiceCollection . AddSingleton ( ServerConfigurationManager ) ;
ServiceCollection . AddSingleton < ILocalizationManager , LocalizationManager > ( ) ;
ServiceCollection . AddSingleton < IBlurayExaminer , BdInfoExaminer > ( ) ;
@ -617,14 +606,8 @@ namespace Emby.Server.Implementations
ServiceCollection . AddSingleton < IItemRepository , SqliteItemRepository > ( ) ;
ServiceCollection . AddSingleton < IAuthenticationRepository , AuthenticationRepository > ( ) ;
// TODO: Refactor to eliminate the circular dependency here so that Lazy<T> isn't required
ServiceCollection . AddTransient ( provider = > new Lazy < IDtoService > ( provider . GetRequiredService < IDtoService > ) ) ;
// TODO: Refactor to eliminate the circular dependency here so that Lazy<T> isn't required
ServiceCollection . AddTransient ( provider = > new Lazy < EncodingHelper > ( provider . GetRequiredService < EncodingHelper > ) ) ;
ServiceCollection . AddSingleton < IMediaEncoder , MediaBrowser . MediaEncoding . Encoder . MediaEncoder > ( ) ;
ServiceCollection . AddSingleton < EncodingHelper > ( ) ;
// TODO: Refactor to eliminate the circular dependencies here so that Lazy<T> isn't required
ServiceCollection . AddTransient ( provider = > new Lazy < ILibraryMonitor > ( provider . GetRequiredService < ILibraryMonitor > ) ) ;
@ -644,8 +627,6 @@ namespace Emby.Server.Implementations
ServiceCollection . AddSingleton < ITVSeriesManager , TVSeriesManager > ( ) ;
ServiceCollection . AddSingleton < IDeviceManager , DeviceManager > ( ) ;
ServiceCollection . AddSingleton < IMediaSourceManager , MediaSourceManager > ( ) ;
ServiceCollection . AddSingleton < ISubtitleManager , SubtitleManager > ( ) ;
@ -681,16 +662,13 @@ namespace Emby.Server.Implementations
ServiceCollection . AddSingleton < IEncodingManager , MediaEncoder . EncodingManager > ( ) ;
ServiceCollection . AddSingleton < IAuthorizationContext , AuthorizationContext > ( ) ;
ServiceCollection . AddSingleton < ISessionContext , SessionContext > ( ) ;
ServiceCollection . AddScoped < ISessionContext , SessionContext > ( ) ;
ServiceCollection . AddSingleton < IAuthService , AuthService > ( ) ;
ServiceCollection . AddSingleton < IQuickConnect , QuickConnectManager > ( ) ;
ServiceCollection . AddSingleton < ISubtitleEncoder , MediaBrowser . MediaEncoding . Subtitles . SubtitleEncoder > ( ) ;
ServiceCollection . AddSingleton < EncodingHelper > ( ) ;
ServiceCollection . AddSingleton < IAttachmentExtractor , MediaBrowser . MediaEncoding . Attachments . AttachmentExtractor > ( ) ;
ServiceCollection . AddSingleton < TranscodingJobHelper > ( ) ;
@ -713,8 +691,6 @@ namespace Emby.Server.Implementations
_mediaEncoder = Resolve < IMediaEncoder > ( ) ;
_sessionManager = Resolve < ISessionManager > ( ) ;
( ( AuthenticationRepository ) Resolve < IAuthenticationRepository > ( ) ) . Initialize ( ) ;
SetStaticProperties ( ) ;
var userDataRepo = ( SqliteUserDataRepository ) Resolve < IUserDataRepository > ( ) ;
@ -743,7 +719,7 @@ namespace Emby.Server.Implementations
logger . LogInformation ( "Environment Variables: {EnvVars}" , relevantEnvVars ) ;
logger . LogInformation ( "Arguments: {Args}" , commandLineArgs ) ;
logger . LogInformation ( "Operating system: {OS}" , OperatingSystem. Name ) ;
logger . LogInformation ( "Operating system: {OS}" , MediaBrowser. Common . System . OperatingSystem. Name ) ;
logger . LogInformation ( "Architecture: {Architecture}" , RuntimeInformation . OSArchitecture ) ;
logger . LogInformation ( "64-Bit Process: {Is64Bit}" , Environment . Is64BitProcess ) ;
logger . LogInformation ( "User Interactive: {IsUserInteractive}" , Environment . UserInteractive ) ;
@ -796,7 +772,7 @@ namespace Emby.Server.Implementations
{
// For now there's no real way to inject these properly
BaseItem . Logger = Resolve < ILogger < BaseItem > > ( ) ;
BaseItem . ConfigurationManager = Server ConfigurationManager;
BaseItem . ConfigurationManager = ConfigurationManager;
BaseItem . LibraryManager = Resolve < ILibraryManager > ( ) ;
BaseItem . ProviderManager = Resolve < IProviderManager > ( ) ;
BaseItem . LocalizationManager = Resolve < ILocalizationManager > ( ) ;
@ -818,13 +794,12 @@ namespace Emby.Server.Implementations
/// </summary>
private void FindParts ( )
{
if ( ! Server ConfigurationManager. Configuration . IsPortAuthorized )
if ( ! ConfigurationManager. Configuration . IsPortAuthorized )
{
Server ConfigurationManager. Configuration . IsPortAuthorized = true ;
ConfigurationManager. Configuration . IsPortAuthorized = true ;
ConfigurationManager . SaveConfiguration ( ) ;
}
ConfigurationManager . AddParts ( GetExports < IConfigurationFactory > ( ) ) ;
_pluginManager . CreatePlugins ( ) ;
_urlPrefixes = GetUrlPrefixes ( ) . ToArray ( ) ;
@ -896,10 +871,6 @@ namespace Emby.Server.Implementations
}
}
private CertificateInfo CertificateInfo { get ; set ; }
public X509Certificate2 Certificate { get ; private set ; }
private IEnumerable < string > GetUrlPrefixes ( )
{
var hosts = new [ ] { "+" } ;
@ -928,7 +899,7 @@ namespace Emby.Server.Implementations
protected void OnConfigurationUpdated ( object sender , EventArgs e )
{
var requiresRestart = false ;
var networkConfiguration = Server ConfigurationManager. GetNetworkConfiguration ( ) ;
var networkConfiguration = ConfigurationManager. GetNetworkConfiguration ( ) ;
// Don't do anything if these haven't been set yet
if ( HttpPort ! = 0 & & HttpsPort ! = 0 )
@ -937,10 +908,10 @@ namespace Emby.Server.Implementations
if ( networkConfiguration . HttpServerPortNumber ! = HttpPort | |
networkConfiguration . HttpsPortNumber ! = HttpsPort )
{
if ( Server ConfigurationManager. Configuration . IsPortAuthorized )
if ( ConfigurationManager. Configuration . IsPortAuthorized )
{
Server ConfigurationManager. Configuration . IsPortAuthorized = false ;
Server ConfigurationManager. SaveConfiguration ( ) ;
ConfigurationManager. Configuration . IsPortAuthorized = false ;
ConfigurationManager. SaveConfiguration ( ) ;
requiresRestart = true ;
}
@ -1121,16 +1092,14 @@ namespace Emby.Server.Implementations
ItemsByNamePath = ApplicationPaths . InternalMetadataPath ,
InternalMetadataPath = ApplicationPaths . InternalMetadataPath ,
CachePath = ApplicationPaths . CachePath ,
OperatingSystem = OperatingSystem. Id . ToString ( ) ,
OperatingSystemDisplayName = OperatingSystem. Name ,
OperatingSystem = MediaBrowser. Common . System . OperatingSystem. Id . ToString ( ) ,
OperatingSystemDisplayName = MediaBrowser. Common . System . OperatingSystem. Name ,
CanSelfRestart = CanSelfRestart ,
CanLaunchWebBrowser = CanLaunchWebBrowser ,
HasUpdateAvailable = HasUpdateAvailable ,
TranscodingTempPath = ConfigurationManager . GetTranscodePath ( ) ,
ServerName = FriendlyName ,
LocalAddress = GetSmartApiUrl ( source ) ,
SupportsLibraryMonitor = true ,
EncoderLocation = _mediaEncoder . EncoderLocation ,
SystemArchitecture = RuntimeInformation . OSArchitecture ,
PackageName = _startupOptions . PackageName
} ;
@ -1141,25 +1110,22 @@ namespace Emby.Server.Implementations
. Select ( i = > new WakeOnLanInfo ( i ) )
. ToList ( ) ;
public PublicSystemInfo GetPublicSystemInfo ( IPAddress source )
public PublicSystemInfo GetPublicSystemInfo ( IPAddress address )
{
return new PublicSystemInfo
{
Version = ApplicationVersionString ,
ProductName = ApplicationProductName ,
Id = SystemId ,
OperatingSystem = OperatingSystem. Id . ToString ( ) ,
OperatingSystem = MediaBrowser. Common . System . OperatingSystem. Id . ToString ( ) ,
ServerName = FriendlyName ,
LocalAddress = GetSmartApiUrl ( source ) ,
LocalAddress = GetSmartApiUrl ( address ) ,
StartupWizardCompleted = ConfigurationManager . CommonConfiguration . IsStartupWizardCompleted
} ;
}
/// <inheritdoc/>
public bool ListenWithHttps = > Certificate ! = null & & ServerConfigurationManager . GetNetworkConfiguration ( ) . EnableHttps ;
/// <inheritdoc/>
public string GetSmartApiUrl ( IPAddress ipAddress , int? port = null )
public string GetSmartApiUrl ( IPAddress remoteAddr , int? port = null )
{
// Published server ends with a /
if ( ! string . IsNullOrEmpty ( PublishedServerUrl ) )
@ -1168,7 +1134,7 @@ namespace Emby.Server.Implementations
return PublishedServerUrl . Trim ( '/' ) ;
}
string smart = NetManager . GetBindInterface ( ipAddress , out port ) ;
string smart = NetManager . GetBindInterface ( remoteAddr , out port ) ;
// If the smartAPI doesn't start with http then treat it as a host or ip.
if ( smart . StartsWith ( "http" , StringComparison . OrdinalIgnoreCase ) )
{
@ -1231,27 +1197,20 @@ namespace Emby.Server.Implementations
}
/// <inheritdoc/>
public string GetLocalApiUrl ( string host , string scheme = null , int? port = null )
public string GetLocalApiUrl ( string host name , string scheme = null , int? port = null )
{
// NOTE: If no BaseUrl is set then UriBuilder appends a trailing slash, but if there is no BaseUrl it does
// not. For consistency, always trim the trailing slash.
return new UriBuilder
{
Scheme = scheme ? ? ( ListenWithHttps ? Uri . UriSchemeHttps : Uri . UriSchemeHttp ) ,
Host = host ,
Host = host name ,
Port = port ? ? ( ListenWithHttps ? HttpsPort : HttpPort ) ,
Path = Server ConfigurationManager. GetNetworkConfiguration ( ) . BaseUrl
Path = ConfigurationManager. GetNetworkConfiguration ( ) . BaseUrl
} . ToString ( ) . TrimEnd ( '/' ) ;
}
public string FriendlyName = >
string . IsNullOrEmpty ( ServerConfigurationManager . Configuration . ServerName )
? Environment . MachineName
: ServerConfigurationManager . Configuration . ServerName ;
/// <summary>
/// Shuts down.
/// </summary>
/// <inheritdoc />
public async Task Shutdown ( )
{
if ( IsShuttingDown )
@ -1275,26 +1234,6 @@ namespace Emby.Server.Implementations
protected abstract void ShutdownInternal ( ) ;
public event EventHandler HasUpdateAvailableChanged ;
private bool _hasUpdateAvailable ;
public bool HasUpdateAvailable
{
get = > _hasUpdateAvailable ;
set
{
var fireEvent = value & & ! _hasUpdateAvailable ;
_hasUpdateAvailable = value ;
if ( fireEvent )
{
HasUpdateAvailableChanged ? . Invoke ( this , EventArgs . Empty ) ;
}
}
}
public IEnumerable < Assembly > GetApiPluginAssemblies ( )
{
var assemblies = _allConcreteTypes
@ -1309,41 +1248,7 @@ namespace Emby.Server.Implementations
}
}
public virtual void LaunchUrl ( string url )
{
if ( ! CanLaunchWebBrowser )
{
throw new NotSupportedException ( ) ;
}
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = url ,
UseShellExecute = true ,
ErrorDialog = false
} ,
EnableRaisingEvents = true
} ;
process . Exited + = ( sender , args ) = > ( ( Process ) sender ) . Dispose ( ) ;
try
{
process . Start ( ) ;
}
catch ( Exception ex )
{
Logger . LogError ( ex , "Error launching url: {url}" , url ) ;
throw ;
}
}
private bool _disposed = false ;
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <inheritdoc />
public void Dispose ( )
{
Dispose ( true ) ;