Compare commits

...

20 Commits

Author SHA1 Message Date
b1a05c5c27 mod: 修改关于页面 2024-02-24 01:38:27 +08:00
02cc164635 feat: 首页tabbar样式设置 issues #564 2024-02-23 22:44:10 +08:00
5746b85b27 fix: 视频全屏遮挡 issues #347 2024-02-22 00:17:38 +08:00
740d5f1ddd fix: 视频详情页点击主页按钮卡死 issues #562 2024-02-21 23:27:32 +08:00
dd6c537135 Merge branch 'feature-chargeVideo' 2024-02-19 23:24:12 +08:00
bcf94e287a mod: 修改收藏视频响应判断 2024-02-18 23:44:21 +08:00
841d0f25f5 fix: 评论区jumpUrl BV跳转 2024-02-18 08:20:48 +08:00
4811dc5ba5 fix: changeSeasonOrbangu aid null 2024-02-18 08:11:11 +08:00
41af6c799b Merge branch 'main' into fix 2024-02-18 08:10:20 +08:00
e8f63f6114 fix: up投稿动态页增加未登录风控提示 2024-02-17 17:32:13 +08:00
d1e8068e51 Merge pull request #514 from orz12/fix-audio-fucus-interrupt
fix: 修复焦点恢复时错误播放的问题
2024-02-17 16:47:13 +08:00
6de9b1977c Merge pull request #548 from orz12/mod-imagepreview-hide-statusbar-in-android
mod: 图片预览页,安卓也隐藏状态栏
2024-02-17 15:09:52 +08:00
3c0f54bfd7 fix: app端model bvid null issues #546 2024-02-16 21:46:48 +08:00
3d2c6a122a feat: 充电视频试看 2024-02-16 21:30:29 +08:00
8950658f08 mod: 图片预览页,安卓也隐藏状态栏 2024-02-16 20:20:37 +08:00
63d600070b fix: 收藏详情页跳转搜索mediaId取值异常 2024-02-06 15:27:39 +08:00
ebdeec6730 fix: up主页跳转搜索mid取值异常 2024-02-06 12:23:07 +08:00
ee2a273d8b Merge branch 'main' into fix 2024-02-06 11:15:09 +08:00
fb32388536 fix: 尝试修复焦点恢复时错误播放的问题 2024-02-04 18:44:48 +08:00
5f92a0c293 mod: 用户投稿显示弹幕数 2024-02-04 00:32:01 +08:00
21 changed files with 354 additions and 143 deletions

View File

@ -101,10 +101,13 @@ class MemberHttp {
'data': MemberArchiveDataModel.fromJson(res.data['data']) 'data': MemberArchiveDataModel.fromJson(res.data['data'])
}; };
} else { } else {
Map errMap = {
-352: '风控校验失败,请检查登录状态',
};
return { return {
'status': false, 'status': false,
'data': [], 'data': [],
'msg': res.data['message'], 'msg': errMap[res.data['code']] ?? res.data['message'],
}; };
} }
} }
@ -123,10 +126,13 @@ class MemberHttp {
'data': DynamicsDataModel.fromJson(res.data['data']), 'data': DynamicsDataModel.fromJson(res.data['data']),
}; };
} else { } else {
Map errMap = {
-352: '风控校验失败,请检查登录状态',
};
return { return {
'status': false, 'status': false,
'data': [], 'data': [],
'msg': res.data['message'], 'msg': errMap[res.data['code']] ?? res.data['message'],
}; };
} }
} }

View File

