Browse Source

more jf episode scanning improvements (#2753)

* more jf episode scanning improvements

* bump log level on important message

* add transaction
pull/2754/head
Jason Dove 7 months ago committed by GitHub
parent
commit
89bb3759de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 26
      ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs
  2. 2
      ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs
  3. 1
      ErsatzTV.Infrastructure/Data/TvContext.cs
  4. 1
      ErsatzTV.Scanner/ErsatzTV.Scanner.csproj
  5. 2
      ErsatzTV.Scanner/Worker.cs

26
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.Actors).ThenInclude(a => a.Artwork)
.Include(e => e.EpisodeMetadata).ThenInclude(em => em.Directors) .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Directors)
.Include(e => e.EpisodeMetadata).ThenInclude(em => em.Writers) .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.Streams)
.Include(e => e.MediaVersions).ThenInclude(mv => mv.Chapters)
.AsSplitQuery() .AsSplitQuery()
.SingleAsync(s => s.Id == existingId, cancellationToken); .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.Actors)
.Include(e => e.EpisodeMetadata).ThenInclude(em => em.Directors) .Include(e => e.EpisodeMetadata).ThenInclude(em => em.Directors)
.Include(e => e.EpisodeMetadata).ThenInclude(em => em.Writers) .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.Streams)
.Include(e => e.MediaVersions).ThenInclude(mv => mv.Chapters)
.AsSplitQuery() .AsSplitQuery()
.SingleAsync(s => s.Id == existingId, cancellationToken); .SingleAsync(s => s.Id == existingId, cancellationToken);
@ -931,14 +927,30 @@ public class JellyfinTelevisionRepository : IJellyfinTelevisionRepository
MediaVersion incomingVersion = incoming.MediaVersions.Head(); MediaVersion incomingVersion = incoming.MediaVersions.Head();
version.Name = incomingVersion.Name; version.Name = incomingVersion.Name;
version.DateAdded = incomingVersion.DateAdded; 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; version.Chapters = incomingVersion.Chapters;
foreach (var ch in version.Chapters)
{
ch.MediaVersionId = version.Id;
}
// media file // always update media file path
MediaFile file = version.MediaFiles.Head();
MediaFile incomingFile = incomingVersion.MediaFiles.Head(); 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 dbContext.SaveChangesAsync(cancellationToken);
await transaction.CommitAsync(cancellationToken);
} }
} }

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

@ -210,7 +210,7 @@ public class MediaItemRepository(
}; };
string libraryName = mediaItem.LibraryPath.Library.Name; string libraryName = mediaItem.LibraryPath.Library.Name;
logger.LogDebug( logger.LogWarning(
"Unable to add media item to {IncomingLibraryType} '{IncomingLibraryName}'; {LibraryType} '{LibraryName}' already contains path {Path}", "Unable to add media item to {IncomingLibraryType} '{IncomingLibraryName}'; {LibraryType} '{LibraryName}' already contains path {Path}",
incomingLibraryType, incomingLibraryType,
incomingLibrary.Name, incomingLibrary.Name,

1
ErsatzTV.Infrastructure/Data/TvContext.cs

@ -50,6 +50,7 @@ public class TvContext : DbContext
public DbSet<MediaVersion> MediaVersions { get; set; } public DbSet<MediaVersion> MediaVersions { get; set; }
public DbSet<MediaFile> MediaFiles { get; set; } public DbSet<MediaFile> MediaFiles { get; set; }
public DbSet<MediaStream> MediaStreams { get; set; } public DbSet<MediaStream> MediaStreams { get; set; }
public DbSet<MediaChapter> MediaChapters { get; set; }
public DbSet<Movie> Movies { get; set; } public DbSet<Movie> Movies { get; set; }
public DbSet<MovieMetadata> MovieMetadata { get; set; } public DbSet<MovieMetadata> MovieMetadata { get; set; }
public DbSet<Artwork> Artwork { get; set; } public DbSet<Artwork> Artwork { get; set; }

1
ErsatzTV.Scanner/ErsatzTV.Scanner.csproj

@ -21,6 +21,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.0" />
<!-- <PackageReference Include="EntityFrameworkProfiler.Appender" Version="6.0.6049" />-->
<PackageReference Include="Humanizer.Core" Version="3.0.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.1" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="MediatR" Version="[12.5.0]" /> <PackageReference Include="MediatR" Version="[12.5.0]" />

2
ErsatzTV.Scanner/Worker.cs

@ -29,6 +29,8 @@ public class Worker : BackgroundService
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
//HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();
using IServiceScope scope = _serviceScopeFactory.CreateScope(); using IServiceScope scope = _serviceScopeFactory.CreateScope();
IMediator mediator = scope.ServiceProvider.GetRequiredService<IMediator>(); IMediator mediator = scope.ServiceProvider.GetRequiredService<IMediator>();
await mediator.Send(new RefreshFFmpegCapabilities(), stoppingToken); await mediator.Send(new RefreshFFmpegCapabilities(), stoppingToken);

Loading…
Cancel
Save