diff --git a/MediaBrowser.Dlna/PlayTo/Device.cs b/MediaBrowser.Dlna/PlayTo/Device.cs index 1ec7a4ce0..6ad5899da 100644 --- a/MediaBrowser.Dlna/PlayTo/Device.cs +++ b/MediaBrowser.Dlna/PlayTo/Device.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Net; using System.Security; using System.Threading; using System.Threading.Tasks; @@ -91,6 +92,7 @@ namespace MediaBrowser.Dlna.PlayTo private readonly IServerConfigurationManager _config; public DateTime DateLastActivity { get; private set; } + public Action OnDeviceUnavailable { get; set; } public Device(DeviceInfo deviceProperties, IHttpClient httpClient, ILogger logger, IServerConfigurationManager config) { @@ -134,6 +136,9 @@ namespace MediaBrowser.Dlna.PlayTo private async void RefreshVolume() { + if (_disposed) + return; + try { await GetVolume().ConfigureAwait(false); @@ -149,6 +154,9 @@ namespace MediaBrowser.Dlna.PlayTo private bool _timerActive; private void RestartTimer() { + if (_disposed) + return; + if (!_timerActive) { lock (_timerLock) @@ -169,6 +177,9 @@ namespace MediaBrowser.Dlna.PlayTo /// private void RestartTimerInactive() { + if (_disposed) + return; + if (_timerActive) { lock (_timerLock) @@ -398,6 +409,7 @@ namespace MediaBrowser.Dlna.PlayTo #region Get data private int _successiveStopCount; + private int _connectFailureCount; private async void TimerCallback(object sender) { if (_disposed) @@ -435,6 +447,8 @@ namespace MediaBrowser.Dlna.PlayTo } } + _connectFailureCount = 0; + if (_disposed) return; @@ -455,8 +469,33 @@ namespace MediaBrowser.Dlna.PlayTo } } } + catch (WebException ex) + { + if (_disposed) + return; + + _logger.ErrorException("Error updating device info for {0}", ex, Properties.Name); + + _successiveStopCount++; + _connectFailureCount++; + + if (_successiveStopCount >= maxSuccessiveStopReturns) + { + RestartTimerInactive(); + } + if (_connectFailureCount >= maxSuccessiveStopReturns) + { + if (OnDeviceUnavailable != null) + { + OnDeviceUnavailable(); + } + } + } catch (Exception ex) { + if (_disposed) + return; + _logger.ErrorException("Error updating device info for {0}", ex, Properties.Name); _successiveStopCount++; diff --git a/MediaBrowser.Dlna/PlayTo/PlayToController.cs b/MediaBrowser.Dlna/PlayTo/PlayToController.cs index 873ae5ae4..7429330bd 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToController.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToController.cs @@ -103,11 +103,25 @@ namespace MediaBrowser.Dlna.PlayTo _device.PlaybackProgress += _device_PlaybackProgress; _device.PlaybackStopped += _device_PlaybackStopped; _device.MediaChanged += _device_MediaChanged; + _device.OnDeviceUnavailable = OnDeviceUnavailable; + _device.Start(); _deviceDiscovery.DeviceLeft += _deviceDiscovery_DeviceLeft; } + private void OnDeviceUnavailable() + { + try + { + _sessionManager.ReportSessionEnded(_session.Id); + } + catch + { + // Could throw if the session is already gone + } + } + void _deviceDiscovery_DeviceLeft(object sender, SsdpMessageEventArgs e) { string nts; @@ -125,14 +139,7 @@ namespace MediaBrowser.Dlna.PlayTo if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1 || nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1) { - try - { - _sessionManager.ReportSessionEnded(_session.Id); - } - catch - { - // Could throw if the session is already gone - } + OnDeviceUnavailable(); } } } @@ -647,6 +654,7 @@ namespace MediaBrowser.Dlna.PlayTo _device.PlaybackStopped -= _device_PlaybackStopped; _device.MediaChanged -= _device_MediaChanged; _deviceDiscovery.DeviceLeft -= _deviceDiscovery_DeviceLeft; + _device.OnDeviceUnavailable = null; _device.Dispose(); } diff --git a/MediaBrowser.Model/Configuration/LibraryOptions.cs b/MediaBrowser.Model/Configuration/LibraryOptions.cs index c6f7bbb9d..e15df37c1 100644 --- a/MediaBrowser.Model/Configuration/LibraryOptions.cs +++ b/MediaBrowser.Model/Configuration/LibraryOptions.cs @@ -3,5 +3,11 @@ public class LibraryOptions { public bool EnableArchiveMediaFiles { get; set; } + public bool EnablePhotos { get; set; } + + public LibraryOptions() + { + EnablePhotos = true; + } } } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 52961668d..a19f70e68 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -364,7 +364,7 @@ namespace MediaBrowser.Server.Implementations.Library if (item.IsFolder) { - if (!(item is ICollectionFolder) && !(item is UserView) && !(item is Channel)) + if (!(item is ICollectionFolder) && !(item is UserView) && !(item is Channel) && !(item is AggregateFolder)) { if (item.SourceType != SourceType.Library) { diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs index 78df465b1..3f9475480 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs @@ -34,8 +34,9 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers // Must be an image file within a photo collection var collectionType = args.GetCollectionType(); + if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) || - string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) + (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos)) { if (IsImageFile(args.Path, _imageProcessor)) { diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 9b51fd489..b9d647c36 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -101,6 +101,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest