From 422860707389838340eea2eb2495ef94e987a67e Mon Sep 17 00:00:00 2001 From: omkar Date: Fri, 31 Jan 2025 20:08:56 +0530 Subject: [PATCH] feat: added video buffer --- .../model/playback_settings_model.dart | 8 +++-- .../pages/playback_settings_page.dart | 32 +++++++++++++++++++ .../service/playback_setting_service.dart | 12 ++++--- .../video_player/container/video_play.dart | 5 ++- .../video_player/container/video_player.dart | 1 + 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/lib/features/settings/model/playback_settings_model.dart b/lib/features/settings/model/playback_settings_model.dart index 7b81981..fd9f6e4 100644 --- a/lib/features/settings/model/playback_settings_model.dart +++ b/lib/features/settings/model/playback_settings_model.dart @@ -11,6 +11,7 @@ class PlaybackSettings { double fontSize; bool externalPlayer; String? selectedExternalPlayer; + int bufferSize; PlaybackSettings({ this.autoPlay = true, @@ -23,6 +24,7 @@ class PlaybackSettings { this.fontSize = 16, this.externalPlayer = false, this.selectedExternalPlayer, + this.bufferSize = 32, }); Map toJson() => { @@ -32,16 +34,18 @@ class PlaybackSettings { 'defaultSubtitleTrack': defaultSubtitleTrack, 'subtitleColor': subtitleColor.value, 'fontSize': fontSize, + 'disableSubtitles': disableSubtitles, }; factory PlaybackSettings.fromJson(Map json) { return PlaybackSettings( autoPlay: json['autoPlay'] ?? true, - playbackSpeed: json['playbackSpeed'] ?? 1.0, + playbackSpeed: (json['playbackSpeed'] ?? 1.0).toDouble(), defaultAudioTrack: json['defaultAudioTrack'] ?? 'eng', defaultSubtitleTrack: json['defaultSubtitleTrack'] ?? 'eng', subtitleColor: Color(json['subtitleColor'] ?? Colors.white.value), - fontSize: json['fontSize'] ?? 16, + fontSize: (json['fontSize'] ?? 16).toDouble(), + disableSubtitles: json['disableSubtitles'] ?? false, ); } } diff --git a/lib/features/settings/pages/playback_settings_page.dart b/lib/features/settings/pages/playback_settings_page.dart index 5847d13..deb24b4 100644 --- a/lib/features/settings/pages/playback_settings_page.dart +++ b/lib/features/settings/pages/playback_settings_page.dart @@ -372,6 +372,38 @@ class _PlaybackSettingsPageState extends State { ], ], ), + _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'), + ], + ), + ], + ), + ], + ), ], ); }, diff --git a/lib/features/settings/service/playback_setting_service.dart b/lib/features/settings/service/playback_setting_service.dart index 9b4ecc8..35cda12 100644 --- a/lib/features/settings/service/playback_setting_service.dart +++ b/lib/features/settings/service/playback_setting_service.dart @@ -40,12 +40,14 @@ class PlaybackSettingsService { 'disableHardwareAcceleration': settings.disableHardwareAcceleration, 'externalPlayer': settings.externalPlayer, 'selectedExternalPlayer': settings.selectedExternalPlayer, + 'bufferSize': settings.bufferSize, + 'fontSize': settings.fontSize, }; await prefs.setString(_localSettingsKey, json.encode(localSettings)); await AppPocketBaseService.instance.pb.collection('users').update( - AppPocketBaseService.instance.pb.authStore.model.id, - body: {'playback_v2': settings.toJson()}, + AppPocketBaseService.instance.pb.authStore.record!.id, + body: {'config': settings.toJson()}, ); _cachedSettings = settings; @@ -65,7 +67,7 @@ class PlaybackSettingsService { ); final serverSettings = PlaybackSettings.fromJson( - record.data['playback_v2'] ?? {}, + record.data['config'] ?? {}, ); _cachedSettings = PlaybackSettings( @@ -74,11 +76,13 @@ class PlaybackSettingsService { defaultAudioTrack: serverSettings.defaultAudioTrack, defaultSubtitleTrack: serverSettings.defaultSubtitleTrack, subtitleColor: serverSettings.subtitleColor, - fontSize: serverSettings.fontSize, + fontSize: (localSettings['fontSize'] ?? 16).toDouble(), disableHardwareAcceleration: localSettings['disableHardwareAcceleration'] ?? false, externalPlayer: localSettings['externalPlayer'] ?? false, selectedExternalPlayer: localSettings['selectedExternalPlayer'], + disableSubtitles: serverSettings.disableSubtitles, + bufferSize: (localSettings['bufferSize'] ?? 32), ); return _cachedSettings!; diff --git a/lib/features/video_player/container/video_play.dart b/lib/features/video_player/container/video_play.dart index cd5a19e..f27e339 100644 --- a/lib/features/video_player/container/video_play.dart +++ b/lib/features/video_player/container/video_play.dart @@ -15,6 +15,7 @@ class VideoPlay extends StatefulWidget { final Meta? meta; final int index; final String stream; + final int bufferSize; const VideoPlay({ super.key, @@ -25,6 +26,7 @@ class VideoPlay extends StatefulWidget { required void Function(String message) onError, required this.index, required this.stream, + required this.bufferSize, }); @override @@ -35,8 +37,9 @@ class _VideoPlayState extends State { late String stream = widget.stream; late final player = Player( - configuration: const PlayerConfiguration( + configuration: PlayerConfiguration( title: "Madari", + bufferSize: widget.bufferSize * 1024 * 1024, ), ); diff --git a/lib/features/video_player/container/video_player.dart b/lib/features/video_player/container/video_player.dart index 65e025f..297375c 100644 --- a/lib/features/video_player/container/video_player.dart +++ b/lib/features/video_player/container/video_player.dart @@ -151,6 +151,7 @@ class _VideoPlayerState extends State with WidgetsBindingObserver { body: VideoPlay( stream: widget.stream, meta: widget.meta, + bufferSize: state.data?.bufferSize ?? 32, index: index, key: ValueKey('${widget.id}_${widget.selectedIndex}'), enabledHardwareAcceleration: