From ce82b9e8246aaee84ad5bdf5a4f72b41d799b68e Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Thu, 1 Jan 2026 20:13:56 +0100 Subject: [PATCH] feat: Implement API handlers for live and VOD streaming and create database module. --- bin/api/streaming_handler.dart | 25 ++++++++++++++++--------- bin/database/database.dart | 23 +++++++++++++++++++++++ bin/server.dart | 10 ++++++++-- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/bin/api/streaming_handler.dart b/bin/api/streaming_handler.dart index e61641d..5154e4c 100644 --- a/bin/api/streaming_handler.dart +++ b/bin/api/streaming_handler.dart @@ -116,7 +116,8 @@ PlaylistConfig? _getCurrentPlaylist(Request request) { // ========================================== Handler createLiveStreamHandler( - Future Function(Request) getPlaylist) { + Future Function(Request) getPlaylist, + {bool Function()? isGpuEnabled}) { final router = Router(); // Route: /api/live/{streamId} (Catch all pattern to debug) @@ -144,11 +145,13 @@ Handler createLiveStreamHandler( '${playlist.dns}/live/${playlist.username}/${playlist.password}/$streamId.ts'; print('[Live] Streaming via FFmpeg: $targetUrl'); - // Log GPU status once - _logGpuStatus(); + // Check if NVIDIA GPU is enabled (from database setting or env var fallback) + final useNvidiaGpu = isGpuEnabled?.call() ?? _isNvidiaGpuEnabled(); - // Check if NVIDIA GPU is enabled - final useNvidiaGpu = _isNvidiaGpuEnabled(); + // Log GPU status + if (useNvidiaGpu) { + print('[Live] Using NVIDIA GPU acceleration (NVDEC)'); + } // Build FFmpeg arguments final ffmpegArgs = [ @@ -268,7 +271,8 @@ Handler createLiveStreamHandler( final _lastLogTime = {}; Handler createVodStreamHandler( - Future Function(Request) getPlaylist) { + Future Function(Request) getPlaylist, + {bool Function()? isGpuEnabled}) { final router = Router(); // Route: /api/vod/{streamId}/playlist.m3u8 @@ -345,9 +349,12 @@ Handler createVodStreamHandler( '${playlist.dns}/$basePath/${playlist.username}/${playlist.password}/$streamId.mkv'; print('[VOD] Starting Transcode ($contentType): $targetUrl'); - // Log GPU status and check if enabled - _logGpuStatus(); - final useNvidiaGpu = _isNvidiaGpuEnabled(); + // Check if NVIDIA GPU is enabled (from database setting or env var fallback) + final useNvidiaGpu = isGpuEnabled?.call() ?? _isNvidiaGpuEnabled(); + + if (useNvidiaGpu) { + print('[VOD] Using NVIDIA GPU acceleration (NVENC)'); + } // Build FFmpeg arguments final ffmpegArgs = [ diff --git a/bin/database/database.dart b/bin/database/database.dart index c65dd19..53507e9 100644 --- a/bin/database/database.dart +++ b/bin/database/database.dart @@ -373,6 +373,29 @@ class AppDatabase { ); } + /// Check if NVIDIA GPU is enabled in any user's settings + /// This is a server-wide setting that applies to all streaming + bool isNvidiaGpuEnabled() { + try { + // Check all user settings for enable_nvidia_gpu + final result = _db.select( + 'SELECT settings_json FROM user_settings ORDER BY updated_at DESC LIMIT 1', + ); + + if (result.isEmpty) return false; + + final settingsJson = result.first['settings_json'] as String; + // Parse JSON to check the setting + // Settings key: enable_nvidia_gpu + if (settingsJson.contains('"enable_nvidia_gpu":true')) { + return true; + } + } catch (e) { + print('[Database] Error checking GPU setting: $e'); + } + return false; + } + /// Close database connection void close() { _db.dispose(); diff --git a/bin/server.dart b/bin/server.dart index 26b6890..938b0b0 100644 --- a/bin/server.dart +++ b/bin/server.dart @@ -172,8 +172,14 @@ void main(List args) async { // Create Streaming Router (Mount handlers on correct paths) final streamingRouter = Router() - ..mount('/api/live', createLiveStreamHandler(getPlaylist)) - ..mount('/api/vod', createVodStreamHandler(getPlaylist)); + ..mount( + '/api/live', + createLiveStreamHandler(getPlaylist, + isGpuEnabled: db.isNvidiaGpuEnabled)) + ..mount( + '/api/vod', + createVodStreamHandler(getPlaylist, + isGpuEnabled: db.isNvidiaGpuEnabled)); // Main handler with API proxy and NEW Streaming Handlers final handler = Cascade()