diff --git a/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs index 3ec86ed4a..0b18a464f 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,14 +927,30 @@ public class JellyfinTelevisionRepository : IJellyfinTelevisionRepository MediaVersion incomingVersion = incoming.MediaVersions.Head(); version.Name = incomingVersion.Name; version.DateAdded = incomingVersion.DateAdded; + + await using var transaction = await dbContext.Database.BeginTransactionAsync(cancellationToken); + + // 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); + + await transaction.CommitAsync(cancellationToken); } } diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs index ceddf989b..0af10784c 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs @@ -210,7 +210,7 @@ public class MediaItemRepository( }; string libraryName = mediaItem.LibraryPath.Library.Name; - logger.LogDebug( + logger.LogWarning( "Unable to add media item to {IncomingLibraryType} '{IncomingLibraryName}'; {LibraryType} '{LibraryName}' already contains path {Path}", incomingLibraryType, incomingLibrary.Name, 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);