mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-01 00:28:18 +08:00
@@ -300,8 +300,9 @@ class AudioController extends GetxController
|
|||||||
player = null;
|
player = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
final stream = player!.stream;
|
||||||
_subscriptions = [
|
_subscriptions = [
|
||||||
player!.stream.position.listen((position) {
|
stream.position.listen((position) {
|
||||||
if (isDragging) return;
|
if (isDragging) return;
|
||||||
if (position.inSeconds != this.position.value.inSeconds) {
|
if (position.inSeconds != this.position.value.inSeconds) {
|
||||||
this.position.value = position;
|
this.position.value = position;
|
||||||
@@ -309,8 +310,8 @@ class AudioController extends GetxController
|
|||||||
videoPlayerServiceHandler?.onPositionChange(position);
|
videoPlayerServiceHandler?.onPositionChange(position);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
player!.stream.duration.listen(duration.call),
|
stream.duration.listen(duration.call),
|
||||||
player!.stream.playing.listen((playing) {
|
stream.playing.listen((playing) {
|
||||||
final PlayerStatus playerStatus;
|
final PlayerStatus playerStatus;
|
||||||
if (playing) {
|
if (playing) {
|
||||||
animController.forward();
|
animController.forward();
|
||||||
@@ -321,7 +322,7 @@ class AudioController extends GetxController
|
|||||||
}
|
}
|
||||||
videoPlayerServiceHandler?.onStatusChange(playerStatus, false, false);
|
videoPlayerServiceHandler?.onStatusChange(playerStatus, false, false);
|
||||||
}),
|
}),
|
||||||
player!.stream.completed.listen((completed) {
|
stream.completed.listen((completed) {
|
||||||
_videoDetailController?.playedTime = duration.value;
|
_videoDetailController?.playedTime = duration.value;
|
||||||
videoPlayerServiceHandler?.onStatusChange(
|
videoPlayerServiceHandler?.onStatusChange(
|
||||||
PlayerStatus.completed,
|
PlayerStatus.completed,
|
||||||
@@ -774,6 +775,7 @@ class AudioController extends GetxController
|
|||||||
..onSeek = null
|
..onSeek = null
|
||||||
..onVideoDetailDispose(hashCode.toString());
|
..onVideoDetailDispose(hashCode.toString());
|
||||||
_subscriptions?.forEach((e) => e.cancel());
|
_subscriptions?.forEach((e) => e.cancel());
|
||||||
|
_subscriptions?.clear();
|
||||||
_subscriptions = null;
|
_subscriptions = null;
|
||||||
player?.dispose();
|
player?.dispose();
|
||||||
player = null;
|
player = null;
|
||||||
|
|||||||
@@ -635,7 +635,6 @@ class VideoDetailController extends GetxController
|
|||||||
_autoPlay.value = true;
|
_autoPlay.value = true;
|
||||||
playedTime = plPlayerController.position;
|
playedTime = plPlayerController.position;
|
||||||
plPlayerController
|
plPlayerController
|
||||||
..removeListeners()
|
|
||||||
..isBuffering.value = false
|
..isBuffering.value = false
|
||||||
..buffered.value = Duration.zero;
|
..buffered.value = Duration.zero;
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ import 'package:path/path.dart' as path;
|
|||||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
|
typedef PlayCallback = Future<void>? Function();
|
||||||
|
|
||||||
class PlPlayerController with BlockConfigMixin {
|
class PlPlayerController with BlockConfigMixin {
|
||||||
Player? _videoPlayerController;
|
Player? _videoPlayerController;
|
||||||
VideoController? _videoController;
|
VideoController? _videoController;
|
||||||
@@ -484,11 +486,11 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
return _instance != null;
|
return _instance != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setPlayCallBack(Future<void>? Function()? playCallBack) {
|
static void setPlayCallBack(PlayCallback? playCallBack) {
|
||||||
_playCallBack = playCallBack;
|
_playCallBack = playCallBack;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<void>? Function()? _playCallBack;
|
static PlayCallback? _playCallBack;
|
||||||
|
|
||||||
static Future<void>? playIfExists() {
|
static Future<void>? playIfExists() {
|
||||||
// await _instance?.play(repeat: repeat, hideControls: hideControls);
|
// await _instance?.play(repeat: repeat, hideControls: hideControls);
|
||||||
@@ -625,6 +627,7 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
await _createVideoController(dataSource, seekTo, volume);
|
await _createVideoController(dataSource, seekTo, volume);
|
||||||
|
|
||||||
if (_playerCount == 0) {
|
if (_playerCount == 0) {
|
||||||
|
_removeListeners();
|
||||||
_videoPlayerController?.dispose();
|
_videoPlayerController?.dispose();
|
||||||
_videoPlayerController = null;
|
_videoPlayerController = null;
|
||||||
_videoController = null;
|
_videoController = null;
|
||||||
@@ -640,8 +643,6 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
// 数据加载完成
|
// 数据加载完成
|
||||||
dataStatus.value = DataStatus.loaded;
|
dataStatus.value = DataStatus.loaded;
|
||||||
|
|
||||||
// listen the video player events
|
|
||||||
startListeners();
|
|
||||||
await _initializePlayer();
|
await _initializePlayer();
|
||||||
onInit?.call();
|
onInit?.call();
|
||||||
} catch (err, stackTrace) {
|
} catch (err, stackTrace) {
|
||||||
@@ -751,6 +752,9 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
referer: HttpString.baseUrl,
|
referer: HttpString.baseUrl,
|
||||||
);
|
);
|
||||||
// await player.setAudioTrack(.auto());
|
// await player.setAudioTrack(.auto());
|
||||||
|
|
||||||
|
_startListeners(player);
|
||||||
|
|
||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,8 +764,6 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
Duration? seekTo,
|
Duration? seekTo,
|
||||||
Volume? volume,
|
Volume? volume,
|
||||||
) async {
|
) async {
|
||||||
// 每次配置时先移除监听
|
|
||||||
removeListeners();
|
|
||||||
isBuffering.value = false;
|
isBuffering.value = false;
|
||||||
buffered.value = Duration.zero;
|
buffered.value = Duration.zero;
|
||||||
_heartDuration = 0;
|
_heartDuration = 0;
|
||||||
@@ -774,6 +776,7 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
if (player == null) {
|
if (player == null) {
|
||||||
player = await _initPlayer();
|
player = await _initPlayer();
|
||||||
if (_playerCount == 0) {
|
if (_playerCount == 0) {
|
||||||
|
_removeListeners();
|
||||||
player.dispose();
|
player.dispose();
|
||||||
player = null;
|
player = null;
|
||||||
_videoController = null;
|
_videoController = null;
|
||||||
@@ -916,15 +919,16 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<StreamSubscription> subscriptions = [];
|
List<StreamSubscription>? _subscriptions;
|
||||||
final Set<Function(Duration position)> _positionListeners = {};
|
final Set<ValueChanged<Duration>> _positionListeners = {};
|
||||||
final Set<Function(PlayerStatus status)> _statusListeners = {};
|
final Set<ValueChanged<PlayerStatus>> _statusListeners = {};
|
||||||
|
|
||||||
/// 播放事件监听
|
/// 播放事件监听
|
||||||
void startListeners() {
|
void _startListeners(NativePlayer player) {
|
||||||
final controllerStream = videoPlayerController!.stream;
|
assert(_subscriptions == null);
|
||||||
subscriptions = [
|
final stream = player.stream;
|
||||||
controllerStream.playing.listen((event) {
|
_subscriptions = [
|
||||||
|
stream.playing.listen((event) {
|
||||||
WakelockPlus.toggle(enable: event);
|
WakelockPlus.toggle(enable: event);
|
||||||
if (event) {
|
if (event) {
|
||||||
if (_shouldSetPip) {
|
if (_shouldSetPip) {
|
||||||
@@ -953,7 +957,7 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
makeHeartBeat(positionSeconds.value, type: HeartBeatType.status);
|
makeHeartBeat(positionSeconds.value, type: HeartBeatType.status);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
controllerStream.completed.listen((event) {
|
stream.completed.listen((event) {
|
||||||
if (event) {
|
if (event) {
|
||||||
playerStatus.value = PlayerStatus.completed;
|
playerStatus.value = PlayerStatus.completed;
|
||||||
|
|
||||||
@@ -966,7 +970,7 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
}
|
}
|
||||||
makeHeartBeat(positionSeconds.value, type: HeartBeatType.completed);
|
makeHeartBeat(positionSeconds.value, type: HeartBeatType.completed);
|
||||||
}),
|
}),
|
||||||
controllerStream.position.listen((event) {
|
stream.position.listen((event) {
|
||||||
position = event;
|
position = event;
|
||||||
updatePositionSecond();
|
updatePositionSecond();
|
||||||
if (!isSliderMoving.value) {
|
if (!isSliderMoving.value) {
|
||||||
@@ -980,14 +984,14 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
}
|
}
|
||||||
makeHeartBeat(event.inSeconds);
|
makeHeartBeat(event.inSeconds);
|
||||||
}),
|
}),
|
||||||
controllerStream.duration.listen((Duration event) {
|
stream.duration.listen((Duration event) {
|
||||||
duration.value = event;
|
duration.value = event;
|
||||||
}),
|
}),
|
||||||
controllerStream.buffer.listen((Duration event) {
|
stream.buffer.listen((Duration event) {
|
||||||
buffered.value = event;
|
buffered.value = event;
|
||||||
updateBufferedSecond();
|
updateBufferedSecond();
|
||||||
}),
|
}),
|
||||||
controllerStream.buffering.listen((bool event) {
|
stream.buffering.listen((bool event) {
|
||||||
isBuffering.value = event;
|
isBuffering.value = event;
|
||||||
videoPlayerServiceHandler?.onStatusChange(
|
videoPlayerServiceHandler?.onStatusChange(
|
||||||
playerStatus.value,
|
playerStatus.value,
|
||||||
@@ -996,14 +1000,14 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
if (kDebugMode)
|
if (kDebugMode)
|
||||||
controllerStream.log.listen(((PlayerLog log) {
|
stream.log.listen(((PlayerLog log) {
|
||||||
if (log.level == 'error' || log.level == 'fatal') {
|
if (log.level == 'error' || log.level == 'fatal') {
|
||||||
Utils.reportError('${log.level}: ${log.prefix}: ${log.text}', null);
|
Utils.reportError('${log.level}: ${log.prefix}: ${log.text}', null);
|
||||||
} else {
|
} else {
|
||||||
debugPrint(log.toString());
|
debugPrint(log.toString());
|
||||||
}
|
}
|
||||||
})),
|
})),
|
||||||
controllerStream.error.listen((String event) {
|
stream.error.listen((String event) {
|
||||||
if (dataSource is FileSource &&
|
if (dataSource is FileSource &&
|
||||||
event.startsWith("Failed to open file")) {
|
event.startsWith("Failed to open file")) {
|
||||||
return;
|
return;
|
||||||
@@ -1078,8 +1082,10 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 移除事件监听
|
/// 移除事件监听
|
||||||
Future<void> removeListeners() {
|
void _removeListeners() {
|
||||||
return Future.wait(subscriptions.map((e) => e.cancel()));
|
_subscriptions?.forEach((e) => e.cancel());
|
||||||
|
_subscriptions?.clear();
|
||||||
|
_subscriptions = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _cancelSubForSeek() {
|
void _cancelSubForSeek() {
|
||||||
@@ -1488,20 +1494,20 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void addPositionListener(Function(Duration position) listener) {
|
void addPositionListener(ValueChanged<Duration> listener) {
|
||||||
if (_playerCount == 0) return;
|
if (_playerCount == 0) return;
|
||||||
_positionListeners.add(listener);
|
_positionListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
void removePositionListener(Function(Duration position) listener) =>
|
void removePositionListener(ValueChanged<Duration> listener) =>
|
||||||
_positionListeners.remove(listener);
|
_positionListeners.remove(listener);
|
||||||
|
|
||||||
void addStatusLister(Function(PlayerStatus status) listener) {
|
void addStatusLister(ValueChanged<PlayerStatus> listener) {
|
||||||
if (_playerCount == 0) return;
|
if (_playerCount == 0) return;
|
||||||
_statusListeners.add(listener);
|
_statusListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeStatusLister(Function(PlayerStatus status) listener) =>
|
void removeStatusLister(ValueChanged<PlayerStatus> listener) =>
|
||||||
_statusListeners.remove(listener);
|
_statusListeners.remove(listener);
|
||||||
|
|
||||||
// 记录播放记录
|
// 记录播放记录
|
||||||
@@ -1625,8 +1631,7 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
windowManager.setAlwaysOnTop(false);
|
windowManager.setAlwaysOnTop(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeListeners();
|
_removeListeners();
|
||||||
subscriptions.clear();
|
|
||||||
_positionListeners.clear();
|
_positionListeners.clear();
|
||||||
_statusListeners.clear();
|
_statusListeners.clear();
|
||||||
if (playerStatus.isPlaying) {
|
if (playerStatus.isPlaying) {
|
||||||
|
|||||||
Reference in New Issue
Block a user