From 74733a80266f1ec9daea064005cef3f0d84a28fa Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Mon, 28 Jul 2025 19:23:59 +0000 Subject: [PATCH] fix duplicate database migration; fix ssa subtitles (#2216) --- CHANGELOG.md | 1 + ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs | 4 ++-- ErsatzTV/Controllers/InternalController.cs | 4 ++-- .../Services/RunOnce/DatabaseMigratorService.cs | 14 ++++++++++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc19c3a8..5e3f435f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix app startup with MySql/MariaDB - YAML playout: fix `pad_to_next` always running over time - Fix playback with text subtitles when seeking into content, i.e. when first joining a channel +- Fix playback with `.ass` and `.ssa` text subtitles ### Changed - Always tell ffmpeg to stop encoding with a specific duration diff --git a/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs b/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs index 891e0522..b08c9494 100644 --- a/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs +++ b/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs @@ -76,8 +76,8 @@ public abstract class PipelineBuilderBase : IPipelineBuilder { IPipelineStep outputFormat = Path.GetExtension(inputFile).ToLowerInvariant() switch { - "ass" or "ssa" => new OutputFormatAss(), - "vtt" => new OutputFormatWebVtt(), + ".ass" or ".ssa" => new OutputFormatAss(), + ".vtt" => new OutputFormatWebVtt(), _ => new OutputFormatSrt() }; diff --git a/ErsatzTV/Controllers/InternalController.cs b/ErsatzTV/Controllers/InternalController.cs index 991bd668..6cf7aaf8 100644 --- a/ErsatzTV/Controllers/InternalController.cs +++ b/ErsatzTV/Controllers/InternalController.cs @@ -198,8 +198,8 @@ public class InternalController : ControllerBase { string mimeType = Path.GetExtension(path).ToLowerInvariant() switch { - "ass" or "ssa" => "text/x-ssa", - "vtt" => "text/vtt", + ".ass" or ".ssa" => "text/x-ssa", + ".vtt" => "text/vtt", _ => "application/x-subrip" }; diff --git a/ErsatzTV/Services/RunOnce/DatabaseMigratorService.cs b/ErsatzTV/Services/RunOnce/DatabaseMigratorService.cs index cc6646b6..208a10d1 100644 --- a/ErsatzTV/Services/RunOnce/DatabaseMigratorService.cs +++ b/ErsatzTV/Services/RunOnce/DatabaseMigratorService.cs @@ -31,13 +31,23 @@ public class DatabaseMigratorService : BackgroundService using IServiceScope scope = _serviceScopeFactory.CreateScope(); await using TvContext dbContext = scope.ServiceProvider.GetRequiredService(); - await dbContext.Database.MigrateAsync("Add_MediaFilePathHash", stoppingToken); + List pendingMigrations = await dbContext.Database + .GetPendingMigrationsAsync(stoppingToken) + .Map(l => l.ToList()); + + if (pendingMigrations.Contains("Add_MediaFilePathHash", StringComparer.OrdinalIgnoreCase)) + { + await dbContext.Database.MigrateAsync("Add_MediaFilePathHash", stoppingToken); + } // this can't be part of a migration, so we have to stop here and run some sql await PopulatePathHashes(dbContext); // then continue migrating - await dbContext.Database.MigrateAsync(stoppingToken); + if (pendingMigrations.Count > 0) + { + await dbContext.Database.MigrateAsync(stoppingToken); + } await DbInitializer.Initialize(dbContext, stoppingToken);