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

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

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

7
ErsatzTV.Core/Metadata/MovieFolderScanner.cs

@ -26,6 +26,7 @@ namespace ErsatzTV.Core.Metadata @@ -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 @@ -35,6 +36,7 @@ namespace ErsatzTV.Core.Metadata
IMetadataRepository metadataRepository,
IImageCache imageCache,
ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMediator mediator,
ILogger<MovieFolderScanner> logger)
: base(localFileSystem, localStatisticsProvider, metadataRepository, imageCache, logger)
@ -43,6 +45,7 @@ namespace ErsatzTV.Core.Metadata @@ -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 @@ -115,11 +118,11 @@ namespace ErsatzTV.Core.Metadata
{
if (result.IsAdded)
{
await _searchIndex.AddItems(new List<MediaItem> { result.Item });
await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
}
else if (result.IsUpdated)
{
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item });
await _searchIndex.UpdateItems(_searchRepository, new List<MediaItem> { result.Item });
}
},
error =>

7
ErsatzTV.Core/Metadata/MusicVideoFolderScanner.cs

@ -25,6 +25,7 @@ namespace ErsatzTV.Core.Metadata @@ -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 @@ -33,6 +34,7 @@ namespace ErsatzTV.Core.Metadata
IMetadataRepository metadataRepository,
IImageCache imageCache,
ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMusicVideoRepository musicVideoRepository,
IMediator mediator,
ILogger<MusicVideoFolderScanner> logger) : base(
@ -45,6 +47,7 @@ namespace ErsatzTV.Core.Metadata @@ -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 @@ -108,11 +111,11 @@ namespace ErsatzTV.Core.Metadata
{
if (result.IsAdded)
{
await _searchIndex.AddItems(new List<MediaItem> { result.Item });
await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
}
else if (result.IsUpdated)
{
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item });
await _searchIndex.UpdateItems(_searchRepository, new List<MediaItem> { result.Item });
}
},
error =>

7
ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs

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

9
ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs

@ -21,12 +21,14 @@ namespace ErsatzTV.Core.Plex @@ -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<PlexMovieLibraryScanner> logger)
: base(metadataRepository, logger)
@ -35,6 +37,7 @@ namespace ErsatzTV.Core.Plex @@ -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 @@ -69,11 +72,13 @@ namespace ErsatzTV.Core.Plex
{
if (result.IsAdded)
{
await _searchIndex.AddItems(new List<MediaItem> { result.Item });
await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
}
else if (result.IsUpdated)
{
await _searchIndex.UpdateItems(new List<MediaItem> { result.Item });
await _searchIndex.UpdateItems(
_searchRepository,
new List<MediaItem> { result.Item });
}
},
error =>

9
ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs

@ -21,6 +21,7 @@ namespace ErsatzTV.Core.Plex @@ -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 @@ -28,6 +29,7 @@ namespace ErsatzTV.Core.Plex
ITelevisionRepository televisionRepository,
IMetadataRepository metadataRepository,
ISearchIndex searchIndex,
ISearchRepository searchRepository,
IMediator mediator,
ILogger<PlexTelevisionLibraryScanner> logger)
: base(metadataRepository, logger)
@ -36,6 +38,7 @@ namespace ErsatzTV.Core.Plex @@ -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 @@ -69,11 +72,13 @@ namespace ErsatzTV.Core.Plex
{
if (result.IsAdded)
{
await _searchIndex.AddItems(new List<MediaItem> { result.Item });
await _searchIndex.AddItems(_searchRepository, new List<MediaItem> { result.Item });
}
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);

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

@ -138,5 +138,15 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -138,5 +138,15 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
.OfType<MediaItem>()
.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 @@ -53,7 +53,7 @@ namespace ErsatzTV.Infrastructure.Search
public SearchIndex(ILogger<SearchIndex> logger) => _logger = logger;
public int Version => 3;
public int Version => 4;
public Task<bool> Initialize(ILocalFileSystem localFileSystem)
{
@ -82,7 +82,7 @@ namespace ErsatzTV.Infrastructure.Search @@ -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 @@ -95,9 +95,10 @@ namespace ErsatzTV.Infrastructure.Search
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)
{
@ -107,7 +108,7 @@ namespace ErsatzTV.Infrastructure.Search @@ -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 @@ -115,7 +116,7 @@ namespace ErsatzTV.Infrastructure.Search
}
}
return Task.FromResult(Unit.Default);
return Unit.Default;
}
public Task<Unit> RemoveItems(List<int> ids)
@ -287,7 +288,7 @@ namespace ErsatzTV.Infrastructure.Search @@ -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();
if (maybeMetadata.IsSome)
@ -307,6 +308,12 @@ namespace ErsatzTV.Infrastructure.Search @@ -307,6 +308,12 @@ namespace ErsatzTV.Infrastructure.Search
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)
{
doc.Add(

Loading…
Cancel
Save