chore: Update MPV package to latest version (#165)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2024-11-28 21:42:40 +01:00 committed by GitHub
parent da354437e3
commit a518ae457e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 209 additions and 133 deletions

View file

@ -8,7 +8,6 @@ import 'package:flutter/services.dart';
import 'package:collection/collection.dart';
import 'package:dynamic_color/dynamic_color.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
@ -45,19 +44,6 @@ bool get _isDesktop {
].contains(defaultTargetPlatform);
}
class CustomCacheManager {
static const key = 'customCacheKey';
static CacheManager instance = CacheManager(
Config(
key,
stalePeriod: const Duration(days: 3),
maxNrOfCacheObjects: 500,
repo: JsonCacheInfoRepository(databaseName: key),
fileService: HttpFileService(),
),
);
}
Future<Map<String, dynamic>> loadConfig() async {
final configString = await rootBundle.loadString('config/config.json');
return jsonDecode(configString);
@ -310,6 +296,7 @@ class _MainState extends ConsumerState<Main> with WindowListener, WidgetsBinding
),
child: ScaffoldMessenger(child: child ?? Container()),
),
debugShowCheckedModeBanner: false,
darkTheme: darkTheme.copyWith(
scaffoldBackgroundColor: amoledOverwrite,
cardColor: amoledOverwrite,

View file

@ -2,14 +2,15 @@ import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:collection/collection.dart';
import 'package:fladder/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart' as dto;
import 'package:fladder/providers/image_provider.dart';
import 'package:fladder/util/custom_cache_manager.dart';
class Chapter {
final String name;

View file

@ -1,16 +1,17 @@
import 'dart:convert';
import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:collection/collection.dart';
import 'package:fladder/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart' as enums;
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart' as dto;
import 'package:fladder/providers/image_provider.dart';
import 'package:fladder/util/custom_cache_manager.dart';
import 'package:fladder/util/jelly_id.dart';
class ImagesData {

View file

@ -1,16 +1,16 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:ficonsax/ficonsax.dart';
import 'package:fladder/main.dart';
import 'package:fladder/theme.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:flutter/material.dart';
import 'package:ficonsax/ficonsax.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:page_transition/page_transition.dart';
import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/providers/library_search_provider.dart';
import 'package:fladder/theme.dart';
import 'package:fladder/util/debouncer.dart';
import 'package:fladder/util/fladder_image.dart';
import 'package:fladder/util/localization_helper.dart';
class SuggestionSearchBar extends ConsumerStatefulWidget {
final String? title;
@ -141,9 +141,8 @@ class _SearchBarState extends ConsumerState<SuggestionSearchBar> {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),
child: AspectRatio(
aspectRatio: 0.8,
child: CachedNetworkImage(
cacheManager: CustomCacheManager.instance,
imageUrl: suggestion.images?.primary?.path ?? "",
child: FladderImage(
image: suggestion.images?.primary,
fit: BoxFit.cover,
),
),

View file

@ -26,7 +26,7 @@ import 'package:fladder/util/fladder_config.dart';
import 'package:fladder/util/list_padding.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/string_extensions.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_appbar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_app_bar.dart';
@RoutePage()
class LoginScreen extends ConsumerStatefulWidget {
@ -82,7 +82,7 @@ class _LoginPageState extends ConsumerState<LoginScreen> {
final loggedInUsers = ref.watch(authProvider.select((value) => value.accounts));
final authLoading = ref.watch(authProvider.select((value) => value.loading));
return Scaffold(
appBar: const FladderAppbar(),
appBar: const FladderAppBar(),
floatingActionButton: !addingNewUser
? Row(
mainAxisAlignment: MainAxisAlignment.end,

View file

@ -128,7 +128,6 @@ class _CardHolder extends StatelessWidget {
const _CardHolder({
required this.content,
super.key,
});
@override

View file

@ -161,6 +161,7 @@ class _IdentifyScreenState extends ConsumerState<IdentifyScreen> with TickerProv
final externalId = state.externalIds
.firstWhereOrNull((element) => element.key == providerKey)
// ignore: deprecated_member_use_from_same_package
?.urlFormatString;
final url = externalId?.replaceAll("{0}", providerValue?.toString() ?? "");

View file

@ -1,31 +1,33 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:extended_image/extended_image.dart';
import 'package:ficonsax/ficonsax.dart';
import 'package:fladder/main.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/items/photos_model.dart';
import 'package:fladder/providers/settings/photo_view_settings_provider.dart';
import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/screens/photo_viewer/photo_viewer_controls.dart';
import 'package:fladder/providers/settings/photo_view_settings_provider.dart';
import 'package:fladder/screens/photo_viewer/simple_video_player.dart';
import 'package:fladder/screens/shared/default_title_bar.dart';
import 'package:fladder/util/adaptive_layout.dart';
import 'package:fladder/util/custom_cache_manager.dart';
import 'package:fladder/util/item_base_model/item_base_model_extensions.dart';
import 'package:fladder/util/list_padding.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/themes_data.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_appbar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_app_bar.dart';
import 'package:fladder/widgets/shared/animated_icon.dart';
import 'package:fladder/widgets/shared/elevated_icon.dart';
import 'package:fladder/widgets/shared/hover_widget.dart';
import 'package:fladder/widgets/shared/item_actions.dart';
import 'package:fladder/widgets/shared/modal_bottom_sheet.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class PhotoViewerScreen extends ConsumerStatefulWidget {
final List<PhotoModel>? items;
@ -151,7 +153,7 @@ class _PhotoViewerScreenState extends ConsumerState<PhotoViewerScreen> with Widg
onExit: (event) => setState(() => _showOverlay(show: false)),
child: Scaffold(
appBar: photos.isEmpty
? const FladderAppbar(
? const FladderAppBar(
automaticallyImplyLeading: true,
)
: null,

View file

@ -15,6 +15,7 @@ import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/util/duration_extensions.dart';
import 'package:fladder/util/fladder_image.dart';
import 'package:fladder/widgets/shared/fladder_slider.dart';
import 'package:fladder/wrappers/players/base_player.dart';
import 'package:fladder/wrappers/players/lib_mdk.dart'
if (dart.library.html) 'package:fladder/stubs/web/lib_mdk_web.dart';
import 'package:fladder/wrappers/players/lib_mpv.dart';
@ -30,7 +31,7 @@ class SimpleVideoPlayer extends ConsumerStatefulWidget {
}
class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with WindowListener, WidgetsBindingObserver {
late final player = switch (ref.read(videoPlayerSettingsProvider.select((value) => value.wantedPlayer))) {
late final BasePlayer player = switch (ref.read(videoPlayerSettingsProvider.select((value) => value.wantedPlayer))) {
PlayerOptions.libMDK => LibMDK(),
PlayerOptions.libMPV => LibMPV(),
};
@ -68,7 +69,10 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
playing = player.lastState.playing;
position = player.lastState.position;
duration = player.lastState.duration;
Future.microtask(() async => {_init()});
WidgetsBinding.instance.addPostFrameCallback((value) async {
await Future.delayed(const Duration(milliseconds: 500));
if (mounted) _init();
});
}
@override
@ -86,6 +90,8 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
final params = Uri(queryParameters: directOptions).query;
player.init(ref.read(videoPlayerSettingsProvider));
videoUrl = '${ref.read(userProvider)?.server ?? ""}/Videos/${widget.video.id}/stream?$params';
subscriptions.add(player.stateStream.listen((event) {
@ -101,8 +107,8 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
}
}));
await player.open(videoUrl, !ref.watch(photoViewSettingsProvider).autoPlay);
await player.loop(ref.watch(photoViewSettingsProvider.select((value) => value.repeat)));
await player.setVolume(ref.watch(photoViewSettingsProvider.select((value) => value.mute)) ? 0 : 100);
await player.loop(ref.watch(photoViewSettingsProvider.select((value) => value.repeat)));
}
@override
@ -124,16 +130,13 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
.textTheme
.titleMedium
?.copyWith(fontWeight: FontWeight.bold, shadows: [const Shadow(blurRadius: 2)]);
ref.listen(photoViewSettingsProvider.select((value) => value.repeat), (previous, next) {
player.loop(next);
});
ref.listen(
photoViewSettingsProvider.select((value) => value.repeat),
(previous, next) => player.loop(next),
);
ref.listen(
photoViewSettingsProvider.select((value) => value.mute),
(previous, next) {
if (previous != next) {
player.setVolume(next ? 0 : 100);
}
},
(previous, next) => player.setVolume(next ? 0 : 100),
);
return GestureDetector(
onTap: widget.onTapped,
@ -154,13 +157,6 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
UniqueKey(),
BoxFit.contain,
),
// child: Video(
// fit: BoxFit.contain,
// fill: const Color.fromARGB(0, 123, 62, 62),
// controller: controller,
// controls: NoVideoControls,
// wakelock: false,
// ),
),
IgnorePointer(
ignoring: !widget.showOverlay,

View file

@ -9,7 +9,7 @@ import 'package:fladder/providers/settings/video_player_settings_provider.dart';
import 'package:fladder/screens/video_player/components/video_subtitle_controls.dart';
import 'package:fladder/util/adaptive_layout.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_appbar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_app_bar.dart';
class SubtitleEditor extends ConsumerStatefulWidget {
const SubtitleEditor({super.key});
@ -73,7 +73,7 @@ class _SubtitleEditorState extends ConsumerState<SubtitleEditor> {
padding: MediaQuery.paddingOf(context),
child: Column(
children: [
if (AdaptiveLayout.of(context).isDesktop) const FladderAppbar(),
if (AdaptiveLayout.of(context).isDesktop) const FladderAppBar(),
Row(
children: [
const BackButton(),

View file

@ -1,9 +1,11 @@
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/account_model.dart';
import 'package:fladder/screens/shared/flat_button.dart';
import 'package:fladder/util/string_extensions.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class UserIcon extends ConsumerWidget {
final AccountModel? user;

View file

@ -1,7 +1,7 @@
import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/screens/shared/media/item_detail_list_widget.dart';
import 'package:fladder/util/widget_extensions.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_appbar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_app_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -46,7 +46,7 @@ class _VideoPlayerQueueState extends ConsumerState<VideoPlayerQueue> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const FladderAppbar(
appBar: const FladderAppBar(
label: "",
automaticallyImplyLeading: true,
),

View file

@ -2,10 +2,9 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/items/media_streams_model.dart';
import 'package:fladder/models/playback/playback_model.dart';
import 'package:fladder/models/settings/video_player_settings.dart';
import 'package:fladder/wrappers/players/base_player.dart';
import 'package:fladder/wrappers/players/player_states.dart';
@ -18,7 +17,7 @@ class LibMDK extends BasePlayer {
Stream<PlayerState> get stateStream => _stateController.stream;
@override
Future<void> init(Ref ref) async {}
Future<void> init(VideoPlayerSettingsModel settings) async {}
@override
Future<void> dispose() async {}

View file

@ -14,7 +14,7 @@ class SMTCWindows {
bool? enabled,
});
get buttonPressStream => null;
late final Stream<PressedButton> buttonPressStream;
Future<void> updateConfig(SMTCConfig config) async {}

View file

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/routes/auto_router.dart';
import 'package:fladder/util/debug_banner.dart';
import 'package:fladder/util/poster_defaults.dart';
enum LayoutState {
@ -202,7 +203,7 @@ class _AdaptiveLayoutBuilderState extends ConsumerState<AdaptiveLayoutBuilder> {
LayoutState.tablet => const PosterDefaults(size: 350, ratio: 0.55),
LayoutState.desktop => const PosterDefaults(size: 400, ratio: 0.55),
},
child: widget.child,
child: DebugBanner(child: widget.child),
),
);
}

View file

@ -0,0 +1,13 @@
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
class CustomCacheManager {
static const key = 'customCacheKey';
static CacheManager instance = CacheManager(
Config(
key,
stalePeriod: const Duration(days: 3),
maxNrOfCacheObjects: 250,
fileService: HttpFileService(),
),
);
}

View file

@ -0,0 +1,52 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/providers/video_player_provider.dart';
class DebugBanner extends ConsumerWidget {
final Widget child;
const DebugBanner({required this.child, super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final isPlaying = ref.watch(mediaPlaybackProvider.select((value) => value.playing));
if (!kDebugMode) return child;
return Directionality(
textDirection: TextDirection.ltr,
child: Stack(
fit: StackFit.expand,
children: [
child,
Align(
alignment: Alignment.bottomRight,
child: AnimatedOpacity(
opacity: isPlaying ? 0 : 1,
duration: const Duration(milliseconds: 500),
child: IgnorePointer(
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Card(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)),
color: Colors.purpleAccent.withOpacity(0.8),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
child: Text(
"Debug",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
),
),
),
)
],
),
);
}
}

View file

@ -1,10 +1,12 @@
import 'package:auto_route/auto_route.dart';
import 'package:fladder/screens/shared/default_title_bar.dart';
import 'package:fladder/util/adaptive_layout.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:auto_route/auto_route.dart';
import 'package:fladder/screens/shared/default_title_bar.dart';
import 'package:fladder/util/adaptive_layout.dart';
bool get _isDesktop {
if (kIsWeb) return false;
return [
@ -14,11 +16,11 @@ bool get _isDesktop {
].contains(defaultTargetPlatform);
}
class FladderAppbar extends StatelessWidget implements PreferredSize {
class FladderAppBar extends StatelessWidget implements PreferredSize {
final double height;
final String? label;
final bool automaticallyImplyLeading;
const FladderAppbar({this.height = 35, this.automaticallyImplyLeading = false, this.label, super.key});
const FladderAppBar({this.height = 35, this.automaticallyImplyLeading = false, this.label, super.key});
@override
Widget build(BuildContext context) {

View file

@ -8,7 +8,7 @@ import 'package:fladder/providers/views_provider.dart';
import 'package:fladder/screens/shared/nested_bottom_appbar.dart';
import 'package:fladder/util/adaptive_layout.dart';
import 'package:fladder/widgets/navigation_scaffold/components/destination_model.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_appbar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_app_bar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/floating_player_bar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/navigation_body.dart';
import 'package:fladder/widgets/navigation_scaffold/components/navigation_drawer.dart';
@ -60,7 +60,7 @@ class _NavigationScaffoldState extends ConsumerState<NavigationScaffold> {
},
child: Scaffold(
key: _key,
appBar: const FladderAppbar(),
appBar: const FladderAppBar(),
extendBodyBehindAppBar: true,
extendBody: true,
floatingActionButtonLocation:

View file

@ -78,7 +78,7 @@ class MediaControlsWrapper extends BaseAudioHandler {
Future<void> setup(BasePlayer newPlayer) async {
_player = newPlayer;
await newPlayer.init(ref);
await newPlayer.init(ref.read(videoPlayerSettingsProvider));
_initPlayer();
}

View file

@ -2,10 +2,9 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/items/media_streams_model.dart';
import 'package:fladder/models/playback/playback_model.dart';
import 'package:fladder/models/settings/video_player_settings.dart';
import 'package:fladder/wrappers/players/player_states.dart';
const libassFallbackFont = "assets/mp-font.ttf";
@ -14,7 +13,7 @@ abstract class BasePlayer {
Stream<PlayerState> get stateStream;
PlayerState lastState = PlayerState();
Future<void> init(Ref ref);
Future<void> init(VideoPlayerSettingsModel settings);
Widget? videoWidget(
Key key,
BoxFit fit,

View file

@ -3,13 +3,13 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fvp/fvp.dart' as fvp;
import 'package:fvp/mdk.dart';
import 'package:video_player/video_player.dart';
import 'package:fladder/models/items/media_streams_model.dart';
import 'package:fladder/models/playback/playback_model.dart';
import 'package:fladder/models/settings/video_player_settings.dart';
import 'package:fladder/wrappers/players/base_player.dart';
import 'package:fladder/wrappers/players/player_states.dart';
@ -25,7 +25,7 @@ class LibMDK extends BasePlayer {
Stream<PlayerState> get stateStream => _stateController.stream;
@override
Future<void> init(Ref ref) async {
Future<void> init(VideoPlayerSettingsModel settings) async {
dispose();
fvp.registerWith(options: {
'global': {'log': 'off'},
@ -41,19 +41,26 @@ class LibMDK extends BasePlayer {
@override
Future<void> open(String url, bool play) async {
if (_controller != null) {
_controller?.dispose();
}
final validUrl = isValidUrl(url);
if (validUrl != null) {
_controller = VideoPlayerController.networkUrl(validUrl);
} else {
_controller = VideoPlayerController.file(File(url));
}
await _controller?.initialize();
await _controller?.initialize();
_controller?.addListener(() => updateState());
if (play) {
await _controller?.play();
}
_controller?.setBufferRange(
min: const Duration(seconds: 15).inMilliseconds,
max: const Duration(seconds: 30).inMilliseconds,
);
return setState(lastState.update(
buffering: true,
));
@ -73,10 +80,21 @@ class LibMDK extends BasePlayer {
volume: (_controller?.value.volume ?? 1.0) * 100,
rate: _controller?.value.playbackSpeed ?? 1.0,
buffering: _controller?.value.isBuffering ?? true,
buffer: _controller?.value.buffered.last.end ?? Duration.zero,
buffer: calculateBufferedDuration(_controller?.value),
));
}
Duration calculateBufferedDuration(VideoPlayerValue? value) {
if (value == null) return Duration.zero;
if (value.buffered.isEmpty) {
return Duration.zero;
}
return value.buffered.fold(value.position, (total, range) {
return (total + (range.end - range.start));
});
}
@override
Future<void> pause() async => _controller?.pause();
@override

View file

@ -11,8 +11,8 @@ import 'package:media_kit_video/media_kit_video.dart';
import 'package:fladder/models/items/media_streams_model.dart';
import 'package:fladder/models/playback/playback_model.dart';
import 'package:fladder/models/settings/subtitle_settings_model.dart';
import 'package:fladder/models/settings/video_player_settings.dart';
import 'package:fladder/providers/settings/subtitle_settings_provider.dart';
import 'package:fladder/providers/settings/video_player_settings_provider.dart';
import 'package:fladder/wrappers/players/base_player.dart';
import 'package:fladder/wrappers/players/player_states.dart';
@ -27,7 +27,7 @@ class LibMPV extends BasePlayer {
StreamSubscription<bool>? _onCompleted;
@override
Future<void> init(Ref ref) async {
Future<void> init(VideoPlayerSettingsModel settings) async {
dispose();
mpv.MediaKit.ensureInitialized();
@ -36,10 +36,7 @@ class LibMPV extends BasePlayer {
configuration: mpv.PlayerConfiguration(
title: "nl.jknaapen.fladder",
libassAndroidFont: libassFallbackFont,
libass: !kIsWeb &&
ref.read(
videoPlayerSettingsProvider.select((value) => value.useLibass),
),
libass: !kIsWeb && settings.useLibass,
),
);
@ -47,9 +44,7 @@ class LibMPV extends BasePlayer {
_controller = VideoController(
_player!,
configuration: VideoControllerConfiguration(
enableHardwareAcceleration: ref.read(
videoPlayerSettingsProvider.select((value) => value.hardwareAccel),
),
enableHardwareAcceleration: settings.hardwareAccel,
),
);