diff --git a/ErsatzTV.Core.Tests/Metadata/MovieFolderScannerTests.cs b/ErsatzTV.Core.Tests/Metadata/MovieFolderScannerTests.cs index 60856949d..a44435f15 100644 --- a/ErsatzTV.Core.Tests/Metadata/MovieFolderScannerTests.cs +++ b/ErsatzTV.Core.Tests/Metadata/MovieFolderScannerTests.cs @@ -557,6 +557,7 @@ namespace ErsatzTV.Core.Tests.Metadata new Mock().Object, _imageCache.Object, new Mock().Object, + new Mock().Object, new Mock().Object, new Mock>().Object ); diff --git a/ErsatzTV.Core/Interfaces/Repositories/ISearchRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/ISearchRepository.cs index 0400b0cee..7b17aeb57 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/ISearchRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/ISearchRepository.cs @@ -12,5 +12,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories public Task> SearchMediaItemsByTitle(string query); public Task> SearchMediaItemsByGenre(string genre); public Task> SearchMediaItemsByTag(string tag); + public Task> GetLanguagesForShow(Show show); } } diff --git a/ErsatzTV.Core/Interfaces/Search/ISearchIndex.cs b/ErsatzTV.Core/Interfaces/Search/ISearchIndex.cs index cdd7ab3ed..b76c9639a 100644 --- a/ErsatzTV.Core/Interfaces/Search/ISearchIndex.cs +++ b/ErsatzTV.Core/Interfaces/Search/ISearchIndex.cs @@ -14,8 +14,8 @@ namespace ErsatzTV.Core.Interfaces.Search public int Version { get; } Task Initialize(ILocalFileSystem localFileSystem); Task Rebuild(ISearchRepository searchRepository, List itemIds); - Task AddItems(List items); - Task UpdateItems(List items); + Task AddItems(ISearchRepository searchRepository, List items); + Task UpdateItems(ISearchRepository searchRepository, List items); Task RemoveItems(List ids); Task Search(string query, int skip, int limit, string searchField = ""); void Commit(); diff --git a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs index 52a04b1d1..688efc6ab 100644 --- a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs @@ -26,6 +26,7 @@ namespace ErsatzTV.Core.Metadata private readonly IMediator _mediator; private readonly IMovieRepository _movieRepository; private readonly ISearchIndex _searchIndex; + private readonly ISearchRepository _searchRepository; public MovieFolderScanner( ILocalFileSystem localFileSystem, @@ -35,6 +36,7 @@ namespace ErsatzTV.Core.Metadata IMetadataRepository metadataRepository, IImageCache imageCache, ISearchIndex searchIndex, + ISearchRepository searchRepository, IMediator mediator, ILogger logger) : base(localFileSystem, localStatisticsProvider, metadataRepository, imageCache, logger) @@ -43,6 +45,7 @@ namespace ErsatzTV.Core.Metadata _movieRepository = movieRepository; _localMetadataProvider = localMetadataProvider; _searchIndex = searchIndex; + _searchRepository = searchRepository; _mediator = mediator; _logger = logger; } @@ -115,11 +118,11 @@ namespace ErsatzTV.Core.Metadata { if (result.IsAdded) { - await _searchIndex.AddItems(new List { result.Item }); + await _searchIndex.AddItems(_searchRepository, new List { result.Item }); } else if (result.IsUpdated) { - await _searchIndex.UpdateItems(new List { result.Item }); + await _searchIndex.UpdateItems(_searchRepository, new List { result.Item }); } }, error => diff --git a/ErsatzTV.Core/Metadata/MusicVideoFolderScanner.cs b/ErsatzTV.Core/Metadata/MusicVideoFolderScanner.cs index 9246e9682..d2a6ae0fa 100644 --- a/ErsatzTV.Core/Metadata/MusicVideoFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/MusicVideoFolderScanner.cs @@ -25,6 +25,7 @@ namespace ErsatzTV.Core.Metadata private readonly IMediator _mediator; private readonly IMusicVideoRepository _musicVideoRepository; private readonly ISearchIndex _searchIndex; + private readonly ISearchRepository _searchRepository; public MusicVideoFolderScanner( ILocalFileSystem localFileSystem, @@ -33,6 +34,7 @@ namespace ErsatzTV.Core.Metadata IMetadataRepository metadataRepository, IImageCache imageCache, ISearchIndex searchIndex, + ISearchRepository searchRepository, IMusicVideoRepository musicVideoRepository, IMediator mediator, ILogger logger) : base( @@ -45,6 +47,7 @@ namespace ErsatzTV.Core.Metadata _localFileSystem = localFileSystem; _localMetadataProvider = localMetadataProvider; _searchIndex = searchIndex; + _searchRepository = searchRepository; _musicVideoRepository = musicVideoRepository; _mediator = mediator; _logger = logger; @@ -108,11 +111,11 @@ namespace ErsatzTV.Core.Metadata { if (result.IsAdded) { - await _searchIndex.AddItems(new List { result.Item }); + await _searchIndex.AddItems(_searchRepository, new List { result.Item }); } else if (result.IsUpdated) { - await _searchIndex.UpdateItems(new List { result.Item }); + await _searchIndex.UpdateItems(_searchRepository, new List { result.Item }); } }, error => diff --git a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs index 9d0046f74..08e65b522 100644 --- a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs @@ -24,6 +24,7 @@ namespace ErsatzTV.Core.Metadata private readonly ILogger _logger; private readonly IMediator _mediator; private readonly ISearchIndex _searchIndex; + private readonly ISearchRepository _searchRepository; private readonly ITelevisionRepository _televisionRepository; public TelevisionFolderScanner( @@ -34,6 +35,7 @@ namespace ErsatzTV.Core.Metadata IMetadataRepository metadataRepository, IImageCache imageCache, ISearchIndex searchIndex, + ISearchRepository searchRepository, IMediator mediator, ILogger logger) : base( localFileSystem, @@ -46,6 +48,7 @@ namespace ErsatzTV.Core.Metadata _televisionRepository = televisionRepository; _localMetadataProvider = localMetadataProvider; _searchIndex = searchIndex; + _searchRepository = searchRepository; _mediator = mediator; _logger = logger; } @@ -86,11 +89,11 @@ namespace ErsatzTV.Core.Metadata { if (result.IsAdded) { - await _searchIndex.AddItems(new List { result.Item }); + await _searchIndex.AddItems(_searchRepository, new List { result.Item }); } else if (result.IsUpdated) { - await _searchIndex.UpdateItems(new List { result.Item }); + await _searchIndex.UpdateItems(_searchRepository, new List { result.Item }); } await ScanSeasons( diff --git a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs index 18095de5b..799fd82c8 100644 --- a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs +++ b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs @@ -21,12 +21,14 @@ namespace ErsatzTV.Core.Plex private readonly IMovieRepository _movieRepository; private readonly IPlexServerApiClient _plexServerApiClient; private readonly ISearchIndex _searchIndex; + private readonly ISearchRepository _searchRepository; public PlexMovieLibraryScanner( IPlexServerApiClient plexServerApiClient, IMovieRepository movieRepository, IMetadataRepository metadataRepository, ISearchIndex searchIndex, + ISearchRepository searchRepository, IMediator mediator, ILogger logger) : base(metadataRepository, logger) @@ -35,6 +37,7 @@ namespace ErsatzTV.Core.Plex _movieRepository = movieRepository; _metadataRepository = metadataRepository; _searchIndex = searchIndex; + _searchRepository = searchRepository; _mediator = mediator; _logger = logger; } @@ -69,11 +72,13 @@ namespace ErsatzTV.Core.Plex { if (result.IsAdded) { - await _searchIndex.AddItems(new List { result.Item }); + await _searchIndex.AddItems(_searchRepository, new List { result.Item }); } else if (result.IsUpdated) { - await _searchIndex.UpdateItems(new List { result.Item }); + await _searchIndex.UpdateItems( + _searchRepository, + new List { result.Item }); } }, error => diff --git a/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs b/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs index 2eaa4f838..812d6fc21 100644 --- a/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs +++ b/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs @@ -21,6 +21,7 @@ namespace ErsatzTV.Core.Plex private readonly IMetadataRepository _metadataRepository; private readonly IPlexServerApiClient _plexServerApiClient; private readonly ISearchIndex _searchIndex; + private readonly ISearchRepository _searchRepository; private readonly ITelevisionRepository _televisionRepository; public PlexTelevisionLibraryScanner( @@ -28,6 +29,7 @@ namespace ErsatzTV.Core.Plex ITelevisionRepository televisionRepository, IMetadataRepository metadataRepository, ISearchIndex searchIndex, + ISearchRepository searchRepository, IMediator mediator, ILogger logger) : base(metadataRepository, logger) @@ -36,6 +38,7 @@ namespace ErsatzTV.Core.Plex _televisionRepository = televisionRepository; _metadataRepository = metadataRepository; _searchIndex = searchIndex; + _searchRepository = searchRepository; _mediator = mediator; _logger = logger; } @@ -69,11 +72,13 @@ namespace ErsatzTV.Core.Plex { if (result.IsAdded) { - await _searchIndex.AddItems(new List { result.Item }); + await _searchIndex.AddItems(_searchRepository, new List { result.Item }); } else if (result.IsUpdated) { - await _searchIndex.UpdateItems(new List { result.Item }); + await _searchIndex.UpdateItems( + _searchRepository, + new List { result.Item }); } await ScanSeasons(plexMediaSourceLibrary, result.Item, connection, token); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/SearchRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/SearchRepository.cs index 6f888c8b0..a202bd721 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/SearchRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/SearchRepository.cs @@ -138,5 +138,15 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .OfType() .ToListAsync(); } + + public Task> GetLanguagesForShow(Show show) => + _dbConnection.QueryAsync( + @"SELECT DISTINCT Language + FROM MediaStream + INNER JOIN MediaVersion MV on MediaStream.MediaVersionId = MV.Id + INNER JOIN Episode E on MV.EpisodeId = E.Id + INNER JOIN Season S on E.SeasonId = S.Id + WHERE S.ShowId = @ShowId", + new { ShowId = show.Id }).Map(result => result.ToList()); } } diff --git a/ErsatzTV.Infrastructure/Search/SearchIndex.cs b/ErsatzTV.Infrastructure/Search/SearchIndex.cs index ad01f09d9..1609a5b7e 100644 --- a/ErsatzTV.Infrastructure/Search/SearchIndex.cs +++ b/ErsatzTV.Infrastructure/Search/SearchIndex.cs @@ -53,7 +53,7 @@ namespace ErsatzTV.Infrastructure.Search public SearchIndex(ILogger logger) => _logger = logger; - public int Version => 3; + public int Version => 4; public Task Initialize(ILocalFileSystem localFileSystem) { @@ -82,7 +82,7 @@ namespace ErsatzTV.Infrastructure.Search UpdateMovie(movie); break; case Show show: - UpdateShow(show); + await UpdateShow(searchRepository, show); break; case MusicVideo musicVideo: UpdateMusicVideo(musicVideo); @@ -95,9 +95,10 @@ namespace ErsatzTV.Infrastructure.Search return Unit.Default; } - public Task AddItems(List items) => UpdateItems(items); + public Task AddItems(ISearchRepository searchRepository, List items) => + UpdateItems(searchRepository, items); - public Task UpdateItems(List items) + public async Task UpdateItems(ISearchRepository searchRepository, List items) { foreach (MediaItem item in items) { @@ -107,7 +108,7 @@ namespace ErsatzTV.Infrastructure.Search UpdateMovie(movie); break; case Show show: - UpdateShow(show); + await UpdateShow(searchRepository, show); break; case MusicVideo musicVideo: UpdateMusicVideo(musicVideo); @@ -115,7 +116,7 @@ namespace ErsatzTV.Infrastructure.Search } } - return Task.FromResult(Unit.Default); + return Unit.Default; } public Task RemoveItems(List ids) @@ -287,7 +288,7 @@ namespace ErsatzTV.Infrastructure.Search } } - private void UpdateShow(Show show) + private async Task UpdateShow(ISearchRepository searchRepository, Show show) { Option maybeMetadata = show.ShowMetadata.HeadOrNone(); if (maybeMetadata.IsSome) @@ -307,6 +308,12 @@ namespace ErsatzTV.Infrastructure.Search new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES) }; + List languages = await searchRepository.GetLanguagesForShow(show); + foreach (string lang in languages.Distinct().Filter(s => !string.IsNullOrWhiteSpace(s))) + { + doc.Add(new StringField(LanguageField, lang, Field.Store.NO)); + } + if (metadata.ReleaseDate.HasValue) { doc.Add(