From fbc1288defa9996b94563eaa491afe4de131e30c Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 27 Oct 2024 18:31:28 +0800 Subject: [PATCH] opt: bangumi progress --- lib/http/api.dart | 7 ++- lib/http/bangumi.dart | 28 +++++++++++- lib/models/bangumi/list.dart | 7 ++- lib/pages/bangumi/controller.dart | 4 +- .../bangumi/introduction/controller.dart | 43 +++++++------------ lib/pages/bangumi/view.dart | 11 +++-- lib/pages/bangumi/widgets/bangumu_card_v.dart | 1 + lib/utils/route_push.dart | 7 ++- 8 files changed, 66 insertions(+), 42 deletions(-) diff --git a/lib/http/api.dart b/lib/http/api.dart index 04983339..2bd83d69 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -301,10 +301,6 @@ class Api { static const String bangumiList = '/pgc/season/index/result?st=1&order=3&season_version=-1&spoken_language_type=-1&area=-1&is_finish=-1©right=-1&season_status=-1&season_month=-1&year=-1&style_id=-1&sort=0&season_type=1&pagesize=20&type=1'; - // 我的订阅 - static const String bangumiFollow = - '/x/space/bangumi/follow/list?type=1&follow_status=0&pn=1&ps=15&ts=1691544359969'; - // 黑名单 static const String blackLst = '/x/relation/blacks'; @@ -607,4 +603,7 @@ class Api { /// 更新追番状态 static const String updateBangumiStatus = '/pgc/web/follow/status/update'; + + /// 番剧点赞投币收藏状态 + static const String bangumiActionStatus = '/pgc/season/episode/community'; } diff --git a/lib/http/bangumi.dart b/lib/http/bangumi.dart index e9ccce96..d0c052d6 100644 --- a/lib/http/bangumi.dart +++ b/lib/http/bangumi.dart @@ -21,8 +21,19 @@ class BangumiHttp { } } - static Future bangumiFollow({int? mid}) async { - var res = await Request().get(Api.bangumiFollow, data: {'vmid': mid}); + static Future getRecentBangumi({ + int? mid, + int type = 1, + int pn = 1, + int ps = 20, + }) async { + var res = await Request().get(Api.getRecentBangumiApi, data: { + 'vmid': mid, + 'type': type, + 'follow_status': 0, + 'pn': pn, + 'ps': ps, + }); if (res.data['code'] == 0) { return { 'status': true, @@ -81,4 +92,17 @@ class BangumiHttp { }; } } + + // 获取番剧点赞投币收藏状态 + static Future bangumiActionStatus({required int epId}) async { + var res = await Request().get( + Api.bangumiActionStatus, + data: {'ep_id': epId}, + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'data': [], 'msg': res.data['message']}; + } + } } diff --git a/lib/models/bangumi/list.dart b/lib/models/bangumi/list.dart index fe71bb61..df20fa3b 100644 --- a/lib/models/bangumi/list.dart +++ b/lib/models/bangumi/list.dart @@ -47,6 +47,7 @@ class BangumiListItemModel { this.title, this.titleIcon, this.progress, + this.progressIndex, }); String? badge; @@ -66,8 +67,8 @@ class BangumiListItemModel { String? subTitle; String? title; String? titleIcon; - String? progress; + int? progressIndex; BangumiListItemModel.fromJson(Map json) { badge = json['badge'] == '' ? null : json['badge']; @@ -87,7 +88,9 @@ class BangumiListItemModel { subTitle = json['sub_title']; title = json['title']; titleIcon = json['title_icon']; - progress = json['progress']; + progressIndex = int.parse( + RegExp(r'第(\d+)话').firstMatch(json['progress'] ?? '第1话')?.group(1) ?? + '0'); } } diff --git a/lib/pages/bangumi/controller.dart b/lib/pages/bangumi/controller.dart index e5748d6c..29dd15d1 100644 --- a/lib/pages/bangumi/controller.dart +++ b/lib/pages/bangumi/controller.dart @@ -9,6 +9,7 @@ class BangumiController extends GetxController { final ScrollController scrollController = ScrollController(); RxList bangumiList = [].obs; RxList bangumiFollowList = [].obs; + RxInt total = 0.obs; int _currentPage = 1; bool isLoadingMore = true; Box userInfoCache = GStrorage.userInfo; @@ -54,9 +55,10 @@ class BangumiController extends GetxController { if (userInfo == null) { return; } - var result = await BangumiHttp.bangumiFollow(mid: userInfo.mid); + var result = await BangumiHttp.getRecentBangumi(mid: userInfo.mid); if (result['status']) { bangumiFollowList.value = result['data'].list; + total.value = result['data'].total; } else {} return result; } diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart index f2d7807e..dc173a57 100644 --- a/lib/pages/bangumi/introduction/controller.dart +++ b/lib/pages/bangumi/introduction/controller.dart @@ -79,12 +79,8 @@ class BangumiIntroController extends GetxController { // 获取番剧简介&选集 Future queryBangumiIntro() async { if (userLogin) { - // 获取点赞状态 - queryHasLikeVideo(); - // 获取投币状态 - queryHasCoinVideo(); - // 获取收藏状态 - queryHasFavVideo(); + // 获取点赞投币收藏状态 + bangumiActionStatus(); } var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId); if (result['status']) { @@ -94,26 +90,15 @@ class BangumiIntroController extends GetxController { return result; } - // 获取点赞状态 - Future queryHasLikeVideo() async { - var result = await VideoHttp.hasLikeVideo(bvid: bvid); - // data num 被点赞标志 0:未点赞 1:已点赞 - hasLike.value = result["data"] == 1 ? true : false; - } - - // 获取投币状态 - Future queryHasCoinVideo() async { - var result = await VideoHttp.hasCoinVideo(bvid: bvid); - hasCoin.value = result["data"]['multiply'] == 0 ? false : true; - } - - // 获取收藏状态 - Future queryHasFavVideo() async { - var result = await VideoHttp.hasFavVideo(aid: IdUtils.bv2av(bvid)); + // 获取番剧点赞投币收藏状态 + Future bangumiActionStatus() async { + var result = await BangumiHttp.bangumiActionStatus(epId: epId!); if (result['status']) { - hasFav.value = result["data"]['favoured']; + hasLike.value = result['data']['like'] == 1; + hasCoin.value = result['data']['coin_number'] != 0; + hasFav.value = result['data']['favorite'] == 1; } else { - hasFav.value = false; + SmartDialog.showToast(result['msg']); } } @@ -121,7 +106,7 @@ class BangumiIntroController extends GetxController { Future actionLikeVideo() async { var result = await VideoHttp.likeVideo(bvid: bvid, type: !hasLike.value); if (result['status']) { - SmartDialog.showToast(!hasLike.value ? '点赞成功 👍' : '取消赞'); + SmartDialog.showToast(!hasLike.value ? '点赞成功' : '取消赞'); hasLike.value = !hasLike.value; bangumiDetail.value.stat!['likes'] = bangumiDetail.value.stat!['likes'] + (!hasLike.value ? 1 : -1); @@ -158,7 +143,7 @@ class BangumiIntroController extends GetxController { var res = await VideoHttp.coinVideo( bvid: bvid, multiply: _tempThemeValue); if (res['status']) { - SmartDialog.showToast('投币成功 👏'); + SmartDialog.showToast('投币成功'); hasCoin.value = true; bangumiDetail.value.stat!['coins'] = bangumiDetail.value.stat!['coins'] + @@ -196,9 +181,11 @@ class BangumiIntroController extends GetxController { addMediaIdsNew = []; delMediaIdsNew = []; // 重新获取收藏状态 - queryHasFavVideo(); - SmartDialog.showToast('✅ 操作成功'); + bangumiActionStatus(); + SmartDialog.showToast('操作成功'); Get.back(); + } else { + SmartDialog.showToast(result['msg']); } } diff --git a/lib/pages/bangumi/view.dart b/lib/pages/bangumi/view.dart index 4092943b..f1f8d279 100644 --- a/lib/pages/bangumi/view.dart +++ b/lib/pages/bangumi/view.dart @@ -76,9 +76,14 @@ class _BangumiPageState extends State child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - '最近追番', - style: Theme.of(context).textTheme.titleMedium, + Obx( + () => 0 != _bangumidController.total.value + ? Text( + '我的追番(${_bangumidController.total.value})', + style: + Theme.of(context).textTheme.titleMedium, + ) + : const SizedBox(), ), IconButton( onPressed: () { diff --git a/lib/pages/bangumi/widgets/bangumu_card_v.dart b/lib/pages/bangumi/widgets/bangumu_card_v.dart index 10d95a1c..19aa4d88 100644 --- a/lib/pages/bangumi/widgets/bangumu_card_v.dart +++ b/lib/pages/bangumi/widgets/bangumu_card_v.dart @@ -25,6 +25,7 @@ class BangumiCardV extends StatelessWidget { RoutePush.bangumiPush( bangumiItem.seasonId, null, + progressIndex: bangumiItem.progressIndex, heroTag: heroTag, ); }, diff --git a/lib/utils/route_push.dart b/lib/utils/route_push.dart index e639327d..9254da2a 100644 --- a/lib/utils/route_push.dart +++ b/lib/utils/route_push.dart @@ -8,7 +8,7 @@ import 'package:pilipala/utils/utils.dart'; class RoutePush { // 番剧跳转 static Future bangumiPush(int? seasonId, int? epId, - {String? heroTag}) async { + {String? heroTag, int? progressIndex}) async { SmartDialog.showLoading(msg: '获取中...'); try { var result = await SearchHttp.bangumiInfo(seasonId: seasonId, epId: epId); @@ -19,7 +19,10 @@ class RoutePush { return; } final BangumiInfoModel bangumiDetail = result['data']; - final EpisodeItem episode = bangumiDetail.episodes!.first; + EpisodeItem episode = bangumiDetail.episodes!.first; + if (progressIndex != null && progressIndex >= 1) { + episode = bangumiDetail.episodes![progressIndex - 1]; + } final int epId = episode.id!; final int cid = episode.cid!; final String bvid = episode.bvid!;