Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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
                    }
                }
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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
                    }
                }
            }
        }
Exemplo n.º 5
0
        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);
                    }
                }
            }
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
        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;
        }
Exemplo n.º 9
0
        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);
                }
            });
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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();
            }
        }
Exemplo n.º 13
0
        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;
        }
Exemplo n.º 14
0
        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);
            }
        }