aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/EntryPoints
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/EntryPoints')
-rw-r--r--Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs1
-rw-r--r--Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs142
-rw-r--r--Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs1
-rw-r--r--Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs71
-rw-r--r--Emby.Server.Implementations/EntryPoints/LoadRegistrations.cs74
-rw-r--r--Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs7
-rw-r--r--Emby.Server.Implementations/EntryPoints/ServerEventNotifier.cs75
-rw-r--r--Emby.Server.Implementations/EntryPoints/StartupWizard.cs12
-rw-r--r--Emby.Server.Implementations/EntryPoints/SystemEvents.cs1
-rw-r--r--Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs4
-rw-r--r--Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs49
-rw-r--r--Emby.Server.Implementations/EntryPoints/UsageReporter.cs2
-rw-r--r--Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs74
13 files changed, 210 insertions, 303 deletions
diff --git a/Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs b/Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
index c2cee00c8..561f5ee12 100644
--- a/Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
+++ b/Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
@@ -112,7 +112,6 @@ namespace Emby.Server.Implementations.EntryPoints
_appHost.HasPendingRestartChanged -= _appHost_HasPendingRestartChanged;
DisposeTimer();
- GC.SuppressFinalize(this);
}
private void DisposeTimer()
diff --git a/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs b/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
index 903bb0ff4..6801b2823 100644
--- a/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
+++ b/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
@@ -26,9 +26,10 @@ namespace Emby.Server.Implementations.EntryPoints
private readonly IDeviceDiscovery _deviceDiscovery;
private ITimer _timer;
- private bool _isStarted;
private readonly ITimerFactory _timerFactory;
+ private NatManager _natManager;
+
public ExternalPortForwarding(ILogManager logmanager, IServerApplicationHost appHost, IServerConfigurationManager config, IDeviceDiscovery deviceDiscovery, IHttpClient httpClient, ITimerFactory timerFactory)
{
_logger = logmanager.GetLogger("PortMapper");
@@ -37,6 +38,12 @@ namespace Emby.Server.Implementations.EntryPoints
_deviceDiscovery = deviceDiscovery;
_httpClient = httpClient;
_timerFactory = timerFactory;
+ _config.ConfigurationUpdated += _config_ConfigurationUpdated1;
+ }
+
+ private void _config_ConfigurationUpdated1(object sender, EventArgs e)
+ {
+ _config_ConfigurationUpdated(sender, e);
}
private string _lastConfigIdentifier;
@@ -49,8 +56,8 @@ namespace Emby.Server.Implementations.EntryPoints
values.Add(config.PublicPort.ToString(CultureInfo.InvariantCulture));
values.Add(_appHost.HttpPort.ToString(CultureInfo.InvariantCulture));
values.Add(_appHost.HttpsPort.ToString(CultureInfo.InvariantCulture));
- values.Add((config.EnableHttps || config.RequireHttps).ToString());
values.Add(_appHost.EnableHttps.ToString());
+ values.Add((config.EnableRemoteAccess).ToString());
return string.Join("|", values.ToArray(values.Count));
}
@@ -59,10 +66,7 @@ namespace Emby.Server.Implementations.EntryPoints
{
if (!string.Equals(_lastConfigIdentifier, GetConfigIdentifier(), StringComparison.OrdinalIgnoreCase))
{
- if (_isStarted)
- {
- DisposeNat();
- }
+ DisposeNat();
Run();
}
@@ -70,10 +74,7 @@ namespace Emby.Server.Implementations.EntryPoints
public void Run()
{
- NatUtility.Logger = _logger;
- NatUtility.HttpClient = _httpClient;
-
- if (_config.Configuration.EnableUPnP)
+ if (_config.Configuration.EnableUPnP && _config.Configuration.EnableRemoteAccess)
{
Start();
}
@@ -85,26 +86,18 @@ namespace Emby.Server.Implementations.EntryPoints
private void Start()
{
_logger.Debug("Starting NAT discovery");
- NatUtility.EnabledProtocols = new List<NatProtocol>
+ if (_natManager == null)
{
- NatProtocol.Pmp
- };
- NatUtility.DeviceFound += NatUtility_DeviceFound;
-
- // Mono.Nat does never rise this event. The event is there however it is useless.
- // You could remove it with no risk.
- NatUtility.DeviceLost += NatUtility_DeviceLost;
-
-
- NatUtility.StartDiscovery();
+ _natManager = new NatManager(_logger, _httpClient);
+ _natManager.DeviceFound += NatUtility_DeviceFound;
+ _natManager.StartDiscovery();
+ }
_timer = _timerFactory.Create(ClearCreatedRules, null, TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(10));
_deviceDiscovery.DeviceDiscovered += _deviceDiscovery_DeviceDiscovered;
_lastConfigIdentifier = GetConfigIdentifier();
-
- _isStarted = true;
}
private async void _deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs<UpnpDeviceInfo> e)
@@ -182,8 +175,17 @@ namespace Emby.Server.Implementations.EntryPoints
return;
}
- _logger.Debug("Calling Nat.Handle on " + identifier);
- NatUtility.Handle(localAddress, info, endpoint, NatProtocol.Upnp);
+ // This should never happen, but the Handle method will throw ArgumentNullException if it does
+ if (localAddress == null)
+ {
+ return;
+ }
+
+ var natManager = _natManager;
+ if (natManager != null)
+ {
+ await natManager.Handle(localAddress, info, endpoint, NatProtocol.Upnp).ConfigureAwait(false);
+ }
}
}
@@ -209,19 +211,11 @@ namespace Emby.Server.Implementations.EntryPoints
try
{
var device = e.Device;
- _logger.Debug("NAT device found: {0}", device.LocalAddress.ToString());
CreateRules(device);
}
catch
{
- // I think it could be a good idea to log the exception because
- // you are using permanent portmapping here (never expire) and that means that next time
- // CreatePortMap is invoked it can fails with a 718-ConflictInMappingEntry or not. That depends
- // on the router's upnp implementation (specs says it should fail however some routers don't do it)
- // It also can fail with others like 727-ExternalPortOnlySupportsWildcard, 728-NoPortMapsAvailable
- // and those errors (upnp errors) could be useful for diagnosting.
-
// Commenting out because users are reporting problems out of our control
//_logger.ErrorException("Error creating port forwarding rules", ex);
}
@@ -238,14 +232,15 @@ namespace Emby.Server.Implementations.EntryPoints
// On some systems the device discovered event seems to fire repeatedly
// This check will help ensure we're not trying to port map the same device over and over
+ var address = device.LocalAddress;
- var address = device.LocalAddress.ToString();
+ var addressString = address.ToString();
lock (_createdRules)
{
- if (!_createdRules.Contains(address))
+ if (!_createdRules.Contains(addressString))
{
- _createdRules.Add(address);
+ _createdRules.Add(addressString);
}
else
{
@@ -253,41 +248,32 @@ namespace Emby.Server.Implementations.EntryPoints
}
}
- var success = await CreatePortMap(device, _appHost.HttpPort, _config.Configuration.PublicPort).ConfigureAwait(false);
-
- if (success)
+ try
{
- await CreatePortMap(device, _appHost.HttpsPort, _config.Configuration.PublicHttpsPort).ConfigureAwait(false);
+ await CreatePortMap(device, _appHost.HttpPort, _config.Configuration.PublicPort).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ return;
}
- }
-
- private async Task<bool> CreatePortMap(INatDevice device, int privatePort, int publicPort)
- {
- _logger.Debug("Creating port map on port {0}", privatePort);
try
{
- await device.CreatePortMap(new Mapping(Protocol.Tcp, privatePort, publicPort)
- {
- Description = _appHost.Name
-
- }).ConfigureAwait(false);
-
- return true;
+ await CreatePortMap(device, _appHost.HttpsPort, _config.Configuration.PublicHttpsPort).ConfigureAwait(false);
}
catch (Exception ex)
{
- _logger.Error("Error creating port map: " + ex.Message);
-
- return false;
}
}
- // As I said before, this method will be never invoked. You can remove it.
- void NatUtility_DeviceLost(object sender, DeviceEventArgs e)
+ private Task CreatePortMap(INatDevice device, int privatePort, int publicPort)
{
- var device = e.Device;
- _logger.Debug("NAT device lost: {0}", device.LocalAddress.ToString());
+ _logger.Debug("Creating port map on local port {0} to public port {1} with device {2}", privatePort, publicPort, device.LocalAddress.ToString());
+
+ return device.CreatePortMap(new Mapping(Protocol.Tcp, privatePort, publicPort)
+ {
+ Description = _appHost.Name
+ });
}
private bool _disposed = false;
@@ -295,7 +281,6 @@ namespace Emby.Server.Implementations.EntryPoints
{
_disposed = true;
DisposeNat();
- GC.SuppressFinalize(this);
}
private void DisposeNat()
@@ -310,27 +295,24 @@ namespace Emby.Server.Implementations.EntryPoints
_deviceDiscovery.DeviceDiscovered -= _deviceDiscovery_DeviceDiscovered;
- try
- {
- // This is not a significant improvement
- NatUtility.StopDiscovery();
- NatUtility.DeviceFound -= NatUtility_DeviceFound;
- NatUtility.DeviceLost -= NatUtility_DeviceLost;
- }
- // Statements in try-block will no fail because StopDiscovery is a one-line
- // method that was no chances to fail.
- // public static void StopDiscovery ()
- // {
- // searching.Reset();
- // }
- // IMO you could remove the catch-block
- catch (Exception ex)
- {
- _logger.ErrorException("Error stopping NAT Discovery", ex);
- }
- finally
+ var natManager = _natManager;
+
+ if (natManager != null)
{
- _isStarted = false;
+ _natManager = null;
+
+ using (natManager)
+ {
+ try
+ {
+ natManager.StopDiscovery();
+ natManager.DeviceFound -= NatUtility_DeviceFound;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error stopping NAT Discovery", ex);
+ }
+ }
}
}
}
diff --git a/Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs b/Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs
index 221580681..8ae85e390 100644
--- a/Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs
+++ b/Emby.Server.Implementations/EntryPoints/KeepServerAwake.cs
@@ -60,7 +60,6 @@ namespace Emby.Server.Implementations.EntryPoints
_timer.Dispose();
_timer = null;
}
- GC.SuppressFinalize(this);
}
}
}
diff --git a/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
index 0e771cbec..9a2ae34bc 100644
--- a/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
+++ b/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
@@ -52,7 +52,7 @@ namespace Emby.Server.Implementations.EntryPoints
/// <summary>
/// The library update duration
/// </summary>
- private const int LibraryUpdateDuration = 5000;
+ private const int LibraryUpdateDuration = 30000;
private readonly IProviderManager _providerManager;
@@ -315,41 +315,39 @@ namespace Emby.Server.Implementations.EntryPoints
/// <param name="cancellationToken">The cancellation token.</param>
private async void SendChangeNotifications(List<BaseItem> itemsAdded, List<BaseItem> itemsUpdated, List<BaseItem> itemsRemoved, List<Folder> foldersAddedTo, List<Folder> foldersRemovedFrom, CancellationToken cancellationToken)
{
- foreach (var user in _userManager.Users.ToList())
+ var userIds = _sessionManager.Sessions
+ .Select(i => i.UserId)
+ .Where(i => !i.Equals(Guid.Empty))
+ .Distinct()
+ .ToArray();
+
+ foreach (var userId in userIds)
{
- var id = user.Id;
- var userSessions = _sessionManager.Sessions
- .Where(u => u.UserId.HasValue && u.UserId.Value == id && u.SessionController != null && u.IsActive)
- .ToList();
+ LibraryUpdateInfo info;
- if (userSessions.Count > 0)
+ try
{
- LibraryUpdateInfo info;
-
- try
- {
- info = GetLibraryUpdateInfo(itemsAdded, itemsUpdated, itemsRemoved, foldersAddedTo,
- foldersRemovedFrom, id);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error in GetLibraryUpdateInfo", ex);
- return;
- }
-
- foreach (var userSession in userSessions)
- {
- try
- {
- await userSession.SessionController.SendLibraryUpdateInfo(info, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error sending LibraryChanged message", ex);
- }
- }
+ info = GetLibraryUpdateInfo(itemsAdded, itemsUpdated, itemsRemoved, foldersAddedTo, foldersRemovedFrom, userId);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in GetLibraryUpdateInfo", ex);
+ return;
}
+ if (info.IsEmpty)
+ {
+ continue;
+ }
+
+ try
+ {
+ await _sessionManager.SendMessageToUserSessions(new List<Guid> { userId }, "LibraryChanged", info, cancellationToken).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error sending LibraryChanged message", ex);
+ }
}
}
@@ -391,7 +389,7 @@ namespace Emby.Server.Implementations.EntryPoints
private bool FilterItem(BaseItem item)
{
- if (!item.IsFolder && item.LocationType == LocationType.Virtual)
+ if (!item.IsFolder && !item.HasPathProtocol)
{
return false;
}
@@ -440,7 +438,7 @@ namespace Emby.Server.Implementations.EntryPoints
// If the physical root changed, return the user root
if (item is AggregateFolder)
{
- return new[] { user.RootFolder as T };
+ return new[] { _libraryManager.GetUserRootFolder() as T };
}
// Return it only if it's in the user's library
@@ -458,7 +456,6 @@ namespace Emby.Server.Implementations.EntryPoints
public void Dispose()
{
Dispose(true);
- GC.SuppressFinalize(this);
}
/// <summary>
@@ -474,10 +471,14 @@ namespace Emby.Server.Implementations.EntryPoints
LibraryUpdateTimer.Dispose();
LibraryUpdateTimer = null;
}
-
+
_libraryManager.ItemAdded -= libraryManager_ItemAdded;
_libraryManager.ItemUpdated -= libraryManager_ItemUpdated;
_libraryManager.ItemRemoved -= libraryManager_ItemRemoved;
+
+ _providerManager.RefreshCompleted -= _providerManager_RefreshCompleted;
+ _providerManager.RefreshStarted -= _providerManager_RefreshStarted;
+ _providerManager.RefreshProgress -= _providerManager_RefreshProgress;
}
}
}
diff --git a/Emby.Server.Implementations/EntryPoints/LoadRegistrations.cs b/Emby.Server.Implementations/EntryPoints/LoadRegistrations.cs
deleted file mode 100644
index 21e075cf5..000000000
--- a/Emby.Server.Implementations/EntryPoints/LoadRegistrations.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using MediaBrowser.Common.Security;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Threading.Tasks;
-using MediaBrowser.Model.Threading;
-
-namespace Emby.Server.Implementations.EntryPoints
-{
- /// <summary>
- /// Class LoadRegistrations
- /// </summary>
- public class LoadRegistrations : IServerEntryPoint
- {
- /// <summary>
- /// The _security manager
- /// </summary>
- private readonly ISecurityManager _securityManager;
-
- /// <summary>
- /// The _logger
- /// </summary>
- private readonly ILogger _logger;
-
- private ITimer _timer;
- private readonly ITimerFactory _timerFactory;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="LoadRegistrations" /> class.
- /// </summary>
- /// <param name="securityManager">The security manager.</param>
- /// <param name="logManager">The log manager.</param>
- public LoadRegistrations(ISecurityManager securityManager, ILogManager logManager, ITimerFactory timerFactory)
- {
- _securityManager = securityManager;
- _timerFactory = timerFactory;
-
- _logger = logManager.GetLogger("Registration Loader");
- }
-
- /// <summary>
- /// Runs this instance.
- /// </summary>
- public void Run()
- {
- _timer = _timerFactory.Create(s => LoadAllRegistrations(), null, TimeSpan.FromMilliseconds(100), TimeSpan.FromHours(12));
- }
-
- private async Task LoadAllRegistrations()
- {
- try
- {
- await _securityManager.LoadAllRegistrationInfo().ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error loading registration info", ex);
- }
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- if (_timer != null)
- {
- _timer.Dispose();
- _timer = null;
- }
- GC.SuppressFinalize(this);
- }
- }
-}
diff --git a/Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs b/Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs
index f73b40b46..d41d76c6b 100644
--- a/Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs
+++ b/Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs
@@ -54,12 +54,16 @@ namespace Emby.Server.Implementations.EntryPoints
private async void SendMessage(string name, TimerEventInfo info)
{
- var users = _userManager.Users.Where(i => i.Policy.EnableLiveTvAccess).Select(i => i.Id.ToString("N")).ToList();
+ var users = _userManager.Users.Where(i => i.Policy.EnableLiveTvAccess).Select(i => i.Id).ToList();
try
{
await _sessionManager.SendMessageToUserSessions<TimerEventInfo>(users, name, info, CancellationToken.None);
}
+ catch (ObjectDisposedException)
+ {
+
+ }
catch (Exception ex)
{
_logger.ErrorException("Error sending message", ex);
@@ -72,7 +76,6 @@ namespace Emby.Server.Implementations.EntryPoints
_liveTvManager.SeriesTimerCancelled -= _liveTvManager_SeriesTimerCancelled;
_liveTvManager.TimerCreated -= _liveTvManager_TimerCreated;
_liveTvManager.SeriesTimerCreated -= _liveTvManager_SeriesTimerCreated;
- GC.SuppressFinalize(this);
}
}
}
diff --git a/Emby.Server.Implementations/EntryPoints/ServerEventNotifier.cs b/Emby.Server.Implementations/EntryPoints/ServerEventNotifier.cs
index 514321e20..e5748989e 100644
--- a/Emby.Server.Implementations/EntryPoints/ServerEventNotifier.cs
+++ b/Emby.Server.Implementations/EntryPoints/ServerEventNotifier.cs
@@ -22,11 +22,6 @@ namespace Emby.Server.Implementations.EntryPoints
public class ServerEventNotifier : IServerEntryPoint
{
/// <summary>
- /// The _server manager
- /// </summary>
- private readonly IServerManager _serverManager;
-
- /// <summary>
/// The _user manager
/// </summary>
private readonly IUserManager _userManager;
@@ -47,23 +42,21 @@ namespace Emby.Server.Implementations.EntryPoints
private readonly ITaskManager _taskManager;
private readonly ISessionManager _sessionManager;
- private readonly ISyncManager _syncManager;
- public ServerEventNotifier(IServerManager serverManager, IServerApplicationHost appHost, IUserManager userManager, IInstallationManager installationManager, ITaskManager taskManager, ISessionManager sessionManager, ISyncManager syncManager)
+ public ServerEventNotifier(IServerApplicationHost appHost, IUserManager userManager, IInstallationManager installationManager, ITaskManager taskManager, ISessionManager sessionManager)
{
- _serverManager = serverManager;
_userManager = userManager;
_installationManager = installationManager;
_appHost = appHost;
_taskManager = taskManager;
_sessionManager = sessionManager;
- _syncManager = syncManager;
}
public void Run()
{
_userManager.UserDeleted += userManager_UserDeleted;
_userManager.UserUpdated += userManager_UserUpdated;
+ _userManager.UserPolicyUpdated += _userManager_UserPolicyUpdated;
_userManager.UserConfigurationUpdated += _userManager_UserConfigurationUpdated;
_appHost.HasPendingRestartChanged += kernel_HasPendingRestartChanged;
@@ -75,43 +68,31 @@ namespace Emby.Server.Implementations.EntryPoints
_installationManager.PackageInstallationFailed += _installationManager_PackageInstallationFailed;
_taskManager.TaskCompleted += _taskManager_TaskCompleted;
- _syncManager.SyncJobCreated += _syncManager_SyncJobCreated;
- _syncManager.SyncJobCancelled += _syncManager_SyncJobCancelled;
- }
-
- void _syncManager_SyncJobCancelled(object sender, GenericEventArgs<SyncJob> e)
- {
- _sessionManager.SendMessageToUserDeviceSessions(e.Argument.TargetId, "SyncJobCancelled", e.Argument, CancellationToken.None);
- }
-
- void _syncManager_SyncJobCreated(object sender, GenericEventArgs<SyncJobCreationResult> e)
- {
- _sessionManager.SendMessageToUserDeviceSessions(e.Argument.Job.TargetId, "SyncJobCreated", e.Argument, CancellationToken.None);
}
void _installationManager_PackageInstalling(object sender, InstallationEventArgs e)
{
- _serverManager.SendWebSocketMessage("PackageInstalling", e.InstallationInfo);
+ SendMessageToAdminSessions("PackageInstalling", e.InstallationInfo);
}
void _installationManager_PackageInstallationCancelled(object sender, InstallationEventArgs e)
{
- _serverManager.SendWebSocketMessage("PackageInstallationCancelled", e.InstallationInfo);
+ SendMessageToAdminSessions("PackageInstallationCancelled", e.InstallationInfo);
}
void _installationManager_PackageInstallationCompleted(object sender, InstallationEventArgs e)
{
- _serverManager.SendWebSocketMessage("PackageInstallationCompleted", e.InstallationInfo);
+ SendMessageToAdminSessions("PackageInstallationCompleted", e.InstallationInfo);
}
void _installationManager_PackageInstallationFailed(object sender, InstallationFailedEventArgs e)
{
- _serverManager.SendWebSocketMessage("PackageInstallationFailed", e.InstallationInfo);
+ SendMessageToAdminSessions("PackageInstallationFailed", e.InstallationInfo);
}
void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e)
{
- _serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Result);
+ SendMessageToAdminSessions("ScheduledTaskEnded", e.Result);
}
/// <summary>
@@ -121,7 +102,7 @@ namespace Emby.Server.Implementations.EntryPoints
/// <param name="e">The e.</param>
void InstallationManager_PluginUninstalled(object sender, GenericEventArgs<IPlugin> e)
{
- _serverManager.SendWebSocketMessage("PluginUninstalled", e.Argument.GetPluginInfo());
+ SendMessageToAdminSessions("PluginUninstalled", e.Argument.GetPluginInfo());
}
/// <summary>
@@ -156,6 +137,13 @@ namespace Emby.Server.Implementations.EntryPoints
SendMessageToUserSession(e.Argument, "UserDeleted", e.Argument.Id.ToString("N"));
}
+ void _userManager_UserPolicyUpdated(object sender, GenericEventArgs<User> e)
+ {
+ var dto = _userManager.GetUserDto(e.Argument);
+
+ SendMessageToUserSession(e.Argument, "UserPolicyUpdated", dto);
+ }
+
void _userManager_UserConfigurationUpdated(object sender, GenericEventArgs<User> e)
{
var dto = _userManager.GetUserDto(e.Argument);
@@ -163,9 +151,36 @@ namespace Emby.Server.Implementations.EntryPoints
SendMessageToUserSession(e.Argument, "UserConfigurationUpdated", dto);
}
+ private async void SendMessageToAdminSessions<T>(string name, T data)
+ {
+ try
+ {
+ await _sessionManager.SendMessageToAdminSessions(name, data, CancellationToken.None);
+ }
+ catch (ObjectDisposedException)
+ {
+
+ }
+ catch (Exception)
+ {
+ //Logger.ErrorException("Error sending message", ex);
+ }
+ }
+
private async void SendMessageToUserSession<T>(User user, string name, T data)
{
- await _sessionManager.SendMessageToUserSessions(new List<string> { user.Id.ToString("N") }, name, data, CancellationToken.None);
+ try
+ {
+ await _sessionManager.SendMessageToUserSessions(new List<Guid> { user.Id }, name, data, CancellationToken.None);
+ }
+ catch (ObjectDisposedException)
+ {
+
+ }
+ catch (Exception)
+ {
+ //Logger.ErrorException("Error sending message", ex);
+ }
}
/// <summary>
@@ -174,7 +189,6 @@ namespace Emby.Server.Implementations.EntryPoints
public void Dispose()
{
Dispose(true);
- GC.SuppressFinalize(this);
}
/// <summary>
@@ -187,6 +201,7 @@ namespace Emby.Server.Implementations.EntryPoints
{
_userManager.UserDeleted -= userManager_UserDeleted;
_userManager.UserUpdated -= userManager_UserUpdated;
+ _userManager.UserPolicyUpdated -= _userManager_UserPolicyUpdated;
_userManager.UserConfigurationUpdated -= _userManager_UserConfigurationUpdated;
_installationManager.PluginUninstalled -= InstallationManager_PluginUninstalled;
@@ -196,8 +211,6 @@ namespace Emby.Server.Implementations.EntryPoints
_installationManager.PackageInstallationFailed -= _installationManager_PackageInstallationFailed;
_appHost.HasPendingRestartChanged -= kernel_HasPendingRestartChanged;
- _syncManager.SyncJobCreated -= _syncManager_SyncJobCreated;
- _syncManager.SyncJobCancelled -= _syncManager_SyncJobCancelled;
}
}
}
diff --git a/Emby.Server.Implementations/EntryPoints/StartupWizard.cs b/Emby.Server.Implementations/EntryPoints/StartupWizard.cs
index 103b4b321..6d73f98ad 100644
--- a/Emby.Server.Implementations/EntryPoints/StartupWizard.cs
+++ b/Emby.Server.Implementations/EntryPoints/StartupWizard.cs
@@ -1,5 +1,4 @@
-using System;
-using Emby.Server.Implementations.Browser;
+using Emby.Server.Implementations.Browser;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Model.Logging;
@@ -40,17 +39,17 @@ namespace Emby.Server.Implementations.EntryPoints
return;
}
- if (_appHost.IsFirstRun)
+ if (!_config.Configuration.IsStartupWizardCompleted)
{
- BrowserLauncher.OpenDashboardPage("wizardstart.html", _appHost);
+ BrowserLauncher.OpenWebApp(_appHost);
}
- else if (_config.Configuration.IsStartupWizardCompleted && _config.Configuration.AutoRunWebApp)
+ else if (_config.Configuration.AutoRunWebApp)
{
var options = ((ApplicationHost)_appHost).StartupOptions;
if (!options.ContainsOption("-noautorunwebapp"))
{
- BrowserLauncher.OpenDashboardPage("index.html", _appHost);
+ BrowserLauncher.OpenWebApp(_appHost);
}
}
}
@@ -60,7 +59,6 @@ namespace Emby.Server.Implementations.EntryPoints
/// </summary>
public void Dispose()
{
- GC.SuppressFinalize(this);
}
}
} \ No newline at end of file
diff --git a/Emby.Server.Implementations/EntryPoints/SystemEvents.cs b/Emby.Server.Implementations/EntryPoints/SystemEvents.cs
index 08f3edb3d..e27de8967 100644
--- a/Emby.Server.Implementations/EntryPoints/SystemEvents.cs
+++ b/Emby.Server.Implementations/EntryPoints/SystemEvents.cs
@@ -34,7 +34,6 @@ namespace Emby.Server.Implementations.EntryPoints
public void Dispose()
{
_systemEvents.SystemShutdown -= _systemEvents_SystemShutdown;
- GC.SuppressFinalize(this);
}
}
}
diff --git a/Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs b/Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
index d04df0d2b..5edc5fade 100644
--- a/Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
+++ b/Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
@@ -45,6 +45,9 @@ namespace Emby.Server.Implementations.EntryPoints
/// </summary>
public void Run()
{
+ // ToDo: Fix This
+ return;
+
var udpServer = new UdpServer(_logger, _appHost, _json, _socketFactory);
try
@@ -65,7 +68,6 @@ namespace Emby.Server.Implementations.EntryPoints
public void Dispose()
{
Dispose(true);
- GC.SuppressFinalize(this);
}
/// <summary>
diff --git a/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs b/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs
index 11e806b0c..97feb32c0 100644
--- a/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs
+++ b/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common;
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Plugins;
@@ -61,17 +60,29 @@ namespace Emby.Server.Implementations.EntryPoints
var key = string.Join("_", keys.ToArray(keys.Count)).GetMD5();
- _apps.GetOrAdd(key, guid => GetNewClientInfo(session));
+ ClientInfo info;
+ if (!_apps.TryGetValue(key, out info))
+ {
+ info = new ClientInfo
+ {
+ AppName = session.Client,
+ AppVersion = session.ApplicationVersion,
+ DeviceName = session.DeviceName,
+ DeviceId = session.DeviceId
+ };
+
+ _apps[key] = info;
+
+ if (_config.Configuration.EnableAnonymousUsageReporting)
+ {
+ Task.Run(() => ReportNewSession(info));
+ }
+ }
}
}
- private async void ReportNewSession(ClientInfo client)
+ private async Task ReportNewSession(ClientInfo client)
{
- if (!_config.Configuration.EnableAnonymousUsageReporting)
- {
- return;
- }
-
try
{
await new UsageReporter(_applicationHost, _httpClient, _logger)
@@ -80,25 +91,10 @@ namespace Emby.Server.Implementations.EntryPoints
}
catch (Exception ex)
{
- _logger.ErrorException("Error sending anonymous usage statistics.", ex);
+ //_logger.ErrorException("Error sending anonymous usage statistics.", ex);
}
}
- private ClientInfo GetNewClientInfo(SessionInfo session)
- {
- var info = new ClientInfo
- {
- AppName = session.Client,
- AppVersion = session.ApplicationVersion,
- DeviceName = session.DeviceName,
- DeviceId = session.DeviceId
- };
-
- ReportNewSession(info);
-
- return info;
- }
-
public async void Run()
{
await Task.Delay(5000).ConfigureAwait(false);
@@ -123,14 +119,13 @@ namespace Emby.Server.Implementations.EntryPoints
}
catch (Exception ex)
{
- _logger.ErrorException("Error sending anonymous usage statistics.", ex);
+ //_logger.ErrorException("Error sending anonymous usage statistics.", ex);
}
}
public void Dispose()
{
_sessionManager.SessionStarted -= _sessionManager_SessionStarted;
- GC.SuppressFinalize(this);
}
}
}
diff --git a/Emby.Server.Implementations/EntryPoints/UsageReporter.cs b/Emby.Server.Implementations/EntryPoints/UsageReporter.cs
index deee8d64b..86b335b77 100644
--- a/Emby.Server.Implementations/EntryPoints/UsageReporter.cs
+++ b/Emby.Server.Implementations/EntryPoints/UsageReporter.cs
@@ -70,7 +70,7 @@ namespace Emby.Server.Implementations.EntryPoints
public async Task ReportAppUsage(ClientInfo app, CancellationToken cancellationToken)
{
- if (string.IsNullOrWhiteSpace(app.DeviceId))
+ if (string.IsNullOrEmpty(app.DeviceId))
{
throw new ArgumentException("Client info must have a device Id");
}
diff --git a/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs b/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
index 13c72bf3c..36e29e46a 100644
--- a/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
+++ b/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
@@ -27,7 +27,7 @@ namespace Emby.Server.Implementations.EntryPoints
private readonly ITimerFactory _timerFactory;
private const int UpdateDuration = 500;
- private readonly Dictionary<Guid, List<IHasUserData>> _changedItems = new Dictionary<Guid, List<IHasUserData>>();
+ private readonly Dictionary<Guid, List<BaseItem>> _changedItems = new Dictionary<Guid, List<BaseItem>>();
public UserDataChangeNotifier(IUserDataManager userDataManager, ISessionManager sessionManager, ILogger logger, IUserManager userManager, ITimerFactory timerFactory)
{
@@ -62,22 +62,22 @@ namespace Emby.Server.Implementations.EntryPoints
UpdateTimer.Change(UpdateDuration, Timeout.Infinite);
}
- List<IHasUserData> keys;
+ List<BaseItem> keys;
if (!_changedItems.TryGetValue(e.UserId, out keys))
{
- keys = new List<IHasUserData>();
+ keys = new List<BaseItem>();
_changedItems[e.UserId] = keys;
}
keys.Add(e.Item);
- var baseItem = e.Item as BaseItem;
+ var baseItem = e.Item;
// Go up one level for indicators
if (baseItem != null)
{
- var parent = baseItem.IsOwnedItem ? baseItem.GetOwner() : baseItem.GetParent();
+ var parent = baseItem.GetOwner() ?? baseItem.GetParent();
if (parent != null)
{
@@ -105,50 +105,41 @@ namespace Emby.Server.Implementations.EntryPoints
}
}
- private async Task SendNotifications(IEnumerable<KeyValuePair<Guid, List<IHasUserData>>> changes, CancellationToken cancellationToken)
+ private async Task SendNotifications(List<KeyValuePair<Guid, List<BaseItem>>> changes, CancellationToken cancellationToken)
{
foreach (var pair in changes)
{
- var userId = pair.Key;
- var userSessions = _sessionManager.Sessions
- .Where(u => u.ContainsUser(userId) && u.SessionController != null && u.IsActive)
- .ToList();
+ await SendNotifications(pair.Key, pair.Value, cancellationToken).ConfigureAwait(false);
+ }
+ }
+
+ private Task SendNotifications(Guid userId, List<BaseItem> changedItems, CancellationToken cancellationToken)
+ {
+ return _sessionManager.SendMessageToUserSessions(new List<Guid> { userId }, "UserDataChanged", () => GetUserDataChangeInfo(userId, changedItems), cancellationToken);
+ }
+
+ private UserDataChangeInfo GetUserDataChangeInfo(Guid userId, List<BaseItem> changedItems)
+ {
+ var user = _userManager.GetUserById(userId);
- if (userSessions.Count > 0)
+ var dtoList = changedItems
+ .DistinctBy(i => i.Id)
+ .Select(i =>
{
- var user = _userManager.GetUserById(userId);
-
- var dtoList = pair.Value
- .DistinctBy(i => i.Id)
- .Select(i =>
- {
- var dto = _userDataManager.GetUserDataDto(i, user);
- dto.ItemId = i.Id.ToString("N");
- return dto;
- })
- .ToArray();
-
- var info = new UserDataChangeInfo
- {
- UserId = userId.ToString("N"),
+ var dto = _userDataManager.GetUserDataDto(i, user);
+ dto.ItemId = i.Id.ToString("N");
+ return dto;
+ })
+ .ToArray();
- UserDataList = dtoList
- };
+ var userIdString = userId.ToString("N");
- foreach (var userSession in userSessions)
- {
- try
- {
- await userSession.SessionController.SendUserDataChangeInfo(info, cancellationToken).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error sending UserDataChanged message", ex);
- }
- }
- }
+ return new UserDataChangeInfo
+ {
+ UserId = userIdString,
- }
+ UserDataList = dtoList
+ };
}
public void Dispose()
@@ -160,7 +151,6 @@ namespace Emby.Server.Implementations.EntryPoints
}
_userDataManager.UserDataSaved -= _userDataManager_UserDataSaved;
- GC.SuppressFinalize(this);
}
}
}