From e08067f4b95ef80ee6b97eed2ca07e2d45a27b1e Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:30:11 -0600 Subject: [PATCH] more jf episode scanning improvements --- .../JellyfinTelevisionRepository.cs | 22 +++++++++++++------ ErsatzTV.Infrastructure/Data/TvContext.cs | 1 + ErsatzTV.Scanner/ErsatzTV.Scanner.csproj | 1 + ErsatzTV.Scanner/Worker.cs | 2 ++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs index 3ec86ed4a..d95e70d16 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs @@ -188,9 +188,7 @@ public class JellyfinTelevisionRepository : IJellyfinTelevisionRepository .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Actors).ThenInclude(a => a.Artwork) .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Directors) .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Writers) - .Include(e => e.MediaVersions).ThenInclude(mv => mv.MediaFiles) .Include(e => e.MediaVersions).ThenInclude(mv => mv.Streams) - .Include(e => e.MediaVersions).ThenInclude(mv => mv.Chapters) .AsSplitQuery() .SingleAsync(s => s.Id == existingId, cancellationToken); @@ -210,9 +208,7 @@ public class JellyfinTelevisionRepository : IJellyfinTelevisionRepository .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Actors) .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Directors) .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Writers) - .Include(e => e.MediaVersions).ThenInclude(mv => mv.MediaFiles) .Include(e => e.MediaVersions).ThenInclude(mv => mv.Streams) - .Include(e => e.MediaVersions).ThenInclude(mv => mv.Chapters) .AsSplitQuery() .SingleAsync(s => s.Id == existingId, cancellationToken); @@ -931,12 +927,24 @@ public class JellyfinTelevisionRepository : IJellyfinTelevisionRepository MediaVersion incomingVersion = incoming.MediaVersions.Head(); version.Name = incomingVersion.Name; version.DateAdded = incomingVersion.DateAdded; + + // delete old chapters + await dbContext.MediaChapters + .Where(c => c.MediaVersionId == version.Id) + .ExecuteDeleteAsync(cancellationToken); + + // replace with new chapters version.Chapters = incomingVersion.Chapters; + foreach (var ch in version.Chapters) + { + ch.MediaVersionId = version.Id; + } - // media file - MediaFile file = version.MediaFiles.Head(); + // always update media file path MediaFile incomingFile = incomingVersion.MediaFiles.Head(); - file.Path = incomingFile.Path; + await dbContext.MediaFiles + .Where(mf => mf.MediaVersionId == version.Id) + .ExecuteUpdateAsync(mf => mf.SetProperty(f => f.Path, incomingFile.Path), cancellationToken); await dbContext.SaveChangesAsync(cancellationToken); } diff --git a/ErsatzTV.Infrastructure/Data/TvContext.cs b/ErsatzTV.Infrastructure/Data/TvContext.cs index 12a515b7b..9a1c8fc33 100644 --- a/ErsatzTV.Infrastructure/Data/TvContext.cs +++ b/ErsatzTV.Infrastructure/Data/TvContext.cs @@ -50,6 +50,7 @@ public class TvContext : DbContext public DbSet MediaVersions { get; set; } public DbSet MediaFiles { get; set; } public DbSet MediaStreams { get; set; } + public DbSet MediaChapters { get; set; } public DbSet Movies { get; set; } public DbSet MovieMetadata { get; set; } public DbSet Artwork { get; set; } diff --git a/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj b/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj index 9389a627b..c90fbac79 100644 --- a/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj +++ b/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj @@ -21,6 +21,7 @@ + diff --git a/ErsatzTV.Scanner/Worker.cs b/ErsatzTV.Scanner/Worker.cs index 1a79ec136..b6f46b775 100644 --- a/ErsatzTV.Scanner/Worker.cs +++ b/ErsatzTV.Scanner/Worker.cs @@ -29,6 +29,8 @@ public class Worker : BackgroundService protected override async Task ExecuteAsync(CancellationToken stoppingToken) { + //HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize(); + using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); await mediator.Send(new RefreshFFmpegCapabilities(), stoppingToken);