diff options
| author | 7illusions <z@7illusions.com> | 2014-05-12 16:55:07 +0200 |
|---|---|---|
| committer | 7illusions <z@7illusions.com> | 2014-05-12 16:55:07 +0200 |
| commit | baf5cf2544fcaad2246923f60caaf3fed4a94aaf (patch) | |
| tree | a808b700095f876e437b95c432c0220e241f9fda /MediaBrowser.Server.Implementations/EntryPoints | |
| parent | 8f3a6279e173dcbaaa05a56556afb410ee12dd4d (diff) | |
| parent | b9b568de13d81f9db1a8502d50940475c1d79c72 (diff) | |
Merge pull request #3 from MediaBrowser/master
Sync with Master
Diffstat (limited to 'MediaBrowser.Server.Implementations/EntryPoints')
| -rw-r--r-- | MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs | 10 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs (renamed from MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs) | 126 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs | 21 |
3 files changed, 121 insertions, 36 deletions
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs index 59fa78a00..40eeea651 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs @@ -252,15 +252,15 @@ namespace MediaBrowser.Server.Implementations.EntryPoints return new LibraryUpdateInfo { - ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(), + ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - ItemsUpdated = itemsUpdated.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(), + ItemsUpdated = itemsUpdated.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - ItemsRemoved = itemsRemoved.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren, true)).Select(i => i.Id).Distinct().ToList(), + ItemsRemoved = itemsRemoved.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren, true)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(), + FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList() + FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList() }; } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs index 1e3f8b0b0..242e81d1f 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs @@ -1,25 +1,28 @@ -using MediaBrowser.Common.Events; +using System.Globalization; +using MediaBrowser.Common.Events; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Common.Updates; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Notifications; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Notifications; using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Updates; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Updates; namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications { @@ -40,6 +43,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications private readonly ISessionManager _sessionManager; private readonly IServerApplicationHost _appHost; + private Timer LibraryUpdateTimer { get; set; } + private readonly object _libraryChangedSyncLock = new object(); + public Notifications(IInstallationManager installationManager, IUserManager userManager, ILogger logger, ITaskManager taskManager, INotificationManager notificationManager, IServerConfigurationManager config, ILibraryManager libraryManager, ISessionManager sessionManager, IServerApplicationHost appHost) { _installationManager = installationManager; @@ -81,7 +87,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications notification.Variables["Version"] = e.Argument.versionStr; notification.Variables["ReleaseNotes"] = e.Argument.description; - + await SendNotification(notification).ConfigureAwait(false); } @@ -134,7 +140,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications var notification = new NotificationRequest { - Description = "Please see mediabrowser3.com for details.", + Description = "Please see mediabrowser.tv for details.", NotificationType = type }; @@ -164,7 +170,13 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications var item = e.MediaInfo; - if (e.Item !=null && e.Item.Parent == null) + if (item == null) + { + _logger.Warn("PlaybackStart reported with null media info."); + return; + } + + if (e.Item != null && e.Item.Parent == null) { // Don't report theme song or local trailer playback // TODO: This will also cause movie specials to not be reported @@ -185,7 +197,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications await SendNotification(notification).ConfigureAwait(false); } - + private string GetPlaybackNotificationType(string mediaType) { if (string.Equals(mediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase)) @@ -204,23 +216,88 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications return null; } - async void _libraryManager_ItemAdded(object sender, ItemChangeEventArgs e) + private readonly List<BaseItem> _itemsAdded = new List<BaseItem>(); + void _libraryManager_ItemAdded(object sender, ItemChangeEventArgs e) { - if (e.Item.LocationType == LocationType.FileSystem) + if (e.Item.LocationType == LocationType.FileSystem && !e.Item.IsFolder) { - var type = NotificationType.NewLibraryContent.ToString(); + lock (_libraryChangedSyncLock) + { + if (LibraryUpdateTimer == null) + { + LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, 5000, + Timeout.Infinite); + } + else + { + LibraryUpdateTimer.Change(5000, Timeout.Infinite); + } + + _itemsAdded.Add(e.Item); + } + } + } - var item = e.Item; + private async void LibraryUpdateTimerCallback(object state) + { + List<BaseItem> items; + + lock (_libraryChangedSyncLock) + { + items = _itemsAdded.ToList(); + _itemsAdded.Clear(); + DisposeLibraryUpdateTimer(); + } + + if (items.Count == 1) + { + var item = items.First(); var notification = new NotificationRequest { - NotificationType = type + NotificationType = NotificationType.NewLibraryContent.ToString() }; - notification.Variables["Name"] = item.Name; - + notification.Variables["Name"] = GetItemName(item); + await SendNotification(notification).ConfigureAwait(false); } + else + { + var notification = new NotificationRequest + { + NotificationType = NotificationType.NewLibraryContentMultiple.ToString() + }; + + notification.Variables["ItemCount"] = items.Count.ToString(CultureInfo.InvariantCulture); + + await SendNotification(notification).ConfigureAwait(false); + } + } + + private string GetItemName(BaseItem item) + { + var name = item.Name; + + var hasSeries = item as IHasSeries; + + if (hasSeries != null) + { + name = hasSeries.SeriesName + " - " + name; + } + + var hasArtist = item as IHasArtist; + if (hasArtist != null) + { + var artists = hasArtist.AllArtists; + + if (artists.Count > 0) + { + name = hasArtist.AllArtists[0] + " - " + name; + } + } + + return name; } async void _userManager_UserCreated(object sender, GenericEventArgs<User> e) @@ -235,9 +312,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications await SendNotification(notification).ConfigureAwait(false); } - async void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e) + async void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e) { - var result = e.Argument; + var result = e.Result; if (result.Status == TaskCompletionStatus.Failed) { @@ -250,8 +327,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications NotificationType = type }; - notification.Variables["Name"] = e.Argument.Name; - notification.Variables["ErrorMessage"] = e.Argument.ErrorMessage; + notification.Variables["Name"] = result.Name; + notification.Variables["ErrorMessage"] = result.ErrorMessage; await SendNotification(notification).ConfigureAwait(false); } @@ -260,7 +337,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications async void _installationManager_PluginUninstalled(object sender, GenericEventArgs<IPlugin> e) { var type = NotificationType.PluginUninstalled.ToString(); - + var plugin = e.Argument; var notification = new NotificationRequest @@ -270,7 +347,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications notification.Variables["Name"] = plugin.Name; notification.Variables["Version"] = plugin.Version.ToString(); - + await SendNotification(notification).ConfigureAwait(false); } @@ -307,6 +384,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications public void Dispose() { + DisposeLibraryUpdateTimer(); + _installationManager.PluginInstalled -= _installationManager_PluginInstalled; _installationManager.PluginUpdated -= _installationManager_PluginUpdated; _installationManager.PackageInstallationFailed -= _installationManager_PackageInstallationFailed; @@ -322,5 +401,14 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications _appHost.HasUpdateAvailableChanged -= _appHost_HasUpdateAvailableChanged; _appHost.ApplicationUpdated -= _appHost_ApplicationUpdated; } + + private void DisposeLibraryUpdateTimer() + { + if (LibraryUpdateTimer != null) + { + LibraryUpdateTimer.Dispose(); + LibraryUpdateTimer = null; + } + } } } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs index 0925ca86c..d6ad7771b 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Common.Updates; @@ -9,6 +8,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Tasks; using System; using System.Threading; @@ -53,8 +53,12 @@ namespace MediaBrowser.Server.Implementations.EntryPoints /// Initializes a new instance of the <see cref="ServerEventNotifier" /> class. /// </summary> /// <param name="serverManager">The server manager.</param> - /// <param name="logger">The logger.</param> + /// <param name="appHost">The application host.</param> /// <param name="userManager">The user manager.</param> + /// <param name="installationManager">The installation manager.</param> + /// <param name="taskManager">The task manager.</param> + /// <param name="dtoService">The dto service.</param> + /// <param name="sessionManager">The session manager.</param> public ServerEventNotifier(IServerManager serverManager, IServerApplicationHost appHost, IUserManager userManager, IInstallationManager installationManager, ITaskManager taskManager, IDtoService dtoService, ISessionManager sessionManager) { _serverManager = serverManager; @@ -79,7 +83,6 @@ namespace MediaBrowser.Server.Implementations.EntryPoints _installationManager.PackageInstallationCompleted += _installationManager_PackageInstallationCompleted; _installationManager.PackageInstallationFailed += _installationManager_PackageInstallationFailed; - _taskManager.TaskExecuting += _taskManager_TaskExecuting; _taskManager.TaskCompleted += _taskManager_TaskCompleted; } @@ -103,15 +106,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints _serverManager.SendWebSocketMessage("PackageInstallationFailed", e.InstallationInfo); } - void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e) + void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e) { - _serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Argument); - } - - void _taskManager_TaskExecuting(object sender, EventArgs e) - { - var task = (IScheduledTask)sender; - _serverManager.SendWebSocketMessage("ScheduledTaskStarted", task.Name); + _serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Result); } /// <summary> |