@ -1,3 +1,5 @@
import 'package:pilipala/utils/id_utils.dart';
class RecVideoItemAppModel { class RecVideoItemAppModel {
RecVideoItemAppModel({ RecVideoItemAppModel({
this.id, this.id,
@ -50,14 +52,15 @@ class RecVideoItemAppModel {
? json['player_args']['aid'] ? json['player_args']['aid']
: int.parse(json['param'] ?? '-1'); : int.parse(json['param'] ?? '-1');
aid = json['player_args'] != null ? json['player_args']['aid'] : -1; aid = json['player_args'] != null ? json['player_args']['aid'] : -1;
bvid = null; bvid = json['player_args'] != null
? IdUtils.av2bv(json['player_args']['aid'])
: '';
cid = json['player_args'] != null ? json['player_args']['cid'] : -1; cid = json['player_args'] != null ? json['player_args']['cid'] : -1;
pic = json['cover']; pic = json['cover'];
stat = RcmdStat.fromJson(json); stat = RcmdStat.fromJson(json);
// 改用player_args中的duration作为原始数据秒数 // 改用player_args中的duration作为原始数据秒数
duration = json['player_args'] != null duration =
? json['player_args']['duration'] json['player_args'] != null ? json['player_args']['duration'] : -1;
: -1;
//duration = json['cover_right_text']; //duration = json['cover_right_text'];
title = json['title']; title = json['title'];
owner = RcmdOwner.fromJson(json); owner = RcmdOwner.fromJson(json);

View File

@ -142,7 +142,7 @@ class Stat {
Stat.fromJson(Map<String, dynamic> json) { Stat.fromJson(Map<String, dynamic> json) {
view = json["play"]; view = json["play"];
danmaku = json['comment']; danmaku = json['video_review'];
} }
} }

View File

@ -34,6 +34,7 @@ class PlayUrlModel {
String? seekParam; String? seekParam;
String? seekType; String? seekType;
Dash? dash; Dash? dash;
List<Durl>? durl;
List<FormatItem>? supportFormats; List<FormatItem>? supportFormats;
// String? highFormat; // String? highFormat;
int? lastPlayTime; int? lastPlayTime;
@ -52,7 +53,8 @@ class PlayUrlModel {
videoCodecid = json['video_codecid']; videoCodecid = json['video_codecid'];
seekParam = json['seek_param']; seekParam = json['seek_param'];
seekType = json['seek_type']; seekType = json['seek_type'];
dash = Dash.fromJson(json['dash']); dash = json['dash'] != null ? Dash.fromJson(json['dash']) : null;
durl = json['durl']?.map<Durl>((e) => Durl.fromJson(e)).toList();
supportFormats = json['support_formats'] != null supportFormats = json['support_formats'] != null
? json['support_formats'] ? json['support_formats']
.map<FormatItem>((e) => FormatItem.fromJson(e)) .map<FormatItem>((e) => FormatItem.fromJson(e))
@ -250,3 +252,30 @@ class Flac {
audio = json['audio'] != null ? AudioItem.fromJson(json['audio']) : null; audio = json['audio'] != null ? AudioItem.fromJson(json['audio']) : null;
} }
} }
class Durl {
Durl({
this.order,
this.length,
this.size,
this.ahead,
this.vhead,
this.url,
});
int? order;
int? length;
int? size;
String? ahead;
String? vhead;
String? url;
Durl.fromJson(Map<String, dynamic> json) {
order = json['order'];
length = json['length'];
size = json['size'];
ahead = json['ahead'];
vhead = json['vhead'];
url = json['url'];
}
}

View File

@ -53,29 +53,54 @@ class _AboutPageState extends State<AboutPage> {
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
const SizedBox(height: 6), const SizedBox(height: 6),
Text(
'使用Flutter开发的哔哩哔哩第三方客户端',
style: TextStyle(color: Theme.of(context).colorScheme.outline),
),
const SizedBox(height: 20),
Obx( Obx(
() => ListTile( () => Badge(
title: const Text('当前版本'), isLabelVisible: _aboutController.isLoading.value
trailing: Text(_aboutController.currentVersion.value, ? false
style: subTitleStyle), : _aboutController.isUpdate.value,
label: const Text('New'),
child: Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 0, 30),
child: FilledButton.tonal(
onPressed: () {
showModalBottomSheet(
context: context,
builder: (context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
onTap: () => _aboutController.githubRelease(),
title: const Text('Github下载'),
),
ListTile(
onTap: () => _aboutController.panDownload(),
title: const Text('网盘下载'),
),
ListTile(
onTap: () => _aboutController.webSiteUrl(),
title: const Text('官网下载'),
),
ListTile(
onTap: () => _aboutController.qimiao(),
title: const Text('奇妙应用'),
),
SizedBox(
height:
MediaQuery.of(context).padding.bottom +
20)
],
);
},
);
},
child: Text(
'V${_aboutController.currentVersion.value}',
style: subTitleStyle.copyWith(
color: Theme.of(context).primaryColor,
),
), ),
), ),
Obx(
() => ListTile(
onTap: () => _aboutController.onUpdate(),
title: const Text('最新版本'),
trailing: Text(
_aboutController.isLoading.value
? '正在获取'
: _aboutController.isUpdate.value
? '有新版本 ❤️${_aboutController.remoteVersion.value}'
: '当前已是最新版',
style: subTitleStyle,
), ),
), ),
), ),
@ -87,14 +112,9 @@ class _AboutPageState extends State<AboutPage> {
// size: 16, // size: 16,
// ), // ),
// ), // ),
Divider(
thickness: 1,
height: 30,
color: Theme.of(context).colorScheme.outlineVariant,
),
ListTile( ListTile(
onTap: () => _aboutController.githubUrl(), onTap: () => _aboutController.githubUrl(),
title: const Text('Github'), title: const Text('开源地址'),
trailing: Text( trailing: Text(
'github.com/guozhigq/pilipala', 'github.com/guozhigq/pilipala',
style: subTitleStyle, style: subTitleStyle,
@ -128,19 +148,43 @@ class _AboutPageState extends State<AboutPage> {
color: outline, color: outline,
), ),
), ),
ListTile(
onTap: () {
showModalBottomSheet(
context: context,
builder: (context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile( ListTile(
onTap: () => _aboutController.qqChanel(), onTap: () => _aboutController.qqChanel(),
title: const Text('QQ群'), title: const Text('QQ群'),
trailing: Icon( trailing: Text(
Icons.arrow_forward_ios, '616150809',
size: 16, style: subTitleStyle,
color: outline,
), ),
), ),
ListTile( ListTile(
onTap: () => _aboutController.tgChanel(), onTap: () => _aboutController.tgChanel(),
title: const Text('TG频道'), title: const Text('TG频道'),
trailing: Icon(Icons.arrow_forward_ios, size: 16, color: outline), trailing: Text(
'https://t.me/+lm_oOVmF0RJiODk1',
style: subTitleStyle,
),
),
SizedBox(
height: MediaQuery.of(context).padding.bottom + 20)
],
);
},
);
},
title: const Text('交流社区'),
trailing: Icon(
Icons.arrow_forward_ios,
size: 16,
color: outline,
),
), ),
ListTile( ListTile(
onTap: () => _aboutController.aPay(), onTap: () => _aboutController.aPay(),
@ -163,6 +207,7 @@ class _AboutPageState extends State<AboutPage> {
subtitle: Text('图片及网络缓存 $cacheSize', style: subTitleStyle), subtitle: Text('图片及网络缓存 $cacheSize', style: subTitleStyle),
trailing: Icon(Icons.arrow_forward_ios, size: 16, color: outline), trailing: Icon(Icons.arrow_forward_ios, size: 16, color: outline),
), ),
SizedBox(height: MediaQuery.of(context).padding.bottom + 20)
], ],
), ),
), ),
@ -230,11 +275,26 @@ class AboutController extends GetxController {
); );
} }
githubRelease() {
launchUrl(
Uri.parse('https://github.com/guozhigq/pilipala/release'),
mode: LaunchMode.externalApplication,
);
}
// 从网盘下载 // 从网盘下载
panDownload() { panDownload() {
launchUrl( Clipboard.setData(
const ClipboardData(text: 'pili'),
);
SmartDialog.showToast(
'已复制提取码pili',
displayTime: const Duration(milliseconds: 500),
).then(
(value) => launchUrl(
Uri.parse('https://www.123pan.com/s/9sVqVv-flu0A.html'), Uri.parse('https://www.123pan.com/s/9sVqVv-flu0A.html'),
mode: LaunchMode.externalApplication, mode: LaunchMode.externalApplication,
),
); );
} }
@ -250,7 +310,7 @@ class AboutController extends GetxController {
// qq频道 // qq频道
qqChanel() { qqChanel() {
Clipboard.setData( Clipboard.setData(
const ClipboardData(text: '489981949'), const ClipboardData(text: '616150809'),
); );
SmartDialog.showToast('已复制QQ群号'); SmartDialog.showToast('已复制QQ群号');
} }
@ -291,6 +351,13 @@ class AboutController extends GetxController {
); );
} }
qimiao() {
launchUrl(
Uri.parse('https://www.magicalapk.com/home'),
mode: LaunchMode.externalApplication,
);
}
// 日志 // 日志
logs() { logs() {
Get.toNamed('/logs'); Get.toNamed('/logs');

View File

@ -218,14 +218,12 @@ class BangumiIntroController extends GetxController {
addIds: addMediaIdsNew.join(','), addIds: addMediaIdsNew.join(','),
delIds: delMediaIdsNew.join(',')); delIds: delMediaIdsNew.join(','));
if (result['status']) { if (result['status']) {
if (result['data']['prompt']) {
addMediaIdsNew = []; addMediaIdsNew = [];
delMediaIdsNew = []; delMediaIdsNew = [];
Get.back();
// 重新获取收藏状态 // 重新获取收藏状态
queryHasFavVideo(); queryHasFavVideo();
SmartDialog.showToast('✅ 操作成功'); SmartDialog.showToast('✅ 操作成功');
} Get.back();
} }
} }

