diff --git a/lib/common/widgets/list_sheet.dart b/lib/common/widgets/list_sheet.dart index 9489fbee..6e335e30 100644 --- a/lib/common/widgets/list_sheet.dart +++ b/lib/common/widgets/list_sheet.dart @@ -158,7 +158,9 @@ class _ListSheetContentState extends State late String title; if (episode.runtimeType.toString() == "EpisodeItem") { if (episode.longTitle != null && episode.longTitle != "") { - title = "第${(episode.title ?? '${index + 1}')}话 ${episode.longTitle!}"; + dynamic leading = episode.title ?? index + 1; + title = + "${Utils.isStringNumeric(leading) ? '第$leading话' : leading} ${episode.longTitle!}"; } else { title = episode.title!; } @@ -255,13 +257,12 @@ class _ListSheetContentState extends State 'assets/images/big-vip.png', height: 20, semanticLabel: "大会员", - ), - if (episode.badge != '会员') Text(episode.badge), + ) + else + Text(episode.badge), const SizedBox(width: 10), ], - if (!(episode.runtimeType.toString() == 'EpisodeItem' && - (episode.longTitle != null && episode.longTitle != ''))) - Text('${index + 1}/$length'), + if (episode is! bangumi.EpisodeItem) Text('${index + 1}/$length'), ], ), ); diff --git a/lib/common/widgets/video_card_h_member_video.dart b/lib/common/widgets/video_card_h_member_video.dart index 46412a97..7b042048 100644 --- a/lib/common/widgets/video_card_h_member_video.dart +++ b/lib/common/widgets/video_card_h_member_video.dart @@ -1,3 +1,6 @@ +import 'package:PiliPalaX/common/widgets/stat/danmu.dart'; +import 'package:PiliPalaX/common/widgets/stat/view.dart'; +import 'package:PiliPalaX/common/widgets/video_popup_menu.dart'; import 'package:PiliPalaX/models/space_archive/item.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -14,163 +17,98 @@ class VideoCardHMemberVideo extends StatelessWidget { required this.videoItem, this.longPress, this.longPressEnd, - this.source = 'normal', - this.showOwner = true, - this.showView = true, - this.showDanmaku = true, - this.showPubdate = false, }); final Item videoItem; final Function()? longPress; final Function()? longPressEnd; - final String source; - final bool showOwner; - final bool showView; - final bool showDanmaku; - final bool showPubdate; @override Widget build(BuildContext context) { final int aid = int.tryParse(videoItem.param ?? '') ?? -1; final String bvid = videoItem.bvid ?? ''; - String type = 'video'; - // try { - // type = videoItem.type; - // } catch (_) {} - // List actions = - // VideoCustomActions(videoItem, context).actions; final String heroTag = Utils.makeHeroTag(aid); return Stack(children: [ - Semantics( - // label: Utils.videoItemSemantics(videoItem), - excludeSemantics: true, - // customSemanticsActions: { - // for (var item in actions) - // CustomSemanticsAction(label: item.title): item.onTap!, - // }, - child: InkWell( - borderRadius: BorderRadius.circular(12), - onLongPress: () { - if (longPress != null) { - longPress!(); - } - }, - onTap: () async { - if (type == 'ketang') { - SmartDialog.showToast('课堂视频暂不支持播放'); - return; - } - try { - // PiliScheme.routePush(Uri.parse(videoItem.smallCoverV5.base.uri)); - // final int cid = - // videoItem.smallCoverV5.base.playerArgs.cid.toInt() ?? - // await SearchHttp.ab2c(aid: aid, bvid: bvid); - Get.toNamed('/video?bvid=$bvid&cid=${videoItem.firstCid}', - arguments: {'heroTag': heroTag}); - // Get.toNamed('/video?bvid=$bvid&cid=$cid', - // arguments: {'videoItem': videoItem, 'heroTag': heroTag}); - } catch (err) { - SmartDialog.showToast(err.toString()); - } - }, - child: LayoutBuilder( - builder: (BuildContext context, BoxConstraints boxConstraints) { - return Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AspectRatio( - aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder( - builder: (BuildContext context, - BoxConstraints boxConstraints) { - final double maxWidth = boxConstraints.maxWidth; - final double maxHeight = boxConstraints.maxHeight; - return Stack( - children: [ - Hero( - tag: heroTag, - child: NetworkImgLayer( - src: videoItem.cover, - width: maxWidth, - height: maxHeight, - ), + InkWell( + borderRadius: BorderRadius.circular(12), + onLongPress: () { + if (longPress != null) { + longPress!(); + } + }, + onTap: () async { + try { + Get.toNamed('/video?bvid=$bvid&cid=${videoItem.firstCid}', + arguments: {'heroTag': heroTag}); + } catch (err) { + SmartDialog.showToast(err.toString()); + } + }, + child: LayoutBuilder( + builder: (BuildContext context, BoxConstraints boxConstraints) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AspectRatio( + aspectRatio: StyleString.aspectRatio, + child: LayoutBuilder( + builder: + (BuildContext context, BoxConstraints boxConstraints) { + final double maxWidth = boxConstraints.maxWidth; + final double maxHeight = boxConstraints.maxHeight; + return Stack( + children: [ + Hero( + tag: heroTag, + child: NetworkImgLayer( + src: videoItem.cover, + width: maxWidth, + height: maxHeight, ), - if (videoItem.duration != null) - PBadge( - text: Utils.timeFormat(videoItem.duration), - right: 6.0, - bottom: 6.0, - type: 'gray', - ), - if (type != 'video') - PBadge( - text: type, - left: 6.0, - bottom: 6.0, - type: 'primary', - ), - // if (videoItem.rcmdReason != null && - // videoItem.rcmdReason.content != '') - // pBadge(videoItem.rcmdReason.content, context, - // 6.0, 6.0, null, null), - ], - ); - }, - ), + ), + if (videoItem.duration != null) + PBadge( + text: Utils.timeFormat(videoItem.duration), + right: 6.0, + bottom: 6.0, + type: 'gray', + ), + ], + ); + }, ), - VideoContent( - videoItem: videoItem, - source: source, - showOwner: showOwner, - showView: showView, - showDanmaku: showDanmaku, - showPubdate: showPubdate, - ) - ], - ); - }, - ), + ), + VideoContent( + videoItem: videoItem, + ) + ], + ); + }, + ), + ), + Positioned( + bottom: 0, + right: 0, + child: VideoPopupMenu( + size: 29, + iconSize: 17, + actions: VideoCustomActions(videoItem, context).actions, ), ), - // if (source == 'normal') - // Positioned( - // bottom: 0, - // right: 0, - // child: VideoPopupMenu( - // size: 29, - // iconSize: 17, - // actions: actions, - // ), - // ), ]); } } class VideoContent extends StatelessWidget { final Item videoItem; - final String source; - final bool showOwner; - final bool showView; - final bool showDanmaku; - final bool showPubdate; const VideoContent({ super.key, required this.videoItem, - this.source = 'normal', - this.showOwner = true, - this.showView = true, - this.showDanmaku = true, - this.showPubdate = false, }); @override Widget build(BuildContext context) { - // String pubdate = showPubdate - // ? Utils.dateFormat(videoItem.pubdate!, formatType: 'day') - // : ''; - // if (pubdate != '') pubdate += ' '; return Expanded( child: Padding( padding: const EdgeInsets.fromLTRB(10, 0, 6, 0), @@ -193,39 +131,8 @@ class VideoContent extends StatelessWidget { ), ), ], - // const Spacer(), - // if (videoItem.rcmdReason != null && - // videoItem.rcmdReason.content != '') - // Container( - // padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 5), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(4), - // border: Border.all( - // color: Theme.of(context).colorScheme.surfaceTint), - // ), - // child: Text( - // videoItem.rcmdReason.content, - // style: TextStyle( - // fontSize: 9, - // color: Theme.of(context).colorScheme.surfaceTint), - // ), - // ), - // const SizedBox(height: 4), - if (showOwner || showPubdate) - Text( - videoItem.publishTimeText ?? '', - maxLines: 1, - style: TextStyle( - fontWeight: FontWeight.w400, - fontSize: Theme.of(context).textTheme.labelMedium!.fontSize, - height: 1, - color: Theme.of(context).colorScheme.outline, - overflow: TextOverflow.clip, - ), - ), - const SizedBox(height: 3), Text( - '${videoItem.viewContent} · ${videoItem.danmaku}', + videoItem.publishTimeText ?? '', maxLines: 1, style: TextStyle( fontWeight: FontWeight.w400, @@ -235,24 +142,20 @@ class VideoContent extends StatelessWidget { overflow: TextOverflow.clip, ), ), - // Row( - // children: [ - // if (showView) ...[ - // StatView( - // theme: 'gray', - // view: videoItem.stat.view as int, - // ), - // const SizedBox(width: 8), - // ], - // if (showDanmaku) - // StatDanMu( - // theme: 'gray', - // danmu: videoItem.stat.danmu as int, - // ), - // const Spacer(), - // if (source == 'normal') const SizedBox(width: 24), - // ], - // ), + const SizedBox(height: 3), + Row( + children: [ + StatView( + theme: 'gray', + view: videoItem.viewContent, + ), + const SizedBox(width: 8), + StatDanMu( + theme: 'gray', + danmu: videoItem.danmaku, + ), + ], + ), ], ), ), diff --git a/lib/common/widgets/video_card_v_member_home.dart b/lib/common/widgets/video_card_v_member_home.dart index 85f8ccad..7101b512 100644 --- a/lib/common/widgets/video_card_v_member_home.dart +++ b/lib/common/widgets/video_card_v_member_home.dart @@ -20,11 +20,6 @@ class VideoCardVMemberHome extends StatelessWidget { this.longPressEnd, }); - bool isStringNumeric(String str) { - RegExp numericRegex = RegExp(r'^\d+$'); - return numericRegex.hasMatch(str); - } - void onPushDetail(heroTag) async { String goto = videoItem.goto ?? ''; switch (goto) { diff --git a/lib/common/widgets/video_popup_menu.dart b/lib/common/widgets/video_popup_menu.dart index c0756e8d..cd77b0b1 100644 --- a/lib/common/widgets/video_popup_menu.dart +++ b/lib/common/widgets/video_popup_menu.dart @@ -9,6 +9,7 @@ import '../../http/video.dart'; import '../../models/home/rcmd/result.dart'; import '../../pages/mine/controller.dart'; import '../../utils/storage.dart'; +import 'package:PiliPalaX/models/space_archive/item.dart'; class VideoCustomAction { String title; @@ -47,211 +48,215 @@ class VideoCustomActions { SmartDialog.showToast(res['msg']); }, ), - VideoCustomAction( - '访问:${videoItem.owner.name}', - 'visit', - Icon(MdiIcons.accountCircleOutline, size: 16), - () async { - Get.toNamed('/member?mid=${videoItem.owner.mid}', arguments: { - // 'face': videoItem.owner.face, - 'heroTag': '${videoItem.owner.mid}', - }); - }, - ), - VideoCustomAction( - '不感兴趣', 'dislike', Icon(MdiIcons.thumbDownOutline, size: 16), + if (videoItem is! Item) + VideoCustomAction( + '访问:${videoItem.owner.name}', + 'visit', + Icon(MdiIcons.accountCircleOutline, size: 16), () async { - String? accessKey = GStorage.localCache - .get(LocalCacheKey.accessKey, defaultValue: {})['value']; - if (accessKey == null || accessKey == "") { - SmartDialog.showToast("请退出账号后重新登录"); - return; - } - if (videoItem is RecVideoItemAppModel) { - RecVideoItemAppModel v = videoItem as RecVideoItemAppModel; - ThreePoint? tp = v.threePoint; - if (tp == null) { - SmartDialog.showToast("未能获取threePoint"); - return; - } - if (tp.dislikeReasons == null && tp.feedbacks == null) { - SmartDialog.showToast("未能获取dislikeReasons或feedbacks"); - return; - } - Widget actionButton(DislikeReason? r, FeedbackReason? f) { - return ElevatedButton( - style: ElevatedButton.styleFrom( - padding: - const EdgeInsets.symmetric(horizontal: 12.0, vertical: 0.0), - ), - onPressed: () async { - SmartDialog.showLoading(msg: '正在提交'); - var res = await VideoHttp.feedDislike( - reasonId: r?.id, - feedbackId: f?.id, - id: v.param!, - goto: v.goto!, - ); - SmartDialog.dismiss(); - SmartDialog.showToast( - res['status'] ? (r?.toast ?? f?.toast) : res['msg']); - Get.back(); - }, - child: Text(r?.name ?? f?.name ?? '未知'), - ); - } - - await showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: const Text('请选择'), - content: SingleChildScrollView( - child: Column( - children: [ - if (tp.dislikeReasons != null) - const Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Text('我不想看'), - ), - if (tp.dislikeReasons != null) - Wrap( - spacing: 5.0, - runSpacing: 2.0, - children: tp.dislikeReasons!.map((item) { - return actionButton(item, null); - }).toList(), - ), - if (tp.feedbacks != null) - const Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Text('反馈'), - ), - if (tp.feedbacks != null) - Wrap( - spacing: 5.0, - runSpacing: 2.0, - children: tp.feedbacks!.map((item) { - return actionButton(null, item); - }).toList(), - ), - //分割线 - const Divider(), - ElevatedButton( - onPressed: () async { - SmartDialog.showLoading(msg: '正在提交'); - var res = await VideoHttp.feedDislikeCancel( - // reasonId: r?.id, - // feedbackId: f?.id, - id: v.param!, - goto: v.goto!, - ); - SmartDialog.dismiss(); - SmartDialog.showToast( - res['status'] ? "成功" : res['msg']); - Get.back(); - }, - child: const Text("撤销"), - ), - ], - ), - ), - ); - }, - ); - } else { - await showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: const Text('点踩该视频?'), - content: SingleChildScrollView( - child: Column( - children: [ - const SizedBox(height: 5), - const Text("web端暂不支持精细选择"), - const SizedBox(height: 5), - Wrap( - spacing: 5.0, - runSpacing: 2.0, - children: [ - ElevatedButton( - onPressed: () async { - SmartDialog.showLoading(msg: '正在提交'); - var res = await VideoHttp.dislikeVideo( - bvid: videoItem.bvid as String, type: true); - SmartDialog.dismiss(); - SmartDialog.showToast( - res['status'] ? "点踩成功" : res['msg']); - Get.back(); - }, - child: const Text("点踩"), - ), - ElevatedButton( - onPressed: () async { - SmartDialog.showLoading(msg: '正在提交'); - var res = await VideoHttp.dislikeVideo( - bvid: videoItem.bvid as String, type: false); - SmartDialog.dismiss(); - SmartDialog.showToast( - res['status'] ? "取消踩" : res['msg']); - Get.back(); - }, - child: const Text("撤销"), - ), - ], - ) - ], - ), - ), - ); - }, - ); - } - }), - VideoCustomAction('拉黑:${videoItem.owner.name}', 'block', - Icon(MdiIcons.cancel, size: 16), () async { - await showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: const Text('提示'), - content: - Text('确定拉黑:${videoItem.owner.name}(${videoItem.owner.mid})?' - '\n\n注:被拉黑的Up可以在隐私设置-黑名单管理中解除'), - actions: [ - TextButton( - onPressed: () => Get.back(), - child: Text( - '点错了', - style: - TextStyle(color: Theme.of(context).colorScheme.outline), - ), - ), - TextButton( - onPressed: () async { - var res = await VideoHttp.relationMod( - mid: videoItem.owner.mid, - act: 5, - reSrc: 11, - ); - List blackMidsList = GStorage.localCache - .get(LocalCacheKey.blackMidsList, defaultValue: [-1]) - .map((i) => i as int) - .toList(); - blackMidsList.insert(0, videoItem.owner.mid); - GStorage.localCache - .put(LocalCacheKey.blackMidsList, blackMidsList); - Get.back(); - SmartDialog.showToast(res['msg'] ?? '成功'); - }, - child: const Text('确认'), - ) - ], - ); + Get.toNamed('/member?mid=${videoItem.owner.mid}', arguments: { + // 'face': videoItem.owner.face, + 'heroTag': '${videoItem.owner.mid}', + }); }, - ); - }), + ), + if (videoItem is! Item) + VideoCustomAction( + '不感兴趣', 'dislike', Icon(MdiIcons.thumbDownOutline, size: 16), + () async { + String? accessKey = GStorage.localCache + .get(LocalCacheKey.accessKey, defaultValue: {})['value']; + if (accessKey == null || accessKey == "") { + SmartDialog.showToast("请退出账号后重新登录"); + return; + } + if (videoItem is RecVideoItemAppModel) { + RecVideoItemAppModel v = videoItem as RecVideoItemAppModel; + ThreePoint? tp = v.threePoint; + if (tp == null) { + SmartDialog.showToast("未能获取threePoint"); + return; + } + if (tp.dislikeReasons == null && tp.feedbacks == null) { + SmartDialog.showToast("未能获取dislikeReasons或feedbacks"); + return; + } + Widget actionButton(DislikeReason? r, FeedbackReason? f) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, vertical: 0.0), + ), + onPressed: () async { + SmartDialog.showLoading(msg: '正在提交'); + var res = await VideoHttp.feedDislike( + reasonId: r?.id, + feedbackId: f?.id, + id: v.param!, + goto: v.goto!, + ); + SmartDialog.dismiss(); + SmartDialog.showToast( + res['status'] ? (r?.toast ?? f?.toast) : res['msg']); + Get.back(); + }, + child: Text(r?.name ?? f?.name ?? '未知'), + ); + } + + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('请选择'), + content: SingleChildScrollView( + child: Column( + children: [ + if (tp.dislikeReasons != null) + const Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Text('我不想看'), + ), + if (tp.dislikeReasons != null) + Wrap( + spacing: 5.0, + runSpacing: 2.0, + children: tp.dislikeReasons!.map((item) { + return actionButton(item, null); + }).toList(), + ), + if (tp.feedbacks != null) + const Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Text('反馈'), + ), + if (tp.feedbacks != null) + Wrap( + spacing: 5.0, + runSpacing: 2.0, + children: tp.feedbacks!.map((item) { + return actionButton(null, item); + }).toList(), + ), + //分割线 + const Divider(), + ElevatedButton( + onPressed: () async { + SmartDialog.showLoading(msg: '正在提交'); + var res = await VideoHttp.feedDislikeCancel( + // reasonId: r?.id, + // feedbackId: f?.id, + id: v.param!, + goto: v.goto!, + ); + SmartDialog.dismiss(); + SmartDialog.showToast( + res['status'] ? "成功" : res['msg']); + Get.back(); + }, + child: const Text("撤销"), + ), + ], + ), + ), + ); + }, + ); + } else { + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('点踩该视频?'), + content: SingleChildScrollView( + child: Column( + children: [ + const SizedBox(height: 5), + const Text("web端暂不支持精细选择"), + const SizedBox(height: 5), + Wrap( + spacing: 5.0, + runSpacing: 2.0, + children: [ + ElevatedButton( + onPressed: () async { + SmartDialog.showLoading(msg: '正在提交'); + var res = await VideoHttp.dislikeVideo( + bvid: videoItem.bvid as String, type: true); + SmartDialog.dismiss(); + SmartDialog.showToast( + res['status'] ? "点踩成功" : res['msg']); + Get.back(); + }, + child: const Text("点踩"), + ), + ElevatedButton( + onPressed: () async { + SmartDialog.showLoading(msg: '正在提交'); + var res = await VideoHttp.dislikeVideo( + bvid: videoItem.bvid as String, + type: false); + SmartDialog.dismiss(); + SmartDialog.showToast( + res['status'] ? "取消踩" : res['msg']); + Get.back(); + }, + child: const Text("撤销"), + ), + ], + ) + ], + ), + ), + ); + }, + ); + } + }), + if (videoItem is! Item) + VideoCustomAction('拉黑:${videoItem.owner.name}', 'block', + Icon(MdiIcons.cancel, size: 16), () async { + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('提示'), + content: + Text('确定拉黑:${videoItem.owner.name}(${videoItem.owner.mid})?' + '\n\n注:被拉黑的Up可以在隐私设置-黑名单管理中解除'), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text( + '点错了', + style: TextStyle( + color: Theme.of(context).colorScheme.outline), + ), + ), + TextButton( + onPressed: () async { + var res = await VideoHttp.relationMod( + mid: videoItem.owner.mid, + act: 5, + reSrc: 11, + ); + List blackMidsList = GStorage.localCache + .get(LocalCacheKey.blackMidsList, defaultValue: [-1]) + .map((i) => i as int) + .toList(); + blackMidsList.insert(0, videoItem.owner.mid); + GStorage.localCache + .put(LocalCacheKey.blackMidsList, blackMidsList); + Get.back(); + SmartDialog.showToast(res['msg'] ?? '成功'); + }, + child: const Text('确认'), + ) + ], + ); + }, + ); + }), VideoCustomAction( "${MineController.anonymity ? '退出' : '进入'}无痕模式", 'anonymity', diff --git a/lib/http/init.dart b/lib/http/init.dart index 1a8324d4..943f1d1e 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -212,7 +212,7 @@ class Request { data: { 'message': await ApiInterceptor.dioError(e) }, // 将自定义 Map 数据赋值给 Response 的 data 属性 - statusCode: 200, + statusCode: -1, requestOptions: RequestOptions(), ); return errResponse; @@ -241,7 +241,7 @@ class Request { data: { 'message': await ApiInterceptor.dioError(e) }, // 将自定义 Map 数据赋值给 Response 的 data 属性 - statusCode: 200, + statusCode: -1, requestOptions: RequestOptions(), ); return errResponse; diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart index d84fc2d5..d3a47d4d 100644 --- a/lib/pages/bangumi/introduction/view.dart +++ b/lib/pages/bangumi/introduction/view.dart @@ -76,7 +76,7 @@ class _BangumiIntroPanelState extends State bangumiDetail: null, cid: cid, showEpisodes: widget.showEpisodes, - showIntroDetail: widget.showIntroDetail, + showIntroDetail: () {}, ), Success() => BangumiInfo( heroTag: widget.heroTag, diff --git a/lib/pages/bangumi/introduction/widgets/intro_detail.dart b/lib/pages/bangumi/introduction/widgets/intro_detail.dart index 23b23585..4620124a 100644 --- a/lib/pages/bangumi/introduction/widgets/intro_detail.dart +++ b/lib/pages/bangumi/introduction/widgets/intro_detail.dart @@ -49,7 +49,7 @@ class IntroDetail extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( + SelectableText( bangumiDetail!.title, style: const TextStyle( fontSize: 16, @@ -97,7 +97,7 @@ class IntroDetail extends StatelessWidget { style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 4), - Text( + SelectableText( '${bangumiDetail!.evaluate!}', style: smallTitle.copyWith(fontSize: 13), ), @@ -107,7 +107,7 @@ class IntroDetail extends StatelessWidget { style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 4), - Text( + SelectableText( bangumiDetail.actors, style: smallTitle.copyWith(fontSize: 13), ), diff --git a/lib/pages/bangumi/widgets/bangumi_panel.dart b/lib/pages/bangumi/widgets/bangumi_panel.dart index 2638561a..e3c2c0a8 100644 --- a/lib/pages/bangumi/widgets/bangumi_panel.dart +++ b/lib/pages/bangumi/widgets/bangumi_panel.dart @@ -1,3 +1,4 @@ +import 'package:PiliPalaX/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -129,8 +130,8 @@ class _BangumiPanelState extends State { ), child: Text( widget.newEp?['desc']?.contains('连载') == true - ? '连载中,更新至第${widget.newEp?['title']}话' - : '全${widget.newEp?['title']}话', + ? '连载中,更新至${Utils.isStringNumeric(widget.newEp['title']) ? '第${widget.newEp?['title']}话' : '${widget.newEp?['title']}'}' + : '全${widget.pages.length}话', style: const TextStyle(fontSize: 13), ), ), diff --git a/lib/pages/member/new/content/member_contribute/content/video/member_video.dart b/lib/pages/member/new/content/member_contribute/content/video/member_video.dart index 009de1ca..61722d40 100644 --- a/lib/pages/member/new/content/member_contribute/content/video/member_video.dart +++ b/lib/pages/member/new/content/member_contribute/content/video/member_video.dart @@ -130,7 +130,6 @@ class _MemberVideoState extends State } return VideoCardHMemberVideo( videoItem: loadingState.response[index], - showPubdate: true, ); }, childCount: loadingState.response.length, diff --git a/lib/pages/setting/sponsor_block_page.dart b/lib/pages/setting/sponsor_block_page.dart index d1ab37b2..7f472fce 100644 --- a/lib/pages/setting/sponsor_block_page.dart +++ b/lib/pages/setting/sponsor_block_page.dart @@ -7,6 +7,7 @@ import 'package:PiliPalaX/pages/video/detail/controller.dart' show SegmentType, SegmentTypeExt, SkipType, SkipTypeExt; import 'package:PiliPalaX/utils/storage.dart'; import 'package:PiliPalaX/utils/utils.dart'; +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; @@ -57,7 +58,20 @@ class _SponsorBlockPageState extends State { ); _checkServerStatus() { - Request().get('$_blockServer/api/status').then((res) { + Request() + .get( + '$_blockServer/api/status', + options: Options( + headers: { + 'env': '', + 'app-key': '', + 'x-bili-mid': '', + 'x-bili-aurora-eid': '', + 'x-bili-aurora-zone': '', + }, + ), + ) + .then((res) { if (res.data is Map) { setState(() { _serverStatus = res.data['uptime'] != null; diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 57be3418..fd1f92c9 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'dart:math'; import 'package:PiliPalaX/common/constants.dart'; import 'package:PiliPalaX/common/widgets/icon_button.dart'; +import 'package:PiliPalaX/common/widgets/loading_widget.dart'; import 'package:PiliPalaX/common/widgets/pair.dart'; import 'package:PiliPalaX/common/widgets/segment_progress_bar.dart'; import 'package:PiliPalaX/http/danmaku.dart'; @@ -1045,7 +1046,7 @@ class VideoDetailController extends GetxController iconButton( context: context, size: 26, - tooltip: '使用当前位置', + tooltip: '使用当前位置时间', icon: Icons.my_location, onPressed: () { setState(() { @@ -1204,6 +1205,7 @@ class VideoDetailController extends GetxController iconButton( context: context, size: 26, + tooltip: '移除', icon: Icons.clear, onPressed: () { setState(() { @@ -1365,7 +1367,7 @@ class VideoDetailController extends GetxController ) ], ) - : null, + : errorWidget(), ); }, ); diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 09234c81..197501ad 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -26,6 +26,11 @@ import 'package:url_launcher/url_launcher.dart'; class Utils { static final Random random = Random(); + static bool isStringNumeric(str) { + RegExp numericRegex = RegExp(r'^\d+$'); + return numericRegex.hasMatch(str.toString()); + } + static ReplyInfo replyCast(res) { Map? emote = res['content']['emote']; emote?.forEach((key, value) {