void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e) { string st = null; string nt = null; e.Headers.TryGetValue("ST", out st); e.Headers.TryGetValue("NT", out nt); if (string.Equals(st, "urn:ses-com:device:SatIPServer:1", StringComparison.OrdinalIgnoreCase) || string.Equals(nt, "urn:ses-com:device:SatIPServer:1", StringComparison.OrdinalIgnoreCase)) { string location; if (e.Headers.TryGetValue("Location", out location) && !string.IsNullOrWhiteSpace(location)) { _logger.Debug("SAT IP 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('/'); AddDevice(apiUrl, location); } } } }
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); } } } }
void _ssdp_MessageReceived(object sender, SsdpMessageEventArgs e) { var endpoint = e.EndPoint as IPEndPoint; if (endpoint == null || e.LocalEndPoint == null) { return; } string usn; if (!e.Headers.TryGetValue("USN", out usn)) usn = string.Empty; string nt; if (!e.Headers.TryGetValue("NT", out nt)) nt = string.Empty; // Filter device type if (usn.IndexOf("WANIPConnection:", StringComparison.OrdinalIgnoreCase) == -1 && nt.IndexOf("WANIPConnection:", StringComparison.OrdinalIgnoreCase) == -1 && usn.IndexOf("WANPPPConnection:", StringComparison.OrdinalIgnoreCase) == -1 && nt.IndexOf("WANPPPConnection:", StringComparison.OrdinalIgnoreCase) == -1) { return; } var identifier = string.IsNullOrWhiteSpace(usn) ? nt : usn; if (!_usnsHandled.Contains(identifier)) { _usnsHandled.Add(identifier); _logger.Debug("Calling Nat.Handle on " + identifier); NatUtility.Handle(e.LocalEndPoint.Address, e.Message, endpoint, NatProtocol.Upnp); } }
void _ssdp_MessageReceived(object sender, SsdpMessageEventArgs e) { var endpoint = e.EndPoint as IPEndPoint; if (endpoint != null && e.LocalEndPoint != null) { NatUtility.Handle(e.LocalEndPoint.Address, e.Message, endpoint, NatProtocol.Upnp); } }
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); _logger.Debug("Attempting to create PlayToController from location {0}", location); var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false); if (device.RendererCommands == null) { lock (_nonRendererUrls) { _nonRendererUrls.Add(location); return; } } _logger.Debug("Logging session activity from location {0}", location); 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, _mediaEncoder); 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); } }