Browse Source

search show by language (#149)

pull/150/head v0.0.30-prealpha
Jason Dove 5 years ago committed by GitHub
parent
commit
2be729c10e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      ErsatzTV.Core.Tests/Metadata/MovieFolderScannerTests.cs
  2. 1
      ErsatzTV.Core/Interfaces/Repositories/ISearchRepository.cs
  3. 4
      ErsatzTV.Core/Interfaces/Search/ISearchIndex.cs
  4. 7
      ErsatzTV.Core/Metadata/MovieFolderScanner.cs
  5. 7
      ErsatzTV.Core/Metadata/MusicVideoFolderScanner.cs
  6. 7
      ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs
  7. 9
      ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs
  8. 9
      ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs
  9. 10
      ErsatzTV.Infrastructure/Data/Repositories/SearchRepository.cs
  10. 21
      ErsatzTV.Infrastructure/Search/SearchIndex.cs

1
ErsatzTV.Core.Tests/Metadata/MovieFolderScannerTests.cs

@ -557,6 +557,7 @@ namespace ErsatzTV.Core.Tests.Metadata
new Mock<IMetadataRepository>().Object, new Mock<IMetadataRepository>().Object,
_imageCache.Object, _imageCache.Object,
new Mock<ISearchIndex>().Object, new Mock<ISearchIndex>().Object,
new Mock<ISearchRepository>().Object,
new Mock<IMediator>().Object, new Mock<IMediator>().Object,
new Mock<ILogger<MovieFolderScanner>>().Object new Mock<ILogger<MovieFolderScanner>>().Object
); );

1
ErsatzTV.Core/Interfaces/Repositories/ISearchRepository.cs

@ -12,5 +12,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories
public Task<List<MediaItem>> SearchMediaItemsByTitle(string query); public Task<List<MediaItem>> SearchMediaItemsByTitle(string query);
public Task<List<MediaItem>> SearchMediaItemsByGenre(string genre); public Task<List<MediaItem>> SearchMediaItemsByGenre(string genre);
public Task<List<MediaItem>> SearchMediaItemsByTag(string tag); public Task<List<MediaItem>> SearchMediaItemsByTag(string tag);
public Task<List<string>> GetLanguagesForShow(Show show);
} }
} }

4
ErsatzTV.Core/Interfaces/Search/ISearchIndex.cs

@ -14,8 +14,8 @@ namespace ErsatzTV.Core.Interfaces.Search
public int Version { get; } public int Version { get; }
Task<bool> Initialize(ILocalFileSystem localFileSystem); Task<bool> Initialize(ILocalFileSystem localFileSystem);
Task<Unit> Rebuild(ISearchRepository searchRepository, List<int> itemIds); Task<Unit> Rebuild(ISearchRepository searchRepository, List<int> itemIds);
Task<Unit> AddItems(List<MediaItem> items); Task<Unit> AddItems(ISearchRepository searchRepository, List<MediaItem> items);
Task<Unit> UpdateItems(List<MediaItem> items); Task<Unit> UpdateItems(ISearchRepository searchRepository, List<MediaItem> items);
Task<Unit> RemoveItems(List<int> ids); Task<Unit> RemoveItems(List<int> ids);
Task<SearchResult> Search(string query, int skip, int limit, string searchField = ""); Task<SearchResult> Search(string query, int skip, int limit, string searchField = "");
void Commit(); void Commit();

7
ErsatzTV.Core/Metadata/MovieFolderScanner.cs

