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

@@ -12,9 +12,9 @@ import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart'
ListOrder,
DashItem,
ResponseUrl;
import 'package:PiliPlus/http/browser_ua.dart';
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/ua_type.dart';
import 'package:PiliPlus/pages/common/common_intro_controller.dart'
show FavMixin;
import 'package:PiliPlus/pages/dynamics_repost/view.dart';
@@ -59,8 +59,9 @@ class AudioController extends GetxController
@override
late final bool isUgc = itemType == 1;
final Rx<DetailItem?> audioItem = Rx<DetailItem?>(null);
final audioItem = Rxn<DetailItem>();
bool _hasInit = false;
@override
Player? player;
late int cacheAudioQa;
@@ -71,7 +72,7 @@ class AudioController extends GetxController
late final AnimationController animController;
Set<StreamSubscription>? _subscriptions;
List<StreamSubscription>? _subscriptions;
int? index;
List<DetailItem>? playlist;
@@ -118,11 +119,7 @@ class AudioController extends GetxController
final hasAudioUrl = audioUrl != null;
if (hasAudioUrl) {
_querySponsorBlock();
_onOpenMedia(
audioUrl,
ua: UaType.pc.ua,
referer: HttpString.baseUrl,
);
_onOpenMedia(audioUrl, ua: BrowserUa.pc, referer: HttpString.baseUrl);
}
Utils.isWiFi.then((isWiFi) {
cacheAudioQa = isWiFi ? Pref.defaultAudioQa : Pref.defaultAudioQaCellular;
@@ -155,7 +152,7 @@ class AudioController extends GetxController
return player?.play();
}
Future<void>? onPause() async {
Future<void>? onPause() {
return player?.pause();
}
@@ -277,28 +274,33 @@ class AudioController extends GetxController
}
}
void _onOpenMedia(
Future<void> _onOpenMedia(
String url, {
String? referer,
String ua = Constants.userAgentApp,
}) {
_initPlayerIfNeeded();
player!.open(
Media(
url,
start: _start,
httpHeaders: {
'user-agent': ua,
'referer': ?referer,
},
),
);
String? referer,
}) async {
await _initPlayerIfNeeded();
player
?..setMediaHeader(
userAgent: ua,
// mpv cannot clear referer option
headers: {'Referer': ?referer},
)
..open(Media(url, start: _start));
_start = null;
}
void _initPlayerIfNeeded() {
player ??= Player();
_subscriptions ??= {
Future<void> _initPlayerIfNeeded() async {
if (_hasInit) return;
_hasInit = true;
assert(player == null, _subscriptions = null);
player = await Player.create();
if (isClosed) {
player!.dispose();
player = null;
return;
}
_subscriptions = [
player!.stream.position.listen((position) {
if (isDragging) return;
if (position.inSeconds != this.position.value.inSeconds) {
@@ -307,11 +309,9 @@ class AudioController extends GetxController
videoPlayerServiceHandler?.onPositionChange(position);
}
}),
player!.stream.duration.listen((duration) {
this.duration.value = duration;
}),
player!.stream.duration.listen(duration.call),
player!.stream.playing.listen((playing) {
PlayerStatus playerStatus;
final PlayerStatus playerStatus;
if (playing) {
animController.forward();
playerStatus = PlayerStatus.playing;
@@ -339,14 +339,14 @@ class AudioController extends GetxController
playNext(nextPart: true);
break;
case PlayRepeat.singleCycle:
_replay();
onPlay();
break;
case PlayRepeat.listCycle:
if (!playNext(nextPart: true)) {
if (index != null && index != 0 && playlist != null) {
playIndex(0);
} else {
_replay();
onPlay();
}
}
break;
@@ -356,11 +356,7 @@ class AudioController extends GetxController
}
}
}),
};
}
void _replay() {
player?.seek(Duration.zero).whenComplete(player!.play);
];
}
@override