2022-03-20 15:55:47 +00:00
using System.Collections.Generic ;
using System.Linq ;
using NLog ;
using NzbDrone.Core.Datastore ;
2022-06-03 00:31:42 +00:00
using NzbDrone.Core.Languages ;
2022-03-20 15:55:47 +00:00
using NzbDrone.Core.Messaging.Events ;
2022-06-03 00:31:42 +00:00
using NzbDrone.Core.Movies.Translations ;
2022-03-20 15:55:47 +00:00
namespace NzbDrone.Core.Movies
{
public interface IMovieMetadataRepository : IBasicRepository < MovieMetadata >
{
MovieMetadata FindByTmdbId ( int tmdbId ) ;
2022-07-17 17:57:00 +00:00
MovieMetadata FindByImdbId ( string imdbId ) ;
2022-03-20 15:55:47 +00:00
List < MovieMetadata > FindById ( List < int > tmdbIds ) ;
2022-06-03 00:31:42 +00:00
List < MovieMetadata > GetMoviesWithCollections ( ) ;
2022-03-08 02:03:00 +00:00
List < MovieMetadata > GetMoviesByCollectionTmdbId ( int collectionId ) ;
2022-03-20 15:55:47 +00:00
bool UpsertMany ( List < MovieMetadata > data ) ;
}
public class MovieMetadataRepository : BasicRepository < MovieMetadata > , IMovieMetadataRepository
{
private readonly Logger _logger ;
public MovieMetadataRepository ( IMainDatabase database , IEventAggregator eventAggregator , Logger logger )
: base ( database , eventAggregator )
{
_logger = logger ;
}
2022-07-17 17:57:00 +00:00
public MovieMetadata FindByTmdbId ( int tmdbId )
2022-03-20 15:55:47 +00:00
{
2022-07-17 17:57:00 +00:00
return Query ( x = > x . TmdbId = = tmdbId ) . FirstOrDefault ( ) ;
}
public MovieMetadata FindByImdbId ( string imdbId )
{
return Query ( x = > x . ImdbId = = imdbId ) . FirstOrDefault ( ) ;
2022-03-20 15:55:47 +00:00
}
public List < MovieMetadata > FindById ( List < int > tmdbIds )
{
return Query ( x = > Enumerable . Contains ( tmdbIds , x . TmdbId ) ) ;
}
2022-06-03 00:31:42 +00:00
public List < MovieMetadata > GetMoviesWithCollections ( )
{
var movieDictionary = new Dictionary < int , MovieMetadata > ( ) ;
var builder = new SqlBuilder ( _database . DatabaseType )
. LeftJoin < MovieMetadata , MovieTranslation > ( ( mm , t ) = > mm . Id = = t . MovieMetadataId )
. Where < MovieMetadata > ( x = > x . CollectionTmdbId > 0 ) ;
_ = _database . QueryJoined < MovieMetadata , MovieTranslation > (
builder ,
( metadata , translation ) = >
{
2023-05-23 10:48:37 +00:00
if ( ! movieDictionary . TryGetValue ( metadata . Id , out var movieEntry ) )
2022-06-03 00:31:42 +00:00
{
movieEntry = metadata ;
movieDictionary . Add ( movieEntry . Id , movieEntry ) ;
}
if ( translation ! = null )
{
movieEntry . Translations . Add ( translation ) ;
}
else
{
// Add a translation to avoid filename builder making another call thinking translations are not loaded
// Optimize this later by pulling translations with metadata always
movieEntry . Translations . Add ( new MovieTranslation { Title = movieEntry . Title , Language = Language . English } ) ;
}
return movieEntry ;
} ) ;
return movieDictionary . Values . ToList ( ) ;
}
2022-03-08 02:03:00 +00:00
public List < MovieMetadata > GetMoviesByCollectionTmdbId ( int collectionId )
{
return Query ( x = > x . CollectionTmdbId = = collectionId ) ;
}
2022-03-20 15:55:47 +00:00
public bool UpsertMany ( List < MovieMetadata > data )
{
var existingMetadata = FindById ( data . Select ( x = > x . TmdbId ) . ToList ( ) ) ;
var updateMetadataList = new List < MovieMetadata > ( ) ;
var addMetadataList = new List < MovieMetadata > ( ) ;
2023-05-23 10:52:39 +00:00
var upToDateMetadataCount = 0 ;
2022-03-20 15:55:47 +00:00
foreach ( var meta in data )
{
var existing = existingMetadata . SingleOrDefault ( x = > x . TmdbId = = meta . TmdbId ) ;
if ( existing ! = null )
{
meta . UseDbFieldsFrom ( existing ) ;
if ( ! meta . Equals ( existing ) )
{
updateMetadataList . Add ( meta ) ;
}
else
{
upToDateMetadataCount + + ;
}
}
else
{
addMetadataList . Add ( meta ) ;
}
}
UpdateMany ( updateMetadataList ) ;
InsertMany ( addMetadataList ) ;
_logger . Debug ( $"{upToDateMetadataCount} movie metadata up to date; Updating {updateMetadataList.Count}, Adding {addMetadataList.Count} movie metadata entries." ) ;
return updateMetadataList . Count > 0 | | addMetadataList . Count > 0 ;
}
}
}