Răsfoiți Sursa

Merge pull request #2384 from Bond-009/warn16

Fix some warnings in Emby.Server.Implementations
dkanada 5 ani în urmă
părinte
comite
de40f22a46
33 a modificat fișierele cu 185 adăugiri și 130 ștergeri
  1. 16 18
      Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs
  2. 2 7
      Emby.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs
  3. 3 12
      Emby.Server.Implementations/EntryPoints/StartupWizard.cs
  4. 1 5
      Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
  5. 23 21
      Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
  6. 1 1
      Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs
  7. 15 12
      Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
  8. 2 0
      Emby.Server.Implementations/IO/ExtendedFileSystemInfo.cs
  9. 21 19
      Emby.Server.Implementations/IO/FileRefresher.cs
  10. 3 0
      Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
  11. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
  12. 3 0
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  13. 5 0
      Emby.Server.Implementations/LiveTv/EmbyTV/EntryPoint.cs
  14. 3 0
      Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs
  15. 3 0
      Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
  16. 13 5
      Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs
  17. 4 0
      Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
  18. 3 0
      Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
  19. 3 0
      Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
  20. 5 2
      Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs
  21. 3 0
      Emby.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs
  22. 3 0
      Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs
  23. 1 1
      Emby.Server.Implementations/LiveTv/LiveTvManager.cs
  24. 22 26
      Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs
  25. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs
  26. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
  27. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
  28. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs
  29. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
  30. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
  31. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
  32. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs
  33. 3 0
      MediaBrowser.Controller/Library/IMediaSourceProvider.cs

+ 16 - 18
Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs

