Merge branch 'feature-bangumi'

This commit is contained in:
guozhigq
2023-08-05 21:16:08 +08:00
6 changed files with 93 additions and 37 deletions

View File

@ -69,7 +69,8 @@ class UserHttp {
'keyword': keyword, 'keyword': keyword,
'order': order, 'order': order,
'type': 0, 'type': 0,
'tid': 0 'tid': 0,
'platform': 'web'
}); });
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
FavDetailData data = FavDetailData.fromJson(res.data['data']); FavDetailData data = FavDetailData.fromJson(res.data['data']);

View File

@ -41,9 +41,10 @@ class FavDetailItemData {
this.bvId, this.bvId,
this.bvid, this.bvid,
// this.season, // this.season,
// this.ogv, this.ogv,
this.stat, this.stat,
this.cid, this.cid,
this.epId,
}); });
int? id; int? id;
@ -62,8 +63,10 @@ class FavDetailItemData {
int? favTime; int? favTime;
String? bvId; String? bvId;
String? bvid; String? bvid;
Map? ogv;
Stat? stat; Stat? stat;
int? cid; int? cid;
String? epId;
FavDetailItemData.fromJson(Map<String, dynamic> json) { FavDetailItemData.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -82,8 +85,22 @@ class FavDetailItemData {
favTime = json['fav_time']; favTime = json['fav_time'];
bvId = json['bv_id']; bvId = json['bv_id'];
bvid = json['bvid']; bvid = json['bvid'];
ogv = json['ogv'];
stat = Stat.fromJson(json['cnt_info']); stat = Stat.fromJson(json['cnt_info']);
cid = json['ugc']['first_cid']; cid = json['ugc'] != null ? json['ugc']['first_cid'] : null;
if (json['link'] != null && json['link'].contains('/bangumi')) {
epId = resolveEpId(json['link']);
}
}
String resolveEpId(url) {
RegExp regex = RegExp(r'\d+');
Iterable<Match> matches = regex.allMatches(url);
List<String> numbers = [];
for (Match match in matches) {
numbers.add(match.group(0)!);
}
return numbers[0];
} }
} }

View File

@ -153,16 +153,20 @@ class VideoDetailData {
likeIcon = json["like_icon"]; likeIcon = json["like_icon"];
needJumpBv = json["need_jump_bv"]; needJumpBv = json["need_jump_bv"];
if (json['redirect_url'] != null) { if (json['redirect_url'] != null) {
RegExp regex = RegExp(r'\d+'); epId = resolveEpId(json['redirect_url']);
Iterable<Match> matches = regex.allMatches(json['redirect_url']);
List<String> numbers = [];
for (Match match in matches) {
numbers.add(match.group(0)!);
}
epId = numbers[0];
} }
} }
String resolveEpId(url) {
RegExp regex = RegExp(r'\d+');
Iterable<Match> matches = regex.allMatches(url);
List<String> numbers = [];
for (Match match in matches) {
numbers.add(match.group(0)!);
}
return numbers[0];
}
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"bvid": bvid, "bvid": bvid,
"aid": aid, "aid": aid,

View File

@ -96,13 +96,13 @@ class BangumiIntroController extends GetxController {
} }
if (userLogin) { if (userLogin) {
// 获取点赞状态 // 获取点赞状态
// queryHasLikeVideo(); queryHasLikeVideo();
// 获取投币状态 // 获取投币状态
// queryHasCoinVideo(); queryHasCoinVideo();
// 获取收藏状态 // 获取收藏状态
// queryHasFavVideo(); queryHasFavVideo();
// //
// queryFollowStatus(); queryFollowStatus();
} }
return result; return result;
} }
@ -340,9 +340,12 @@ class BangumiIntroController extends GetxController {
videoDetailCtr.cid = cid; videoDetailCtr.cid = cid;
videoDetailCtr.queryVideoUrl(); videoDetailCtr.queryVideoUrl();
// 重新请求评论 // 重新请求评论
VideoReplyController videoReplyCtr = try {
Get.find<VideoReplyController>(tag: Get.arguments['heroTag']); /// 未渲染回复组件时可能异常
videoReplyCtr.aid = aid; VideoReplyController videoReplyCtr =
videoReplyCtr.queryReplyList(type: 'init'); Get.find<VideoReplyController>(tag: Get.arguments['heroTag']);
videoReplyCtr.aid = aid;
videoReplyCtr.queryReplyList(type: 'init');
} catch (_) {}
} }
} }

View File

