fixes #200 - MB3 Locking Folders for a long time

This commit is contained in:
Luke Pulverenti
2013-04-28 01:29:27 -04:00
parent 90bb3d46c4
commit b443d591a2
33 changed files with 254 additions and 405 deletions

View File

@@ -46,7 +46,7 @@ namespace MediaBrowser.Controller.Providers
protected override DateTime CompareDate(BaseItem item)
{
var entry = item.MetaLocation != null ? item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "folder.xml")) : null;
return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue;
return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue;
}
/// <summary>
@@ -73,9 +73,9 @@ namespace MediaBrowser.Controller.Providers
var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "folder.xml"));
if (metadataFile.HasValue)
if (metadataFile != null)
{
var path = metadataFile.Value.Path;
var path = metadataFile.FullName;
await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);

View File

@@ -17,7 +17,8 @@ namespace MediaBrowser.Controller.Providers
/// </summary>
public class ImageFromMediaLocationProvider : BaseMetadataProvider
{
public ImageFromMediaLocationProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
public ImageFromMediaLocationProvider(ILogManager logManager, IServerConfigurationManager configurationManager)
: base(logManager, configurationManager)
{
}
@@ -62,7 +63,7 @@ namespace MediaBrowser.Controller.Providers
public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
// Make sure current image paths still exist
ValidateImages(item);
@@ -72,7 +73,7 @@ namespace MediaBrowser.Controller.Providers
ValidateBackdrops(item);
cancellationToken.ThrowIfCancellationRequested();
PopulateBaseItemImages(item);
SetLastRefreshed(item, DateTime.UtcNow);
@@ -95,11 +96,11 @@ namespace MediaBrowser.Controller.Providers
{
var path = item.Images[image];
return IsInMetaLocation(item, path) && !item.ResolveArgs.GetMetaFileByPath(path).HasValue;
return IsInMetaLocation(item, path) && item.ResolveArgs.GetMetaFileByPath(path) == null;
}).ToList();
// Now remove them from the dictionary
foreach(var key in deletedKeys)
foreach (var key in deletedKeys)
{
item.Images.Remove(key);
}
@@ -117,7 +118,7 @@ namespace MediaBrowser.Controller.Providers
}
// Only validate paths from the same directory - need to copy to a list because we are going to potentially modify the collection below
var deletedImages = item.BackdropImagePaths.Where(path => IsInMetaLocation(item, path) && !item.ResolveArgs.GetMetaFileByPath(path).HasValue).ToList();
var deletedImages = item.BackdropImagePaths.Where(path => IsInMetaLocation(item, path) && item.ResolveArgs.GetMetaFileByPath(path) == null).ToList();
// Now remove them from the dictionary
foreach (var path in deletedImages)
@@ -143,7 +144,7 @@ namespace MediaBrowser.Controller.Providers
/// <param name="item">The item.</param>
/// <param name="filenameWithoutExtension">The filename without extension.</param>
/// <returns>System.Nullable{WIN32_FIND_DATA}.</returns>
protected virtual WIN32_FIND_DATA? GetImage(BaseItem item, string filenameWithoutExtension)
protected virtual FileSystemInfo GetImage(BaseItem item, string filenameWithoutExtension)
{
return item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.ResolveArgs.Path, filenameWithoutExtension + ".png")) ?? item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.ResolveArgs.Path, filenameWithoutExtension + ".jpg"));
}
@@ -160,65 +161,65 @@ namespace MediaBrowser.Controller.Providers
// Primary Image
var image = GetImage(item, "folder");
if (image.HasValue)
if (image != null)
{
item.SetImage(ImageType.Primary, image.Value.Path);
item.SetImage(ImageType.Primary, image.FullName);
}
// Logo Image
image = GetImage(item, "logo");
if (image.HasValue)
if (image != null)
{
item.SetImage(ImageType.Logo, image.Value.Path);
item.SetImage(ImageType.Logo, image.FullName);
}
// Banner Image
image = GetImage(item, "banner");
if (image.HasValue)
if (image != null)
{
item.SetImage(ImageType.Banner, image.Value.Path);
item.SetImage(ImageType.Banner, image.FullName);
}
// Clearart
image = GetImage(item, "clearart");
if (image.HasValue)
if (image != null)
{
item.SetImage(ImageType.Art, image.Value.Path);
item.SetImage(ImageType.Art, image.FullName);
}
// Thumbnail Image
image = GetImage(item, "thumb");
if (image.HasValue)
if (image != null)
{
item.SetImage(ImageType.Thumb, image.Value.Path);
item.SetImage(ImageType.Thumb, image.FullName);
}
// Thumbnail Image
image = GetImage(item, "box");
if (image.HasValue)
if (image != null)
{
item.SetImage(ImageType.Box, image.Value.Path);
item.SetImage(ImageType.Box, image.FullName);
}
// Thumbnail Image
image = GetImage(item, "menu");
if (image.HasValue)
if (image != null)
{
item.SetImage(ImageType.Menu, image.Value.Path);
item.SetImage(ImageType.Menu, image.FullName);
}
// Backdrop Image
image = GetImage(item, "backdrop");
if (image.HasValue)
if (image != null)
{
backdropFiles.Add(image.Value.Path);
backdropFiles.Add(image.FullName);
}
var unfound = 0;
@@ -227,9 +228,9 @@ namespace MediaBrowser.Controller.Providers
// Backdrop Image
image = GetImage(item, "backdrop" + i);
if (image.HasValue)
if (image != null)
{
backdropFiles.Add(image.Value.Path);
backdropFiles.Add(image.FullName);
}
else
{
@@ -250,9 +251,9 @@ namespace MediaBrowser.Controller.Providers
// Screenshot Image
image = GetImage(item, "screenshot");
if (image.HasValue)
if (image != null)
{
screenshotFiles.Add(image.Value.Path);
screenshotFiles.Add(image.FullName);
}
unfound = 0;
@@ -261,9 +262,9 @@ namespace MediaBrowser.Controller.Providers
// Screenshot Image
image = GetImage(item, "screenshot" + i);
if (image.HasValue)
if (image != null)
{
screenshotFiles.Add(image.Value.Path);
screenshotFiles.Add(image.FullName);
}
else
{

View File

@@ -88,7 +88,7 @@ namespace MediaBrowser.Controller.Providers
return DateTime.MinValue;
}
var files = new DirectoryInfo(location).EnumerateFiles("*", SearchOption.TopDirectoryOnly).ToList();
var files = new DirectoryInfo(location).EnumerateFiles().ToList();
if (files.Count == 0)
{
@@ -97,54 +97,14 @@ namespace MediaBrowser.Controller.Providers
return files.Select(f =>
{
var lastWriteTime = GetLastWriteTimeUtc(f);
var creationTime = GetCreationTimeUtc(f);
var lastWriteTime = FileSystem.GetLastWriteTimeUtc(f, Logger);
var creationTime = FileSystem.GetCreationTimeUtc(f, Logger);
return creationTime > lastWriteTime ? creationTime : lastWriteTime;
}).Max();
}
/// <summary>
/// Gets the creation time UTC.
/// </summary>
/// <param name="info">The info.</param>
/// <returns>DateTime.</returns>
private DateTime GetLastWriteTimeUtc(FileSystemInfo info)
{
// This could throw an error on some file systems that have dates out of range
try
{
return info.LastAccessTimeUtc;
}
catch (Exception ex)
{
Logger.ErrorException("Error determining LastAccessTimeUtc for {0}", ex, info.FullName);
return DateTime.MinValue;
}
}
/// <summary>
/// Gets the creation time UTC.
/// </summary>
/// <param name="info">The info.</param>
/// <returns>DateTime.</returns>
private DateTime GetCreationTimeUtc(FileSystemInfo info)
{
// This could throw an error on some file systems that have dates out of range
try
{
return info.CreationTimeUtc;
}
catch (Exception ex)
{
Logger.ErrorException("Error determining CreationTimeUtc for {0}", ex, info.FullName);
return DateTime.MinValue;
}
}
/// <summary>
/// Fetches metadata and returns true or false indicating if any work that requires persistence was done
/// </summary>
@@ -184,15 +144,21 @@ namespace MediaBrowser.Controller.Providers
/// <param name="item">The item.</param>
/// <param name="filenameWithoutExtension">The filename without extension.</param>
/// <returns>System.Nullable{WIN32_FIND_DATA}.</returns>
protected override WIN32_FIND_DATA? GetImage(BaseItem item, string filenameWithoutExtension)
protected override FileSystemInfo GetImage(BaseItem item, string filenameWithoutExtension)
{
var location = GetLocation(item);
var result = FileSystem.GetFileData(Path.Combine(location, filenameWithoutExtension + ".png"));
if (!result.HasValue)
result = FileSystem.GetFileData(Path.Combine(location, filenameWithoutExtension + ".jpg"));
var result = new FileInfo(Path.Combine(location, filenameWithoutExtension + ".png"));
return result;
if (!result.Exists)
result = new FileInfo(Path.Combine(location, filenameWithoutExtension + ".jpg"));
if (result.Exists)
{
return result;
}
return null;
}
}
}

