From 4b0faf4da1a6bbbf7c4e0ad1bba3af327046a180 Mon Sep 17 00:00:00 2001
From: Jason Dove <1695733+jasongdove@users.noreply.github.com>
Date: Thu, 19 Jun 2025 21:52:05 -0500
Subject: [PATCH] unify hardware acceleration in docker (#2045)

---
 CHANGELOG.md                                  |  4 ++++
 .../Checks/IUnifiedDockerHealthCheck.cs       |  5 ++++
 .../Health/Checks/UnifiedDockerHealthCheck.cs | 23 +++++++++++++++++++
 .../Health/HealthCheckService.cs              |  4 +++-
 ErsatzTV/Startup.cs                           |  1 +
 docker/Dockerfile                             |  1 +
 docker/nvidia/Dockerfile                      |  2 +-
 docker/vaapi/Dockerfile                       |  2 +-
 8 files changed, 39 insertions(+), 3 deletions(-)
 create mode 100644 ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs
 create mode 100644 ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 596aa806..3c4b8548 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -45,6 +45,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Upgrade VAAPI docker image Ubuntu base from 22 to 24; bundled ffmpeg from 6.1 to 7.1.1
 - Upgrade NVIDIA docker image Ubuntu base from 20 to 24; bundled ffmpeg from 6.1 to 7.1.1
 - Upgrade base, arm, arm64 docker images bundled ffmpeg from 6.1 to 7.1.1
+- Unify all hardware acceleration methods in base docker images (`latest` and `develop`)
+  - VAAPI, QSV and NVIDIA are now all supported in the base docker image
+  - Other docker image tags are deprecated and will receive no new updates after the next release
+  - A health check has been added to notify users (on `-vaapi` or `-nvidia` tags) of this change
 
 ### Fixed
 - Fix error message about synchronizing Plex collections from a Plex server that has zero collections
diff --git a/ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs b/ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs
new file mode 100644
index 00000000..35e3289a
--- /dev/null
+++ b/ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs
@@ -0,0 +1,5 @@
+namespace ErsatzTV.Core.Health.Checks;
+
+public interface IUnifiedDockerHealthCheck : IHealthCheck
+{
+}
diff --git a/ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs b/ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs
new file mode 100644
index 00000000..4a0f076e
--- /dev/null
+++ b/ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs
@@ -0,0 +1,23 @@
+using System.Reflection;
+using ErsatzTV.Core.Health;
+using ErsatzTV.Core.Health.Checks;
+
+namespace ErsatzTV.Infrastructure.Health.Checks;
+
+public class UnifiedDockerHealthCheck : BaseHealthCheck, IUnifiedDockerHealthCheck
+{
+    private static readonly string InfoVersion = Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "unknown";
+
+    public override string Title => "Unified Docker";
+
+    public Task<HealthCheckResult> Check(CancellationToken cancellationToken)
+    {
+        if (InfoVersion.Contains("docker-vaapi") || InfoVersion.Contains("docker-nvidia"))
+        {
+            return WarningResult("VAAPI and NVIDIA docker tag suffixes are deprecated; please remove `-vaapi` or `-nvidia` and pull the default image.")
+                .AsTask();
+        }
+
+        return NotApplicableResult().AsTask();
+    }
+}
diff --git a/ErsatzTV.Infrastructure/Health/HealthCheckService.cs b/ErsatzTV.Infrastructure/Health/HealthCheckService.cs
index 7e45d8ef..75b68d4e 100644
--- a/ErsatzTV.Infrastructure/Health/HealthCheckService.cs
+++ b/ErsatzTV.Infrastructure/Health/HealthCheckService.cs
@@ -21,12 +21,14 @@ public class HealthCheckService : IHealthCheckService
         IUnavailableHealthCheck unavailableHealthCheck,
         IVaapiDriverHealthCheck vaapiDriverHealthCheck,
         IErrorReportsHealthCheck errorReportsHealthCheck,
+        IUnifiedDockerHealthCheck unifiedDockerHealthCheck,
         ILogger<HealthCheckService> logger)
     {
         _logger = logger;
         _checks =
         [
             macOsConfigFolderHealthCheck,
+            unifiedDockerHealthCheck,
             ffmpegVersionHealthCheck,
             ffmpegReportsHealthCheck,
             hardwareAccelerationHealthCheck,
@@ -36,7 +38,7 @@ public class HealthCheckService : IHealthCheckService
             fileNotFoundHealthCheck,
             unavailableHealthCheck,
             vaapiDriverHealthCheck,
-            errorReportsHealthCheck
+            errorReportsHealthCheck,
         ];
     }
 
diff --git a/ErsatzTV/Startup.cs b/ErsatzTV/Startup.cs
index 84cb3d30..9fb3e7f3 100644
--- a/ErsatzTV/Startup.cs
+++ b/ErsatzTV/Startup.cs
@@ -649,6 +649,7 @@ public class Startup
         services.AddScoped<IUnavailableHealthCheck, UnavailableHealthCheck>();
         services.AddScoped<IVaapiDriverHealthCheck, VaapiDriverHealthCheck>();
         services.AddScoped<IErrorReportsHealthCheck, ErrorReportsHealthCheck>();
+        services.AddScoped<IUnifiedDockerHealthCheck, UnifiedDockerHealthCheck>();
         services.AddScoped<IHealthCheckService, HealthCheckService>();
 
         services.AddScoped<IChannelRepository, ChannelRepository>();
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 70dc7cc8..07987c50 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -45,4 +45,5 @@ WORKDIR /app
 COPY --from=build /app ./
 ENV ETV_CONFIG_FOLDER=/config
 ENV ETV_TRANSCODE_FOLDER=/transcode
+ENV ETV_DISABLE_VULKAN=1
 ENTRYPOINT ["./ErsatzTV"]
diff --git a/docker/nvidia/Dockerfile b/docker/nvidia/Dockerfile
index 2d7b0647..07987c50 100644
--- a/docker/nvidia/Dockerfile
+++ b/docker/nvidia/Dockerfile
@@ -1,6 +1,6 @@
 FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble-amd64 AS dotnet-runtime
 
-FROM jasongdove/ersatztv-ffmpeg:7.1.1-nvidia AS runtime-base
+FROM jasongdove/ersatztv-ffmpeg:7.1.1 AS runtime-base
 COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
 
 # https://hub.docker.com/_/microsoft-dotnet
diff --git a/docker/vaapi/Dockerfile b/docker/vaapi/Dockerfile
index cd613ee0..ce022efd 100644
--- a/docker/vaapi/Dockerfile
+++ b/docker/vaapi/Dockerfile
@@ -1,6 +1,6 @@
 FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble-amd64 AS dotnet-runtime
 
-FROM jasongdove/ersatztv-ffmpeg:7.1.1-vaapi AS runtime-base
+FROM jasongdove/ersatztv-ffmpeg:7.1.1 AS runtime-base
 COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
 
 # https://hub.docker.com/_/microsoft-dotnet