diff --git a/lib/common/widgets/video_card/video_card_h.dart b/lib/common/widgets/video_card/video_card_h.dart index 7c1f9cfd..bf6afbc8 100644 --- a/lib/common/widgets/video_card/video_card_h.dart +++ b/lib/common/widgets/video_card/video_card_h.dart @@ -97,18 +97,20 @@ class VideoCardH extends StatelessWidget { } } try { - final int cid = videoItem.cid ?? + final int? cid = videoItem.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); - if (source == 'later') { - onViewLater!(cid); - } else { - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'videoItem': videoItem, - 'heroTag': Utils.makeHeroTag(aid) - }, - ); + if (cid != null) { + if (source == 'later') { + onViewLater!(cid); + } else { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'videoItem': videoItem, + 'heroTag': Utils.makeHeroTag(aid) + }, + ); + } } } catch (err) { SmartDialog.showToast(err.toString()); diff --git a/lib/http/search.dart b/lib/http/search.dart index 5150cda9..101c0c5d 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -159,22 +159,25 @@ class SearchHttp { } } - static Future ab2c({dynamic aid, dynamic bvid, int? part}) async { - Map data = {}; - if (aid != null) { - data['aid'] = aid; - } else if (bvid != null) { - data['bvid'] = bvid; - } - var res = await Request().get(Api.ab2c, queryParameters: data); + static Future ab2c({dynamic aid, dynamic bvid, int? part}) async { + var res = await Request().get( + Api.ab2c, + queryParameters: { + if (aid != null) 'aid': aid, + if (bvid != null) 'bvid': bvid, + }, + ); if (res.data['code'] == 0) { - return part != null - ? ((res.data['data'] as List).getOrNull(part - 1)?['cid'] ?? - res.data['data'].first['cid']) - : res.data['data'].first['cid']; + if (res.data['data'] case List list) { + return part != null + ? (list.getOrNull(part - 1)?['cid'] ?? list.firstOrNull?['cid']) + : list.firstOrNull?['cid']; + } else { + return null; + } } else { SmartDialog.showToast("ab2c error: ${res.data['message']}"); - return -1; + return null; } } diff --git a/lib/models/user/fav_detail.dart b/lib/models/user/fav_detail.dart index dcbd9acd..ac0192d3 100644 --- a/lib/models/user/fav_detail.dart +++ b/lib/models/user/fav_detail.dart @@ -59,8 +59,8 @@ class FavDetailItemData extends BaseVideoItemModel with MultiSelectData { } } - static final _digitRegExp = RegExp(r'\d+'); - String resolveEpId(String url) => _digitRegExp.firstMatch(url)!.group(0)!; + static final _digitRegExp = RegExp(r'ep(\d+)'); + String? resolveEpId(String url) => _digitRegExp.firstMatch(url)?.group(1); } class Ogv { diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index 89fd0dc9..e066f496 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -218,13 +218,15 @@ TextSpan? richNode( recognizer: TapGestureRecognizer() ..onTap = () async { try { - int cid = await SearchHttp.ab2c(bvid: i.rid); - PageUtils.toVideoPage( - 'bvid=${i.rid}&cid=$cid', - arguments: { - 'heroTag': Utils.makeHeroTag(i.rid), - }, - ); + int? cid = await SearchHttp.ab2c(bvid: i.rid); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=${i.rid}&cid=$cid', + arguments: { + 'heroTag': Utils.makeHeroTag(i.rid), + }, + ); + } } catch (err) { SmartDialog.showToast(err.toString()); } diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index e4c9bc06..5febf7c6 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -546,7 +546,7 @@ class _EpisodePanelState extends CommonSlidePageState { ? Icons.notifications_off_outlined : Icons.notifications_active_outlined, onPressed: () async { - dynamic result = await VideoHttp.seasonFav( + var result = await VideoHttp.seasonFav( isFav: response, seasonId: widget.seasonId, ); diff --git a/lib/pages/fav_detail/widget/fav_video_card.dart b/lib/pages/fav_detail/widget/fav_video_card.dart index 0a83511d..73e33ea6 100644 --- a/lib/pages/fav_detail/widget/fav_video_card.dart +++ b/lib/pages/fav_detail/widget/fav_video_card.dart @@ -4,15 +4,11 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; -import 'package:PiliPlus/http/search.dart'; -import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/user/fav_detail.dart'; -import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; // 收藏视频卡片 - 水平布局 @@ -36,8 +32,6 @@ class FavVideoCardH extends StatelessWidget { @override Widget build(BuildContext context) { - int id = videoItem.id!; - String bvid = videoItem.bvid ?? IdUtils.av2bv(id); return InkWell( onTap: isSort == true ? null @@ -46,26 +40,21 @@ class FavVideoCardH extends StatelessWidget { onTap!(); return; } - String? epId; - if (videoItem.type == 24) { - videoItem.cid = await SearchHttp.ab2c(bvid: bvid); - dynamic seasonId = videoItem.ogv!.seasonId; - epId = videoItem.epId; - PageUtils.viewBangumi(seasonId: seasonId, epId: epId); - return; - } else if (videoItem.page == 0 || videoItem.page! > 1) { - var result = await VideoHttp.videoIntro(bvid: bvid); - if (result['status']) { - epId = result['data'].epId; - } else { - SmartDialog.showToast(result['msg']); - } - } if (!const [0, 16].contains(videoItem.attr)) { Get.toNamed('/member?mid=${videoItem.owner.mid}'); return; } + + // pgc + if (videoItem.type == 24) { + PageUtils.viewBangumi( + seasonId: videoItem.ogv!.seasonId, + epId: videoItem.epId, + ); + return; + } + onViewFav?.call(); }, onLongPress: isSort == true diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index 60e29853..9ec9cfe1 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -76,15 +76,17 @@ class HistoryItem extends StatelessWidget { if (epid != null) { PageUtils.viewBangumi(epId: epid); } else { - int cid = videoItem.history.cid ?? + int? cid = videoItem.history.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'heroTag': Utils.makeHeroTag(cid), - 'pic': videoItem.cover, - }, - ); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'heroTag': Utils.makeHeroTag(cid), + 'pic': videoItem.cover, + }, + ); + } } } else { SmartDialog.showToast(result['msg']); @@ -95,15 +97,17 @@ class HistoryItem extends StatelessWidget { } } } else { - int cid = videoItem.history.cid ?? + int? cid = videoItem.history.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'heroTag': Utils.makeHeroTag(aid), - 'pic': videoItem.cover, - }, - ); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'heroTag': Utils.makeHeroTag(aid), + 'pic': videoItem.cover, + }, + ); + } } }, onLongPress: () { diff --git a/lib/pages/history_search/controller.dart b/lib/pages/history_search/controller.dart index de56c168..efebdaea 100644 --- a/lib/pages/history_search/controller.dart +++ b/lib/pages/history_search/controller.dart @@ -30,7 +30,7 @@ class HistorySearchController loadingState ..value.data!.removeAt(index) ..refresh(); - SmartDialog.showToast(res['msg']); } + SmartDialog.showToast(res['msg']); } } diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index a10c0824..f3732c71 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -346,15 +346,8 @@ class _LiveRoomPageState extends State : Row( children: [ GestureDetector( - onTap: () { - dynamic uid = roomInfoH5.roomInfo?.uid; - Get.toNamed( - '/member?mid=$uid', - arguments: { - 'heroTag': Utils.makeHeroTag(uid), - }, - ); - }, + onTap: () => Get.toNamed( + '/member?mid=${roomInfoH5.roomInfo?.uid}'), child: NetworkImgLayer( width: 34, height: 34, diff --git a/lib/pages/member_coin/widgets/item.dart b/lib/pages/member_coin/widgets/item.dart index 1b87f877..7c7c4b6d 100644 --- a/lib/pages/member_coin/widgets/item.dart +++ b/lib/pages/member_coin/widgets/item.dart @@ -34,15 +34,17 @@ class MemberCoinsItem extends StatelessWidget { } } } - int cid = + int? cid = await SearchHttp.ab2c(aid: coinItem.aid, bvid: coinItem.bvid); - PageUtils.toVideoPage( - 'bvid=${coinItem.bvid}&cid=$cid', - arguments: { - 'videoItem': coinItem, - 'heroTag': Utils.makeHeroTag(coinItem.aid) - }, - ); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=${coinItem.bvid}&cid=$cid', + arguments: { + 'videoItem': coinItem, + 'heroTag': Utils.makeHeroTag(coinItem.aid) + }, + ); + } }, onLongPress: () => imageSaveDialog( title: coinItem.title, diff --git a/lib/pages/member_video/controller.dart b/lib/pages/member_video/controller.dart index 63f1abe2..a442c4ac 100644 --- a/lib/pages/member_video/controller.dart +++ b/lib/pages/member_video/controller.dart @@ -147,35 +147,37 @@ class MemberVideoCtr if (list.isNullOrEmpty) return; if (episodicButton.value.text == '继续播放') { - dynamic oid = RegExp(r'oid=([\d]+)') + String? oid = RegExp(r'oid=(\d+)') .firstMatch('${episodicButton.value.uri}') ?.group(1); - dynamic bvid = IdUtils.av2bv(int.tryParse(oid) ?? 0); - dynamic cid = await SearchHttp.ab2c(aid: oid, bvid: bvid); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'heroTag': Utils.makeHeroTag(oid), - 'sourceType': 'archive', - 'mediaId': seasonId ?? seriesId ?? mid, - 'oid': oid, - 'favTitle': - '$username: ${title ?? episodicButton.value.text ?? '播放全部'}', - if (seriesId == null) 'count': count.value, - if (seasonId != null || seriesId != null) - 'mediaType': RegExp(r'page_type=([\d]+)') + if (oid != null) { + var bvid = IdUtils.av2bv(int.parse(oid)); + var cid = await SearchHttp.ab2c(aid: oid, bvid: bvid); + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'heroTag': Utils.makeHeroTag(oid), + 'sourceType': 'archive', + 'mediaId': seasonId ?? seriesId ?? mid, + 'oid': oid, + 'favTitle': + '$username: ${title ?? episodicButton.value.text ?? '播放全部'}', + if (seriesId == null) 'count': count.value, + if (seasonId != null || seriesId != null) + 'mediaType': RegExp(r'page_type=([\d]+)') + .firstMatch('${episodicButton.value.uri}') + ?.group(1), + 'desc': RegExp(r'desc=([\d]+)') + .firstMatch('${episodicButton.value.uri}') + ?.group(1) == + '1', + 'sortField': RegExp(r'sort_field=([\d]+)') .firstMatch('${episodicButton.value.uri}') ?.group(1), - 'desc': RegExp(r'desc=([\d]+)') - .firstMatch('${episodicButton.value.uri}') - ?.group(1) == - '1', - 'sortField': RegExp(r'sort_field=([\d]+)') - .firstMatch('${episodicButton.value.uri}') - ?.group(1), - 'isContinuePlaying': true, - }, - ); + 'isContinuePlaying': true, + }, + ); + } return; } diff --git a/lib/pages/subscription_detail/widget/sub_video_card.dart b/lib/pages/subscription_detail/widget/sub_video_card.dart index 9f2b1086..4c433eaf 100644 --- a/lib/pages/subscription_detail/widget/sub_video_card.dart +++ b/lib/pages/subscription_detail/widget/sub_video_card.dart @@ -28,15 +28,17 @@ class SubVideoCardH extends StatelessWidget { String bvid = videoItem.bvid!; return InkWell( onTap: () async { - int cid = await SearchHttp.ab2c(bvid: bvid); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'videoItem': videoItem, - 'heroTag': Utils.makeHeroTag(id), - 'videoType': SearchType.video, - }, - ); + int? cid = await SearchHttp.ab2c(bvid: bvid); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'videoItem': videoItem, + 'heroTag': Utils.makeHeroTag(id), + 'videoType': SearchType.video, + }, + ); + } }, onLongPress: () => imageSaveDialog( title: videoItem.title, diff --git a/lib/pages/video/medialist/view.dart b/lib/pages/video/medialist/view.dart index 63cbb480..bd496159 100644 --- a/lib/pages/video/medialist/view.dart +++ b/lib/pages/video/medialist/view.dart @@ -164,9 +164,11 @@ class _MediaListPanelState String bvid = item.bvid!; int? aid = item.aid; String cover = item.cover ?? ''; - final int cid = + final int? cid = item.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); - widget.changeMediaList?.call(bvid, cid, aid, cover); + if (cid != null) { + widget.changeMediaList?.call(bvid, cid, aid, cover); + } }, onLongPress: () => imageSaveDialog( title: item.title, diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 72538564..ab04727f 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -2160,7 +2160,7 @@ class _VideoDetailPageVState extends State ..cid.refresh(); } else { // switch to first episode - dynamic episode = videoIntroController.videoDetail.value.ugcSeason! + var episode = videoIntroController.videoDetail.value.ugcSeason! .sections![videoDetailController.seasonIndex.value].episodes!.first; if (episode.cid != videoDetailController.cid.value) { changeEpisode(episode); @@ -2182,7 +2182,7 @@ class _VideoDetailPageVState extends State videoDetailController.cid.refresh(); } else { // switch to first episode - dynamic episode = videoIntroController.videoDetail.value.pages!.first; + var episode = videoIntroController.videoDetail.value.pages!.first; if (episode.cid != videoDetailController.cid.value) { changeEpisode(episode); } else { diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index 6443a083..faf2749a 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -291,15 +291,17 @@ class ChatItem extends StatelessWidget { String bvid = match.group(0)!; try { SmartDialog.showLoading(); - final int cid = await SearchHttp.ab2c(bvid: bvid); + final int? cid = await SearchHttp.ab2c(bvid: bvid); SmartDialog.dismiss(); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'pic': i['cover_url'], - 'heroTag': Utils.makeHeroTag(bvid), - }, - ); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'pic': i['cover_url'], + 'heroTag': Utils.makeHeroTag(bvid), + }, + ); + } } catch (err) { SmartDialog.dismiss(); SmartDialog.showToast(err.toString()); @@ -378,15 +380,17 @@ class ChatItem extends StatelessWidget { try { SmartDialog.showLoading(); var bvid = content["bvid"]; - final int cid = await SearchHttp.ab2c(bvid: bvid); + final int? cid = await SearchHttp.ab2c(bvid: bvid); SmartDialog.dismiss(); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'pic': content['thumb'], - 'heroTag': Utils.makeHeroTag(bvid), - }, - ); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'pic': content['thumb'], + 'heroTag': Utils.makeHeroTag(bvid), + }, + ); + } } catch (err) { SmartDialog.dismiss(); SmartDialog.showToast(err.toString()); @@ -460,15 +464,17 @@ class ChatItem extends StatelessWidget { } bvid ??= IdUtils.av2bv(aid); SmartDialog.showLoading(); - final int cid = await SearchHttp.ab2c(bvid: bvid); + final int? cid = await SearchHttp.ab2c(bvid: bvid); SmartDialog.dismiss(); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'pic': content['thumb'], - 'heroTag': Utils.makeHeroTag(bvid), - }, - ); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'pic': content['thumb'], + 'heroTag': Utils.makeHeroTag(bvid), + }, + ); + } }; break; diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index 1289758e..ab48982d 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -624,19 +624,21 @@ class PiliScheme { ?.group(1); if (bvid != null) { if (mediaId != null) { - final int cid = await SearchHttp.ab2c(bvid: bvid); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'heroTag': Utils.makeHeroTag(bvid), - 'sourceType': 'playlist', - 'favTitle': '播放列表', - 'mediaId': mediaId, - 'mediaType': 3, - 'desc': true, - 'isContinuePlaying': true, - }, - ); + final int? cid = await SearchHttp.ab2c(bvid: bvid); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'heroTag': Utils.makeHeroTag(bvid), + 'sourceType': 'playlist', + 'favTitle': '播放列表', + 'mediaId': mediaId, + 'mediaType': 3, + 'desc': true, + 'isContinuePlaying': true, + }, + ); + } } else { videoPush(null, bvid, off: off); } @@ -852,7 +854,7 @@ class PiliScheme { if (showDialog) { SmartDialog.showLoading(msg: '获取中...'); } - final int cid = await SearchHttp.ab2c( + final int? cid = await SearchHttp.ab2c( bvid: bvid, aid: aid, part: part != null ? int.tryParse(part) : null, @@ -860,16 +862,18 @@ class PiliScheme { if (showDialog) { SmartDialog.dismiss(); } - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'pic': null, - 'heroTag': Utils.makeHeroTag(aid), - if (progress != null) 'progress': int.tryParse(progress), - }, - off: off, - preventDuplicates: false, - ); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'pic': null, + 'heroTag': Utils.makeHeroTag(aid), + if (progress != null) 'progress': int.tryParse(progress), + }, + off: off, + preventDuplicates: false, + ); + } } catch (e) { SmartDialog.dismiss(); SmartDialog.showToast('video获取失败: $e'); diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index 63100a46..94ac96f4 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -393,15 +393,17 @@ class PageUtils { try { String bvid = item.modules.moduleDynamic!.major!.archive!.bvid!; String cover = item.modules.moduleDynamic!.major!.archive!.cover!; - int cid = await SearchHttp.ab2c(bvid: bvid); - toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'pic': cover, - 'heroTag': Utils.makeHeroTag(bvid), - }, - preventDuplicates: false, - ); + int? cid = await SearchHttp.ab2c(bvid: bvid); + if (cid != null) { + toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'pic': cover, + 'heroTag': Utils.makeHeroTag(bvid), + }, + preventDuplicates: false, + ); + } } catch (err) { SmartDialog.showToast(err.toString()); } @@ -456,15 +458,17 @@ class PageUtils { int aid = ugcSeason.aid!; String bvid = IdUtils.av2bv(aid); String cover = ugcSeason.cover!; - int cid = await SearchHttp.ab2c(bvid: bvid); - toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'pic': cover, - 'heroTag': Utils.makeHeroTag(bvid), - }, - preventDuplicates: false, - ); + int? cid = await SearchHttp.ab2c(bvid: bvid); + if (cid != null) { + toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'pic': cover, + 'heroTag': Utils.makeHeroTag(bvid), + }, + preventDuplicates: false, + ); + } break; /// 番剧查看 diff --git a/lib/utils/url_utils.dart b/lib/utils/url_utils.dart index e6442c23..4f896c14 100644 --- a/lib/utils/url_utils.dart +++ b/lib/utils/url_utils.dart @@ -49,15 +49,17 @@ class UrlUtils { int? aid = matchRes['AV']; String? bvid = matchRes['BV']; bvid ??= IdUtils.av2bv(aid!); - final int cid = await SearchHttp.ab2c(aid: aid, bvid: bvid); - PageUtils.toVideoPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'pic': '', - 'heroTag': Utils.makeHeroTag(bvid), - }, - preventDuplicates: false, - ); + final int? cid = await SearchHttp.ab2c(aid: aid, bvid: bvid); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'pic': '', + 'heroTag': Utils.makeHeroTag(bvid), + }, + preventDuplicates: false, + ); + } } else { if (redirectUrl.isNotEmpty) { PageUtils.handleWebview(redirectUrl);