diff options
42 files changed, 314 insertions, 386 deletions
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index 8754e57a1..b648e7fd3 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -258,15 +258,7 @@ namespace MediaBrowser.Api { hasExited = process.HasExited; } - catch (Win32Exception ex) - { - Logger.ErrorException("Error determining if ffmpeg process has exited for {0}", ex, job.Path); - } - catch (InvalidOperationException ex) - { - Logger.ErrorException("Error determining if ffmpeg process has exited for {0}", ex, job.Path); - } - catch (NotSupportedException ex) + catch (Exception ex) { Logger.ErrorException("Error determining if ffmpeg process has exited for {0}", ex, job.Path); } diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 79a5a2846..f3164ad69 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -358,10 +358,7 @@ namespace MediaBrowser.Api.Playback { var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); var task = MediaEncoder.ExtractTextSubtitle(inputPath, type, subtitleStream.Index, offset, path, CancellationToken.None); @@ -396,10 +393,7 @@ namespace MediaBrowser.Api.Playback { var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); var task = MediaEncoder.ConvertTextSubtitleToAss(subtitleStream.Path, path, subtitleStream.Language, offset, CancellationToken.None); @@ -599,10 +593,7 @@ namespace MediaBrowser.Api.Playback { var parentPath = Path.GetDirectoryName(outputPath); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); var video = state.Item as Video; @@ -648,7 +639,7 @@ namespace MediaBrowser.Api.Playback { process.Start(); } - catch (Win32Exception ex) + catch (Exception ex) { Logger.ErrorException("Error starting ffmpeg", ex); diff --git a/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs b/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs index c177bd1ed..bee5e5dc4 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs @@ -72,10 +72,7 @@ namespace MediaBrowser.Common.Implementations { _dataDirectory = Path.Combine(ProgramDataPath, "data"); - if (!Directory.Exists(_dataDirectory)) - { - Directory.CreateDirectory(_dataDirectory); - } + Directory.CreateDirectory(_dataDirectory); } return _dataDirectory; @@ -98,10 +95,7 @@ namespace MediaBrowser.Common.Implementations { _imageCachePath = Path.Combine(CachePath, "images"); - if (!Directory.Exists(_imageCachePath)) - { - Directory.CreateDirectory(_imageCachePath); - } + Directory.CreateDirectory(_imageCachePath); } return _imageCachePath; @@ -123,10 +117,7 @@ namespace MediaBrowser.Common.Implementations if (_pluginsPath == null) { _pluginsPath = Path.Combine(ProgramDataPath, "plugins"); - if (!Directory.Exists(_pluginsPath)) - { - Directory.CreateDirectory(_pluginsPath); - } + Directory.CreateDirectory(_pluginsPath); } return _pluginsPath; @@ -148,10 +139,7 @@ namespace MediaBrowser.Common.Implementations if (_pluginConfigurationsPath == null) { _pluginConfigurationsPath = Path.Combine(PluginsPath, "configurations"); - if (!Directory.Exists(_pluginConfigurationsPath)) - { - Directory.CreateDirectory(_pluginConfigurationsPath); - } + Directory.CreateDirectory(_pluginConfigurationsPath); } return _pluginConfigurationsPath; @@ -170,10 +158,7 @@ namespace MediaBrowser.Common.Implementations if (_tempUpdatePath == null) { _tempUpdatePath = Path.Combine(ProgramDataPath, "updates"); - if (!Directory.Exists(_tempUpdatePath)) - { - Directory.CreateDirectory(_tempUpdatePath); - } + Directory.CreateDirectory(_tempUpdatePath); } return _tempUpdatePath; @@ -195,10 +180,7 @@ namespace MediaBrowser.Common.Implementations if (_logDirectoryPath == null) { _logDirectoryPath = Path.Combine(ProgramDataPath, "logs"); - if (!Directory.Exists(_logDirectoryPath)) - { - Directory.CreateDirectory(_logDirectoryPath); - } + Directory.CreateDirectory(_logDirectoryPath); } return _logDirectoryPath; } @@ -219,10 +201,7 @@ namespace MediaBrowser.Common.Implementations if (_configurationDirectoryPath == null) { _configurationDirectoryPath = Path.Combine(ProgramDataPath, "config"); - if (!Directory.Exists(_configurationDirectoryPath)) - { - Directory.CreateDirectory(_configurationDirectoryPath); - } + Directory.CreateDirectory(_configurationDirectoryPath); } return _configurationDirectoryPath; } @@ -256,10 +235,7 @@ namespace MediaBrowser.Common.Implementations { _cachePath = Path.Combine(ProgramDataPath, "cache"); - if (!Directory.Exists(_cachePath)) - { - Directory.CreateDirectory(_cachePath); - } + Directory.CreateDirectory(_cachePath); } return _cachePath; @@ -282,10 +258,7 @@ namespace MediaBrowser.Common.Implementations { _tempDirectory = Path.Combine(CachePath, "temp"); - if (!Directory.Exists(_tempDirectory)) - { - Directory.CreateDirectory(_tempDirectory); - } + Directory.CreateDirectory(_tempDirectory); } return _tempDirectory; @@ -318,10 +291,7 @@ namespace MediaBrowser.Common.Implementations programDataPath = Path.GetFullPath(programDataPath); } - if (!Directory.Exists(programDataPath)) - { - Directory.CreateDirectory(programDataPath); - } + Directory.CreateDirectory(programDataPath); return programDataPath; } diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs index 550fe9593..3a626000f 100644 --- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs +++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs @@ -220,10 +220,10 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager { options.ResourcePool.Release(); } - + throw new HttpException(string.Format("Connection to {0} timed out", options.Url)) { IsTimedOut = true }; } - + _logger.Info("HttpClientManager.Get url: {0}", options.Url); try @@ -512,10 +512,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager if (operationCanceledException != null) { // Cleanup - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } + DeleteTempFile(tempFile); return GetCancellationException(options.Url, options.CancellationToken, operationCanceledException); } @@ -525,10 +522,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager var httpRequestException = ex as HttpRequestException; // Cleanup - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } + DeleteTempFile(tempFile); if (httpRequestException != null) { @@ -538,6 +532,18 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager return ex; } + private void DeleteTempFile(string file) + { + try + { + File.Delete(file); + } + catch (IOException) + { + // Might not have been created at all. No need to worry. + } + } + /// <summary> /// Validates the params. /// </summary> diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs index 8947bdcc0..fbdbf15ff 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs @@ -431,7 +431,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks { var path = Path.Combine(ApplicationPaths.ConfigurationDirectoryPath, "ScheduledTasks"); - if (create && !Directory.Exists(path)) + if (create) { Directory.CreateDirectory(path); } @@ -448,7 +448,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks { var path = Path.Combine(ApplicationPaths.DataPath, "ScheduledTasks"); - if (create && !Directory.Exists(path)) + if (create) { Directory.CreateDirectory(path); } @@ -507,10 +507,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); JsonSerializer.SerializeToFile(triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), path); } diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs index 71168c219..ea4439c4e 100644 --- a/MediaBrowser.Common/Plugins/BasePlugin.cs +++ b/MediaBrowser.Common/Plugins/BasePlugin.cs @@ -234,10 +234,7 @@ namespace MediaBrowser.Common.Plugins // We can always make this configurable if/when needed _dataFolderPath = Path.Combine(ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(ConfigurationFileName)); - if (!Directory.Exists(_dataFolderPath)) - { - Directory.CreateDirectory(_dataFolderPath); - } + Directory.CreateDirectory(_dataFolderPath); } return _dataFolderPath; diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 82d81e517..9d8539906 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -30,10 +30,7 @@ namespace MediaBrowser.Controller.Entities { var path = Configuration.UseCustomLibrary ? GetRootFolderPath(Name) : ConfigurationManager.ApplicationPaths.DefaultUserViewsPath; - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } + Directory.CreateDirectory(path); return path; } @@ -256,10 +253,7 @@ namespace MediaBrowser.Controller.Entities { _configurationDirectoryPath = GetConfigurationDirectoryPath(Name); - if (!Directory.Exists(_configurationDirectoryPath)) - { - Directory.CreateDirectory(_configurationDirectoryPath); - } + Directory.CreateDirectory(_configurationDirectoryPath); } return _configurationDirectoryPath; diff --git a/MediaBrowser.Controller/IO/FileSystem.cs b/MediaBrowser.Controller/IO/FileSystem.cs index 3d425f13f..30fdb8d39 100644 --- a/MediaBrowser.Controller/IO/FileSystem.cs +++ b/MediaBrowser.Controller/IO/FileSystem.cs @@ -205,10 +205,7 @@ namespace MediaBrowser.Controller.IO } // Check if the target directory exists, if not, create it. - if (!Directory.Exists(target)) - { - Directory.CreateDirectory(target); - } + Directory.CreateDirectory(target); foreach (var file in Directory.EnumerateFiles(source)) { diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index bbe5ddbaa..87036df84 100644 --- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs +++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs @@ -159,10 +159,7 @@ namespace MediaBrowser.Controller.MediaInfo { var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); await _encoder.ExtractImage(inputPath, type, video.Video3DFormat, time, path, cancellationToken).ConfigureAwait(false); chapter.ImagePath = path; diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index 2364debed..ad6be9481 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -233,27 +233,27 @@ namespace MediaBrowser.Controller.Providers throw new ArgumentNullException("providerInfo"); } - if (CompareDate(item) > providerInfo.LastRefreshed) + if (RefreshOnVersionChange && !String.Equals(ProviderVersion, providerInfo.ProviderVersion)) { return true; } - if (RefreshOnFileSystemStampChange && item.LocationType == LocationType.FileSystem && HasFileSystemStampChanged(item, providerInfo)) + if (RequiresInternet && DateTime.UtcNow > (providerInfo.LastRefreshed.AddDays(ConfigurationManager.Configuration.MetadataRefreshDays))) { return true; } - if (RefreshOnVersionChange && !String.Equals(ProviderVersion, providerInfo.ProviderVersion)) + if (providerInfo.LastRefreshStatus != ProviderRefreshStatus.Success) { return true; } - if (RequiresInternet && DateTime.UtcNow > (providerInfo.LastRefreshed.AddDays(ConfigurationManager.Configuration.MetadataRefreshDays))) + if (NeedsRefreshBasedOnCompareDate(item, providerInfo)) { return true; } - if (providerInfo.LastRefreshStatus != ProviderRefreshStatus.Success) + if (RefreshOnFileSystemStampChange && item.LocationType == LocationType.FileSystem && HasFileSystemStampChanged(item, providerInfo)) { return true; } @@ -262,6 +262,17 @@ namespace MediaBrowser.Controller.Providers } /// <summary> + /// Needses the refresh based on compare date. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="providerInfo">The provider info.</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> + protected virtual bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) + { + return CompareDate(item) > providerInfo.LastRefreshed; + } + + /// <summary> /// Determines if the item's file system stamp has changed from the last time the provider refreshed /// </summary> /// <param name="item">The item.</param> diff --git a/MediaBrowser.Providers/FolderProviderFromXml.cs b/MediaBrowser.Providers/FolderProviderFromXml.cs index 5f36fee28..2a22d0448 100644 --- a/MediaBrowser.Providers/FolderProviderFromXml.cs +++ b/MediaBrowser.Providers/FolderProviderFromXml.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -42,16 +43,17 @@ namespace MediaBrowser.Providers get { return MetadataProviderPriority.First; } } - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + private const string XmlFileName = "folder.xml"; + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var entry = item.MetaLocation != null ? item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "folder.xml")) : null; - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); + + if (xml == null) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -76,7 +78,7 @@ namespace MediaBrowser.Providers { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "folder.xml")); + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { diff --git a/MediaBrowser.Providers/Games/GameProviderFromXml.cs b/MediaBrowser.Providers/Games/GameProviderFromXml.cs index 4c6b9fc66..5e498c578 100644 --- a/MediaBrowser.Providers/Games/GameProviderFromXml.cs +++ b/MediaBrowser.Providers/Games/GameProviderFromXml.cs @@ -7,6 +7,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Providers.Savers; namespace MediaBrowser.Providers.Games { @@ -33,10 +34,18 @@ namespace MediaBrowser.Providers.Games return item is Game; } - protected override DateTime CompareDate(BaseItem item) + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "game.xml")); - return xml != null ? FileSystem.GetLastWriteTimeUtc(xml, Logger) : DateTime.MinValue; + var savePath = GameXmlSaver.GetGameSavePath(item); + + var xml = item.ResolveArgs.GetMetaFileByPath(savePath) ?? new FileInfo(savePath); + + if (!xml.Exists) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -61,21 +70,17 @@ namespace MediaBrowser.Providers.Games { cancellationToken.ThrowIfCancellationRequested(); - var metaFile = Path.Combine(game.MetaLocation, "game.xml"); + var metaFile = GameXmlSaver.GetGameSavePath(game); - if (File.Exists(metaFile)) - { - await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - - try - { - new BaseItemXmlParser<Game>(Logger).Fetch(game, metaFile, cancellationToken); - } - finally - { - XmlParsingResourcePool.Release(); - } + await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + new BaseItemXmlParser<Game>(Logger).Fetch(game, metaFile, cancellationToken); + } + finally + { + XmlParsingResourcePool.Release(); } SetLastRefreshed(game, DateTime.UtcNow); diff --git a/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs b/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs index e01bed88e..ed76d0842 100644 --- a/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs +++ b/MediaBrowser.Providers/Games/GameSystemProviderFromXml.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -39,16 +40,17 @@ namespace MediaBrowser.Providers.Games get { return MetadataProviderPriority.First; } } - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + private const string XmlFileName = "gamesystem.xml"; + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "gamesystem.xml")); - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); + + if (xml == null) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -73,7 +75,7 @@ namespace MediaBrowser.Providers.Games { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "gamesystem.xml")); + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { diff --git a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs index 26c850717..f61057fe6 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs @@ -174,10 +174,7 @@ namespace MediaBrowser.Providers.MediaInfo { var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); await _mediaEncoder.ExtractImage(new[] { item.Path }, InputType.AudioFile, null, null, path, cancellationToken).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs index b202e4866..14085635a 100644 --- a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs @@ -222,10 +222,7 @@ namespace MediaBrowser.Providers.MediaInfo { var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); await ExtractImageInternal(item, path, cancellationToken).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs b/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs index 1a9384e3a..e697738fe 100644 --- a/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/BoxSetProviderFromXml.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -43,16 +44,17 @@ namespace MediaBrowser.Providers.Movies get { return MetadataProviderPriority.First; } } - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + private const string XmlFileName = "collection.xml"; + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "collection.xml")); - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); + + if (xml == null) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -77,7 +79,7 @@ namespace MediaBrowser.Providers.Movies { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "collection.xml")); + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { diff --git a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs index adc013699..753812293 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs @@ -168,14 +168,21 @@ namespace MediaBrowser.Providers.Movies // Process images var path = GetMovieDataPath(ConfigurationManager.ApplicationPaths, id); - var files = new DirectoryInfo(path) - .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) - .ToList(); + try + { + var files = new DirectoryInfo(path) + .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) + .Select(i => i.LastWriteTimeUtc) + .ToList(); - if (files.Count > 0) + if (files.Count > 0) + { + return files.Max(); + } + } + catch (DirectoryNotFoundException) { - return files.Max(); + // Don't blow up } } @@ -192,11 +199,6 @@ namespace MediaBrowser.Providers.Movies { var dataPath = Path.Combine(GetMoviesDataPath(appPaths), tmdbId); - if (!Directory.Exists(dataPath)) - { - Directory.CreateDirectory(dataPath); - } - return dataPath; } @@ -209,11 +211,6 @@ namespace MediaBrowser.Providers.Movies { var dataPath = Path.Combine(appPaths.DataPath, "fanart-movies"); - if (!Directory.Exists(dataPath)) - { - Directory.CreateDirectory(dataPath); - } - return dataPath; } diff --git a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs index f06009f4b..51b77599e 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs @@ -59,6 +59,8 @@ namespace MediaBrowser.Providers.Movies var path = FanArtMovieProvider.GetMoviesDataPath(_config.CommonApplicationPaths); + Directory.CreateDirectory(path); + var timestampFile = Path.Combine(path, "time.txt"); var timestampFileInfo = new FileInfo(timestampFile); @@ -146,10 +148,7 @@ namespace MediaBrowser.Providers.Movies movieDataPath = Path.Combine(movieDataPath, tmdbId); - if (!Directory.Exists(movieDataPath)) - { - Directory.CreateDirectory(movieDataPath); - } + Directory.CreateDirectory(movieDataPath); return FanArtMovieProvider.Current.DownloadMovieXml(movieDataPath, tmdbId, cancellationToken); } diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 474100855..1b25dc58f 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -15,6 +15,7 @@ using System.Net; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Providers.Savers; namespace MediaBrowser.Providers.Movies { @@ -233,9 +234,15 @@ namespace MediaBrowser.Providers.Movies return item.LocationType == LocationType.FileSystem && item.ResolveArgs.ContainsMetaFileByName("collection.xml"); } - var xmlFileName = MovieProviderFromXml.GetXmlFilename(item); + var path = MovieXmlSaver.GetMovieSavePath(item); - return item.LocationType == LocationType.FileSystem && item.ResolveArgs.ContainsMetaFileByName(xmlFileName); + if (item.LocationType == LocationType.FileSystem) + { + // If mixed with multiple movies in one folder, resolve args won't have the file system children + return item.ResolveArgs.ContainsMetaFileByName(Path.GetFileName(path)) || File.Exists(path); + } + + return false; } /// <summary> diff --git a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs b/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs index 256b74692..9ae6cfa43 100644 --- a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs @@ -1,9 +1,11 @@ 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.Logging; +using MediaBrowser.Providers.Savers; using System; using System.IO; using System.Threading; @@ -52,23 +54,18 @@ namespace MediaBrowser.Providers.Movies get { return MetadataProviderPriority.First; } } - internal static string GetXmlFilename(BaseItem item) + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - const string filename = "movie.xml"; + var savePath = MovieXmlSaver.GetMovieSavePath(item); - return Path.Combine(item.MetaLocation, filename); - } + var xml = item.ResolveArgs.GetMetaFileByPath(savePath) ?? new FileInfo(savePath); - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) - { - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, GetXmlFilename(item))); - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + if (!xml.Exists) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -93,30 +90,24 @@ namespace MediaBrowser.Providers.Movies { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, GetXmlFilename(item))); + var path = MovieXmlSaver.GetMovieSavePath(item); - if (metadataFile != null) - { - var path = metadataFile.FullName; - - await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); + await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - try - { - var video = (Video) item; - - await new MovieXmlParser(Logger, _itemRepo).FetchAsync(video, path, cancellationToken).ConfigureAwait(false); - } - finally - { - XmlParsingResourcePool.Release(); - } + try + { + var video = (Video)item; - SetLastRefreshed(item, DateTime.UtcNow); - return true; + await new MovieXmlParser(Logger, _itemRepo).FetchAsync(video, path, cancellationToken).ConfigureAwait(false); } + finally + { + XmlParsingResourcePool.Release(); + } + + SetLastRefreshed(item, DateTime.UtcNow); - return false; + return true; } } } diff --git a/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs index 7fe646c78..ab90675fd 100644 --- a/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System; @@ -38,16 +39,17 @@ namespace MediaBrowser.Providers.Movies get { return MetadataProviderPriority.Second; } } - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + private const string XmlFileName = "person.xml"; + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "person.xml")); - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); + + if (xml == null) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -72,7 +74,7 @@ namespace MediaBrowser.Providers.Movies { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "person.xml")); + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { diff --git a/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs b/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs index 061ebd648..9353d4565 100644 --- a/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs +++ b/MediaBrowser.Providers/Music/ArtistProviderFromXml.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -40,16 +41,17 @@ namespace MediaBrowser.Providers.Music get { return MetadataProviderPriority.First; } } - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + private const string XmlFileName = "artist.xml"; + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var entry = item.MetaLocation != null ? item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "artist.xml")) : null; - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); + + if (xml == null) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -74,7 +76,7 @@ namespace MediaBrowser.Providers.Music { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "artist.xml")); + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs index 66efd58e6..131c73f38 100644 --- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs @@ -163,14 +163,21 @@ namespace MediaBrowser.Providers.Music // Process images var path = GetArtistDataPath(ConfigurationManager.ApplicationPaths, musicBrainzId); - var files = new DirectoryInfo(path) - .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) - .ToList(); + try + { + var files = new DirectoryInfo(path) + .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) + .Select(i => i.LastWriteTimeUtc) + .ToList(); - if (files.Count > 0) + if (files.Count > 0) + { + return files.Max(); + } + } + catch (DirectoryNotFoundException) { - return files.Max(); + } } @@ -192,11 +199,6 @@ namespace MediaBrowser.Providers.Music { var seriesDataPath = Path.Combine(GetArtistDataPath(appPaths), musicBrainzArtistId); - if (!Directory.Exists(seriesDataPath)) - { - Directory.CreateDirectory(seriesDataPath); - } - return seriesDataPath; } @@ -209,11 +211,6 @@ namespace MediaBrowser.Providers.Music { var dataPath = Path.Combine(appPaths.DataPath, "fanart-music"); - if (!Directory.Exists(dataPath)) - { - Directory.CreateDirectory(dataPath); - } - return dataPath; } diff --git a/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs b/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs index f7c3374d1..379866945 100644 --- a/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs @@ -58,6 +58,8 @@ namespace MediaBrowser.Providers.Music var path = FanArtArtistProvider.GetArtistDataPath(_config.CommonApplicationPaths); + Directory.CreateDirectory(path); + var timestampFile = Path.Combine(path, "time.txt"); var timestampFileInfo = new FileInfo(timestampFile); @@ -167,10 +169,7 @@ namespace MediaBrowser.Providers.Music artistsDataPath = Path.Combine(artistsDataPath, musicBrainzId); - if (!Directory.Exists(artistsDataPath)) - { - Directory.CreateDirectory(artistsDataPath); - } + Directory.CreateDirectory(artistsDataPath); return FanArtArtistProvider.Current.DownloadArtistXml(artistsDataPath, musicBrainzId, cancellationToken); } diff --git a/MediaBrowser.Providers/Savers/GameXmlSaver.cs b/MediaBrowser.Providers/Savers/GameXmlSaver.cs index 1e654f72f..eae811d6d 100644 --- a/MediaBrowser.Providers/Savers/GameXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/GameXmlSaver.cs @@ -1,9 +1,9 @@ -using System.Collections.Generic; -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Providers.Movies; using System; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Security; @@ -88,6 +88,16 @@ namespace MediaBrowser.Providers.Savers public string GetSavePath(BaseItem item) { + return GetGameSavePath(item); + } + + public static string GetGameSavePath(BaseItem item) + { + if (item.IsInMixedFolder) + { + return Path.ChangeExtension(item.Path, ".xml"); + } + return Path.Combine(item.MetaLocation, "game.xml"); } } diff --git a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs index 761bcefd1..9b34a4ebe 100644 --- a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs @@ -1,11 +1,11 @@ -using System.Collections.Generic; -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Providers.Movies; using System; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Security; @@ -118,12 +118,24 @@ namespace MediaBrowser.Providers.Savers public string GetSavePath(BaseItem item) { + return GetMovieSavePath(item); + } + + public static string GetMovieSavePath(BaseItem item) + { if (item.IsInMixedFolder) { return Path.ChangeExtension(item.Path, ".xml"); } - var filename = MovieProviderFromXml.GetXmlFilename(item); + var filename = GetXmlFilename(item); + + return Path.Combine(item.MetaLocation, filename); + } + + private static string GetXmlFilename(BaseItem item) + { + const string filename = "movie.xml"; return Path.Combine(item.MetaLocation, filename); } diff --git a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs index 900e8059f..a37d78c90 100644 --- a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs @@ -98,10 +98,7 @@ namespace MediaBrowser.Providers.Savers var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); var wasHidden = false; diff --git a/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs b/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs index 896b32f6f..32dd0cf38 100644 --- a/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs @@ -90,7 +90,7 @@ namespace MediaBrowser.Providers.TV var parent = item.ResolveArgs.Parent; - ValidateImage(episode, item.MetaLocation); + ValidateImage(episode); cancellationToken.ThrowIfCancellationRequested(); @@ -106,7 +106,7 @@ namespace MediaBrowser.Providers.TV /// <param name="episode">The episode.</param> /// <param name="metadataFolderPath">The metadata folder path.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - private void ValidateImage(Episode episode, string metadataFolderPath) + private void ValidateImage(Episode episode) { var path = episode.PrimaryImagePath; diff --git a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs b/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs index e91d7ead7..c7f85358c 100644 --- a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs +++ b/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -59,12 +60,12 @@ namespace MediaBrowser.Providers.TV } /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. + /// Needses the refresh based on compare date. /// </summary> /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + /// <param name="providerInfo">The provider info.</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { var metadataFile = Path.Combine(item.MetaLocation, Path.ChangeExtension(Path.GetFileName(item.Path), ".xml")); @@ -72,10 +73,10 @@ namespace MediaBrowser.Providers.TV if (file == null) { - return base.CompareDate(item); + return false; } - return file.LastWriteTimeUtc; + return FileSystem.GetLastWriteTimeUtc(file, Logger) > providerInfo.LastRefreshed; } /// <summary> diff --git a/MediaBrowser.Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Providers/TV/FanArtTVProvider.cs index bc2b28f1c..972665af7 100644 --- a/MediaBrowser.Providers/TV/FanArtTVProvider.cs +++ b/MediaBrowser.Providers/TV/FanArtTVProvider.cs @@ -100,14 +100,21 @@ namespace MediaBrowser.Providers.TV // Process images var path = GetSeriesDataPath(ConfigurationManager.ApplicationPaths, id); - var files = new DirectoryInfo(path) - .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) - .ToList(); + try + { + var files = new DirectoryInfo(path) + .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) + .Select(i => i.LastWriteTimeUtc) + .ToList(); - if (files.Count > 0) + if (files.Count > 0) + { + return files.Max(); + } + } + catch (DirectoryNotFoundException) { - return files.Max(); + // Don't blow up } } @@ -148,11 +155,6 @@ namespace MediaBrowser.Providers.TV { var seriesDataPath = Path.Combine(GetSeriesDataPath(appPaths), seriesId); - if (!Directory.Exists(seriesDataPath)) - { - Directory.CreateDirectory(seriesDataPath); - } - return seriesDataPath; } @@ -165,11 +167,6 @@ namespace MediaBrowser.Providers.TV { var dataPath = Path.Combine(appPaths.DataPath, "fanart-tv"); - if (!Directory.Exists(dataPath)) - { - Directory.CreateDirectory(dataPath); - } - return dataPath; } diff --git a/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs b/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs index 047741055..2a8e01974 100644 --- a/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs @@ -59,6 +59,8 @@ namespace MediaBrowser.Providers.TV var path = FanArtTvProvider.GetSeriesDataPath(_config.CommonApplicationPaths); + Directory.CreateDirectory(path); + var timestampFile = Path.Combine(path, "time.txt"); var timestampFileInfo = new FileInfo(timestampFile); @@ -161,10 +163,7 @@ namespace MediaBrowser.Providers.TV seriesDataPath = Path.Combine(seriesDataPath, tvdbId); - if (!Directory.Exists(seriesDataPath)) - { - Directory.CreateDirectory(seriesDataPath); - } + Directory.CreateDirectory(seriesDataPath); return FanArtTvProvider.Current.DownloadSeriesXml(seriesDataPath, tvdbId, cancellationToken); } diff --git a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs index a250c9060..ef315f5cb 100644 --- a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs @@ -171,14 +171,21 @@ namespace MediaBrowser.Providers.TV // Process images var path = GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId); - var files = new DirectoryInfo(path) - .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) - .Select(i => i.LastWriteTimeUtc) - .ToList(); + try + { + var files = new DirectoryInfo(path) + .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly) + .Select(i => i.LastWriteTimeUtc) + .ToList(); - if (files.Count > 0) + if (files.Count > 0) + { + return files.Max(); + } + } + catch (DirectoryNotFoundException) { - return files.Max(); + // Don't blow up } } @@ -299,11 +306,6 @@ namespace MediaBrowser.Providers.TV { var seriesDataPath = Path.Combine(GetSeriesDataPath(appPaths), seriesId); - if (!Directory.Exists(seriesDataPath)) - { - Directory.CreateDirectory(seriesDataPath); - } - return seriesDataPath; } @@ -316,11 +318,6 @@ namespace MediaBrowser.Providers.TV { var dataPath = Path.Combine(appPaths.DataPath, "tvdb"); - if (!Directory.Exists(dataPath)) - { - Directory.CreateDirectory(dataPath); - } - return dataPath; } diff --git a/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs b/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs index 147e4d59b..0c8fcf066 100644 --- a/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs +++ b/MediaBrowser.Providers/TV/SeasonProviderFromXml.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -43,16 +44,17 @@ namespace MediaBrowser.Providers.TV get { return MetadataProviderPriority.First; } } - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + private const string XmlFileName = "season.xml"; + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "season.xml")); - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); + + if (xml == null) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -77,7 +79,7 @@ namespace MediaBrowser.Providers.TV { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "season.xml")); + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { diff --git a/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs b/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs index 3aec76ad4..67d6e423c 100644 --- a/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs +++ b/MediaBrowser.Providers/TV/SeriesProviderFromXml.cs @@ -1,13 +1,14 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Logging; namespace MediaBrowser.Providers.TV { @@ -43,16 +44,17 @@ namespace MediaBrowser.Providers.TV get { return MetadataProviderPriority.First; } } - /// <summary> - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>DateTime.</returns> - protected override DateTime CompareDate(BaseItem item) + private const string XmlFileName = "series.xml"; + protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "series.xml")); - return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; + var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); + + if (xml == null) + { + return false; + } + + return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// <summary> @@ -77,7 +79,7 @@ namespace MediaBrowser.Providers.TV { cancellationToken.ThrowIfCancellationRequested(); - var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "series.xml")); + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { diff --git a/MediaBrowser.Providers/TV/TvdbPrescanTask.cs b/MediaBrowser.Providers/TV/TvdbPrescanTask.cs index e6aa07be0..0bc7cc3e7 100644 --- a/MediaBrowser.Providers/TV/TvdbPrescanTask.cs +++ b/MediaBrowser.Providers/TV/TvdbPrescanTask.cs @@ -71,6 +71,8 @@ namespace MediaBrowser.Providers.TV var path = RemoteSeriesProvider.GetSeriesDataPath(_config.CommonApplicationPaths); + Directory.CreateDirectory(path); + var timestampFile = Path.Combine(path, "time.txt"); var timestampFileInfo = new FileInfo(timestampFile); @@ -295,10 +297,7 @@ namespace MediaBrowser.Providers.TV seriesDataPath = Path.Combine(seriesDataPath, id); - if (!Directory.Exists(seriesDataPath)) - { - Directory.CreateDirectory(seriesDataPath); - } + Directory.CreateDirectory(seriesDataPath); return RemoteSeriesProvider.Current.DownloadSeriesZip(id, seriesDataPath, cancellationToken); } diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs index 305bede56..7a16747fb 100644 --- a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs +++ b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs @@ -225,10 +225,7 @@ namespace MediaBrowser.Server.Implementations.Drawing { var parentPath = Path.GetDirectoryName(cacheFilePath); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); // Save to the cache location using (var cacheFileStream = new FileStream(cacheFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) @@ -374,10 +371,7 @@ namespace MediaBrowser.Server.Implementations.Drawing { var parentPath = Path.GetDirectoryName(croppedImagePath); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); using (var outputStream = new FileStream(croppedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read)) { @@ -528,10 +522,7 @@ namespace MediaBrowser.Server.Implementations.Drawing var parentPath = Path.GetDirectoryName(fullCachePath); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); // Update the file system cache File.WriteAllText(fullCachePath, size.Width.ToString(UsCulture) + @"|" + size.Height.ToString(UsCulture)); @@ -701,10 +692,7 @@ namespace MediaBrowser.Server.Implementations.Drawing { var parentDirectory = Path.GetDirectoryName(enhancedImagePath); - if (!Directory.Exists(parentDirectory)) - { - Directory.CreateDirectory(parentDirectory); - } + Directory.CreateDirectory(parentDirectory); //And then save it in the cache using (var outputStream = new FileStream(enhancedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read)) diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index ebbefb239..27b71cc8a 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -527,16 +527,13 @@ namespace MediaBrowser.Server.Implementations.Library { try { - if (f.Exists) - { - var item = ResolvePath(f, parent) as T; + var item = ResolvePath(f, parent) as T; - if (item != null) + if (item != null) + { + lock (list) { - lock (list) - { - list.Add(item); - } + list.Add(item); } } } diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index b511ae80c..c9777e54a 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -48,10 +48,7 @@ namespace MediaBrowser.Server.Implementations.Localization var localizationPath = LocalizationPath; - if (!Directory.Exists(localizationPath)) - { - Directory.CreateDirectory(localizationPath); - } + Directory.CreateDirectory(localizationPath); var existingFiles = Directory.EnumerateFiles(localizationPath, "ratings-*.txt", SearchOption.TopDirectoryOnly) .Select(Path.GetFileName) diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index 5ce44efd5..ee47dbd81 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -322,10 +322,7 @@ namespace MediaBrowser.Server.Implementations.Persistence /// <returns>Task.</returns> public Task SaveCriticReviews(Guid itemId, IEnumerable<ItemReview> criticReviews) { - if (!Directory.Exists(_criticReviewsPath)) - { - Directory.CreateDirectory(_criticReviewsPath); - } + Directory.CreateDirectory(_criticReviewsPath); var path = Path.Combine(_criticReviewsPath, itemId + ".json"); diff --git a/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs b/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs index d8872f318..d0f4882e4 100644 --- a/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs +++ b/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs @@ -273,10 +273,7 @@ namespace MediaBrowser.Server.Implementations.Providers var parentPath = Path.GetDirectoryName(path); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); return path; } diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs index 4829dc405..c82899948 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs @@ -182,10 +182,7 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks var parentPath = Path.GetDirectoryName(failHistoryPath); - if (!Directory.Exists(parentPath)) - { - Directory.CreateDirectory(parentPath); - } + Directory.CreateDirectory(parentPath); File.WriteAllText(failHistoryPath, string.Join("|", previouslyFailedImages.ToArray())); } diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs index 381bd20bd..9f3d26e24 100644 --- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs +++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs @@ -55,10 +55,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg Version = Version }; - if (!Directory.Exists(versionedDirectoryPath)) - { - Directory.CreateDirectory(versionedDirectoryPath); - } + Directory.CreateDirectory(versionedDirectoryPath); var tasks = new List<Task>(); @@ -114,10 +111,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg var tempFolder = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString()); - if (!Directory.Exists(tempFolder)) - { - Directory.CreateDirectory(tempFolder); - } + Directory.CreateDirectory(tempFolder); try { @@ -163,10 +157,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg { var fontsDirectory = Path.Combine(targetPath, "fonts"); - if (!Directory.Exists(fontsDirectory)) - { - Directory.CreateDirectory(fontsDirectory); - } + Directory.CreateDirectory(fontsDirectory); const string fontFilename = "ARIALUNI.TTF"; @@ -291,10 +282,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg { var path = Path.Combine(_appPaths.ProgramDataPath, "ffmpeg"); - if (create && !Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } + Directory.CreateDirectory(path); return path; } |
