diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index cf46924b47..713ece4211 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -1,5 +1,4 @@
-using Emby.Common.Implementations;
-using Emby.Common.Implementations.Serialization;
+using Emby.Common.Implementations.Serialization;
using Emby.Dlna;
using Emby.Dlna.ConnectionManager;
using Emby.Dlna.ContentDirectory;
@@ -8,12 +7,16 @@ using Emby.Dlna.MediaReceiverRegistrar;
using Emby.Dlna.Ssdp;
using Emby.Drawing;
using Emby.Photos;
+using Emby.Server.Core.Cryptography;
using Emby.Server.Implementations.Activity;
+using Emby.Server.Implementations.Archiving;
using Emby.Server.Implementations.Channels;
using Emby.Server.Implementations.Collections;
using Emby.Server.Implementations.Configuration;
+using Emby.Server.Implementations.Cryptography;
using Emby.Server.Implementations.Data;
using Emby.Server.Implementations.Devices;
+using Emby.Server.Implementations.Diagnostics;
using Emby.Server.Implementations.Dto;
using Emby.Server.Implementations.FFMpeg;
using Emby.Server.Implementations.HttpServer;
@@ -23,14 +26,20 @@ using Emby.Server.Implementations.Library;
using Emby.Server.Implementations.LiveTv;
using Emby.Server.Implementations.Localization;
using Emby.Server.Implementations.MediaEncoder;
-using Emby.Server.Implementations.Migrations;
+using Emby.Server.Implementations.Net;
using Emby.Server.Implementations.Notifications;
using Emby.Server.Implementations.Playlists;
+using Emby.Server.Implementations.Reflection;
+using Emby.Server.Implementations.ScheduledTasks;
using Emby.Server.Implementations.Security;
+using Emby.Server.Implementations.Serialization;
using Emby.Server.Implementations.Session;
using Emby.Server.Implementations.Social;
+using Emby.Server.Implementations.Threading;
using Emby.Server.Implementations.TV;
using Emby.Server.Implementations.Updates;
+using Emby.Server.Implementations.Xml;
+using Emby.Server.MediaEncoding.Subtitles;
using MediaBrowser.Api;
using MediaBrowser.Common;
using MediaBrowser.Common.Configuration;
@@ -52,9 +61,6 @@ using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.MediaEncoding;
@@ -72,10 +78,13 @@ using MediaBrowser.Controller.Subtitles;
using MediaBrowser.Controller.Sync;
using MediaBrowser.Controller.TV;
using MediaBrowser.LocalMetadata.Savers;
+using MediaBrowser.MediaEncoding.BdInfo;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Cryptography;
using MediaBrowser.Model.Diagnostics;
using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Events;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
@@ -87,7 +96,9 @@ using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Services;
using MediaBrowser.Model.Social;
using MediaBrowser.Model.System;
+using MediaBrowser.Model.Tasks;
using MediaBrowser.Model.Text;
+using MediaBrowser.Model.Threading;
using MediaBrowser.Model.Updates;
using MediaBrowser.Model.Xml;
using MediaBrowser.Providers.Chapters;
@@ -97,7 +108,6 @@ using MediaBrowser.WebDashboard.Api;
using MediaBrowser.XbmcMetadata.Providers;
using OpenSubtitlesHandler;
using ServiceStack;
-using SocketHttpListener.Primitives;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -111,30 +121,15 @@ using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using Emby.Server.Core.Cryptography;
-using Emby.Server.Implementations.Archiving;
-using Emby.Server.Implementations.Cryptography;
-using Emby.Server.Implementations.Diagnostics;
-using Emby.Server.Implementations.Net;
-using Emby.Server.Implementations.Reflection;
-using Emby.Server.Implementations.ScheduledTasks;
-using Emby.Server.Implementations.Serialization;
-using Emby.Server.Implementations.Threading;
-using Emby.Server.Implementations.Xml;
-using Emby.Server.MediaEncoding.Subtitles;
-using MediaBrowser.MediaEncoding.BdInfo;
-using MediaBrowser.Model.Cryptography;
-using MediaBrowser.Model.Events;
-using MediaBrowser.Model.Tasks;
-using MediaBrowser.Model.Threading;
using StringExtensions = MediaBrowser.Controller.Extensions.StringExtensions;
+using X509Certificate = System.Security.Cryptography.X509Certificates.X509Certificate;
namespace Emby.Server.Implementations
{
///
/// Class CompositionRoot
///
- public abstract class ApplicationHost : IServerApplicationHost, IDependencyContainer
+ public abstract class ApplicationHost : IServerApplicationHost, IDependencyContainer, IDisposable
{
///
/// Gets a value indicating whether this instance can self restart.
@@ -170,6 +165,8 @@ namespace Emby.Server.Implementations
/// true if this instance has pending application restart; otherwise, false.
public bool HasPendingRestart { get; private set; }
+ public bool IsShuttingDown { get; private set; }
+
///
/// Gets or sets the logger.
///
@@ -366,7 +363,7 @@ namespace Emby.Server.Implementations
protected IAuthService AuthService { get; private set; }
protected readonly StartupOptions StartupOptions;
- private readonly string _releaseAssetFilename;
+ protected readonly string ReleaseAssetFilename;
internal IPowerManagement PowerManagement { get; private set; }
internal IImageEncoder ImageEncoder { get; private set; }
@@ -419,7 +416,7 @@ namespace Emby.Server.Implementations
Logger = LogManager.GetLogger("App");
StartupOptions = options;
- _releaseAssetFilename = releaseAssetFilename;
+ ReleaseAssetFilename = releaseAssetFilename;
PowerManagement = powerManagement;
ImageEncoder = imageEncoder;
@@ -442,14 +439,6 @@ namespace Emby.Server.Implementations
}
}
- public virtual bool SupportsRunningAsService
- {
- get
- {
- return false;
- }
- }
-
private DeviceId _deviceId;
public string SystemId
{
@@ -476,14 +465,6 @@ namespace Emby.Server.Implementations
}
}
- public virtual bool IsRunningAsService
- {
- get
- {
- return false;
- }
- }
-
private Assembly GetAssembly(Type type)
{
return type.GetTypeInfo().Assembly;
@@ -827,7 +808,7 @@ namespace Emby.Server.Implementations
RegisterSingleInstance(MemoryStreamFactory);
RegisterSingleInstance(SystemEvents);
- RegisterSingleInstance(LogManager);
+ RegisterSingleInstance(LogManager, false);
RegisterSingleInstance(Logger);
RegisterSingleInstance(EnvironmentInfo);
@@ -1051,7 +1032,7 @@ namespace Emby.Server.Implementations
((UserManager)UserManager).Initialize();
}
- protected virtual string PackageRuntime
+ public virtual string PackageRuntime
{
get
{
@@ -1073,6 +1054,7 @@ namespace Emby.Server.Implementations
builder.AppendLine(string.Format("Operating system: {0}", Environment.OSVersion));
builder.AppendLine(string.Format("64-Bit OS: {0}", Environment.Is64BitOperatingSystem));
builder.AppendLine(string.Format("64-Bit Process: {0}", Environment.Is64BitProcess));
+ builder.AppendLine(string.Format("User Interactive: {0}", Environment.UserInteractive));
Type type = Type.GetType("Mono.Runtime");
if (type != null)
@@ -1167,7 +1149,7 @@ namespace Emby.Server.Implementations
}
}
- private ICertificate GetCertificate(CertificateInfo info)
+ private X509Certificate GetCertificate(CertificateInfo info)
{
var certificateLocation = info == null ? null : info.Path;
@@ -1194,7 +1176,7 @@ namespace Emby.Server.Implementations
return null;
}
- return new Certificate(localCert);
+ return localCert;
}
catch (Exception ex)
{
@@ -1482,13 +1464,26 @@ namespace Emby.Server.Implementations
var assembly = plugin.GetType().Assembly;
var assemblyName = assembly.GetName();
- var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0];
- var assemblyId = new Guid(attribute.Value);
-
var assemblyFileName = assemblyName.Name + ".dll";
var assemblyFilePath = Path.Combine(ApplicationPaths.PluginsPath, assemblyFileName);
- assemblyPlugin.SetAttributes(assemblyFilePath, assemblyFileName, assemblyName.Version, assemblyId);
+ assemblyPlugin.SetAttributes(assemblyFilePath, assemblyFileName, assemblyName.Version);
+
+ try
+ {
+ var idAttributes = assembly.GetCustomAttributes(typeof(GuidAttribute), true);
+ if (idAttributes.Length > 0)
+ {
+ var attribute = (GuidAttribute)idAttributes[0];
+ var assemblyId = new Guid(attribute.Value);
+
+ assemblyPlugin.SetId(assemblyId);
+ }
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error getting plugin Id from {0}.", ex, plugin.GetType().FullName);
+ }
}
var isFirstRun = !File.Exists(plugin.ConfigurationFilePath);
@@ -1570,7 +1565,7 @@ namespace Emby.Server.Implementations
}
private CertificateInfo CertificateInfo { get; set; }
- private ICertificate Certificate { get; set; }
+ private X509Certificate Certificate { get; set; }
private IEnumerable GetUrlPrefixes()
{
@@ -1601,7 +1596,7 @@ namespace Emby.Server.Implementations
{
try
{
- ServerManager.Start(GetUrlPrefixes());
+ ServerManager.Start(GetUrlPrefixes().ToArray());
return;
}
catch (Exception ex)
@@ -1618,7 +1613,7 @@ namespace Emby.Server.Implementations
try
{
- ServerManager.Start(GetUrlPrefixes());
+ ServerManager.Start(GetUrlPrefixes().ToArray());
}
catch (Exception ex)
{
@@ -1740,25 +1735,35 @@ namespace Emby.Server.Implementations
///
/// Restarts this instance.
///
- public async Task Restart()
+ public void Restart()
{
if (!CanSelfRestart)
{
throw new PlatformNotSupportedException("The server is unable to self-restart. Please restart manually.");
}
- try
+ if (IsShuttingDown)
{
- await SessionManager.SendServerRestartNotification(CancellationToken.None).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- Logger.ErrorException("Error sending server restart notification", ex);
+ return;
}
- Logger.Info("Calling RestartInternal");
+ IsShuttingDown = true;
- RestartInternal();
+ Task.Run(async () =>
+ {
+ try
+ {
+ await SessionManager.SendServerRestartNotification(CancellationToken.None).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error sending server restart notification", ex);
+ }
+
+ Logger.Info("Calling RestartInternal");
+
+ RestartInternal();
+ });
}
protected abstract void RestartInternal();
@@ -1847,7 +1852,32 @@ namespace Emby.Server.Implementations
"mbplus.dll",
"mbintros.dll",
"embytv.dll",
- "Messenger.dll"
+ "Messenger.dll",
+ "MediaBrowser.Plugins.TvMazeProvider.dll",
+ "MBBookshelf.dll",
+ "MediaBrowser.Channels.Adult.YouJizz.dll",
+ "MediaBrowser.Channels.Vine-co.dll",
+ "MediaBrowser.Plugins.Vimeo.dll",
+ "MediaBrowser.Channels.Vevo.dll",
+ "MediaBrowser.Plugins.Twitch.dll",
+ "MediaBrowser.Channels.SvtPlay.dll",
+ "MediaBrowser.Plugins.SoundCloud.dll",
+ "MediaBrowser.Plugins.SnesBox.dll",
+ "MediaBrowser.Plugins.RottenTomatoes.dll",
+ "MediaBrowser.Plugins.Revision3.dll",
+ "MediaBrowser.Plugins.NesBox.dll",
+ "MBChapters.dll",
+ "MediaBrowser.Channels.LeagueOfLegends.dll",
+ "MediaBrowser.Plugins.ADEProvider.dll",
+ "MediaBrowser.Channels.BallStreams.dll",
+ "MediaBrowser.Channels.Adult.Beeg.dll",
+ "ChannelDownloader.dll",
+ "Hamstercat.Emby.EmbyBands.dll",
+ "EmbyTV.dll",
+ "MediaBrowser.Channels.HitboxTV.dll",
+ "MediaBrowser.Channels.HockeyStreams.dll",
+ "MediaBrowser.Plugins.ITV.dll",
+ "MediaBrowser.Plugins.Lastfm.dll"
};
return !exclude.Contains(filename ?? string.Empty, StringComparer.OrdinalIgnoreCase);
@@ -1864,6 +1894,7 @@ namespace Emby.Server.Implementations
return new SystemInfo
{
HasPendingRestart = HasPendingRestart,
+ IsShuttingDown = IsShuttingDown,
Version = ApplicationVersion.ToString(),
WebSocketPortNumber = HttpPort,
FailedPluginAssemblies = FailedAssemblies.ToArray(),
@@ -1887,7 +1918,6 @@ namespace Emby.Server.Implementations
HasUpdateAvailable = HasUpdateAvailable,
SupportsAutoRunAtStartup = SupportsAutoRunAtStartup,
TranscodingTempPath = ApplicationPaths.TranscodingTempPath,
- SupportsRunningAsService = SupportsRunningAsService,
ServerName = FriendlyName,
LocalAddress = localAddress,
SupportsLibraryMonitor = true,
@@ -2091,6 +2121,13 @@ namespace Emby.Server.Implementations
///
public async Task Shutdown()
{
+ if (IsShuttingDown)
+ {
+ return;
+ }
+
+ IsShuttingDown = true;
+
try
{
await SessionManager.SendServerShutdownNotification(CancellationToken.None).ConfigureAwait(false);
@@ -2169,22 +2206,31 @@ namespace Emby.Server.Implementations
/// Task{CheckForUpdateResult}.
public async Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress)
{
- var cacheLength = TimeSpan.FromHours(1);
var updateLevel = SystemUpdateLevel;
+ var cacheLength = updateLevel == PackageVersionClass.Release ?
+ TimeSpan.FromHours(4) :
+ TimeSpan.FromMinutes(5);
- if (updateLevel != PackageVersionClass.Release)
- {
- cacheLength = TimeSpan.FromMinutes(5);
- }
-
- var result = await new GithubUpdater(HttpClient, JsonSerializer).CheckForUpdateResult("MediaBrowser", "Emby", ApplicationVersion, updateLevel, _releaseAssetFilename,
- "MBServer", "Mbserver.zip", cacheLength, cancellationToken).ConfigureAwait(false);
+ var result = await new GithubUpdater(HttpClient, JsonSerializer).CheckForUpdateResult("MediaBrowser",
+ "Emby",
+ ApplicationVersion,
+ updateLevel,
+ ReleaseAssetFilename,
+ "MBServer",
+ UpdateTargetFileName,
+ cacheLength,
+ cancellationToken).ConfigureAwait(false);
HasUpdateAvailable = result.IsUpdateAvailable;
return result;
}
+ protected virtual string UpdateTargetFileName
+ {
+ get { return "Mbserver.zip"; }
+ }
+
///
/// Updates the application.
///
@@ -2327,6 +2373,7 @@ namespace Emby.Server.Implementations
_disposed = true;
Dispose(true);
+ GC.SuppressFinalize(this);
}
}
@@ -2340,6 +2387,7 @@ namespace Emby.Server.Implementations
{
var type = GetType();
+ LogManager.AddConsoleOutput();
Logger.Info("Disposing " + type.Name);
var parts = DisposableParts.Distinct().Where(i => i.GetType() != type).ToList();
diff --git a/SharedVersion.cs b/SharedVersion.cs
index c4efbe3951..841d2968c3 100644
--- a/SharedVersion.cs
+++ b/SharedVersion.cs
@@ -1,3 +1,3 @@
using System.Reflection;
-[assembly: AssemblyVersion("3.2.30.0")]
+[assembly: AssemblyVersion("3.2.30.27")]