2019-01-13 20:03:10 +00:00
using System ;
2014-01-28 18:37:01 +00:00
using System.Collections.Generic ;
2017-05-02 12:53:41 +00:00
using System.Linq ;
2019-01-13 19:26:31 +00:00
using MediaBrowser.Controller.Entities ;
using MediaBrowser.Controller.Entities.Audio ;
2017-05-02 12:53:41 +00:00
using MediaBrowser.Controller.Extensions ;
2019-01-13 19:26:31 +00:00
using MediaBrowser.Controller.Providers ;
using MediaBrowser.Model.Entities ;
2014-01-28 18:37:01 +00:00
2014-02-08 20:02:35 +00:00
namespace MediaBrowser.Providers.Manager
2014-01-28 18:37:01 +00:00
{
public static class ProviderUtils
{
2019-09-02 06:19:29 +00:00
public static void MergeBaseItemData < T > (
MetadataResult < T > sourceResult ,
2016-04-13 20:49:16 +00:00
MetadataResult < T > targetResult ,
2020-06-09 22:12:53 +00:00
MetadataField [ ] lockedFields ,
2016-04-13 20:49:16 +00:00
bool replaceData ,
2014-10-28 23:17:55 +00:00
bool mergeMetadataSettings )
2015-06-29 01:10:45 +00:00
where T : BaseItem
2014-01-28 18:37:01 +00:00
{
2015-06-29 01:10:45 +00:00
var source = sourceResult . Item ;
var target = targetResult . Item ;
2015-05-08 16:28:06 +00:00
if ( source = = null )
{
2019-01-06 20:50:43 +00:00
throw new ArgumentNullException ( nameof ( source ) ) ;
2015-05-08 16:28:06 +00:00
}
if ( target = = null )
{
2019-01-06 20:50:43 +00:00
throw new ArgumentNullException ( nameof ( target ) ) ;
2015-05-08 16:28:06 +00:00
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . Name ) )
2014-01-28 18:37:01 +00:00
{
if ( replaceData | | string . IsNullOrEmpty ( target . Name ) )
{
2014-06-01 03:19:06 +00:00
// Safeguard against incoming data having an emtpy name
if ( ! string . IsNullOrWhiteSpace ( source . Name ) )
{
target . Name = source . Name ;
}
2014-01-28 18:37:01 +00:00
}
}
2016-04-20 05:21:40 +00:00
if ( replaceData | | string . IsNullOrEmpty ( target . OriginalTitle ) )
{
// Safeguard against incoming data having an emtpy name
if ( ! string . IsNullOrWhiteSpace ( source . OriginalTitle ) )
{
target . OriginalTitle = source . OriginalTitle ;
}
}
2017-10-05 18:10:07 +00:00
if ( replaceData | | ! target . CommunityRating . HasValue | | ( source . CommunityRating . HasValue & & string . Equals ( sourceResult . Provider , "The Open Movie Database" , StringComparison . OrdinalIgnoreCase ) ) )
2014-01-28 18:37:01 +00:00
{
target . CommunityRating = source . CommunityRating ;
}
if ( replaceData | | ! target . EndDate . HasValue )
{
target . EndDate = source . EndDate ;
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . Genres ) )
2014-01-28 18:37:01 +00:00
{
2018-09-12 17:26:21 +00:00
if ( replaceData | | target . Genres . Length = = 0 )
2014-01-28 18:37:01 +00:00
{
target . Genres = source . Genres ;
}
}
if ( replaceData | | ! target . IndexNumber . HasValue )
{
target . IndexNumber = source . IndexNumber ;
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . OfficialRating ) )
2014-01-28 18:37:01 +00:00
{
if ( replaceData | | string . IsNullOrEmpty ( target . OfficialRating ) )
{
target . OfficialRating = source . OfficialRating ;
}
}
2014-03-01 17:53:56 +00:00
if ( replaceData | | string . IsNullOrEmpty ( target . CustomRating ) )
{
target . CustomRating = source . CustomRating ;
}
2016-04-13 20:49:16 +00:00
2016-10-08 05:57:38 +00:00
if ( replaceData | | string . IsNullOrEmpty ( target . Tagline ) )
{
target . Tagline = source . Tagline ;
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . Overview ) )
2014-01-28 18:37:01 +00:00
{
if ( replaceData | | string . IsNullOrEmpty ( target . Overview ) )
{
target . Overview = source . Overview ;
}
}
if ( replaceData | | ! target . ParentIndexNumber . HasValue )
{
target . ParentIndexNumber = source . ParentIndexNumber ;
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . Cast ) )
2014-01-28 18:37:01 +00:00
{
2015-07-24 02:48:10 +00:00
if ( replaceData | | targetResult . People = = null | | targetResult . People . Count = = 0 )
2014-01-28 18:37:01 +00:00
{
2016-04-13 20:49:16 +00:00
targetResult . People = sourceResult . People ;
2017-05-02 12:53:41 +00:00
}
else if ( targetResult . People ! = null & & sourceResult . People ! = null )
{
MergePeople ( sourceResult . People , targetResult . People ) ;
2014-01-28 18:37:01 +00:00
}
}
if ( replaceData | | ! target . PremiereDate . HasValue )
{
target . PremiereDate = source . PremiereDate ;
}
if ( replaceData | | ! target . ProductionYear . HasValue )
{
target . ProductionYear = source . ProductionYear ;
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . Runtime ) )
2014-01-28 18:37:01 +00:00
{
if ( replaceData | | ! target . RunTimeTicks . HasValue )
{
2014-02-06 04:39:16 +00:00
if ( ! ( target is Audio ) & & ! ( target is Video ) )
{
target . RunTimeTicks = source . RunTimeTicks ;
}
2014-01-28 18:37:01 +00:00
}
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . Studios ) )
2014-01-28 18:37:01 +00:00
{
2017-08-09 19:56:38 +00:00
if ( replaceData | | target . Studios . Length = = 0 )
2014-01-28 18:37:01 +00:00
{
target . Studios = source . Studios ;
}
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . Tags ) )
2014-01-31 04:50:09 +00:00
{
2017-08-09 19:56:38 +00:00
if ( replaceData | | target . Tags . Length = = 0 )
2014-01-31 04:50:09 +00:00
{
2016-06-02 17:43:29 +00:00
target . Tags = source . Tags ;
2014-01-31 04:50:09 +00:00
}
}
2020-06-09 22:12:53 +00:00
if ( ! lockedFields . Contains ( MetadataField . ProductionLocations ) )
2016-10-09 07:18:43 +00:00
{
2017-08-09 19:56:38 +00:00
if ( replaceData | | target . ProductionLocations . Length = = 0 )
2016-10-09 07:18:43 +00:00
{
target . ProductionLocations = source . ProductionLocations ;
}
}
2014-01-28 18:37:01 +00:00
foreach ( var id in source . ProviderIds )
{
2014-02-13 05:11:54 +00:00
var key = id . Key ;
// Don't replace existing Id's.
2014-07-08 01:41:03 +00:00
if ( replaceData | | ! target . ProviderIds . ContainsKey ( key ) )
2014-02-13 05:11:54 +00:00
{
target . ProviderIds [ key ] = id . Value ;
}
2014-01-28 18:37:01 +00:00
}
2019-09-02 06:19:29 +00:00
MergeAlbumArtist ( source , target , replaceData ) ;
MergeCriticRating ( source , target , replaceData ) ;
MergeTrailers ( source , target , replaceData ) ;
MergeVideoInfo ( source , target , replaceData ) ;
MergeDisplayOrder ( source , target , replaceData ) ;
2017-06-03 07:36:32 +00:00
2018-09-12 17:26:21 +00:00
if ( replaceData | | string . IsNullOrEmpty ( target . ForcedSortName ) )
2017-06-03 07:36:32 +00:00
{
2018-09-12 17:26:21 +00:00
var forcedSortName = source . ForcedSortName ;
2017-06-03 07:36:32 +00:00
2018-09-12 17:26:21 +00:00
if ( ! string . IsNullOrWhiteSpace ( forcedSortName ) )
{
target . ForcedSortName = forcedSortName ;
2017-06-03 07:36:32 +00:00
}
}
2014-01-28 18:37:01 +00:00
if ( mergeMetadataSettings )
{
2018-09-12 17:26:21 +00:00
target . LockedFields = source . LockedFields ;
target . IsLocked = source . IsLocked ;
// Grab the value if it's there, but if not then don't overwrite the default
2019-09-02 06:19:29 +00:00
if ( source . DateCreated ! = default )
2018-09-12 17:26:21 +00:00
{
target . DateCreated = source . DateCreated ;
}
target . PreferredMetadataCountryCode = source . PreferredMetadataCountryCode ;
target . PreferredMetadataLanguage = source . PreferredMetadataLanguage ;
2014-10-28 23:17:55 +00:00
}
}
2014-01-31 04:50:09 +00:00
2017-05-02 12:53:41 +00:00
private static void MergePeople ( List < PersonInfo > source , List < PersonInfo > target )
{
foreach ( var person in target )
{
var normalizedName = person . Name . RemoveDiacritics ( ) ;
var personInSource = source . FirstOrDefault ( i = > string . Equals ( i . Name . RemoveDiacritics ( ) , normalizedName , StringComparison . OrdinalIgnoreCase ) ) ;
if ( personInSource ! = null )
{
foreach ( var providerId in personInSource . ProviderIds )
{
if ( ! person . ProviderIds . ContainsKey ( providerId . Key ) )
{
person . ProviderIds [ providerId . Key ] = providerId . Value ;
}
}
if ( string . IsNullOrWhiteSpace ( person . ImageUrl ) )
{
person . ImageUrl = personInSource . ImageUrl ;
}
}
}
}
2019-09-02 06:19:29 +00:00
private static void MergeDisplayOrder ( BaseItem source , BaseItem target , bool replaceData )
2017-06-03 07:36:32 +00:00
{
2019-09-02 06:19:29 +00:00
if ( source is IHasDisplayOrder sourceHasDisplayOrder
& & target is IHasDisplayOrder targetHasDisplayOrder )
2014-10-28 23:17:55 +00:00
{
2018-09-12 17:26:21 +00:00
if ( replaceData | | string . IsNullOrEmpty ( targetHasDisplayOrder . DisplayOrder ) )
{
var displayOrder = sourceHasDisplayOrder . DisplayOrder ;
if ( ! string . IsNullOrWhiteSpace ( displayOrder ) )
{
targetHasDisplayOrder . DisplayOrder = displayOrder ;
}
}
2014-01-28 18:37:01 +00:00
}
}
2016-04-13 20:49:16 +00:00
2019-09-02 06:19:29 +00:00
private static void MergeAlbumArtist ( BaseItem source , BaseItem target , bool replaceData )
2014-02-02 19:31:56 +00:00
{
2019-08-29 20:28:33 +00:00
if ( source is IHasAlbumArtist sourceHasAlbumArtist
& & target is IHasAlbumArtist targetHasAlbumArtist )
2014-02-02 19:31:56 +00:00
{
2019-08-29 20:28:33 +00:00
if ( replaceData | | targetHasAlbumArtist . AlbumArtists . Count = = 0 )
2014-02-02 19:31:56 +00:00
{
2014-06-23 16:05:19 +00:00
targetHasAlbumArtist . AlbumArtists = sourceHasAlbumArtist . AlbumArtists ;
2014-02-02 19:31:56 +00:00
}
}
}
2014-02-04 20:19:29 +00:00
2019-09-02 06:19:29 +00:00
private static void MergeCriticRating ( BaseItem source , BaseItem target , bool replaceData )
2014-02-06 04:39:16 +00:00
{
2016-10-17 16:35:29 +00:00
if ( replaceData | | ! target . CriticRating . HasValue )
2014-02-06 04:39:16 +00:00
{
2016-10-17 16:35:29 +00:00
target . CriticRating = source . CriticRating ;
}
2014-02-06 04:39:16 +00:00
}
2019-09-02 06:19:29 +00:00
private static void MergeTrailers ( BaseItem source , BaseItem target , bool replaceData )
2014-02-06 04:39:16 +00:00
{
2019-09-02 06:19:29 +00:00
if ( replaceData | | target . RemoteTrailers . Count = = 0 )
2014-02-06 04:39:16 +00:00
{
2018-09-12 17:26:21 +00:00
target . RemoteTrailers = source . RemoteTrailers ;
2014-02-06 04:39:16 +00:00
}
}
2017-05-09 18:51:26 +00:00
2019-09-02 06:19:29 +00:00
private static void MergeVideoInfo ( BaseItem source , BaseItem target , bool replaceData )
2017-05-09 18:51:26 +00:00
{
2019-09-02 06:19:29 +00:00
if ( source is Video sourceCast & & target is Video targetCast )
2017-05-09 18:51:26 +00:00
{
if ( replaceData | | targetCast . Video3DFormat = = null )
{
targetCast . Video3DFormat = sourceCast . Video3DFormat ;
}
}
}
2014-01-28 18:37:01 +00:00
}
}