mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-08-05 18:20:10 +08:00
@@ -8,6 +8,7 @@ import 'package:PiliPalaX/common/widgets/pair.dart';
|
||||
import 'package:PiliPalaX/common/widgets/segment_progress_bar.dart';
|
||||
import 'package:PiliPalaX/http/danmaku.dart';
|
||||
import 'package:PiliPalaX/http/init.dart';
|
||||
import 'package:PiliPalaX/http/loading_state.dart';
|
||||
import 'package:PiliPalaX/http/user.dart';
|
||||
import 'package:PiliPalaX/models/video/later.dart';
|
||||
import 'package:PiliPalaX/models/video/play/subtitle.dart';
|
||||
@@ -162,12 +163,10 @@ class VideoDetailController extends GetxController
|
||||
/// tabs相关配置
|
||||
int tabInitialIndex = 0;
|
||||
late TabController tabCtr;
|
||||
RxList<String> tabs = <String>['简介', '评论'].obs;
|
||||
|
||||
// 请求返回的视频信息
|
||||
late PlayUrlModel data;
|
||||
// 请求状态
|
||||
RxBool isLoading = false.obs;
|
||||
Rx<LoadingState> videoState = LoadingState.loading().obs;
|
||||
|
||||
/// 播放器配置 画质 音质 解码格式
|
||||
late VideoQuality currentVideoQa;
|
||||
@@ -175,8 +174,6 @@ class VideoDetailController extends GetxController
|
||||
late VideoDecodeFormats currentDecodeFormats;
|
||||
// 是否开始自动播放 存在多p的情况下,第二p需要为true
|
||||
RxBool autoPlay = true.obs;
|
||||
// 视频资源是否有效
|
||||
RxBool isEffective = true.obs;
|
||||
// 封面图的展示
|
||||
RxBool isShowCover = true.obs;
|
||||
// 硬解
|
||||
@@ -1061,8 +1058,13 @@ class VideoDetailController extends GetxController
|
||||
plPlayerController.headerControl = headerControl;
|
||||
}
|
||||
|
||||
bool isQuerying = false;
|
||||
// 视频链接
|
||||
Future queryVideoUrl() async {
|
||||
if (isQuerying) {
|
||||
return;
|
||||
}
|
||||
isQuerying = true;
|
||||
if (cacheVideoQa == null) {
|
||||
await Connectivity().checkConnectivity().then((res) {
|
||||
cacheVideoQa = res.contains(ConnectivityResult.wifi)
|
||||
@@ -1226,7 +1228,8 @@ class VideoDetailController extends GetxController
|
||||
SmartDialog.showToast("错误(${result['code']}):${result['msg']}");
|
||||
}
|
||||
}
|
||||
return result;
|
||||
isQuerying = false;
|
||||
videoState.value = LoadingState.success(null);
|
||||
}
|
||||
|
||||
List<PostSegmentModel>? list;
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:PiliPalaX/http/loading_state.dart';
|
||||
import 'package:PiliPalaX/utils/extension.dart';
|
||||
import 'package:PiliPalaX/utils/utils.dart';
|
||||
import 'package:expandable/expandable.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -146,7 +147,8 @@ class VideoIntroController extends GetxController
|
||||
final videoDetailController =
|
||||
Get.find<VideoDetailController>(tag: heroTag);
|
||||
if (videoDetailController.videoItem['pic'] == null ||
|
||||
videoDetailController.videoItem['pic'] == '') {
|
||||
videoDetailController.videoItem['pic'] == '' ||
|
||||
videoDetailController.videoUrl.isNullOrEmpty) {
|
||||
videoDetailController.videoItem['pic'] = result['data'].pic;
|
||||
}
|
||||
} catch (_) {}
|
||||
|
||||
@@ -653,6 +653,10 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
|
||||
videoIntroController
|
||||
.queryVideoIntroData.value["status"] = true;
|
||||
videoIntroController.queryVideoIntro();
|
||||
if (videoDetailCtr.videoUrl.isNullOrEmpty &&
|
||||
videoDetailCtr.isQuerying.not) {
|
||||
videoDetailCtr.queryVideoUrl();
|
||||
}
|
||||
},
|
||||
label: const Text("点此重新加载"),
|
||||
),
|
||||
|
||||
@@ -73,7 +73,6 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
|
||||
double doubleOffset = 0;
|
||||
|
||||
late Future _futureBuilderFuture;
|
||||
// 自动退出全屏
|
||||
late bool autoExitFullscreen;
|
||||
late bool autoPlayEnable;
|
||||
@@ -194,7 +193,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
|
||||
// 获取视频资源,初始化播放器
|
||||
Future<void> videoSourceInit() async {
|
||||
_futureBuilderFuture = videoDetailController.queryVideoUrl();
|
||||
videoDetailController.queryVideoUrl();
|
||||
if (videoDetailController.showReply) {
|
||||
_videoReplyController.queryData();
|
||||
}
|
||||
@@ -289,6 +288,9 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
videoDetailController.audioUrl == null) {
|
||||
// SmartDialog.showToast('not initialized');
|
||||
debugPrint('not initialized');
|
||||
if (videoDetailController.isQuerying.not) {
|
||||
videoDetailController.queryVideoUrl();
|
||||
}
|
||||
return;
|
||||
}
|
||||
plPlayerController = videoDetailController.plPlayerController;
|
||||
@@ -985,8 +987,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
|
||||
Widget get manualPlayerWidget => Obx(
|
||||
() => Visibility(
|
||||
visible: videoDetailController.isShowCover.value &&
|
||||
videoDetailController.isEffective.value,
|
||||
visible: videoDetailController.isShowCover.value,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
@@ -1084,42 +1085,35 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
),
|
||||
);
|
||||
|
||||
Widget get plPlayer => FutureBuilder(
|
||||
future: _futureBuilderFuture,
|
||||
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
||||
if (snapshot.hasData && snapshot.data['status']) {
|
||||
return Obx(
|
||||
() => !videoDetailController.autoPlay.value ||
|
||||
plPlayerController == null ||
|
||||
plPlayerController!.videoController == null
|
||||
? nil
|
||||
: PLVideoPlayer(
|
||||
plPlayerController: plPlayerController!,
|
||||
videoIntroController:
|
||||
videoDetailController.videoType == SearchType.video
|
||||
? videoIntroController
|
||||
: null,
|
||||
bangumiIntroController: videoDetailController.videoType ==
|
||||
SearchType.media_bangumi
|
||||
? bangumiIntroController
|
||||
: null,
|
||||
headerControl: videoDetailController.headerControl,
|
||||
danmuWidget: Obx(
|
||||
() => PlDanmaku(
|
||||
key: Key(videoDetailController.danmakuCid.value
|
||||
.toString()),
|
||||
cid: videoDetailController.danmakuCid.value,
|
||||
playerController: plPlayerController!,
|
||||
),
|
||||
Widget get plPlayer => Obx(
|
||||
() => videoDetailController.videoState.value is! Success
|
||||
? nil
|
||||
: !videoDetailController.autoPlay.value ||
|
||||
plPlayerController == null ||
|
||||
plPlayerController!.videoController == null
|
||||
? nil
|
||||
: PLVideoPlayer(
|
||||
plPlayerController: plPlayerController!,
|
||||
videoIntroController:
|
||||
videoDetailController.videoType == SearchType.video
|
||||
? videoIntroController
|
||||
: null,
|
||||
bangumiIntroController: videoDetailController.videoType ==
|
||||
SearchType.media_bangumi
|
||||
? bangumiIntroController
|
||||
: null,
|
||||
headerControl: videoDetailController.headerControl,
|
||||
danmuWidget: Obx(
|
||||
() => PlDanmaku(
|
||||
key: Key(
|
||||
videoDetailController.danmakuCid.value.toString()),
|
||||
cid: videoDetailController.danmakuCid.value,
|
||||
playerController: plPlayerController!,
|
||||
),
|
||||
showEpisodes: showEpisodes,
|
||||
showViewPoints: showViewPoints,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return const SizedBox();
|
||||
}
|
||||
},
|
||||
showEpisodes: showEpisodes,
|
||||
showViewPoints: showViewPoints,
|
||||
),
|
||||
);
|
||||
|
||||
Widget autoChoose(Widget childWhenDisabled) {
|
||||
|
||||
Reference in New Issue
Block a user