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