@@ -13,7 +13,7 @@ using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.EntryPoints
 namespace Emby.Server.Implementations.EntryPoints
 {
 {
-    public class RecordingNotifier : IServerEntryPoint
+    public sealed class RecordingNotifier : IServerEntryPoint
     {
     {
         private readonly ILiveTvManager _liveTvManager;
         private readonly ILiveTvManager _liveTvManager;
         private readonly ISessionManager _sessionManager;
         private readonly ISessionManager _sessionManager;
@@ -28,32 +28,33 @@ namespace Emby.Server.Implementations.EntryPoints
             _liveTvManager = liveTvManager;
             _liveTvManager = liveTvManager;
         }
         }
 
 
+        /// <inheritdoc />
         public Task RunAsync()
         public Task RunAsync()
         {
         {
-            _liveTvManager.TimerCancelled += _liveTvManager_TimerCancelled;
-            _liveTvManager.SeriesTimerCancelled += _liveTvManager_SeriesTimerCancelled;
-            _liveTvManager.TimerCreated += _liveTvManager_TimerCreated;
-            _liveTvManager.SeriesTimerCreated += _liveTvManager_SeriesTimerCreated;
+            _liveTvManager.TimerCancelled += OnLiveTvManagerTimerCancelled;
+            _liveTvManager.SeriesTimerCancelled += OnLiveTvManagerSeriesTimerCancelled;
+            _liveTvManager.TimerCreated += OnLiveTvManagerTimerCreated;
+            _liveTvManager.SeriesTimerCreated += OnLiveTvManagerSeriesTimerCreated;
 
 
             return Task.CompletedTask;
             return Task.CompletedTask;
         }
         }
 
 
-        private void _liveTvManager_SeriesTimerCreated(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
+        private void OnLiveTvManagerSeriesTimerCreated(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
         {
         {
             SendMessage("SeriesTimerCreated", e.Argument);
             SendMessage("SeriesTimerCreated", e.Argument);
         }
         }
 
 
-        private void _liveTvManager_TimerCreated(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
+        private void OnLiveTvManagerTimerCreated(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
         {
         {
             SendMessage("TimerCreated", e.Argument);
             SendMessage("TimerCreated", e.Argument);
         }
         }
 
 
-        private void _liveTvManager_SeriesTimerCancelled(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
+        private void OnLiveTvManagerSeriesTimerCancelled(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
         {
         {
             SendMessage("SeriesTimerCancelled", e.Argument);
             SendMessage("SeriesTimerCancelled", e.Argument);
         }
         }
 
 
-        private void _liveTvManager_TimerCancelled(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
+        private void OnLiveTvManagerTimerCancelled(object sender, MediaBrowser.Model.Events.GenericEventArgs<TimerEventInfo> e)
         {
         {
             SendMessage("TimerCancelled", e.Argument);
             SendMessage("TimerCancelled", e.Argument);
         }
         }
@@ -64,11 +65,7 @@ namespace Emby.Server.Implementations.EntryPoints
 
 
             try
             try
             {
             {
-                await _sessionManager.SendMessageToUserSessions(users, name, info, CancellationToken.None);
-            }
-            catch (ObjectDisposedException)
-            {
-                // TODO Log exception or Investigate and properly fix.
+                await _sessionManager.SendMessageToUserSessions(users, name, info, CancellationToken.None).ConfigureAwait(false);
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -76,12 +73,13 @@ namespace Emby.Server.Implementations.EntryPoints
             }
             }
         }
         }
 
 
+        /// <inheritdoc />
         public void Dispose()
         public void Dispose()
         {
         {
-            _liveTvManager.TimerCancelled -= _liveTvManager_TimerCancelled;
-            _liveTvManager.SeriesTimerCancelled -= _liveTvManager_SeriesTimerCancelled;
-            _liveTvManager.TimerCreated -= _liveTvManager_TimerCreated;
-            _liveTvManager.SeriesTimerCreated -= _liveTvManager_SeriesTimerCreated;
+            _liveTvManager.TimerCancelled -= OnLiveTvManagerTimerCancelled;
+            _liveTvManager.SeriesTimerCancelled -= OnLiveTvManagerSeriesTimerCancelled;
+            _liveTvManager.TimerCreated -= OnLiveTvManagerTimerCreated;
+            _liveTvManager.SeriesTimerCreated -= OnLiveTvManagerSeriesTimerCreated;
         }
         }
     }
     }
 }
 }

+ 2 - 7
Emby.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs

@@ -6,7 +6,6 @@ using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Tasks;
 using MediaBrowser.Model.Tasks;
-using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.EntryPoints
 namespace Emby.Server.Implementations.EntryPoints
 {
 {
@@ -15,21 +14,17 @@ namespace Emby.Server.Implementations.EntryPoints
     /// </summary>
     /// </summary>
     public class RefreshUsersMetadata : IScheduledTask, IConfigurableScheduledTask
     public class RefreshUsersMetadata : IScheduledTask, IConfigurableScheduledTask
     {
     {
-        private readonly ILogger _logger;
-
         /// <summary>
         /// <summary>
         /// The user manager.
         /// The user manager.
         /// </summary>
         /// </summary>
         private readonly IUserManager _userManager;
         private readonly IUserManager _userManager;
-
-        private IFileSystem _fileSystem;
+        private readonly IFileSystem _fileSystem;
 
 
         /// <summary>
         /// <summary>
         /// Initializes a new instance of the <see cref="RefreshUsersMetadata" /> class.
         /// Initializes a new instance of the <see cref="RefreshUsersMetadata" /> class.
         /// </summary>
         /// </summary>
-        public RefreshUsersMetadata(ILogger logger, IUserManager userManager, IFileSystem fileSystem)
+        public RefreshUsersMetadata(IUserManager userManager, IFileSystem fileSystem)
         {
         {
-            _logger = logger;
             _userManager = userManager;
             _userManager = userManager;
             _fileSystem = fileSystem;
             _fileSystem = fileSystem;
         }
         }

+ 3 - 12
Emby.Server.Implementations/EntryPoints/StartupWizard.cs

@@ -3,37 +3,28 @@ using Emby.Server.Implementations.Browser;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;
-using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.EntryPoints
 namespace Emby.Server.Implementations.EntryPoints
 {
 {
     /// <summary>
     /// <summary>
     /// Class StartupWizard.
     /// Class StartupWizard.
     /// </summary>
     /// </summary>
-    public class StartupWizard : IServerEntryPoint
+    public sealed class StartupWizard : IServerEntryPoint
     {
     {
         /// <summary>
         /// <summary>
         /// The app host.
         /// The app host.
         /// </summary>
         /// </summary>
         private readonly IServerApplicationHost _appHost;
         private readonly IServerApplicationHost _appHost;
-
-        /// <summary>
-        /// The user manager.
-        /// </summary>
-        private readonly ILogger _logger;
-
-        private IServerConfigurationManager _config;
+        private readonly IServerConfigurationManager _config;
 
 
         /// <summary>
         /// <summary>
         /// Initializes a new instance of the <see cref="StartupWizard"/> class.
         /// Initializes a new instance of the <see cref="StartupWizard"/> class.
         /// </summary>
         /// </summary>
         /// <param name="appHost">The application host.</param>
         /// <param name="appHost">The application host.</param>
-        /// <param name="logger">The logger.</param>
         /// <param name="config">The configuration manager.</param>
         /// <param name="config">The configuration manager.</param>
-        public StartupWizard(IServerApplicationHost appHost, ILogger logger, IServerConfigurationManager config)
+        public StartupWizard(IServerApplicationHost appHost, IServerConfigurationManager config)
         {
         {
             _appHost = appHost;
             _appHost = appHost;
-            _logger = logger;
             _config = config;
             _config = config;
         }
         }
 
 

+ 1 - 5
Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs

@@ -3,8 +3,6 @@ using System.Threading.Tasks;
 using Emby.Server.Implementations.Udp;
 using Emby.Server.Implementations.Udp;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Model.Net;
-using MediaBrowser.Model.Serialization;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.EntryPoints
 namespace Emby.Server.Implementations.EntryPoints
@@ -23,9 +21,7 @@ namespace Emby.Server.Implementations.EntryPoints
         /// The logger.
         /// The logger.
         /// </summary>
         /// </summary>
         private readonly ILogger _logger;
         private readonly ILogger _logger;
-        private readonly ISocketFactory _socketFactory;
         private readonly IServerApplicationHost _appHost;
         private readonly IServerApplicationHost _appHost;
-        private readonly IJsonSerializer _json;
 
 
         /// <summary>
         /// <summary>
         /// The UDP server.
         /// The UDP server.
@@ -64,7 +60,7 @@ namespace Emby.Server.Implementations.EntryPoints
 
 
             _cancellationTokenSource.Cancel();
             _cancellationTokenSource.Cancel();
             _udpServer.Dispose();
             _udpServer.Dispose();
-
+            _cancellationTokenSource.Dispose();
             _cancellationTokenSource = null;
             _cancellationTokenSource = null;
             _udpServer = null;
             _udpServer = null;
 
 

+ 23 - 21
Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs

@@ -13,39 +13,38 @@ using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Session;
 using MediaBrowser.Model.Session;
-using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.EntryPoints
 namespace Emby.Server.Implementations.EntryPoints
 {
 {
-    public class UserDataChangeNotifier : IServerEntryPoint
+    public sealed class UserDataChangeNotifier : IServerEntryPoint
     {
     {
+        private const int UpdateDuration = 500;
+
         private readonly ISessionManager _sessionManager;
         private readonly ISessionManager _sessionManager;
-        private readonly ILogger _logger;
         private readonly IUserDataManager _userDataManager;
         private readonly IUserDataManager _userDataManager;
         private readonly IUserManager _userManager;
         private readonly IUserManager _userManager;
 
 
+        private readonly Dictionary<Guid, List<BaseItem>> _changedItems = new Dictionary<Guid, List<BaseItem>>();
+
         private readonly object _syncLock = new object();
         private readonly object _syncLock = new object();
-        private Timer UpdateTimer { get; set; }
-        private const int UpdateDuration = 500;
+        private Timer _updateTimer;
 
 
-        private readonly Dictionary<Guid, List<BaseItem>> _changedItems = new Dictionary<Guid, List<BaseItem>>();
 
 
-        public UserDataChangeNotifier(IUserDataManager userDataManager, ISessionManager sessionManager, ILogger logger, IUserManager userManager)
+        public UserDataChangeNotifier(IUserDataManager userDataManager, ISessionManager sessionManager, IUserManager userManager)
         {
         {
             _userDataManager = userDataManager;
             _userDataManager = userDataManager;
             _sessionManager = sessionManager;
             _sessionManager = sessionManager;
-            _logger = logger;
             _userManager = userManager;
             _userManager = userManager;
         }
         }
 
 
         public Task RunAsync()
         public Task RunAsync()
         {
         {
-            _userDataManager.UserDataSaved += _userDataManager_UserDataSaved;
+            _userDataManager.UserDataSaved += OnUserDataManagerUserDataSaved;
 
 
             return Task.CompletedTask;
             return Task.CompletedTask;
         }
         }
 
 
-        void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
+        void OnUserDataManagerUserDataSaved(object sender, UserDataSaveEventArgs e)
         {
         {
             if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
             if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
             {
             {
@@ -54,14 +53,17 @@ namespace Emby.Server.Implementations.EntryPoints
 
 
             lock (_syncLock)
             lock (_syncLock)
             {
             {
-                if (UpdateTimer == null)
+                if (_updateTimer == null)
                 {
                 {
-                    UpdateTimer = new Timer(UpdateTimerCallback, null, UpdateDuration,
-                                                   Timeout.Infinite);
+                    _updateTimer = new Timer(
+                        UpdateTimerCallback,
+                        null,
+                        UpdateDuration,
+                        Timeout.Infinite);
                 }
                 }
                 else
                 else
                 {
                 {
-                    UpdateTimer.Change(UpdateDuration, Timeout.Infinite);
+                    _updateTimer.Change(UpdateDuration, Timeout.Infinite);
                 }
                 }
 
 
                 if (!_changedItems.TryGetValue(e.UserId, out List<BaseItem> keys))
                 if (!_changedItems.TryGetValue(e.UserId, out List<BaseItem> keys))
@@ -97,10 +99,10 @@ namespace Emby.Server.Implementations.EntryPoints
 
 
                 var task = SendNotifications(changes, CancellationToken.None);
                 var task = SendNotifications(changes, CancellationToken.None);
 
 
-                if (UpdateTimer != null)
+                if (_updateTimer != null)
                 {
                 {
-                    UpdateTimer.Dispose();
-                    UpdateTimer = null;
+                    _updateTimer.Dispose();
+                    _updateTimer = null;
                 }
                 }
             }
             }
         }
         }
@@ -145,13 +147,13 @@ namespace Emby.Server.Implementations.EntryPoints
 
 
         public void Dispose()
         public void Dispose()
         {
         {
-            if (UpdateTimer != null)
+            if (_updateTimer != null)
             {
             {
-                UpdateTimer.Dispose();
-                UpdateTimer = null;
+                _updateTimer.Dispose();
+                _updateTimer = null;
             }
             }
 
 
-            _userDataManager.UserDataSaved -= _userDataManager_UserDataSaved;
+            _userDataManager.UserDataSaved -= OnUserDataManagerUserDataSaved;
         }
         }
     }
     }
 }
 }

+ 1 - 1
Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs

@@ -78,7 +78,7 @@ namespace Emby.Server.Implementations.HttpClientManager
             if (!string.IsNullOrWhiteSpace(userInfo))
             if (!string.IsNullOrWhiteSpace(userInfo))
             {
             {
                 _logger.LogWarning("Found userInfo in url: {0} ... url: {1}", userInfo, url);
                 _logger.LogWarning("Found userInfo in url: {0} ... url: {1}", userInfo, url);
-                url = url.Replace(userInfo + '@', string.Empty);
+                url = url.Replace(userInfo + '@', string.Empty, StringComparison.Ordinal);
             }
             }
 
 
             var request = new HttpRequestMessage(method, url);
             var request = new HttpRequestMessage(method, url);

+ 15 - 12
Emby.Server.Implementations/HttpServer/HttpListenerHost.cs

@@ -40,9 +40,9 @@ namespace Emby.Server.Implementations.HttpServer
         private readonly Func<Type, Func<string, object>> _funcParseFn;
         private readonly Func<Type, Func<string, object>> _funcParseFn;
         private readonly string _defaultRedirectPath;
         private readonly string _defaultRedirectPath;
         private readonly string _baseUrlPrefix;
         private readonly string _baseUrlPrefix;
-        private readonly Dictionary<Type, Type> ServiceOperationsMap = new Dictionary<Type, Type>();
-        private IWebSocketListener[] _webSocketListeners = Array.Empty<IWebSocketListener>();
+        private readonly Dictionary<Type, Type> _serviceOperationsMap = new Dictionary<Type, Type>();
         private readonly List<IWebSocketConnection> _webSocketConnections = new List<IWebSocketConnection>();
         private readonly List<IWebSocketConnection> _webSocketConnections = new List<IWebSocketConnection>();
+        private IWebSocketListener[] _webSocketListeners = Array.Empty<IWebSocketListener>();
         private bool _disposed = false;
         private bool _disposed = false;
 
 
         public HttpListenerHost(
         public HttpListenerHost(
@@ -72,6 +72,8 @@ namespace Emby.Server.Implementations.HttpServer
             ResponseFilters = Array.Empty<Action<IRequest, HttpResponse, object>>();
             ResponseFilters = Array.Empty<Action<IRequest, HttpResponse, object>>();
         }
         }
 
 
+        public event EventHandler<GenericEventArgs<IWebSocketConnection>> WebSocketConnected;
+
         public Action<IRequest, HttpResponse, object>[] ResponseFilters { get; set; }
         public Action<IRequest, HttpResponse, object>[] ResponseFilters { get; set; }
 
 
         public static HttpListenerHost Instance { get; protected set; }
         public static HttpListenerHost Instance { get; protected set; }
@@ -82,8 +84,6 @@ namespace Emby.Server.Implementations.HttpServer
 
 
         public ServiceController ServiceController { get; private set; }
         public ServiceController ServiceController { get; private set; }
 
 
-        public event EventHandler<GenericEventArgs<IWebSocketConnection>> WebSocketConnected;
-
         public object CreateInstance(Type type)
         public object CreateInstance(Type type)
         {
         {
             return _appHost.CreateInstance(type);
             return _appHost.CreateInstance(type);
@@ -91,7 +91,7 @@ namespace Emby.Server.Implementations.HttpServer
 
 
         private static string NormalizeUrlPath(string path)
         private static string NormalizeUrlPath(string path)
         {
         {
-            if (path.StartsWith("/"))
+            if (path.Length > 0 && path[0] == '/')
             {
             {
                 // If the path begins with a leading slash, just return it as-is
                 // If the path begins with a leading slash, just return it as-is
                 return path;
                 return path;
@@ -131,13 +131,13 @@ namespace Emby.Server.Implementations.HttpServer
 
 
         public Type GetServiceTypeByRequest(Type requestType)
         public Type GetServiceTypeByRequest(Type requestType)
         {
         {
-            ServiceOperationsMap.TryGetValue(requestType, out var serviceType);
+            _serviceOperationsMap.TryGetValue(requestType, out var serviceType);
             return serviceType;
             return serviceType;
         }
         }
 
 
         public void AddServiceInfo(Type serviceType, Type requestType)
         public void AddServiceInfo(Type serviceType, Type requestType)
         {
         {
-            ServiceOperationsMap[requestType] = serviceType;
+            _serviceOperationsMap[requestType] = serviceType;
         }
         }
 
 
         private List<IHasRequestFilter> GetRequestFilterAttributes(Type requestDtoType)
         private List<IHasRequestFilter> GetRequestFilterAttributes(Type requestDtoType)
@@ -199,7 +199,7 @@ namespace Emby.Server.Implementations.HttpServer
                 else
                 else
                 {
                 {
                     var inners = agg.InnerExceptions;
                     var inners = agg.InnerExceptions;
-                    if (inners != null && inners.Count > 0)
+                    if (inners.Count > 0)
                     {
                     {
                         return GetActualException(inners[0]);
                         return GetActualException(inners[0]);
                     }
                     }
@@ -362,7 +362,7 @@ namespace Emby.Server.Implementations.HttpServer
                 return true;
                 return true;
             }
             }
 
 
-            host = host ?? string.Empty;
+            host ??= string.Empty;
 
 
             if (_networkManager.IsInPrivateAddressSpace(host))
             if (_networkManager.IsInPrivateAddressSpace(host))
             {
             {
@@ -433,7 +433,7 @@ namespace Emby.Server.Implementations.HttpServer
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// Overridable method that can be used to implement a custom hnandler
+        /// Overridable method that can be used to implement a custom handler.
         /// </summary>
         /// </summary>
         public async Task RequestHandler(IHttpRequest httpReq, string urlString, string host, string localPath, CancellationToken cancellationToken)
         public async Task RequestHandler(IHttpRequest httpReq, string urlString, string host, string localPath, CancellationToken cancellationToken)
         {
         {
@@ -492,7 +492,7 @@ namespace Emby.Server.Implementations.HttpServer
                     || string.Equals(localPath, _baseUrlPrefix, StringComparison.OrdinalIgnoreCase)
                     || string.Equals(localPath, _baseUrlPrefix, StringComparison.OrdinalIgnoreCase)
                     || string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase)
                     || string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase)
                     || string.IsNullOrEmpty(localPath)
                     || string.IsNullOrEmpty(localPath)
-                    || !localPath.StartsWith(_baseUrlPrefix))
+                    || !localPath.StartsWith(_baseUrlPrefix, StringComparison.OrdinalIgnoreCase))
                 {
                 {
                     // Always redirect back to the default path if the base prefix is invalid or missing
                     // Always redirect back to the default path if the base prefix is invalid or missing
                     _logger.LogDebug("Normalizing a URL at {0}", localPath);
                     _logger.LogDebug("Normalizing a URL at {0}", localPath);
@@ -693,7 +693,10 @@ namespace Emby.Server.Implementations.HttpServer
 
 
         protected virtual void Dispose(bool disposing)
         protected virtual void Dispose(bool disposing)
         {
         {
-            if (_disposed) return;
+            if (_disposed)
+            {
+                return;
+            }
 
 
             if (disposing)
             if (disposing)
             {
             {

+ 2 - 0
Emby.Server.Implementations/IO/ExtendedFileSystemInfo.cs

@@ -6,7 +6,9 @@ namespace Emby.Server.Implementations.IO
     public class ExtendedFileSystemInfo
     public class ExtendedFileSystemInfo
     {
     {
         public bool IsHidden { get; set; }
         public bool IsHidden { get; set; }
+
         public bool IsReadOnly { get; set; }
         public bool IsReadOnly { get; set; }
+
         public bool Exists { get; set; }
         public bool Exists { get; set; }
     }
     }
 }
 }

+ 21 - 19
Emby.Server.Implementations/IO/FileRefresher.cs

@@ -15,27 +15,29 @@ namespace Emby.Server.Implementations.IO
 {
 {
     public class FileRefresher : IDisposable
     public class FileRefresher : IDisposable
     {
     {
-        private ILogger Logger { get; set; }
-        private ILibraryManager LibraryManager { get; set; }
-        private IServerConfigurationManager ConfigurationManager { get; set; }
+        private readonly ILogger _logger;
+        private readonly ILibraryManager _libraryManager;
+        private readonly IServerConfigurationManager _configurationManager;
+
         private readonly List<string> _affectedPaths = new List<string>();
         private readonly List<string> _affectedPaths = new List<string>();
-        private Timer _timer;
         private readonly object _timerLock = new object();
         private readonly object _timerLock = new object();
-        public string Path { get; private set; }
-
-        public event EventHandler<EventArgs> Completed;
+        private Timer _timer;
 
 
         public FileRefresher(string path, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, ILogger logger)
         public FileRefresher(string path, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, ILogger logger)
         {
         {
             logger.LogDebug("New file refresher created for {0}", path);
             logger.LogDebug("New file refresher created for {0}", path);
             Path = path;
             Path = path;
 
 
-            ConfigurationManager = configurationManager;
-            LibraryManager = libraryManager;
-            Logger = logger;
+            _configurationManager = configurationManager;
+            _libraryManager = libraryManager;
+            _logger = logger;
             AddPath(path);
             AddPath(path);
         }
         }
 
 
+        public event EventHandler<EventArgs> Completed;
+
+        public string Path { get; private set; }
+
         private void AddAffectedPath(string path)
         private void AddAffectedPath(string path)
         {
         {
             if (string.IsNullOrEmpty(path))
             if (string.IsNullOrEmpty(path))
@@ -80,11 +82,11 @@ namespace Emby.Server.Implementations.IO
 
 
                 if (_timer == null)
                 if (_timer == null)
                 {
                 {
-                    _timer = new Timer(OnTimerCallback, null, TimeSpan.FromSeconds(ConfigurationManager.Configuration.LibraryMonitorDelay), TimeSpan.FromMilliseconds(-1));
+                    _timer = new Timer(OnTimerCallback, null, TimeSpan.FromSeconds(_configurationManager.Configuration.LibraryMonitorDelay), TimeSpan.FromMilliseconds(-1));
                 }
                 }
                 else
                 else
                 {
                 {
-                    _timer.Change(TimeSpan.FromSeconds(ConfigurationManager.Configuration.LibraryMonitorDelay), TimeSpan.FromMilliseconds(-1));
+                    _timer.Change(TimeSpan.FromSeconds(_configurationManager.Configuration.LibraryMonitorDelay), TimeSpan.FromMilliseconds(-1));
                 }
                 }
             }
             }
         }
         }
@@ -93,7 +95,7 @@ namespace Emby.Server.Implementations.IO
         {
         {
             lock (_timerLock)
             lock (_timerLock)
             {
             {
-                Logger.LogDebug("Resetting file refresher from {0} to {1}", Path, path);
+                _logger.LogDebug("Resetting file refresher from {0} to {1}", Path, path);
 
 
                 Path = path;
                 Path = path;
                 AddAffectedPath(path);
                 AddAffectedPath(path);
@@ -116,7 +118,7 @@ namespace Emby.Server.Implementations.IO
                 paths = _affectedPaths.ToList();
                 paths = _affectedPaths.ToList();
             }
             }
 
 
-            Logger.LogDebug("Timer stopped.");
+            _logger.LogDebug("Timer stopped.");
 
 
             DisposeTimer();
             DisposeTimer();
             Completed?.Invoke(this, EventArgs.Empty);
             Completed?.Invoke(this, EventArgs.Empty);
@@ -127,7 +129,7 @@ namespace Emby.Server.Implementations.IO
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
-                Logger.LogError(ex, "Error processing directory changes");
+                _logger.LogError(ex, "Error processing directory changes");
             }
             }
         }
         }
 
 
@@ -147,7 +149,7 @@ namespace Emby.Server.Implementations.IO
                     continue;
                     continue;
                 }
                 }
 
 
-                Logger.LogInformation("{name} ({path}) will be refreshed.", item.Name, item.Path);
+                _logger.LogInformation("{name} ({path}) will be refreshed.", item.Name, item.Path);
 
 
                 try
                 try
                 {
                 {
@@ -158,11 +160,11 @@ namespace Emby.Server.Implementations.IO
                     // For now swallow and log.
                     // For now swallow and log.
                     // Research item: If an IOException occurs, the item may be in a disconnected state (media unavailable)
                     // Research item: If an IOException occurs, the item may be in a disconnected state (media unavailable)
                     // Should we remove it from it's parent?
                     // Should we remove it from it's parent?
-                    Logger.LogError(ex, "Error refreshing {name}", item.Name);
+                    _logger.LogError(ex, "Error refreshing {name}", item.Name);
                 }
                 }
                 catch (Exception ex)
                 catch (Exception ex)
                 {
                 {
-                    Logger.LogError(ex, "Error refreshing {name}", item.Name);
+                    _logger.LogError(ex, "Error refreshing {name}", item.Name);
                 }
                 }
             }
             }
         }
         }
@@ -178,7 +180,7 @@ namespace Emby.Server.Implementations.IO
 
 
             while (item == null && !string.IsNullOrEmpty(path))
             while (item == null && !string.IsNullOrEmpty(path))
             {
             {
-                item = LibraryManager.FindByPath(path, null);
+                item = _libraryManager.FindByPath(path, null);
 
 
                 path = System.IO.Path.GetDirectoryName(path);
                 path = System.IO.Path.GetDirectoryName(path);
             }
             }

+ 3 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.IO;
 using System.IO;
 using System.Net.Http;
 using System.Net.Http;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -30,7 +30,6 @@ using MediaBrowser.Model.Diagnostics;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Events;
-using MediaBrowser.Model.Extensions;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.MediaInfo;
 using MediaBrowser.Model.MediaInfo;

+ 3 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Globalization;

+ 5 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/EntryPoint.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;
 
 
@@ -5,11 +8,13 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 {
 {
     public class EntryPoint : IServerEntryPoint
     public class EntryPoint : IServerEntryPoint
     {
     {
+        /// <inheritdoc />
         public Task RunAsync()
         public Task RunAsync()
         {
         {
             return EmbyTV.Current.Start();
             return EmbyTV.Current.Start();
         }
         }
 
 
+        /// <inheritdoc />
         public void Dispose()
         public void Dispose()
         {
         {
         }
         }

+ 3 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;

+ 3 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.IO;
 using System.IO;

+ 13 - 5
Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Globalization;
 using System.Globalization;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.LiveTv;
@@ -21,7 +24,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
 
                 if (info.SeasonNumber.HasValue && info.EpisodeNumber.HasValue)
                 if (info.SeasonNumber.HasValue && info.EpisodeNumber.HasValue)
                 {
                 {
-                    name += string.Format(" S{0}E{1}", info.SeasonNumber.Value.ToString("00", CultureInfo.InvariantCulture), info.EpisodeNumber.Value.ToString("00", CultureInfo.InvariantCulture));
+                    name += string.Format(
+                        CultureInfo.InvariantCulture,
+                        " S{0}E{1}",
+                        info.SeasonNumber.Value.ToString("00", CultureInfo.InvariantCulture),
+                        info.EpisodeNumber.Value.ToString("00", CultureInfo.InvariantCulture));
                     addHyphen = false;
                     addHyphen = false;
                 }
                 }
                 else if (info.OriginalAirDate.HasValue)
                 else if (info.OriginalAirDate.HasValue)
@@ -32,7 +39,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                     }
                     }
                     else
                     else
                     {
                     {
-                        name += " " + info.OriginalAirDate.Value.ToLocalTime().ToString("yyyy-MM-dd");
+                        name += " " + info.OriginalAirDate.Value.ToLocalTime().ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
                     }
                     }
                 }
                 }
                 else
                 else
@@ -67,14 +74,15 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
         {
             date = date.ToLocalTime();
             date = date.ToLocalTime();
 
 
-            return string.Format("{0}_{1}_{2}_{3}_{4}_{5}",
+            return string.Format(
+                CultureInfo.InvariantCulture,
+                "{0}_{1}_{2}_{3}_{4}_{5}",
                 date.Year.ToString("0000", CultureInfo.InvariantCulture),
                 date.Year.ToString("0000", CultureInfo.InvariantCulture),
                 date.Month.ToString("00", CultureInfo.InvariantCulture),
                 date.Month.ToString("00", CultureInfo.InvariantCulture),
                 date.Day.ToString("00", CultureInfo.InvariantCulture),
                 date.Day.ToString("00", CultureInfo.InvariantCulture),
                 date.Hour.ToString("00", CultureInfo.InvariantCulture),
                 date.Hour.ToString("00", CultureInfo.InvariantCulture),
                 date.Minute.ToString("00", CultureInfo.InvariantCulture),
                 date.Minute.ToString("00", CultureInfo.InvariantCulture),
-                date.Second.ToString("00", CultureInfo.InvariantCulture)
-                );
+                date.Second.ToString("00", CultureInfo.InvariantCulture));
         }
         }
     }
     }
 }
 }

+ 4 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Serialization;
@@ -12,6 +15,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
         {
         }
         }
 
 
+        /// <inheritdoc />
         public override void Add(SeriesTimerInfo item)
         public override void Add(SeriesTimerInfo item)
         {
         {
             if (string.IsNullOrEmpty(item.Id))
             if (string.IsNullOrEmpty(item.Id))

+ 3 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;
 using System.Globalization;
 using System.Globalization;

+ 3 - 0
Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 5 - 2
Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Globalization;
@@ -91,12 +94,12 @@ namespace Emby.Server.Implementations.LiveTv.Listings
                 {
                 {
                     using (var gzStream = new GZipStream(stream, CompressionMode.Decompress))
                     using (var gzStream = new GZipStream(stream, CompressionMode.Decompress))
                     {
                     {
-                        await gzStream.CopyToAsync(fileStream).ConfigureAwait(false);
+                        await gzStream.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false);
                     }
                     }
                 }
                 }
                 else
                 else
                 {
                 {
-                    await stream.CopyToAsync(fileStream).ConfigureAwait(false);
+                    await stream.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false);
                 }
                 }
             }
             }
 
 

+ 3 - 0
Emby.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System.Collections.Generic;
 using System.Collections.Generic;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.LiveTv;

+ 3 - 0
Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Globalization;
 using System.Globalization;
 using System.Linq;
 using System.Linq;

+ 1 - 1
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1,5 +1,5 @@
-#pragma warning disable SA1600
 #pragma warning disable CS1591
 #pragma warning disable CS1591
+#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 22 - 26
Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs

@@ -1,52 +1,48 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Globalization;
 using System.Linq;
 using System.Linq;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Configuration;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.MediaInfo;
 using MediaBrowser.Model.MediaInfo;
-using MediaBrowser.Model.Serialization;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.LiveTv
 namespace Emby.Server.Implementations.LiveTv
 {
 {
     public class LiveTvMediaSourceProvider : IMediaSourceProvider
     public class LiveTvMediaSourceProvider : IMediaSourceProvider
     {
     {
+        // Do not use a pipe here because Roku http requests to the server will fail, without any explicit error message.
+        private const char StreamIdDelimeter = '_';
+        private const string StreamIdDelimeterString = "_";
+
         private readonly ILiveTvManager _liveTvManager;
         private readonly ILiveTvManager _liveTvManager;
-        private readonly IJsonSerializer _jsonSerializer;
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IMediaSourceManager _mediaSourceManager;
         private readonly IMediaSourceManager _mediaSourceManager;
-        private readonly IMediaEncoder _mediaEncoder;
         private readonly IServerApplicationHost _appHost;
         private readonly IServerApplicationHost _appHost;
-        private IApplicationPaths _appPaths;
 
 
-        public LiveTvMediaSourceProvider(ILiveTvManager liveTvManager, IApplicationPaths appPaths, IJsonSerializer jsonSerializer, ILoggerFactory loggerFactory, IMediaSourceManager mediaSourceManager, IMediaEncoder mediaEncoder, IServerApplicationHost appHost)
+        public LiveTvMediaSourceProvider(ILiveTvManager liveTvManager, ILogger<LiveTvMediaSourceProvider> logger, IMediaSourceManager mediaSourceManager, IServerApplicationHost appHost)
         {
         {
             _liveTvManager = liveTvManager;
             _liveTvManager = liveTvManager;
-            _jsonSerializer = jsonSerializer;
+            _logger = logger;
             _mediaSourceManager = mediaSourceManager;
             _mediaSourceManager = mediaSourceManager;
-            _mediaEncoder = mediaEncoder;
             _appHost = appHost;
             _appHost = appHost;
-            _logger = loggerFactory.CreateLogger(GetType().Name);
-            _appPaths = appPaths;
         }
         }
 
 
         public Task<IEnumerable<MediaSourceInfo>> GetMediaSources(BaseItem item, CancellationToken cancellationToken)
         public Task<IEnumerable<MediaSourceInfo>> GetMediaSources(BaseItem item, CancellationToken cancellationToken)
         {
         {
-            var baseItem = (BaseItem)item;
-
-            if (baseItem.SourceType == SourceType.LiveTV)
+            if (item.SourceType == SourceType.LiveTV)
             {
             {
                 var activeRecordingInfo = _liveTvManager.GetActiveRecordingInfo(item.Path);
                 var activeRecordingInfo = _liveTvManager.GetActiveRecordingInfo(item.Path);
 
 
-                if (string.IsNullOrEmpty(baseItem.Path) || activeRecordingInfo != null)
+                if (string.IsNullOrEmpty(item.Path) || activeRecordingInfo != null)
                 {
                 {
                     return GetMediaSourcesInternal(item, activeRecordingInfo, cancellationToken);
                     return GetMediaSourcesInternal(item, activeRecordingInfo, cancellationToken);
                 }
                 }
@@ -55,10 +51,6 @@ namespace Emby.Server.Implementations.LiveTv
             return Task.FromResult<IEnumerable<MediaSourceInfo>>(Array.Empty<MediaSourceInfo>());
             return Task.FromResult<IEnumerable<MediaSourceInfo>>(Array.Empty<MediaSourceInfo>());
         }
         }
 
 
-        // Do not use a pipe here because Roku http requests to the server will fail, without any explicit error message.
-        private const char StreamIdDelimeter = '_';
-        private const string StreamIdDelimeterString = "_";
-
         private async Task<IEnumerable<MediaSourceInfo>> GetMediaSourcesInternal(BaseItem item, ActiveRecordingInfo activeRecordingInfo, CancellationToken cancellationToken)
         private async Task<IEnumerable<MediaSourceInfo>> GetMediaSourcesInternal(BaseItem item, ActiveRecordingInfo activeRecordingInfo, CancellationToken cancellationToken)
         {
         {
             IEnumerable<MediaSourceInfo> sources;
             IEnumerable<MediaSourceInfo> sources;
@@ -91,7 +83,7 @@ namespace Emby.Server.Implementations.LiveTv
             foreach (var source in list)
             foreach (var source in list)
             {
             {
                 source.Type = MediaSourceType.Default;
                 source.Type = MediaSourceType.Default;
-                source.BufferMs = source.BufferMs ?? 1500;
+                source.BufferMs ??= 1500;
 
 
                 if (source.RequiresOpening || forceRequireOpening)
                 if (source.RequiresOpening || forceRequireOpening)
                 {
                 {
@@ -100,11 +92,14 @@ namespace Emby.Server.Implementations.LiveTv
 
 
                 if (source.RequiresOpening)
                 if (source.RequiresOpening)
                 {
                 {
-                    var openKeys = new List<string>();
-                    openKeys.Add(item.GetType().Name);
-                    openKeys.Add(item.Id.ToString("N", CultureInfo.InvariantCulture));
-                    openKeys.Add(source.Id ?? string.Empty);
-                    source.OpenToken = string.Join(StreamIdDelimeterString, openKeys.ToArray());
+                    var openKeys = new List<string>
+                    {
+                        item.GetType().Name,
+                        item.Id.ToString("N", CultureInfo.InvariantCulture),
+                        source.Id ?? string.Empty
+                    };
+
+                    source.OpenToken = string.Join(StreamIdDelimeterString, openKeys);
                 }
                 }
 
 
                 // Dummy this up so that direct play checks can still run
                 // Dummy this up so that direct play checks can still run
@@ -114,11 +109,12 @@ namespace Emby.Server.Implementations.LiveTv
                 }
                 }
             }
             }
 
 
-            _logger.LogDebug("MediaSources: {0}", _jsonSerializer.SerializeToString(list));
+            _logger.LogDebug("MediaSources: {@MediaSources}", list);
 
 
             return list;
             return list;
         }
         }
 
 
+        /// <inheritdoc />
         public async Task<ILiveStream> OpenMediaSource(string openToken, List<ILiveStream> currentLiveStreams, CancellationToken cancellationToken)
         public async Task<ILiveStream> OpenMediaSource(string openToken, List<ILiveStream> currentLiveStreams, CancellationToken cancellationToken)
         {
         {
             var keys = openToken.Split(new[] { StreamIdDelimeter }, 3);
             var keys = openToken.Split(new[] { StreamIdDelimeter }, 3);

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Globalization;

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Buffers;
 using System.Buffers;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.IO;
 using System.IO;

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Globalization;

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Globalization;

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Globalization;

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.IO;
 using System.IO;

+ 3 - 0
MediaBrowser.Controller/Library/IMediaSourceProvider.cs

@@ -1,3 +1,6 @@
+#pragma warning disable CS1591
+#pragma warning disable SA1600
+
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;