From 7f5a4c2d4e3d8e1881dae0403367e35ad5699eaf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 8 Feb 2014 17:38:02 -0500 Subject: added item type to refresh info --- .../Entities/AggregateFolder.cs | 7 +-- .../Entities/Audio/MusicArtist.cs | 14 +---- MediaBrowser.Controller/Entities/BaseItem.cs | 38 ++++--------- .../Entities/CollectionFolder.cs | 6 +-- MediaBrowser.Controller/Entities/Folder.cs | 28 ++++++---- MediaBrowser.Controller/Entities/IHasImages.cs | 3 +- MediaBrowser.Controller/Entities/Movies/Movie.cs | 2 +- MediaBrowser.Controller/Entities/TV/Season.cs | 8 ++- MediaBrowser.Controller/Entities/UserRootFolder.cs | 5 +- MediaBrowser.Controller/Entities/Video.cs | 2 +- .../MediaBrowser.Controller.csproj | 1 + .../Providers/DirectoryService.cs | 62 ++++++++++++++++++++++ .../Providers/IHasChangeMonitor.cs | 4 +- .../Providers/ILocalImageProvider.cs | 2 +- .../Providers/ItemLookupInfo.cs | 5 ++ .../Providers/MetadataRefreshOptions.cs | 5 +- .../Providers/MetadataStatus.cs | 6 +++ 17 files changed, 131 insertions(+), 67 deletions(-) create mode 100644 MediaBrowser.Controller/Providers/DirectoryService.cs (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs index ef455846e7..f791f16082 100644 --- a/MediaBrowser.Controller/Entities/AggregateFolder.cs +++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization; +using MediaBrowser.Controller.Providers; namespace MediaBrowser.Controller.Entities { @@ -56,7 +57,7 @@ namespace MediaBrowser.Controller.Entities public List PhysicalLocationsList { get; set; } - protected override IEnumerable GetFileSystemChildren() + protected override IEnumerable GetFileSystemChildren(DirectoryService directoryService) { return CreateResolveArgs().FileSystemChildren; } @@ -118,9 +119,9 @@ namespace MediaBrowser.Controller.Entities /// Get the children of this folder from the actual file system /// /// IEnumerable{BaseItem}. - protected override IEnumerable GetNonCachedChildren() + protected override IEnumerable GetNonCachedChildren(DirectoryService directoryService) { - return base.GetNonCachedChildren().Concat(_virtualChildren); + return base.GetNonCachedChildren(directoryService).Concat(_virtualChildren); } /// diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 42bfe9160e..87551ef7b3 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -52,7 +52,7 @@ namespace MediaBrowser.Controller.Entities.Audio } private readonly Task _cachedTask = Task.FromResult(true); - protected override Task ValidateChildrenInternal(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions) + protected override Task ValidateChildrenInternal(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, DirectoryService directoryService) { if (IsAccessedByName) { @@ -60,17 +60,7 @@ namespace MediaBrowser.Controller.Entities.Audio return _cachedTask; } - return base.ValidateChildrenInternal(progress, cancellationToken, recursive, refreshChildMetadata, refreshOptions); - } - - public override string GetClientTypeName() - { - if (IsAccessedByName) - { - //return "Artist"; - } - - return base.GetClientTypeName(); + return base.ValidateChildrenInternal(progress, cancellationToken, recursive, refreshChildMetadata, refreshOptions, directoryService); } public MusicArtist() diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index b3b6361a71..ad997779d1 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -565,8 +565,10 @@ namespace MediaBrowser.Controller.Entities if (IsFolder || Parent != null) { + options.DirectoryService = options.DirectoryService ?? new DirectoryService(Logger); + var files = locationType == LocationType.FileSystem || locationType == LocationType.Offline ? - GetFileSystemChildren().ToList() : + GetFileSystemChildren(options.DirectoryService).ToList() : new List(); await BeforeRefreshMetadata(options, files, cancellationToken).ConfigureAwait(false); @@ -609,11 +611,11 @@ namespace MediaBrowser.Controller.Entities } } - protected virtual IEnumerable GetFileSystemChildren() + protected virtual IEnumerable GetFileSystemChildren(DirectoryService directoryService) { var path = ContainingFolderPath; - return new DirectoryInfo(path).EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly); + return directoryService.GetFileSystemEntries(path); } private async Task RefreshLocalTrailers(IHasTrailers item, MetadataRefreshOptions options, List fileSystemChildren, CancellationToken cancellationToken) @@ -850,29 +852,6 @@ namespace MediaBrowser.Controller.Entities return IsParentalAllowed(user); } - /// - /// Finds the particular item by searching through our parents and, if not found there, loading from repo - /// - /// The id. - /// BaseItem. - /// - protected BaseItem FindParentItem(Guid id) - { - if (id == Guid.Empty) - { - throw new ArgumentException(); - } - - var parent = Parent; - while (parent != null && !parent.IsRoot) - { - if (parent.Id == id) return parent; - parent = parent.Parent; - } - - return null; - } - /// /// Gets a value indicating whether this instance is folder. /// @@ -1226,10 +1205,13 @@ namespace MediaBrowser.Controller.Entities /// /// Validates that images within the item are still on the file system /// - public bool ValidateImages() + public bool ValidateImages(DirectoryService directoryService) { + var allDirectories = ImageInfos.Select(i => System.IO.Path.GetDirectoryName(i.Path)).Distinct(StringComparer.OrdinalIgnoreCase).ToList(); + var allFiles = allDirectories.SelectMany(directoryService.GetFiles).Select(i => i.FullName).ToList(); + var deletedImages = ImageInfos - .Where(image => !File.Exists(image.Path)) + .Where(image => !allFiles.Contains(image.Path, StringComparer.OrdinalIgnoreCase)) .ToList(); if (deletedImages.Count > 0) diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index f8d9c66c7b..eb442bf6fe 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using System; using System.Collections.Generic; using System.IO; @@ -7,7 +8,6 @@ using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Providers; namespace MediaBrowser.Controller.Entities { @@ -61,7 +61,7 @@ namespace MediaBrowser.Controller.Entities public List PhysicalLocationsList { get; set; } - protected override IEnumerable GetFileSystemChildren() + protected override IEnumerable GetFileSystemChildren(DirectoryService directoryService) { return CreateResolveArgs().FileSystemChildren; } @@ -120,7 +120,7 @@ namespace MediaBrowser.Controller.Entities /// if set to true [refresh child metadata]. /// The refresh options. /// Task. - protected override Task ValidateChildrenInternal(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions) + protected override Task ValidateChildrenInternal(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, DirectoryService directoryService) { CreateResolveArgs(); ResetDynamicChildren(); diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 8fae9629be..019361f159 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -309,15 +309,19 @@ namespace MediaBrowser.Controller.Entities /// Task. public Task ValidateChildren(IProgress progress, CancellationToken cancellationToken, bool? recursive = null, bool forceRefreshMetadata = false) { + var directoryService = new DirectoryService(Logger); + return ValidateChildrenWithCancellationSupport(progress, cancellationToken, recursive ?? true, true, new MetadataRefreshOptions { - ReplaceAllMetadata = forceRefreshMetadata - }); + ReplaceAllMetadata = forceRefreshMetadata, + DirectoryService = directoryService + + }, directoryService); } - private async Task ValidateChildrenWithCancellationSupport(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions) + private async Task ValidateChildrenWithCancellationSupport(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, DirectoryService directoryService) { cancellationToken.ThrowIfCancellationRequested(); @@ -337,7 +341,7 @@ namespace MediaBrowser.Controller.Entities var linkedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(innerCancellationTokenSource.Token, cancellationToken); - await ValidateChildrenInternal(progress, linkedCancellationTokenSource.Token, recursive, refreshChildMetadata, refreshOptions).ConfigureAwait(false); + await ValidateChildrenInternal(progress, linkedCancellationTokenSource.Token, recursive, refreshChildMetadata, refreshOptions, directoryService).ConfigureAwait(false); } catch (OperationCanceledException ex) { @@ -369,8 +373,9 @@ namespace MediaBrowser.Controller.Entities /// if set to true [recursive]. /// if set to true [refresh child metadata]. /// The refresh options. + /// The directory service. /// Task. - protected async virtual Task ValidateChildrenInternal(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions) + protected async virtual Task ValidateChildrenInternal(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, DirectoryService directoryService) { var locationType = LocationType; @@ -384,7 +389,7 @@ namespace MediaBrowser.Controller.Entities try { - nonCachedChildren = GetNonCachedChildren(); + nonCachedChildren = GetNonCachedChildren(directoryService); } catch (IOException ex) { @@ -482,7 +487,7 @@ namespace MediaBrowser.Controller.Entities if (recursive) { - await ValidateSubFolders(ActualChildren.OfType().ToList(), progress, cancellationToken).ConfigureAwait(false); + await ValidateSubFolders(ActualChildren.OfType().ToList(), directoryService, progress, cancellationToken).ConfigureAwait(false); } progress.Report(20); @@ -586,10 +591,11 @@ namespace MediaBrowser.Controller.Entities /// Refreshes the children. /// /// The children. + /// The directory service. /// The progress. /// The cancellation token. /// Task. - private async Task ValidateSubFolders(IList children, IProgress progress, CancellationToken cancellationToken) + private async Task ValidateSubFolders(IList children, DirectoryService directoryService, IProgress progress, CancellationToken cancellationToken) { var list = children; var childCount = list.Count; @@ -617,7 +623,7 @@ namespace MediaBrowser.Controller.Entities } }); - await child.ValidateChildrenWithCancellationSupport(innerProgress, cancellationToken, true, false, null) + await child.ValidateChildrenWithCancellationSupport(innerProgress, cancellationToken, true, false, null, directoryService) .ConfigureAwait(false); } } @@ -675,9 +681,9 @@ namespace MediaBrowser.Controller.Entities /// Get the children of this folder from the actual file system /// /// IEnumerable{BaseItem}. - protected virtual IEnumerable GetNonCachedChildren() + protected virtual IEnumerable GetNonCachedChildren(DirectoryService directoryService) { - return LibraryManager.ResolvePaths(GetFileSystemChildren(), this); + return LibraryManager.ResolvePaths(GetFileSystemChildren(directoryService), this); } /// diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index 62ef0a85a3..053938f339 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -1,4 +1,5 @@ using System.IO; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -108,7 +109,7 @@ namespace MediaBrowser.Controller.Entities /// /// Validates the images and returns true or false indicating if any were removed. /// - bool ValidateImages(); + bool ValidateImages(DirectoryService directoryService); /// /// Gets a value indicating whether this instance is owned item. diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 7214f0f6f3..50cf31068b 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -113,7 +113,7 @@ namespace MediaBrowser.Controller.Entities.Movies } } - private async Task RefreshSpecialFeatures(MetadataRefreshOptions options, List fileSystemChildren, CancellationToken cancellationToken) + private async Task RefreshSpecialFeatures(MetadataRefreshOptions options, IEnumerable fileSystemChildren, CancellationToken cancellationToken) { var newItems = LoadSpecialFeatures(fileSystemChildren).ToList(); var newItemIds = newItems.Select(i => i.Id).ToList(); diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index d266f1fded..ba79a95cc5 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Localization; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; @@ -11,7 +12,7 @@ namespace MediaBrowser.Controller.Entities.TV /// /// Class Season /// - public class Season : Folder, IHasSeries + public class Season : Folder, IHasSeries, IHasLookupInfo { /// @@ -241,5 +242,10 @@ namespace MediaBrowser.Controller.Entities.TV return series == null ? null : series.Name; } } + + public SeasonInfo GetLookupInfo() + { + return GetItemLookupInfo(); + } } } diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs index 8fe5f43f1a..4128c5d95c 100644 --- a/MediaBrowser.Controller/Entities/UserRootFolder.cs +++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using MediaBrowser.Controller.Providers; namespace MediaBrowser.Controller.Entities { @@ -13,9 +14,9 @@ namespace MediaBrowser.Controller.Entities /// Get the children of this folder from the actual file system /// /// IEnumerable{BaseItem}. - protected override IEnumerable GetNonCachedChildren() + protected override IEnumerable GetNonCachedChildren(DirectoryService directoryService) { - return base.GetNonCachedChildren().Concat(LibraryManager.RootFolder.VirtualChildren); + return base.GetNonCachedChildren(directoryService).Concat(LibraryManager.RootFolder.VirtualChildren); } } } diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index e7bee35f50..e2275fde72 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -181,7 +181,7 @@ namespace MediaBrowser.Controller.Entities /// The file system children. /// The cancellation token. /// Task{System.Boolean}. - private async Task RefreshAdditionalParts(MetadataRefreshOptions options, List fileSystemChildren, CancellationToken cancellationToken) + private async Task RefreshAdditionalParts(MetadataRefreshOptions options, IEnumerable fileSystemChildren, CancellationToken cancellationToken) { var newItems = LoadAdditionalParts(fileSystemChildren).ToList(); diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 41e737300d..efc74e4833 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -146,6 +146,7 @@ + diff --git a/MediaBrowser.Controller/Providers/DirectoryService.cs b/MediaBrowser.Controller/Providers/DirectoryService.cs new file mode 100644 index 0000000000..961f3acc76 --- /dev/null +++ b/MediaBrowser.Controller/Providers/DirectoryService.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using MediaBrowser.Model.Logging; + +namespace MediaBrowser.Controller.Providers +{ + public class DirectoryService + { + private readonly ILogger _logger; + + private readonly Dictionary> _cache = new Dictionary>(StringComparer.OrdinalIgnoreCase); + + public DirectoryService(ILogger logger) + { + _logger = logger; + } + + public List GetFileSystemEntries(string path) + { + List entries; + + if (!_cache.TryGetValue(path, out entries)) + { + //_logger.Debug("Getting files for " + path); + + entries = new DirectoryInfo(path).EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly).ToList(); + _cache.Add(path, entries); + } + + return entries; + } + + public IEnumerable GetFiles(string path) + { + return GetFileSystemEntries(path).OfType(); + } + + public IEnumerable GetDirectories(string path) + { + return GetFileSystemEntries(path).OfType(); + } + + public FileInfo GetFile(string path) + { + var directory = Path.GetDirectoryName(path); + var filename = Path.GetFileName(path); + + return GetFiles(directory).FirstOrDefault(i => string.Equals(i.Name, filename, StringComparison.OrdinalIgnoreCase)); + } + + + public DirectoryInfo GetDirectory(string path) + { + var directory = Path.GetDirectoryName(path); + var name = Path.GetFileName(path); + + return GetDirectories(directory).FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)); + } + } +} diff --git a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs b/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs index 6428bfd3dc..ada2cbc6c4 100644 --- a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs +++ b/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs @@ -1,5 +1,5 @@ -using System; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; +using System; namespace MediaBrowser.Controller.Providers { diff --git a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs index 6b97a552d1..cd139bb14f 100644 --- a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs +++ b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs @@ -17,7 +17,7 @@ namespace MediaBrowser.Controller.Providers public interface ILocalImageFileProvider : ILocalImageProvider { - List GetImages(IHasImages item); + List GetImages(IHasImages item, DirectoryService directoryService); } public class LocalImageInfo diff --git a/MediaBrowser.Controller/Providers/ItemLookupInfo.cs b/MediaBrowser.Controller/Providers/ItemLookupInfo.cs index d8dd038478..e8321d0b17 100644 --- a/MediaBrowser.Controller/Providers/ItemLookupInfo.cs +++ b/MediaBrowser.Controller/Providers/ItemLookupInfo.cs @@ -149,4 +149,9 @@ namespace MediaBrowser.Controller.Providers { } + + public class SeasonInfo : ItemLookupInfo + { + + } } diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs index 83f1a12d91..3ab26ad668 100644 --- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs +++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs @@ -1,4 +1,5 @@ -using System; +using MediaBrowser.Model.Logging; +using System; namespace MediaBrowser.Controller.Providers { @@ -16,6 +17,8 @@ namespace MediaBrowser.Controller.Providers /// [Obsolete] public bool ForceSave { get; set; } + + public DirectoryService DirectoryService { get; set; } } public class ImageRefreshOptions diff --git a/MediaBrowser.Controller/Providers/MetadataStatus.cs b/MediaBrowser.Controller/Providers/MetadataStatus.cs index adfae54f50..1e84e58802 100644 --- a/MediaBrowser.Controller/Providers/MetadataStatus.cs +++ b/MediaBrowser.Controller/Providers/MetadataStatus.cs @@ -18,6 +18,12 @@ namespace MediaBrowser.Controller.Providers /// The name of the item. public string ItemName { get; set; } + /// + /// Gets or sets the type of the item. + /// + /// The type of the item. + public string ItemType { get; set; } + /// /// Gets or sets the name of the series. /// -- cgit v1.2.3