feat: added video buffer

This commit is contained in:
omkar 2025-01-31 20:08:56 +05:30
parent f8af47b165
commit 4228607073
5 changed files with 51 additions and 7 deletions

View file

@ -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,
); );
} }
} }

View file

@ -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'),
],
),
],
),
],
),
], ],
); );
}, },

View file

@ -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!;

View file

@ -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,
), ),
); );

View file

@ -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: