From d32c71ca39147d5a46b54e429ccc62ac74df0e1d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 21 Jun 2013 14:50:44 -0400 Subject: [PATCH] limit the extensions that are factored into the file stamp check --- MediaBrowser.Controller/Entities/BaseItem.cs | 69 --------------- MediaBrowser.Controller/Entities/Folder.cs | 4 +- .../Library/IMetadataSaver.cs | 7 ++ .../Providers/BaseMetadataProvider.cs | 88 +++++++++++++++++-- .../Providers/BaseProviderInfo.cs | 4 - .../ImageFromMediaLocationProvider.cs | 12 +++ .../ImagesByNameProvider.cs | 4 +- .../MediaInfo/FFProbeVideoInfoProvider.cs | 14 ++- .../Music/LastfmAlbumProvider.cs | 4 +- .../Savers/MovieXmlSaver.cs | 18 ++-- .../EpisodeImageFromMediaLocationProvider.cs | 12 +++ 11 files changed, 146 insertions(+), 90 deletions(-) diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 384db5ed2f..00ab867b2d 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -219,29 +219,6 @@ namespace MediaBrowser.Controller.Entities } } - /// - /// The _file system stamp - /// - private Guid? _fileSystemStamp; - /// - /// Gets a directory stamp, in the form of a string, that can be used for - /// comparison purposes to determine if the file system entries for this item have changed. - /// - /// The file system stamp. - [IgnoreDataMember] - public Guid FileSystemStamp - { - get - { - if (!_fileSystemStamp.HasValue) - { - _fileSystemStamp = GetFileSystemStamp(); - } - - return _fileSystemStamp.Value; - } - } - /// /// Gets the type of the media. /// @@ -255,49 +232,6 @@ namespace MediaBrowser.Controller.Entities } } - /// - /// Gets a directory stamp, in the form of a string, that can be used for - /// comparison purposes to determine if the file system entries for this item have changed. - /// - /// Guid. - private Guid GetFileSystemStamp() - { - // If there's no path or the item is a file, there's nothing to do - if (LocationType != LocationType.FileSystem) - { - return Guid.Empty; - } - - try - { - if (!ResolveArgs.IsDirectory) - { - return Guid.Empty; - } - } - catch (IOException ex) - { - Logger.ErrorException("Error determining if path is directory: {0}", ex, ResolveArgs.Path); - throw; - } - - var sb = new StringBuilder(); - - // Record the name of each file - // Need to sort these because accoring to msdn docs, our i/o methods are not guaranteed in any order - foreach (var file in ResolveArgs.FileSystemChildren - .OrderBy(f => f.Name)) - { - sb.Append(file.Name); - } - foreach (var file in ResolveArgs.MetadataFiles.OrderBy(f => f.Name)) - { - sb.Append(file.Name); - } - - return sb.ToString().GetMD5(); - } - /// /// The _resolve args /// @@ -338,9 +272,6 @@ namespace MediaBrowser.Controller.Entities { _resolveArgs = value; _resolveArgsInitialized = value != null; - - // Null this out so that it can be lazy loaded again - _fileSystemStamp = null; } } diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 8dc41661e8..e7c4a293bf 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -22,7 +22,7 @@ namespace MediaBrowser.Controller.Entities /// public class Folder : BaseItem { - private static readonly TypeMapper _typeMapper = new TypeMapper(); + private static readonly TypeMapper TypeMapper = new TypeMapper(); /// /// Gets a value indicating whether this instance is folder. @@ -883,7 +883,7 @@ namespace MediaBrowser.Controller.Entities { var type = child.Type; - var itemType = _typeMapper.GetType(type); + var itemType = TypeMapper.GetType(type); if (itemType == null) { diff --git a/MediaBrowser.Controller/Library/IMetadataSaver.cs b/MediaBrowser.Controller/Library/IMetadataSaver.cs index fbb8af626a..419b65f6fa 100644 --- a/MediaBrowser.Controller/Library/IMetadataSaver.cs +++ b/MediaBrowser.Controller/Library/IMetadataSaver.cs @@ -16,6 +16,13 @@ namespace MediaBrowser.Controller.Library /// true if XXXX, false otherwise bool Supports(BaseItem item); + /// + /// Gets the save path. + /// + /// The item. + /// System.String. + string GetSavePath(BaseItem item); + /// /// Saves the specified item. /// diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index 8a73e7ea96..625910c0bc 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -1,6 +1,10 @@ -using MediaBrowser.Common.Extensions; +using System.IO; +using System.Linq; +using System.Text; +using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; @@ -39,7 +43,7 @@ namespace MediaBrowser.Controller.Providers protected static readonly Task FalseTaskResult = Task.FromResult(false); protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(5, 5); - + /// /// Supportses the specified item. /// @@ -228,7 +232,7 @@ namespace MediaBrowser.Controller.Providers { return true; } - + return false; } @@ -282,6 +286,11 @@ namespace MediaBrowser.Controller.Providers } } + protected virtual string[] FilestampExtensions + { + get { return new string[] { }; } + } + /// /// Determines if the parent's file system stamp should be used for comparison /// @@ -302,10 +311,79 @@ namespace MediaBrowser.Controller.Providers { if (UseParentFileSystemStamp(item) && item.Parent != null) { - return item.Parent.FileSystemStamp; + return GetFileSystemStamp(item.Parent); } - return item.FileSystemStamp; + return GetFileSystemStamp(item); + } + + /// + /// Gets the file system stamp. + /// + /// The item. + /// Guid. + private Guid GetFileSystemStamp(BaseItem item) + { + // If there's no path or the item is a file, there's nothing to do + if (item.LocationType != LocationType.FileSystem) + { + return Guid.Empty; + } + + ItemResolveArgs resolveArgs; + + try + { + resolveArgs = item.ResolveArgs; + } + catch (IOException ex) + { + Logger.ErrorException("Error determining if path is directory: {0}", ex, item.Path); + throw; + } + + if (!resolveArgs.IsDirectory) + { + return Guid.Empty; + } + + var sb = new StringBuilder(); + + var extensions = FilestampExtensions; + + // Record the name of each file + // Need to sort these because accoring to msdn docs, our i/o methods are not guaranteed in any order + foreach (var file in resolveArgs.FileSystemChildren + .Where(i => IncludeInFileStamp(i, extensions)) + .OrderBy(f => f.Name)) + { + sb.Append(file.Name); + } + + foreach (var file in resolveArgs.MetadataFiles + .Where(i => IncludeInFileStamp(i, extensions)) + .OrderBy(f => f.Name)) + { + sb.Append(file.Name); + } + + return sb.ToString().GetMD5(); + } + + /// + /// Includes the in file stamp. + /// + /// The file. + /// The extensions. + /// true if XXXX, false otherwise + private bool IncludeInFileStamp(FileSystemInfo file, string[] extensions) + { + if ((file.Attributes & FileAttributes.Directory) == FileAttributes.Directory) + { + return false; + } + + return extensions.Length == 0 || extensions.Contains(file.Extension, StringComparer.OrdinalIgnoreCase); } } } diff --git a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs b/MediaBrowser.Controller/Providers/BaseProviderInfo.cs index 72fddfd93d..243ce32af6 100644 --- a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs +++ b/MediaBrowser.Controller/Providers/BaseProviderInfo.cs @@ -27,10 +27,6 @@ namespace MediaBrowser.Controller.Providers /// /// The provider version. public string ProviderVersion { get; set; } - /// - /// Contains a has of data that can be used to determine if the provider should refresh again - /// - public Guid Data { get; set; } } /// diff --git a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs index cd9289fa16..87c450d55e 100644 --- a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs @@ -53,6 +53,18 @@ namespace MediaBrowser.Providers } } + /// + /// Gets the filestamp extensions. + /// + /// The filestamp extensions. + protected override string[] FilestampExtensions + { + get + { + return BaseItem.SupportedImageExtensions; + } + } + /// /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// diff --git a/MediaBrowser.Providers/ImagesByNameProvider.cs b/MediaBrowser.Providers/ImagesByNameProvider.cs index a813634714..dad3a25f3b 100644 --- a/MediaBrowser.Providers/ImagesByNameProvider.cs +++ b/MediaBrowser.Providers/ImagesByNameProvider.cs @@ -54,7 +54,7 @@ namespace MediaBrowser.Providers protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) { // Force a refresh if the IBN path changed - if (providerInfo.Data != ConfigurationManager.ApplicationPaths.ItemsByNamePath.GetMD5()) + if (providerInfo.FileStamp != ConfigurationManager.ApplicationPaths.ItemsByNamePath.GetMD5()) { return true; } @@ -128,7 +128,7 @@ namespace MediaBrowser.Providers item.ProviderData[Id] = data; } - data.Data = ConfigurationManager.ApplicationPaths.ItemsByNamePath.GetMD5(); + data.FileStamp = ConfigurationManager.ApplicationPaths.ItemsByNamePath.GetMD5(); SetLastRefreshed(item, DateTime.UtcNow); return result; diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs index cfb33d7572..8ee2bcd8b8 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs @@ -67,6 +67,18 @@ namespace MediaBrowser.Providers.MediaInfo } } + /// + /// Gets the filestamp extensions. + /// + /// The filestamp extensions. + protected override string[] FilestampExtensions + { + get + { + return new[] { ".srt" }; + } + } + /// /// Supports video files and dvd structures /// @@ -251,7 +263,7 @@ namespace MediaBrowser.Providers.MediaInfo } var chapters = data.Chapters ?? new List(); - + if (video.VideoType == VideoType.BluRay || (video.IsoType.HasValue && video.IsoType.Value == IsoType.BluRay)) { var inputPath = isoMount != null ? isoMount.MountedPath : video.Path; diff --git a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs b/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs index af277b5fcc..10775c689b 100644 --- a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs @@ -50,7 +50,7 @@ namespace MediaBrowser.Providers.Music { // If song metadata has changed and we don't have an mbid, refresh if (string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Musicbrainz)) && - GetComparisonData(item as MusicAlbum) != providerInfo.Data) + GetComparisonData(item as MusicAlbum) != providerInfo.FileStamp) { return true; } @@ -85,7 +85,7 @@ namespace MediaBrowser.Providers.Music item.ProviderData[Id] = data; } - data.Data = GetComparisonData(item as MusicAlbum); + data.FileStamp = GetComparisonData(item as MusicAlbum); } private async Task GetAlbumResult(BaseItem item, CancellationToken cancellationToken) diff --git a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs index 35dba678e1..7a618c74f4 100644 --- a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs @@ -1,8 +1,8 @@ -using System.IO; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; +using System.IO; using System.Threading; using System.Threading.Tasks; @@ -46,11 +46,19 @@ namespace MediaBrowser.Providers.Savers { var video = (Video)item; - var directory = video.VideoType == VideoType.Iso || video.VideoType == VideoType.VideoFile ? Path.GetDirectoryName(video.Path) : video.Path; - - var xmlFilePath = Path.Combine(directory, "movie.xml"); + var xmlFilePath = GetSavePath(item); return Task.Run(() => { }); } + + + public string GetSavePath(BaseItem item) + { + var video = (Video)item; + + var directory = video.VideoType == VideoType.Iso || video.VideoType == VideoType.VideoFile ? Path.GetDirectoryName(video.Path) : video.Path; + + return Path.Combine(directory, "movie.xml"); + } } } diff --git a/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs b/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs index 3c146f0279..5b1490750c 100644 --- a/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs @@ -52,6 +52,18 @@ namespace MediaBrowser.Providers.TV } } + /// + /// Gets the filestamp extensions. + /// + /// The filestamp extensions. + protected override string[] FilestampExtensions + { + get + { + return BaseItem.SupportedImageExtensions; + } + } + /// /// Fetches metadata and returns true or false indicating if any work that requires persistence was done ///