From 84d56976ba4494408c5e312a4f98a24efabca441 Mon Sep 17 00:00:00 2001
From: Bond_009 <bond.009@outlook.com>
Date: Tue, 5 Feb 2019 17:37:38 +0100
Subject: [PATCH 1/2] Some small changes in Device.cs and DidlBuilder.cs

Device.cs:
* Improve dispose function
* Style fixes
* Remove unused field

DidlBuilder.cs:
* Remove unused field
* Replace giant if chain with a switch statement
---
 Emby.Dlna/ContentDirectory/ControlHandler.cs |   2 +-
 Emby.Dlna/Didl/DidlBuilder.cs                | 149 ++++++----------
 Emby.Dlna/PlayTo/Device.cs                   | 173 ++++++++++---------
 Emby.Dlna/PlayTo/PlayToController.cs         |  34 ++--
 4 files changed, 170 insertions(+), 188 deletions(-)

diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs
index bed4d885c2..1150afdbab 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)
diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs
index f6d923a1f1..605f4f37b2 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)
             {
@@ -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))
             {
@@ -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;
 
diff --git a/Emby.Dlna/PlayTo/Device.cs b/Emby.Dlna/PlayTo/Device.cs
index e49168d34b..3663ba41a8 100644
--- a/Emby.Dlna/PlayTo/Device.cs
+++ b/Emby.Dlna/PlayTo/Device.cs
@@ -39,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; }
 
@@ -60,7 +55,6 @@ namespace Emby.Dlna.PlayTo
         private readonly ILogger _logger;
         private readonly IServerConfigurationManager _config;
 
-        public DateTime DateLastActivity { get; private set; }
         public Action OnDeviceUnavailable { get; set; }
 
         public Device(DeviceInfo deviceProperties, IHttpClient httpClient, ILogger logger, IServerConfigurationManager config)
@@ -115,7 +109,9 @@ namespace Emby.Dlna.PlayTo
             lock (_timerLock)
             {
                 if (_disposed)
+                {
                     return;
+                }
 
                 _volumeRefreshActive = true;
 
@@ -132,7 +128,9 @@ namespace Emby.Dlna.PlayTo
             lock (_timerLock)
             {
                 if (_disposed)
+                {
                     return;
+                }
 
                 _volumeRefreshActive = false;
 
@@ -140,11 +138,6 @@ namespace Emby.Dlna.PlayTo
             }
         }
 
-        public void OnPlaybackStartedExternally()
-        {
-            RestartTimer(true);
-        }
-
         #region Commanding
 
         public Task VolumeDown(CancellationToken cancellationToken)
@@ -165,7 +158,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (IsMuted)
             {
-                return Unmute(cancellationToken);
+                return UnMute(cancellationToken);
             }
 
             return Mute(cancellationToken);
@@ -181,7 +174,7 @@ namespace Emby.Dlna.PlayTo
             }
         }
 
-        public async Task Unmute(CancellationToken cancellationToken)
+        public async Task UnMute(CancellationToken cancellationToken)
         {
             var success = await SetMute(false, cancellationToken).ConfigureAwait(true);
 
@@ -329,7 +322,9 @@ namespace Emby.Dlna.PlayTo
         private string CreateDidlMeta(string value)
         {
             if (string.IsNullOrEmpty(value))
+            {
                 return string.Empty;
+            }
 
             return DescriptionXmlBuilder.Escape(value);
         }
@@ -338,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");
@@ -365,7 +361,9 @@ namespace Emby.Dlna.PlayTo
 
             var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Stop");
             if (command == null)
+            {
                 return;
+            }
 
             var service = GetAvTransportService();
 
@@ -381,7 +379,9 @@ namespace Emby.Dlna.PlayTo
 
             var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Pause");
             if (command == null)
+            {
                 return;
+            }
 
             var service = GetAvTransportService();
 
@@ -401,7 +401,9 @@ namespace Emby.Dlna.PlayTo
         private async void TimerCallback(object sender)
         {
             if (_disposed)
+            {
                 return;
+            }
 
             try
             {
@@ -421,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
@@ -501,7 +501,9 @@ namespace Emby.Dlna.PlayTo
 
             var command = rendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetVolume");
             if (command == null)
+            {
                 return;
+            }
 
             var service = GetServiceRenderingControl();
 
@@ -514,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);
 
@@ -541,7 +547,9 @@ namespace Emby.Dlna.PlayTo
 
             var command = rendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMute");
             if (command == null)
+            {
                 return;
+            }
 
             var service = GetServiceRenderingControl();
 
@@ -556,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;
@@ -598,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");
@@ -613,7 +627,9 @@ namespace Emby.Dlna.PlayTo
                 .ConfigureAwait(false);
 
             if (result == null || result.Document == null)
+            {
                 return null;
+            }
 
             var track = result.Document.Descendants("CurrentURIMetaData").FirstOrDefault();
 
@@ -653,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();
 
@@ -672,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;
@@ -680,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);
             }
