Browse Source

limit the extensions that are factored into the file stamp check

Luke Pulverenti 12 years ago
parent
commit
d32c71ca39

+ 0 - 69
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -219,29 +219,6 @@ namespace MediaBrowser.Controller.Entities
             }
         }
 
-        /// <summary>
-        /// The _file system stamp
-        /// </summary>
-        private Guid? _fileSystemStamp;
-        /// <summary>
-        /// 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.
-        /// </summary>
-        /// <value>The file system stamp.</value>
-        [IgnoreDataMember]
-        public Guid FileSystemStamp
-        {
-            get
-            {
-                if (!_fileSystemStamp.HasValue)
-                {
-                    _fileSystemStamp = GetFileSystemStamp();
-                }
-
-                return _fileSystemStamp.Value;
-            }
-        }
-
         /// <summary>
         /// Gets the type of the media.
         /// </summary>
@@ -255,49 +232,6 @@ namespace MediaBrowser.Controller.Entities
             }
         }
 
-        /// <summary>
-        /// 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.
-        /// </summary>
-        /// <returns>Guid.</returns>
-        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();
-        }
-
         /// <summary>
         /// The _resolve args
         /// </summary>
@@ -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;
             }
         }
 

+ 2 - 2
MediaBrowser.Controller/Entities/Folder.cs

@@ -22,7 +22,7 @@ namespace MediaBrowser.Controller.Entities
     /// </summary>
     public class Folder : BaseItem
     {
-        private static readonly TypeMapper _typeMapper = new TypeMapper();
+        private static readonly TypeMapper TypeMapper = new TypeMapper();
 
         /// <summary>
         /// 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)
             {

+ 7 - 0
MediaBrowser.Controller/Library/IMetadataSaver.cs

@@ -16,6 +16,13 @@ namespace MediaBrowser.Controller.Library
         /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
         bool Supports(BaseItem item);
 
+        /// <summary>
+        /// Gets the save path.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        /// <returns>System.String.</returns>
+        string GetSavePath(BaseItem item);
+
         /// <summary>
         /// Saves the specified item.
         /// </summary>

+ 83 - 5
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<bool> FalseTaskResult = Task.FromResult(false);
 
         protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(5, 5);
-        
+
         /// <summary>
         /// Supportses the specified item.
         /// </summary>
@@ -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[] { }; }
+        }
+
         /// <summary>
         /// Determines if the parent's file system stamp should be used for comparison
         /// </summary>
@@ -302,10 +311,79 @@ namespace MediaBrowser.Controller.Providers
         {
             if (UseParentFileSystemStamp(item) && item.Parent != null)
             {
-                return item.Parent.FileSystemStamp;
+                return GetFileSystemStamp(item.Parent);
+            }
+
+            return GetFileSystemStamp(item);
+        }
+
+        /// <summary>
+        /// Gets the file system stamp.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        /// <returns>Guid.</returns>
+        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();
+        }
+
+        /// <summary>
+        /// Includes the in file stamp.
+        /// </summary>
+        /// <param name="file">The file.</param>
+        /// <param name="extensions">The extensions.</param>
+        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
+        private bool IncludeInFileStamp(FileSystemInfo file, string[] extensions)
+        {
+            if ((file.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+            {
+                return false;
             }
 
-            return item.FileSystemStamp;
+            return extensions.Length == 0 || extensions.Contains(file.Extension, StringComparer.OrdinalIgnoreCase);
         }
     }
 }

+ 0 - 4
MediaBrowser.Controller/Providers/BaseProviderInfo.cs

@@ -27,10 +27,6 @@ namespace MediaBrowser.Controller.Providers
         /// </summary>
         /// <value>The provider version.</value>
         public string ProviderVersion { get; set; }
-        /// <summary>
-        /// Contains a has of data that can be used to determine if the provider should refresh again
-        /// </summary>
-        public Guid Data { get; set; }
     }
 
     /// <summary>

+ 12 - 0
MediaBrowser.Providers/ImageFromMediaLocationProvider.cs

@@ -53,6 +53,18 @@ namespace MediaBrowser.Providers
             }
         }
 
+        /// <summary>
+        /// Gets the filestamp extensions.
+        /// </summary>
+        /// <value>The filestamp extensions.</value>
+        protected override string[] FilestampExtensions
+        {
+            get
+            {
+                return BaseItem.SupportedImageExtensions;
+            }
+        }
+
         /// <summary>
         /// Fetches metadata and returns true or false indicating if any work that requires persistence was done
         /// </summary>

+ 2 - 2
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;

+ 13 - 1
MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs

@@ -67,6 +67,18 @@ namespace MediaBrowser.Providers.MediaInfo
             }
         }
 
+        /// <summary>
+        /// Gets the filestamp extensions.
+        /// </summary>
+        /// <value>The filestamp extensions.</value>
+        protected override string[] FilestampExtensions
+        {
+            get
+            {
+                return new[] { ".srt" };
+            }
+        }
+
         /// <summary>
         /// Supports video files and dvd structures
         /// </summary>
@@ -251,7 +263,7 @@ namespace MediaBrowser.Providers.MediaInfo
             }
 
             var chapters = data.Chapters ?? new List<ChapterInfo>();
-            
+
             if (video.VideoType == VideoType.BluRay || (video.IsoType.HasValue && video.IsoType.Value == IsoType.BluRay))
             {
                 var inputPath = isoMount != null ? isoMount.MountedPath : video.Path;

+ 2 - 2
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<LastfmGetAlbumResult> GetAlbumResult(BaseItem item, CancellationToken cancellationToken)

+ 13 - 5
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");
+        }
     }
 }

+ 12 - 0
MediaBrowser.Providers/TV/EpisodeImageFromMediaLocationProvider.cs

@@ -52,6 +52,18 @@ namespace MediaBrowser.Providers.TV
             }
         }
 
+        /// <summary>
+        /// Gets the filestamp extensions.
+        /// </summary>
+        /// <value>The filestamp extensions.</value>
+        protected override string[] FilestampExtensions
+        {
+            get
+            {
+                return BaseItem.SupportedImageExtensions;
+            }
+        }
+        
         /// <summary>
         /// Fetches metadata and returns true or false indicating if any work that requires persistence was done
         /// </summary>