Merge pull request #2384 from Bond-009/warn16

Fix some warnings in Emby.Server.Implementations
This commit is contained in:
dkanada 2020-02-23 21:46:15 +09:00 committed by GitHub
commit de40f22a46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 187 additions and 132 deletions

View File

@ -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.TimerCancelled += OnLiveTvManagerTimerCancelled;
_liveTvManager.SeriesTimerCancelled += _liveTvManager_SeriesTimerCancelled; _liveTvManager.SeriesTimerCancelled += OnLiveTvManagerSeriesTimerCancelled;
_liveTvManager.TimerCreated += _liveTvManager_TimerCreated; _liveTvManager.TimerCreated += OnLiveTvManagerTimerCreated;
_liveTvManager.SeriesTimerCreated += _liveTvManager_SeriesTimerCreated; _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); await _sessionManager.SendMessageToUserSessions(users, name, info, CancellationToken.None).ConfigureAwait(false);
}
catch (ObjectDisposedException)
{
// TODO Log exception or Investigate and properly fix.
} }
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.TimerCancelled -= OnLiveTvManagerTimerCancelled;
_liveTvManager.SeriesTimerCancelled -= _liveTvManager_SeriesTimerCancelled; _liveTvManager.SeriesTimerCancelled -= OnLiveTvManagerSeriesTimerCancelled;
_liveTvManager.TimerCreated -= _liveTvManager_TimerCreated; _liveTvManager.TimerCreated -= OnLiveTvManagerTimerCreated;
_liveTvManager.SeriesTimerCreated -= _liveTvManager_SeriesTimerCreated; _liveTvManager.SeriesTimerCreated -= OnLiveTvManagerSeriesTimerCreated;
} }
} }
} }

View File

@ -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 readonly IFileSystem _fileSystem;
private 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;
} }

View File

@ -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;
private readonly IServerConfigurationManager _config;
/// <summary>
/// The user manager.
/// </summary>
private readonly ILogger _logger;
private 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;
} }

View File

@ -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;

View File

@ -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 object _syncLock = new object();
private Timer UpdateTimer { get; set; }
private const int UpdateDuration = 500;
private readonly Dictionary<Guid, List<BaseItem>> _changedItems = new Dictionary<Guid, List<BaseItem>>(); private readonly Dictionary<Guid, List<BaseItem>> _changedItems = new Dictionary<Guid, List<BaseItem>>();
public UserDataChangeNotifier(IUserDataManager userDataManager, ISessionManager sessionManager, ILogger logger, IUserManager userManager) private readonly object _syncLock = new object();
private Timer _updateTimer;
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, _updateTimer = new Timer(
Timeout.Infinite); 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.Dispose();
UpdateTimer = null; _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.Dispose();
UpdateTimer = null; _updateTimer = null;
} }
_userDataManager.UserDataSaved -= _userDataManager_UserDataSaved; _userDataManager.UserDataSaved -= OnUserDataManagerUserDataSaved;
} }
} }
} }

View File

@ -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);

View File

@ -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 readonly Dictionary<Type, Type> _serviceOperationsMap = new Dictionary<Type, Type>();
private IWebSocketListener[] _webSocketListeners = Array.Empty<IWebSocketListener>();
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)
{ {

View File

@ -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; }
} }
} }

View File

@ -15,27 +15,29 @@ namespace Emby.Server.Implementations.IO
{ {
public class FileRefresher : IDisposable public class FileRefresher : IDisposable
{ {
private ILogger Logger { get; set; } private readonly ILogger _logger;
private ILibraryManager LibraryManager { get; set; } private readonly ILibraryManager _libraryManager;
private IServerConfigurationManager ConfigurationManager { get; set; } private readonly IServerConfigurationManager _configurationManager;
private readonly List<string> _affectedPaths = new List<string>();
private Timer _timer;
private readonly object _timerLock = new object();
public string Path { get; private set; }
public event EventHandler<EventArgs> Completed; private readonly List<string> _affectedPaths = new List<string>();
private readonly object _timerLock = new object();
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; _configurationManager = configurationManager;
LibraryManager = libraryManager; _libraryManager = libraryManager;
Logger = logger; _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);
} }

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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()
{ {
} }

View File

@ -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;

View File

@ -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;

View File

@ -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));
);
} }
} }
} }

View File

@ -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))

View File

@ -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;

View File

@ -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;

View File

@ -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);
} }
} }

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 (item.SourceType == SourceType.LiveTV)
if (baseItem.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>(); var openKeys = new List<string>
openKeys.Add(item.GetType().Name); {
openKeys.Add(item.Id.ToString("N", CultureInfo.InvariantCulture)); item.GetType().Name,
openKeys.Add(source.Id ?? string.Empty); item.Id.ToString("N", CultureInfo.InvariantCulture),
source.OpenToken = string.Join(StreamIdDelimeterString, openKeys.ToArray()); 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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;