@@ -703,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;
@@ -731,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);
                 }
             }
 
@@ -739,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)
@@ -797,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)
@@ -821,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)
@@ -841,7 +856,6 @@ namespace Emby.Dlna.PlayTo
             }
 
             var avService = GetServiceRenderingControl();
-
             if (avService == null)
             {
                 throw new ArgumentException("Device AvService is null");
@@ -853,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)
@@ -867,24 +880,21 @@ 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, CancellationToken cancellationToken)
         {
@@ -892,8 +902,6 @@ namespace Emby.Dlna.PlayTo
 
             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();
@@ -908,7 +916,11 @@ namespace Emby.Dlna.PlayTo
                 friendlyNames.Add(room.Value);
             }
 
-            deviceProperties.Name = string.Join(" ", friendlyNames);
+            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)
@@ -964,8 +976,6 @@ namespace Emby.Dlna.PlayTo
                 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)
             {
@@ -980,7 +990,6 @@ namespace Emby.Dlna.PlayTo
                 }
 
                 var servicesList = services.Descendants(uPnpNamespaces.ud.GetName("service"));
-
                 if (servicesList == null)
                 {
                     continue;
@@ -997,9 +1006,7 @@ namespace Emby.Dlna.PlayTo
                 }
             }
 
-            var device = new Device(deviceProperties, httpClient, logger, config);
-
-            return device;
+            return new Device(deviceProperties, httpClient, logger, config);
         }
 
         #endregion
@@ -1127,23 +1134,29 @@ namespace Emby.Dlna.PlayTo
         #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 409b8442cd..64c4889f14 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;
@@ -631,7 +641,7 @@ namespace Emby.Dlna.PlayTo
                     case GeneralCommandType.Mute:
                         return _device.Mute(cancellationToken);
                     case GeneralCommandType.Unmute:
-                        return _device.Unmute(cancellationToken);
+                        return _device.UnMute(cancellationToken);
                     case GeneralCommandType.ToggleMute:
                         return _device.ToggleMute(cancellationToken);
                     case GeneralCommandType.SetAudioStreamIndex:

From be89a5e71950dd1a82aa4538dfaf4215892beb26 Mon Sep 17 00:00:00 2001
From: Bond-009 <bond.009@outlook.com>
Date: Tue, 5 Feb 2019 18:16:10 +0100
Subject: [PATCH 2/2] Don't rename method

---
 Emby.Dlna/PlayTo/Device.cs           | 4 ++--
 Emby.Dlna/PlayTo/PlayToController.cs | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Emby.Dlna/PlayTo/Device.cs b/Emby.Dlna/PlayTo/Device.cs
index 3663ba41a8..037cdd8aa7 100644
--- a/Emby.Dlna/PlayTo/Device.cs
+++ b/Emby.Dlna/PlayTo/Device.cs
@@ -158,7 +158,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (IsMuted)
             {
-                return UnMute(cancellationToken);
+                return Unmute(cancellationToken);
             }
 
             return Mute(cancellationToken);
@@ -174,7 +174,7 @@ namespace Emby.Dlna.PlayTo
             }
         }
 
-        public async Task UnMute(CancellationToken cancellationToken)
+        public async Task Unmute(CancellationToken cancellationToken)
         {
             var success = await SetMute(false, cancellationToken).ConfigureAwait(true);
 
diff --git a/Emby.Dlna/PlayTo/PlayToController.cs b/Emby.Dlna/PlayTo/PlayToController.cs
index 64c4889f14..be86dde16a 100644
--- a/Emby.Dlna/PlayTo/PlayToController.cs
+++ b/Emby.Dlna/PlayTo/PlayToController.cs
@@ -641,7 +641,7 @@ namespace Emby.Dlna.PlayTo
                     case GeneralCommandType.Mute:
                         return _device.Mute(cancellationToken);
                     case GeneralCommandType.Unmute:
-                        return _device.UnMute(cancellationToken);
+                        return _device.Unmute(cancellationToken);
                     case GeneralCommandType.ToggleMute:
                         return _device.ToggleMute(cancellationToken);
                     case GeneralCommandType.SetAudioStreamIndex: