From 6c8d9192985036acb3d1fe626ed57980bb862d6a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 31 Oct 2013 10:03:23 -0400 Subject: [PATCH] replace file system calls with IFileSystem when needed --- MediaBrowser.Api/Library/LibraryHelpers.cs | 3 +- .../Library/LibraryStructureService.cs | 3 +- .../Playback/BaseStreamingService.cs | 7 +- .../Playback/Hls/AudioHlsService.cs | 7 +- .../Playback/Hls/BaseHlsService.cs | 6 +- .../Playback/Hls/VideoHlsService.cs | 7 +- .../Playback/Progressive/AudioService.cs | 7 +- .../BaseProgressiveStreamingService.cs | 7 +- .../Progressive/ProgressiveStreamWriter.cs | 6 +- .../Playback/Progressive/VideoService.cs | 7 +- MediaBrowser.Api/SystemService.cs | 10 ++- .../WebSocket/LogFileWebSocketListener.cs | 11 +-- .../BaseApplicationHost.cs | 23 ++++-- .../HttpClientManager/HttpClientManager.cs | 8 ++- .../IO/CommonFileSystem.cs | 59 +++++++++++++-- ...MediaBrowser.Common.Implementations.csproj | 1 + .../Tasks/DeleteCacheFileTask.cs | 10 ++- .../ScheduledTasks/Tasks/DeleteLogFileTask.cs | 8 ++- .../IO/IFileSystem.cs | 27 ++++++- .../MediaBrowser.Common.csproj | 1 + MediaBrowser.Controller/Entities/BaseItem.cs | 5 +- MediaBrowser.Controller/Entities/User.cs | 2 +- MediaBrowser.Controller/IO/FileData.cs | 3 +- MediaBrowser.Controller/IO/FileSystem.cs | 71 ------------------- .../MediaBrowser.Controller.csproj | 2 - .../MediaInfo/FFMpegManager.cs | 8 ++- .../Resolvers/EntityResolutionHelper.cs | 9 +-- MediaBrowser.Mono.userprefs | 17 +++-- .../FolderProviderFromXml.cs | 9 ++- .../Games/GameProviderFromXml.cs | 11 +-- .../Games/GameSystemProviderFromXml.cs | 9 ++- .../ImagesByNameProvider.cs | 3 +- .../Movies/BoxSetProviderFromXml.cs | 9 ++- .../Movies/FanArtMovieProvider.cs | 9 ++- .../Movies/FanArtMovieUpdatesPrescanTask.cs | 9 ++- .../Movies/MovieDbImagesProvider.cs | 14 ++-- .../Movies/MovieDbProvider.cs | 7 +- .../Movies/MovieProviderFromXml.cs | 10 +-- .../Movies/MovieUpdatesPrescanTask.cs | 9 ++- .../Movies/PersonProviderFromXml.cs | 9 ++- .../Movies/PersonUpdatesPreScanTask.cs | 9 ++- .../Movies/TmdbPersonProvider.cs | 9 ++- .../Music/ArtistProviderFromXml.cs | 9 ++- .../Music/FanArtAlbumProvider.cs | 9 ++- .../Music/FanArtArtistByNameProvider.cs | 12 ++-- .../Music/FanArtArtistProvider.cs | 17 ++--- .../Music/FanArtUpdatesPrescanTask.cs | 9 ++- MediaBrowser.Providers/RefreshIntrosTask.cs | 3 +- .../TV/EpisodeProviderFromXml.cs | 9 ++- .../TV/FanArtSeasonProvider.cs | 9 ++- MediaBrowser.Providers/TV/FanArtTVProvider.cs | 9 ++- .../TV/FanArtTvUpdatesPrescanTask.cs | 9 ++- .../TV/RemoteEpisodeProvider.cs | 9 ++- .../TV/RemoteSeasonProvider.cs | 9 ++- .../TV/RemoteSeriesProvider.cs | 12 ++-- .../TV/SeasonProviderFromXml.cs | 9 ++- .../TV/SeriesProviderFromXml.cs | 11 +-- MediaBrowser.Providers/TV/TvdbPrescanTask.cs | 7 +- .../TV/TvdbSeriesImageProvider.cs | 10 ++- .../Drawing/ImageHeader.cs | 9 ++- .../Drawing/ImageProcessor.cs | 23 +++--- .../Notifications/RemoteNotifications.cs | 8 ++- .../HttpServer/HttpResultFactory.cs | 9 ++- .../IO/DirectoryWatchers.cs | 17 ++++- .../Library/LibraryManager.cs | 3 +- .../Library/ResolverHelper.cs | 1 + .../Localization/LocalizationManager.cs | 11 ++- .../MediaEncoder/MediaEncoder.cs | 10 +-- .../Providers/ImageSaver.cs | 6 +- .../Providers/ProviderManager.cs | 8 ++- .../IO/FileSystemFactory.cs | 21 ++++++ .../MediaBrowser.Server.Mono.csproj | 2 + MediaBrowser.Server.Mono/Program.cs | 33 +++++++++ .../ApplicationHost.cs | 25 +++---- .../FFMpeg/FFMpegDownloader.cs | 10 +-- .../IO/FileSystemFactory.cs | 3 +- .../IO/NativeFileSystem.cs | 5 +- .../MediaBrowser.ServerApplication.csproj | 1 - .../Api/DashboardService.cs | 9 ++- MediaBrowser.sln.GhostDoc.xml | 35 +++++++++ 80 files changed, 570 insertions(+), 302 deletions(-) rename {MediaBrowser.ServerApplication => MediaBrowser.Common.Implementations}/IO/CommonFileSystem.cs (81%) rename {MediaBrowser.Controller => MediaBrowser.Common}/IO/IFileSystem.cs (61%) delete mode 100644 MediaBrowser.Controller/IO/FileSystem.cs create mode 100644 MediaBrowser.Server.Mono/IO/FileSystemFactory.cs create mode 100644 MediaBrowser.sln.GhostDoc.xml diff --git a/MediaBrowser.Api/Library/LibraryHelpers.cs b/MediaBrowser.Api/Library/LibraryHelpers.cs index 906b47458f..3d0dd4e088 100644 --- a/MediaBrowser.Api/Library/LibraryHelpers.cs +++ b/MediaBrowser.Api/Library/LibraryHelpers.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using System; diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs index a5476ec8b8..0126586ab7 100644 --- a/MediaBrowser.Api/Library/LibraryStructureService.cs +++ b/MediaBrowser.Api/Library/LibraryStructureService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 31166ae2aa..4332999015 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -59,6 +59,8 @@ namespace MediaBrowser.Api.Playback protected IMediaEncoder MediaEncoder { get; private set; } protected IDtoService DtoService { get; private set; } + protected IFileSystem FileSystem { get; private set; } + /// /// Initializes a new instance of the class. /// @@ -67,8 +69,9 @@ namespace MediaBrowser.Api.Playback /// The library manager. /// The iso manager. /// The media encoder. - protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService) + protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) { + FileSystem = fileSystem; DtoService = dtoService; ApplicationPaths = appPaths; UserManager = userManager; @@ -653,7 +656,7 @@ namespace MediaBrowser.Api.Playback var logFilePath = Path.Combine(ApplicationPaths.LogDirectoryPath, "ffmpeg-" + Guid.NewGuid() + ".txt"); // FFMpeg writes debug/error info to stderr. This is useful when debugging so let's put it in the log directory. - state.LogFileStream = new FileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous); + state.LogFileStream = FileSystem.GetFileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, true); process.Exited += (sender, args) => OnFfMpegProcessExited(process, state); diff --git a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs index 6e36ba0ad8..6636db05d2 100644 --- a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.MediaInfo; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; @@ -32,8 +33,8 @@ namespace MediaBrowser.Api.Playback.Hls /// The library manager. /// The iso manager. /// The media encoder. - public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService) + public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) { } diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 787727cd3a..3e96cf2f82 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -38,8 +38,8 @@ namespace MediaBrowser.Api.Playback.Hls /// The library manager. /// The iso manager. /// The media encoder. - protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService) + protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) { } @@ -209,7 +209,7 @@ namespace MediaBrowser.Api.Playback.Hls string fileText; // Need to use FileShare.ReadWrite because we're reading the file at the same time it's being written - using (var fileStream = new FileStream(playlist, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fileStream = FileSystem.GetFileStream(playlist, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) { using (var reader = new StreamReader(fileStream)) { diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index ecc53ce349..453039ba8a 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.MediaInfo; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; @@ -39,8 +40,8 @@ namespace MediaBrowser.Api.Playback.Hls /// The iso manager. /// The media encoder. /// The dto service. - public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService) + public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) { } diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs index 4165055755..36a998c16d 100644 --- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs +++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.MediaInfo; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Dto; @@ -40,8 +41,8 @@ namespace MediaBrowser.Api.Playback.Progressive /// public class AudioService : BaseProgressiveStreamingService { - public AudioService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, itemRepo, dtoService, imageProcessor) + public AudioService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor, IFileSystem fileSystem) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, itemRepo, dtoService, imageProcessor, fileSystem) { } diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 0bc147a46c..a31b6af0e2 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -1,4 +1,5 @@ using MediaBrowser.Api.Images; +using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; using MediaBrowser.Common.Net; using MediaBrowser.Controller; @@ -27,8 +28,8 @@ namespace MediaBrowser.Api.Playback.Progressive protected readonly IItemRepository ItemRepository; protected readonly IImageProcessor ImageProcessor; - protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepository, IDtoService dtoService, IImageProcessor imageProcessor) : - base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService) + protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepository, IDtoService dtoService, IImageProcessor imageProcessor, IFileSystem fileSystem) : + base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) { ItemRepository = itemRepository; ImageProcessor = imageProcessor; @@ -346,7 +347,7 @@ namespace MediaBrowser.Api.Playback.Progressive ApiEntryPoint.Instance.OnTranscodeBeginRequest(outputPath, TranscodingJobType.Progressive); } - var result = new ProgressiveStreamWriter(outputPath, Logger); + var result = new ProgressiveStreamWriter(outputPath, Logger, FileSystem); result.Options["Accept-Ranges"] = "none"; result.Options["Content-Type"] = contentType; diff --git a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs index c967a0d015..816cab105d 100644 --- a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs +++ b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs @@ -13,6 +13,7 @@ namespace MediaBrowser.Api.Playback.Progressive { private string Path { get; set; } private ILogger Logger { get; set; } + private readonly IFileSystem _fileSystem; /// /// The _options @@ -32,10 +33,11 @@ namespace MediaBrowser.Api.Playback.Progressive /// /// The path. /// The logger. - public ProgressiveStreamWriter(string path, ILogger logger) + public ProgressiveStreamWriter(string path, ILogger logger, IFileSystem fileSystem) { Path = path; Logger = logger; + _fileSystem = fileSystem; } /// @@ -83,7 +85,7 @@ namespace MediaBrowser.Api.Playback.Progressive var eofCount = 0; long position = 0; - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fs = _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) { while (eofCount < 15) { diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index c1dd7fa017..fe5d22f584 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.MediaInfo; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Dto; @@ -54,8 +55,8 @@ namespace MediaBrowser.Api.Playback.Progressive /// public class VideoService : BaseProgressiveStreamingService { - public VideoService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, itemRepo, dtoService, imageProcessor) + public VideoService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor, IFileSystem fileSystem) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, itemRepo, dtoService, imageProcessor, fileSystem) { } diff --git a/MediaBrowser.Api/SystemService.cs b/MediaBrowser.Api/SystemService.cs index 9bbd6a5883..ae6c607954 100644 --- a/MediaBrowser.Api/SystemService.cs +++ b/MediaBrowser.Api/SystemService.cs @@ -1,6 +1,8 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.System; @@ -75,6 +77,9 @@ namespace MediaBrowser.Api /// private readonly IServerConfigurationManager _configurationManager; + private readonly IFileSystem _fileSystem; + + /// /// Initializes a new instance of the class. /// @@ -82,7 +87,7 @@ namespace MediaBrowser.Api /// The app host. /// The configuration manager. /// jsonSerializer - public SystemService(IJsonSerializer jsonSerializer, IServerApplicationHost appHost, IServerConfigurationManager configurationManager) + public SystemService(IJsonSerializer jsonSerializer, IServerApplicationHost appHost, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base() { if (jsonSerializer == null) @@ -96,6 +101,7 @@ namespace MediaBrowser.Api _appHost = appHost; _configurationManager = configurationManager; + _fileSystem = fileSystem; _jsonSerializer = jsonSerializer; } @@ -118,7 +124,7 @@ namespace MediaBrowser.Api /// System.Object. public object Get(GetConfiguration request) { - var dateModified = File.GetLastWriteTimeUtc(_configurationManager.ApplicationPaths.SystemConfigurationFilePath); + var dateModified = _fileSystem.GetLastWriteTimeUtc(_configurationManager.ApplicationPaths.SystemConfigurationFilePath); var cacheKey = (_configurationManager.ApplicationPaths.SystemConfigurationFilePath + dateModified.Ticks).GetMD5(); diff --git a/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs b/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs index f11bae5239..07fa0e6100 100644 --- a/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs +++ b/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; @@ -27,16 +28,18 @@ namespace MediaBrowser.Api.WebSocket /// The _kernel /// private readonly ILogManager _logManager; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. /// /// The logger. /// The log manager. - public LogFileWebSocketListener(ILogger logger, ILogManager logManager) + public LogFileWebSocketListener(ILogger logger, ILogManager logManager, IFileSystem fileSystem) : base(logger) { _logManager = logManager; + _fileSystem = fileSystem; _logManager.LoggerLoaded += kernel_LoggerLoaded; } @@ -53,7 +56,7 @@ namespace MediaBrowser.Api.WebSocket state.StartLine = 0; } - var lines = await GetLogLines(state.LastLogFilePath, state.StartLine).ConfigureAwait(false); + var lines = await GetLogLines(state.LastLogFilePath, state.StartLine, _fileSystem).ConfigureAwait(false); state.StartLine += lines.Count; @@ -96,11 +99,11 @@ namespace MediaBrowser.Api.WebSocket /// The log file path. /// The start line. /// Task{IEnumerable{System.String}}. - internal static async Task> GetLogLines(string logFilePath, int startLine) + internal static async Task> GetLogLines(string logFilePath, int startLine, IFileSystem fileSystem) { var lines = new List(); - using (var fs = new FileStream(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fs = fileSystem.GetFileStream(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) { using (var reader = new StreamReader(fs)) { diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index daa664a388..ee22b7baa2 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -1,5 +1,4 @@ -using System.Net; -using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Events; using MediaBrowser.Common.Implementations.Archiving; using MediaBrowser.Common.Implementations.IO; @@ -7,6 +6,7 @@ using MediaBrowser.Common.Implementations.ScheduledTasks; using MediaBrowser.Common.Implementations.Security; using MediaBrowser.Common.Implementations.Serialization; using MediaBrowser.Common.Implementations.Updates; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; using System.Net.Http; using System.Reflection; using System.Threading; @@ -150,15 +151,17 @@ namespace MediaBrowser.Common.Implementations /// Gets or sets the installation manager. /// /// The installation manager. - protected IInstallationManager InstallationManager { get; set; } + protected IInstallationManager InstallationManager { get; private set; } + protected IFileSystem FileSystemManager { get; private set; } + /// /// Gets or sets the zip client. /// /// The zip client. - protected IZipClient ZipClient { get; set; } + protected IZipClient ZipClient { get; private set; } - protected IIsoManager IsoManager { get; set; } + protected IIsoManager IsoManager { get; private set; } /// /// Initializes a new instance of the class. @@ -347,7 +350,10 @@ namespace MediaBrowser.Common.Implementations RegisterSingleInstance(TaskManager); - HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, Logger, CreateHttpClient); + FileSystemManager = CreateFileSystemManager(); + RegisterSingleInstance(FileSystemManager); + + HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, Logger, CreateHttpClient, FileSystemManager); RegisterSingleInstance(HttpClient); NetworkManager = CreateNetworkManager(); @@ -367,6 +373,11 @@ namespace MediaBrowser.Common.Implementations }); } + protected virtual IFileSystem CreateFileSystemManager() + { + return new CommonFileSystem(Logger, true); + } + protected abstract HttpClient CreateHttpClient(bool enableHttpCompression); /// diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs index b75234107f..0d6ba5c1da 100644 --- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs +++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs @@ -34,6 +34,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager public delegate HttpClient GetHttpClientHandler(bool enableHttpCompression); private readonly GetHttpClientHandler _getHttpClientHandler; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -46,7 +47,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager /// or /// logger /// - public HttpClientManager(IApplicationPaths appPaths, ILogger logger, GetHttpClientHandler getHttpClientHandler) + public HttpClientManager(IApplicationPaths appPaths, ILogger logger, GetHttpClientHandler getHttpClientHandler, IFileSystem fileSystem) { if (appPaths == null) { @@ -59,6 +60,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager _logger = logger; _getHttpClientHandler = getHttpClientHandler; + _fileSystem = fileSystem; _appPaths = appPaths; } @@ -417,7 +419,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager // We're not able to track progress using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { - using (var fs = new FileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fs = _fileSystem.GetFileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await stream.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false); } @@ -427,7 +429,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager { using (var stream = ProgressStream.CreateReadProgressStream(await response.Content.ReadAsStreamAsync().ConfigureAwait(false), options.Progress.Report, contentLength.Value)) { - using (var fs = new FileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fs = _fileSystem.GetFileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await stream.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false); } diff --git a/MediaBrowser.ServerApplication/IO/CommonFileSystem.cs b/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs similarity index 81% rename from MediaBrowser.ServerApplication/IO/CommonFileSystem.cs rename to MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs index dee9bd9d77..ed9baf3b2f 100644 --- a/MediaBrowser.ServerApplication/IO/CommonFileSystem.cs +++ b/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs @@ -1,10 +1,10 @@ -using MediaBrowser.Controller.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Model.Logging; using System; using System.IO; using System.Text; -namespace MediaBrowser.ServerApplication.IO +namespace MediaBrowser.Common.Implementations.IO { /// /// Class CommonFileSystem @@ -13,9 +13,12 @@ namespace MediaBrowser.ServerApplication.IO { protected ILogger Logger; - public CommonFileSystem(ILogger logger) + private readonly bool _supportsAsyncFileStreams; + + public CommonFileSystem(ILogger logger, bool supportsAsyncFileStreams) { Logger = logger; + _supportsAsyncFileStreams = supportsAsyncFileStreams; } /// @@ -164,8 +167,56 @@ namespace MediaBrowser.ServerApplication.IO return DateTime.MinValue; } } - } + /// + /// Gets the creation time UTC. + /// + /// The info. + /// The logger. + /// DateTime. + public DateTime GetLastWriteTimeUtc(FileSystemInfo info) + { + // This could throw an error on some file systems that have dates out of range + try + { + return info.LastWriteTimeUtc; + } + catch (Exception ex) + { + Logger.ErrorException("Error determining LastAccessTimeUtc for {0}", ex, info.FullName); + return DateTime.MinValue; + } + } + + /// + /// Gets the last write time UTC. + /// + /// The path. + /// DateTime. + public DateTime GetLastWriteTimeUtc(string path) + { + return GetLastWriteTimeUtc(GetFileSystemInfo(path)); + } + + /// + /// Gets the file stream. + /// + /// The path. + /// The mode. + /// The access. + /// The share. + /// if set to true [is asynchronous]. + /// FileStream. + public FileStream GetFileStream(string path, FileMode mode, FileAccess access, FileShare share, bool isAsync = false) + { + if (_supportsAsyncFileStreams && isAsync) + { + return new FileStream(path, mode, access, share, 4096, true); + } + + return new FileStream(path, mode, access, share); + } + } /// /// Adapted from http://stackoverflow.com/questions/309495/windows-shortcut-lnk-parser-in-java diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index c17a549acc..9e48f3b3e9 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -69,6 +69,7 @@ + diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs index 812269ea8a..e04cadfc5a 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs @@ -1,12 +1,13 @@ using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.IO; using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Logging; namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks { @@ -23,14 +24,17 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks private readonly ILogger _logger; + private readonly IFileSystem _fileSystem; + /// /// Initializes a new instance of the class. /// /// The app paths. - public DeleteCacheFileTask(IApplicationPaths appPaths, ILogger logger) + public DeleteCacheFileTask(IApplicationPaths appPaths, ILogger logger, IFileSystem fileSystem) { ApplicationPaths = appPaths; _logger = logger; + _fileSystem = fileSystem; } /// @@ -94,7 +98,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks private void DeleteCacheFilesFromDirectory(CancellationToken cancellationToken, string directory, DateTime minDateModified, IProgress progress) { var filesToDelete = new DirectoryInfo(directory).EnumerateFiles("*", SearchOption.AllDirectories) - .Where(f => f.LastWriteTimeUtc < minDateModified) + .Where(f => _fileSystem.GetLastWriteTimeUtc(f) < minDateModified) .ToList(); var index = 0; diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs index bfd626adbc..7c7833ae64 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.IO; using MediaBrowser.Common.ScheduledTasks; using System; using System.Collections.Generic; @@ -20,13 +21,16 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks /// The configuration manager. private IConfigurationManager ConfigurationManager { get; set; } + private readonly IFileSystem _fileSystem; + /// /// Initializes a new instance of the class. /// /// The configuration manager. - public DeleteLogFileTask(IConfigurationManager configurationManager) + public DeleteLogFileTask(IConfigurationManager configurationManager, IFileSystem fileSystem) { ConfigurationManager = configurationManager; + _fileSystem = fileSystem; } /// @@ -58,7 +62,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks var minDateModified = DateTime.UtcNow.AddDays(-(ConfigurationManager.CommonConfiguration.LogFileRetentionDays)); var filesToDelete = new DirectoryInfo(ConfigurationManager.CommonApplicationPaths.LogDirectoryPath).EnumerateFileSystemInfos("*", SearchOption.AllDirectories) - .Where(f => f.LastWriteTimeUtc < minDateModified) + .Where(f => _fileSystem.GetLastWriteTimeUtc(f) < minDateModified) .ToList(); var index = 0; diff --git a/MediaBrowser.Controller/IO/IFileSystem.cs b/MediaBrowser.Common/IO/IFileSystem.cs similarity index 61% rename from MediaBrowser.Controller/IO/IFileSystem.cs rename to MediaBrowser.Common/IO/IFileSystem.cs index cbc5c7bf34..d307b74e5d 100644 --- a/MediaBrowser.Controller/IO/IFileSystem.cs +++ b/MediaBrowser.Common/IO/IFileSystem.cs @@ -1,7 +1,7 @@ using System; using System.IO; -namespace MediaBrowser.Controller.IO +namespace MediaBrowser.Common.IO { /// /// Interface IFileSystem @@ -49,5 +49,30 @@ namespace MediaBrowser.Controller.IO /// The info. /// DateTime. DateTime GetCreationTimeUtc(FileSystemInfo info); + + /// + /// Gets the last write time UTC. + /// + /// The information. + /// DateTime. + DateTime GetLastWriteTimeUtc(FileSystemInfo info); + + /// + /// Gets the last write time UTC. + /// + /// The path. + /// DateTime. + DateTime GetLastWriteTimeUtc(string path); + + /// + /// Gets the file stream. + /// + /// The path. + /// The mode. + /// The access. + /// The share. + /// if set to true [is asynchronous]. + /// FileStream. + FileStream GetFileStream(string path, FileMode mode, FileAccess access, FileShare share, bool isAsync = false); } } diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 8acd1a83cb..f4d759a4d1 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -60,6 +60,7 @@ + diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index f1937a4616..839fe34ffe 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.IO; @@ -1737,7 +1738,7 @@ namespace MediaBrowser.Controller.Entities if (locationType == LocationType.Remote || locationType == LocationType.Virtual) { - return File.GetLastWriteTimeUtc(imagePath); + return FileSystem.GetLastWriteTimeUtc(imagePath); } var metaFileEntry = ResolveArgs.GetMetaFileByPath(imagePath); @@ -1754,7 +1755,7 @@ namespace MediaBrowser.Controller.Entities } // See if we can avoid a file system lookup by looking for the file in ResolveArgs - return metaFileEntry == null ? File.GetLastWriteTimeUtc(imagePath) : metaFileEntry.LastWriteTimeUtc; + return metaFileEntry == null ? FileSystem.GetLastWriteTimeUtc(imagePath) : FileSystem.GetLastWriteTimeUtc(metaFileEntry); } } } diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 9d85399067..06f50e552b 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -165,7 +165,7 @@ namespace MediaBrowser.Controller.Entities // Ensure it's been lazy loaded var config = Configuration; - return File.GetLastWriteTimeUtc(ConfigurationFilePath); + return FileSystem.GetLastWriteTimeUtc(ConfigurationFilePath); } } diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs index 726467fa6a..270afd89a1 100644 --- a/MediaBrowser.Controller/IO/FileData.cs +++ b/MediaBrowser.Controller/IO/FileData.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Library; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/IO/FileSystem.cs b/MediaBrowser.Controller/IO/FileSystem.cs deleted file mode 100644 index b08e8da274..0000000000 --- a/MediaBrowser.Controller/IO/FileSystem.cs +++ /dev/null @@ -1,71 +0,0 @@ -using MediaBrowser.Model.Logging; -using System; -using System.IO; - -namespace MediaBrowser.Controller.IO -{ - /// - /// Class FileSystem - /// - public static class FileSystem - { - /// - /// Gets the creation time UTC. - /// - /// The info. - /// The logger. - /// DateTime. - public static DateTime GetLastWriteTimeUtc(FileSystemInfo info, ILogger logger) - { - // This could throw an error on some file systems that have dates out of range - - try - { - return info.LastWriteTimeUtc; - } - catch (Exception ex) - { - logger.ErrorException("Error determining LastAccessTimeUtc for {0}", ex, info.FullName); - return DateTime.MinValue; - } - } - - /// - /// Copies all. - /// - /// The source. - /// The target. - /// source - /// The source and target directories are the same - public static void CopyAll(string source, string target) - { - if (string.IsNullOrEmpty(source)) - { - throw new ArgumentNullException("source"); - } - if (string.IsNullOrEmpty(target)) - { - throw new ArgumentNullException("target"); - } - - if (source.Equals(target, StringComparison.OrdinalIgnoreCase)) - { - throw new ArgumentException("The source and target directories are the same"); - } - - // Check if the target directory exists, if not, create it. - Directory.CreateDirectory(target); - - foreach (var file in Directory.EnumerateFiles(source)) - { - File.Copy(file, Path.Combine(target, Path.GetFileName(file)), true); - } - - // Copy each subdirectory using recursion. - foreach (var dir in Directory.EnumerateDirectories(source)) - { - CopyAll(dir, Path.Combine(target, Path.GetFileName(dir))); - } - } - } -} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index c379714aa3..978d56bd4e 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -94,7 +94,6 @@ - @@ -141,7 +140,6 @@ - diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index 87036df84e..fd1b12c2f2 100644 --- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs +++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -35,6 +36,8 @@ namespace MediaBrowser.Controller.MediaInfo private readonly ILogger _logger; private readonly IItemRepository _itemRepo; + private readonly IFileSystem _fileSystem; + /// /// Initializes a new instance of the class. /// @@ -43,12 +46,13 @@ namespace MediaBrowser.Controller.MediaInfo /// The logger. /// The item repo. /// zipClient - public FFMpegManager(IServerApplicationPaths appPaths, IMediaEncoder encoder, ILogger logger, IItemRepository itemRepo) + public FFMpegManager(IServerApplicationPaths appPaths, IMediaEncoder encoder, ILogger logger, IItemRepository itemRepo, IFileSystem fileSystem) { _appPaths = appPaths; _encoder = encoder; _logger = logger; _itemRepo = itemRepo; + _fileSystem = fileSystem; VideoImageCache = new FileSystemRepository(VideoImagesDataPath); SubtitleCache = new FileSystemRepository(SubtitleCachePath); @@ -203,7 +207,7 @@ namespace MediaBrowser.Controller.MediaInfo if (stream.IsExternal) { - ticksParam += File.GetLastWriteTimeUtc(stream.Path).Ticks; + ticksParam += _fileSystem.GetLastWriteTimeUtc(stream.Path).Ticks; } return SubtitleCache.GetResourcePath(input.Id + "_" + subtitleStreamIndex + "_" + input.DateModified.Ticks + ticksParam, outputExtension); diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs index 5d61e5eb9c..1e4fabc7c2 100644 --- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs +++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using System; @@ -149,7 +150,7 @@ namespace MediaBrowser.Controller.Resolvers item.DateCreated = fileSystem.GetCreationTimeUtc(childData); } - item.DateModified = childData.LastWriteTimeUtc; + item.DateModified = fileSystem.GetLastWriteTimeUtc(childData); } else { @@ -161,7 +162,7 @@ namespace MediaBrowser.Controller.Resolvers { item.DateCreated = fileSystem.GetCreationTimeUtc(fileData); } - item.DateModified = fileData.LastWriteTimeUtc; + item.DateModified = fileSystem.GetLastWriteTimeUtc(fileData); } } } @@ -171,7 +172,7 @@ namespace MediaBrowser.Controller.Resolvers { item.DateCreated = fileSystem.GetCreationTimeUtc(args.FileInfo); } - item.DateModified = args.FileInfo.LastWriteTimeUtc; + item.DateModified = fileSystem.GetLastWriteTimeUtc(args.FileInfo); } } } diff --git a/MediaBrowser.Mono.userprefs b/MediaBrowser.Mono.userprefs index 4378247fd4..f1260b1dad 100644 --- a/MediaBrowser.Mono.userprefs +++ b/MediaBrowser.Mono.userprefs @@ -1,25 +1,24 @@  - + - + + + - - - - - - + + + - + diff --git a/MediaBrowser.Providers/FolderProviderFromXml.cs b/MediaBrowser.Providers/FolderProviderFromXml.cs index 2a22d04482..449de7450d 100644 --- a/MediaBrowser.Providers/FolderProviderFromXml.cs +++ b/MediaBrowser.Providers/FolderProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; @@ -17,10 +18,12 @@ namespace MediaBrowser.Providers public class FolderProviderFromXml : BaseMetadataProvider { public static FolderProviderFromXml Current; + private readonly IFileSystem _fileSystem; - public FolderProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + public FolderProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { + _fileSystem = fileSystem; Current = this; } @@ -53,7 +56,7 @@ namespace MediaBrowser.Providers return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/Games/GameProviderFromXml.cs b/MediaBrowser.Providers/Games/GameProviderFromXml.cs index 44680b8328..724e3f5fa0 100644 --- a/MediaBrowser.Providers/Games/GameProviderFromXml.cs +++ b/MediaBrowser.Providers/Games/GameProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; @@ -13,15 +14,17 @@ namespace MediaBrowser.Providers.Games { public class GameProviderFromXml : BaseMetadataProvider { + private readonly IFileSystem _fileSystem; + /// /// /// /// /// - public GameProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + public GameProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { - + _fileSystem = fileSystem; } /// @@ -45,7 +48,7 @@ namespace MediaBrowser.Providers.Games return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs b/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs index 526170db54..0c9d55a094 100644 --- a/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs +++ b/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; @@ -14,10 +15,12 @@ namespace MediaBrowser.Providers.Games public class GameSystemProviderFromXml : BaseMetadataProvider { internal static GameSystemProviderFromXml Current { get; private set; } + private readonly IFileSystem _fileSystem; - public GameSystemProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + public GameSystemProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { + _fileSystem = fileSystem; Current = this; } @@ -50,7 +53,7 @@ namespace MediaBrowser.Providers.Games return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/ImagesByNameProvider.cs b/MediaBrowser.Providers/ImagesByNameProvider.cs index 8c5b3635d1..6be4ee108b 100644 --- a/MediaBrowser.Providers/ImagesByNameProvider.cs +++ b/MediaBrowser.Providers/ImagesByNameProvider.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; @@ -113,7 +114,7 @@ namespace MediaBrowser.Providers return files.Select(f => { - var lastWriteTime = FileSystem.GetLastWriteTimeUtc(f, Logger); + var lastWriteTime = _fileSystem.GetLastWriteTimeUtc(f); var creationTime = _fileSystem.GetCreationTimeUtc(f); return creationTime > lastWriteTime ? creationTime : lastWriteTime; diff --git a/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs b/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs index e697738fe5..0b2502ba9f 100644 --- a/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.IO; @@ -18,10 +19,12 @@ namespace MediaBrowser.Providers.Movies public class BoxSetProviderFromXml : BaseMetadataProvider { public static BoxSetProviderFromXml Current; + private readonly IFileSystem _fileSystem; - public BoxSetProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + public BoxSetProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { + _fileSystem = fileSystem; Current = this; } @@ -54,7 +57,7 @@ namespace MediaBrowser.Providers.Movies return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs index 3732d6b8ef..3458622d34 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -40,6 +41,7 @@ namespace MediaBrowser.Providers.Movies private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); internal static FanArtMovieProvider Current { get; private set; } + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -49,7 +51,7 @@ namespace MediaBrowser.Providers.Movies /// The configuration manager. /// The provider manager. /// httpClient - public FanArtMovieProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public FanArtMovieProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { if (httpClient == null) @@ -58,6 +60,7 @@ namespace MediaBrowser.Providers.Movies } HttpClient = httpClient; _providerManager = providerManager; + _fileSystem = fileSystem; Current = this; } @@ -174,7 +177,7 @@ namespace MediaBrowser.Providers.Movies { var files = new DirectoryInfo(path) .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) + .Select(i => _fileSystem.GetLastWriteTimeUtc(i)) .ToList(); if (files.Count > 0) @@ -275,7 +278,7 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false)) { - using (var xmlFileStream = new FileStream(xmlPath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var xmlFileStream = _fileSystem.GetFileStream(xmlPath, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs index 51b77599e2..706dffa7e0 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; @@ -32,15 +33,17 @@ namespace MediaBrowser.Providers.Movies /// private readonly IServerConfigurationManager _config; private readonly IJsonSerializer _jsonSerializer; + private readonly IFileSystem _fileSystem; private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); - public FanArtMovieUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient) + public FanArtMovieUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient, IFileSystem fileSystem) { _jsonSerializer = jsonSerializer; _config = config; _logger = logger; _httpClient = httpClient; + _fileSystem = fileSystem; } /// @@ -66,7 +69,7 @@ namespace MediaBrowser.Providers.Movies var timestampFileInfo = new FileInfo(timestampFile); // Don't check for tvdb updates anymore frequently than 24 hours - if (timestampFileInfo.Exists && (DateTime.UtcNow - timestampFileInfo.LastWriteTimeUtc).TotalDays < 1) + if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1) { return; } diff --git a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs index 0fd61a96be..f2504da9ab 100644 --- a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; @@ -21,11 +22,6 @@ namespace MediaBrowser.Providers.Movies /// public class MovieDbImagesProvider : BaseMetadataProvider { - /// - /// The get images - /// - private const string GetImages = @"http://api.themoviedb.org/3/{2}/{0}/images?api_key={1}"; - /// /// The _provider manager /// @@ -35,6 +31,7 @@ namespace MediaBrowser.Providers.Movies /// The _json serializer /// private readonly IJsonSerializer _jsonSerializer; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -43,11 +40,12 @@ namespace MediaBrowser.Providers.Movies /// The configuration manager. /// The provider manager. /// The json serializer. - public MovieDbImagesProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IJsonSerializer jsonSerializer) + public MovieDbImagesProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IJsonSerializer jsonSerializer, IFileSystem fileSystem) : base(logManager, configurationManager) { _providerManager = providerManager; _jsonSerializer = jsonSerializer; + _fileSystem = fileSystem; } /// @@ -163,7 +161,7 @@ namespace MediaBrowser.Providers.Movies if (fileInfo.Exists) { - return fileInfo.LastWriteTimeUtc > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(fileInfo) > providerInfo.LastRefreshed; } } diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 63a237d2c8..d7b7faeea7 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; @@ -47,6 +48,7 @@ namespace MediaBrowser.Providers.Movies /// /// The HTTP client. protected IHttpClient HttpClient { get; private set; } + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -56,12 +58,13 @@ namespace MediaBrowser.Providers.Movies /// The json serializer. /// The HTTP client. /// The provider manager. - public MovieDbProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IHttpClient httpClient, IProviderManager providerManager) + public MovieDbProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IHttpClient httpClient, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { JsonSerializer = jsonSerializer; HttpClient = httpClient; ProviderManager = providerManager; + _fileSystem = fileSystem; Current = this; } @@ -216,7 +219,7 @@ namespace MediaBrowser.Providers.Movies if (fileInfo.Exists) { - return fileInfo.LastWriteTimeUtc > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(fileInfo) > providerInfo.LastRefreshed; } return true; diff --git a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs b/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs index ed92151c75..dfab655f10 100644 --- a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs @@ -1,7 +1,7 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -21,11 +21,13 @@ namespace MediaBrowser.Providers.Movies { internal static MovieProviderFromXml Current { get; private set; } private readonly IItemRepository _itemRepo; + private readonly IFileSystem _fileSystem; - public MovieProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IItemRepository itemRepo) + public MovieProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IItemRepository itemRepo, IFileSystem fileSystem) : base(logManager, configurationManager) { _itemRepo = itemRepo; + _fileSystem = fileSystem; Current = this; } @@ -71,7 +73,7 @@ namespace MediaBrowser.Providers.Movies return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs b/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs index b5d2646829..4c1838cfc5 100644 --- a/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Common.Progress; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; @@ -35,6 +36,7 @@ namespace MediaBrowser.Providers.Movies /// private readonly IServerConfigurationManager _config; private readonly IJsonSerializer _json; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -43,12 +45,13 @@ namespace MediaBrowser.Providers.Movies /// The HTTP client. /// The config. /// The json. - public MovieUpdatesPreScanTask(ILogger logger, IHttpClient httpClient, IServerConfigurationManager config, IJsonSerializer json) + public MovieUpdatesPreScanTask(ILogger logger, IHttpClient httpClient, IServerConfigurationManager config, IJsonSerializer json, IFileSystem fileSystem) { _logger = logger; _httpClient = httpClient; _config = config; _json = json; + _fileSystem = fileSystem; } protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -100,7 +103,7 @@ namespace MediaBrowser.Providers.Movies var refreshDays = _config.Configuration.EnableTmdbUpdates ? 1 : 7; // Don't check for tvdb updates anymore frequently than 24 hours - if (timestampFileInfo.Exists && (DateTime.UtcNow - timestampFileInfo.LastWriteTimeUtc).TotalDays < refreshDays) + if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < refreshDays) { return; } diff --git a/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs index ab90675fd7..8de061b99b 100644 --- a/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; @@ -13,10 +14,12 @@ namespace MediaBrowser.Providers.Movies class PersonProviderFromXml : BaseMetadataProvider { internal static PersonProviderFromXml Current { get; private set; } + private readonly IFileSystem _fileSystem; - public PersonProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + public PersonProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { + _fileSystem = fileSystem; Current = this; } @@ -49,7 +52,7 @@ namespace MediaBrowser.Providers.Movies return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs b/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs index d6cc39c86d..8a5e6bd9dc 100644 --- a/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs +++ b/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; @@ -34,6 +35,7 @@ namespace MediaBrowser.Providers.Movies /// private readonly IServerConfigurationManager _config; private readonly IJsonSerializer _json; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -41,12 +43,13 @@ namespace MediaBrowser.Providers.Movies /// The logger. /// The HTTP client. /// The config. - public PersonUpdatesPreScanTask(ILogger logger, IHttpClient httpClient, IServerConfigurationManager config, IJsonSerializer json) + public PersonUpdatesPreScanTask(ILogger logger, IHttpClient httpClient, IServerConfigurationManager config, IJsonSerializer json, IFileSystem fileSystem) { _logger = logger; _httpClient = httpClient; _config = config; _json = json; + _fileSystem = fileSystem; } protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -74,7 +77,7 @@ namespace MediaBrowser.Providers.Movies var timestampFileInfo = new FileInfo(timestampFile); // Don't check for tvdb updates anymore frequently than 24 hours - if (timestampFileInfo.Exists && (DateTime.UtcNow - timestampFileInfo.LastWriteTimeUtc).TotalDays < 1) + if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1) { return; } diff --git a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs index 4a5db1d81a..52f5ddab5c 100644 --- a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs +++ b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -30,8 +31,9 @@ namespace MediaBrowser.Providers.Movies internal static TmdbPersonProvider Current { get; private set; } const string DataFileName = "info.json"; + private readonly IFileSystem _fileSystem; - public TmdbPersonProvider(IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public TmdbPersonProvider(IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { if (jsonSerializer == null) @@ -40,6 +42,7 @@ namespace MediaBrowser.Providers.Movies } JsonSerializer = jsonSerializer; ProviderManager = providerManager; + _fileSystem = fileSystem; Current = this; } @@ -105,7 +108,7 @@ namespace MediaBrowser.Providers.Movies if (fileInfo.Exists) { - return fileInfo.LastWriteTimeUtc > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(fileInfo) > providerInfo.LastRefreshed; } return true; @@ -270,7 +273,7 @@ namespace MediaBrowser.Providers.Movies { Directory.CreateDirectory(personDataPath); - using (var fs = new FileStream(Path.Combine(personDataPath, DataFileName), FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fs = _fileSystem.GetFileStream(Path.Combine(personDataPath, DataFileName), FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await json.CopyToAsync(fs).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs b/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs index 9353d4565c..99cf925e57 100644 --- a/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs +++ b/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.IO; @@ -15,10 +16,12 @@ namespace MediaBrowser.Providers.Music class ArtistProviderFromXml : BaseMetadataProvider { public static ArtistProviderFromXml Current; + private readonly IFileSystem _fileSystem; - public ArtistProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + public ArtistProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { + _fileSystem = fileSystem; Current = this; } @@ -51,7 +54,7 @@ namespace MediaBrowser.Providers.Music return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs index e454b048c9..d6c7f1dfd7 100644 --- a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; @@ -37,6 +38,7 @@ namespace MediaBrowser.Providers.Music protected IHttpClient HttpClient { get; private set; } internal static FanArtAlbumProvider Current { get; private set; } + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -45,10 +47,11 @@ namespace MediaBrowser.Providers.Music /// The log manager. /// The configuration manager. /// The provider manager. - public FanArtAlbumProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public FanArtAlbumProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { _providerManager = providerManager; + _fileSystem = fileSystem; HttpClient = httpClient; Current = this; @@ -140,7 +143,7 @@ namespace MediaBrowser.Providers.Music if (file.Exists) { - return file.LastWriteTimeUtc; + return _fileSystem.GetLastWriteTimeUtc(file); } } diff --git a/MediaBrowser.Providers/Music/FanArtArtistByNameProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistByNameProvider.cs index f0dd460e6c..5d18f16ffa 100644 --- a/MediaBrowser.Providers/Music/FanArtArtistByNameProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtArtistByNameProvider.cs @@ -1,7 +1,9 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; @@ -15,12 +17,8 @@ namespace MediaBrowser.Providers.Music /// /// Initializes a new instance of the class. /// - /// The HTTP client. - /// The log manager. - /// The configuration manager. - /// The provider manager. - public FanArtArtistByNameProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) - : base(httpClient, logManager, configurationManager, providerManager) + public FanArtArtistByNameProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) + : base(httpClient, logManager, configurationManager, providerManager, fileSystem) { } diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs index 79d53d5785..b1d97d8b59 100644 --- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs @@ -1,24 +1,23 @@ -using System.Net; -using MediaBrowser.Common.Configuration; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Net; using System; -using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Net; using System.Threading; using System.Threading.Tasks; using System.Xml; -using MediaBrowser.Model.Net; namespace MediaBrowser.Providers.Music { @@ -39,6 +38,7 @@ namespace MediaBrowser.Providers.Music private readonly IProviderManager _providerManager; internal static FanArtArtistProvider Current; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -48,7 +48,7 @@ namespace MediaBrowser.Providers.Music /// The configuration manager. /// The provider manager. /// httpClient - public FanArtArtistProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public FanArtArtistProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { if (httpClient == null) @@ -57,6 +57,7 @@ namespace MediaBrowser.Providers.Music } HttpClient = httpClient; _providerManager = providerManager; + _fileSystem = fileSystem; Current = this; } @@ -167,7 +168,7 @@ namespace MediaBrowser.Providers.Music { var files = new DirectoryInfo(path) .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) + .Select(i => _fileSystem.GetLastWriteTimeUtc(i)) .ToList(); if (files.Count > 0) @@ -284,7 +285,7 @@ namespace MediaBrowser.Providers.Music }).ConfigureAwait(false)) { - using (var xmlFileStream = new FileStream(xmlPath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var xmlFileStream = _fileSystem.GetFileStream(xmlPath, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs b/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs index 379866945a..6d9a16e874 100644 --- a/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; @@ -31,15 +32,17 @@ namespace MediaBrowser.Providers.Music /// private readonly IServerConfigurationManager _config; private readonly IJsonSerializer _jsonSerializer; + private readonly IFileSystem _fileSystem; private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); - public FanArtUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient) + public FanArtUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient, IFileSystem fileSystem) { _jsonSerializer = jsonSerializer; _config = config; _logger = logger; _httpClient = httpClient; + _fileSystem = fileSystem; } /// @@ -65,7 +68,7 @@ namespace MediaBrowser.Providers.Music var timestampFileInfo = new FileInfo(timestampFile); // Don't check for tvdb updates anymore frequently than 24 hours - if (timestampFileInfo.Exists && (DateTime.UtcNow - timestampFileInfo.LastWriteTimeUtc).TotalDays < 1) + if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1) { return; } diff --git a/MediaBrowser.Providers/RefreshIntrosTask.cs b/MediaBrowser.Providers/RefreshIntrosTask.cs index 5d87dc90f8..3ecddf6130 100644 --- a/MediaBrowser.Providers/RefreshIntrosTask.cs +++ b/MediaBrowser.Providers/RefreshIntrosTask.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.IO; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using System; diff --git a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs b/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs index 9862f10fee..b6fdaaa831 100644 --- a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs +++ b/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.IO; @@ -20,11 +21,13 @@ namespace MediaBrowser.Providers.TV { internal static EpisodeProviderFromXml Current { get; private set; } private readonly IItemRepository _itemRepo; + private readonly IFileSystem _fileSystem; - public EpisodeProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IItemRepository itemRepo) + public EpisodeProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IItemRepository itemRepo, IFileSystem fileSystem) : base(logManager, configurationManager) { _itemRepo = itemRepo; + _fileSystem = fileSystem; Current = this; } @@ -76,7 +79,7 @@ namespace MediaBrowser.Providers.TV return false; } - return FileSystem.GetLastWriteTimeUtc(file, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(file) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs b/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs index dd87db5b5c..fe316e85b7 100644 --- a/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs +++ b/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; @@ -22,6 +23,7 @@ namespace MediaBrowser.Providers.TV /// The _provider manager /// private readonly IProviderManager _providerManager; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -29,10 +31,11 @@ namespace MediaBrowser.Providers.TV /// The log manager. /// The configuration manager. /// The provider manager. - public FanArtSeasonProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public FanArtSeasonProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { _providerManager = providerManager; + _fileSystem = fileSystem; } public override ItemUpdateType ItemUpdateType @@ -76,7 +79,7 @@ namespace MediaBrowser.Providers.TV if (imagesFileInfo.Exists) { - return imagesFileInfo.LastWriteTimeUtc; + return _fileSystem.GetLastWriteTimeUtc(imagesFileInfo); } } diff --git a/MediaBrowser.Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Providers/TV/FanArtTVProvider.cs index ed7ca941c2..af89bc205e 100644 --- a/MediaBrowser.Providers/TV/FanArtTVProvider.cs +++ b/MediaBrowser.Providers/TV/FanArtTVProvider.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -31,8 +32,9 @@ namespace MediaBrowser.Providers.TV protected IHttpClient HttpClient { get; private set; } private readonly IProviderManager _providerManager; + private readonly IFileSystem _fileSystem; - public FanArtTvProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public FanArtTvProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { if (httpClient == null) @@ -41,6 +43,7 @@ namespace MediaBrowser.Providers.TV } HttpClient = httpClient; _providerManager = providerManager; + _fileSystem = fileSystem; Current = this; } @@ -115,7 +118,7 @@ namespace MediaBrowser.Providers.TV { var files = new DirectoryInfo(path) .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) + .Select(i => _fileSystem.GetLastWriteTimeUtc(i)) .ToList(); if (files.Count > 0) @@ -353,7 +356,7 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - using (var xmlFileStream = new FileStream(xmlPath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var xmlFileStream = _fileSystem.GetFileStream(xmlPath, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs b/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs index 2a8e019741..5c1c7a69d9 100644 --- a/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; @@ -32,15 +33,17 @@ namespace MediaBrowser.Providers.TV /// private readonly IServerConfigurationManager _config; private readonly IJsonSerializer _jsonSerializer; + private readonly IFileSystem _fileSystem; private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); - public FanArtTvUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient) + public FanArtTvUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient, IFileSystem fileSystem) { _jsonSerializer = jsonSerializer; _config = config; _logger = logger; _httpClient = httpClient; + _fileSystem = fileSystem; } /// @@ -66,7 +69,7 @@ namespace MediaBrowser.Providers.TV var timestampFileInfo = new FileInfo(timestampFile); // Don't check for tvdb updates anymore frequently than 24 hours - if (timestampFileInfo.Exists && (DateTime.UtcNow - timestampFileInfo.LastWriteTimeUtc).TotalDays < 1) + if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1) { return; } diff --git a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs index 7ac51e76d8..cc6bca0b3f 100644 --- a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; @@ -36,6 +37,7 @@ namespace MediaBrowser.Providers.TV /// /// The HTTP client. protected IHttpClient HttpClient { get; private set; } + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -44,11 +46,12 @@ namespace MediaBrowser.Providers.TV /// The log manager. /// The configuration manager. /// The provider manager. - public RemoteEpisodeProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public RemoteEpisodeProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { HttpClient = httpClient; _providerManager = providerManager; + _fileSystem = fileSystem; } /// @@ -149,7 +152,7 @@ namespace MediaBrowser.Providers.TV if (files.Count > 0) { - return files.Select(i => i.LastWriteTimeUtc).Max() > providerInfo.LastRefreshed; + return files.Select(i => _fileSystem.GetLastWriteTimeUtc(i)).Max() > providerInfo.LastRefreshed; } } diff --git a/MediaBrowser.Providers/TV/RemoteSeasonProvider.cs b/MediaBrowser.Providers/TV/RemoteSeasonProvider.cs index 4eba7dbb4e..1f702a2d21 100644 --- a/MediaBrowser.Providers/TV/RemoteSeasonProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteSeasonProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; @@ -23,6 +24,7 @@ namespace MediaBrowser.Providers.TV /// The _provider manager /// private readonly IProviderManager _providerManager; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -31,10 +33,11 @@ namespace MediaBrowser.Providers.TV /// The configuration manager. /// The provider manager. /// httpClient - public RemoteSeasonProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public RemoteSeasonProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { _providerManager = providerManager; + _fileSystem = fileSystem; } /// @@ -115,7 +118,7 @@ namespace MediaBrowser.Providers.TV if (imagesFileInfo.Exists) { - return imagesFileInfo.LastWriteTimeUtc > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(imagesFileInfo) > providerInfo.LastRefreshed; } } return false; diff --git a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs index 5d518c0ea2..3e2736cbca 100644 --- a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -49,6 +50,8 @@ namespace MediaBrowser.Providers.TV /// The HTTP client. protected IHttpClient HttpClient { get; private set; } + private readonly IFileSystem _fileSystem; + /// /// Initializes a new instance of the class. /// @@ -57,7 +60,7 @@ namespace MediaBrowser.Providers.TV /// The configuration manager. /// The zip client. /// httpClient - public RemoteSeriesProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IZipClient zipClient) + public RemoteSeriesProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IZipClient zipClient, IFileSystem fileSystem) : base(logManager, configurationManager) { if (httpClient == null) @@ -66,6 +69,7 @@ namespace MediaBrowser.Providers.TV } HttpClient = httpClient; _zipClient = zipClient; + _fileSystem = fileSystem; Current = this; } @@ -176,7 +180,7 @@ namespace MediaBrowser.Providers.TV { var files = new DirectoryInfo(path) .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) + .Select(i => _fileSystem.GetLastWriteTimeUtc(i)) .ToList(); if (files.Count > 0) @@ -344,7 +348,7 @@ namespace MediaBrowser.Providers.TV { string validXml; - using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fileStream = _fileSystem.GetFileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { using (var reader = new StreamReader(fileStream)) { @@ -354,7 +358,7 @@ namespace MediaBrowser.Providers.TV } } - using (var fileStream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fileStream = _fileSystem.GetFileStream(file, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { using (var writer = new StreamWriter(fileStream)) { diff --git a/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs b/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs index 0c8fcf066c..5f1eb5cb3f 100644 --- a/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs +++ b/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.IO; @@ -18,10 +19,12 @@ namespace MediaBrowser.Providers.TV public class SeasonProviderFromXml : BaseMetadataProvider { public static SeasonProviderFromXml Current; + private readonly IFileSystem _fileSystem; - public SeasonProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + public SeasonProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { + _fileSystem = fileSystem; Current = this; } @@ -54,7 +57,7 @@ namespace MediaBrowser.Providers.TV return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs b/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs index 67d6e423c9..c4b82d51eb 100644 --- a/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs +++ b/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.IO; @@ -18,10 +19,12 @@ namespace MediaBrowser.Providers.TV public class SeriesProviderFromXml : BaseMetadataProvider { internal static SeriesProviderFromXml Current { get; private set; } - - public SeriesProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + private readonly IFileSystem _fileSystem; + + public SeriesProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem) : base(logManager, configurationManager) { + _fileSystem = fileSystem; Current = this; } @@ -54,7 +57,7 @@ namespace MediaBrowser.Providers.TV return false; } - return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; + return _fileSystem.GetLastWriteTimeUtc(xml) > providerInfo.LastRefreshed; } /// diff --git a/MediaBrowser.Providers/TV/TvdbPrescanTask.cs b/MediaBrowser.Providers/TV/TvdbPrescanTask.cs index 94f857d9c9..4926b92f73 100644 --- a/MediaBrowser.Providers/TV/TvdbPrescanTask.cs +++ b/MediaBrowser.Providers/TV/TvdbPrescanTask.cs @@ -1,4 +1,5 @@ using System.Globalization; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; @@ -42,6 +43,7 @@ namespace MediaBrowser.Providers.TV /// The _config /// private readonly IServerConfigurationManager _config; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -49,11 +51,12 @@ namespace MediaBrowser.Providers.TV /// The logger. /// The HTTP client. /// The config. - public TvdbPrescanTask(ILogger logger, IHttpClient httpClient, IServerConfigurationManager config) + public TvdbPrescanTask(ILogger logger, IHttpClient httpClient, IServerConfigurationManager config, IFileSystem fileSystem) { _logger = logger; _httpClient = httpClient; _config = config; + _fileSystem = fileSystem; } protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -81,7 +84,7 @@ namespace MediaBrowser.Providers.TV var timestampFileInfo = new FileInfo(timestampFile); // Don't check for tvdb updates anymore frequently than 24 hours - if (timestampFileInfo.Exists && (DateTime.UtcNow - timestampFileInfo.LastWriteTimeUtc).TotalDays < 1) + if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1) { return; } diff --git a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs index cc8e970400..2e19a853db 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs @@ -1,7 +1,9 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -30,6 +32,7 @@ namespace MediaBrowser.Providers.TV /// The _provider manager /// private readonly IProviderManager _providerManager; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -39,7 +42,7 @@ namespace MediaBrowser.Providers.TV /// The configuration manager. /// The provider manager. /// httpClient - public TvdbSeriesImageProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) + public TvdbSeriesImageProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { if (httpClient == null) @@ -48,6 +51,7 @@ namespace MediaBrowser.Providers.TV } HttpClient = httpClient; _providerManager = providerManager; + _fileSystem = fileSystem; } /// @@ -127,7 +131,7 @@ namespace MediaBrowser.Providers.TV if (imagesFileInfo.Exists) { - return imagesFileInfo.LastWriteTimeUtc; + return _fileSystem.GetLastWriteTimeUtc(imagesFileInfo); } } diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageHeader.cs b/MediaBrowser.Server.Implementations/Drawing/ImageHeader.cs index 4da836cc68..f9cf90787d 100644 --- a/MediaBrowser.Server.Implementations/Drawing/ImageHeader.cs +++ b/MediaBrowser.Server.Implementations/Drawing/ImageHeader.cs @@ -1,4 +1,6 @@ -using MediaBrowser.Model.Logging; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.IO; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.Drawing; @@ -40,9 +42,10 @@ namespace MediaBrowser.Server.Implementations.Drawing /// /// The path of the image to get the dimensions of. /// The logger. + /// The file system. /// The dimensions of the specified image. /// The image was of an unrecognised format. - public static Size GetDimensions(string path, ILogger logger) + public static Size GetDimensions(string path, ILogger logger, IFileSystem fileSystem) { try { @@ -60,7 +63,7 @@ namespace MediaBrowser.Server.Implementations.Drawing } // Buffer to memory stream to avoid image locking file - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) + using (var fs = fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (var memoryStream = new MemoryStream()) { diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs index 95a6448023..ace633be71 100644 --- a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs +++ b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Entities; @@ -51,16 +52,18 @@ namespace MediaBrowser.Server.Implementations.Drawing /// The _app paths /// private readonly IServerApplicationPaths _appPaths; + private readonly IFileSystem _fileSystem; private readonly string _imageSizeCachePath; private readonly string _croppedWhitespaceImageCachePath; private readonly string _enhancedImageCachePath; private readonly string _resizedImageCachePath; - public ImageProcessor(ILogger logger, IServerApplicationPaths appPaths) + public ImageProcessor(ILogger logger, IServerApplicationPaths appPaths, IFileSystem fileSystem) { _logger = logger; _appPaths = appPaths; + _fileSystem = fileSystem; _imageSizeCachePath = Path.Combine(_appPaths.ImageCachePath, "image-sizes"); _croppedWhitespaceImageCachePath = Path.Combine(_appPaths.ImageCachePath, "cropped-images"); @@ -113,7 +116,7 @@ namespace MediaBrowser.Server.Implementations.Drawing try { - using (var fileStream = new FileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { await fileStream.CopyToAsync(toStream).ConfigureAwait(false); return; @@ -131,7 +134,7 @@ namespace MediaBrowser.Server.Implementations.Drawing // Check again in case of lock contention try { - using (var fileStream = new FileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { await fileStream.CopyToAsync(toStream).ConfigureAwait(false); semaphore.Release(); @@ -150,7 +153,7 @@ namespace MediaBrowser.Server.Implementations.Drawing try { - using (var fileStream = new FileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fileStream = _fileSystem.GetFileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { // Copy to memory stream to avoid Image locking file using (var memoryStream = new MemoryStream()) @@ -228,7 +231,7 @@ namespace MediaBrowser.Server.Implementations.Drawing Directory.CreateDirectory(parentPath); // Save to the cache location - using (var cacheFileStream = new FileStream(cacheFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var cacheFileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { // Save to the filestream await cacheFileStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); @@ -359,7 +362,7 @@ namespace MediaBrowser.Server.Implementations.Drawing try { - using (var fileStream = new FileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fileStream = _fileSystem.GetFileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { // Copy to memory stream to avoid Image locking file using (var memoryStream = new MemoryStream()) @@ -376,7 +379,7 @@ namespace MediaBrowser.Server.Implementations.Drawing Directory.CreateDirectory(parentPath); - using (var outputStream = new FileStream(croppedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read)) + using (var outputStream = _fileSystem.GetFileStream(croppedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read, false)) { croppedImage.Save(outputFormat, outputStream, 100); } @@ -525,7 +528,7 @@ namespace MediaBrowser.Server.Implementations.Drawing // Cache file doesn't exist no biggie } - var size = ImageHeader.GetDimensions(path, _logger); + var size = ImageHeader.GetDimensions(path, _logger, _fileSystem); var parentPath = Path.GetDirectoryName(fullCachePath); @@ -685,7 +688,7 @@ namespace MediaBrowser.Server.Implementations.Drawing try { - using (var fileStream = new FileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fileStream = _fileSystem.GetFileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { // Copy to memory stream to avoid Image locking file using (var memoryStream = new MemoryStream()) @@ -702,7 +705,7 @@ namespace MediaBrowser.Server.Implementations.Drawing Directory.CreateDirectory(parentDirectory); //And then save it in the cache - using (var outputStream = new FileStream(enhancedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read)) + using (var outputStream = _fileSystem.GetFileStream(enhancedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read, false)) { newImage.Save(ImageFormat.Png, outputStream, 100); } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs index cb60975046..723e4fdd31 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs @@ -1,5 +1,7 @@ using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Notifications; using MediaBrowser.Controller.Plugins; @@ -26,11 +28,12 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications private readonly IJsonSerializer _json; private readonly INotificationsRepository _notificationsRepo; private readonly IUserManager _userManager; + private readonly IFileSystem _fileSystem; private readonly TimeSpan _frequency = TimeSpan.FromHours(6); private readonly TimeSpan _maxAge = TimeSpan.FromDays(31); - public RemoteNotifications(IApplicationPaths appPaths, ILogger logger, IHttpClient httpClient, IJsonSerializer json, INotificationsRepository notificationsRepo, IUserManager userManager) + public RemoteNotifications(IApplicationPaths appPaths, ILogger logger, IHttpClient httpClient, IJsonSerializer json, INotificationsRepository notificationsRepo, IUserManager userManager, IFileSystem fileSystem) { _appPaths = appPaths; _logger = logger; @@ -38,6 +41,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications _json = json; _notificationsRepo = notificationsRepo; _userManager = userManager; + _fileSystem = fileSystem; } /// @@ -56,7 +60,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications { var dataPath = Path.Combine(_appPaths.DataPath, "remotenotifications.json"); - var lastRunTime = File.Exists(dataPath) ? File.GetLastWriteTimeUtc(dataPath) : DateTime.MinValue; + var lastRunTime = File.Exists(dataPath) ? _fileSystem.GetLastWriteTimeUtc(dataPath) : DateTime.MinValue; try { diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs index 356c6fc4d4..e6942fae6a 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Logging; using ServiceStack.Common; using ServiceStack.Common.Web; @@ -25,13 +26,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// The _logger /// private readonly ILogger _logger; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. /// /// The log manager. - public HttpResultFactory(ILogManager logManager) + public HttpResultFactory(ILogManager logManager, IFileSystem fileSystem) { + _fileSystem = fileSystem; _logger = logManager.GetLogger("HttpResultFactory"); } @@ -288,7 +291,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer throw new ArgumentException("FileShare must be either Read or ReadWrite"); } - var dateModified = File.GetLastWriteTimeUtc(path); + var dateModified = _fileSystem.GetLastWriteTimeUtc(path); var cacheKey = path + dateModified.Ticks; @@ -303,7 +306,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// Stream. private Stream GetFileStream(string path, FileShare fileShare) { - return new FileStream(path, FileMode.Open, FileAccess.Read, fileShare, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous); + return _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, fileShare, true); } /// diff --git a/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs b/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs index 0ddd407cf0..330469877a 100644 --- a/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs +++ b/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; @@ -321,6 +322,18 @@ namespace MediaBrowser.Server.Implementations.IO /// The source of the event. /// The instance containing the event data. void watcher_Changed(object sender, FileSystemEventArgs e) + { + try + { + OnWatcherChanged(e); + } + catch (IOException ex) + { + Logger.ErrorException("IOException in watcher changed", ex); + } + } + + private void OnWatcherChanged(FileSystemEventArgs e) { var name = e.Name; @@ -437,7 +450,7 @@ namespace MediaBrowser.Server.Implementations.IO try { - using (new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) + using (_fileSystem.GetFileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { //file is not locked return false; diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 0c5d55a3b7..1aa9e5b9c1 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Progress; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Configuration; @@ -772,7 +773,7 @@ namespace MediaBrowser.Server.Implementations.Library Name = name, Id = id, DateCreated = _fileSystem.GetCreationTimeUtc(fileInfo), - DateModified = fileInfo.LastWriteTimeUtc, + DateModified = _fileSystem.GetLastWriteTimeUtc(fileInfo), Path = path }; isNew = true; diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs index 22bd2e0e6f..96057f8b7e 100644 --- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs +++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index c9777e54a6..0d428742ce 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -1,4 +1,6 @@ -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Globalization; @@ -30,13 +32,16 @@ namespace MediaBrowser.Server.Implementations.Localization private readonly ConcurrentDictionary> _allParentalRatings = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); + private readonly IFileSystem _fileSystem; + /// /// Initializes a new instance of the class. /// /// The configuration manager. - public LocalizationManager(IServerConfigurationManager configurationManager) + public LocalizationManager(IServerConfigurationManager configurationManager, IFileSystem fileSystem) { _configurationManager = configurationManager; + _fileSystem = fileSystem; ExtractAll(); } @@ -65,7 +70,7 @@ namespace MediaBrowser.Server.Implementations.Localization { using (var stream = type.Assembly.GetManifestResourceStream(resource)) { - using (var fs = new FileStream(Path.Combine(localizationPath, filename), FileMode.Create, FileAccess.Write, FileShare.Read)) + using (var fs = _fileSystem.GetFileStream(Path.Combine(localizationPath, filename), FileMode.Create, FileAccess.Write, FileShare.Read)) { stream.CopyTo(fs); } diff --git a/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs b/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs index 785bbca7c1..a66f9c56ba 100644 --- a/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs +++ b/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; @@ -53,6 +54,7 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder /// The FF probe resource pool /// private readonly SemaphoreSlim _ffProbeResourcePool = new SemaphoreSlim(1, 1); + private readonly IFileSystem _fileSystem; public string FFMpegPath { get; private set; } @@ -61,12 +63,13 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder public string Version { get; private set; } public MediaEncoder(ILogger logger, IApplicationPaths appPaths, - IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, string version) + IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, string version, IFileSystem fileSystem) { _logger = logger; _appPaths = appPaths; _jsonSerializer = jsonSerializer; Version = version; + _fileSystem = fileSystem; FFProbePath = ffProbePath; FFMpegPath = ffMpegPath; } @@ -458,8 +461,7 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder var logFilePath = Path.Combine(_appPaths.LogDirectoryPath, "ffmpeg-sub-convert-" + Guid.NewGuid() + ".txt"); - var logFileStream = new FileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, - StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous); + var logFileStream = _fileSystem.GetFileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, true); try { @@ -685,7 +687,7 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder var logFilePath = Path.Combine(_appPaths.LogDirectoryPath, "ffmpeg-sub-extract-" + Guid.NewGuid() + ".txt"); - var logFileStream = new FileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous); + var logFileStream = _fileSystem.GetFileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, true); try { diff --git a/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs b/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs index 3bdef9226e..cbca2ba763 100644 --- a/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs +++ b/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs @@ -35,16 +35,18 @@ namespace MediaBrowser.Server.Implementations.Providers /// The _directory watchers /// private readonly IDirectoryWatchers _directoryWatchers; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. /// /// The config. /// The directory watchers. - public ImageSaver(IServerConfigurationManager config, IDirectoryWatchers directoryWatchers) + public ImageSaver(IServerConfigurationManager config, IDirectoryWatchers directoryWatchers, IFileSystem fileSystem) { _config = config; _directoryWatchers = directoryWatchers; + _fileSystem = fileSystem; _remoteImageCache = new FileSystemRepository(config.ApplicationPaths.DownloadedImagesDataPath); } @@ -176,7 +178,7 @@ namespace MediaBrowser.Server.Implementations.Providers } } - using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await source.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false); } diff --git a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs index 1b086a0f91..af89122db1 100644 --- a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs +++ b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs @@ -50,6 +50,7 @@ namespace MediaBrowser.Server.Implementations.Providers private BaseMetadataProvider[] MetadataProviders { get; set; } private IImageProvider[] ImageProviders { get; set; } + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -58,12 +59,13 @@ namespace MediaBrowser.Server.Implementations.Providers /// The configuration manager. /// The directory watchers. /// The log manager. - public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, IDirectoryWatchers directoryWatchers, ILogManager logManager) + public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, IDirectoryWatchers directoryWatchers, ILogManager logManager, IFileSystem fileSystem) { _logger = logManager.GetLogger("ProviderManager"); _httpClient = httpClient; ConfigurationManager = configurationManager; _directoryWatchers = directoryWatchers; + _fileSystem = fileSystem; } /// @@ -293,7 +295,7 @@ namespace MediaBrowser.Server.Implementations.Providers { using (dataToSave) { - using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true)) { await dataToSave.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false); } @@ -347,7 +349,7 @@ namespace MediaBrowser.Server.Implementations.Providers /// Task. public Task SaveImage(BaseItem item, Stream source, string mimeType, ImageType type, int? imageIndex, string sourceUrl, CancellationToken cancellationToken) { - return new ImageSaver(ConfigurationManager, _directoryWatchers).SaveImage(item, source, mimeType, type, imageIndex, sourceUrl, cancellationToken); + return new ImageSaver(ConfigurationManager, _directoryWatchers, _fileSystem).SaveImage(item, source, mimeType, type, imageIndex, sourceUrl, cancellationToken); } /// diff --git a/MediaBrowser.Server.Mono/IO/FileSystemFactory.cs b/MediaBrowser.Server.Mono/IO/FileSystemFactory.cs new file mode 100644 index 0000000000..4a424a2824 --- /dev/null +++ b/MediaBrowser.Server.Mono/IO/FileSystemFactory.cs @@ -0,0 +1,21 @@ +using MediaBrowser.Common.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Common.Implementations.IO; + +namespace MediaBrowser.ServerApplication.IO +{ + /// + /// Class FileSystemFactory + /// + public static class FileSystemFactory + { + /// + /// Creates the file system manager. + /// + /// IFileSystem. + public static IFileSystem CreateFileSystemManager(ILogManager logManager) + { + return new CommonFileSystem(logManager.GetLogger("FileSystem"), false); + } + } +} diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj index 2c99f3370a..900169c707 100644 --- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj +++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj @@ -88,6 +88,7 @@ FFMpeg\FFMpegDownloader.cs + @@ -129,6 +130,7 @@ + diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs index 6d3cbcf26b..057a2456f5 100644 --- a/MediaBrowser.Server.Mono/Program.cs +++ b/MediaBrowser.Server.Mono/Program.cs @@ -17,6 +17,7 @@ using System.Security.Cryptography.X509Certificates; using Gtk; using Gdk; using System.Threading.Tasks; +using System.Reflection; namespace MediaBrowser.Server.Mono { @@ -203,6 +204,8 @@ namespace MediaBrowser.Server.Mono logger.Info("Server: {0}", Environment.MachineName); logger.Info("Operating system: {0}", Environment.OSVersion.ToString()); + + MonoBug11817WorkAround.Apply (); } /// @@ -280,4 +283,34 @@ namespace MediaBrowser.Server.Mono return true; } } + + public class MonoBug11817WorkAround + { + public static void Apply() + { + var property = typeof(TimeZoneInfo).GetProperty("TimeZoneDirectory", BindingFlags.Static | BindingFlags.NonPublic); + + if (property == null) return; + + var zoneInfo = FindZoneInfoFolder(); + property.SetValue(null, zoneInfo, new object[0]); + } + + public static string FindZoneInfoFolder() + { + var current = new DirectoryInfo(Directory.GetCurrentDirectory()); + + while(current != null) + { + var zoneinfoTestPath = Path.Combine(current.FullName, "zoneinfo"); + + if (Directory.Exists(zoneinfoTestPath)) + return zoneinfoTestPath; + + current = current.Parent; + } + + return null; + } + } } diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 196d065805..0ec1d68135 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -5,6 +5,7 @@ using MediaBrowser.Common.Constants; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Implementations; using MediaBrowser.Common.Implementations.ScheduledTasks; +using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; using MediaBrowser.Common.Net; using MediaBrowser.Controller; @@ -170,8 +171,6 @@ namespace MediaBrowser.ServerApplication private Task _httpServerCreationTask; - private IFileSystem FileSystemManager { get; set; } - /// /// Initializes a new instance of the class. /// @@ -237,7 +236,7 @@ namespace MediaBrowser.ServerApplication await base.RegisterResources().ConfigureAwait(false); - RegisterSingleInstance(new HttpResultFactory(LogManager)); + RegisterSingleInstance(new HttpResultFactory(LogManager, FileSystemManager)); RegisterSingleInstance(this); RegisterSingleInstance(ApplicationPaths); @@ -249,9 +248,6 @@ namespace MediaBrowser.ServerApplication RegisterSingleInstance(() => new BdInfoExaminer()); - FileSystemManager = FileSystemFactory.CreateFileSystemManager(LogManager); - RegisterSingleInstance(FileSystemManager); - var mediaEncoderTask = RegisterMediaEncoder(); UserDataManager = new UserDataManager(LogManager); @@ -275,7 +271,7 @@ namespace MediaBrowser.ServerApplication DirectoryWatchers = new DirectoryWatchers(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager); RegisterSingleInstance(DirectoryWatchers); - ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, DirectoryWatchers, LogManager); + ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, DirectoryWatchers, LogManager, FileSystemManager); RegisterSingleInstance(ProviderManager); RegisterSingleInstance(() => new LuceneSearchEngine(ApplicationPaths, LogManager, LibraryManager)); @@ -289,10 +285,10 @@ namespace MediaBrowser.ServerApplication ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager); RegisterSingleInstance(ServerManager); - LocalizationManager = new LocalizationManager(ServerConfigurationManager); + LocalizationManager = new LocalizationManager(ServerConfigurationManager, FileSystemManager); RegisterSingleInstance(LocalizationManager); - ImageProcessor = new ImageProcessor(Logger, ServerConfigurationManager.ApplicationPaths); + ImageProcessor = new ImageProcessor(Logger, ServerConfigurationManager.ApplicationPaths, FileSystemManager); RegisterSingleInstance(ImageProcessor); DtoService = new DtoService(Logger, LibraryManager, UserManager, UserDataManager, ItemRepository, ImageProcessor); @@ -317,15 +313,20 @@ namespace MediaBrowser.ServerApplication return new NetworkManager(); } + protected override IFileSystem CreateFileSystemManager() + { + return FileSystemFactory.CreateFileSystemManager(LogManager); + } + /// /// Registers the media encoder. /// /// Task. private async Task RegisterMediaEncoder() { - var info = await new FFMpegDownloader(Logger, ApplicationPaths, HttpClient, ZipClient).GetFFMpegInfo().ConfigureAwait(false); + var info = await new FFMpegDownloader(Logger, ApplicationPaths, HttpClient, ZipClient, FileSystemManager).GetFFMpegInfo().ConfigureAwait(false); - MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), ApplicationPaths, JsonSerializer, info.Path, info.ProbePath, info.Version); + MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), ApplicationPaths, JsonSerializer, info.Path, info.ProbePath, info.Version, FileSystemManager); RegisterSingleInstance(MediaEncoder); } @@ -335,7 +336,7 @@ namespace MediaBrowser.ServerApplication private void SetKernelProperties() { Parallel.Invoke( - () => ServerKernel.FFMpegManager = new FFMpegManager(ApplicationPaths, MediaEncoder, Logger, ItemRepository), + () => ServerKernel.FFMpegManager = new FFMpegManager(ApplicationPaths, MediaEncoder, Logger, ItemRepository, FileSystemManager), () => LocalizedStrings.StringFiles = GetExports(), SetStaticProperties ); diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs index 69025c9eb0..e8af0a13e7 100644 --- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs +++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; @@ -20,18 +21,20 @@ namespace MediaBrowser.ServerApplication.FFMpeg private readonly IApplicationPaths _appPaths; private readonly ILogger _logger; private readonly IZipClient _zipClient; + private readonly IFileSystem _fileSystem; private readonly string[] _fontUrls = new[] { "https://www.dropbox.com/s/pj847twf7riq0j7/ARIALUNI.7z?dl=1" }; - public FFMpegDownloader(ILogger logger, IApplicationPaths appPaths, IHttpClient httpClient, IZipClient zipClient) + public FFMpegDownloader(ILogger logger, IApplicationPaths appPaths, IHttpClient httpClient, IZipClient zipClient, IFileSystem fileSystem) { _logger = logger; _appPaths = appPaths; _httpClient = httpClient; _zipClient = zipClient; + _fileSystem = fileSystem; } public async Task GetFFMpegInfo() @@ -272,9 +275,8 @@ namespace MediaBrowser.ServerApplication.FFMpeg var bytes = Encoding.UTF8.GetBytes(contents); - using (var fileStream = new FileStream(fontConfigFile, FileMode.Create, FileAccess.Write, - FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, - FileOptions.Asynchronous)) + using (var fileStream = _fileSystem.GetFileStream(fontConfigFile, FileMode.Create, FileAccess.Write, + FileShare.Read, true)) { await fileStream.WriteAsync(bytes, 0, bytes.Length); } diff --git a/MediaBrowser.ServerApplication/IO/FileSystemFactory.cs b/MediaBrowser.ServerApplication/IO/FileSystemFactory.cs index ab7802e17d..698c4b616f 100644 --- a/MediaBrowser.ServerApplication/IO/FileSystemFactory.cs +++ b/MediaBrowser.ServerApplication/IO/FileSystemFactory.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.IO; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Logging; namespace MediaBrowser.ServerApplication.IO diff --git a/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs b/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs index 0101b42498..5320c52507 100644 --- a/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs +++ b/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Model.Logging; +using MediaBrowser.Common.Implementations.IO; +using MediaBrowser.Model.Logging; using System; using System.IO; using System.Runtime.InteropServices; @@ -10,7 +11,7 @@ namespace MediaBrowser.ServerApplication.IO public class NativeFileSystem : CommonFileSystem { public NativeFileSystem(ILogger logger) - : base(logger) + : base(logger, true) { } diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index d191247ee0..f24283e70d 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -190,7 +190,6 @@ - diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 2c6b5532b8..1c6cdad39b 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -5,6 +5,7 @@ using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Logging; @@ -118,6 +119,7 @@ namespace MediaBrowser.WebDashboard.Api private readonly ISessionManager _sessionManager; private readonly IDtoService _dtoService; + private readonly IFileSystem _fileSystem; /// /// Initializes a new instance of the class. @@ -126,13 +128,14 @@ namespace MediaBrowser.WebDashboard.Api /// The app host. /// The server configuration manager. /// The session manager. - public DashboardService(ITaskManager taskManager, IServerApplicationHost appHost, IServerConfigurationManager serverConfigurationManager, ISessionManager sessionManager, IDtoService dtoService) + public DashboardService(ITaskManager taskManager, IServerApplicationHost appHost, IServerConfigurationManager serverConfigurationManager, ISessionManager sessionManager, IDtoService dtoService, IFileSystem fileSystem) { _taskManager = taskManager; _appHost = appHost; _serverConfigurationManager = serverConfigurationManager; _sessionManager = sessionManager; _dtoService = dtoService; + _fileSystem = fileSystem; } /// @@ -324,7 +327,7 @@ namespace MediaBrowser.WebDashboard.Api /// Task{Stream}. private Stream GetRawResourceStream(string path) { - return new FileStream(GetDashboardResourcePath(path), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, StreamDefaults.DefaultFileStreamBufferSize, true); + return _fileSystem.GetFileStream(GetDashboardResourcePath(path), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true); } /// @@ -611,7 +614,7 @@ namespace MediaBrowser.WebDashboard.Api { path = GetDashboardResourcePath(path); - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, StreamDefaults.DefaultFileStreamBufferSize, true)) + using (var fs = _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) { using (var streamReader = new StreamReader(fs)) { diff --git a/MediaBrowser.sln.GhostDoc.xml b/MediaBrowser.sln.GhostDoc.xml new file mode 100644 index 0000000000..73f7a08ba7 --- /dev/null +++ b/MediaBrowser.sln.GhostDoc.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + D:\Development\MediaBrowser\Help + + + true + false + false + false + + + true + false + false + false + true + false + + + true + + + + + +