fix: mpv logs to app logger

This commit is contained in:
edde746
2025-12-20 05:02:20 +01:00
parent 688ad291bd
commit 14f0e95a3d
6 changed files with 97 additions and 9 deletions
@@ -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 ->
+10 -4
View File
@@ -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
])
}
}
+44
View File
@@ -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;
}
}
-1
View File
@@ -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';
+6
View File
@@ -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
+10 -2
View File
@@ -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
])
}
}