fix missing movie metadata (#1854)
This commit is contained in:
@@ -56,6 +56,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
- Fix incorrectly removing block items that are hidden from EPG when deco filler is applied
|
||||
- Fix deco selection when deco is scheduled until midnight
|
||||
- Previously, this deco item would be ignored so watermark and filler would be missing
|
||||
- Fix movies with missing medata by generating fallback metadata
|
||||
- This allows these movies to appear in the Trash where they can be deleted
|
||||
|
||||
### Changed
|
||||
- Remove some unnecessary API calls related to media server scanning and paging
|
||||
|
||||
@@ -20,6 +20,7 @@ public class EpisodeMetadataHealthCheck : BaseHealthCheck, IEpisodeMetadataHealt
|
||||
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);
|
||||
|
||||
List<Episode> episodes = await dbContext.Episodes
|
||||
.AsNoTracking()
|
||||
.Filter(e => e.EpisodeMetadata.Count == 0)
|
||||
.Include(e => e.MediaVersions)
|
||||
.ThenInclude(mv => mv.MediaFiles)
|
||||
|
||||
@@ -20,6 +20,7 @@ public class MovieMetadataHealthCheck : BaseHealthCheck, IMovieMetadataHealthChe
|
||||
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);
|
||||
|
||||
List<Movie> movies = await dbContext.Movies
|
||||
.AsNoTracking()
|
||||
.Filter(e => e.MovieMetadata.Count == 0)
|
||||
.Include(e => e.MediaVersions)
|
||||
.ThenInclude(mv => mv.MediaFiles)
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
using Dapper;
|
||||
using ErsatzTV.Core;
|
||||
using ErsatzTV.Core.Domain;
|
||||
using ErsatzTV.Core.Interfaces.Metadata;
|
||||
using ErsatzTV.Core.Metadata;
|
||||
using ErsatzTV.Infrastructure.Data;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ErsatzTV.Services.RunOnce;
|
||||
|
||||
@@ -25,6 +29,16 @@ public class DatabaseCleanerService(
|
||||
using IServiceScope scope = serviceScopeFactory.CreateScope();
|
||||
await using TvContext dbContext = scope.ServiceProvider.GetRequiredService<TvContext>();
|
||||
|
||||
await DeleteInvalidMediaItems(dbContext);
|
||||
await GenerateFallbackMetadata(scope, dbContext, stoppingToken);
|
||||
|
||||
systemStartup.DatabaseIsCleaned();
|
||||
|
||||
logger.LogInformation("Done cleaning database");
|
||||
}
|
||||
|
||||
private static async Task DeleteInvalidMediaItems(TvContext dbContext)
|
||||
{
|
||||
// some old version deleted items in a way that MediaItem was left over without
|
||||
// any corresponding Movie/Show/etc.
|
||||
// this cleans out that old invalid data
|
||||
@@ -42,9 +56,31 @@ public class DatabaseCleanerService(
|
||||
and Id not in (select Id from Artist)
|
||||
and Id not in (select Id from Image)
|
||||
""");
|
||||
}
|
||||
|
||||
systemStartup.DatabaseIsCleaned();
|
||||
private static async Task GenerateFallbackMetadata(
|
||||
IServiceScope scope,
|
||||
TvContext dbContext,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
IFallbackMetadataProvider fallbackMetadataProvider =
|
||||
scope.ServiceProvider.GetRequiredService<IFallbackMetadataProvider>();
|
||||
|
||||
logger.LogInformation("Done cleaning database");
|
||||
List<Movie> movies = await dbContext.Movies
|
||||
.Filter(m => m.MovieMetadata.Count == 0)
|
||||
.Include(m => m.MovieMetadata)
|
||||
.Include(m => m.MediaVersions)
|
||||
.ThenInclude(mv => mv.MediaFiles)
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
foreach (Movie movie in movies)
|
||||
{
|
||||
MovieMetadata metadata = fallbackMetadataProvider.GetFallbackMetadata(movie);
|
||||
metadata.SortTitle = SortTitle.GetSortTitle(metadata.Title);
|
||||
movie.MovieMetadata ??= [];
|
||||
movie.MovieMetadata.Add(metadata);
|
||||
}
|
||||
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user