@ -13,6 +13,7 @@ import 'package:pilipala/pages/bangumi/widgets/bangumi_panel.dart';
import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/pages/video/detail/index.dart';
import 'package:pilipala/pages/video/detail/introduction/widgets/action_item.dart'; import 'package:pilipala/pages/video/detail/introduction/widgets/action_item.dart';
import 'package:pilipala/pages/video/detail/introduction/widgets/action_row_item.dart'; import 'package:pilipala/pages/video/detail/introduction/widgets/action_row_item.dart';
import 'package:pilipala/pages/video/detail/introduction/widgets/fav_panel.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -110,14 +111,14 @@ class _BangumiInfoState extends State<BangumiInfo> {
SmartDialog.showToast('账号未登录'); SmartDialog.showToast('账号未登录');
return; return;
} }
// showModalBottomSheet( showModalBottomSheet(
// context: context, context: context,
// useRootNavigator: true, useRootNavigator: true,
// isScrollControlled: true, isScrollControlled: true,
// builder: (context) { builder: (context) {
// return FavPanel(ctr: videoIntroController); return FavPanel(ctr: bangumiIntroController);
// }, },
// ); );
} }
// 视频介绍 // 视频介绍
@ -356,12 +357,6 @@ class _BangumiInfoState extends State<BangumiInfo> {
? widget.bangumiDetail!.stat!['likes']!.toString() ? widget.bangumiDetail!.stat!['likes']!.toString()
: '-'), : '-'),
), ),
ActionItem(
icon: const Icon(FontAwesomeIcons.clock),
onTap: () => () {},
selectStatus: false,
loadingStatus: widget.loadingStatus,
text: '稍后再看'),
Obx( Obx(
() => ActionItem( () => ActionItem(
icon: const Icon(FontAwesomeIcons.b), icon: const Icon(FontAwesomeIcons.b),
@ -377,7 +372,6 @@ class _BangumiInfoState extends State<BangumiInfo> {
() => ActionItem( () => ActionItem(
icon: const Icon(FontAwesomeIcons.star), icon: const Icon(FontAwesomeIcons.star),
selectIcon: const Icon(FontAwesomeIcons.solidStar), selectIcon: const Icon(FontAwesomeIcons.solidStar),
// onTap: () => videoIntroController.actionFavVideo(),
onTap: () => showFavBottomSheet(), onTap: () => showFavBottomSheet(),
selectStatus: bangumiIntroController.hasFav.value, selectStatus: bangumiIntroController.hasFav.value,
loadingStatus: widget.loadingStatus, loadingStatus: widget.loadingStatus,
@ -385,6 +379,16 @@ class _BangumiInfoState extends State<BangumiInfo> {
? widget.bangumiDetail!.stat!['favorite']!.toString() ? widget.bangumiDetail!.stat!['favorite']!.toString()
: '-'), : '-'),
), ),
ActionItem(
icon: const Icon(FontAwesomeIcons.comment),
selectIcon: const Icon(FontAwesomeIcons.reply),
onTap: () => videoDetailCtr!.tabCtr!.animateTo(1),
selectStatus: false,
loadingStatus: widget.loadingStatus,
text: !widget.loadingStatus
? widget.bangumiDetail!.stat!['reply']!.toString()
: '-',
),
ActionItem( ActionItem(
icon: const Icon(FontAwesomeIcons.shareFromSquare), icon: const Icon(FontAwesomeIcons.shareFromSquare),
onTap: () => bangumiIntroController.actionShareVideo(), onTap: () => bangumiIntroController.actionShareVideo(),

View File

@ -3,6 +3,9 @@ import 'package:flutter/material.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/widgets/stat/danmu.dart'; import 'package:pilipala/common/widgets/stat/danmu.dart';
import 'package:pilipala/common/widgets/stat/view.dart'; import 'package:pilipala/common/widgets/stat/view.dart';
import 'package:pilipala/http/search.dart';
import 'package:pilipala/http/video.dart';
import 'package:pilipala/models/common/search_type.dart';
import 'package:pilipala/utils/id_utils.dart'; import 'package:pilipala/utils/id_utils.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
@ -20,7 +23,7 @@ class FavVideoCardH extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
int id = videoItem.id; int id = videoItem.id;
String bvid = IdUtils.av2bv(id); String bvid = videoItem.bvid ?? IdUtils.av2bv(id);
String heroTag = Utils.makeHeroTag(id); String heroTag = Utils.makeHeroTag(id);
return Dismissible( return Dismissible(
movementDuration: const Duration(milliseconds: 300), movementDuration: const Duration(milliseconds: 300),
@ -44,9 +47,33 @@ class FavVideoCardH extends StatelessWidget {
}, },
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
await Future.delayed(const Duration(milliseconds: 200)); // int? seasonId;
Get.toNamed('/video?bvid=$bvid&cid=${videoItem.cid}', String? epId;
arguments: {'videoItem': videoItem, 'heroTag': heroTag}); if (videoItem.ogv != null && videoItem.ogv['type_name'] == '番剧') {
videoItem.cid = await SearchHttp.ab2c(bvid: bvid);
// seasonId = videoItem.ogv['season_id'];
epId = videoItem.epId;
} else if (videoItem.page == 0 || videoItem.page > 1) {
var result = await VideoHttp.videoIntro(bvid: bvid);
if (result['status']) {
epId = result['data'].epId;
}
}
Map<String, String> parameters = {
'bvid': bvid,
'cid': videoItem.cid.toString(),
'epId': epId ?? '',
};
// if (seasonId != null) {
// parameters['seasonId'] = seasonId.toString();
// }
Get.toNamed('/video', parameters: parameters, arguments: {
'videoItem': videoItem,
'heroTag': heroTag,
'videoType':
epId != null ? SearchType.media_bangumi : SearchType.video,
});
}, },
child: Column( child: Column(
children: [ children: [