From 14f0e95a3d55661eac0940b719d75b92dfce93fd Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Sat, 20 Dec 2025 05:02:20 +0100 Subject: [PATCH] fix: mpv logs to app logger --- .../com/edde746/plezy/mpv/MpvPlayerCore.kt | 29 +++++++++++- ios/Runner/MpvPlayer/MpvPlayerCore.swift | 14 ++++-- lib/mpv/player/player_native.dart | 44 +++++++++++++++++++ lib/screens/discover_screen.dart | 1 - macos/Podfile.lock | 6 +++ macos/Runner/MpvPlayer/MpvPlayerCore.swift | 12 ++++- 6 files changed, 97 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt b/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt index 719be477..e74082aa 100644 --- a/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt +++ b/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt @@ -19,7 +19,8 @@ interface MpvPlayerDelegate { class MpvPlayerCore(private val activity: Activity) : SurfaceHolder.Callback, - MPVLib.EventObserver { + MPVLib.EventObserver, + MPVLib.LogObserver { companion object { private const val TAG = "MpvPlayerCore" @@ -143,8 +144,9 @@ class MpvPlayerCore(private val activity: Activity) : // Initialize MPV MPVLib.init() - // Register event observer + // Register event and log observers MPVLib.addObserver(this) + MPVLib.addLogObserver(this) isInitialized = true Log.d(TAG, "Initialized successfully") @@ -235,6 +237,28 @@ class MpvPlayerCore(private val activity: Activity) : } } + // MPVLib.LogObserver + + override fun logMessage(prefix: String, level: Int, text: String) { + val levelStr = when (level) { + MPVLib.MPV_LOG_LEVEL_FATAL -> "fatal" + MPVLib.MPV_LOG_LEVEL_ERROR -> "error" + MPVLib.MPV_LOG_LEVEL_WARN -> "warn" + MPVLib.MPV_LOG_LEVEL_INFO -> "info" + MPVLib.MPV_LOG_LEVEL_V -> "v" + MPVLib.MPV_LOG_LEVEL_DEBUG -> "debug" + MPVLib.MPV_LOG_LEVEL_TRACE -> "trace" + else -> "info" + } + activity.runOnUiThread { + delegate?.onEvent("log-message", mapOf( + "prefix" to prefix, + "level" to levelStr, + "text" to text + )) + } + } + // Public API fun setProperty(name: String, value: String) { @@ -282,6 +306,7 @@ class MpvPlayerCore(private val activity: Activity) : Log.d(TAG, "Disposing") MPVLib.removeObserver(this) + MPVLib.removeLogObserver(this) surfaceView?.holder?.removeCallback(this) overlayLayoutListener?.let { listener -> diff --git a/ios/Runner/MpvPlayer/MpvPlayerCore.swift b/ios/Runner/MpvPlayer/MpvPlayerCore.swift index 653a8b28..6949ba01 100644 --- a/ios/Runner/MpvPlayer/MpvPlayerCore.swift +++ b/ios/Runner/MpvPlayer/MpvPlayerCore.swift @@ -347,10 +347,16 @@ class MpvPlayerCore: NSObject { case MPV_EVENT_LOG_MESSAGE: if let msgPtr = event.data?.assumingMemoryBound(to: mpv_event_log_message.self) { let msg = msgPtr.pointee - if let prefix = msg.prefix, let level = msg.level, let text = msg.text { - print( - "[MPV:\(String(cString: prefix))] \(String(cString: level)): \(String(cString: text))", - terminator: "") + let prefix = msg.prefix.map { String(cString: $0) } ?? "" + let level = msg.level.map { String(cString: $0) } ?? "" + let text = msg.text.map { String(cString: $0) } ?? "" + + DispatchQueue.main.async { + self.delegate?.onEvent(name: "log-message", data: [ + "prefix": prefix, + "level": level, + "text": text + ]) } } diff --git a/lib/mpv/player/player_native.dart b/lib/mpv/player/player_native.dart index 6dcadfb6..4a1898aa 100644 --- a/lib/mpv/player/player_native.dart +++ b/lib/mpv/player/player_native.dart @@ -4,6 +4,7 @@ import 'dart:io' show Platform; import 'package:flutter/services.dart'; +import '../../utils/app_logger.dart'; import '../font_loader.dart'; import '../models.dart'; import 'player.dart'; @@ -68,6 +69,41 @@ class PlayerNative implements Player { ); _setupEventListener(); + + // Forward MPV logs to app logger + _logController.stream.listen(_forwardToAppLogger); + } + + void _forwardToAppLogger(PlayerLog log) { + final message = '[MPV:${log.prefix}] ${log.text}'.trimRight(); + switch (log.level) { + case PlayerLogLevel.fatal: + case PlayerLogLevel.error: + appLogger.e(message); + case PlayerLogLevel.warn: + appLogger.w(message); + case PlayerLogLevel.info: + case PlayerLogLevel.verbose: + appLogger.i(message); + case PlayerLogLevel.debug: + case PlayerLogLevel.trace: + appLogger.d(message); + case PlayerLogLevel.none: + break; + } + } + + PlayerLogLevel _parseLogLevel(String level) { + return switch (level) { + 'fatal' => PlayerLogLevel.fatal, + 'error' => PlayerLogLevel.error, + 'warn' => PlayerLogLevel.warn, + 'info' => PlayerLogLevel.info, + 'v' || 'verbose' => PlayerLogLevel.verbose, + 'debug' => PlayerLogLevel.debug, + 'trace' => PlayerLogLevel.trace, + _ => PlayerLogLevel.info, + }; } void _setupEventListener() { @@ -203,6 +239,14 @@ class PlayerNative implements Player { _state = _state.copyWith(completed: false); _completedController.add(false); break; + + case 'log-message': + final prefix = data?['prefix'] as String? ?? ''; + final levelStr = data?['level'] as String? ?? 'info'; + final text = data?['text'] as String? ?? ''; + final level = _parseLogLevel(levelStr); + _logController.add(PlayerLog(level: level, prefix: prefix, text: text)); + break; } } diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index 60248732..e7800cbd 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -14,7 +14,6 @@ import '../providers/multi_server_provider.dart'; import '../providers/server_state_provider.dart'; import '../providers/hidden_libraries_provider.dart'; import '../providers/playback_state_provider.dart'; -import '../widgets/desktop_app_bar.dart'; import 'profile/user_avatar_widget.dart'; import '../widgets/hub_section.dart'; import 'profile/profile_switch_screen.dart'; diff --git a/macos/Podfile.lock b/macos/Podfile.lock index d213948f..89499d31 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -15,6 +15,8 @@ PODS: - hotkey_manager_macos (0.0.1): - FlutterMacOS - HotKey + - in_app_review (2.0.0): + - FlutterMacOS - macos_window_utils (1.0.0): - FlutterMacOS - os_media_controls (0.0.1): @@ -75,6 +77,7 @@ DEPENDENCIES: - FlutterMacOS (from `Flutter/ephemeral`) - gamepads_darwin (from `Flutter/ephemeral/.symlinks/plugins/gamepads_darwin/macos`) - hotkey_manager_macos (from `Flutter/ephemeral/.symlinks/plugins/hotkey_manager_macos/macos`) + - in_app_review (from `Flutter/ephemeral/.symlinks/plugins/in_app_review/macos`) - macos_window_utils (from `Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos`) - os_media_controls (from `Flutter/ephemeral/.symlinks/plugins/os_media_controls/macos`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) @@ -109,6 +112,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/gamepads_darwin/macos hotkey_manager_macos: :path: Flutter/ephemeral/.symlinks/plugins/hotkey_manager_macos/macos + in_app_review: + :path: Flutter/ephemeral/.symlinks/plugins/in_app_review/macos macos_window_utils: :path: Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos os_media_controls: @@ -143,6 +148,7 @@ SPEC CHECKSUMS: gamepads_darwin: 643b6a69e20ca678fae83781b7f7fc8f15f5d710 HotKey: 400beb7caa29054ea8d864c96f5ba7e5b4852277 hotkey_manager_macos: a4317849af96d2430fa89944d3c58977ca089fbe + in_app_review: 66e7680752b632d83f4f0e88b34d52ed303fbff4 macos_window_utils: 23f54331a0fd51eea9e0ed347253bf48fd379d1d os_media_controls: c07c04c4afdf59dda0a3f398457a46823c4ce0ed package_info_plus: f0052d280d17aa382b932f399edf32507174e870 diff --git a/macos/Runner/MpvPlayer/MpvPlayerCore.swift b/macos/Runner/MpvPlayer/MpvPlayerCore.swift index 5fdfb6e9..1d835b5b 100644 --- a/macos/Runner/MpvPlayer/MpvPlayerCore.swift +++ b/macos/Runner/MpvPlayer/MpvPlayerCore.swift @@ -304,8 +304,16 @@ class MpvPlayerCore: NSObject { case MPV_EVENT_LOG_MESSAGE: if let msgPtr = event.data?.assumingMemoryBound(to: mpv_event_log_message.self) { let msg = msgPtr.pointee - if let prefix = msg.prefix, let level = msg.level, let text = msg.text { - print("[MPV:\(String(cString: prefix))] \(String(cString: level)): \(String(cString: text))", terminator: "") + let prefix = msg.prefix.map { String(cString: $0) } ?? "" + let level = msg.level.map { String(cString: $0) } ?? "" + let text = msg.text.map { String(cString: $0) } ?? "" + + DispatchQueue.main.async { + self.delegate?.onEvent(name: "log-message", data: [ + "prefix": prefix, + "level": level, + "text": text + ]) } }