aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Controller/Entities/AggregateFolder.cs7
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs14
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs38
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs6
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs28
-rw-r--r--MediaBrowser.Controller/Entities/IHasImages.cs3
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs2
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs8
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs5
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs2
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj1
-rw-r--r--MediaBrowser.Controller/Providers/DirectoryService.cs62
-rw-r--r--MediaBrowser.Controller/Providers/IHasChangeMonitor.cs4
-rw-r--r--MediaBrowser.Controller/Providers/ILocalImageProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/ItemLookupInfo.cs5
-rw-r--r--MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs5
-rw-r--r--MediaBrowser.Controller/Providers/MetadataStatus.cs6
-rw-r--r--MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs4
-rw-r--r--MediaBrowser.Providers/All/LocalImageProvider.cs40
-rw-r--r--MediaBrowser.Providers/Books/BookMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs4
-rw-r--r--MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs4
-rw-r--r--MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs4
-rw-r--r--MediaBrowser.Providers/Manager/ItemImageProvider.cs6
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs8
-rw-r--r--MediaBrowser.Providers/Movies/MovieMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Movies/TrailerMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Music/AudioMetadataService.cs4
-rw-r--r--MediaBrowser.Providers/People/PersonMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs92
-rw-r--r--MediaBrowser.Providers/TV/SeasonMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/TV/SeriesPostScanTask.cs4
-rw-r--r--MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs8
-rw-r--r--MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs3
-rw-r--r--MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs8
-rw-r--r--MediaBrowser.Providers/TV/TvdbSeriesProvider.cs28
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs37
37 files changed, 276 insertions, 186 deletions
diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs
index ef455846e..f791f1608 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<string> PhysicalLocationsList { get; set; }
- protected override IEnumerable<FileSystemInfo> GetFileSystemChildren()
+ protected override IEnumerable<FileSystemInfo> 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
/// </summary>
/// <returns>IEnumerable{BaseItem}.</returns>
- protected override IEnumerable<BaseItem> GetNonCachedChildren()
+ protected override IEnumerable<BaseItem> GetNonCachedChildren(DirectoryService directoryService)
{
- return base.GetNonCachedChildren().Concat(_virtualChildren);
+ return base.GetNonCachedChildren(directoryService).Concat(_virtualChildren);
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index 42bfe9160..87551ef7b 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<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions)
+ protected override Task ValidateChildrenInternal(IProgress<double> 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 b3b6361a7..ad997779d 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<FileSystemInfo>();
await BeforeRefreshMetadata(options, files, cancellationToken).ConfigureAwait(false);
@@ -609,11 +611,11 @@ namespace MediaBrowser.Controller.Entities
}
}
- protected virtual IEnumerable<FileSystemInfo> GetFileSystemChildren()
+ protected virtual IEnumerable<FileSystemInfo> GetFileSystemChildren(DirectoryService directoryService)
{
var path = ContainingFolderPath;
- return new DirectoryInfo(path).EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly);
+ return directoryService.GetFileSystemEntries(path);
}
private async Task<bool> RefreshLocalTrailers(IHasTrailers item, MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken)
@@ -851,29 +853,6 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Finds the particular item by searching through our parents and, if not found there, loading from repo
- /// </summary>
- /// <param name="id">The id.</param>
- /// <returns>BaseItem.</returns>
- /// <exception cref="System.ArgumentException"></exception>
- 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;
- }
-
- /// <summary>
/// Gets a value indicating whether this instance is folder.
/// </summary>
/// <value><c>true</c> if this instance is folder; otherwise, <c>false</c>.</value>
@@ -1226,10 +1205,13 @@ namespace MediaBrowser.Controller.Entities
/// <summary>
/// Validates that images within the item are still on the file system
/// </summary>
- 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 f8d9c66c7..eb442bf6f 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<string> PhysicalLocationsList { get; set; }
- protected override IEnumerable<FileSystemInfo> GetFileSystemChildren()
+ protected override IEnumerable<FileSystemInfo> GetFileSystemChildren(DirectoryService directoryService)
{
return CreateResolveArgs().FileSystemChildren;
}
@@ -120,7 +120,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="refreshChildMetadata">if set to <c>true</c> [refresh child metadata].</param>
/// <param name="refreshOptions">The refresh options.</param>
/// <returns>Task.</returns>
- protected override Task ValidateChildrenInternal(IProgress<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions)
+ protected override Task ValidateChildrenInternal(IProgress<double> 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 8fae9629b..019361f15 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -309,15 +309,19 @@ namespace MediaBrowser.Controller.Entities
/// <returns>Task.</returns>
public Task ValidateChildren(IProgress<double> 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<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions)
+ private async Task ValidateChildrenWithCancellationSupport(IProgress<double> 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
/// <param name="recursive">if set to <c>true</c> [recursive].</param>
/// <param name="refreshChildMetadata">if set to <c>true</c> [refresh child metadata].</param>
/// <param name="refreshOptions">The refresh options.</param>
+ /// <param name="directoryService">The directory service.</param>
/// <returns>Task.</returns>
- protected async virtual Task ValidateChildrenInternal(IProgress<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions)
+ protected async virtual Task ValidateChildrenInternal(IProgress<double> 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<Folder>().ToList(), progress, cancellationToken).ConfigureAwait(false);
+ await ValidateSubFolders(ActualChildren.OfType<Folder>().ToList(), directoryService, progress, cancellationToken).ConfigureAwait(false);
}
progress.Report(20);
@@ -586,10 +591,11 @@ namespace MediaBrowser.Controller.Entities
/// Refreshes the children.
/// </summary>
/// <param name="children">The children.</param>
+ /// <param name="directoryService">The directory service.</param>
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
- private async Task ValidateSubFolders(IList<Folder> children, IProgress<double> progress, CancellationToken cancellationToken)
+ private async Task ValidateSubFolders(IList<Folder> children, DirectoryService directoryService, IProgress<double> 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
/// </summary>
/// <returns>IEnumerable{BaseItem}.</returns>
- protected virtual IEnumerable<BaseItem> GetNonCachedChildren()
+ protected virtual IEnumerable<BaseItem> GetNonCachedChildren(DirectoryService directoryService)
{
- return LibraryManager.ResolvePaths<BaseItem>(GetFileSystemChildren(), this);
+ return LibraryManager.ResolvePaths<BaseItem>(GetFileSystemChildren(directoryService), this);
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs
index 62ef0a85a..053938f33 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
/// <summary>
/// Validates the images and returns true or false indicating if any were removed.
/// </summary>
- bool ValidateImages();
+ bool ValidateImages(DirectoryService directoryService);
/// <summary>
/// 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 7214f0f6f..50cf31068 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<bool> RefreshSpecialFeatures(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken)
+ private async Task<bool> RefreshSpecialFeatures(MetadataRefreshOptions options, IEnumerable<FileSystemInfo> 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 d266f1fde..ba79a95cc 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
/// <summary>
/// Class Season
/// </summary>
- public class Season : Folder, IHasSeries
+ public class Season : Folder, IHasSeries, IHasLookupInfo<SeasonInfo>
{
/// <summary>
@@ -241,5 +242,10 @@ namespace MediaBrowser.Controller.Entities.TV
return series == null ? null : series.Name;
}
}
+
+ public SeasonInfo GetLookupInfo()
+ {
+ return GetItemLookupInfo<SeasonInfo>();
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index 8fe5f43f1..4128c5d95 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
/// </summary>
/// <returns>IEnumerable{BaseItem}.</returns>
- protected override IEnumerable<BaseItem> GetNonCachedChildren()
+ protected override IEnumerable<BaseItem> 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 e7bee35f5..e2275fde7 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -181,7 +181,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="fileSystemChildren">The file system children.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{System.Boolean}.</returns>
- private async Task<bool> RefreshAdditionalParts(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken)
+ private async Task<bool> RefreshAdditionalParts(MetadataRefreshOptions options, IEnumerable<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken)
{
var newItems = LoadAdditionalParts(fileSystemChildren).ToList();
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 41e737300..efc74e483 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -146,6 +146,7 @@
<Compile Include="Notifications\NotificationUpdateEventArgs.cs" />
<Compile Include="Persistence\IFileOrganizationRepository.cs" />
<Compile Include="Persistence\MediaStreamQuery.cs" />
+ <Compile Include="Providers\DirectoryService.cs" />
<Compile Include="Providers\ICustomMetadataProvider.cs" />
<Compile Include="Providers\IHasChangeMonitor.cs" />
<Compile Include="Entities\IHasMetadata.cs" />
diff --git a/MediaBrowser.Controller/Providers/DirectoryService.cs b/MediaBrowser.Controller/Providers/DirectoryService.cs
new file mode 100644
index 000000000..961f3acc7
--- /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<string, List<FileSystemInfo>> _cache = new Dictionary<string, List<FileSystemInfo>>(StringComparer.OrdinalIgnoreCase);
+
+ public DirectoryService(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public List<FileSystemInfo> GetFileSystemEntries(string path)
+ {
+ List<FileSystemInfo> 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<FileInfo> GetFiles(string path)
+ {
+ return GetFileSystemEntries(path).OfType<FileInfo>();
+ }
+
+ public IEnumerable<DirectoryInfo> GetDirectories(string path)
+ {
+ return GetFileSystemEntries(path).OfType<DirectoryInfo>();
+ }
+
+ 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 6428bfd3d..ada2cbc6c 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 6b97a552d..cd139bb14 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<LocalImageInfo> GetImages(IHasImages item);
+ List<LocalImageInfo> GetImages(IHasImages item, DirectoryService directoryService);
}
public class LocalImageInfo
diff --git a/MediaBrowser.Controller/Providers/ItemLookupInfo.cs b/MediaBrowser.Controller/Providers/ItemLookupInfo.cs
index d8dd03847..e8321d0b1 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 83f1a12d9..3ab26ad66 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
/// </summary>
[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 adfae54f5..1e84e5880 100644
--- a/MediaBrowser.Controller/Providers/MetadataStatus.cs
+++ b/MediaBrowser.Controller/Providers/MetadataStatus.cs
@@ -19,6 +19,12 @@ namespace MediaBrowser.Controller.Providers
public string ItemName { get; set; }
/// <summary>
+ /// Gets or sets the type of the item.
+ /// </summary>
+ /// <value>The type of the item.</value>
+ public string ItemType { get; set; }
+
+ /// <summary>
/// Gets or sets the name of the series.
/// </summary>
/// <value>The name of the series.</value>
diff --git a/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs b/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs
index cecde64ca..252616006 100644
--- a/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs
+++ b/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs
@@ -54,13 +54,13 @@ namespace MediaBrowser.Providers.All
}
}
- public List<LocalImageInfo> GetImages(IHasImages item)
+ public List<LocalImageInfo> 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 7d70a35b6..f54975a69 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<FileSystemInfo> GetFiles(IHasImages item, bool includeDirectories)
+ private IEnumerable<FileSystemInfo> 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<LocalImageInfo> GetImages(IHasImages item)
+ public List<LocalImageInfo> GetImages(IHasImages item, DirectoryService directoryService)
{
- var files = GetFiles(item, true).ToList();
+ var files = GetFiles(item, true, directoryService).ToList();
var list = new List<LocalImageInfo>();
- PopulateImages(item, list, files, true);
+ PopulateImages(item, list, files, true, directoryService);
return list;
}
- public List<LocalImageInfo> GetImages(IHasImages item, string path)
+ public List<LocalImageInfo> GetImages(IHasImages item, string path, DirectoryService directoryService)
{
- return GetImages(item, new[] { path });
+ return GetImages(item, new[] { path }, directoryService);
}
- public List<LocalImageInfo> GetImages(IHasImages item, IEnumerable<string> paths)
+ public List<LocalImageInfo> GetImages(IHasImages item, IEnumerable<string> 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<LocalImageInfo>();
- PopulateImages(item, list, files, false);
+ PopulateImages(item, list, files, false, directoryService);
return list;
}
- private void PopulateImages(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> files, bool supportParentSeriesFiles)
+ private void PopulateImages(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> 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<LocalImageInfo> images, List<FileSystemInfo> files, string imagePrefix)
+ private void PopulateBackdrops(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> 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<LocalImageInfo> images)
+ private void PopulateBackdropsFromExtraFanart(string path, List<LocalImageInfo> 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<LocalImageInfo> images)
+ private void PopulateSeasonImagesFromSeriesFolder(Season season, List<LocalImageInfo> 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 0cf672e2d..6e070fec9 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 f4716f6dd..9547eedd9 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<BoxSet, ItemLookupInfo>
+ public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo>
{
private readonly ILibraryManager _libraryManager;
private readonly ILocalizationManager _iLocalizationManager;
diff --git a/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs b/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs
index f1b9a8384..a55c42e4b 100644
--- a/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs
+++ b/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs
@@ -27,11 +27,11 @@ namespace MediaBrowser.Providers.Folders
}
}
- public List<LocalImageInfo> GetImages(IHasImages item)
+ public List<LocalImageInfo> 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 e87f0919f..daefe25ac 100644
--- a/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs
+++ b/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs
@@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.Folders
}
}
- public List<LocalImageInfo> GetImages(IHasImages item)
+ public List<LocalImageInfo> 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 b50e028bf..521f2869b 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<IImageProvider> providers)
+ public bool ValidateImages(IHasImages item, IEnumerable<IImageProvider> providers, DirectoryService directoryService)
{
- var hasChanges = item.ValidateImages();
+ var hasChanges = item.ValidateImages(directoryService);
foreach (var provider in providers.OfType<ILocalImageFileProvider>())
{
- 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 be42589b7..b594c8cc8 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<ILocalImageProvider>()))
+ if (itemImageProvider.ValidateImages(item, allImageProviders.OfType<ILocalImageProvider>(), refreshOptions.DirectoryService))
{
updateType = updateType | ItemUpdateType.ImageUpdate;
}
diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs
index 34536d97d..9ea43786e 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<Movie, ItemLookupInfo>
+ public class MovieMetadataService : MetadataService<Movie, MovieInfo>
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Providers/Movies/TrailerMetadataService.cs b/MediaBrowser.Providers/Movies/TrailerMetadataService.cs
index d9ae6187c..9c937db84 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<Trailer, ItemLookupInfo>
+ public class TrailerMetadataService : MetadataService<Trailer, TrailerInfo>
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Providers/Music/AudioMetadataService.cs b/MediaBrowser.Providers/Music/AudioMetadataService.cs
index cda22b0f5..93be8d2e6 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<Audio, ItemLookupInfo>
+ public class AudioMetadataService : MetadataService<Audio, SongInfo>
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Providers/People/PersonMetadataService.cs b/MediaBrowser.Providers/People/PersonMetadataService.cs
index b3b3e88d0..faf606f3e 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<Person, ItemLookupInfo>
+ public class PersonMetadataService : MetadataService<Person, PersonLookupInfo>
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs b/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs
index df3b8b48f..8a3af13d8 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<LocalImageInfo> GetImages(IHasImages item)
+ public List<LocalImageInfo> GetImages(IHasImages item, DirectoryService directoryService)
{
- var file = GetFile(item);
+ var parentPath = Path.GetDirectoryName(item.Path);
+
+ var parentPathFiles = directoryService.GetFileSystemEntries(parentPath);
+
+ var nameWithoutExtension = Path.GetFileNameWithoutExtension(item.Path);
+
+ var files = GetFilesFromParentFolder(nameWithoutExtension, parentPathFiles);
+
+ if (files.Count > 0)
+ {
+ return files;
+ }
- var list = new List<LocalImageInfo>();
+ var metadataPath = Path.Combine(parentPath, "metadata");
- if (file != null)
+ if (parentPathFiles.Any(i => string.Equals(i.FullName, metadataPath, StringComparison.OrdinalIgnoreCase)))
{
- list.Add(new LocalImageInfo
- {
- FileInfo = file,
- Type = ImageType.Primary
- });
+ return GetFilesFromParentFolder(nameWithoutExtension, directoryService.GetFiles(metadataPath));
}
- return list;
+ return new List<LocalImageInfo>();
}
- private FileInfo GetFile(IHasImages item)
+ private List<LocalImageInfo> GetFilesFromParentFolder(string filenameWithoutExtension, IEnumerable<FileSystemInfo> parentPathFiles)
{
- var parentPath = Path.GetDirectoryName(item.Path);
+ var thumbName = filenameWithoutExtension + "-thumb";
- var nameWithoutExtension = Path.GetFileNameWithoutExtension(item.Path);
- var thumbName = nameWithoutExtension + "-thumb";
+ return parentPathFiles
+ .Where(i =>
+ {
+ if (BaseItem.SupportedImageExtensions.Contains(i.Extension))
+ {
+ var currentNameWithoutExtension = Path.GetFileNameWithoutExtension(i.Name);
- var path = Path.Combine(parentPath, thumbName + ".jpg");
- var fileInfo = new FileInfo(path);
+ if (string.Equals(filenameWithoutExtension, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
- if (fileInfo.Exists)
- {
- return fileInfo;
- }
+ if (string.Equals(thumbName, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+ }
- path = Path.Combine(parentPath, "metadata", nameWithoutExtension + ".jpg");
- fileInfo = new FileInfo(path);
+ return false;
+ })
+ .Select(i => new LocalImageInfo
+ {
+ FileInfo = (FileInfo)i,
+ Type = ImageType.Primary
+ })
+ .ToList();
+ }
- if (fileInfo.Exists)
- {
- return fileInfo;
- }
+ private List<LocalImageInfo> GetFilesFromMetadataFolder(string filenameWithoutExtension, IEnumerable<FileInfo> metadataFiles)
+ {
+ return metadataFiles
+ .Where(i =>
+ {
+ if (BaseItem.SupportedImageExtensions.Contains(i.Extension))
+ {
+ if (string.Equals(filenameWithoutExtension, Path.GetFileNameWithoutExtension(i.Name), StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+ }
- return null;
+ 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 b0c80d5d6..e76ad9075 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<Season, ItemLookupInfo>
+ public class SeasonMetadataService : MetadataService<Season, SeasonInfo>
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
index dc06857ce..68d05012f 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<double>(), 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 754f973bc..7d8f9e186 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 1c9f565f3..d0b405017 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 a6276d0d7..5216d84c5 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 ba8ac9fd6..80c50e958 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 eb6e142c1..b99a84c5c 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;