mirror of
https://github.com/madari-media/madari-oss.git
synced 2026-04-21 15:11:57 +00:00
feat: added video buffer
This commit is contained in:
parent
f8af47b165
commit
4228607073
5 changed files with 51 additions and 7 deletions
|
|
@ -11,6 +11,7 @@ class PlaybackSettings {
|
||||||
double fontSize;
|
double fontSize;
|
||||||
bool externalPlayer;
|
bool externalPlayer;
|
||||||
String? selectedExternalPlayer;
|
String? selectedExternalPlayer;
|
||||||
|
int bufferSize;
|
||||||
|
|
||||||
PlaybackSettings({
|
PlaybackSettings({
|
||||||
this.autoPlay = true,
|
this.autoPlay = true,
|
||||||
|
|
@ -23,6 +24,7 @@ class PlaybackSettings {
|
||||||
this.fontSize = 16,
|
this.fontSize = 16,
|
||||||
this.externalPlayer = false,
|
this.externalPlayer = false,
|
||||||
this.selectedExternalPlayer,
|
this.selectedExternalPlayer,
|
||||||
|
this.bufferSize = 32,
|
||||||
});
|
});
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
|
|
@ -32,16 +34,18 @@ class PlaybackSettings {
|
||||||
'defaultSubtitleTrack': defaultSubtitleTrack,
|
'defaultSubtitleTrack': defaultSubtitleTrack,
|
||||||
'subtitleColor': subtitleColor.value,
|
'subtitleColor': subtitleColor.value,
|
||||||
'fontSize': fontSize,
|
'fontSize': fontSize,
|
||||||
|
'disableSubtitles': disableSubtitles,
|
||||||
};
|
};
|
||||||
|
|
||||||
factory PlaybackSettings.fromJson(Map<String, dynamic> json) {
|
factory PlaybackSettings.fromJson(Map<String, dynamic> json) {
|
||||||
return PlaybackSettings(
|
return PlaybackSettings(
|
||||||
autoPlay: json['autoPlay'] ?? true,
|
autoPlay: json['autoPlay'] ?? true,
|
||||||
playbackSpeed: json['playbackSpeed'] ?? 1.0,
|
playbackSpeed: (json['playbackSpeed'] ?? 1.0).toDouble(),
|
||||||
defaultAudioTrack: json['defaultAudioTrack'] ?? 'eng',
|
defaultAudioTrack: json['defaultAudioTrack'] ?? 'eng',
|
||||||
defaultSubtitleTrack: json['defaultSubtitleTrack'] ?? 'eng',
|
defaultSubtitleTrack: json['defaultSubtitleTrack'] ?? 'eng',
|
||||||
subtitleColor: Color(json['subtitleColor'] ?? Colors.white.value),
|
subtitleColor: Color(json['subtitleColor'] ?? Colors.white.value),
|
||||||
fontSize: json['fontSize'] ?? 16,
|
fontSize: (json['fontSize'] ?? 16).toDouble(),
|
||||||
|
disableSubtitles: json['disableSubtitles'] ?? false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -372,6 +372,38 @@ class _PlaybackSettingsPageState extends State<PlaybackSettingsPage> {
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
_buildSection(
|
||||||
|
"Player buffer",
|
||||||
|
[
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text("${settings.bufferSize} MB"),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
const Text('32 MB'),
|
||||||
|
Expanded(
|
||||||
|
child: Slider(
|
||||||
|
value: settings.bufferSize.toDouble(),
|
||||||
|
min: 32,
|
||||||
|
max: 2024,
|
||||||
|
label: settings.bufferSize.round().toString(),
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
settings.bufferSize = value.toInt();
|
||||||
|
PlaybackSettingsService.instance
|
||||||
|
.saveSettings(settings);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Text('2024 MB'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -40,12 +40,14 @@ class PlaybackSettingsService {
|
||||||
'disableHardwareAcceleration': settings.disableHardwareAcceleration,
|
'disableHardwareAcceleration': settings.disableHardwareAcceleration,
|
||||||
'externalPlayer': settings.externalPlayer,
|
'externalPlayer': settings.externalPlayer,
|
||||||
'selectedExternalPlayer': settings.selectedExternalPlayer,
|
'selectedExternalPlayer': settings.selectedExternalPlayer,
|
||||||
|
'bufferSize': settings.bufferSize,
|
||||||
|
'fontSize': settings.fontSize,
|
||||||
};
|
};
|
||||||
|
|
||||||
await prefs.setString(_localSettingsKey, json.encode(localSettings));
|
await prefs.setString(_localSettingsKey, json.encode(localSettings));
|
||||||
await AppPocketBaseService.instance.pb.collection('users').update(
|
await AppPocketBaseService.instance.pb.collection('users').update(
|
||||||
AppPocketBaseService.instance.pb.authStore.model.id,
|
AppPocketBaseService.instance.pb.authStore.record!.id,
|
||||||
body: {'playback_v2': settings.toJson()},
|
body: {'config': settings.toJson()},
|
||||||
);
|
);
|
||||||
|
|
||||||
_cachedSettings = settings;
|
_cachedSettings = settings;
|
||||||
|
|
@ -65,7 +67,7 @@ class PlaybackSettingsService {
|
||||||
);
|
);
|
||||||
|
|
||||||
final serverSettings = PlaybackSettings.fromJson(
|
final serverSettings = PlaybackSettings.fromJson(
|
||||||
record.data['playback_v2'] ?? {},
|
record.data['config'] ?? {},
|
||||||
);
|
);
|
||||||
|
|
||||||
_cachedSettings = PlaybackSettings(
|
_cachedSettings = PlaybackSettings(
|
||||||
|
|
@ -74,11 +76,13 @@ class PlaybackSettingsService {
|
||||||
defaultAudioTrack: serverSettings.defaultAudioTrack,
|
defaultAudioTrack: serverSettings.defaultAudioTrack,
|
||||||
defaultSubtitleTrack: serverSettings.defaultSubtitleTrack,
|
defaultSubtitleTrack: serverSettings.defaultSubtitleTrack,
|
||||||
subtitleColor: serverSettings.subtitleColor,
|
subtitleColor: serverSettings.subtitleColor,
|
||||||
fontSize: serverSettings.fontSize,
|
fontSize: (localSettings['fontSize'] ?? 16).toDouble(),
|
||||||
disableHardwareAcceleration:
|
disableHardwareAcceleration:
|
||||||
localSettings['disableHardwareAcceleration'] ?? false,
|
localSettings['disableHardwareAcceleration'] ?? false,
|
||||||
externalPlayer: localSettings['externalPlayer'] ?? false,
|
externalPlayer: localSettings['externalPlayer'] ?? false,
|
||||||
selectedExternalPlayer: localSettings['selectedExternalPlayer'],
|
selectedExternalPlayer: localSettings['selectedExternalPlayer'],
|
||||||
|
disableSubtitles: serverSettings.disableSubtitles,
|
||||||
|
bufferSize: (localSettings['bufferSize'] ?? 32),
|
||||||
);
|
);
|
||||||
|
|
||||||
return _cachedSettings!;
|
return _cachedSettings!;
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ class VideoPlay extends StatefulWidget {
|
||||||
final Meta? meta;
|
final Meta? meta;
|
||||||
final int index;
|
final int index;
|
||||||
final String stream;
|
final String stream;
|
||||||
|
final int bufferSize;
|
||||||
|
|
||||||
const VideoPlay({
|
const VideoPlay({
|
||||||
super.key,
|
super.key,
|
||||||
|
|
@ -25,6 +26,7 @@ class VideoPlay extends StatefulWidget {
|
||||||
required void Function(String message) onError,
|
required void Function(String message) onError,
|
||||||
required this.index,
|
required this.index,
|
||||||
required this.stream,
|
required this.stream,
|
||||||
|
required this.bufferSize,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -35,8 +37,9 @@ class _VideoPlayState extends State<VideoPlay> {
|
||||||
late String stream = widget.stream;
|
late String stream = widget.stream;
|
||||||
|
|
||||||
late final player = Player(
|
late final player = Player(
|
||||||
configuration: const PlayerConfiguration(
|
configuration: PlayerConfiguration(
|
||||||
title: "Madari",
|
title: "Madari",
|
||||||
|
bufferSize: widget.bufferSize * 1024 * 1024,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,7 @@ class _VideoPlayerState extends State<VideoPlayer> with WidgetsBindingObserver {
|
||||||
body: VideoPlay(
|
body: VideoPlay(
|
||||||
stream: widget.stream,
|
stream: widget.stream,
|
||||||
meta: widget.meta,
|
meta: widget.meta,
|
||||||
|
bufferSize: state.data?.bufferSize ?? 32,
|
||||||
index: index,
|
index: index,
|
||||||
key: ValueKey('${widget.id}_${widget.selectedIndex}'),
|
key: ValueKey('${widget.id}_${widget.selectedIndex}'),
|
||||||
enabledHardwareAcceleration:
|
enabledHardwareAcceleration:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue