Browse Source

search index fixes (#559)

* add music video artist to search index

* properly index minutes field when adding from scan

* bump search index version
pull/560/head
Jason Dove 4 years ago committed by GitHub
parent
commit
d9d2cfa8be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      CHANGELOG.md
  2. 4
      ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs
  3. 2
      ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs
  4. 2
      ErsatzTV.Core/Metadata/LocalStatisticsProvider.cs
  5. 38
      ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs
  6. 6
      ErsatzTV.Infrastructure/Data/Repositories/MusicVideoRepository.cs
  7. 2
      ErsatzTV.Infrastructure/Data/Repositories/SearchRepository.cs
  8. 10
      ErsatzTV.Infrastructure/Search/SearchIndex.cs
  9. 1
      docs/user-guide/search.md

3
CHANGELOG.md

@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased]
### Fixed
- Properly index `minutes` field when adding new items during scan (vs when rebuilding index)
### Changed
- Remove `HLS Hybrid` streaming mode; all channels have been reconfigured to use the superior `HLS Segmenter` streaming mode
- Update `MPEG-TS` streaming mode to internally use the HLS segmenter

4
ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs

@ -146,8 +146,8 @@ namespace ErsatzTV.Core.Tests.FFmpeg @@ -146,8 +146,8 @@ namespace ErsatzTV.Core.Tests.FFmpeg
var metadataRepository = new Mock<IMetadataRepository>();
metadataRepository
.Setup(r => r.UpdateLocalStatistics(It.IsAny<int>(), It.IsAny<MediaVersion>(), It.IsAny<bool>()))
.Callback<int, MediaVersion, bool>((_, version, _) => v = version);
.Setup(r => r.UpdateLocalStatistics(It.IsAny<MediaItem>(), It.IsAny<MediaVersion>(), It.IsAny<bool>()))
.Callback<MediaItem, MediaVersion, bool>((_, version, _) => v = version);
var localStatisticsProvider = new LocalStatisticsProvider(
metadataRepository.Object,

2
ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs

@ -15,7 +15,7 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -15,7 +15,7 @@ namespace ErsatzTV.Core.Interfaces.Repositories
Task<bool> RemoveActor(Actor actor);
Task<bool> Update(Domain.Metadata metadata);
Task<bool> Add(Domain.Metadata metadata);
Task<bool> UpdateLocalStatistics(int mediaVersionId, MediaVersion incoming, bool updateVersion = true);
Task<bool> UpdateLocalStatistics(MediaItem mediaItem, MediaVersion incoming, bool updateVersion = true);
Task<bool> UpdatePlexStatistics(int mediaVersionId, MediaVersion incoming);
Task<Unit> UpdateArtworkPath(Artwork artwork);
Task<Unit> AddArtwork(Domain.Metadata metadata, Artwork artwork);

2
ErsatzTV.Core/Metadata/LocalStatisticsProvider.cs

@ -132,7 +132,7 @@ namespace ErsatzTV.Core.Metadata @@ -132,7 +132,7 @@ namespace ErsatzTV.Core.Metadata
version.DateUpdated = _localFileSystem.GetLastWriteTime(filePath);
return await _metadataRepository.UpdateLocalStatistics(mediaItemVersion.Id, version) && durationChange;
return await _metadataRepository.UpdateLocalStatistics(mediaItem, version) && durationChange;
}
private Task<Either<BaseError, FFprobe>> GetProbeOutput(string ffprobePath, string filePath)

38
ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs

@ -4,6 +4,7 @@ using System.Linq; @@ -4,6 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
using Dapper;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Extensions;
using ErsatzTV.Core.Interfaces.Repositories;
using LanguageExt;
using Microsoft.EntityFrameworkCore;
@ -110,14 +111,17 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -110,14 +111,17 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
}
public async Task<bool> UpdateLocalStatistics(
int mediaVersionId,
MediaItem mediaItem,
MediaVersion incoming,
bool updateVersion = true)
{
int mediaVersionId = mediaItem.GetHeadVersion().Id;
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
Option<MediaVersion> maybeVersion = await dbContext.MediaVersions
.Include(v => v.Streams)
.Include(v => v.Chapters)
.Include(v => v.MediaFiles)
.OrderBy(v => v.Id)
.SingleOrDefaultAsync(v => v.Id == mediaVersionId)
.Map(Optional);
@ -191,7 +195,37 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -191,7 +195,37 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
existingChapter.Title = incomingChapter.Title;
}
return await dbContext.SaveChangesAsync() > 0;
if (await dbContext.SaveChangesAsync() <= 0)
{
return false;
}
// reload the media versions so we can properly index the duration
switch (mediaItem)
{
case Movie movie:
movie.MediaVersions.Clear();
movie.MediaVersions.Add(existing);
break;
case Episode episode:
episode.MediaVersions.Clear();
episode.MediaVersions.Add(existing);
break;
case MusicVideo musicVideo:
musicVideo.MediaVersions.Clear();
musicVideo.MediaVersions.Add(existing);
break;
case OtherVideo otherVideo:
otherVideo.MediaVersions.Clear();
otherVideo.MediaVersions.Add(existing);
break;
case Song song:
song.MediaVersions.Clear();
song.MediaVersions.Add(existing);
break;
}
return true;
},
() => Task.FromResult(false));
}

6
ErsatzTV.Infrastructure/Data/Repositories/MusicVideoRepository.cs

@ -30,9 +30,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -30,9 +30,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
LibraryPath libraryPath,
string path)
{
await using TvContext dbContext = _dbContextFactory.CreateDbContext();
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
Option<MusicVideo> maybeExisting = await dbContext.MusicVideos
.AsNoTracking()
.Include(mv => mv.Artist)
.ThenInclude(a => a.ArtistMetadata)
.Include(mv => mv.MusicVideoMetadata)
.ThenInclude(mvm => mvm.Artwork)
.Include(mv => mv.MusicVideoMetadata)
@ -196,6 +198,8 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -196,6 +198,8 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
await dbContext.MusicVideos.AddAsync(musicVideo);
await dbContext.SaveChangesAsync();
await dbContext.Entry(musicVideo).Reference(m => m.Artist).LoadAsync();
await dbContext.Entry(musicVideo.Artist).Collection(a => a.ArtistMetadata).LoadAsync();
await dbContext.Entry(musicVideo).Reference(m => m.LibraryPath).LoadAsync();
await dbContext.Entry(musicVideo.LibraryPath).Reference(lp => lp.Library).LoadAsync();
return new MediaItemScanResult<MusicVideo>(musicVideo) { IsAdded = true };

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

@ -83,6 +83,8 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -83,6 +83,8 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
.ThenInclude(mm => mm.Studios)
.Include(mi => (mi as Show).ShowMetadata)
.ThenInclude(mm => mm.Actors)
.Include(mi => (mi as MusicVideo).Artist)
.ThenInclude(mm => mm.ArtistMetadata)
.Include(mi => (mi as MusicVideo).MusicVideoMetadata)
.ThenInclude(mm => mm.Genres)
.Include(mi => (mi as MusicVideo).MusicVideoMetadata)

10
ErsatzTV.Infrastructure/Search/SearchIndex.cs

@ -79,7 +79,7 @@ namespace ErsatzTV.Infrastructure.Search @@ -79,7 +79,7 @@ namespace ErsatzTV.Infrastructure.Search
_initialized = false;
}
public int Version => 18;
public int Version => 19;
public Task<bool> Initialize(ILocalFileSystem localFileSystem)
{
@ -675,6 +675,14 @@ namespace ErsatzTV.Infrastructure.Search @@ -675,6 +675,14 @@ namespace ErsatzTV.Infrastructure.Search
{
doc.Add(new TextField(StudioField, studio.Name, Field.Store.NO));
}
if (musicVideo.Artist != null)
{
foreach (ArtistMetadata artistMetadata in musicVideo.Artist.ArtistMetadata)
{
doc.Add(new TextField(ArtistField, artistMetadata.Title, Field.Store.NO));
}
}
_writer.UpdateDocument(new Term(IdField, musicVideo.Id.ToString()), doc);
}

1
docs/user-guide/search.md

@ -73,6 +73,7 @@ The following fields are available for searching artists: @@ -73,6 +73,7 @@ The following fields are available for searching artists:
The following fields are available for searching music videos:
- `title`: The music video title
- `artist`: The music video artist
- `album`: The music video album
- `genre`: The music video genre
- `library_name`: The name of the library that contains the music video

Loading…
Cancel
Save