feat: external player support

close #388
This commit is contained in:
edde746
2026-02-11 14:59:52 +01:00
parent 45e72e0ad9
commit 03907db6c4
36 changed files with 1465 additions and 2 deletions
+62
View File
@@ -4,6 +4,7 @@ import '../models/hotkey_model.dart';
import 'package:plezy/utils/app_logger.dart';
import '../i18n/strings.g.dart';
import '../models/mpv_config_models.dart';
import '../models/external_player_models.dart';
import 'base_shared_preferences_service.dart';
import '../utils/platform_detector.dart';
@@ -70,6 +71,9 @@ class SettingsService extends BaseSharedPreferencesService {
static const String _keyShowUnwatchedCount = 'show_unwatched_count';
static const String _keyGlobalShaderPreset = 'global_shader_preset';
static const String _keyRequireProfileSelectionOnOpen = 'require_profile_selection_on_open';
static const String _keyUseExternalPlayer = 'use_external_player';
static const String _keySelectedExternalPlayer = 'selected_external_player';
static const String _keyCustomExternalPlayers = 'custom_external_players';
SettingsService._();
@@ -1048,6 +1052,61 @@ class SettingsService extends BaseSharedPreferencesService {
return prefs.getBool(_keyRequireProfileSelectionOnOpen) ?? false;
}
// External Player
Future<void> setUseExternalPlayer(bool enabled) async {
await prefs.setBool(_keyUseExternalPlayer, enabled);
}
bool getUseExternalPlayer() {
return prefs.getBool(_keyUseExternalPlayer) ?? false;
}
Future<void> setSelectedExternalPlayer(ExternalPlayer player) async {
await prefs.setString(_keySelectedExternalPlayer, player.toJsonString());
}
ExternalPlayer getSelectedExternalPlayer() {
final jsonString = prefs.getString(_keySelectedExternalPlayer);
if (jsonString == null) return KnownPlayers.systemDefault;
try {
return ExternalPlayer.fromJsonString(jsonString);
} catch (_) {
return KnownPlayers.systemDefault;
}
}
Future<void> setCustomExternalPlayers(List<ExternalPlayer> players) async {
final jsonString = json.encode(players.map((p) => p.toJson()).toList());
await prefs.setString(_keyCustomExternalPlayers, jsonString);
}
List<ExternalPlayer> getCustomExternalPlayers() {
final jsonString = prefs.getString(_keyCustomExternalPlayers);
if (jsonString == null) return [];
try {
final List<dynamic> decoded = json.decode(jsonString);
return decoded.map((e) => ExternalPlayer.fromJson(e as Map<String, dynamic>)).toList();
} catch (_) {
return [];
}
}
Future<void> addCustomExternalPlayer(ExternalPlayer player) async {
final players = getCustomExternalPlayers();
players.add(player);
await setCustomExternalPlayers(players);
}
Future<void> removeCustomExternalPlayer(String id) async {
final players = getCustomExternalPlayers();
players.removeWhere((p) => p.id == id);
await setCustomExternalPlayers(players);
// If the removed player was selected, reset to system default
if (getSelectedExternalPlayer().id == id) {
await setSelectedExternalPlayer(KnownPlayers.systemDefault);
}
}
// Reset all settings to defaults
Future<void> resetAllSettings() async {
await Future.wait([
@@ -1098,6 +1157,9 @@ class SettingsService extends BaseSharedPreferencesService {
prefs.remove(_keyShowUnwatchedCount),
prefs.remove(_keyGlobalShaderPreset),
prefs.remove(_keyRequireProfileSelectionOnOpen),
prefs.remove(_keyUseExternalPlayer),
prefs.remove(_keySelectedExternalPlayer),
prefs.remove(_keyCustomExternalPlayers),
]);
}