@ -26,6 +26,7 @@ namespace ErsatzTV.Core.Metadata
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly IMovieRepository _movieRepository; private readonly IMovieRepository _movieRepository;
private readonly ISearchIndex _searchIndex; private readonly ISearchIndex _searchIndex;
private readonly ISearchRepository _searchRepository;
public MovieFolderScanner( public MovieFolderScanner(
ILocalFileSystem localFileSystem, ILocalFileSystem localFileSystem,
@ -35,6 +36,7 @@ namespace ErsatzTV.Core.Metadata
IMetadataRepository metadataRepository, IMetadataRepository metadataRepository,
IImageCache imageCache, IImageCache imageCache,
ISearchIndex searchIndex, ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMediator mediator, IMediator mediator,
ILogger<MovieFolderScanner> logger) ILogger<MovieFolderScanner> logger)
: base(localFileSystem, localStatisticsProvider, metadataRepository, imageCache, logger) : base(localFileSystem, localStatisticsProvider, metadataRepository, imageCache, logger)
@ -43,6 +45,7 @@ namespace ErsatzTV.Core.Metadata
_movieRepository = movieRepository; _movieRepository = movieRepository;
_localMetadataProvider = localMetadataProvider; _localMetadataProvider = localMetadataProvider;
_searchIndex = searchIndex; _searchIndex = searchIndex;
_searchRepository = searchRepository;
_mediator = mediator; _mediator = mediator;
_logger = logger; _logger = logger;
} }
@ -115,11 +118,11 @@ namespace ErsatzTV.Core.Metadata
{ {
if (result.IsAdded) if (result.IsAdded)
{ {
await _searchIndex.AddItems(new List<MediaItem> { result.Item }); await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
} }
else if (result.IsUpdated) else if (result.IsUpdated)
{ {
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item }); await _searchIndex.UpdateItems(_searchRepository, new List<MediaItem> { result.Item });
} }
}, },
error => error =>

7
ErsatzTV.Core/Metadata/MusicVideoFolderScanner.cs

@ -25,6 +25,7 @@ namespace ErsatzTV.Core.Metadata
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly IMusicVideoRepository _musicVideoRepository; private readonly IMusicVideoRepository _musicVideoRepository;
private readonly ISearchIndex _searchIndex; private readonly ISearchIndex _searchIndex;
private readonly ISearchRepository _searchRepository;
public MusicVideoFolderScanner( public MusicVideoFolderScanner(
ILocalFileSystem localFileSystem, ILocalFileSystem localFileSystem,
@ -33,6 +34,7 @@ namespace ErsatzTV.Core.Metadata
IMetadataRepository metadataRepository, IMetadataRepository metadataRepository,
IImageCache imageCache, IImageCache imageCache,
ISearchIndex searchIndex, ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMusicVideoRepository musicVideoRepository, IMusicVideoRepository musicVideoRepository,
IMediator mediator, IMediator mediator,
ILogger<MusicVideoFolderScanner> logger) : base( ILogger<MusicVideoFolderScanner> logger) : base(
@ -45,6 +47,7 @@ namespace ErsatzTV.Core.Metadata
_localFileSystem = localFileSystem; _localFileSystem = localFileSystem;
_localMetadataProvider = localMetadataProvider; _localMetadataProvider = localMetadataProvider;
_searchIndex = searchIndex; _searchIndex = searchIndex;
_searchRepository = searchRepository;
_musicVideoRepository = musicVideoRepository; _musicVideoRepository = musicVideoRepository;
_mediator = mediator; _mediator = mediator;
_logger = logger; _logger = logger;
@ -108,11 +111,11 @@ namespace ErsatzTV.Core.Metadata
{ {
if (result.IsAdded) if (result.IsAdded)
{ {
await _searchIndex.AddItems(new List<MediaItem> { result.Item }); await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
} }
else if (result.IsUpdated) else if (result.IsUpdated)
{ {
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item }); await _searchIndex.UpdateItems(_searchRepository, new List<MediaItem> { result.Item });
} }
}, },
error => error =>

7
ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs

@ -24,6 +24,7 @@ namespace ErsatzTV.Core.Metadata
private readonly ILogger<TelevisionFolderScanner> _logger; private readonly ILogger<TelevisionFolderScanner> _logger;
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly ISearchIndex _searchIndex; private readonly ISearchIndex _searchIndex;
private readonly ISearchRepository _searchRepository;
private readonly ITelevisionRepository _televisionRepository; private readonly ITelevisionRepository _televisionRepository;
public TelevisionFolderScanner( public TelevisionFolderScanner(
@ -34,6 +35,7 @@ namespace ErsatzTV.Core.Metadata
IMetadataRepository metadataRepository, IMetadataRepository metadataRepository,
IImageCache imageCache, IImageCache imageCache,
ISearchIndex searchIndex, ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMediator mediator, IMediator mediator,
ILogger<TelevisionFolderScanner> logger) : base( ILogger<TelevisionFolderScanner> logger) : base(
localFileSystem, localFileSystem,
@ -46,6 +48,7 @@ namespace ErsatzTV.Core.Metadata
_televisionRepository = televisionRepository; _televisionRepository = televisionRepository;
_localMetadataProvider = localMetadataProvider; _localMetadataProvider = localMetadataProvider;
_searchIndex = searchIndex; _searchIndex = searchIndex;
_searchRepository = searchRepository;
_mediator = mediator; _mediator = mediator;
_logger = logger; _logger = logger;
} }
@ -86,11 +89,11 @@ namespace ErsatzTV.Core.Metadata
{ {
if (result.IsAdded) if (result.IsAdded)
{ {
await _searchIndex.AddItems(new List<MediaItem> { result.Item }); await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
} }
else if (result.IsUpdated) else if (result.IsUpdated)
{ {
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item }); await _searchIndex.UpdateItems(_searchRepository, new List<MediaItem> { result.Item });
} }
await ScanSeasons( await ScanSeasons(

9
ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs

@ -21,12 +21,14 @@ namespace ErsatzTV.Core.Plex
private readonly IMovieRepository _movieRepository; private readonly IMovieRepository _movieRepository;
private readonly IPlexServerApiClient _plexServerApiClient; private readonly IPlexServerApiClient _plexServerApiClient;
private readonly ISearchIndex _searchIndex; private readonly ISearchIndex _searchIndex;
private readonly ISearchRepository _searchRepository;
public PlexMovieLibraryScanner( public PlexMovieLibraryScanner(
IPlexServerApiClient plexServerApiClient, IPlexServerApiClient plexServerApiClient,
IMovieRepository movieRepository, IMovieRepository movieRepository,
IMetadataRepository metadataRepository, IMetadataRepository metadataRepository,
ISearchIndex searchIndex, ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMediator mediator, IMediator mediator,
ILogger<PlexMovieLibraryScanner> logger) ILogger<PlexMovieLibraryScanner> logger)
: base(metadataRepository, logger) : base(metadataRepository, logger)
@ -35,6 +37,7 @@ namespace ErsatzTV.Core.Plex
_movieRepository = movieRepository; _movieRepository = movieRepository;
_metadataRepository = metadataRepository; _metadataRepository = metadataRepository;
_searchIndex = searchIndex; _searchIndex = searchIndex;
_searchRepository = searchRepository;
_mediator = mediator; _mediator = mediator;
_logger = logger; _logger = logger;
} }
@ -69,11 +72,13 @@ namespace ErsatzTV.Core.Plex
{ {
if (result.IsAdded) if (result.IsAdded)
{ {
await _searchIndex.AddItems(new List<MediaItem> { result.Item }); await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
} }
else if (result.IsUpdated) else if (result.IsUpdated)
{ {
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item }); await _searchIndex.UpdateItems(
_searchRepository,
new List<MediaItem> { result.Item });
} }
}, },
error => error =>

9
ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs

@ -21,6 +21,7 @@ namespace ErsatzTV.Core.Plex
private readonly IMetadataRepository _metadataRepository; private readonly IMetadataRepository _metadataRepository;
private readonly IPlexServerApiClient _plexServerApiClient; private readonly IPlexServerApiClient _plexServerApiClient;
private readonly ISearchIndex _searchIndex; private readonly ISearchIndex _searchIndex;
private readonly ISearchRepository _searchRepository;
private readonly ITelevisionRepository _televisionRepository; private readonly ITelevisionRepository _televisionRepository;
public PlexTelevisionLibraryScanner( public PlexTelevisionLibraryScanner(
@ -28,6 +29,7 @@ namespace ErsatzTV.Core.Plex
ITelevisionRepository televisionRepository, ITelevisionRepository televisionRepository,
IMetadataRepository metadataRepository, IMetadataRepository metadataRepository,
ISearchIndex searchIndex, ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMediator mediator, IMediator mediator,
ILogger<PlexTelevisionLibraryScanner> logger) ILogger<PlexTelevisionLibraryScanner> logger)
: base(metadataRepository, logger) : base(metadataRepository, logger)
@ -36,6 +38,7 @@ namespace ErsatzTV.Core.Plex
_televisionRepository = televisionRepository; _televisionRepository = televisionRepository;
_metadataRepository = metadataRepository; _metadataRepository = metadataRepository;
_searchIndex = searchIndex; _searchIndex = searchIndex;
_searchRepository = searchRepository;
_mediator = mediator; _mediator = mediator;
_logger = logger; _logger = logger;
} }
@ -69,11 +72,13 @@ namespace ErsatzTV.Core.Plex
{ {
if (result.IsAdded) if (result.IsAdded)
{ {
await _searchIndex.AddItems(new List<MediaItem> { result.Item }); await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
} }
else if (result.IsUpdated) else if (result.IsUpdated)
{ {
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item }); await _searchIndex.UpdateItems(
_searchRepository,
new List<MediaItem> { result.Item });
} }
await ScanSeasons(plexMediaSourceLibrary, result.Item, connection, token); await ScanSeasons(plexMediaSourceLibrary, result.Item, connection, token);