View File

@ -60,7 +60,6 @@ class FavDetailController extends GetxController {
var result = await VideoHttp.favVideo( var result = await VideoHttp.favVideo(
aid: id, addIds: '', delIds: mediaId.toString()); aid: id, addIds: '', delIds: mediaId.toString());
if (result['status']) { if (result['status']) {
if (result['data']['prompt']) {
List dataList = favList; List dataList = favList;
for (var i in dataList) { for (var i in dataList) {
if (i.id == id) { if (i.id == id) {
@ -71,7 +70,6 @@ class FavDetailController extends GetxController {
SmartDialog.showToast('取消收藏'); SmartDialog.showToast('取消收藏');
} }
} }
}
onLoad() { onLoad() {
queryUserFavFolderDetail(type: 'onLoad'); queryUserFavFolderDetail(type: 'onLoad');

View File

@ -29,6 +29,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
mediaId = Get.parameters['mediaId']!;
_futureBuilderFuture = _favDetailController.queryUserFavFolderDetail(); _futureBuilderFuture = _favDetailController.queryUserFavFolderDetail();
mediaId = Get.parameters['mediaId']!; mediaId = Get.parameters['mediaId']!;
titleStreamC = StreamController<bool>(); titleStreamC = StreamController<bool>();

View File

@ -80,7 +80,6 @@ class FavSearchController extends GetxController {
var result = await VideoHttp.favVideo( var result = await VideoHttp.favVideo(
aid: id, addIds: '', delIds: mediaId.toString()); aid: id, addIds: '', delIds: mediaId.toString());
if (result['status']) { if (result['status']) {
if (result['data']['prompt']) {
List dataList = favList; List dataList = favList;
for (var i in dataList) { for (var i in dataList) {
if (i.id == id) { if (i.id == id) {
@ -92,4 +91,3 @@ class FavSearchController extends GetxController {
} }
} }
} }
}

View File

@ -26,6 +26,7 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
late List defaultTabs; late List defaultTabs;
late List<String> tabbarSort; late List<String> tabbarSort;
RxString defaultSearch = ''.obs; RxString defaultSearch = ''.obs;
late bool enableGradientBg;
@override @override
void onInit() { void onInit() {
@ -40,6 +41,8 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
if (setting.get(SettingBoxKey.enableSearchWord, defaultValue: true)) { if (setting.get(SettingBoxKey.enableSearchWord, defaultValue: true)) {
searchDefault(); searchDefault();
} }
enableGradientBg =
setting.get(SettingBoxKey.enableGradientBg, defaultValue: true);
} }
void onRefresh() { void onRefresh() {

View File

@ -48,17 +48,20 @@ class _HomePageState extends State<HomePage>
super.build(context); super.build(context);
Brightness currentBrightness = MediaQuery.of(context).platformBrightness; Brightness currentBrightness = MediaQuery.of(context).platformBrightness;
// 设置状态栏图标的亮度 // 设置状态栏图标的亮度
if (_homeController.enableGradientBg) {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarIconBrightness: currentBrightness == Brightness.light statusBarIconBrightness: currentBrightness == Brightness.light
? Brightness.dark ? Brightness.dark
: Brightness.light, : Brightness.light,
)); ));
}
return Scaffold( return Scaffold(
extendBody: true, extendBody: true,
extendBodyBehindAppBar: true, extendBodyBehindAppBar: true,
body: Stack( body: Stack(
children: [ children: [
// gradient background // gradient background
if (_homeController.enableGradientBg) ...[
Align( Align(
alignment: Alignment.topLeft, alignment: Alignment.topLeft,
child: Opacity( child: Opacity(
@ -69,8 +72,14 @@ class _HomePageState extends State<HomePage>
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
colors: [ colors: [
Theme.of(context).colorScheme.primary.withOpacity(0.9), Theme.of(context)
Theme.of(context).colorScheme.primary.withOpacity(0.5), .colorScheme
.primary
.withOpacity(0.9),
Theme.of(context)
.colorScheme
.primary
.withOpacity(0.5),
Theme.of(context).colorScheme.surface Theme.of(context).colorScheme.surface
], ],
begin: Alignment.topLeft, begin: Alignment.topLeft,
@ -80,6 +89,7 @@ class _HomePageState extends State<HomePage>
), ),
), ),
), ),
],
Column( Column(
children: [ children: [
CustomAppBar( CustomAppBar(
@ -90,7 +100,37 @@ class _HomePageState extends State<HomePage>
callback: showUserBottomSheet, callback: showUserBottomSheet,
), ),
if (_homeController.tabs.length > 1) ...[ if (_homeController.tabs.length > 1) ...[
if (_homeController.enableGradientBg) ...[
const CustomTabs(), const CustomTabs(),
] else ...[
const SizedBox(height: 4),
SizedBox(
width: double.infinity,
height: 42,
child: Align(
alignment: Alignment.center,
child: TabBar(
controller: _homeController.tabController,
tabs: [
for (var i in _homeController.tabs)
Tab(text: i['label'])
],
isScrollable: true,
dividerColor: Colors.transparent,
enableFeedback: true,
splashBorderRadius: BorderRadius.circular(10),
tabAlignment: TabAlignment.center,
onTap: (value) {
feedBack();
if (_homeController.initialIndex.value == value) {
_homeController.tabsCtrList[value]().animateToTop();
}
_homeController.initialIndex.value = value;
},
),
),
),
],
] else ...[ ] else ...[
const SizedBox(height: 6), const SizedBox(height: 6),
], ],

View File

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/widgets/video_card_h.dart'; import 'package:pilipala/common/widgets/video_card_h.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
import '../../common/widgets/http_error.dart';
import 'controller.dart'; import 'controller.dart';
class MemberArchivePage extends StatefulWidget { class MemberArchivePage extends StatefulWidget {
@ -86,10 +87,16 @@ class _MemberArchivePageState extends State<MemberArchivePage> {
: const SliverToBoxAdapter(), : const SliverToBoxAdapter(),
); );
} else { } else {
return const SliverToBoxAdapter(); return HttpError(
errMsg: snapshot.data['msg'],
fn: () {},
);
} }
} else { } else {
return const SliverToBoxAdapter(); return HttpError(
errMsg: snapshot.data['msg'],
fn: () {},
);
} }
} else { } else {
return const SliverToBoxAdapter(); return const SliverToBoxAdapter();

View File

@ -4,6 +4,7 @@ import 'package:get/get.dart';
import 'package:pilipala/pages/member_dynamics/index.dart'; import 'package:pilipala/pages/member_dynamics/index.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
import '../../common/widgets/http_error.dart';
import '../dynamics/widgets/dynamic_panel.dart'; import '../dynamics/widgets/dynamic_panel.dart';
class MemberDynamicsPage extends StatefulWidget { class MemberDynamicsPage extends StatefulWidget {
@ -80,10 +81,16 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage> {
: const SliverToBoxAdapter(), : const SliverToBoxAdapter(),
); );
} else { } else {
return const SliverToBoxAdapter(); return HttpError(
errMsg: snapshot.data['msg'],
fn: () {},
);
} }
} else { } else {
return const SliverToBoxAdapter(); return HttpError(
errMsg: snapshot.data['msg'],
fn: () {},
);
} }
} else { } else {
return const SliverToBoxAdapter(); return const SliverToBoxAdapter();

View File

@ -102,15 +102,12 @@ class _ImagePreviewState extends State<ImagePreview>
); );
} }
// 设置状态栏图标透明 // 隐藏状态栏,避免遮挡图片内容
setStatusBar() async { setStatusBar() async {
if (Platform.isIOS) { if (Platform.isIOS || Platform.isAndroid) {
await StatusBarControl.setHidden(true, await StatusBarControl.setHidden(true,
animation: StatusBarAnimation.SLIDE); animation: StatusBarAnimation.SLIDE);
} }
if (Platform.isAndroid) {
await StatusBarControl.setColor(Colors.transparent);
}
} }
@override @override

View File

@ -102,6 +102,12 @@ class _StyleSettingState extends State<StyleSetting> {
defaultVal: true, defaultVal: true,
needReboot: true, needReboot: true,
), ),
const SetSwitchItem(
title: '首页底栏背景渐变',
setKey: SettingBoxKey.enableGradientBg,
defaultVal: true,
needReboot: true,
),
ListTile( ListTile(
onTap: () async { onTap: () async {
int? result = await showDialog( int? result = await showDialog(

View File

@ -90,6 +90,8 @@ class VideoDetailController extends GetxController
late String cacheDecode; late String cacheDecode;
late int cacheAudioQa; late int cacheAudioQa;
PersistentBottomSheetController? replyReplyBottomSheetCtr;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
@ -140,7 +142,7 @@ class VideoDetailController extends GetxController
} }
showReplyReplyPanel() { showReplyReplyPanel() {
PersistentBottomSheetController? ctr = replyReplyBottomSheetCtr =
scaffoldKey.currentState?.showBottomSheet((BuildContext context) { scaffoldKey.currentState?.showBottomSheet((BuildContext context) {
return VideoReplyReplyPanel( return VideoReplyReplyPanel(
oid: oid.value, oid: oid.value,
@ -153,7 +155,7 @@ class VideoDetailController extends GetxController
source: 'videoDetail', source: 'videoDetail',
); );
}); });
ctr?.closed.then((value) { replyReplyBottomSheetCtr?.closed.then((value) {
fRpid = 0; fRpid = 0;
}); });
} }
@ -229,9 +231,11 @@ class VideoDetailController extends GetxController
seekTo: seekToTime ?? defaultST, seekTo: seekToTime ?? defaultST,
duration: duration ?? Duration(milliseconds: data.timeLength ?? 0), duration: duration ?? Duration(milliseconds: data.timeLength ?? 0),
// 宽>高 水平 否则 垂直 // 宽>高 水平 否则 垂直
direction: (firstVideo.width! - firstVideo.height!) > 0 direction: firstVideo.width != null && firstVideo.height != null
? ((firstVideo.width! - firstVideo.height!) > 0
? 'horizontal' ? 'horizontal'
: 'vertical', : 'vertical')
: null,
bvid: bvid, bvid: bvid,
cid: cid.value, cid: cid.value,
enableHeart: enableHeart, enableHeart: enableHeart,
@ -248,6 +252,21 @@ class VideoDetailController extends GetxController
var result = await VideoHttp.videoUrl(cid: cid.value, bvid: bvid); var result = await VideoHttp.videoUrl(cid: cid.value, bvid: bvid);
if (result['status']) { if (result['status']) {
data = result['data']; data = result['data'];
if (data.acceptDesc!.isNotEmpty && data.acceptDesc!.contains('试看')) {
SmartDialog.showToast(
'该视频为专属视频,仅提供试看',
displayTime: const Duration(seconds: 3),
);
videoUrl = data.durl!.first.url!;
audioUrl = '';
defaultST = Duration.zero;
firstVideo = VideoItem();
if (autoPlay.value) {
await playerInit();
isShowCover.value = false;
}
return result;
}
final List<VideoItem> allVideosList = data.dash!.video!; final List<VideoItem> allVideosList = data.dash!.video!;
try { try {
// 当前可播放的最高质量视频 // 当前可播放的最高质量视频
@ -355,4 +374,11 @@ class VideoDetailController extends GetxController
} }
return result; return result;
} }
// mob端全屏状态关闭二级回复
hiddenReplyReplyPanel() {
replyReplyBottomSheetCtr != null
? replyReplyBottomSheetCtr!.close()
: print('replyReplyBottomSheetCtr is null');
}
} }

View File

@ -305,11 +305,9 @@ class VideoIntroController extends GetxController {
delIds: favStatus == 1 ? '$defaultFolderId' : '', delIds: favStatus == 1 ? '$defaultFolderId' : '',
); );
if (result['status']) { if (result['status']) {
if (result['data']['prompt']) {
// 重新获取收藏状态 // 重新获取收藏状态
await queryHasFavVideo(); await queryHasFavVideo();
SmartDialog.showToast('✅ 操作成功'); SmartDialog.showToast('✅ 操作成功');
}
} else { } else {
SmartDialog.showToast(result['msg']); SmartDialog.showToast(result['msg']);
} }
@ -334,14 +332,12 @@ class VideoIntroController extends GetxController {
delIds: delMediaIdsNew.join(',')); delIds: delMediaIdsNew.join(','));
SmartDialog.dismiss(); SmartDialog.dismiss();
if (result['status']) { if (result['status']) {
if (result['data']['prompt']) {
addMediaIdsNew = []; addMediaIdsNew = [];
delMediaIdsNew = []; delMediaIdsNew = [];
Get.back(); Get.back();
// 重新获取收藏状态 // 重新获取收藏状态
await queryHasFavVideo(); await queryHasFavVideo();
SmartDialog.showToast('✅ 操作成功'); SmartDialog.showToast('✅ 操作成功');
}
} else { } else {
SmartDialog.showToast(result['msg']); SmartDialog.showToast(result['msg']);
} }
@ -482,7 +478,7 @@ class VideoIntroController extends GetxController {
final ReleatedController releatedCtr = final ReleatedController releatedCtr =
Get.find<ReleatedController>(tag: heroTag); Get.find<ReleatedController>(tag: heroTag);
videoDetailCtr.bvid = bvid; videoDetailCtr.bvid = bvid;
videoDetailCtr.oid.value = aid; videoDetailCtr.oid.value = aid ?? IdUtils.bv2av(bvid);
videoDetailCtr.cid.value = cid; videoDetailCtr.cid.value = cid;
videoDetailCtr.danmakuCid.value = cid; videoDetailCtr.danmakuCid.value = cid;
videoDetailCtr.queryVideoUrl(); videoDetailCtr.queryVideoUrl();

View File

@ -12,6 +12,7 @@ import 'package:pilipala/pages/preview/index.dart';
import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/pages/video/detail/index.dart';
import 'package:pilipala/pages/video/detail/reply_new/index.dart'; import 'package:pilipala/pages/video/detail/reply_new/index.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/id_utils.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import 'package:pilipala/utils/url_utils.dart'; import 'package:pilipala/utils/url_utils.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
@ -620,6 +621,13 @@ InlineSpan buildContent(
..onTap = () async { ..onTap = () async {
final String title = content.jumpUrl[matchStr]['title']; final String title = content.jumpUrl[matchStr]['title'];
if (appUrlSchema == '') { if (appUrlSchema == '') {
if (matchStr.startsWith('BV')) {
UrlUtils.matchUrlPush(
matchStr,
title,
'',
);
} else {
final String redirectUrl = final String redirectUrl =
await UrlUtils.parseRedirectUrl(matchStr); await UrlUtils.parseRedirectUrl(matchStr);
final String pathSegment = Uri.parse(redirectUrl).path; final String pathSegment = Uri.parse(redirectUrl).path;
@ -641,6 +649,7 @@ InlineSpan buildContent(
}, },
); );
} }
}
} else { } else {
if (appUrlSchema.startsWith('bilibili://search')) { if (appUrlSchema.startsWith('bilibili://search')) {
Get.toNamed('/searchResult', Get.toNamed('/searchResult',

View File

@ -92,6 +92,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
videoSourceInit(); videoSourceInit();
appbarStreamListen(); appbarStreamListen();
lifecycleListener(); lifecycleListener();
fullScreenStatusListener();
} }
// 获取视频资源,初始化播放器 // 获取视频资源,初始化播放器
@ -188,6 +189,14 @@ class _VideoDetailPageState extends State<VideoDetailPage>
); );
} }
void fullScreenStatusListener() {
plPlayerController?.isFullScreen.listen((bool isFullScreen) {
if (isFullScreen) {
videoDetailController.hiddenReplyReplyPanel();
}
});
}
@override @override
void dispose() { void dispose() {
shutdownTimerService.handleWaitingFinished(); shutdownTimerService.handleWaitingFinished();
@ -225,7 +234,10 @@ class _VideoDetailPageState extends State<VideoDetailPage>
@override @override
// 返回当前页面时 // 返回当前页面时
void didPopNext() async { void didPopNext() async {
if (plPlayerController != null &&
plPlayerController!.videoPlayerController != null) {
setState(() => isShowing = true); setState(() => isShowing = true);
}
videoDetailController.isFirstTime = false; videoDetailController.isFirstTime = false;
final bool autoplay = autoPlayEnable; final bool autoplay = autoPlayEnable;
videoDetailController.playerInit(autoplay: autoplay); videoDetailController.playerInit(autoplay: autoplay);

View File

@ -20,11 +20,15 @@ class AudioSessionHandler {
session.interruptionEventStream.listen((event) { session.interruptionEventStream.listen((event) {
final player = PlPlayerController.getInstance(); final player = PlPlayerController.getInstance();
if (event.begin) { if (event.begin) {
if (player.playerStatus != PlayerStatus.playing) return;
switch (event.type) { switch (event.type) {
case AudioInterruptionType.duck: case AudioInterruptionType.duck:
player.setVolume(player.volume.value * 0.5); player.setVolume(player.volume.value * 0.5);
break; break;
case AudioInterruptionType.pause: case AudioInterruptionType.pause:
player.pause(isInterrupt: true);
_playInterrupted = true;
break;
case AudioInterruptionType.unknown: case AudioInterruptionType.unknown:
player.pause(isInterrupt: true); player.pause(isInterrupt: true);
_playInterrupted = true; _playInterrupted = true;
@ -36,7 +40,7 @@ class AudioSessionHandler {
player.setVolume(player.volume.value * 2); player.setVolume(player.volume.value * 2);
break; break;
case AudioInterruptionType.pause: case AudioInterruptionType.pause:
if (_playInterrupted) PlPlayerController.getInstance().play(); if (_playInterrupted) player.play();
break; break;
case AudioInterruptionType.unknown: case AudioInterruptionType.unknown:
break; break;
@ -47,7 +51,10 @@ class AudioSessionHandler {
// 耳机拔出暂停 // 耳机拔出暂停
session.becomingNoisyEventStream.listen((_) { session.becomingNoisyEventStream.listen((_) {
PlPlayerController.getInstance().pause(); final player = PlPlayerController.getInstance();
if (player.playerStatus == PlayerStatus.playing) {
player.pause();
}
}); });
} }
} }

View File

@ -135,7 +135,8 @@ class SettingBoxKey {
hideSearchBar = 'hideSearchBar', // 收起顶栏 hideSearchBar = 'hideSearchBar', // 收起顶栏
hideTabBar = 'hideTabBar', // 收起底栏 hideTabBar = 'hideTabBar', // 收起底栏
tabbarSort = 'tabbarSort', // 首页tabbar tabbarSort = 'tabbarSort', // 首页tabbar
dynamicBadgeMode = 'dynamicBadgeMode'; dynamicBadgeMode = 'dynamicBadgeMode',
enableGradientBg = 'enableGradientBg';
} }
class LocalCacheKey { class LocalCacheKey {