refa player (#1848)

* tweak

* Reapply "opt: audio uri" (#1833)

This reverts commit 8e726f49b2.

* opt: player

* opt: player

* refa: create player

* refa: player

* opt: UaType

* fix: sb seek preview

* opt: setSub

* fix: screenshot

* opt: unnecessary final player state

* opt: player track

* opt FileSource constructor [skip ci]

* fixes

* fix: dispose player

* fix: quote

* update

* fix: multi ua & remove unused loop

* remove unneeded check [skip ci]

---------

Co-authored-by: dom <githubaccount56556@proton.me>
This commit is contained in:
My-Responsitories
2026-02-27 15:51:55 +08:00
committed by GitHub
parent 6782bee11a
commit 7276cde48a
39 changed files with 1063 additions and 1112 deletions

View File

@@ -72,11 +72,9 @@ class _GalleryViewerState extends State<GalleryViewer>
late final RxInt _currIndex;
GlobalKey? _key;
late bool _hasInit = false;
Player? _player;
Player get _effectivePlayer => _player ??= Player();
VideoController? _videoController;
VideoController get _effectiveVideoController =>
_videoController ??= VideoController(_effectivePlayer);
late final PageController _pageController;
@@ -99,6 +97,23 @@ class _GalleryViewerState extends State<GalleryViewer>
: url.http2https;
}
Future<void> _initPlayer() async {
assert(_player == null);
final player = await Player.create();
_videoController = await VideoController.create(player);
if (!mounted) {
player.dispose();
_videoController = null;
return;
}
_player = player;
final currItem = widget.sources[_currIndex.value];
if (currItem.sourceType == .livePhoto) {
player.open(Media(currItem.liveUrl!));
_currIndex.refresh();
}
}
@override
void initState() {
super.initState();
@@ -230,7 +245,6 @@ class _GalleryViewerState extends State<GalleryViewer>
..onDoubleTap = null
..dispose();
_longPressGestureRecognizer.dispose();
_currIndex.close();
if (widget.quality != _quality) {
for (final item in widget.sources) {
if (item.sourceType == SourceType.networkImage) {
@@ -238,6 +252,7 @@ class _GalleryViewerState extends State<GalleryViewer>
}
}
}
Future.delayed(const Duration(milliseconds: 200), _currIndex.close);
super.dispose();
}
@@ -317,7 +332,12 @@ class _GalleryViewerState extends State<GalleryViewer>
void _playIfNeeded(SourceModel item) {
if (item.sourceType == .livePhoto) {
_effectivePlayer.open(Media(item.liveUrl!));
if (_player != null) {
_player!.open(Media(item.liveUrl!));
} else if (!_hasInit) {
_hasInit = true;
_initPlayer();
}
}
}
@@ -421,7 +441,7 @@ class _GalleryViewerState extends State<GalleryViewer>
case SourceType.livePhoto:
child = Obx(
key: _key,
() => _currIndex.value == index
() => _currIndex.value == index && _videoController != null
? Viewer(
minScale: widget.minScale,
maxScale: widget.maxScale,
@@ -434,9 +454,9 @@ class _GalleryViewerState extends State<GalleryViewer>
horizontalDragGestureRecognizer:
_horizontalDragGestureRecognizer,
onChangePage: _onChangePage,
child: AbsorbPointer(
child: Video(
controller: _effectiveVideoController,
child: FittedBox(
child: SimpleVideo(
controller: _videoController!,
fill: Colors.transparent,
),
),