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