diff --git a/lib/common/widgets/video_card/video_card_h.dart b/lib/common/widgets/video_card/video_card_h.dart index 940159cce..fa1249180 100644 --- a/lib/common/widgets/video_card/video_card_h.dart +++ b/lib/common/widgets/video_card/video_card_h.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/models/common/stat_type.dart'; import 'package:PiliPlus/models/model_hot_video_item.dart'; import 'package:PiliPlus/models/model_video.dart'; import 'package:PiliPlus/models/search/result.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; @@ -92,30 +93,35 @@ class VideoCardH extends StatelessWidget { } return; } + + Dimension? dimension; if (videoItem case final HotVideoItemModel item) { if (item.redirectUrl?.isNotEmpty == true && PageUtils.viewPgcFromUri(item.redirectUrl!)) { return; } + dimension = item.dimension; } - try { - final int? cid = - videoItem.cid ?? - await SearchHttp.ab2c( + int? cid = videoItem.cid; + if (cid == null) { + if (await SearchHttp.ab2cWithDimension( aid: videoItem.aid, bvid: videoItem.bvid, - ); - if (cid != null) { - PageUtils.toVideoPage( - bvid: videoItem.bvid, - cid: cid, - cover: videoItem.cover, - title: videoItem.title, - ); + ) + case final res?) { + cid = res.cid; + dimension = res.dimension; } - } catch (err) { - SmartDialog.showToast(err.toString()); + } + if (cid != null) { + PageUtils.toVideoPage( + bvid: videoItem.bvid, + cid: cid, + cover: videoItem.cover, + title: videoItem.title, + dimension: dimension, + ); } }, child: Padding( diff --git a/lib/common/widgets/video_card/video_card_v.dart b/lib/common/widgets/video_card/video_card_v.dart index 915a67208..7c998f794 100644 --- a/lib/common/widgets/video_card/video_card_v.dart +++ b/lib/common/widgets/video_card/video_card_v.dart @@ -6,9 +6,10 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/common/widgets/video_popup_menu.dart'; import 'package:PiliPlus/http/search.dart'; -import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/stat_type.dart'; +import 'package:PiliPlus/models/home/rcmd/result.dart'; import 'package:PiliPlus/models/model_rec_video_item.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; @@ -31,17 +32,28 @@ class VideoCardV extends StatelessWidget { this.onRemove, }); - Future onPushDetail(String heroTag) async { - String? goto = videoItem.goto; - switch (goto) { + Future onPushDetail() async { + switch (videoItem.goto) { case 'bangumi': PageUtils.viewPgc(epId: videoItem.param!); break; case 'av': - String bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid!); - int? cid = - videoItem.cid ?? - await SearchHttp.ab2c(aid: videoItem.aid, bvid: bvid); + var bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid!); + var cid = videoItem.cid; + bool isVertical = false; + Dimension? dimension; + if (videoItem is RcmdVideoItemAppModel) { + if (videoItem.uri case final uri?) { + isVertical = Utils.getDimensionFromUri(uri); + } + } + if (cid == null) { + if (await SearchHttp.ab2cWithDimension(aid: videoItem.aid, bvid: bvid) + case final res?) { + cid = res.cid; + dimension = res.dimension; + } + } if (cid != null) { PageUtils.toVideoPage( aid: videoItem.aid, @@ -49,6 +61,8 @@ class VideoCardV extends StatelessWidget { cid: cid, cover: videoItem.cover, title: videoItem.title, + isVertical: isVertical, + dimension: dimension, ); } break; @@ -80,7 +94,7 @@ class VideoCardV extends StatelessWidget { Card( clipBehavior: Clip.hardEdge, child: InkWell( - onTap: () => onPushDetail(Utils.makeHeroTag(videoItem.aid)), + onTap: onPushDetail, onLongPress: onLongPress, onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress, child: Column( @@ -105,8 +119,8 @@ class VideoCardV extends StatelessWidget { PBadge( bottom: 6, right: 7, - size: PBadgeSize.small, - type: PBadgeType.gray, + size: .small, + type: .gray, text: DurationUtils.formatDuration( videoItem.duration, ), @@ -163,31 +177,31 @@ class VideoCardV extends StatelessWidget { PBadge( text: videoItem.pgcBadge, isStack: false, - size: PBadgeSize.small, - type: PBadgeType.line_primary, + size: .small, + type: .line_primary, fontSize: 9, ), if (videoItem.rcmdReason != null) PBadge( text: videoItem.rcmdReason, isStack: false, - size: PBadgeSize.small, - type: PBadgeType.secondary, + size: .small, + type: .secondary, ), if (videoItem.goto == 'picture') const PBadge( text: '动态', isStack: false, - size: PBadgeSize.small, - type: PBadgeType.line_primary, + size: .small, + type: .line_primary, fontSize: 9, ), if (videoItem.isFollowed) const PBadge( text: '已关注', isStack: false, - size: PBadgeSize.small, - type: PBadgeType.secondary, + size: .small, + type: .secondary, ), Expanded( flex: 1, diff --git a/lib/http/search.dart b/lib/http/search.dart index c458050eb..a36367154 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/models_new/dynamic/dyn_topic_pub_search/data.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/models_new/search/search_rcmd/data.dart'; import 'package:PiliPlus/models_new/search/search_trending/data.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:dio/dio.dart'; @@ -172,6 +173,14 @@ abstract final class SearchHttp { } static Future ab2c({dynamic aid, dynamic bvid, int? part}) async { + return (await ab2cWithDimension(aid: aid, bvid: bvid, part: part))?.cid; + } + + static Future<({int? cid, Dimension? dimension})?> ab2cWithDimension({ + dynamic aid, + dynamic bvid, + int? part, + }) async { final res = await Request().get( Api.ab2c, queryParameters: { @@ -181,13 +190,19 @@ abstract final class SearchHttp { ); if (res.data['code'] == 0) { if (res.data['data'] case List list) { - return part != null - ? (list.elementAtOrNull(part - 1)?['cid'] ?? - list.firstOrNull?['cid']) - : list.firstOrNull?['cid']; - } else { - return null; + final target = part != null + ? (list.elementAtOrNull(part - 1) ?? list.firstOrNull) + : list.firstOrNull; + if (target != null) { + return ( + cid: target['cid'] as int?, + dimension: target['dimension'] == null + ? null + : Dimension.fromJson(target['dimension']), + ); + } } + return null; } else { SmartDialog.showToast("ab2c error: ${res.data['message']}"); return null; diff --git a/lib/models/model_hot_video_item.dart b/lib/models/model_hot_video_item.dart index dcdccec6e..ddb685ae6 100644 --- a/lib/models/model_hot_video_item.dart +++ b/lib/models/model_hot_video_item.dart @@ -38,7 +38,9 @@ class HotVideoItemModel extends BaseRcmdVideoItemModel with MultiSelectData { duration = json["duration"]; owner = Owner.fromJson(json["owner"]); stat = HotStat.fromJson(json['stat']); - dimension = Dimension.fromJson(json['dimension']); + dimension = json['dimension'] == null + ? null + : Dimension.fromJson(json['dimension']); firstFrame = json["first_frame"]; pubLocation = json["pub_location"]; dynamic rcmd = json['rcmd_reason']; diff --git a/lib/models_new/download/bili_download_entry_info.dart b/lib/models_new/download/bili_download_entry_info.dart index 24fa47aa6..dc4a02963 100644 --- a/lib/models_new/download/bili_download_entry_info.dart +++ b/lib/models_new/download/bili_download_entry_info.dart @@ -95,6 +95,7 @@ class BiliDownloadEntryInfo with MultiSelectData { epId: ep?.episodeId, title: title, cover: cover, + isVertical: pageData?.isVertical ?? false, ); }, ), @@ -262,6 +263,8 @@ class PageInfo { bool get cacheWidth => width <= height; + bool get isVertical => rotate == 1 ? width > height : height > width; + PageInfo({ required this.cid, required this.page, diff --git a/lib/models_new/video/video_detail/dimension.dart b/lib/models_new/video/video_detail/dimension.dart index 5f83c037e..989a0e996 100644 --- a/lib/models_new/video/video_detail/dimension.dart +++ b/lib/models_new/video/video_detail/dimension.dart @@ -9,10 +9,21 @@ class Dimension { return null; } + bool get isVertical => + width != null && height != null ? height! > width! : false; + Dimension({this.width, this.height}); - factory Dimension.fromJson(Map json) => Dimension( - width: json['width'] as int?, - height: json['height'] as int?, - ); + Dimension.fromJson(Map json) { + if (json['rotate'] == 1) { + width = json['height'] as int?; + height = json['width'] as int?; + } else { + width = json['width'] as int?; + height = json['height'] as int?; + } + } + + @override + String toString() => 'width: $width, height: $height'; } diff --git a/lib/pages/download/detail/widgets/item.dart b/lib/pages/download/detail/widgets/item.dart index 5223eb925..e50e453d0 100644 --- a/lib/pages/download/detail/widgets/item.dart +++ b/lib/pages/download/detail/widgets/item.dart @@ -126,6 +126,7 @@ class DetailItem extends StatelessWidget { cid: cid!, cover: entry.cover, title: entry.showTitle, + isVertical: entry.pageData?.isVertical ?? false, extraArguments: { 'sourceType': SourceType.file, 'entry': entry, diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index e76366667..c79f7ce79 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -247,11 +247,15 @@ TextSpan? richNode( recognizer: NoDeadlineTapGestureRecognizer() ..onTap = () async { try { - int? cid = await SearchHttp.ab2c(bvid: i.rid); + final res = await SearchHttp.ab2cWithDimension( + bvid: i.rid, + ); + final cid = res?.cid; if (cid != null) { PageUtils.toVideoPage( bvid: i.rid, cid: cid, + dimension: res!.dimension, ); } } catch (err) { diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index 8f23ec9d9..c22f21756 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -213,6 +213,7 @@ class FavDetailController @override void onViewFav(FavDetailItemModel item, int? index) { final folder = folderInfo.value; + // TODO: dimension PageUtils.toVideoPage( bvid: item.bvid, cid: item.ugc!.firstCid!, diff --git a/lib/pages/fav_search/controller.dart b/lib/pages/fav_search/controller.dart index deb26fcd7..d84371f40 100644 --- a/lib/pages/fav_search/controller.dart +++ b/lib/pages/fav_search/controller.dart @@ -46,6 +46,7 @@ class FavSearchController } @override + // TODO: dimension void onViewFav(FavDetailItemModel item, int? index) => PageUtils.toVideoPage( bvid: item.bvid, cid: item.ugc!.firstCid!, diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index 08c9cf149..6b1316602 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -8,6 +8,7 @@ import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models_new/history/list.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/pages/common/multi_select/base.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; @@ -79,20 +80,28 @@ class HistoryItem extends StatelessWidget { ); } } else { - int? cid = - item.history.cid ?? - await SearchHttp.ab2c( - aid: aid, - bvid: bvid, - part: item.history.page, - ); + int? cid = item.history.cid; + Dimension? dimension; + if (cid == null) { + if (await SearchHttp.ab2cWithDimension( + aid: aid, + bvid: bvid, + part: item.history.page, + ) + case final res?) { + cid = res.cid; + dimension = res.dimension; + } + } if (cid != null) { + // TODO: dimension PageUtils.toVideoPage( aid: aid, bvid: bvid, cid: cid, cover: item.cover, title: item.title, + dimension: dimension, ); } } diff --git a/lib/pages/later/child_view.dart b/lib/pages/later/child_view.dart index 02b84140e..05fe42216 100644 --- a/lib/pages/later/child_view.dart +++ b/lib/pages/later/child_view.dart @@ -84,6 +84,7 @@ class _LaterViewChildPageState extends State cid: cid, cover: videoItem.pic, title: videoItem.title, + dimension: videoItem.dimension, extraArguments: _baseCtr.isPlayAll.value ? { 'oid': videoItem.aid, diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart index afb51c7ea..b69415e53 100644 --- a/lib/pages/later/controller.dart +++ b/lib/pages/later/controller.dart @@ -170,6 +170,7 @@ class LaterController extends MultiSelectController cid: item.cid!, cover: item.pic, title: item.title, + dimension: item.dimension, extraArguments: { 'sourceType': SourceType.watchLater, 'count': baseCtr.counts[LaterViewType.all.index], diff --git a/lib/pages/later/widgets/video_card_h_later.dart b/lib/pages/later/widgets/video_card_h_later.dart index f4cad6b69..3edc47229 100644 --- a/lib/pages/later/widgets/video_card_h_later.dart +++ b/lib/pages/later/widgets/video_card_h_later.dart @@ -63,7 +63,7 @@ class VideoCardHLater extends StatelessWidget { return; } try { - final int? cid = + final cid = videoItem.cid ?? await SearchHttp.ab2c( aid: videoItem.aid, diff --git a/lib/pages/later_search/view.dart b/lib/pages/later_search/view.dart index e142abd11..8f2f3737b 100644 --- a/lib/pages/later_search/view.dart +++ b/lib/pages/later_search/view.dart @@ -79,6 +79,7 @@ class _LaterSearchPageState cid: cid, cover: item.pic, title: item.title, + dimension: item.dimension, extraArguments: { 'oid': item.aid, 'sourceType': SourceType.watchLater, diff --git a/lib/pages/member_coin_arc/widgets/item.dart b/lib/pages/member_coin_arc/widgets/item.dart index 58bdea785..5b0625d3f 100644 --- a/lib/pages/member_coin_arc/widgets/item.dart +++ b/lib/pages/member_coin_arc/widgets/item.dart @@ -42,13 +42,15 @@ class MemberCoinLikeItem extends StatelessWidget { } if (item.param != null) { - int? cid = await SearchHttp.ab2c(aid: item.param); + final res = await SearchHttp.ab2cWithDimension(aid: item.param); + final cid = res?.cid; if (cid != null) { PageUtils.toVideoPage( aid: int.parse(item.param!), cid: cid, cover: item.cover, title: item.title, + dimension: res!.dimension, ); } } diff --git a/lib/pages/member_home/widgets/video_card_v_member_home.dart b/lib/pages/member_home/widgets/video_card_v_member_home.dart index 24aa8ae48..7b3edc6a2 100644 --- a/lib/pages/member_home/widgets/video_card_v_member_home.dart +++ b/lib/pages/member_home/widgets/video_card_v_member_home.dart @@ -6,6 +6,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models_new/space/space_archive/item.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/id_utils.dart'; @@ -44,13 +45,22 @@ class VideoCardVMemberHome extends StatelessWidget { } bvid ??= IdUtils.av2bv(int.parse(aid!)); - int? cid = videoItem.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); + int? cid = videoItem.cid; + Dimension? dimension; + if (cid == null) { + if (await SearchHttp.ab2cWithDimension(aid: aid, bvid: bvid) + case final res?) { + cid = res.cid; + dimension = res.dimension; + } + } if (cid != null) { PageUtils.toVideoPage( bvid: bvid, cid: cid, cover: videoItem.cover, title: videoItem.title, + dimension: dimension, ); } break; diff --git a/lib/pages/member_search/child/view.dart b/lib/pages/member_search/child/view.dart index 1a4cf5bf6..aa9583572 100644 --- a/lib/pages/member_search/child/view.dart +++ b/lib/pages/member_search/child/view.dart @@ -78,6 +78,7 @@ class _MemberSearchChildPageState extends State if (index == response.length - 1) { _controller.onLoadMore(); } + // TODO: dimension return VideoCardH( videoItem: response[index], ); diff --git a/lib/pages/member_video/controller.dart b/lib/pages/member_video/controller.dart index f4c620118..9ed2bb834 100644 --- a/lib/pages/member_video/controller.dart +++ b/lib/pages/member_video/controller.dart @@ -13,6 +13,7 @@ import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; +import 'package:PiliPlus/utils/utils.dart'; import 'package:get/get.dart'; class MemberVideoCtr @@ -152,12 +153,14 @@ class MemberVideoCtr String? oid = params['oid']; if (oid != null) { final bvid = IdUtils.av2bv(int.parse(oid)); - final cid = await SearchHttp.ab2c(aid: oid, bvid: bvid); + final res = await SearchHttp.ab2cWithDimension(aid: oid, bvid: bvid); + final cid = res?.cid; if (cid != null) { PageUtils.toVideoPage( aid: int.parse(oid), bvid: bvid, cid: cid, + dimension: res!.dimension, extraArguments: { 'sourceType': SourceType.archive, 'mediaId': seasonId ?? seriesId ?? mid, @@ -190,11 +193,16 @@ class MemberVideoCtr (isVideo ? order == .click : sort == .asc) ? !desc : desc; + bool isVertical = false; + if (element.uri case final uri?) { + isVertical = Utils.getDimensionFromUri(uri); + } PageUtils.toVideoPage( bvid: element.bvid, cid: element.cid!, cover: element.cover, title: element.title, + isVertical: isVertical, extraArguments: { 'sourceType': SourceType.archive, 'mediaId': seasonId ?? seriesId ?? mid, diff --git a/lib/pages/member_video/widgets/video_card_h_member_video.dart b/lib/pages/member_video/widgets/video_card_h_member_video.dart index e187acc6b..fe48040b6 100644 --- a/lib/pages/member_video/widgets/video_card_h_member_video.dart +++ b/lib/pages/member_video/widgets/video_card_h_member_video.dart @@ -13,8 +13,8 @@ import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide LayoutBuilder; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; // 视频卡片 - 水平布局 class VideoCardHMemberVideo extends StatelessWidget { @@ -62,16 +62,17 @@ class VideoCardHMemberVideo extends StatelessWidget { if (videoItem.bvid == null || videoItem.cid == null) { return; } - try { - PageUtils.toVideoPage( - bvid: videoItem.bvid, - cid: videoItem.cid!, - cover: videoItem.cover, - title: videoItem.title, - ); - } catch (err) { - SmartDialog.showToast(err.toString()); + bool isVertical = false; + if (videoItem.uri case final uri?) { + isVertical = Utils.getDimensionFromUri(uri); } + PageUtils.toVideoPage( + bvid: videoItem.bvid, + cid: videoItem.cid!, + cover: videoItem.cover, + title: videoItem.title, + isVertical: isVertical, + ); }, child: Padding( padding: const EdgeInsets.symmetric( diff --git a/lib/pages/member_video_web/base/view.dart b/lib/pages/member_video_web/base/view.dart index a476c194e..fc9aebbac 100644 --- a/lib/pages/member_video_web/base/view.dart +++ b/lib/pages/member_video_web/base/view.dart @@ -99,6 +99,7 @@ abstract class BaseVideoWebState< if (index == response.length - 1) { controller.onLoadMore(); } + // TODO: dimension return VideoCardH(videoItem: response[index]); }, ), diff --git a/lib/pages/music/widget/music_video_card_h.dart b/lib/pages/music/widget/music_video_card_h.dart index 3ee2757d1..b9cc60891 100644 --- a/lib/pages/music/widget/music_video_card_h.dart +++ b/lib/pages/music/widget/music_video_card_h.dart @@ -9,6 +9,7 @@ import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/stat_type.dart'; import 'package:PiliPlus/models_new/music/bgm_recommend_list.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; @@ -33,14 +34,22 @@ class MusicVideoCardH extends StatelessWidget { type: MaterialType.transparency, child: InkWell( onTap: () async { - int? cid = - videoItem.cid ?? await SearchHttp.ab2c(bvid: videoItem.bvid); + int? cid = videoItem.cid; + Dimension? dimension; + if (cid == null) { + if (await SearchHttp.ab2cWithDimension(bvid: videoItem.bvid) + case final res?) { + cid = res.cid; + dimension = res.dimension; + } + } if (cid != null) { PageUtils.toVideoPage( bvid: videoItem.bvid, cid: cid, cover: videoItem.cover, title: videoItem.title, + dimension: dimension, ); } }, diff --git a/lib/pages/popular_precious/view.dart b/lib/pages/popular_precious/view.dart index aee184759..9ae434881 100644 --- a/lib/pages/popular_precious/view.dart +++ b/lib/pages/popular_precious/view.dart @@ -57,6 +57,7 @@ class _PopularPreciousPageState extends State PageUtils.toVideoPage( bvid: item.bvid, cid: item.cid!, + dimension: item.dimension, extraArguments: { 'sourceType': SourceType.playlist, 'favTitle': '入站必刷', diff --git a/lib/pages/popular_series/view.dart b/lib/pages/popular_series/view.dart index a36b5a13a..937e9aa1b 100644 --- a/lib/pages/popular_series/view.dart +++ b/lib/pages/popular_series/view.dart @@ -72,6 +72,7 @@ class _PopularSeriesPageState extends State with GridMixin { PageUtils.toVideoPage( bvid: item.bvid, cid: item.cid!, + dimension: item.dimension, extraArguments: { 'sourceType': SourceType.playlist, 'favTitle': '每周必看 ${config?.label ?? ''}', diff --git a/lib/pages/subscription_detail/widget/sub_video_card.dart b/lib/pages/subscription_detail/widget/sub_video_card.dart index fb1d99cd5..99826c9b9 100644 --- a/lib/pages/subscription_detail/widget/sub_video_card.dart +++ b/lib/pages/subscription_detail/widget/sub_video_card.dart @@ -36,13 +36,15 @@ class SubVideoCardH extends StatelessWidget { type: MaterialType.transparency, child: InkWell( onTap: () async { - int? cid = await SearchHttp.ab2c(bvid: videoItem.bvid); + final res = await SearchHttp.ab2cWithDimension(bvid: videoItem.bvid); + final cid = res?.cid; if (cid != null) { PageUtils.toVideoPage( bvid: videoItem.bvid, cid: cid, cover: videoItem.cover, title: videoItem.title, + dimension: res!.dimension, ); } }, diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 56f1c78c0..0f5c3a966 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -166,7 +166,7 @@ class VideoDetailController extends GetxController PlayerStatus? playerStatus; late final scrollKey = GlobalKey(); - late final RxBool isVertical = false.obs; + late final RxBool isVertical; late final RxDouble scrollRatio = 0.0.obs; ScrollController? _scrollCtr; ScrollController get scrollCtr => @@ -326,6 +326,7 @@ class VideoDetailController extends GetxController pgcType = args['pgcType']; heroTag = args['heroTag']; cover = RxString(args['cover'] ?? ''); + isVertical = RxBool(args['isVertical'] ?? false); sourceType = args['sourceType'] ?? SourceType.normal; isFileSource = sourceType == SourceType.file; diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index 9af3f0fa3..866caeb2f 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -15,6 +15,7 @@ import 'package:PiliPlus/models/common/video/source_type.dart'; import 'package:PiliPlus/models_new/member_card_info/data.dart'; import 'package:PiliPlus/models_new/relation/data.dart'; import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/models_new/video/video_detail/episode.dart'; import 'package:PiliPlus/models_new/video/video_detail/page.dart'; import 'package:PiliPlus/models_new/video/video_detail/section.dart'; @@ -485,22 +486,33 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { try { final String bvid = episode.bvid ?? this.bvid; final int aid = episode.aid ?? IdUtils.bv2av(bvid); - final int? cid = - episode.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); + int? cid = episode.cid; + Dimension? dimension; + if (cid == null) { + if (await SearchHttp.ab2cWithDimension(aid: aid, bvid: bvid) + case final res?) { + cid = res.cid; + dimension = res.dimension; + } + } if (cid == null) { return false; } + final String? cover = episode.cover; // 重新获取视频资源 - if (videoDetailCtr.isPlayAll) { if (videoDetailCtr.mediaList.indexWhere((item) => item.bvid == bvid) == -1) { + if (dimension == null && episode is EpisodeItem) { + dimension = episode.page?.dimension; + } PageUtils.toVideoPage( bvid: bvid, cid: cid, cover: cover, + dimension: dimension, ); return false; } diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index 3ca6b7442..d87b0922c 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -328,13 +328,17 @@ class ChatItem extends StatelessWidget { if (bvid != null) { try { SmartDialog.showLoading(); - final int? cid = await SearchHttp.ab2c(bvid: bvid); + final res = await SearchHttp.ab2cWithDimension( + bvid: bvid, + ); + final cid = res?.cid; SmartDialog.dismiss(); if (cid != null) { PageUtils.toVideoPage( bvid: bvid, cid: cid, cover: i['cover_url'], + dimension: res!.dimension, ); } } catch (err) { @@ -420,13 +424,17 @@ class ChatItem extends StatelessWidget { try { SmartDialog.showLoading(); final bvid = content["bvid"]; - final int? cid = await SearchHttp.ab2c(bvid: bvid); + final res = await SearchHttp.ab2cWithDimension( + bvid: bvid, + ); + final cid = res?.cid; SmartDialog.dismiss(); if (cid != null) { PageUtils.toVideoPage( bvid: bvid, cid: cid, cover: content['cover'], + dimension: res!.dimension, ); } } catch (err) { @@ -518,7 +526,10 @@ class ChatItem extends StatelessWidget { } bvid ??= IdUtils.av2bv(aid); SmartDialog.showLoading(); - final int? cid = await SearchHttp.ab2c(bvid: bvid); + final res = await SearchHttp.ab2cWithDimension( + bvid: bvid, + ); + final cid = res?.cid; SmartDialog.dismiss(); if (cid != null) { PageUtils.toVideoPage( @@ -526,6 +537,7 @@ class ChatItem extends StatelessWidget { bvid: bvid, cid: cid, cover: content['thumb'], + dimension: res!.dimension, ); } }; diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index 8d9214895..334340417 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -617,11 +617,13 @@ abstract final class PiliScheme { IdUtils.bvRegex.firstMatch(path)?.group(0); if (bvid != null) { if (mediaId != null) { - final int? cid = await SearchHttp.ab2c(bvid: bvid); + final res = await SearchHttp.ab2cWithDimension(bvid: bvid); + final cid = res?.cid; if (cid != null) { PageUtils.toVideoPage( bvid: bvid, cid: cid, + dimension: res!.dimension, extraArguments: { 'sourceType': SourceType.playlist, 'favTitle': '播放列表', @@ -877,11 +879,12 @@ abstract final class PiliScheme { if (showDialog) { SmartDialog.showLoading(msg: '获取中...'); } - final int? cid = await SearchHttp.ab2c( + final res = await SearchHttp.ab2cWithDimension( bvid: bvid, aid: aid, part: part != null ? int.tryParse(part) : null, ); + final cid = res?.cid; if (showDialog) { SmartDialog.dismiss(); } @@ -892,6 +895,7 @@ abstract final class PiliScheme { cid: cid, progress: progress, off: off, + dimension: res!.dimension, ); } } catch (e) { diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index b32c336e2..3ed12e32a 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -11,6 +11,7 @@ import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/models/common/video/video_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart'; +import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/pages/common/common_intro_controller.dart'; import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/contact/view.dart'; @@ -271,12 +272,14 @@ abstract final class PageUtils { try { String bvid = archive.bvid!; String cover = archive.cover!; - int? cid = await SearchHttp.ab2c(bvid: bvid); + final res = await SearchHttp.ab2cWithDimension(bvid: bvid); + final cid = res?.cid; if (cid != null) { toVideoPage( bvid: bvid, cid: cid, cover: cover, + dimension: res!.dimension, ); } } catch (err) { @@ -330,13 +333,15 @@ abstract final class PageUtils { int aid = ugcSeason.aid!; String bvid = IdUtils.av2bv(aid); String cover = ugcSeason.cover!; - int? cid = await SearchHttp.ab2c(bvid: bvid); + final res = await SearchHttp.ab2cWithDimension(bvid: bvid); + final cid = res?.cid; if (cid != null) { toVideoPage( aid: aid, bvid: bvid, cid: cid, cover: cover, + dimension: res!.dimension, ); } break; @@ -554,6 +559,8 @@ abstract final class PageUtils { int? progress, // milliseconds Map? extraArguments, bool off = false, + bool isVertical = false, + Dimension? dimension, }) { final arguments = { 'aid': aid ?? IdUtils.bv2av(bvid!), @@ -566,6 +573,7 @@ abstract final class PageUtils { 'title': ?title, 'progress': ?progress, 'videoType': videoType, + 'isVertical': dimension?.isVertical ?? isVertical, 'heroTag': Utils.makeHeroTag(cid), ...?extraArguments, }; diff --git a/lib/utils/url_utils.dart b/lib/utils/url_utils.dart index 67f9fce9a..a6f50d42d 100644 --- a/lib/utils/url_utils.dart +++ b/lib/utils/url_utils.dart @@ -49,12 +49,14 @@ abstract final class UrlUtils { final aid = matchRes.av; String? bvid = matchRes.bv; bvid ??= IdUtils.av2bv(aid!); - final int? cid = await SearchHttp.ab2c(aid: aid, bvid: bvid); + final res = await SearchHttp.ab2cWithDimension(aid: aid, bvid: bvid); + final cid = res?.cid; if (cid != null) { PageUtils.toVideoPage( aid: aid, bvid: bvid, cid: cid, + dimension: res!.dimension, ); } } else { diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index fd9b537ca..6e15a5b4a 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -33,6 +33,17 @@ abstract final class Utils { _ => color, }; + static bool getDimensionFromUri(String uri) { + try { + final params = Uri.parse(uri).queryParameters; + final width = int.parse(params['player_width']!); + final height = int.parse(params['player_height']!); + return params['player_rotate'] == '1' ? width > height : height > width; + } catch (_) { + return false; + } + } + static String themeUrl(bool isDark) => 'native.theme=${isDark ? 2 : 1}&night=${isDark ? 1 : 0}';