diff --git a/lib/screens/channel/video/video.dart b/lib/screens/channel/video/video.dart index e2e1c759..495283c8 100644 --- a/lib/screens/channel/video/video.dart +++ b/lib/screens/channel/video/video.dart @@ -1,10 +1,10 @@ import 'dart:io'; +import 'package:better_player/better_player.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:frosty/screens/channel/video/video_store.dart'; import 'package:simple_pip_mode/simple_pip.dart'; -import 'package:video_player/video_player.dart'; import 'package:webview_flutter/webview_flutter.dart'; class Video extends StatefulWidget { @@ -140,7 +140,7 @@ class _NativeVideoState extends State { return Center( child: AspectRatio( aspectRatio: 16 / 9, - child: VideoPlayer(videoPlayerController), + child: BetterPlayer(controller: videoPlayerController), ), ); }, diff --git a/lib/screens/channel/video/video_store.dart b/lib/screens/channel/video/video_store.dart index adfeafb0..158870f7 100644 --- a/lib/screens/channel/video/video_store.dart +++ b/lib/screens/channel/video/video_store.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:io'; +import 'package:better_player/better_player.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -10,7 +11,6 @@ import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:mobx/mobx.dart'; import 'package:simple_pip_mode/simple_pip.dart'; -import 'package:video_player/video_player.dart'; import 'package:webview_flutter/webview_flutter.dart'; part 'video_store.g.dart'; @@ -34,7 +34,7 @@ abstract class VideoStoreBase with Store { WebViewController? controller; @readonly - VideoPlayerController? _videoPlayerController; + BetterPlayerController? _videoPlayerController; /// The timer that handles hiding the overlay automatically late Timer _overlayTimer; @@ -126,14 +126,34 @@ abstract class VideoStoreBase with Store { updateStreamInfo(); } + BetterPlayerController _createPlayerController({required String source}) { + return BetterPlayerController( + const BetterPlayerConfiguration( + autoPlay: true, + controlsConfiguration: BetterPlayerControlsConfiguration( + showControls: false, + ), + ), + betterPlayerDataSource: BetterPlayerDataSource( + BetterPlayerDataSourceType.network, + source, + liveStream: true, + // bufferingConfiguration: const BetterPlayerBufferingConfiguration( + // bufferForPlaybackAfterRebufferMs: 500, + // bufferForPlaybackMs: 500, + // ), + ), + ); + } + /// Initializes the video webview. @action Future initVideo() async { if (settingsStore.useNativePlayer) { _streamLinks = await twitchApi.getStreamLinks(userLogin: userLogin, token: authStore.streamLinkToken); - _videoPlayerController = VideoPlayerController.network(_streamLinks?[_selectedQuality] ?? ''); - await _videoPlayerController?.initialize(); - await _videoPlayerController?.play(); + + _videoPlayerController = _createPlayerController(source: _streamLinks?[_selectedQuality] ?? ''); + _paused = false; } else { // Add event listeners to notify the JavaScript channels when the video plays and pauses. @@ -163,10 +183,8 @@ abstract class VideoStoreBase with Store { @action Future handleQualityChange(String quality) async { - await _videoPlayerController?.dispose(); - _videoPlayerController = VideoPlayerController.network(_streamLinks?[quality] ?? ''); - await _videoPlayerController?.initialize(); - await _videoPlayerController?.play(); + _videoPlayerController?.dispose(); + _videoPlayerController = _createPlayerController(source: _streamLinks?[quality] ?? ''); _selectedQuality = quality; } diff --git a/lib/screens/channel/video/video_store.g.dart b/lib/screens/channel/video/video_store.g.dart index 2cf20d7e..c223aff6 100644 --- a/lib/screens/channel/video/video_store.g.dart +++ b/lib/screens/channel/video/video_store.g.dart @@ -20,16 +20,16 @@ mixin _$VideoStore on VideoStoreBase, Store { late final _$_videoPlayerControllerAtom = Atom(name: 'VideoStoreBase._videoPlayerController', context: context); - VideoPlayerController? get videoPlayerController { + BetterPlayerController? get videoPlayerController { _$_videoPlayerControllerAtom.reportRead(); return super._videoPlayerController; } @override - VideoPlayerController? get _videoPlayerController => videoPlayerController; + BetterPlayerController? get _videoPlayerController => videoPlayerController; @override - set _videoPlayerController(VideoPlayerController? value) { + set _videoPlayerController(BetterPlayerController? value) { _$_videoPlayerControllerAtom .reportWrite(value, super._videoPlayerController, () { super._videoPlayerController = value; diff --git a/pubspec.lock b/pubspec.lock index 7824a3bb..121c6705 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -41,6 +41,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.10.0" + better_player: + dependency: "direct main" + description: + name: better_player + sha256: f2e5d57ea49fb7c4d93838d23846ca5ddf78af6f946e103aeacf2afdd01909b3 + url: "https://pub.dev" + source: hosted + version: "0.0.83" boolean_selector: dependency: transitive description: @@ -413,6 +421,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_widget_from_html_core: + dependency: transitive + description: + name: flutter_widget_from_html_core + sha256: e8f4f8b461a140ffb7c71f938bc76efc758893e7468843d9dbf70cb0b9e900cb + url: "https://pub.dev" + source: hosted + version: "0.8.5+3" freezed_annotation: dependency: transitive description: @@ -429,6 +445,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.0" + fwfh_text_style: + dependency: transitive + description: + name: fwfh_text_style + sha256: "37806ee0222f79b6e8d4c698c322c897eae6a817258156f40aeece4e588fac60" + url: "https://pub.dev" + source: hosted + version: "2.22.08+1" glob: dependency: transitive description: @@ -1107,46 +1131,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - video_player: - dependency: "direct main" - description: - name: video_player - sha256: de95f0e9405f29b5582573d4166132e71f83b3158aac14e8ee5767a54f4f1fbd - url: "https://pub.dev" - source: hosted - version: "2.6.1" - video_player_android: + visibility_detector: dependency: transitive description: - name: video_player_android - sha256: a592048a711d5739d9cea2255d425779f138d41095b9149bda60ce4bc1af8871 + name: visibility_detector + sha256: "15c54a459ec2c17b4705450483f3d5a2858e733aee893dcee9d75fd04814940d" url: "https://pub.dev" source: hosted - version: "2.4.4" - video_player_avfoundation: - dependency: transitive - description: - name: video_player_avfoundation - sha256: "75c6d68cd479a25f34d635149ba6887bc8f1b2b2921841121fd44ea0c5bc1927" - url: "https://pub.dev" - source: hosted - version: "2.4.4" - video_player_platform_interface: - dependency: transitive - description: - name: video_player_platform_interface - sha256: a8c4dcae2a7a6e7cc1d7f9808294d968eca1993af34a98e95b9bdfa959bec684 - url: "https://pub.dev" - source: hosted - version: "6.1.0" - video_player_web: - dependency: transitive - description: - name: video_player_web - sha256: "44ce41424d104dfb7cf6982cc6b84af2b007a24d126406025bf40de5d481c74c" - url: "https://pub.dev" - source: hosted - version: "2.0.16" + version: "0.3.3" wakelock: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 14186797..b71a5fb5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,7 +59,7 @@ dependencies: simple_pip_mode: git: url: https://github.com/tommyxchow/simple_pip_mode_flutter - video_player: ^2.6.1 + better_player: ^0.0.83 dev_dependencies: flutter_test: