diff options
| author | LogicalPhallacy <44458166+LogicalPhallacy@users.noreply.github.com> | 2019-02-11 22:48:50 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-11 22:48:50 -0800 |
| commit | 8bf88f4cb2ddb140baffd8e4542d8f528b482a67 (patch) | |
| tree | 5f60f345a22c2468b504b925c0bf4785869185ae /Emby.Dlna | |
| parent | 4519ce26e2250cb233836296d292ddb7b3cf6346 (diff) | |
| parent | eb4b7051676b7493a57a99a821d5dd38bd9d4919 (diff) | |
Merge pull request #9 from jellyfin/master
Yanking in latest changes
Diffstat (limited to 'Emby.Dlna')
| -rw-r--r-- | Emby.Dlna/Api/DlnaServerService.cs | 4 | ||||
| -rw-r--r-- | Emby.Dlna/ContentDirectory/ControlHandler.cs | 6 | ||||
| -rw-r--r-- | Emby.Dlna/Didl/DidlBuilder.cs | 159 | ||||
| -rw-r--r-- | Emby.Dlna/DlnaManager.cs | 15 | ||||
| -rw-r--r-- | Emby.Dlna/Main/DlnaEntryPoint.cs | 17 | ||||
| -rw-r--r-- | Emby.Dlna/PlayTo/Device.cs | 247 | ||||
| -rw-r--r-- | Emby.Dlna/PlayTo/PlayToController.cs | 32 | ||||
| -rw-r--r-- | Emby.Dlna/PlayTo/PlayToManager.cs | 7 | ||||
| -rw-r--r-- | Emby.Dlna/Server/DescriptionXmlBuilder.cs | 146 | ||||
| -rw-r--r-- | Emby.Dlna/Ssdp/DeviceDiscovery.cs | 8 |
10 files changed, 311 insertions, 330 deletions
diff --git a/Emby.Dlna/Api/DlnaServerService.cs b/Emby.Dlna/Api/DlnaServerService.cs index 01c9fe50f..68bf80163 100644 --- a/Emby.Dlna/Api/DlnaServerService.cs +++ b/Emby.Dlna/Api/DlnaServerService.cs @@ -236,7 +236,9 @@ namespace Emby.Dlna.Api public object Get(GetIcon request) { - var contentType = "image/" + Path.GetExtension(request.Filename).TrimStart('.').ToLower(); + var contentType = "image/" + Path.GetExtension(request.Filename) + .TrimStart('.') + .ToLowerInvariant(); var cacheLength = TimeSpan.FromDays(365); var cacheKey = Request.RawUrl.GetMD5(); diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs index 2d8bb87f9..1150afdba 100644 --- a/Emby.Dlna/ContentDirectory/ControlHandler.cs +++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs @@ -63,7 +63,7 @@ namespace Emby.Dlna.ContentDirectory _profile = profile; _config = config; - _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, _logger, libraryManager, mediaEncoder); + _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, _logger, mediaEncoder); } protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, IDictionary<string, string> methodParams) @@ -454,7 +454,7 @@ namespace Emby.Dlna.ContentDirectory User = user, Recursive = true, IsMissing = false, - ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name }, + ExcludeItemTypes = new[] { typeof(Book).Name }, IsFolder = isFolder, MediaTypes = mediaTypes.ToArray(), DtoOptions = GetDtoOptions() @@ -523,7 +523,7 @@ namespace Emby.Dlna.ContentDirectory Limit = limit, StartIndex = startIndex, IsVirtualItem = false, - ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name }, + ExcludeItemTypes = new[] { typeof(Book).Name }, IsPlaceHolder = false, DtoOptions = GetDtoOptions() }; diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs index e4a9cbfc6..605f4f37b 100644 --- a/Emby.Dlna/Didl/DidlBuilder.cs +++ b/Emby.Dlna/Didl/DidlBuilder.cs @@ -43,22 +43,30 @@ namespace Emby.Dlna.Didl private readonly ILocalizationManager _localization; private readonly IMediaSourceManager _mediaSourceManager; private readonly ILogger _logger; - private readonly ILibraryManager _libraryManager; private readonly IMediaEncoder _mediaEncoder; - public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, string accessToken, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, ILogger logger, ILibraryManager libraryManager, IMediaEncoder mediaEncoder) + public DidlBuilder( + DeviceProfile profile, + User user, + IImageProcessor imageProcessor, + string serverAddress, + string accessToken, + IUserDataManager userDataManager, + ILocalizationManager localization, + IMediaSourceManager mediaSourceManager, + ILogger logger, + IMediaEncoder mediaEncoder) { _profile = profile; + _user = user; _imageProcessor = imageProcessor; _serverAddress = serverAddress; + _accessToken = accessToken; _userDataManager = userDataManager; _localization = localization; _mediaSourceManager = mediaSourceManager; _logger = logger; - _libraryManager = libraryManager; _mediaEncoder = mediaEncoder; - _accessToken = accessToken; - _user = user; } public static string NormalizeDlnaMediaUrl(string url) @@ -117,7 +125,8 @@ namespace Emby.Dlna.Didl } } - public void WriteItemElement(DlnaOptions options, + public void WriteItemElement( + DlnaOptions options, XmlWriter writer, BaseItem item, User user, @@ -232,12 +241,15 @@ namespace Emby.Dlna.Didl AddVideoResource(writer, video, deviceId, filter, contentFeature, streamInfo); } - var subtitleProfiles = streamInfo.GetSubtitleProfiles(_mediaEncoder, false, _serverAddress, _accessToken) - .Where(subtitle => subtitle.DeliveryMethod == SubtitleDeliveryMethod.External) - .ToList(); + var subtitleProfiles = streamInfo.GetSubtitleProfiles(_mediaEncoder, false, _serverAddress, _accessToken); foreach (var subtitle in subtitleProfiles) { + if (subtitle.DeliveryMethod != SubtitleDeliveryMethod.External) + { + continue; + } + var subtitleAdded = AddSubtitleElement(writer, subtitle); if (subtitleAdded && _profile.EnableSingleSubtitleLimit) @@ -250,7 +262,8 @@ namespace Emby.Dlna.Didl private bool AddSubtitleElement(XmlWriter writer, SubtitleStreamInfo info) { var subtitleProfile = _profile.SubtitleProfiles - .FirstOrDefault(i => string.Equals(info.Format, i.Format, StringComparison.OrdinalIgnoreCase) && i.Method == SubtitleDeliveryMethod.External); + .FirstOrDefault(i => string.Equals(info.Format, i.Format, StringComparison.OrdinalIgnoreCase) + && i.Method == SubtitleDeliveryMethod.External); if (subtitleProfile == null) { @@ -265,7 +278,7 @@ namespace Emby.Dlna.Didl // <sec:CaptionInfo sec:type="srt">http://192.168.1.3:9999/video.srt</sec:CaptionInfo> writer.WriteStartElement("sec", "CaptionInfoEx", null); - writer.WriteAttributeString("sec", "type", null, info.Format.ToLower()); + writer.WriteAttributeString("sec", "type", null, info.Format.ToLowerInvariant()); writer.WriteString(info.Url); writer.WriteFullEndElement(); @@ -282,7 +295,7 @@ namespace Emby.Dlna.Didl else { writer.WriteStartElement(string.Empty, "res", NS_DIDL); - var protocolInfo = string.Format("http-get:*:text/{0}:*", info.Format.ToLower()); + var protocolInfo = string.Format("http-get:*:text/{0}:*", info.Format.ToLowerInvariant()); writer.WriteAttributeString("protocolInfo", protocolInfo); writer.WriteString(info.Url); @@ -387,91 +400,39 @@ namespace Emby.Dlna.Didl private string GetDisplayName(BaseItem item, StubType? itemStubType, BaseItem context) { - if (itemStubType.HasValue && itemStubType.Value == StubType.Latest) - { - return _localization.GetLocalizedString("Latest"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Playlists) + if (itemStubType.HasValue) { - return _localization.GetLocalizedString("Playlists"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.AlbumArtists) - { - return _localization.GetLocalizedString("HeaderAlbumArtists"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Albums) - { - return _localization.GetLocalizedString("Albums"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Artists) - { - return _localization.GetLocalizedString("Artists"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Songs) - { - return _localization.GetLocalizedString("Songs"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Genres) - { - return _localization.GetLocalizedString("Genres"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteAlbums) - { - return _localization.GetLocalizedString("HeaderFavoriteAlbums"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteArtists) - { - return _localization.GetLocalizedString("HeaderFavoriteArtists"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSongs) - { - return _localization.GetLocalizedString("HeaderFavoriteSongs"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.ContinueWatching) - { - return _localization.GetLocalizedString("HeaderContinueWatching"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Movies) - { - return _localization.GetLocalizedString("Movies"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Collections) - { - return _localization.GetLocalizedString("Collections"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Favorites) - { - return _localization.GetLocalizedString("Favorites"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.NextUp) - { - return _localization.GetLocalizedString("HeaderNextUp"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSeries) - { - return _localization.GetLocalizedString("HeaderFavoriteShows"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteEpisodes) - { - return _localization.GetLocalizedString("HeaderFavoriteEpisodes"); - } - if (itemStubType.HasValue && itemStubType.Value == StubType.Series) - { - return _localization.GetLocalizedString("Shows"); + switch (itemStubType.Value) + { + case StubType.Latest: return _localization.GetLocalizedString("Latest"); + case StubType.Playlists: return _localization.GetLocalizedString("Playlists"); + case StubType.AlbumArtists: return _localization.GetLocalizedString("HeaderAlbumArtists"); + case StubType.Albums: return _localization.GetLocalizedString("Albums"); + case StubType.Artists: return _localization.GetLocalizedString("Artists"); + case StubType.Songs: return _localization.GetLocalizedString("Songs"); + case StubType.Genres: return _localization.GetLocalizedString("Genres"); + case StubType.FavoriteAlbums: return _localization.GetLocalizedString("HeaderFavoriteAlbums"); + case StubType.FavoriteArtists: return _localization.GetLocalizedString("HeaderFavoriteArtists"); + case StubType.FavoriteSongs: return _localization.GetLocalizedString("HeaderFavoriteSongs"); + case StubType.ContinueWatching: return _localization.GetLocalizedString("HeaderContinueWatching"); + case StubType.Movies: return _localization.GetLocalizedString("Movies"); + case StubType.Collections: return _localization.GetLocalizedString("Collections"); + case StubType.Favorites: return _localization.GetLocalizedString("Favorites"); + case StubType.NextUp: return _localization.GetLocalizedString("HeaderNextUp"); + case StubType.FavoriteSeries: return _localization.GetLocalizedString("HeaderFavoriteShows"); + case StubType.FavoriteEpisodes: return _localization.GetLocalizedString("HeaderFavoriteEpisodes"); + case StubType.Series: return _localization.GetLocalizedString("Shows"); + default: break; + } } - var episode = item as Episode; - var season = context as Season; - - if (episode != null && season != null) + if (item is Episode episode && context is Season season) { // This is a special embedded within a season - if (item.ParentIndexNumber.HasValue && item.ParentIndexNumber.Value == 0) + if (item.ParentIndexNumber.HasValue && item.ParentIndexNumber.Value == 0 + && season.IndexNumber.HasValue && season.IndexNumber.Value != 0) { - if (season.IndexNumber.HasValue && season.IndexNumber.Value != 0) - { - return string.Format(_localization.GetLocalizedString("ValueSpecialEpisodeName"), item.Name); - } + return string.Format(_localization.GetLocalizedString("ValueSpecialEpisodeName"), item.Name); } if (item.IndexNumber.HasValue) @@ -585,10 +546,8 @@ namespace Emby.Dlna.Didl public static bool IsIdRoot(string id) { - if (string.IsNullOrWhiteSpace(id) || - - string.Equals(id, "0", StringComparison.OrdinalIgnoreCase) - + if (string.IsNullOrWhiteSpace(id) + || string.Equals(id, "0", StringComparison.OrdinalIgnoreCase) // Samsung sometimes uses 1 as root || string.Equals(id, "1", StringComparison.OrdinalIgnoreCase)) { @@ -808,7 +767,7 @@ namespace Emby.Dlna.Didl { writer.WriteString(_profile.RequiresPlainFolders ? "object.container.storageFolder" : "object.container.genre.musicGenre"); } - else if (item is Genre || item is GameGenre) + else if (item is Genre) { writer.WriteString(_profile.RequiresPlainFolders ? "object.container.storageFolder" : "object.container.genre"); } @@ -844,7 +803,7 @@ namespace Emby.Dlna.Didl // var type = types.FirstOrDefault(i => string.Equals(i, actor.Type, StringComparison.OrdinalIgnoreCase) || string.Equals(i, actor.Role, StringComparison.OrdinalIgnoreCase)) // ?? PersonType.Actor; - // AddValue(writer, "upnp", type.ToLower(), actor.Name, NS_UPNP); + // AddValue(writer, "upnp", type.ToLowerInvariant(), actor.Name, NS_UPNP); // index++; @@ -1112,7 +1071,7 @@ namespace Emby.Dlna.Didl }; } - class ImageDownloadInfo + private class ImageDownloadInfo { internal Guid ItemId; internal string ImageTag; @@ -1128,7 +1087,7 @@ namespace Emby.Dlna.Didl internal ItemImageInfo ItemImageInfo; } - class ImageUrlInfo + private class ImageUrlInfo { internal string Url; @@ -1147,7 +1106,7 @@ namespace Emby.Dlna.Didl if (stubType.HasValue) { - id = stubType.Value.ToString().ToLower() + "_" + id; + id = stubType.Value.ToString().ToLowerInvariant() + "_" + id; } return id; diff --git a/Emby.Dlna/DlnaManager.cs b/Emby.Dlna/DlnaManager.cs index fd7b408fd..c507b14e9 100644 --- a/Emby.Dlna/DlnaManager.cs +++ b/Emby.Dlna/DlnaManager.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Emby.Dlna.Profiles; using Emby.Dlna.Server; using MediaBrowser.Common.Configuration; @@ -48,11 +49,11 @@ namespace Emby.Dlna _assemblyInfo = assemblyInfo; } - public void InitProfiles() + public async Task InitProfilesAsync() { try { - ExtractSystemProfiles(); + await ExtractSystemProfilesAsync(); LoadProfiles(); } catch (Exception ex) @@ -300,7 +301,7 @@ namespace Emby.Dlna profile = ReserializeProfile(tempProfile); - profile.Id = path.ToLower().GetMD5().ToString("N"); + profile.Id = path.ToLowerInvariant().GetMD5().ToString("N"); _profiles[path] = new Tuple<InternalProfileInfo, DeviceProfile>(GetInternalProfileInfo(_fileSystem.GetFileInfo(path), type), profile); @@ -352,14 +353,14 @@ namespace Emby.Dlna Info = new DeviceProfileInfo { - Id = file.FullName.ToLower().GetMD5().ToString("N"), + Id = file.FullName.ToLowerInvariant().GetMD5().ToString("N"), Name = _fileSystem.GetFileNameWithoutExtension(file), Type = type } }; } - private void ExtractSystemProfiles() + private async Task ExtractSystemProfilesAsync() { var namespaceName = GetType().Namespace + ".Profiles.Xml."; @@ -383,7 +384,7 @@ namespace Emby.Dlna using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read)) { - stream.CopyTo(fileStream); + await stream.CopyToAsync(fileStream); } } } @@ -506,7 +507,7 @@ namespace Emby.Dlna ? ImageFormat.Png : ImageFormat.Jpg; - var resource = GetType().Namespace + ".Images." + filename.ToLower(); + var resource = GetType().Namespace + ".Images." + filename.ToLowerInvariant(); return new ImageStream { diff --git a/Emby.Dlna/Main/DlnaEntryPoint.cs b/Emby.Dlna/Main/DlnaEntryPoint.cs index 1ab6014eb..a20006578 100644 --- a/Emby.Dlna/Main/DlnaEntryPoint.cs +++ b/Emby.Dlna/Main/DlnaEntryPoint.cs @@ -20,7 +20,6 @@ using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Net; using MediaBrowser.Model.System; -using MediaBrowser.Model.Threading; using MediaBrowser.Model.Xml; using Microsoft.Extensions.Logging; using Rssdp; @@ -49,8 +48,7 @@ namespace Emby.Dlna.Main private readonly IDeviceDiscovery _deviceDiscovery; private SsdpDevicePublisher _Publisher; - - private readonly ITimerFactory _timerFactory; + private readonly ISocketFactory _socketFactory; private readonly IEnvironmentInfo _environmentInfo; private readonly INetworkManager _networkManager; @@ -78,7 +76,6 @@ namespace Emby.Dlna.Main IDeviceDiscovery deviceDiscovery, IMediaEncoder mediaEncoder, ISocketFactory socketFactory, - ITimerFactory timerFactory, IEnvironmentInfo environmentInfo, INetworkManager networkManager, IUserViewManager userViewManager, @@ -99,7 +96,6 @@ namespace Emby.Dlna.Main _deviceDiscovery = deviceDiscovery; _mediaEncoder = mediaEncoder; _socketFactory = socketFactory; - _timerFactory = timerFactory; _environmentInfo = environmentInfo; _networkManager = networkManager; _logger = loggerFactory.CreateLogger("Dlna"); @@ -125,9 +121,9 @@ namespace Emby.Dlna.Main Current = this; } - public void Run() + public async Task RunAsync() { - ((DlnaManager)_dlnaManager).InitProfiles(); + await ((DlnaManager)_dlnaManager).InitProfilesAsync().ConfigureAwait(false); ReloadComponents(); @@ -233,7 +229,7 @@ namespace Emby.Dlna.Main try { - _Publisher = new SsdpDevicePublisher(_communicationsServer, _timerFactory, _environmentInfo.OperatingSystemName, _environmentInfo.OperatingSystemVersion); + _Publisher = new SsdpDevicePublisher(_communicationsServer, _environmentInfo.OperatingSystemName, _environmentInfo.OperatingSystemVersion); _Publisher.LogFunction = LogMessage; _Publisher.SupportPnpRootDevice = false; @@ -263,7 +259,7 @@ namespace Emby.Dlna.Main var fullService = "urn:schemas-upnp-org:device:MediaServer:1"; - _logger.LogInformation("Registering publisher for {0} on {1}", fullService, address.ToString()); + _logger.LogInformation("Registering publisher for {0} on {1}", fullService, address); var descriptorUri = "/dlna/" + udn + "/description.xml"; var uri = new Uri(_appHost.GetLocalApiUrl(address) + descriptorUri); @@ -353,8 +349,7 @@ namespace Emby.Dlna.Main _userDataManager, _localization, _mediaSourceManager, - _mediaEncoder, - _timerFactory); + _mediaEncoder); _manager.Start(); } diff --git a/Emby.Dlna/PlayTo/Device.cs b/Emby.Dlna/PlayTo/Device.cs index 68aa0a6a7..037cdd8aa 100644 --- a/Emby.Dlna/PlayTo/Device.cs +++ b/Emby.Dlna/PlayTo/Device.cs @@ -10,7 +10,6 @@ using Emby.Dlna.Server; using Emby.Dlna.Ssdp; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; -using MediaBrowser.Model.Threading; using Microsoft.Extensions.Logging; namespace Emby.Dlna.PlayTo @@ -19,7 +18,7 @@ namespace Emby.Dlna.PlayTo { #region Fields & Properties - private ITimer _timer; + private Timer _timer; public DeviceInfo Properties { get; set; } @@ -40,12 +39,7 @@ namespace Emby.Dlna.PlayTo public TimeSpan? Duration { get; set; } - private TimeSpan _position = TimeSpan.FromSeconds(0); - public TimeSpan Position - { - get => _position; - set => _position = value; - } + public TimeSpan Position { get; set; } = TimeSpan.FromSeconds(0); public TRANSPORTSTATE TransportState { get; private set; } @@ -61,24 +55,20 @@ namespace Emby.Dlna.PlayTo private readonly ILogger _logger; private readonly IServerConfigurationManager _config; - public DateTime DateLastActivity { get; private set; } public Action OnDeviceUnavailable { get; set; } - private readonly ITimerFactory _timerFactory; - - public Device(DeviceInfo deviceProperties, IHttpClient httpClient, ILogger logger, IServerConfigurationManager config, ITimerFactory timerFactory) + public Device(DeviceInfo deviceProperties, IHttpClient httpClient, ILogger logger, IServerConfigurationManager config) { Properties = deviceProperties; _httpClient = httpClient; _logger = logger; _config = config; - _timerFactory = timerFactory; } public void Start() { _logger.LogDebug("Dlna Device.Start"); - _timer = _timerFactory.Create(TimerCallback, null, 1000, Timeout.Infinite); + _timer = new Timer(TimerCallback, null, 1000, Timeout.Infinite); } private DateTime _lastVolumeRefresh; @@ -119,7 +109,9 @@ namespace Emby.Dlna.PlayTo lock (_timerLock) { if (_disposed) + { return; + } _volumeRefreshActive = true; @@ -136,7 +128,9 @@ namespace Emby.Dlna.PlayTo lock (_timerLock) { if (_disposed) + { return; + } _volumeRefreshActive = false; @@ -144,11 +138,6 @@ namespace Emby.Dlna.PlayTo } } - public void OnPlaybackStartedExternally() - { - RestartTimer(true); - } - #region Commanding public Task VolumeDown(CancellationToken cancellationToken) @@ -333,7 +322,9 @@ namespace Emby.Dlna.PlayTo private string CreateDidlMeta(string value) { if (string.IsNullOrEmpty(value)) + { return string.Empty; + } return DescriptionXmlBuilder.Escape(value); } @@ -342,10 +333,11 @@ namespace Emby.Dlna.PlayTo { var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Play"); if (command == null) + { return Task.CompletedTask; + } var service = GetAvTransportService(); - if (service == null) { throw new InvalidOperationException("Unable to find service"); @@ -369,7 +361,9 @@ namespace Emby.Dlna.PlayTo var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Stop"); if (command == null) + { return; + } var service = GetAvTransportService(); @@ -385,7 +379,9 @@ namespace Emby.Dlna.PlayTo var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Pause"); if (command == null) + { return; + } var service = GetAvTransportService(); @@ -405,7 +401,9 @@ namespace Emby.Dlna.PlayTo private async void TimerCallback(object sender) { if (_disposed) + { return; + } try { @@ -425,8 +423,6 @@ namespace Emby.Dlna.PlayTo return; } - DateLastActivity = DateTime.UtcNow; - if (transportState.HasValue) { // If we're not playing anything no need to get additional data @@ -505,7 +501,9 @@ namespace Emby.Dlna.PlayTo var command = rendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetVolume"); if (command == null) + { return; + } var service = GetServiceRenderingControl(); @@ -518,13 +516,17 @@ namespace Emby.Dlna.PlayTo .ConfigureAwait(false); if (result == null || result.Document == null) + { return; + } var volume = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetVolumeResponse").Select(i => i.Element("CurrentVolume")).FirstOrDefault(i => i != null); - var volumeValue = volume == null ? null : volume.Value; + var volumeValue = volume?.Value; if (string.IsNullOrWhiteSpace(volumeValue)) + { return; + } Volume = int.Parse(volumeValue, UsCulture); @@ -545,7 +547,9 @@ namespace Emby.Dlna.PlayTo var command = rendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMute"); if (command == null) + { return; + } var service = GetServiceRenderingControl(); @@ -560,39 +564,44 @@ namespace Emby.Dlna.PlayTo if (result == null || result.Document == null) return; - var valueNode = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetMuteResponse").Select(i => i.Element("CurrentMute")).FirstOrDefault(i => i != null); - var value = valueNode == null ? null : valueNode.Value; + var valueNode = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetMuteResponse") + .Select(i => i.Element("CurrentMute")) + .FirstOrDefault(i => i != null); - IsMuted = string.Equals(value, "1", StringComparison.OrdinalIgnoreCase); + IsMuted = string.Equals(valueNode?.Value, "1", StringComparison.OrdinalIgnoreCase); } private async Task<TRANSPORTSTATE?> GetTransportInfo(TransportCommands avCommands, CancellationToken cancellationToken) { var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetTransportInfo"); if (command == null) + { return null; + } var service = GetAvTransportService(); if (service == null) + { return null; + } var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, avCommands.BuildPost(command, service.ServiceType), false) .ConfigureAwait(false); if (result == null || result.Document == null) + { return null; + } var transportState = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetTransportInfoResponse").Select(i => i.Element("CurrentTransportState")).FirstOrDefault(i => i != null); var transportStateValue = transportState == null ? null : transportState.Value; - if (transportStateValue != null) + if (transportStateValue != null + && Enum.TryParse(transportStateValue, true, out TRANSPORTSTATE state)) { - if (Enum.TryParse(transportStateValue, true, out TRANSPORTSTATE state)) - { - return state; - } + return state; } return null; @@ -602,10 +611,11 @@ namespace Emby.Dlna.PlayTo { var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMediaInfo"); if (command == null) + { return null; + } var service = GetAvTransportService(); - if (service == null) { throw new InvalidOperationException("Unable to find service"); @@ -617,7 +627,9 @@ namespace Emby.Dlna.PlayTo .ConfigureAwait(false); if (result == null || result.Document == null) + { return null; + } var track = result.Document.Descendants("CurrentURIMetaData").FirstOrDefault(); @@ -657,11 +669,13 @@ namespace Emby.Dlna.PlayTo return null; } - private async Task<Tuple<bool, uBaseObject>> GetPositionInfo(TransportCommands avCommands, CancellationToken cancellationToken) + private async Task<(bool, uBaseObject)> GetPositionInfo(TransportCommands avCommands, CancellationToken cancellationToken) { var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetPositionInfo"); if (command == null) - return new Tuple<bool, uBaseObject>(false, null); + { + return (false, null); + } var service = GetAvTransportService(); @@ -676,7 +690,9 @@ namespace Emby.Dlna.PlayTo .ConfigureAwait(false); if (result == null || result.Document == null) - return new Tuple<bool, uBaseObject>(false, null); + { + return (false, null); + } var trackUriElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackURI")).FirstOrDefault(i => i != null); var trackUri = trackUriElem == null ? null : trackUriElem.Value; @@ -684,8 +700,8 @@ namespace Emby.Dlna.PlayTo var durationElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackDuration")).FirstOrDefault(i => i != null); var duration = durationElem == null ? null : durationElem.Value; - if (!string.IsNullOrWhiteSpace(duration) && - !string.Equals(duration, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrWhiteSpace(duration) + && !string.Equals(duration, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase)) { Duration = TimeSpan.Parse(duration, UsCulture); } @@ -707,14 +723,14 @@ namespace Emby.Dlna.PlayTo if (track == null) { //If track is null, some vendors do this, use GetMediaInfo instead - return new Tuple<bool, uBaseObject>(true, null); + return (true, null); } var trackString = (string)track; if (string.IsNullOrWhiteSpace(trackString) || string.Equals(trackString, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase)) { - return new Tuple<bool, uBaseObject>(true, null); + return (true, null); } XElement uPnpResponse; @@ -735,7 +751,7 @@ namespace Emby.Dlna.PlayTo catch (Exception ex) { _logger.LogError(ex, "Unable to parse xml {0}", trackString); - return new Tuple<bool, uBaseObject>(true, null); + return (true, null); } } @@ -743,7 +759,7 @@ namespace Emby.Dlna.PlayTo var uTrack = CreateUBaseObject(e, trackUri); - return new Tuple<bool, uBaseObject>(true, uTrack); + return (true, uTrack); } private static uBaseObject CreateUBaseObject(XElement container, string trackUri) @@ -801,11 +817,9 @@ namespace Emby.Dlna.PlayTo private async Task<TransportCommands> GetAVProtocolAsync(CancellationToken cancellationToken) { - var avCommands = AvCommands; - - if (avCommands != null) + if (AvCommands != null) { - return avCommands; + return AvCommands; } if (_disposed) @@ -825,18 +839,15 @@ namespace Emby.Dlna.PlayTo var document = await httpClient.GetDataAsync(url, cancellationToken).ConfigureAwait(false); - avCommands = TransportCommands.Create(document); - AvCommands = avCommands; - return avCommands; + AvCommands = TransportCommands.Create(document); + return AvCommands; } private async Task<TransportCommands> GetRenderingProtocolAsync(CancellationToken cancellationToken) { - var rendererCommands = RendererCommands; - - if (rendererCommands != null) + if (RendererCommands != null) { - return rendererCommands; + return RendererCommands; } if (_disposed) @@ -845,7 +856,6 @@ namespace Emby.Dlna.PlayTo } var avService = GetServiceRenderingControl(); - if (avService == null) { throw new ArgumentException("Device AvService is null"); @@ -857,9 +867,8 @@ namespace Emby.Dlna.PlayTo _logger.LogDebug("Dlna Device.GetRenderingProtocolAsync"); var document = await httpClient.GetDataAsync(url, cancellationToken).ConfigureAwait(false); - rendererCommands = TransportCommands.Create(document); - RendererCommands = rendererCommands; - return rendererCommands; + RendererCommands = TransportCommands.Create(document); + return RendererCommands; } private string NormalizeUrl(string baseUrl, string url) @@ -871,85 +880,103 @@ namespace Emby.Dlna.PlayTo } if (!url.Contains("/")) + { url = "/dmr/" + url; + } + if (!url.StartsWith("/")) + { url = "/" + url; + } return baseUrl + url; } - private TransportCommands AvCommands - { - get; - set; - } + private TransportCommands AvCommands { get; set; } - private TransportCommands RendererCommands - { - get; - set; - } + private TransportCommands RendererCommands { get; set; } - public static async Task<Device> CreateuPnpDeviceAsync(Uri url, IHttpClient httpClient, IServerConfigurationManager config, ILogger logger, ITimerFactory timerFactory, CancellationToken cancellationToken) + public static async Task<Device> CreateuPnpDeviceAsync(Uri url, IHttpClient httpClient, IServerConfigurationManager config, ILogger logger, CancellationToken cancellationToken) { var ssdpHttpClient = new SsdpHttpClient(httpClient, config); var document = await ssdpHttpClient.GetDataAsync(url.ToString(), cancellationToken).ConfigureAwait(false); - var deviceProperties = new DeviceInfo(); - var friendlyNames = new List<string>(); var name = document.Descendants(uPnpNamespaces.ud.GetName("friendlyName")).FirstOrDefault(); if (name != null && !string.IsNullOrWhiteSpace(name.Value)) + { friendlyNames.Add(name.Value); + } var room = document.Descendants(uPnpNamespaces.ud.GetName("roomName")).FirstOrDefault(); if (room != null && !string.IsNullOrWhiteSpace(room.Value)) + { friendlyNames.Add(room.Value); + } - deviceProperties.Name = string.Join(" ", friendlyNames.ToArray()); + var deviceProperties = new DeviceInfo() + { + Name = string.Join(" ", friendlyNames), + BaseUrl = string.Format("http://{0}:{1}", url.Host, url.Port) + }; var model = document.Descendants(uPnpNamespaces.ud.GetName("modelName")).FirstOrDefault(); if (model != null) + { deviceProperties.ModelName = model.Value; + } var modelNumber = document.Descendants(uPnpNamespaces.ud.GetName("modelNumber")).FirstOrDefault(); if (modelNumber != null) + { deviceProperties.ModelNumber = modelNumber.Value; + } var uuid = document.Descendants(uPnpNamespaces.ud.GetName("UDN")).FirstOrDefault(); if (uuid != null) + { deviceProperties.UUID = uuid.Value; + } var manufacturer = document.Descendants(uPnpNamespaces.ud.GetName("manufacturer")).FirstOrDefault(); if (manufacturer != null) + { deviceProperties.Manufacturer = manufacturer.Value; + } var manufacturerUrl = document.Descendants(uPnpNamespaces.ud.GetName("manufacturerURL")).FirstOrDefault(); if (manufacturerUrl != null) + { deviceProperties.ManufacturerUrl = manufacturerUrl.Value; + } var presentationUrl = document.Descendants(uPnpNamespaces.ud.GetName("presentationURL")).FirstOrDefault(); if (presentationUrl != null) + { deviceProperties.PresentationUrl = presentationUrl.Value; + } var modelUrl = document.Descendants(uPnpNamespaces.ud.GetName("modelURL")).FirstOrDefault(); if (modelUrl != null) + { deviceProperties.ModelUrl = modelUrl.Value; + } var serialNumber = document.Descendants(uPnpNamespaces.ud.GetName("serialNumber")).FirstOrDefault(); if (serialNumber != null) + { deviceProperties.SerialNumber = serialNumber.Value; + } var modelDescription = document.Descendants(uPnpNamespaces.ud.GetName("modelDescription")).FirstOrDefault(); if (modelDescription != null) + { deviceProperties.ModelDescription = modelDescription.Value; - - deviceProperties.BaseUrl = string.Format("http://{0}:{1}", url.Host, url.Port); + } var icon = document.Descendants(uPnpNamespaces.ud.GetName("icon")).FirstOrDefault(); - if (icon != null) { deviceProperties.Icon = CreateIcon(icon); @@ -958,12 +985,15 @@ namespace Emby.Dlna.PlayTo foreach (var services in document.Descendants(uPnpNamespaces.ud.GetName("serviceList"))) { if (services == null) + { continue; + } var servicesList = services.Descendants(uPnpNamespaces.ud.GetName("service")); - if (servicesList == null) + { continue; + } foreach (var element in servicesList) { @@ -976,9 +1006,7 @@ namespace Emby.Dlna.PlayTo } } - var device = new Device(deviceProperties, httpClient, logger, config, timerFactory); - - return device; + return new Device(deviceProperties, httpClient, logger, config); } #endregion @@ -1065,13 +1093,10 @@ namespace Emby.Dlna.PlayTo private void OnPlaybackStart(uBaseObject mediaInfo) { - if (PlaybackStart != null) + PlaybackStart?.Invoke(this, new PlaybackStartEventArgs { - PlaybackStart.Invoke(this, new PlaybackStartEventArgs - { - MediaInfo = mediaInfo - }); - } + MediaInfo = mediaInfo + }); } private void OnPlaybackProgress(uBaseObject mediaInfo) @@ -1082,58 +1107,56 @@ namespace Emby.Dlna.PlayTo return; } - if (PlaybackProgress != null) + PlaybackProgress?.Invoke(this, new PlaybackProgressEventArgs { - PlaybackProgress.Invoke(this, new PlaybackProgressEventArgs - { - MediaInfo = mediaInfo - }); - } + MediaInfo = mediaInfo + }); } private void OnPlaybackStop(uBaseObject mediaInfo) { - if (PlaybackStopped != null) + + PlaybackStopped?.Invoke(this, new PlaybackStoppedEventArgs { - PlaybackStopped.Invoke(this, new PlaybackStoppedEventArgs - { - MediaInfo = mediaInfo - }); - } + MediaInfo = mediaInfo + }); } private void OnMediaChanged(uBaseObject old, uBaseObject newMedia) { - if (MediaChanged != null) + MediaChanged?.Invoke(this, new MediaChangedEventArgs { - MediaChanged.Invoke(this, new MediaChangedEventArgs - { - OldMediaInfo = old, - NewMediaInfo = newMedia - }); - } + OldMediaInfo = old, + NewMediaInfo = newMedia + }); } #region IDisposable bool _disposed; + public void Dispose() { - if (!_disposed) - { - _disposed = true; - - DisposeTimer(); - } + Dispose(true); + GC.SuppressFinalize(this); } - private void DisposeTimer() + protected virtual void Dispose(bool disposing) { - if (_timer != null) + if (_disposed) { - _timer.Dispose(); - _timer = null; + return; } + + if (disposing) + { + _timer?.Dispose(); + } + + _timer = null; + Properties = null; + + _disposed = true; } #endregion diff --git a/Emby.Dlna/PlayTo/PlayToController.cs b/Emby.Dlna/PlayTo/PlayToController.cs index 409b8442c..be86dde16 100644 --- a/Emby.Dlna/PlayTo/PlayToController.cs +++ b/Emby.Dlna/PlayTo/PlayToController.cs @@ -42,30 +42,43 @@ namespace Emby.Dlna.PlayTo private readonly IDeviceDiscovery _deviceDiscovery; private readonly string _serverAddress; private readonly string _accessToken; - private readonly DateTime _creationTime; public bool IsSessionActive => !_disposed && _device != null; public bool SupportsMediaControl => IsSessionActive; - public PlayToController(SessionInfo session, ISessionManager sessionManager, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IImageProcessor imageProcessor, string serverAddress, string accessToken, IDeviceDiscovery deviceDiscovery, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, IConfigurationManager config, IMediaEncoder mediaEncoder) + public PlayToController( + SessionInfo session, + ISessionManager sessionManager, + ILibraryManager libraryManager, + ILogger logger, + IDlnaManager dlnaManager, + IUserManager userManager, + IImageProcessor imageProcessor, + string serverAddress, + string accessToken, + IDeviceDiscovery deviceDiscovery, + IUserDataManager userDataManager, + ILocalizationManager localization, + IMediaSourceManager mediaSourceManager, + IConfigurationManager config, + IMediaEncoder mediaEncoder) { _session = session; _sessionManager = sessionManager; _libraryManager = libraryManager; + _logger = logger; _dlnaManager = dlnaManager; _userManager = userManager; _imageProcessor = imageProcessor; _serverAddress = serverAddress; + _accessToken = accessToken; _deviceDiscovery = deviceDiscovery; _userDataManager = userDataManager; _localization = localization; _mediaSourceManager = mediaSourceManager; _config = config; _mediaEncoder = mediaEncoder; - _accessToken = accessToken; - _logger = logger; - _creationTime = DateTime.UtcNow; } public void Init(Device device) @@ -374,9 +387,7 @@ namespace Emby.Dlna.PlayTo return _device.IsPaused ? _device.SetPlay(CancellationToken.None) : _device.SetPause(CancellationToken.None); case PlaystateCommand.Seek: - { - return Seek(command.SeekPositionTicks ?? 0); - } + return Seek(command.SeekPositionTicks ?? 0); case PlaystateCommand.NextTrack: return SetPlaylistIndex(_currentPlaylistIndex + 1); @@ -442,8 +453,7 @@ namespace Emby.Dlna.PlayTo var profile = _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification()) ?? _dlnaManager.GetDefaultProfile(); - var hasMediaSources = item as IHasMediaSources; - var mediaSources = hasMediaSources != null + var mediaSources = item is IHasMediaSources ? (_mediaSourceManager.GetStaticMediaSources(item, true, user)) : new List<MediaSourceInfo>(); @@ -452,7 +462,7 @@ namespace Emby.Dlna.PlayTo playlistItem.StreamUrl = DidlBuilder.NormalizeDlnaMediaUrl(playlistItem.StreamInfo.ToUrl(_serverAddress, _accessToken)); - var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization, _mediaSourceManager, _logger, _libraryManager, _mediaEncoder) + var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization, _mediaSourceManager, _logger, _mediaEncoder) .GetItemDidl(_config.GetDlnaConfiguration(), item, user, null, _session.DeviceId, new Filter(), playlistItem.StreamInfo); playlistItem.Didl = itemXml; diff --git a/Emby.Dlna/PlayTo/PlayToManager.cs b/Emby.Dlna/PlayTo/PlayToManager.cs index 790625705..6cce312ee 100644 --- a/Emby.Dlna/PlayTo/PlayToManager.cs +++ b/Emby.Dlna/PlayTo/PlayToManager.cs @@ -16,7 +16,6 @@ using MediaBrowser.Model.Events; using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Net; using MediaBrowser.Model.Session; -using MediaBrowser.Model.Threading; using Microsoft.Extensions.Logging; namespace Emby.Dlna.PlayTo @@ -39,13 +38,12 @@ namespace Emby.Dlna.PlayTo private readonly IDeviceDiscovery _deviceDiscovery; private readonly IMediaSourceManager _mediaSourceManager; private readonly IMediaEncoder _mediaEncoder; - private readonly ITimerFactory _timerFactory; private bool _disposed; private SemaphoreSlim _sessionLock = new SemaphoreSlim(1, 1); private CancellationTokenSource _disposeCancellationTokenSource = new CancellationTokenSource(); - public PlayToManager(ILogger logger, ISessionManager sessionManager, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, IDeviceDiscovery deviceDiscovery, IHttpClient httpClient, IServerConfigurationManager config, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, IMediaEncoder mediaEncoder, ITimerFactory timerFactory) + public PlayToManager(ILogger logger, ISessionManager sessionManager, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, IDeviceDiscovery deviceDiscovery, IHttpClient httpClient, IServerConfigurationManager config, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, IMediaEncoder mediaEncoder) { _logger = logger; _sessionManager = sessionManager; @@ -61,7 +59,6 @@ namespace Emby.Dlna.PlayTo _localization = localization; _mediaSourceManager = mediaSourceManager; _mediaEncoder = mediaEncoder; - _timerFactory = timerFactory; } public void Start() @@ -168,7 +165,7 @@ namespace Emby.Dlna.PlayTo if (controller == null) { - var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger, _timerFactory, cancellationToken).ConfigureAwait(false); + var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger, cancellationToken).ConfigureAwait(false); string deviceName = device.Properties.Name; diff --git a/Emby.Dlna/Server/DescriptionXmlBuilder.cs b/Emby.Dlna/Server/DescriptionXmlBuilder.cs index e0ecbee43..03d8f80ab 100644 --- a/Emby.Dlna/Server/DescriptionXmlBuilder.cs +++ b/Emby.Dlna/Server/DescriptionXmlBuilder.cs @@ -107,19 +107,19 @@ namespace Emby.Dlna.Server '&' }; - private static readonly string[] s_escapeStringPairs = new string[] -{ - "<", - "<", - ">", - ">", - "\"", - """, - "'", - "'", - "&", - "&" -}; + private static readonly string[] s_escapeStringPairs = new[] + { + "<", + "<", + ">", + ">", + "\"", + """, + "'", + "'", + "&", + "&" + }; private static string GetEscapeSequence(char c) { @@ -133,7 +133,7 @@ namespace Emby.Dlna.Server return result; } } - return c.ToString(); + return c.ToString(CultureInfo.InvariantCulture); } /// <summary>Replaces invalid XML characters in a string with their valid XML equivalent.</summary> @@ -145,6 +145,7 @@ namespace Emby.Dlna.Server { return null; } + StringBuilder stringBuilder = null; int length = str.Length; int num = 0; @@ -230,9 +231,9 @@ namespace Emby.Dlna.Server var serverName = new string(characters); - var name = (_profile.FriendlyName ?? string.Empty).Replace("${HostName}", serverName, StringComparison.OrdinalIgnoreCase); + var name = _profile.FriendlyName?.Replace("${HostName}", serverName, StringComparison.OrdinalIgnoreCase); - return name; + return name ?? string.Empty; } private void AppendIconList(StringBuilder builder) @@ -295,65 +296,62 @@ namespace Emby.Dlna.Server } private IEnumerable<DeviceIcon> GetIcons() - { - var list = new List<DeviceIcon>(); - - list.Add(new DeviceIcon - { - MimeType = "image/png", - Depth = "24", - Width = 240, - Height = 240, - Url = "icons/logo240.png" - }); - - list.Add(new DeviceIcon - { - MimeType = "image/jpeg", - Depth = "24", - Width = 240, - Height = 240, - Url = "icons/logo240.jpg" - }); - - list.Add(new DeviceIcon - { - MimeType = "image/png", - Depth = "24", - Width = 120, - Height = 120, - Url = "icons/logo120.png" - }); - - list.Add(new DeviceIcon - { - MimeType = "image/jpeg", - Depth = "24", - Width = 120, - Height = 120, - Url = "icons/logo120.jpg" - }); - - list.Add(new DeviceIcon - { - MimeType = "image/png", - Depth = "24", - Width = 48, - Height = 48, - Url = "icons/logo48.png" - }); - - list.Add(new DeviceIcon + => new[] { - MimeType = "image/jpeg", - Depth = "24", - Width = 48, - Height = 48, - Url = "icons/logo48.jpg" - }); - - return list; - } + new DeviceIcon + { + MimeType = "image/png", + Depth = "24", + Width = 240, + Height = 240, + Url = "icons/logo240.png" + }, + + new DeviceIcon + { + MimeType = "image/jpeg", + Depth = "24", + Width = 240, + Height = 240, + Url = "icons/logo240.jpg" + }, + + new DeviceIcon + { + MimeType = "image/png", + Depth = "24", + Width = 120, + Height = 120, + Url = "icons/logo120.png" + }, + + new DeviceIcon + { + MimeType = "image/jpeg", + Depth = "24", + Width = 120, + Height = 120, + Url = "icons/logo120.jpg" + }, + + new DeviceIcon + { + MimeType = "image/png", + Depth = "24", + Width = 48, + Height = 48, + Url = "icons/logo48.png" + }, + + new DeviceIcon + { + MimeType = "image/jpeg", + Depth = "24", + Width = 48, + Height = 48, + Url = "icons/logo48.jpg" + } + }; private IEnumerable<DeviceService> GetServices() { diff --git a/Emby.Dlna/Ssdp/DeviceDiscovery.cs b/Emby.Dlna/Ssdp/DeviceDiscovery.cs index 89a88705f..298f68a28 100644 --- a/Emby.Dlna/Ssdp/DeviceDiscovery.cs +++ b/Emby.Dlna/Ssdp/DeviceDiscovery.cs @@ -5,7 +5,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Events; using MediaBrowser.Model.Net; -using MediaBrowser.Model.Threading; using Microsoft.Extensions.Logging; using Rssdp; using Rssdp.Infrastructure; @@ -48,20 +47,17 @@ namespace Emby.Dlna.Ssdp private SsdpDeviceLocator _deviceLocator; - private readonly ITimerFactory _timerFactory; private readonly ISocketFactory _socketFactory; private ISsdpCommunicationsServer _commsServer; public DeviceDiscovery( ILoggerFactory loggerFactory, IServerConfigurationManager config, - ISocketFactory socketFactory, - ITimerFactory timerFactory) + ISocketFactory socketFactory) { _logger = loggerFactory.CreateLogger(nameof(DeviceDiscovery)); _config = config; _socketFactory = socketFactory; - _timerFactory = timerFactory; } // Call this method from somewhere in your code to start the search. @@ -78,7 +74,7 @@ namespace Emby.Dlna.Ssdp { if (_listenerCount > 0 && _deviceLocator == null) { - _deviceLocator = new SsdpDeviceLocator(_commsServer, _timerFactory); + _deviceLocator = new SsdpDeviceLocator(_commsServer); // (Optional) Set the filter so we only see notifications for devices we care about // (can be any search target value i.e device type, uuid value etc - any value that appears in the |
