From 7f5a4c2d4e3d8e1881dae0403367e35ad5699eaf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 8 Feb 2014 17:38:02 -0500 Subject: [PATCH] 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 +++--- .../Entities/IHasImages.cs | 3 +- .../Entities/Movies/Movie.cs | 2 +- MediaBrowser.Controller/Entities/TV/Season.cs | 8 +- .../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 ++ .../InternalMetadataFolderImageProvider.cs | 4 +- .../All/LocalImageProvider.cs | 40 ++++---- .../Books/BookMetadataService.cs | 2 - .../BoxSets/BoxSetMetadataService.cs | 4 +- .../Folders/CollectionFolderImageProvider.cs | 4 +- .../Folders/ImagesByNameImageProvider.cs | 4 +- .../Manager/ItemImageProvider.cs | 6 +- .../Manager/MetadataService.cs | 8 +- .../Movies/MovieMetadataService.cs | 2 +- .../Movies/TrailerMetadataService.cs | 2 +- .../Music/AudioMetadataService.cs | 4 +- .../People/PersonMetadataService.cs | 2 +- .../TV/EpisodeLocalImageProvider.cs | 96 +++++++++++++------ .../TV/SeasonMetadataService.cs | 2 +- .../TV/SeriesPostScanTask.cs | 4 +- .../TV/TvdbEpisodeImageProvider.cs | 8 +- .../TV/TvdbEpisodeProvider.cs | 3 +- .../TV/TvdbSeasonImageProvider.cs | 8 +- .../TV/TvdbSeriesProvider.cs | 28 ------ .../SqliteProviderInfoRepository.cs | 37 ++++--- 37 files changed, 278 insertions(+), 188 deletions(-) create mode 100644 MediaBrowser.Controller/Providers/DirectoryService.cs 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. /// diff --git a/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs b/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs index cecde64ca3..2526160066 100644 --- a/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs +++ b/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs @@ -54,13 +54,13 @@ namespace MediaBrowser.Providers.All } } - public List GetImages(IHasImages item) + public List GetImages(IHasImages item, DirectoryService directoryService) { var path = _config.ApplicationPaths.GetInternalMetadataPath(item.Id); try { - return new LocalImageProvider().GetImages(item, path); + return new LocalImageProvider().GetImages(item, path, directoryService); } catch (DirectoryNotFoundException) { diff --git a/MediaBrowser.Providers/All/LocalImageProvider.cs b/MediaBrowser.Providers/All/LocalImageProvider.cs index 7d70a35b6d..f54975a69d 100644 --- a/MediaBrowser.Providers/All/LocalImageProvider.cs +++ b/MediaBrowser.Providers/All/LocalImageProvider.cs @@ -57,7 +57,7 @@ namespace MediaBrowser.Providers.All return false; } - private IEnumerable GetFiles(IHasImages item, bool includeDirectories) + private IEnumerable GetFiles(IHasImages item, bool includeDirectories, DirectoryService directoryService) { if (item.LocationType != LocationType.FileSystem) { @@ -68,34 +68,34 @@ namespace MediaBrowser.Providers.All if (includeDirectories) { - return new DirectoryInfo(path).EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly) + return directoryService.GetFileSystemEntries(path) .Where(i => BaseItem.SupportedImageExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase) || (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory); } - return new DirectoryInfo(path).EnumerateFiles("*", SearchOption.TopDirectoryOnly) + return directoryService.GetFiles(path) .Where(i => BaseItem.SupportedImageExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase)); } - public List GetImages(IHasImages item) + public List GetImages(IHasImages item, DirectoryService directoryService) { - var files = GetFiles(item, true).ToList(); + var files = GetFiles(item, true, directoryService).ToList(); var list = new List(); - PopulateImages(item, list, files, true); + PopulateImages(item, list, files, true, directoryService); return list; } - public List GetImages(IHasImages item, string path) + public List GetImages(IHasImages item, string path, DirectoryService directoryService) { - return GetImages(item, new[] { path }); + return GetImages(item, new[] { path }, directoryService); } - public List GetImages(IHasImages item, IEnumerable paths) + public List GetImages(IHasImages item, IEnumerable paths, DirectoryService directoryService) { - var files = paths.SelectMany(i => new DirectoryInfo(i).EnumerateFiles("*", SearchOption.TopDirectoryOnly)) + var files = paths.SelectMany(directoryService.GetFiles) .Where(i => { var ext = i.Extension; @@ -108,12 +108,12 @@ namespace MediaBrowser.Providers.All var list = new List(); - PopulateImages(item, list, files, false); + PopulateImages(item, list, files, false, directoryService); return list; } - private void PopulateImages(IHasImages item, List images, List files, bool supportParentSeriesFiles) + private void PopulateImages(IHasImages item, List images, List files, bool supportParentSeriesFiles, DirectoryService directoryService) { var imagePrefix = string.Empty; @@ -124,7 +124,7 @@ namespace MediaBrowser.Providers.All } PopulatePrimaryImages(item, images, files, imagePrefix); - PopulateBackdrops(item, images, files, imagePrefix); + PopulateBackdrops(item, images, files, imagePrefix, directoryService); PopulateScreenshots(images, files, imagePrefix); AddImage(files, images, imagePrefix + "logo", ImageType.Logo); @@ -149,7 +149,7 @@ namespace MediaBrowser.Providers.All if (season != null) { - PopulateSeasonImagesFromSeriesFolder(season, images); + PopulateSeasonImagesFromSeriesFolder(season, images, directoryService); } } } @@ -185,7 +185,7 @@ namespace MediaBrowser.Providers.All } } - private void PopulateBackdrops(IHasImages item, List images, List files, string imagePrefix) + private void PopulateBackdrops(IHasImages item, List images, List files, string imagePrefix, DirectoryService directoryService) { PopulateBackdrops(images, files, imagePrefix, "backdrop", "backdrop", ImageType.Backdrop); @@ -208,13 +208,13 @@ namespace MediaBrowser.Providers.All if (extraFanartFolder != null) { - PopulateBackdropsFromExtraFanart(extraFanartFolder.FullName, images); + PopulateBackdropsFromExtraFanart(extraFanartFolder.FullName, images, directoryService); } } - private void PopulateBackdropsFromExtraFanart(string path, List images) + private void PopulateBackdropsFromExtraFanart(string path, List images, DirectoryService directoryService) { - var imageFiles = new DirectoryInfo(path).EnumerateFiles("*", SearchOption.TopDirectoryOnly) + var imageFiles = directoryService.GetFiles(path) .Where(i => { var extension = i.Extension; @@ -262,7 +262,7 @@ namespace MediaBrowser.Providers.All } private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private void PopulateSeasonImagesFromSeriesFolder(Season season, List images) + private void PopulateSeasonImagesFromSeriesFolder(Season season, List images, DirectoryService directoryService) { var seasonNumber = season.IndexNumber; @@ -272,7 +272,7 @@ namespace MediaBrowser.Providers.All return; } - var seriesFiles = GetFiles(series, false).ToList(); + var seriesFiles = GetFiles(series, false, directoryService).ToList(); // Try using the season name var prefix = season.Name.ToLower().Replace(" ", string.Empty); diff --git a/MediaBrowser.Providers/Books/BookMetadataService.cs b/MediaBrowser.Providers/Books/BookMetadataService.cs index 0cf672e2d5..6e070fec96 100644 --- a/MediaBrowser.Providers/Books/BookMetadataService.cs +++ b/MediaBrowser.Providers/Books/BookMetadataService.cs @@ -7,8 +7,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.Books { diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs index f4716f6ddb..9547eedd94 100644 --- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs +++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs @@ -11,12 +11,10 @@ using MediaBrowser.Providers.Manager; using System; using System.Collections.Generic; using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.BoxSets { - public class BoxSetMetadataService : MetadataService + public class BoxSetMetadataService : MetadataService { private readonly ILibraryManager _libraryManager; private readonly ILocalizationManager _iLocalizationManager; diff --git a/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs b/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs index f1b9a8384e..a55c42e4ba 100644 --- a/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs +++ b/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs @@ -27,11 +27,11 @@ namespace MediaBrowser.Providers.Folders } } - public List GetImages(IHasImages item) + public List GetImages(IHasImages item, DirectoryService directoryService) { var collectionFolder = (CollectionFolder)item; - return new LocalImageProvider().GetImages(item, collectionFolder.PhysicalLocations); + return new LocalImageProvider().GetImages(item, collectionFolder.PhysicalLocations, directoryService); } } } diff --git a/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs b/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs index e87f0919fd..daefe25ace 100644 --- a/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs +++ b/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs @@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.Folders } } - public List GetImages(IHasImages item) + public List GetImages(IHasImages item, DirectoryService directoryService) { var name = _fileSystem.GetValidFilename(item.Name); @@ -46,7 +46,7 @@ namespace MediaBrowser.Providers.Folders try { - return new LocalImageProvider().GetImages(item, path); + return new LocalImageProvider().GetImages(item, path, directoryService); } catch (DirectoryNotFoundException) { diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index b50e028bff..521f2869b5 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -34,13 +34,13 @@ namespace MediaBrowser.Providers.Manager _fileSystem = fileSystem; } - public bool ValidateImages(IHasImages item, IEnumerable providers) + public bool ValidateImages(IHasImages item, IEnumerable providers, DirectoryService directoryService) { - var hasChanges = item.ValidateImages(); + var hasChanges = item.ValidateImages(directoryService); foreach (var provider in providers.OfType()) { - var images = provider.GetImages(item); + var images = provider.GetImages(item, directoryService); if (MergeImages(item, images)) { diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index be42589b7c..b594c8cc88 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -44,6 +44,7 @@ namespace MediaBrowser.Providers.Manager { result.ItemId = item.Id; result.ItemName = item.Name; + result.ItemType = item.GetType().Name; var series = item as IHasSeries; @@ -64,6 +65,11 @@ namespace MediaBrowser.Providers.Manager public async Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) { + if (refreshOptions.DirectoryService == null) + { + refreshOptions.DirectoryService = new DirectoryService(Logger); + } + var itemOfType = (TItemType)item; var config = GetMetadataOptions(itemOfType); @@ -81,7 +87,7 @@ namespace MediaBrowser.Providers.Manager try { // Always validate images and check for new locally stored ones. - if (itemImageProvider.ValidateImages(item, allImageProviders.OfType())) + if (itemImageProvider.ValidateImages(item, allImageProviders.OfType(), refreshOptions.DirectoryService)) { updateType = updateType | ItemUpdateType.ImageUpdate; } diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs index 34536d97da..9ea43786eb 100644 --- a/MediaBrowser.Providers/Movies/MovieMetadataService.cs +++ b/MediaBrowser.Providers/Movies/MovieMetadataService.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - public class MovieMetadataService : MetadataService + public class MovieMetadataService : MetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/Movies/TrailerMetadataService.cs b/MediaBrowser.Providers/Movies/TrailerMetadataService.cs index d9ae6187cf..9c937db846 100644 --- a/MediaBrowser.Providers/Movies/TrailerMetadataService.cs +++ b/MediaBrowser.Providers/Movies/TrailerMetadataService.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - public class TrailerMetadataService : MetadataService + public class TrailerMetadataService : MetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/Music/AudioMetadataService.cs b/MediaBrowser.Providers/Music/AudioMetadataService.cs index cda22b0f5e..93be8d2e60 100644 --- a/MediaBrowser.Providers/Music/AudioMetadataService.cs +++ b/MediaBrowser.Providers/Music/AudioMetadataService.cs @@ -7,12 +7,10 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.Music { - public class AudioMetadataService : MetadataService + public class AudioMetadataService : MetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/People/PersonMetadataService.cs b/MediaBrowser.Providers/People/PersonMetadataService.cs index b3b3e88d05..faf606f3e4 100644 --- a/MediaBrowser.Providers/People/PersonMetadataService.cs +++ b/MediaBrowser.Providers/People/PersonMetadataService.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.People { - public class PersonMetadataService : MetadataService + public class PersonMetadataService : MetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs b/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs index df3b8b48f7..8a3af13d86 100644 --- a/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs +++ b/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs @@ -2,8 +2,10 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; +using System; using System.Collections.Generic; using System.IO; +using System.Linq; namespace MediaBrowser.Providers.TV { @@ -19,48 +21,84 @@ namespace MediaBrowser.Providers.TV return item is Episode && item.LocationType == LocationType.FileSystem; } - public List GetImages(IHasImages item) - { - var file = GetFile(item); - - var list = new List(); - - if (file != null) - { - list.Add(new LocalImageInfo - { - FileInfo = file, - Type = ImageType.Primary - }); - } - - return list; - } - - private FileInfo GetFile(IHasImages item) + public List GetImages(IHasImages item, DirectoryService directoryService) { var parentPath = Path.GetDirectoryName(item.Path); + var parentPathFiles = directoryService.GetFileSystemEntries(parentPath); + var nameWithoutExtension = Path.GetFileNameWithoutExtension(item.Path); - var thumbName = nameWithoutExtension + "-thumb"; - var path = Path.Combine(parentPath, thumbName + ".jpg"); - var fileInfo = new FileInfo(path); + var files = GetFilesFromParentFolder(nameWithoutExtension, parentPathFiles); - if (fileInfo.Exists) + if (files.Count > 0) { - return fileInfo; + return files; } - path = Path.Combine(parentPath, "metadata", nameWithoutExtension + ".jpg"); - fileInfo = new FileInfo(path); + var metadataPath = Path.Combine(parentPath, "metadata"); - if (fileInfo.Exists) + if (parentPathFiles.Any(i => string.Equals(i.FullName, metadataPath, StringComparison.OrdinalIgnoreCase))) { - return fileInfo; + return GetFilesFromParentFolder(nameWithoutExtension, directoryService.GetFiles(metadataPath)); } - return null; + return new List(); + } + + private List GetFilesFromParentFolder(string filenameWithoutExtension, IEnumerable parentPathFiles) + { + var thumbName = filenameWithoutExtension + "-thumb"; + + return parentPathFiles + .Where(i => + { + if (BaseItem.SupportedImageExtensions.Contains(i.Extension)) + { + var currentNameWithoutExtension = Path.GetFileNameWithoutExtension(i.Name); + + if (string.Equals(filenameWithoutExtension, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (string.Equals(thumbName, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + }) + .Select(i => new LocalImageInfo + { + FileInfo = (FileInfo)i, + Type = ImageType.Primary + }) + .ToList(); + } + + private List GetFilesFromMetadataFolder(string filenameWithoutExtension, IEnumerable metadataFiles) + { + return metadataFiles + .Where(i => + { + if (BaseItem.SupportedImageExtensions.Contains(i.Extension)) + { + if (string.Equals(filenameWithoutExtension, Path.GetFileNameWithoutExtension(i.Name), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + }) + .Select(i => new LocalImageInfo + { + FileInfo = i, + Type = ImageType.Primary + }) + .ToList(); } } } diff --git a/MediaBrowser.Providers/TV/SeasonMetadataService.cs b/MediaBrowser.Providers/TV/SeasonMetadataService.cs index b0c80d5d67..e76ad90752 100644 --- a/MediaBrowser.Providers/TV/SeasonMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeasonMetadataService.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.TV { - public class SeasonMetadataService : MetadataService + public class SeasonMetadataService : MetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs index dc06857ce3..68d05012f0 100644 --- a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs +++ b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs @@ -174,8 +174,7 @@ namespace MediaBrowser.Providers.TV { await series.RefreshMetadata(new MetadataRefreshOptions { - }, cancellationToken) - .ConfigureAwait(false); + }, cancellationToken).ConfigureAwait(false); await series.ValidateChildren(new Progress(), cancellationToken, true) .ConfigureAwait(false); @@ -469,6 +468,7 @@ namespace MediaBrowser.Providers.TV }; await series.AddChild(season, cancellationToken).ConfigureAwait(false); + await season.RefreshMetadata(new MetadataRefreshOptions { }, cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs index 754f973bc8..7d8f9e1864 100644 --- a/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs @@ -194,9 +194,13 @@ namespace MediaBrowser.Providers.TV public bool HasChanged(IHasMetadata item, DateTime date) { - if (!_config.Configuration.EnableTvDbUpdates && item.LocationType != LocationType.Virtual) + if (item.LocationType != LocationType.Virtual) { - return false; + // For non-virtual items, only enable if configured + if (!_config.Configuration.EnableTvDbUpdates) + { + return false; + } } if (!item.HasImage(ImageType.Primary)) diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs index 1c9f565f3c..d0b4050172 100644 --- a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs @@ -68,7 +68,8 @@ namespace MediaBrowser.Providers.TV public bool HasChanged(IHasMetadata item, DateTime date) { - if (!_config.Configuration.EnableTvDbUpdates && item.LocationType != LocationType.Virtual) + // Only enable for virtual items + if (item.LocationType != LocationType.Virtual) { return false; } diff --git a/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs b/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs index a6276d0d75..5216d84c5f 100644 --- a/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs @@ -342,9 +342,13 @@ namespace MediaBrowser.Providers.TV public bool HasChanged(IHasMetadata item, DateTime date) { - if (!_config.Configuration.EnableTvDbUpdates && item.LocationType != LocationType.Virtual) + if (item.LocationType != LocationType.Virtual) { - return false; + // For non-virtual items, only enable if configured + if (!_config.Configuration.EnableTvDbUpdates) + { + return false; + } } var season = (Season)item; diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs index ba8ac9fd6a..80c50e9589 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs @@ -1079,33 +1079,5 @@ namespace MediaBrowser.Providers.TV { get { return "TheTVDB"; } } - - public bool HasChanged(IHasMetadata item, DateTime date) - { - if (!_config.Configuration.EnableTvDbUpdates) - { - return false; - } - - var seriesId = item.GetProviderId(MetadataProviders.Tvdb); - - if (!string.IsNullOrEmpty(seriesId)) - { - var seriesDataPath = GetSeriesDataPath(_config.ApplicationPaths, seriesId); - - var seriesXmlFilename = item.GetPreferredMetadataLanguage() + ".xml"; - - var filePath = Path.Combine(seriesDataPath, seriesXmlFilename); - - var seriesFile = new FileInfo(filePath); - - if (!seriesFile.Exists || _fileSystem.GetLastWriteTimeUtc(seriesFile) > date) - { - return true; - } - } - - return false; - } } } diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs index eb6e142c13..b99a84c5c5 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs @@ -51,7 +51,7 @@ namespace MediaBrowser.Server.Implementations.Persistence string[] queries = { - "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, ItemName TEXT, SeriesName TEXT, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastStatus TEXT, LastErrorMessage TEXT, MetadataProvidersRefreshed TEXT, ImageProvidersRefreshed TEXT)", + "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, ItemName TEXT, ItemType TEXT, SeriesName TEXT, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastStatus TEXT, LastErrorMessage TEXT, MetadataProvidersRefreshed TEXT, ImageProvidersRefreshed TEXT)", "create index if not exists idx_MetadataStatus on MetadataStatus(ItemId)", //pragmas @@ -71,6 +71,7 @@ namespace MediaBrowser.Server.Implementations.Persistence { "ItemId", "ItemName", + "ItemType", "SeriesName", "DateLastMetadataRefresh", "DateLastImagesRefresh", @@ -144,37 +145,42 @@ namespace MediaBrowser.Server.Implementations.Persistence if (!reader.IsDBNull(2)) { - result.SeriesName = reader.GetString(2); + result.ItemName = reader.GetString(2); } if (!reader.IsDBNull(3)) { - result.DateLastMetadataRefresh = reader.GetDateTime(3).ToUniversalTime(); + result.SeriesName = reader.GetString(3); } if (!reader.IsDBNull(4)) { - result.DateLastImagesRefresh = reader.GetDateTime(4).ToUniversalTime(); + result.DateLastMetadataRefresh = reader.GetDateTime(4).ToUniversalTime(); } if (!reader.IsDBNull(5)) { - result.LastStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(5), true); + result.DateLastImagesRefresh = reader.GetDateTime(5).ToUniversalTime(); } if (!reader.IsDBNull(6)) { - result.LastErrorMessage = reader.GetString(6); + result.LastStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(6), true); } if (!reader.IsDBNull(7)) { - result.MetadataProvidersRefreshed = reader.GetString(7).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); + result.LastErrorMessage = reader.GetString(7); } if (!reader.IsDBNull(8)) { - result.ImageProvidersRefreshed = reader.GetString(8).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); + result.MetadataProvidersRefreshed = reader.GetString(8).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); + } + + if (!reader.IsDBNull(9)) + { + result.ImageProvidersRefreshed = reader.GetString(9).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); } return result; @@ -199,13 +205,14 @@ namespace MediaBrowser.Server.Implementations.Persistence _saveStatusCommand.GetParameter(0).Value = status.ItemId; _saveStatusCommand.GetParameter(1).Value = status.ItemName; - _saveStatusCommand.GetParameter(2).Value = status.SeriesName; - _saveStatusCommand.GetParameter(3).Value = status.DateLastMetadataRefresh; - _saveStatusCommand.GetParameter(4).Value = status.DateLastImagesRefresh; - _saveStatusCommand.GetParameter(5).Value = status.LastStatus.ToString(); - _saveStatusCommand.GetParameter(6).Value = status.LastErrorMessage; - _saveStatusCommand.GetParameter(7).Value = string.Join("|", status.MetadataProvidersRefreshed.ToArray()); - _saveStatusCommand.GetParameter(8).Value = string.Join("|", status.ImageProvidersRefreshed.ToArray()); + _saveStatusCommand.GetParameter(2).Value = status.ItemType; + _saveStatusCommand.GetParameter(3).Value = status.SeriesName; + _saveStatusCommand.GetParameter(4).Value = status.DateLastMetadataRefresh; + _saveStatusCommand.GetParameter(5).Value = status.DateLastImagesRefresh; + _saveStatusCommand.GetParameter(6).Value = status.LastStatus.ToString(); + _saveStatusCommand.GetParameter(7).Value = status.LastErrorMessage; + _saveStatusCommand.GetParameter(8).Value = string.Join("|", status.MetadataProvidersRefreshed.ToArray()); + _saveStatusCommand.GetParameter(9).Value = string.Join("|", status.ImageProvidersRefreshed.ToArray()); _saveStatusCommand.Transaction = transaction;