From e11ebca370fa9d66f6e0cccb6422af2d7dadb859 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Fri, 19 Dec 2025 13:19:57 +0100 Subject: [PATCH] fix: missing subtitle characters close #178 --- ...roid_font_loader.dart => font_loader.dart} | 10 +++++----- lib/mpv/player/player_native.dart | 20 +++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) rename lib/mpv/{android_font_loader.dart => font_loader.dart} (81%) diff --git a/lib/mpv/android_font_loader.dart b/lib/mpv/font_loader.dart similarity index 81% rename from lib/mpv/android_font_loader.dart rename to lib/mpv/font_loader.dart index 1c84210c..99e9612a 100644 --- a/lib/mpv/android_font_loader.dart +++ b/lib/mpv/font_loader.dart @@ -4,15 +4,15 @@ import 'package:flutter/services.dart'; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; -/// Utility class for loading font assets on Android for libass subtitle rendering. +/// Utility class for loading font assets for libass subtitle rendering. /// -/// On Android, libass cannot access system fonts through fontconfig, so we need -/// to extract font files from Flutter assets to the app's cache directory. -class AndroidFontLoader { +/// Extracts font files from Flutter assets to the app's cache directory to ensure +/// comprehensive Unicode coverage (including CJK characters) for subtitles. +class SubtitleFontLoader { static const String _fontAssetPath = 'assets/go-noto-current-regular.ttf'; static const String _fontName = 'Go Noto Current-Regular'; - /// Loads the subtitle font from assets to the Android cache directory. + /// Loads the subtitle font from assets to the cache directory. /// Returns the directory path containing the font file. static Future loadSubtitleFont() async { try { diff --git a/lib/mpv/player/player_native.dart b/lib/mpv/player/player_native.dart index e9c8ef8b..6dcadfb6 100644 --- a/lib/mpv/player/player_native.dart +++ b/lib/mpv/player/player_native.dart @@ -4,7 +4,7 @@ import 'dart:io' show Platform; import 'package:flutter/services.dart'; -import '../android_font_loader.dart'; +import '../font_loader.dart'; import '../models.dart'; import 'player.dart'; import 'player_state.dart'; @@ -292,10 +292,8 @@ class PlayerNative implements Player { throw Exception('Failed to initialize player'); } - // Configure subtitle fonts for Android libass support - if (Platform.isAndroid) { - await _configureAndroidSubtitleFonts(); - } + // Configure subtitle fonts for libass support + await _configureSubtitleFonts(); // Subscribe to MPV properties await _observeProperty('time-pos', 'double'); @@ -317,17 +315,17 @@ class PlayerNative implements Player { await _methodChannel.invokeMethod('observeProperty', {'name': name, 'format': format}); } - /// Configures subtitle fonts for Android libass support. - /// On Android, libass cannot access system fonts, so we need to provide - /// a font file from assets. - Future _configureAndroidSubtitleFonts() async { + /// Configures subtitle fonts for libass support. + /// Provides a comprehensive Unicode font (Go Noto) with CJK coverage to ensure + /// proper rendering of non-Latin characters in subtitles. + Future _configureSubtitleFonts() async { try { - final fontDir = await AndroidFontLoader.loadSubtitleFont(); + final fontDir = await SubtitleFontLoader.loadSubtitleFont(); if (fontDir != null) { // Configure MPV to use the extracted font for libass await setProperty('config', 'yes'); await setProperty('sub-fonts-dir', fontDir); - await setProperty('sub-font', AndroidFontLoader.fontName); + await setProperty('sub-font', SubtitleFontLoader.fontName); } } catch (e) { // Font configuration is not critical - continue without it