diff options
Diffstat (limited to 'MediaBrowser.Providers')
46 files changed, 414 insertions, 569 deletions
diff --git a/MediaBrowser.Providers/Books/BookMetadataService.cs b/MediaBrowser.Providers/Books/BookMetadataService.cs index 53e2af3a5..311082d96 100644 --- a/MediaBrowser.Providers/Books/BookMetadataService.cs +++ b/MediaBrowser.Providers/Books/BookMetadataService.cs @@ -12,25 +12,17 @@ namespace MediaBrowser.Providers.Books { public class BookMetadataService : MetadataService<Book, BookInfo> { - public BookMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public BookMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Book source, Book target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Book> source, MetadataResult<Book> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.SeriesName)) + if (replaceData || string.IsNullOrEmpty(target.Item.SeriesName)) { - target.SeriesName = source.SeriesName; + target.Item.SeriesName = source.Item.SeriesName; } } } diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs index 69b78b5f1..8b405302e 100644 --- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs +++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs @@ -15,33 +15,10 @@ namespace MediaBrowser.Providers.BoxSets { public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo> { - public BoxSetMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public BoxSetMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(BoxSet source, BoxSet target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - - if (mergeMetadataSettings) - { - var list = source.LinkedChildren.Where(i => i.Type != LinkedChildType.Manual).ToList(); - - list.AddRange(target.LinkedChildren.Where(i => i.Type == LinkedChildType.Manual)); - - target.LinkedChildren = list; - target.Shares = source.Shares; - } - } - protected override async Task<ItemUpdateType> BeforeSave(BoxSet item, bool isFullRefresh, ItemUpdateType currentUpdateType) { var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false); @@ -59,5 +36,23 @@ namespace MediaBrowser.Providers.BoxSets return updateType; } + + protected override void MergeData(MetadataResult<BoxSet> source, MetadataResult<BoxSet> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; + + if (mergeMetadataSettings) + { + var list = sourceItem.LinkedChildren.Where(i => i.Type != LinkedChildType.Manual).ToList(); + + list.AddRange(targetItem.LinkedChildren.Where(i => i.Type == LinkedChildType.Manual)); + + targetItem.LinkedChildren = list; + targetItem.Shares = sourceItem.Shares; + } + } } } diff --git a/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs b/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs index 70a72fba5..9d80559f1 100644 --- a/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs +++ b/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Channels { public class AudioChannelItemMetadataService : MetadataService<ChannelAudioItem, ItemLookupInfo> { - public AudioChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AudioChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(ChannelAudioItem source, ChannelAudioItem target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<ChannelAudioItem> source, MetadataResult<ChannelAudioItem> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Channels/ChannelMetadataService.cs b/MediaBrowser.Providers/Channels/ChannelMetadataService.cs index 957fc2d93..faa35b379 100644 --- a/MediaBrowser.Providers/Channels/ChannelMetadataService.cs +++ b/MediaBrowser.Providers/Channels/ChannelMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Channels { public class ChannelMetadataService : MetadataService<Channel, ItemLookupInfo> { - public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Channel source, Channel target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Channel> source, MetadataResult<Channel> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs b/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs index b815f3ccd..1e7b5aca8 100644 --- a/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs +++ b/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Channels { public class VideoChannelItemMetadataService : MetadataService<ChannelVideoItem, ChannelItemLookupInfo> { - public VideoChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public VideoChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(ChannelVideoItem source, ChannelVideoItem target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<ChannelVideoItem> source, MetadataResult<ChannelVideoItem> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Folders/FolderMetadataService.cs b/MediaBrowser.Providers/Folders/FolderMetadataService.cs index 3f4691aa0..d54093da6 100644 --- a/MediaBrowser.Providers/Folders/FolderMetadataService.cs +++ b/MediaBrowser.Providers/Folders/FolderMetadataService.cs @@ -12,23 +12,10 @@ namespace MediaBrowser.Providers.Folders { public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo> { - public FolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public FolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Folder source, Folder target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - } - public override int Order { get @@ -37,5 +24,10 @@ namespace MediaBrowser.Providers.Folders return 10; } } + + protected override void MergeData(MetadataResult<Folder> source, MetadataResult<Folder> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/Folders/UserViewMetadataService.cs b/MediaBrowser.Providers/Folders/UserViewMetadataService.cs index 97ac78a82..1dc09e01d 100644 --- a/MediaBrowser.Providers/Folders/UserViewMetadataService.cs +++ b/MediaBrowser.Providers/Folders/UserViewMetadataService.cs @@ -12,20 +12,11 @@ namespace MediaBrowser.Providers.Folders { public class UserViewMetadataService : MetadataService<UserView, ItemLookupInfo> { - public UserViewMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) - : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public UserViewMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(UserView source, UserView target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<UserView> source, MetadataResult<UserView> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs index 3e94de95a..957596a30 100644 --- a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs +++ b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.GameGenres { public class GameGenreMetadataService : MetadataService<GameGenre, ItemLookupInfo> { - public GameGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GameGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(GameGenre source, GameGenre target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<GameGenre> source, MetadataResult<GameGenre> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Games/GameMetadataService.cs b/MediaBrowser.Providers/Games/GameMetadataService.cs index 46715fcbd..b9403aaa6 100644 --- a/MediaBrowser.Providers/Games/GameMetadataService.cs +++ b/MediaBrowser.Providers/Games/GameMetadataService.cs @@ -12,30 +12,25 @@ namespace MediaBrowser.Providers.Games { public class GameMetadataService : MetadataService<Game, GameInfo> { - public GameMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GameMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Game source, Game target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Game> source, MetadataResult<Game> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.GameSystem)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.GameSystem)) { - target.GameSystem = source.GameSystem; + targetItem.GameSystem = sourceItem.GameSystem; } - if (replaceData || !target.PlayersSupported.HasValue) + if (replaceData || !targetItem.PlayersSupported.HasValue) { - target.PlayersSupported = source.PlayersSupported; + targetItem.PlayersSupported = sourceItem.PlayersSupported; } } } diff --git a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs index 963b2e49f..24786034d 100644 --- a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs +++ b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs @@ -14,25 +14,20 @@ namespace MediaBrowser.Providers.Games { public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemInfo> { - public GameSystemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GameSystemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(GameSystem source, GameSystem target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<GameSystem> source, MetadataResult<GameSystem> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.GameSystemName)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.GameSystemName)) { - target.GameSystemName = source.GameSystemName; + targetItem.GameSystemName = sourceItem.GameSystemName; } } } diff --git a/MediaBrowser.Providers/Genres/GenreMetadataService.cs b/MediaBrowser.Providers/Genres/GenreMetadataService.cs index abe025577..5cdd6d847 100644 --- a/MediaBrowser.Providers/Genres/GenreMetadataService.cs +++ b/MediaBrowser.Providers/Genres/GenreMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Genres { public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo> { - public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Genre source, Genre target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Genre> source, MetadataResult<Genre> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs index 4fc5ba40d..b3d9d6a72 100644 --- a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs +++ b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs @@ -14,18 +14,11 @@ namespace MediaBrowser.Providers.LiveTv { public class AudioRecordingService : MetadataService<LiveTvAudioRecording, ItemLookupInfo> { - public AudioRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AudioRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - protected override void MergeData(LiveTvAudioRecording source, LiveTvAudioRecording target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvAudioRecording> source, MetadataResult<LiveTvAudioRecording> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs index 37bfe4107..231017cd9 100644 --- a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs @@ -14,14 +14,11 @@ namespace MediaBrowser.Providers.LiveTv { public class ChannelMetadataService : MetadataService<LiveTvChannel, ItemLookupInfo> { - public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - protected override void MergeData(LiveTvChannel source, LiveTvChannel target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvChannel> source, MetadataResult<LiveTvChannel> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs index f17389615..8576993fd 100644 --- a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs @@ -12,23 +12,11 @@ namespace MediaBrowser.Providers.LiveTv { public class ProgramMetadataService : MetadataService<LiveTvProgram, LiveTvProgramLookupInfo> { - public ProgramMetadataService( - IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, - IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) - : base( - serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ProgramMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings"></param> - protected override void MergeData(LiveTvProgram source, LiveTvProgram target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvProgram> source, MetadataResult<LiveTvProgram> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs index c47297d9c..4d8b27285 100644 --- a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs +++ b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs @@ -14,18 +14,11 @@ namespace MediaBrowser.Providers.LiveTv { public class VideoRecordingService : MetadataService<LiveTvVideoRecording, ItemLookupInfo> { - public VideoRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public VideoRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - protected override void MergeData(LiveTvVideoRecording source, LiveTvVideoRecording target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvVideoRecording> source, MetadataResult<LiveTvVideoRecording> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index bc0b1bcb2..de41a0f96 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -24,8 +24,9 @@ namespace MediaBrowser.Providers.Manager protected readonly IProviderRepository ProviderRepo; protected readonly IFileSystem FileSystem; protected readonly IUserDataManager UserDataManager; + protected readonly ILibraryManager LibraryManager; - protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) + protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) { ServerConfigurationManager = serverConfigurationManager; Logger = logger; @@ -33,6 +34,7 @@ namespace MediaBrowser.Providers.Manager ProviderRepo = providerRepo; FileSystem = fileSystem; UserDataManager = userDataManager; + LibraryManager = libraryManager; } /// <summary> @@ -118,6 +120,11 @@ namespace MediaBrowser.Providers.Manager refreshResult.AddStatus(ProviderRefreshStatus.Failure, ex.Message); } + var metadataResult = new MetadataResult<TItemType> + { + Item = itemOfType + }; + // Next run metadata providers if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) { @@ -136,7 +143,7 @@ namespace MediaBrowser.Providers.Manager { var id = await CreateInitialLookupInfo(itemOfType, cancellationToken).ConfigureAwait(false); - var result = await RefreshWithProviders(itemOfType, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false); + var result = await RefreshWithProviders(metadataResult, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false); updateType = updateType | result.UpdateType; refreshResult.AddStatus(result.Status, result.ErrorMessage); @@ -174,7 +181,7 @@ namespace MediaBrowser.Providers.Manager } // Save to database - await SaveItem(itemOfType, updateType, cancellationToken); + await SaveItem(metadataResult, updateType, cancellationToken).ConfigureAwait(false); } if (updateType > ItemUpdateType.None || refreshResult.IsDirty) @@ -321,9 +328,14 @@ namespace MediaBrowser.Providers.Manager return providers; } - protected Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken) + protected async Task SaveItem(MetadataResult<TItemType> result, ItemUpdateType reason, CancellationToken cancellationToken) { - return item.UpdateToRepository(reason, cancellationToken); + await result.Item.UpdateToRepository(reason, cancellationToken).ConfigureAwait(false); + + if (result.Item.SupportsPeople) + { + await LibraryManager.UpdatePeople(result.Item as BaseItem, result.People); + } } public bool CanRefresh(IHasMetadata item) @@ -331,7 +343,7 @@ namespace MediaBrowser.Providers.Manager return item is TItemType; } - protected virtual async Task<RefreshResult> RefreshWithProviders(TItemType item, + protected virtual async Task<RefreshResult> RefreshWithProviders(MetadataResult<TItemType> metadata, TIdType id, MetadataRefreshOptions options, List<IMetadataProvider> providers, @@ -344,6 +356,8 @@ namespace MediaBrowser.Providers.Manager Providers = providers.Select(i => i.GetType().FullName.GetMD5()).ToList() }; + var item = metadata.Item; + var customProviders = providers.OfType<ICustomMetadataProvider<TItemType>>().ToList(); var logName = item.LocationType == LocationType.Remote ? item.Name ?? item.Path : item.Path ?? item.Name; @@ -352,11 +366,16 @@ namespace MediaBrowser.Providers.Manager await RunCustomProvider(provider, item, logName, options, refreshResult, cancellationToken).ConfigureAwait(false); } - var temp = CreateNew(); - temp.Path = item.Path; + var temp = new MetadataResult<TItemType> + { + Item = CreateNew() + }; + temp.Item.Path = item.Path; var successfulProviderCount = 0; var failedProviderCount = 0; + var userDataList = new List<UserItemData>(); + // If replacing all metadata, run internet providers first if (options.ReplaceAllMetadata) { @@ -371,7 +390,6 @@ namespace MediaBrowser.Providers.Manager } var hasLocalMetadata = false; - var userDataList = new List<UserItemData>(); foreach (var provider in providers.OfType<ILocalMetadataProvider<TItemType>>().ToList()) { @@ -393,7 +411,7 @@ namespace MediaBrowser.Providers.Manager userDataList = localItem.UserDataLIst; - MergeData(localItem.Item, temp, new List<MetadataFields>(), !options.ReplaceAllMetadata, true); + MergeData(localItem, temp, new List<MetadataFields>(), !options.ReplaceAllMetadata, true); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport; // Only one local provider allowed per item @@ -452,10 +470,10 @@ namespace MediaBrowser.Providers.Manager if (!hasLocalMetadata) { // TODO: If the new metadata from above has some blank data, this can cause old data to get filled into those empty fields - MergeData(item, temp, new List<MetadataFields>(), false, true); + MergeData(metadata, temp, new List<MetadataFields>(), false, true); } - MergeData(temp, item, item.LockedFields, true, true); + MergeData(temp, metadata, item.LockedFields, true, true); } } @@ -526,7 +544,7 @@ namespace MediaBrowser.Providers.Manager return new TItemType(); } - private async Task<RefreshResult> ExecuteRemoteProviders(TItemType temp, string logName, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, CancellationToken cancellationToken) + private async Task<RefreshResult> ExecuteRemoteProviders(MetadataResult<TItemType> temp, string logName, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, CancellationToken cancellationToken) { var refreshResult = new RefreshResult(); @@ -537,7 +555,7 @@ namespace MediaBrowser.Providers.Manager if (id != null) { - MergeNewData(temp, id); + MergeNewData(temp.Item, id); } try @@ -548,7 +566,7 @@ namespace MediaBrowser.Providers.Manager { NormalizeRemoteResult(result.Item); - MergeData(result.Item, temp, new List<MetadataFields>(), false, false); + MergeData(result, temp, new List<MetadataFields>(), false, false); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload; @@ -624,8 +642,8 @@ namespace MediaBrowser.Providers.Manager } } - protected abstract void MergeData(TItemType source, - TItemType target, + protected abstract void MergeData(MetadataResult<TItemType> source, + MetadataResult<TItemType> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings); diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 01a89bf26..14009a94f 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -150,6 +150,11 @@ namespace MediaBrowser.Providers.Manager public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken) { + if (string.IsNullOrWhiteSpace(source)) + { + throw new ArgumentNullException("source"); + } + var fileStream = _fileSystem.GetFileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true); return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, fileStream, mimeType, type, imageIndex, internalCacheKey, cancellationToken); @@ -480,12 +485,11 @@ namespace MediaBrowser.Providers.Manager // Give it a dummy path just so that it looks like a file system item var dummy = new T() { - Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"), - - // Dummy this up to fool the local trailer check - Parent = new Folder() + Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy") }; + dummy.SetParent(new Folder()); + var options = GetMetadataOptions(dummy); var summary = new MetadataPluginSummary @@ -722,12 +726,11 @@ namespace MediaBrowser.Providers.Manager // Give it a dummy path just so that it looks like a file system item var dummy = new TItemType { - Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"), - - // Dummy this up to fool the local trailer check - Parent = new Folder() + Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy") }; + dummy.SetParent(new Folder()); + var options = GetMetadataOptions(dummy); var providers = GetMetadataProvidersInternal<TItemType>(dummy, options, searchInfo.IncludeDisabledProviders) diff --git a/MediaBrowser.Providers/Manager/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs index 1c526b4db..a0a0493d5 100644 --- a/MediaBrowser.Providers/Manager/ProviderUtils.cs +++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -8,12 +9,16 @@ namespace MediaBrowser.Providers.Manager { public static class ProviderUtils { - public static void MergeBaseItemData(BaseItem source, - BaseItem target, + public static void MergeBaseItemData<T>(MetadataResult<T> sourceResult, + MetadataResult<T> targetResult, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + where T : BaseItem { + var source = sourceResult.Item; + var target = targetResult.Item; + if (source == null) { throw new ArgumentNullException("source"); @@ -100,9 +105,9 @@ namespace MediaBrowser.Providers.Manager if (!lockedFields.Contains(MetadataFields.Cast)) { - if (replaceData || target.People.Count == 0) + if (replaceData || targetResult.People.Count == 0) { - target.People = source.People; + targetResult.People = sourceResult.People; } } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs index 33f35450d..f2f1663e4 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs @@ -8,6 +8,7 @@ using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Entities; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Serialization; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; @@ -22,15 +23,17 @@ namespace MediaBrowser.Providers.MediaInfo private readonly IItemRepository _itemRepo; private readonly IApplicationPaths _appPaths; private readonly IJsonSerializer _json; + private readonly ILibraryManager _libraryManager; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - public FFProbeAudioInfo(IMediaEncoder mediaEncoder, IItemRepository itemRepo, IApplicationPaths appPaths, IJsonSerializer json) + public FFProbeAudioInfo(IMediaEncoder mediaEncoder, IItemRepository itemRepo, IApplicationPaths appPaths, IJsonSerializer json, ILibraryManager libraryManager) { _mediaEncoder = mediaEncoder; _itemRepo = itemRepo; _appPaths = appPaths; _json = json; + _libraryManager = libraryManager; } public async Task<ItemUpdateType> Probe<T>(T item, CancellationToken cancellationToken) @@ -96,7 +99,7 @@ namespace MediaBrowser.Providers.MediaInfo /// <param name="cancellationToken">The cancellation token.</param> /// <param name="mediaInfo">The media information.</param> /// <returns>Task.</returns> - protected Task Fetch(Audio audio, CancellationToken cancellationToken, Model.MediaInfo.MediaInfo mediaInfo) + protected async Task Fetch(Audio audio, CancellationToken cancellationToken, Model.MediaInfo.MediaInfo mediaInfo) { var mediaStreams = mediaInfo.MediaStreams; @@ -110,9 +113,9 @@ namespace MediaBrowser.Providers.MediaInfo var extension = (Path.GetExtension(audio.Path) ?? string.Empty).TrimStart('.'); audio.Container = extension; - FetchDataFromTags(audio, mediaInfo); + await FetchDataFromTags(audio, mediaInfo).ConfigureAwait(false); - return _itemRepo.SaveMediaStreams(audio.Id, mediaStreams, cancellationToken); + await _itemRepo.SaveMediaStreams(audio.Id, mediaStreams, cancellationToken).ConfigureAwait(false); } /// <summary> @@ -120,7 +123,7 @@ namespace MediaBrowser.Providers.MediaInfo /// </summary> /// <param name="audio">The audio.</param> /// <param name="data">The data.</param> - private void FetchDataFromTags(Audio audio, Model.MediaInfo.MediaInfo data) + private async Task FetchDataFromTags(Audio audio, Model.MediaInfo.MediaInfo data) { // Only set Name if title was found in the dictionary if (!string.IsNullOrEmpty(data.Title)) @@ -130,17 +133,19 @@ namespace MediaBrowser.Providers.MediaInfo if (!audio.LockedFields.Contains(MetadataFields.Cast)) { - audio.People.Clear(); + var people = new List<PersonInfo>(); foreach (var person in data.People) { - audio.AddPerson(new PersonInfo + PeopleHelper.AddPerson(people, new PersonInfo { Name = person.Name, Type = person.Type, Role = person.Role }); } + + await _libraryManager.UpdatePeople(audio, people).ConfigureAwait(false); } audio.Album = data.Album; diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs index a6d3c0271..af7fc3df4 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs @@ -51,6 +51,7 @@ namespace MediaBrowser.Providers.MediaInfo private readonly IServerConfigurationManager _config; private readonly ISubtitleManager _subtitleManager; private readonly IChapterManager _chapterManager; + private readonly ILibraryManager _libraryManager; public string Name { @@ -92,7 +93,7 @@ namespace MediaBrowser.Providers.MediaInfo return FetchAudioInfo(item, cancellationToken); } - public FFProbeProvider(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager) + public FFProbeProvider(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager, ILibraryManager libraryManager) { _logger = logger; _isoManager = isoManager; @@ -107,6 +108,7 @@ namespace MediaBrowser.Providers.MediaInfo _config = config; _subtitleManager = subtitleManager; _chapterManager = chapterManager; + _libraryManager = libraryManager; } private readonly Task<ItemUpdateType> _cachedTask = Task.FromResult(ItemUpdateType.None); @@ -138,8 +140,8 @@ namespace MediaBrowser.Providers.MediaInfo FetchShortcutInfo(item); return Task.FromResult(ItemUpdateType.MetadataEdit); } - - var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager, _fileSystem, _config, _subtitleManager, _chapterManager); + + var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager, _fileSystem, _config, _subtitleManager, _chapterManager, _libraryManager); return prober.ProbeVideo(item, options, cancellationToken); } @@ -157,7 +159,7 @@ namespace MediaBrowser.Providers.MediaInfo return _cachedTask; } - var prober = new FFProbeAudioInfo(_mediaEncoder, _itemRepo, _appPaths, _json); + var prober = new FFProbeAudioInfo(_mediaEncoder, _itemRepo, _appPaths, _json, _libraryManager); return prober.Probe(item, cancellationToken); } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index e1ee6ac5a..395d95cc5 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -46,10 +46,11 @@ namespace MediaBrowser.Providers.MediaInfo private readonly IServerConfigurationManager _config; private readonly ISubtitleManager _subtitleManager; private readonly IChapterManager _chapterManager; + private readonly ILibraryManager _libraryManager; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - public FFProbeVideoInfo(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager) + public FFProbeVideoInfo(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager, ILibraryManager libraryManager) { _logger = logger; _isoManager = isoManager; @@ -64,6 +65,7 @@ namespace MediaBrowser.Providers.MediaInfo _config = config; _subtitleManager = subtitleManager; _chapterManager = chapterManager; + _libraryManager = libraryManager; } public async Task<ItemUpdateType> ProbeVideo<T>(T item, @@ -219,6 +221,7 @@ namespace MediaBrowser.Providers.MediaInfo await AddExternalSubtitles(video, mediaStreams, options, cancellationToken).ConfigureAwait(false); FetchEmbeddedInfo(video, mediaInfo, options); + await FetchPeople(video, mediaInfo, options).ConfigureAwait(false); video.IsHD = mediaStreams.Any(i => i.Type == MediaStreamType.Video && i.Width.HasValue && i.Width.Value >= 1270); @@ -370,24 +373,6 @@ namespace MediaBrowser.Providers.MediaInfo } } - if (!video.LockedFields.Contains(MetadataFields.Cast)) - { - if (video.People.Count == 0 || isFullRefresh) - { - video.People.Clear(); - - foreach (var person in data.People) - { - video.AddPerson(new PersonInfo - { - Name = person.Name, - Type = person.Type, - Role = person.Role - }); - } - } - } - if (!video.LockedFields.Contains(MetadataFields.Genres)) { if (video.Genres.Count == 0 || isFullRefresh) @@ -458,6 +443,31 @@ namespace MediaBrowser.Providers.MediaInfo } } + private async Task FetchPeople(Video video, Model.MediaInfo.MediaInfo data, MetadataRefreshOptions options) + { + var isFullRefresh = options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh; + + if (!video.LockedFields.Contains(MetadataFields.Cast)) + { + if (isFullRefresh || _libraryManager.GetPeople(video).Count == 0) + { + var people = new List<PersonInfo>(); + + foreach (var person in data.People) + { + PeopleHelper.AddPerson(people, new PersonInfo + { + Name = person.Name, + Type = person.Type, + Role = person.Role + }); + } + + await _libraryManager.UpdatePeople(video, people); + } + } + } + private SubtitleOptions GetOptions() { return _config.GetConfiguration<SubtitleOptions>("subtitles"); diff --git a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs index c23ed3786..6854ff12b 100644 --- a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs +++ b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs @@ -34,8 +34,6 @@ namespace MediaBrowser.Providers.Movies public async Task<MetadataResult<T>> GetMetadata(ItemLookupInfo itemId, CancellationToken cancellationToken) { - var result = new MetadataResult<T>(); - var tmdbId = itemId.GetProviderId(MetadataProviders.Tmdb); var imdbId = itemId.GetProviderId(MetadataProviders.Imdb); @@ -56,12 +54,10 @@ namespace MediaBrowser.Providers.Movies { cancellationToken.ThrowIfCancellationRequested(); - result.Item = await FetchMovieData(tmdbId, imdbId, itemId.MetadataLanguage, itemId.MetadataCountryCode, cancellationToken).ConfigureAwait(false); - - result.HasMetadata = result.Item != null; + return await FetchMovieData(tmdbId, imdbId, itemId.MetadataLanguage, itemId.MetadataCountryCode, cancellationToken).ConfigureAwait(false); } - return result; + return new MetadataResult<T>(); } /// <summary> @@ -73,8 +69,13 @@ namespace MediaBrowser.Providers.Movies /// <param name="preferredCountryCode">The preferred country code.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{`0}.</returns> - private async Task<T> FetchMovieData(string tmdbId, string imdbId, string language, string preferredCountryCode, CancellationToken cancellationToken) + private async Task<MetadataResult<T>> FetchMovieData(string tmdbId, string imdbId, string language, string preferredCountryCode, CancellationToken cancellationToken) { + var item = new MetadataResult<T> + { + Item = new T() + }; + string dataFilePath = null; MovieDbProvider.CompleteMovieData movieInfo = null; @@ -82,7 +83,7 @@ namespace MediaBrowser.Providers.Movies if (string.IsNullOrEmpty(tmdbId)) { movieInfo = await MovieDbProvider.Current.FetchMainResult(imdbId, false, language, cancellationToken).ConfigureAwait(false); - if (movieInfo == null) return null; + if (movieInfo == null) return item; tmdbId = movieInfo.id.ToString(_usCulture); @@ -96,9 +97,8 @@ namespace MediaBrowser.Providers.Movies dataFilePath = dataFilePath ?? MovieDbProvider.Current.GetDataFilePath(tmdbId, language); movieInfo = movieInfo ?? _jsonSerializer.DeserializeFromFile<MovieDbProvider.CompleteMovieData>(dataFilePath); - var item = new T(); - ProcessMainInfo(item, preferredCountryCode, movieInfo); + item.HasMetadata = true; return item; } @@ -106,11 +106,13 @@ namespace MediaBrowser.Providers.Movies /// <summary> /// Processes the main info. /// </summary> - /// <param name="movie">The movie.</param> + /// <param name="resultItem">The result item.</param> /// <param name="preferredCountryCode">The preferred country code.</param> /// <param name="movieData">The movie data.</param> - private void ProcessMainInfo(T movie, string preferredCountryCode, MovieDbProvider.CompleteMovieData movieData) + private void ProcessMainInfo(MetadataResult<T> resultItem, string preferredCountryCode, MovieDbProvider.CompleteMovieData movieData) { + var movie = resultItem.Item; + movie.Name = movieData.GetTitle() ?? movie.Name; var hasOriginalTitle = movie as IHasOriginalTitle; @@ -233,13 +235,19 @@ namespace MediaBrowser.Providers.Movies //actors come from cast if (movieData.casts != null && movieData.casts.cast != null) { - foreach (var actor in movieData.casts.cast.OrderBy(a => a.order)) movie.AddPerson(new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor, SortOrder = actor.order }); + foreach (var actor in movieData.casts.cast.OrderBy(a => a.order)) + { + PeopleHelper.AddPerson(resultItem.People, new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor, SortOrder = actor.order }); + } } //and the rest from crew if (movieData.casts != null && movieData.casts.crew != null) { - foreach (var person in movieData.casts.crew) movie.AddPerson(new PersonInfo { Name = person.name.Trim(), Role = person.job, Type = person.department }); + foreach (var person in movieData.casts.crew) + { + PeopleHelper.AddPerson(resultItem.People, new PersonInfo { Name = person.name.Trim(), Role = person.job, Type = person.department }); + } } if (movieData.keywords != null && movieData.keywords.keywords != null) diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs index f886deb00..e96e89a78 100644 --- a/MediaBrowser.Providers/Movies/MovieMetadataService.cs +++ b/MediaBrowser.Providers/Movies/MovieMetadataService.cs @@ -12,28 +12,10 @@ namespace MediaBrowser.Providers.Movies { public class MovieMetadataService : MetadataService<Movie, MovieInfo> { - public MovieMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public MovieMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Movie source, Movie target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - - if (replaceData || string.IsNullOrEmpty(target.TmdbCollectionName)) - { - target.TmdbCollectionName = source.TmdbCollectionName; - } - } - protected override bool IsFullLocalMetadata(Movie item) { if (string.IsNullOrWhiteSpace(item.Overview)) @@ -46,5 +28,18 @@ namespace MediaBrowser.Providers.Movies } return base.IsFullLocalMetadata(item); } + + protected override void MergeData(MetadataResult<Movie> source, MetadataResult<Movie> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.TmdbCollectionName)) + { + targetItem.TmdbCollectionName = sourceItem.TmdbCollectionName; + } + } } } diff --git a/MediaBrowser.Providers/Music/AlbumMetadataService.cs b/MediaBrowser.Providers/Music/AlbumMetadataService.cs index 90248e418..859db37ba 100644 --- a/MediaBrowser.Providers/Music/AlbumMetadataService.cs +++ b/MediaBrowser.Providers/Music/AlbumMetadataService.cs @@ -15,28 +15,10 @@ namespace MediaBrowser.Providers.Music { public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo> { - public AlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicAlbum source, MusicAlbum target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - - if (replaceData || target.Artists.Count == 0) - { - target.Artists = source.Artists; - } - } - protected override async Task<ItemUpdateType> BeforeSave(MusicAlbum item, bool isFullRefresh, ItemUpdateType currentUpdateType) { var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false); @@ -171,5 +153,18 @@ namespace MediaBrowser.Providers.Music return updateType; } + + protected override void MergeData(MetadataResult<MusicAlbum> source, MetadataResult<MusicAlbum> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || targetItem.Artists.Count == 0) + { + targetItem.Artists = sourceItem.Artists; + } + } } } diff --git a/MediaBrowser.Providers/Music/ArtistMetadataService.cs b/MediaBrowser.Providers/Music/ArtistMetadataService.cs index 790529371..0032aac62 100644 --- a/MediaBrowser.Providers/Music/ArtistMetadataService.cs +++ b/MediaBrowser.Providers/Music/ArtistMetadataService.cs @@ -15,24 +15,8 @@ namespace MediaBrowser.Providers.Music { public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo> { - private readonly ILibraryManager _libraryManager; - - public ArtistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ArtistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { - _libraryManager = libraryManager; - } - - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicArtist source, MusicArtist target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } protected override async Task<ItemUpdateType> BeforeSave(MusicArtist item, bool isFullRefresh, ItemUpdateType currentUpdateType) @@ -46,7 +30,7 @@ namespace MediaBrowser.Providers.Music var itemFilter = item.GetItemFilter(); var taggedItems = item.IsAccessedByName ? - _libraryManager.RootFolder.GetRecursiveChildren(i => !i.IsFolder && itemFilter(i)).ToList() : + LibraryManager.RootFolder.GetRecursiveChildren(i => !i.IsFolder && itemFilter(i)).ToList() : item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder).ToList(); if (!item.LockedFields.Contains(MetadataFields.Genres)) @@ -67,5 +51,10 @@ namespace MediaBrowser.Providers.Music return updateType; } + + protected override void MergeData(MetadataResult<MusicArtist> source, MetadataResult<MusicArtist> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/Music/AudioMetadataService.cs b/MediaBrowser.Providers/Music/AudioMetadataService.cs index 908913910..b4d50a173 100644 --- a/MediaBrowser.Providers/Music/AudioMetadataService.cs +++ b/MediaBrowser.Providers/Music/AudioMetadataService.cs @@ -12,30 +12,25 @@ namespace MediaBrowser.Providers.Music { public class AudioMetadataService : MetadataService<Audio, SongInfo> { - public AudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Audio source, Audio target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Audio> source, MetadataResult<Audio> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || target.Artists.Count == 0) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || targetItem.Artists.Count == 0) { - target.Artists = source.Artists; + targetItem.Artists = sourceItem.Artists; } - if (replaceData || string.IsNullOrEmpty(target.Album)) + if (replaceData || string.IsNullOrEmpty(targetItem.Album)) { - target.Album = source.Album; + targetItem.Album = sourceItem.Album; } } } diff --git a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs index bbb456b2b..0456dbfba 100644 --- a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs +++ b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs @@ -13,30 +13,25 @@ namespace MediaBrowser.Providers.Music { class MusicVideoMetadataService : MetadataService<MusicVideo, MusicVideoInfo> { - public MusicVideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public MusicVideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicVideo source, MusicVideo target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<MusicVideo> source, MetadataResult<MusicVideo> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.Album)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.Album)) { - target.Album = source.Album; + targetItem.Album = sourceItem.Album; } - if (replaceData || target.Artists.Count == 0) + if (replaceData || targetItem.Artists.Count == 0) { - target.Artists = source.Artists.ToList(); + targetItem.Artists = sourceItem.Artists.ToList(); } } } diff --git a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs index b3c0427bf..107b76609 100644 --- a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs +++ b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.MusicGenres { public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupInfo> { - public MusicGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public MusicGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicGenre source, MusicGenre target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<MusicGenre> source, MetadataResult<MusicGenre> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs index 596b864f7..dffabd83c 100644 --- a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs @@ -172,7 +172,7 @@ namespace MediaBrowser.Providers.Omdb result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); result.HasMetadata = true; - await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, cancellationToken).ConfigureAwait(false); + await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); } return result; @@ -211,7 +211,7 @@ namespace MediaBrowser.Providers.Omdb result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); result.HasMetadata = true; - await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, cancellationToken).ConfigureAwait(false); + await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); } return result; diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs index e55321bb1..aee1abd72 100644 --- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs @@ -28,7 +28,7 @@ namespace MediaBrowser.Providers.Omdb Current = this; } - public async Task Fetch(BaseItem item, string imdbId, CancellationToken cancellationToken) + public async Task Fetch(BaseItem item, string imdbId, string language, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(imdbId)) { @@ -51,7 +51,11 @@ namespace MediaBrowser.Providers.Omdb { var result = _jsonSerializer.DeserializeFromStream<RootObject>(stream); - item.Name = result.Title; + // Only take the name if the user's language is set to english, since Omdb has no localization + if (string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) + { + item.Name = result.Title; + } int year; diff --git a/MediaBrowser.Providers/People/PersonMetadataService.cs b/MediaBrowser.Providers/People/PersonMetadataService.cs index dff5a7e61..9961ff8dc 100644 --- a/MediaBrowser.Providers/People/PersonMetadataService.cs +++ b/MediaBrowser.Providers/People/PersonMetadataService.cs @@ -14,25 +14,20 @@ namespace MediaBrowser.Providers.People { public class PersonMetadataService : MetadataService<Person, PersonLookupInfo> { - public PersonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PersonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Person source, Person target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Person> source, MetadataResult<Person> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.PlaceOfBirth)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.PlaceOfBirth)) { - target.PlaceOfBirth = source.PlaceOfBirth; + targetItem.PlaceOfBirth = sourceItem.PlaceOfBirth; } } } diff --git a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs index 0258fd539..86e2cfaf7 100644 --- a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs +++ b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs @@ -21,13 +21,13 @@ namespace MediaBrowser.Providers.People public class TvdbPersonImageProvider : IRemoteImageProvider, IHasOrder { private readonly IServerConfigurationManager _config; - private readonly ILibraryManager _library; + private readonly ILibraryManager _libraryManager; private readonly IHttpClient _httpClient; - public TvdbPersonImageProvider(IServerConfigurationManager config, ILibraryManager library, IHttpClient httpClient) + public TvdbPersonImageProvider(IServerConfigurationManager config, ILibraryManager libraryManager, IHttpClient httpClient) { _config = config; - _library = library; + _libraryManager = libraryManager; _httpClient = httpClient; } @@ -59,9 +59,13 @@ namespace MediaBrowser.Providers.People // Avoid implicitly captured closure var itemName = item.Name; - var seriesWithPerson = _library.RootFolder - .GetRecursiveChildren(i => i is Series && !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb)) && i.People.Any(p => string.Equals(p.Name, itemName, StringComparison.OrdinalIgnoreCase))) - .Cast<Series>() + var seriesWithPerson = _libraryManager.GetItems(new InternalItemsQuery + { + IncludeItemTypes = new[] { typeof(Series).Name }, + Person = itemName + + }).Items.Cast<Series>() + .Where(i => !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb))) .ToList(); var infos = seriesWithPerson.Select(i => GetImageFromSeriesData(i, item.Name, cancellationToken)) diff --git a/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs b/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs index 822961d81..1c5d7f1b5 100644 --- a/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs +++ b/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs @@ -12,20 +12,11 @@ namespace MediaBrowser.Providers.Photos { class PhotoAlbumMetadataService : MetadataService<PhotoAlbum, ItemLookupInfo> { - public PhotoAlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) - : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PhotoAlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(PhotoAlbum source, PhotoAlbum target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<PhotoAlbum> source, MetadataResult<PhotoAlbum> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Photos/PhotoMetadataService.cs b/MediaBrowser.Providers/Photos/PhotoMetadataService.cs index 5e903bdc3..22a60ea08 100644 --- a/MediaBrowser.Providers/Photos/PhotoMetadataService.cs +++ b/MediaBrowser.Providers/Photos/PhotoMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Photos { class PhotoMetadataService : MetadataService<Photo, ItemLookupInfo> { - public PhotoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PhotoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Photo source, Photo target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Photo> source, MetadataResult<Photo> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs index c53a89db7..af4393d18 100644 --- a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs +++ b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs @@ -12,31 +12,26 @@ namespace MediaBrowser.Providers.Playlists { class PlaylistMetadataService : MetadataService<Playlist, ItemLookupInfo> { - public PlaylistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PlaylistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Playlist source, Playlist target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Playlist> source, MetadataResult<Playlist> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.PlaylistMediaType)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.PlaylistMediaType)) { - target.PlaylistMediaType = source.PlaylistMediaType; + targetItem.PlaylistMediaType = sourceItem.PlaylistMediaType; } if (mergeMetadataSettings) { - target.LinkedChildren = source.LinkedChildren; - target.Shares = source.Shares; + targetItem.LinkedChildren = sourceItem.LinkedChildren; + targetItem.Shares = sourceItem.Shares; } } } diff --git a/MediaBrowser.Providers/Studios/StudioMetadataService.cs b/MediaBrowser.Providers/Studios/StudioMetadataService.cs index dcd90ecf6..5b273d8ca 100644 --- a/MediaBrowser.Providers/Studios/StudioMetadataService.cs +++ b/MediaBrowser.Providers/Studios/StudioMetadataService.cs @@ -14,18 +14,11 @@ namespace MediaBrowser.Providers.Studios { public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo> { - public StudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public StudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - protected override void MergeData(Studio source, Studio target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Studio> source, MetadataResult<Studio> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/TV/DummySeasonProvider.cs b/MediaBrowser.Providers/TV/DummySeasonProvider.cs index fb5282551..426ff4318 100644 --- a/MediaBrowser.Providers/TV/DummySeasonProvider.cs +++ b/MediaBrowser.Providers/TV/DummySeasonProvider.cs @@ -111,10 +111,11 @@ namespace MediaBrowser.Providers.TV { Name = seasonName, IndexNumber = seasonNumber, - Parent = series, Id = (series.Id + (seasonNumber ?? -1).ToString(_usCulture) + seasonName).GetMBId(typeof(Season)) }; + season.SetParent(series); + await series.AddChild(season, cancellationToken).ConfigureAwait(false); await season.RefreshMetadata(new MetadataRefreshOptions(), cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs index 616db8d86..339967eeb 100644 --- a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs +++ b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs @@ -12,55 +12,50 @@ namespace MediaBrowser.Providers.TV { public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo> { - public EpisodeMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public EpisodeMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Episode source, Episode target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Episode> source, MetadataResult<Episode> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || !target.AirsBeforeSeasonNumber.HasValue) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || !targetItem.AirsBeforeSeasonNumber.HasValue) { - target.AirsBeforeSeasonNumber = source.AirsBeforeSeasonNumber; + targetItem.AirsBeforeSeasonNumber = sourceItem.AirsBeforeSeasonNumber; } - if (replaceData || !target.AirsAfterSeasonNumber.HasValue) + if (replaceData || !targetItem.AirsAfterSeasonNumber.HasValue) { - target.AirsAfterSeasonNumber = source.AirsAfterSeasonNumber; + targetItem.AirsAfterSeasonNumber = sourceItem.AirsAfterSeasonNumber; } - if (replaceData || !target.AirsBeforeEpisodeNumber.HasValue) + if (replaceData || !targetItem.AirsBeforeEpisodeNumber.HasValue) { - target.AirsBeforeEpisodeNumber = source.AirsBeforeEpisodeNumber; + targetItem.AirsBeforeEpisodeNumber = sourceItem.AirsBeforeEpisodeNumber; } - if (replaceData || !target.DvdSeasonNumber.HasValue) + if (replaceData || !targetItem.DvdSeasonNumber.HasValue) { - target.DvdSeasonNumber = source.DvdSeasonNumber; + targetItem.DvdSeasonNumber = sourceItem.DvdSeasonNumber; } - if (replaceData || !target.DvdEpisodeNumber.HasValue) + if (replaceData || !targetItem.DvdEpisodeNumber.HasValue) { - target.DvdEpisodeNumber = source.DvdEpisodeNumber; + targetItem.DvdEpisodeNumber = sourceItem.DvdEpisodeNumber; } - if (replaceData || !target.AbsoluteEpisodeNumber.HasValue) + if (replaceData || !targetItem.AbsoluteEpisodeNumber.HasValue) { - target.AbsoluteEpisodeNumber = source.AbsoluteEpisodeNumber; + targetItem.AbsoluteEpisodeNumber = sourceItem.AbsoluteEpisodeNumber; } - if (replaceData || !target.IndexNumberEnd.HasValue) + if (replaceData || !targetItem.IndexNumberEnd.HasValue) { - target.IndexNumberEnd = source.IndexNumberEnd; + targetItem.IndexNumberEnd = sourceItem.IndexNumberEnd; } } } diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index d45128288..957345607 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs @@ -406,10 +406,11 @@ namespace MediaBrowser.Providers.TV Name = name, IndexNumber = episodeNumber, ParentIndexNumber = seasonNumber, - Parent = season, Id = (series.Id + seasonNumber.ToString(_usCulture) + name).GetMBId(typeof(Episode)) }; + episode.SetParent(season); + await season.AddChild(episode, cancellationToken).ConfigureAwait(false); await episode.RefreshMetadata(new MetadataRefreshOptions diff --git a/MediaBrowser.Providers/TV/SeasonMetadataService.cs b/MediaBrowser.Providers/TV/SeasonMetadataService.cs index 8955b224e..800960c09 100644 --- a/MediaBrowser.Providers/TV/SeasonMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeasonMetadataService.cs @@ -14,23 +14,10 @@ namespace MediaBrowser.Providers.TV { public class SeasonMetadataService : MetadataService<Season, SeasonInfo> { - public SeasonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public SeasonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Season source, Season target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - } - protected override async Task<ItemUpdateType> BeforeSave(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType) { var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false); @@ -46,5 +33,10 @@ namespace MediaBrowser.Providers.TV return updateType; } + + protected override void MergeData(MetadataResult<Season> source, MetadataResult<Season> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs index eeff03703..0b2aaa5a0 100644 --- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -16,76 +17,75 @@ namespace MediaBrowser.Providers.TV public class SeriesMetadataService : MetadataService<Series, SeriesInfo> { private readonly ILocalizationManager _localization; - private readonly ILibraryManager _libraryManager; - public SeriesMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILocalizationManager localization, ILibraryManager libraryManager) - : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public SeriesMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager, ILocalizationManager localization) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { _localization = localization; - _libraryManager = libraryManager; } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Series source, Series target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override async Task AfterMetadataRefresh(Series item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + await base.AfterMetadataRefresh(item, refreshOptions, cancellationToken).ConfigureAwait(false); - if (replaceData || target.SeasonCount == 0) + if (refreshOptions.IsPostRecursiveRefresh) { - target.SeasonCount = source.SeasonCount; + var provider = new DummySeasonProvider(ServerConfigurationManager, Logger, _localization, LibraryManager); + + try + { + await provider.Run(item, CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) + { + Logger.ErrorException("Error in DummySeasonProvider", ex); + } } + } - if (replaceData || string.IsNullOrEmpty(target.AirTime)) + protected override bool IsFullLocalMetadata(Series item) + { + if (string.IsNullOrWhiteSpace(item.Overview)) { - target.AirTime = source.AirTime; + return false; } - - if (replaceData || !target.Status.HasValue) + if (!item.ProductionYear.HasValue) { - target.Status = source.Status; + return false; } + return base.IsFullLocalMetadata(item); + } + + protected override void MergeData(MetadataResult<Series> source, MetadataResult<Series> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; - if (replaceData || target.AirDays == null || target.AirDays.Count == 0) + if (replaceData || targetItem.SeasonCount == 0) { - target.AirDays = source.AirDays; + targetItem.SeasonCount = sourceItem.SeasonCount; } - if (mergeMetadataSettings) + if (replaceData || string.IsNullOrEmpty(targetItem.AirTime)) { - target.DisplaySpecialsWithSeasons = source.DisplaySpecialsWithSeasons; + targetItem.AirTime = sourceItem.AirTime; } - } - protected override async Task AfterMetadataRefresh(Series item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) - { - await base.AfterMetadataRefresh(item, refreshOptions, cancellationToken).ConfigureAwait(false); - - if (refreshOptions.IsPostRecursiveRefresh) + if (replaceData || !targetItem.Status.HasValue) { - var provider = new DummySeasonProvider(ServerConfigurationManager, Logger, _localization, _libraryManager); - - await provider.Run(item, CancellationToken.None).ConfigureAwait(false); + targetItem.Status = sourceItem.Status; } - } - protected override bool IsFullLocalMetadata(Series item) - { - if (string.IsNullOrWhiteSpace(item.Overview)) + if (replaceData || targetItem.AirDays == null || targetItem.AirDays.Count == 0) { - return false; + targetItem.AirDays = sourceItem.AirDays; } - if (!item.ProductionYear.HasValue) + + if (mergeMetadataSettings) { - return false; + targetItem.DisplaySpecialsWithSeasons = sourceItem.DisplaySpecialsWithSeasons; } - return base.IsFullLocalMetadata(item); } } } diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs index 68601b6b2..f36de88c9 100644 --- a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs @@ -56,10 +56,12 @@ namespace MediaBrowser.Providers.TV try { - var item = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, cancellationToken); + var metadataResult = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, cancellationToken); - if (item != null) + if (metadataResult.HasMetadata) { + var item = metadataResult.Item; + list.Add(new RemoteSearchResult { IndexNumber = item.IndexNumber, @@ -103,9 +105,7 @@ namespace MediaBrowser.Providers.TV try { - result.Item = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, - cancellationToken); - result.HasMetadata = result.Item != null; + result = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, cancellationToken); } catch (FileNotFoundException) { @@ -231,21 +231,23 @@ namespace MediaBrowser.Providers.TV /// <param name="seriesProviderIds">The series provider ids.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> - private Episode FetchEpisodeData(EpisodeInfo id, EpisodeIdentity identity, string seriesDataPath, Dictionary<string, string> seriesProviderIds, CancellationToken cancellationToken) + private MetadataResult<Episode> FetchEpisodeData(EpisodeInfo id, EpisodeIdentity identity, string seriesDataPath, Dictionary<string, string> seriesProviderIds, CancellationToken cancellationToken) { var episodeNumber = identity.IndexNumber; var seasonOffset = TvdbSeriesProvider.GetSeriesOffset(seriesProviderIds) ?? 0; var seasonNumber = identity.SeasonIndex + seasonOffset; string file; - var success = false; var usingAbsoluteData = false; - var episode = new Episode + var result = new MetadataResult<Episode>() { - IndexNumber = id.IndexNumber, - ParentIndexNumber = id.ParentIndexNumber, - IndexNumberEnd = id.IndexNumberEnd + Item = new Episode + { + IndexNumber = id.IndexNumber, + ParentIndexNumber = id.ParentIndexNumber, + IndexNumberEnd = id.IndexNumberEnd + } }; try @@ -253,9 +255,9 @@ namespace MediaBrowser.Providers.TV if (seasonNumber != null) { file = Path.Combine(seriesDataPath, string.Format("episode-{0}-{1}.xml", seasonNumber.Value, episodeNumber)); - FetchMainEpisodeInfo(episode, file, cancellationToken); + FetchMainEpisodeInfo(result, file, cancellationToken); - success = true; + result.HasMetadata = true; } } catch (FileNotFoundException) @@ -267,11 +269,12 @@ namespace MediaBrowser.Providers.TV } } - if (!success) + if (!result.HasMetadata) { file = Path.Combine(seriesDataPath, string.Format("episode-abs-{0}.xml", episodeNumber)); - FetchMainEpisodeInfo(episode, file, cancellationToken); + FetchMainEpisodeInfo(result, file, cancellationToken); + result.HasMetadata = true; usingAbsoluteData = true; } @@ -291,7 +294,7 @@ namespace MediaBrowser.Providers.TV try { - FetchAdditionalPartInfo(episode, file, cancellationToken); + FetchAdditionalPartInfo(result, file, cancellationToken); } catch (FileNotFoundException) { @@ -305,20 +308,17 @@ namespace MediaBrowser.Providers.TV episodeNumber++; } - return episode; + return result; } private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private void FetchMainEpisodeInfo(Episode item, string xmlFile, CancellationToken cancellationToken) + private void FetchMainEpisodeInfo(MetadataResult<Episode> result, string xmlFile, CancellationToken cancellationToken) { + var item = result.Item; + using (var streamReader = new StreamReader(xmlFile, Encoding.UTF8)) { - if (!item.LockedFields.Contains(MetadataFields.Cast)) - { - item.People.Clear(); - } - // Use XmlReader for best performance using (var reader = XmlReader.Create(streamReader, new XmlReaderSettings { @@ -551,7 +551,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Director); + AddPeople(result, val, PersonType.Director); } } @@ -565,7 +565,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddGuestStars(item, val); + AddGuestStars(result, val); } } @@ -579,7 +579,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Writer); + AddPeople(result, val, PersonType.Writer); } } @@ -596,18 +596,19 @@ namespace MediaBrowser.Providers.TV } } - private void AddPeople(BaseItem item, string val, string personType) + private void AddPeople<T>(MetadataResult<T> result, string val, string personType) { // Sometimes tvdb actors have leading spaces foreach (var person in val.Split(new[] { '|', ',' }, StringSplitOptions.RemoveEmptyEntries) .Where(i => !string.IsNullOrWhiteSpace(i)) .Select(str => new PersonInfo { Type = personType, Name = str.Trim() })) { - item.AddPerson(person); + PeopleHelper.AddPerson(result.People, person); } } - private void AddGuestStars(BaseItem item, string val) + private void AddGuestStars<T>(MetadataResult<T> result, string val) + where T : BaseItem { // Sometimes tvdb actors have leading spaces //Regex Info: @@ -631,13 +632,15 @@ namespace MediaBrowser.Providers.TV { if (!string.IsNullOrWhiteSpace(person.Name)) { - item.AddPerson(person); + PeopleHelper.AddPerson(result.People, person); } } } - private void FetchAdditionalPartInfo(Episode item, string xmlFile, CancellationToken cancellationToken) + private void FetchAdditionalPartInfo(MetadataResult<Episode> result, string xmlFile, CancellationToken cancellationToken) { + var item = result.Item; + using (var streamReader = new StreamReader(xmlFile, Encoding.UTF8)) { // Use XmlReader for best performance @@ -693,7 +696,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Director); + AddPeople(result, val, PersonType.Director); } } @@ -707,7 +710,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddGuestStars(item, val); + AddGuestStars(result, val); } } @@ -721,7 +724,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Writer); + AddPeople(result, val, PersonType.Writer); } } diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs index 8bdd914df..4c93bd57c 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs @@ -121,7 +121,7 @@ namespace MediaBrowser.Providers.TV result.Item = new Series(); result.HasMetadata = true; - FetchSeriesData(result.Item, seriesId, cancellationToken); + FetchSeriesData(result, seriesId, cancellationToken); await FindAnimeSeriesIndex(result.Item, itemId).ConfigureAwait(false); } @@ -159,12 +159,14 @@ namespace MediaBrowser.Providers.TV /// <summary> /// Fetches the series data. /// </summary> - /// <param name="series">The series.</param> + /// <param name="result">The result.</param> /// <param name="seriesId">The series id.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> - private void FetchSeriesData(Series series, string seriesId, CancellationToken cancellationToken) + private void FetchSeriesData(MetadataResult<Series> result, string seriesId, CancellationToken cancellationToken) { + var series = result.Item; + series.SetProviderId(MetadataProviders.Tvdb, seriesId); var seriesDataPath = GetSeriesDataPath(_config.ApplicationPaths, seriesId); @@ -178,7 +180,7 @@ namespace MediaBrowser.Providers.TV cancellationToken.ThrowIfCancellationRequested(); - FetchActors(series, actorsXmlPath); + FetchActors(result, actorsXmlPath); } /// <summary> @@ -618,9 +620,9 @@ namespace MediaBrowser.Providers.TV /// <summary> /// Fetches the actors. /// </summary> - /// <param name="series">The series.</param> + /// <param name="result">The result.</param> /// <param name="actorsXmlPath">The actors XML path.</param> - private void FetchActors(Series series, string actorsXmlPath) + private void FetchActors(MetadataResult<Series> result, string actorsXmlPath) { var settings = new XmlReaderSettings { @@ -648,7 +650,7 @@ namespace MediaBrowser.Providers.TV { using (var subtree = reader.ReadSubtree()) { - FetchDataFromActorNode(series, subtree); + FetchDataFromActorNode(result, subtree); } break; } @@ -665,9 +667,9 @@ namespace MediaBrowser.Providers.TV /// <summary> /// Fetches the data from actor node. /// </summary> - /// <param name="series">The series.</param> + /// <param name="result">The result.</param> /// <param name="reader">The reader.</param> - private void FetchDataFromActorNode(Series series, XmlReader reader) + private void FetchDataFromActorNode(MetadataResult<Series> result, XmlReader reader) { reader.MoveToContent(); @@ -719,7 +721,7 @@ namespace MediaBrowser.Providers.TV if (!string.IsNullOrWhiteSpace(personInfo.Name)) { - series.AddPerson(personInfo); + PeopleHelper.AddPerson(result.People, personInfo); } } diff --git a/MediaBrowser.Providers/Users/UserMetadataService.cs b/MediaBrowser.Providers/Users/UserMetadataService.cs index 4062c5b9f..84f2b0380 100644 --- a/MediaBrowser.Providers/Users/UserMetadataService.cs +++ b/MediaBrowser.Providers/Users/UserMetadataService.cs @@ -14,19 +14,11 @@ namespace MediaBrowser.Providers.Users { public class UserMetadataService : MetadataService<User, ItemLookupInfo> { - public UserMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public UserMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(User source, User target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<User> source, MetadataResult<User> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Videos/VideoMetadataService.cs b/MediaBrowser.Providers/Videos/VideoMetadataService.cs index 4fed9cff4..68c36a84c 100644 --- a/MediaBrowser.Providers/Videos/VideoMetadataService.cs +++ b/MediaBrowser.Providers/Videos/VideoMetadataService.cs @@ -7,30 +7,15 @@ 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.Videos { public class VideoMetadataService : MetadataService<Video, ItemLookupInfo> { - public VideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public VideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Video source, Video target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - } - public override int Order { get @@ -39,5 +24,10 @@ namespace MediaBrowser.Providers.Videos return 10; } } + + protected override void MergeData(MetadataResult<Video> source, MetadataResult<Video> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/Years/YearMetadataService.cs b/MediaBrowser.Providers/Years/YearMetadataService.cs index 057434db0..3e6db7629 100644 --- a/MediaBrowser.Providers/Years/YearMetadataService.cs +++ b/MediaBrowser.Providers/Years/YearMetadataService.cs @@ -14,19 +14,11 @@ namespace MediaBrowser.Providers.Years { public class YearMetadataService : MetadataService<Year, ItemLookupInfo> { - public YearMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public YearMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Year source, Year target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Year> source, MetadataResult<Year> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } |
