Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package com.example.piliplus

import android.app.PictureInPictureParams
import android.app.SearchManager
import android.app.UiModeManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
Expand All @@ -28,6 +30,12 @@ class MainActivity : AudioServiceActivity() {
methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "PiliPlus")
methodChannel.setMethodCallHandler { call, result ->
when (call.method) {
"checkTvMode" -> {
val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
val isTv = uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION ||
packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
result.success(isTv)
}
"back" -> back();
"biliSendCommAntifraud" -> {
try {
Expand Down
18 changes: 8 additions & 10 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -230,20 +230,18 @@ class MyApp extends StatelessWidget {
final plCtr = PlPlayerController.instance;
if (plCtr != null) {
if (plCtr.isFullScreen.value) {
plCtr
..triggerFullScreen(status: false)
..controlsLock.value = false
..showControls.value = false;
if (plCtr.controlsLock.value) {
plCtr.onLockControl(false);
}
plCtr.triggerFullScreen(status: false);
return;
}

if (plCtr.isDesktopPip) {
plCtr
..exitDesktopPip().whenComplete(
() => plCtr.initialFocalPoint = Offset.zero,
)
..controlsLock.value = false
..showControls.value = false;
if (plCtr.controlsLock.value) {
plCtr.onLockControl(false);
}
plCtr.exitDesktopPip();
return;
}
}
Expand Down
8 changes: 5 additions & 3 deletions lib/pages/live_room/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,11 @@ class LiveRoomController extends GetxController {

int roomId = Get.arguments;
DanmakuController<DanmakuExtra>? danmakuController;
PlPlayerController plPlayerController = PlPlayerController.getInstance(
isLive: true,
);
PlPlayerController get plPlayerController =>
PlPlayerController.getInstance<PlPlayerController>(
tag: roomId.toString(),
create: () => PlPlayerController()..isLive = true,
);

RxBool isLoaded = false.obs;
Rx<RoomInfoH5Data?> roomInfoH5 = Rx<RoomInfoH5Data?>(null);
Expand Down
15 changes: 10 additions & 5 deletions lib/pages/main/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -164,17 +164,22 @@ class _MainAppState extends State<MainApp>

void _onHideWindow() {
if (_mainController.pauseOnMinimize) {
_mainController.isPlaying =
PlPlayerController.instance?.playerStatus.value ==
PlayerStatus.playing;
PlPlayerController.pauseIfExists();
final instance = PlPlayerController.instance;
if (instance != null) {
_mainController.isPlaying =
instance.playerStatus.value == PlayerStatus.playing;
PlPlayerController.pauseIfExists(tag: instance.bvid);
}
}
}

void _onShowWindow() {
if (_mainController.pauseOnMinimize) {
if (_mainController.isPlaying) {
PlPlayerController.playIfExists();
final instance = PlPlayerController.instance;
if (instance != null) {
PlPlayerController.playIfExists(tag: instance.bvid);
}
}
}
}
Expand Down
13 changes: 11 additions & 2 deletions lib/pages/video/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import 'package:PiliPlus/models_new/video/video_stein_edgeinfo/data.dart';
import 'package:PiliPlus/pages/audio/view.dart';
import 'package:PiliPlus/pages/search/widgets/search_text.dart';
import 'package:PiliPlus/pages/video/download_panel/view.dart';
import 'package:PiliPlus/pages/common/common_intro_controller.dart';
import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';
import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';
import 'package:PiliPlus/pages/video/medialist/view.dart';
Expand Down Expand Up @@ -121,8 +122,11 @@ class VideoDetailController extends GetxController
final videoPlayerKey = GlobalKey();
final childKey = GlobalKey<ScaffoldState>();

final plPlayerController = PlPlayerController.getInstance()
..brightness.value = -1;
PlPlayerController get plPlayerController =>
PlPlayerController.getInstance<PlPlayerController>(
tag: heroTag,
create: () => PlPlayerController(),
);
bool get setSystemBrightness => plPlayerController.setSystemBrightness;

late VideoItem firstVideo;
Expand Down Expand Up @@ -1034,6 +1038,7 @@ class VideoDetailController extends GetxController
return SendDanmakuPanel(
cid: cid.value,
bvid: bvid,
heroTag: heroTag,
progress: plPlayerController.position.value.inMilliseconds,
initialValue: savedDanmaku,
onSave: (danmaku) => savedDanmaku = danmaku,
Expand Down Expand Up @@ -1814,6 +1819,10 @@ class VideoDetailController extends GetxController
return false;
}

CommonIntroController get introController => isUgc
? Get.find<UgcIntroController>(tag: heroTag)
: Get.find<PgcIntroController>(tag: heroTag);

void toAudioPage() {
int? id;
int? extraId;
Expand Down
5 changes: 4 additions & 1 deletion lib/pages/video/send_danmaku/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class SendDanmakuPanel extends CommonTextPubPage {
// video
final dynamic cid;
final dynamic bvid;
final String heroTag;
final dynamic progress;

final ValueChanged<DanmakuContentItem<DanmakuExtra>> callback;
Expand All @@ -36,6 +37,7 @@ class SendDanmakuPanel extends CommonTextPubPage {
super.onSave,
this.cid,
this.bvid,
required this.heroTag,
this.progress,
required this.callback,
required this.darkVideoPage,
Expand Down Expand Up @@ -481,7 +483,8 @@ class _SendDanmakuPanelState extends CommonTextPubPageState<SendDanmakuPanel> {
if (response.dmid case final dmid?) {
extra = VideoDanmaku(
id: dmid,
mid: PlPlayerController.instance!.midHash,
mid:
PlPlayerController.getInstanceByTag(widget.heroTag)!.midHash,
);
}
widget.callback(
Expand Down
108 changes: 69 additions & 39 deletions lib/pages/video/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ import 'package:PiliPlus/plugin/pl_player/controller.dart';
import 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart';
import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';
import 'package:PiliPlus/plugin/pl_player/models/play_status.dart';
import 'package:PiliPlus/plugin/pl_player/tv_controller.dart';
import 'package:PiliPlus/plugin/pl_player/tv_view.dart';
import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';
import 'package:PiliPlus/plugin/pl_player/view.dart';
import 'package:PiliPlus/services/service_locator.dart';
Expand Down Expand Up @@ -77,6 +79,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
with TickerProviderStateMixin, RouteAware, WidgetsBindingObserver {
final heroTag = Get.arguments['heroTag'];

bool _isTvMode = false;
late final VideoDetailController videoDetailController;
late final VideoReplyController _videoReplyController;
PlPlayerController? plPlayerController;
Expand Down Expand Up @@ -128,6 +131,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
@override
void initState() {
super.initState();
_checkDeviceType();

PlPlayerController.setPlayCallBack(playCallBack);
videoDetailController = Get.put(VideoDetailController(), tag: heroTag);
Expand Down Expand Up @@ -157,15 +161,28 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
WidgetsBinding.instance.addObserver(this);
}

Future<void> _checkDeviceType() async {
_isTvMode = await Utils.isTvMode;
if (mounted) {
setState(() {});
}
}

// 获取视频资源,初始化播放器
Future<void> videoSourceInit() async {
videoDetailController.queryVideoUrl();
if (videoDetailController.autoPlay.value) {
plPlayerController = videoDetailController.plPlayerController;
plPlayerController = _isTvMode
? (PlPlayerController.getInstance<TvPlayerController>(
tag: heroTag, create: () => TvPlayerController()))
: videoDetailController.plPlayerController;
PlPlayerController.setActive(heroTag);
plPlayerController!
..addStatusLister(playerListener)
..addPositionListener(positionListener);
await plPlayerController!.autoEnterFullscreen();
if (!_isTvMode) {
await plPlayerController!.autoEnterFullscreen();
}
}
}

Expand Down Expand Up @@ -305,6 +322,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
}
}
plPlayerController = videoDetailController.plPlayerController;
PlPlayerController.setActive(heroTag);
videoDetailController.autoPlay.value = true;
if (videoDetailController.plPlayerController.preInitPlayer) {
await plPlayerController!.play();
Expand All @@ -319,6 +337,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>

@override
void dispose() {
PlPlayerController.unsetActive(heroTag);
plPlayerController
?..removeStatusLister(playerListener)
..removePositionListener(positionListener);
Expand Down Expand Up @@ -359,7 +378,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
videoDetailController.makeHeartBeat();
plPlayerController!.dispose();
} else {
PlPlayerController.updatePlayCount();
PlPlayerController.updatePlayCount(heroTag);
}
}
PageUtils.routeObserver.unsubscribe(this);
Expand Down Expand Up @@ -1340,43 +1359,54 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
Widget plPlayer({
required double width,
required double height,
bool isPipMode = false,
}) => Obx(
key: videoDetailController.videoPlayerKey,
() =>
videoDetailController.videoState.value is! Success ||
!videoDetailController.autoPlay.value ||
plPlayerController?.videoController == null
? const SizedBox.shrink()
: PLVideoPlayer(
maxWidth: width,
maxHeight: height,
plPlayerController: plPlayerController!,
videoDetailController: videoDetailController,
introController: introController,
headerControl: HeaderControl(
key: videoDetailController.headerCtrKey,
isPortrait: isPortrait,
controller: videoDetailController.plPlayerController,
videoDetailCtr: videoDetailController,
}) =>
Obx(
key: videoDetailController.videoPlayerKey,
() {
if (videoDetailController.videoState.value is! Success ||
!videoDetailController.autoPlay.value ||
plPlayerController?.videoController == null) {
return const SizedBox.shrink();
}

if (_isTvMode) {
return TvVideoPlayer(
controller: plPlayerController! as TvPlayerController,
heroTag: heroTag,
),
danmuWidget: isPipMode && pipNoDanmaku
? null
: Obx(
() => PlDanmaku(
key: ValueKey(videoDetailController.cid.value),
isPipMode: isPipMode,
cid: videoDetailController.cid.value,
playerController: plPlayerController!,
isFullScreen: plPlayerController!.isFullScreen.value,
isFileSource: videoDetailController.isFileSource,
);
} else {
bool isPipMode = videoDetailController.plPlayerController.isPipMode;
return PLVideoPlayer(
maxWidth: width,
maxHeight: height,
plPlayerController: plPlayerController!,
videoDetailController: videoDetailController,
introController: introController,
headerControl: HeaderControl(
key: videoDetailController.headerCtrKey,
isPortrait: isPortrait,
controller: videoDetailController.plPlayerController,
videoDetailCtr: videoDetailController,
heroTag: heroTag,
),
danmuWidget: isPipMode && pipNoDanmaku
? null
: Obx(
() => PlDanmaku(
key: ValueKey(videoDetailController.cid.value),
isPipMode: isPipMode,
cid: videoDetailController.cid.value,
playerController: plPlayerController!,
isFullScreen: plPlayerController!.isFullScreen.value,
isFileSource: videoDetailController.isFileSource,
),
),
),
showEpisodes: showEpisodes,
showViewPoints: showViewPoints,
),
);
showEpisodes: showEpisodes,
showViewPoints: showViewPoints,
);
}
},
);

late ThemeData themeData;
late bool isPortrait;
Expand All @@ -1388,7 +1418,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
Widget build(BuildContext context) {
Widget child;
if (videoDetailController.plPlayerController.isPipMode) {
child = plPlayer(width: maxWidth, height: maxHeight, isPipMode: true);
child = plPlayer(width: maxWidth, height: maxHeight);
} else if (!videoDetailController.horizontalScreen) {
child = childWhenDisabled;
} else if (maxWidth / maxHeight >= kScreenRatio) {
Expand Down
Loading