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 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 item.FileSystemStamp;
+ 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
///