View File

@@ -255,16 +255,17 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
var startIndex = video.MediaStreams == null ? 0 : video.MediaStreams.Count;
var streams = new List<MediaStream>();
foreach (var file in fileSystemChildren.Where(f => !f.IsDirectory))
foreach (var file in fileSystemChildren.Where(f => !f.Attributes.HasFlag(FileAttributes.Directory)))
{
var extension = Path.GetExtension(file.Path);
var fullName = file.FullName;
var extension = Path.GetExtension(fullName);
if (string.Equals(extension, ".srt", StringComparison.OrdinalIgnoreCase))
{
if (video.VideoType == VideoType.VideoFile)
{
// For video files the subtitle filename must match video filename
if (!string.Equals(Path.GetFileNameWithoutExtension(video.Path), Path.GetFileNameWithoutExtension(file.Path)))
if (!string.Equals(Path.GetFileNameWithoutExtension(video.Path), Path.GetFileNameWithoutExtension(fullName)))
{
continue;
}
@@ -275,7 +276,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
Index = startIndex++,
Type = MediaStreamType.Subtitle,
IsExternal = true,
Path = file.Path,
Path = fullName,
Codec = "srt"
});
}

View File

@@ -47,7 +47,7 @@ namespace MediaBrowser.Controller.Providers.Movies
protected override DateTime CompareDate(BaseItem item)
{
var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LOCAL_META_FILE_NAME));
return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue;
return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue;
}
/// <summary>
@@ -84,10 +84,10 @@ namespace MediaBrowser.Controller.Providers.Movies
cancellationToken.ThrowIfCancellationRequested();
var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LOCAL_META_FILE_NAME));
if (entry.HasValue)
if (entry != null)
{
// read in our saved meta and pass to processing function
var movieData = JsonSerializer.DeserializeFromFile<CompleteMovieData>(entry.Value.Path);
var movieData = JsonSerializer.DeserializeFromFile<CompleteMovieData>(entry.FullName);
cancellationToken.ThrowIfCancellationRequested();

View File

@@ -46,7 +46,7 @@ namespace MediaBrowser.Controller.Providers.Movies
protected override DateTime CompareDate(BaseItem item)
{
var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "movie.xml"));
return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue;
return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue;
}
/// <summary>
@@ -73,9 +73,9 @@ namespace MediaBrowser.Controller.Providers.Movies
var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "movie.xml"));
if (metadataFile.HasValue)
if (metadataFile != null)
{
var path = metadataFile.Value.Path;
var path = metadataFile.FullName;
var boxset = item as BoxSet;
await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);