10
ErsatzTV.Infrastructure/Data/Repositories/SearchRepository.cs

@ -138,5 +138,15 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
.OfType<MediaItem>() .OfType<MediaItem>()
.ToListAsync(); .ToListAsync();
} }
public Task<List<string>> GetLanguagesForShow(Show show) =>
_dbConnection.QueryAsync<string>(
@"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());
} }
} }

21
ErsatzTV.Infrastructure/Search/SearchIndex.cs

@ -53,7 +53,7 @@ namespace ErsatzTV.Infrastructure.Search
public SearchIndex(ILogger<SearchIndex> logger) => _logger = logger; public SearchIndex(ILogger<SearchIndex> logger) => _logger = logger;
public int Version => 3; public int Version => 4;
public Task<bool> Initialize(ILocalFileSystem localFileSystem) public Task<bool> Initialize(ILocalFileSystem localFileSystem)
{ {
@ -82,7 +82,7 @@ namespace ErsatzTV.Infrastructure.Search
UpdateMovie(movie); UpdateMovie(movie);
break; break;
case Show show: case Show show:
UpdateShow(show); await UpdateShow(searchRepository, show);
break; break;
case MusicVideo musicVideo: case MusicVideo musicVideo:
UpdateMusicVideo(musicVideo); UpdateMusicVideo(musicVideo);
@ -95,9 +95,10 @@ namespace ErsatzTV.Infrastructure.Search
return Unit.Default; return Unit.Default;
} }
public Task<Unit> AddItems(List<MediaItem> items) => UpdateItems(items); public Task<Unit> AddItems(ISearchRepository searchRepository, List<MediaItem> items) =>
UpdateItems(searchRepository, items);
public Task<Unit> UpdateItems(List<MediaItem> items) public async Task<Unit> UpdateItems(ISearchRepository searchRepository, List<MediaItem> items)
{ {
foreach (MediaItem item in items) foreach (MediaItem item in items)
{ {
@ -107,7 +108,7 @@ namespace ErsatzTV.Infrastructure.Search
UpdateMovie(movie); UpdateMovie(movie);
break; break;
case Show show: case Show show:
UpdateShow(show); await UpdateShow(searchRepository, show);
break; break;
case MusicVideo musicVideo: case MusicVideo musicVideo:
UpdateMusicVideo(musicVideo); UpdateMusicVideo(musicVideo);
@ -115,7 +116,7 @@ namespace ErsatzTV.Infrastructure.Search
} }
} }
return Task.FromResult(Unit.Default); return Unit.Default;
} }
public Task<Unit> RemoveItems(List<int> ids) public Task<Unit> RemoveItems(List<int> ids)
@ -287,7 +288,7 @@ namespace ErsatzTV.Infrastructure.Search
} }
} }
private void UpdateShow(Show show) private async Task UpdateShow(ISearchRepository searchRepository, Show show)
{ {
Option<ShowMetadata> maybeMetadata = show.ShowMetadata.HeadOrNone(); Option<ShowMetadata> maybeMetadata = show.ShowMetadata.HeadOrNone();
if (maybeMetadata.IsSome) if (maybeMetadata.IsSome)
@ -307,6 +308,12 @@ namespace ErsatzTV.Infrastructure.Search
new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES) new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES)
}; };
List<string> 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) if (metadata.ReleaseDate.HasValue)
{ {
doc.Add( doc.Add(

Loading…
Cancel
Save