void _ssdpHandler_MessageReceived(object sender, SsdpMessageEventArgs e) { string nts; e.Headers.TryGetValue("NTS", out nts); if (String.Equals(e.Method, "NOTIFY", StringComparison.OrdinalIgnoreCase) && String.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase) && !_disposed) { EventHelper.FireEventIfNotNull(DeviceLeft, this, e, _logger); return; } try { if (e.LocalEndPoint == null) { var ip = _appHost.LocalIpAddress; e.LocalEndPoint = new IPEndPoint(IPAddress.Parse(ip), 0); } if (e.LocalEndPoint != null) { TryCreateDevice(e); } } catch (OperationCanceledException) { } catch (Exception ex) { _logger.ErrorException("Error creating play to controller", ex); } }
void _deviceDiscovery_DeviceLeft(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 ( usn.IndexOf(_device.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1 && !_disposed) { 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 } } } }
private async void OnMessageReceived(SsdpMessageEventArgs args) { var headers = args.Headers; string st; if (string.Equals(args.Method, "M-SEARCH", StringComparison.OrdinalIgnoreCase) && headers.TryGetValue("st", out st)) { TimeSpan delay = GetSearchDelay(headers); if (_config.GetDlnaConfiguration().EnableDebugLogging) { _logger.Debug("Delaying search response by {0} seconds", delay.TotalSeconds); } await Task.Delay(delay).ConfigureAwait(false); RespondToSearch(args.EndPoint, st); } EventHelper.FireEventIfNotNull(MessageReceived, this, args, _logger); }
void _deviceDiscovery_DeviceLeft(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 (usn.IndexOf(_device.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1 && !_disposed) { 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 } } } }
void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e) { string server = null; if (e.Headers.TryGetValue("SERVER", out server) && server.IndexOf("HDHomeRun", StringComparison.OrdinalIgnoreCase) != -1) { string location; if (e.Headers.TryGetValue("Location", out location)) { //_logger.Debug("HdHomerun found at {0}", location); // Just get the beginning of the url Uri uri; if (Uri.TryCreate(location, UriKind.Absolute, out uri)) { var apiUrl = location.Replace(uri.LocalPath, String.Empty, StringComparison.OrdinalIgnoreCase) .TrimEnd('/'); //_logger.Debug("HdHomerun api url: {0}", apiUrl); AddDevice(apiUrl); } } } }
async void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e) { string usn; if (!e.Headers.TryGetValue("USN", out usn)) { usn = string.Empty; } string nt; if (!e.Headers.TryGetValue("NT", out nt)) { nt = string.Empty; } string location; if (!e.Headers.TryGetValue("Location", out location)) { location = string.Empty; } // It has to report that it's a media renderer if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1 && nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1) { return; } if (_sessionManager.Sessions.Any(i => usn.IndexOf(i.DeviceId, StringComparison.OrdinalIgnoreCase) != -1)) { return; } try { lock (_nonRendererUrls) { if ((DateTime.UtcNow - _lastRendererClear).TotalMinutes >= 10) { _nonRendererUrls.Clear(); _lastRendererClear = DateTime.UtcNow; } if (_nonRendererUrls.Contains(location, StringComparer.OrdinalIgnoreCase)) { return; } } var uri = new Uri(location); var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false); if (device.RendererCommands == null) { lock (_nonRendererUrls) { _nonRendererUrls.Add(location); return; } } var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null) .ConfigureAwait(false); var controller = sessionInfo.SessionController as PlayToController; if (controller == null) { var serverAddress = GetServerAddress(e.LocalEndPoint.Address); string accessToken = null; sessionInfo.SessionController = controller = new PlayToController(sessionInfo, _sessionManager, _libraryManager, _logger, _dlnaManager, _userManager, _imageProcessor, serverAddress, accessToken, _deviceDiscovery, _userDataManager, _localization, _mediaSourceManager, _config); controller.Init(device); var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ?? _dlnaManager.GetDefaultProfile(); _sessionManager.ReportCapabilities(sessionInfo.Id, new ClientCapabilities { PlayableMediaTypes = profile.GetSupportedMediaTypes(), SupportedCommands = new List <string> { GeneralCommandType.VolumeDown.ToString(), GeneralCommandType.VolumeUp.ToString(), GeneralCommandType.Mute.ToString(), GeneralCommandType.Unmute.ToString(), GeneralCommandType.ToggleMute.ToString(), GeneralCommandType.SetVolume.ToString(), GeneralCommandType.SetAudioStreamIndex.ToString(), GeneralCommandType.SetSubtitleStreamIndex.ToString() }, SupportsMediaControl = true }); _logger.Info("DLNA Session created for {0} - {1}", device.Properties.Name, device.Properties.ModelName); } } catch (Exception ex) { _logger.ErrorException("Error creating PlayTo device.", ex); } }
async void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e) { var localIp = e.LocalIp; string usn; if (!e.Headers.TryGetValue("USN", out usn)) usn = string.Empty; string nt; if (!e.Headers.TryGetValue("NT", out nt)) nt = string.Empty; string location; if (!e.Headers.TryGetValue("Location", out location)) location = string.Empty; // It has to report that it's a media renderer if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1 && nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1) { return; } if (_sessionManager.Sessions.Any(i => usn.IndexOf(i.DeviceId, StringComparison.OrdinalIgnoreCase) != -1)) { return; } try { var uri = new Uri(location); var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false); if (device.RendererCommands != null) { var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null) .ConfigureAwait(false); var controller = sessionInfo.SessionController as PlayToController; if (controller == null) { var serverAddress = GetServerAddress(localIp); sessionInfo.SessionController = controller = new PlayToController(sessionInfo, _sessionManager, _itemRepository, _libraryManager, _logger, _dlnaManager, _userManager, _imageProcessor, serverAddress, _deviceDiscovery, _userDataManager, _localization); controller.Init(device); var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ?? _dlnaManager.GetDefaultProfile(); _sessionManager.ReportCapabilities(sessionInfo.Id, new ClientCapabilities { PlayableMediaTypes = profile.GetSupportedMediaTypes(), SupportedCommands = new List<string> { GeneralCommandType.VolumeDown.ToString(), GeneralCommandType.VolumeUp.ToString(), GeneralCommandType.Mute.ToString(), GeneralCommandType.Unmute.ToString(), GeneralCommandType.ToggleMute.ToString(), GeneralCommandType.SetVolume.ToString(), GeneralCommandType.SetAudioStreamIndex.ToString(), GeneralCommandType.SetSubtitleStreamIndex.ToString() }, SupportsMediaControl = true }); _logger.Info("DLNA Session created for {0} - {1}", device.Properties.Name, device.Properties.ModelName); } } } catch (Exception ex) { _logger.ErrorException("Error creating PlayTo device.", ex); } }
internal bool IsSelfNotification(SsdpMessageEventArgs args) { // Avoid responding to self search messages //string serverId; //if (args.Headers.TryGetValue("X-EMBYSERVERID", out serverId) && // string.Equals(serverId, _appHost.SystemId, StringComparison.OrdinalIgnoreCase)) //{ // return true; //} string server; args.Headers.TryGetValue("SERVER", out server); if (string.Equals(server, _serverSignature, StringComparison.OrdinalIgnoreCase)) { //return true; } return false; }
private void TryCreateController(SsdpMessageEventArgs args, IPAddress localIp) { string nts; args.Headers.TryGetValue("NTS", out nts); string usn; if (!args.Headers.TryGetValue("USN", out usn)) { usn = string.Empty; } string nt; if (!args.Headers.TryGetValue("NT", out nt)) { nt = string.Empty; } // Don't create a new controller when a device is indicating it's shutting down if (string.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase)) { return; } // It has to report that it's a media renderer if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1 && nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1) { return; } // Need to be able to download device description string location; if (!args.Headers.TryGetValue("Location", out location) || string.IsNullOrEmpty(location)) { return; } if (_config.Configuration.DlnaOptions.EnableDebugLogging) { var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)); var headerText = string.Join(",", headerTexts.ToArray()); _logger.Debug("{0} PlayTo message received from {1}. Headers: {2}", args.Method, args.EndPoint, headerText); } if (_sessionManager.Sessions.Any(i => usn.IndexOf(i.DeviceId, StringComparison.OrdinalIgnoreCase) != -1)) { return; } Task.Run(async() => { try { await CreateController(new Uri(location), localIp).ConfigureAwait(false); } catch (OperationCanceledException) { } catch (Exception ex) { _logger.ErrorException("Error creating play to controller", ex); } }); }
private void TryCreateDevice(SsdpMessageEventArgs args) { string nts; args.Headers.TryGetValue("NTS", out nts); if (String.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase)) { if (String.Equals(args.Method, "NOTIFY", StringComparison.OrdinalIgnoreCase)) { if (!_disposed) { EventHelper.FireEventIfNotNull(DeviceLeft, this, args, _logger); } } return; } string usn; if (!args.Headers.TryGetValue("USN", out usn)) usn = string.Empty; string nt; if (!args.Headers.TryGetValue("NT", out nt)) nt = string.Empty; // Need to be able to download device description string location; if (!args.Headers.TryGetValue("Location", out location) || string.IsNullOrEmpty(location)) { return; } if (_config.GetDlnaConfiguration().EnableDebugLogging) { var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)); var headerText = string.Join(",", headerTexts.ToArray()); _logger.Debug("{0} Device message received from {1}. Headers: {2}", args.Method, args.EndPoint, headerText); } EventHelper.FireEventIfNotNull(DeviceDiscovered, this, args, _logger); }
private void TryCreateDevice(SsdpMessageEventArgs args) { string nts; args.Headers.TryGetValue("NTS", out nts); if (String.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase)) { if (String.Equals(args.Method, "NOTIFY", StringComparison.OrdinalIgnoreCase)) { if (!_disposed) { EventHelper.FireEventIfNotNull(DeviceLeft, this, args, _logger); } } return; } string usn; if (!args.Headers.TryGetValue("USN", out usn)) usn = string.Empty; string nt; if (!args.Headers.TryGetValue("NT", out nt)) nt = string.Empty; // Need to be able to download device description string location; if (!args.Headers.TryGetValue("Location", out location) || string.IsNullOrEmpty(location)) { return; } EventHelper.FireEventIfNotNull(DeviceDiscovered, this, args, _logger); }
async void deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e) { string usn; if (!e.Headers.TryGetValue("USN", out usn)) { usn = string.Empty; } string nt; if (!e.Headers.TryGetValue("NT", out nt)) { nt = string.Empty; } string location; if (!e.Headers.TryGetValue("Location", out location)) { location = string.Empty; } if (!IsValid(nt, usn)) { return; } if (_localServersLookup != null) { if (_localServersLookup().Any(i => usn.IndexOf(i, StringComparison.OrdinalIgnoreCase) != -1)) { // Don't add the local Dlna server to this return; } } if (GetExistingServers(usn).Any()) { return; } await _syncLock.WaitAsync().ConfigureAwait(false); try { if (GetExistingServers(usn).Any()) { return; } var device = await Device.CreateuPnpDeviceAsync(new Uri(location), _httpClient, _config, _logger) .ConfigureAwait(false); if (!_servers.Any(i => string.Equals(i.Properties.UUID, device.Properties.UUID, StringComparison.OrdinalIgnoreCase))) { _servers.Add(device); } } catch (Exception ex) { } finally { _syncLock.Release(); } }
internal bool IgnoreMessage(SsdpMessageEventArgs args, bool isMulticast) { string usn; if (args.Headers.TryGetValue("USN", out usn)) { // USN=uuid:b67df29b5c379445fde78c3774ab518d::urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1 if (RegisteredDevices.Any(i => string.Equals(i.USN, usn, StringComparison.OrdinalIgnoreCase))) { //var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)); //var headerText = string.Join(",", headerTexts.ToArray()); //var protocol = isMulticast ? "Multicast" : "Unicast"; //var localEndPointString = args.LocalEndPoint == null ? "null" : args.LocalEndPoint.ToString(); //_logger.Debug("IGNORING {0} message received from {1} on {3}. Protocol: {4} Headers: {2}", args.Method, args.EndPoint, headerText, localEndPointString, protocol); return true; } } string serverId; if (args.Headers.TryGetValue("X-EMBY-SERVERID", out serverId)) { if (string.Equals(serverId, _appHost.SystemId, StringComparison.OrdinalIgnoreCase)) { //var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)); //var headerText = string.Join(",", headerTexts.ToArray()); //var protocol = isMulticast ? "Multicast" : "Unicast"; //var localEndPointString = args.LocalEndPoint == null ? "null" : args.LocalEndPoint.ToString(); //_logger.Debug("IGNORING {0} message received from {1} on {3}. Protocol: {4} Headers: {2}", args.Method, args.EndPoint, headerText, localEndPointString, protocol); return true; } } return false; }
internal void LogMessageReceived(SsdpMessageEventArgs args, bool isMulticast) { var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLog; if (enableDebugLogging) { var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)); var headerText = string.Join(",", headerTexts.ToArray()); var protocol = isMulticast ? "Multicast" : "Unicast"; var localEndPointString = args.LocalEndPoint == null ? "null" : args.LocalEndPoint.ToString(); _logger.Debug("{0} message received from {1} on {3}. Protocol: {4} Headers: {2}", args.Method, args.EndPoint, headerText, localEndPointString, protocol); } }