View File

@@ -68,7 +68,7 @@ namespace MediaBrowser.Controller.Providers.Movies
protected override DateTime CompareDate(BaseItem item)
{
var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation,MetaFileName));
return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue;
return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue;
}
/// <summary>

View File

@@ -35,10 +35,10 @@ namespace MediaBrowser.Controller.Providers.Music
cancellationToken.ThrowIfCancellationRequested();
var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LastfmHelper.LocalArtistMetaFileName));
if (entry.HasValue)
if (entry != null)
{
// read in our saved meta and pass to processing function
var data = JsonSerializer.DeserializeFromFile<LastfmArtist>(entry.Value.Path);
var data = JsonSerializer.DeserializeFromFile<LastfmArtist>(entry.FullName);
cancellationToken.ThrowIfCancellationRequested();
@@ -93,7 +93,7 @@ namespace MediaBrowser.Controller.Providers.Music
protected override DateTime CompareDate(BaseItem item)
{
var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LastfmHelper.LocalArtistMetaFileName));
return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue;
return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue;
}
}

View File

@@ -15,7 +15,8 @@ namespace MediaBrowser.Controller.Providers.TV
/// </summary>
public class EpisodeImageFromMediaLocationProvider : BaseMetadataProvider
{
public EpisodeImageFromMediaLocationProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
public EpisodeImageFromMediaLocationProvider(ILogManager logManager, IServerConfigurationManager configurationManager)
: base(logManager, configurationManager)
{
}
@@ -60,7 +61,7 @@ namespace MediaBrowser.Controller.Providers.TV
public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
var episode = (Episode)item;
var episodeFileName = Path.GetFileName(episode.Path);
@@ -70,7 +71,7 @@ namespace MediaBrowser.Controller.Providers.TV
ValidateImage(episode, item.MetaLocation);
cancellationToken.ThrowIfCancellationRequested();
SetPrimaryImagePath(episode, parent, item.MetaLocation, episodeFileName);
SetLastRefreshed(item, DateTime.UtcNow);
@@ -98,7 +99,7 @@ namespace MediaBrowser.Controller.Providers.TV
return;
}
if (!episode.Parent.ResolveArgs.GetMetaFileByPath(path).HasValue)
if (episode.Parent.ResolveArgs.GetMetaFileByPath(path) == null)
{
episode.PrimaryImagePath = null;
}
@@ -122,9 +123,9 @@ namespace MediaBrowser.Controller.Providers.TV
var file = parent.ResolveArgs.GetMetaFileByPath(imageFiles[0]) ??
parent.ResolveArgs.GetMetaFileByPath(imageFiles[1]);
if (file.HasValue)
if (file != null)
{
item.PrimaryImagePath = file.Value.Path;
item.PrimaryImagePath = file.FullName;
}
}
}

View File

@@ -71,12 +71,12 @@ namespace MediaBrowser.Controller.Providers.TV
var file = item.ResolveArgs.Parent.ResolveArgs.GetMetaFileByPath(metadataFile);
if (!file.HasValue)
if (file == null)
{
return base.CompareDate(item);
}
return file.Value.LastWriteTimeUtc;
return file.LastWriteTimeUtc;
}
/// <summary>
@@ -93,7 +93,7 @@ namespace MediaBrowser.Controller.Providers.TV
var file = item.ResolveArgs.Parent.ResolveArgs.GetMetaFileByPath(metadataFile);
if (!file.HasValue)
if (file == null)
{
return false;
}

View File

@@ -47,7 +47,7 @@ namespace MediaBrowser.Controller.Providers.TV
protected override DateTime CompareDate(BaseItem item)
{
var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "series.xml"));
return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue;
return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue;
}
/// <summary>
@@ -74,9 +74,9 @@ namespace MediaBrowser.Controller.Providers.TV
var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "series.xml"));
if (metadataFile.HasValue)
if (metadataFile != null)
{
var path = metadataFile.Value.Path;
var path = metadataFile.FullName;
await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);