diff options
Diffstat (limited to 'MediaBrowser.Dlna/PlayTo/DlnaController.cs')
| -rw-r--r-- | MediaBrowser.Dlna/PlayTo/DlnaController.cs | 66 |
1 files changed, 35 insertions, 31 deletions
diff --git a/MediaBrowser.Dlna/PlayTo/DlnaController.cs b/MediaBrowser.Dlna/PlayTo/DlnaController.cs index 64eb04946..0a8da4744 100644 --- a/MediaBrowser.Dlna/PlayTo/DlnaController.cs +++ b/MediaBrowser.Dlna/PlayTo/DlnaController.cs @@ -9,6 +9,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; using MediaBrowser.Dlna.Didl; +using MediaBrowser.Dlna.Ssdp; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -38,6 +39,8 @@ namespace MediaBrowser.Dlna.PlayTo private readonly IDtoService _dtoService; private readonly IImageProcessor _imageProcessor; + private readonly SsdpHandler _ssdpHandler; + public bool SupportsMediaRemoteControl { get { return true; } @@ -51,7 +54,7 @@ namespace MediaBrowser.Dlna.PlayTo } } - public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, INetworkManager networkManager, IDlnaManager dlnaManager, IUserManager userManager, IServerApplicationHost appHost, IDtoService dtoService, IImageProcessor imageProcessor) + public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, INetworkManager networkManager, IDlnaManager dlnaManager, IUserManager userManager, IServerApplicationHost appHost, IDtoService dtoService, IImageProcessor imageProcessor, SsdpHandler ssdpHandler) { _session = session; _itemRepository = itemRepository; @@ -63,6 +66,7 @@ namespace MediaBrowser.Dlna.PlayTo _appHost = appHost; _dtoService = dtoService; _imageProcessor = imageProcessor; + _ssdpHandler = ssdpHandler; _logger = logger; } @@ -74,7 +78,35 @@ namespace MediaBrowser.Dlna.PlayTo _device.PlaybackStopped += _device_PlaybackStopped; _device.Start(); - _updateTimer = new Timer(updateTimer_Elapsed, null, 30000, 30000); + _ssdpHandler.MessageReceived += _SsdpHandler_MessageReceived; + } + + async void _SsdpHandler_MessageReceived(object sender, SsdpMessageEventArgs e) + { + string nts; + e.Headers.TryGetValue("NTS", out nts); + + string usn; + if (!e.Headers.TryGetValue("USN", out usn)) usn = string.Empty; + + string nt; + if (!e.Headers.TryGetValue("NT", out nt)) nt = string.Empty; + + if (string.Equals(e.Method, "NOTIFY", StringComparison.OrdinalIgnoreCase) && + string.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase)) + { + if (usn.IndexOf(_device.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1) + { + if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1 || + nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1) + { + if (!_disposed) + { + await _sessionManager.ReportSessionEnded(_session.Id).ConfigureAwait(false); + } + } + } + } } async void _device_PlaybackStopped(object sender, PlaybackStoppedEventArgs e) @@ -165,34 +197,6 @@ namespace MediaBrowser.Dlna.PlayTo }; } - #region Device EventHandlers & Update Timer - - Timer _updateTimer; - - /// <summary> - /// Handles the Elapsed event of the updateTimer control. - /// </summary> - /// <param name="state">The state.</param> - private async void updateTimer_Elapsed(object state) - { - if (!IsSessionActive) - { - _updateTimer.Change(Timeout.Infinite, Timeout.Infinite); - - try - { - // Session is inactive, mark it for Disposal and don't start the elapsed timer. - await _sessionManager.ReportSessionEnded(_session.Id); - } - catch (Exception ex) - { - _logger.ErrorException("Error in ReportSessionEnded", ex); - } - } - } - - #endregion - #region SendCommands public async Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken) @@ -571,8 +575,8 @@ namespace MediaBrowser.Dlna.PlayTo _device.PlaybackStart -= _device_PlaybackStart; _device.PlaybackProgress -= _device_PlaybackProgress; _device.PlaybackStopped -= _device_PlaybackStopped; + _ssdpHandler.MessageReceived -= _SsdpHandler_MessageReceived; - _updateTimer.Dispose(); _device.Dispose(); } } |
