diff --git a/analysis_options.yaml b/analysis_options.yaml index 0261e5f1..dcc4a95b 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -7,9 +7,6 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. -analyzer: - errors: - strict_top_level_inference: ignore include: package:flutter_lints/flutter.yaml linter: diff --git a/lib/common/skeleton/media_bangumi.dart b/lib/common/skeleton/media_bangumi.dart index 340f8a4a..681e3524 100644 --- a/lib/common/skeleton/media_bangumi.dart +++ b/lib/common/skeleton/media_bangumi.dart @@ -2,14 +2,14 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/skeleton.dart'; import 'package:flutter/material.dart'; -class MediaBangumiSkeleton extends StatefulWidget { - const MediaBangumiSkeleton({super.key}); +class MediaPgcSkeleton extends StatefulWidget { + const MediaPgcSkeleton({super.key}); @override - State createState() => _MediaBangumiSkeletonState(); + State createState() => _MediaPgcSkeletonState(); } -class _MediaBangumiSkeletonState extends State { +class _MediaPgcSkeletonState extends State { @override Widget build(BuildContext context) { Color bgColor = Theme.of(context).colorScheme.onInverseSurface; diff --git a/lib/common/widgets/video_card/video_card_h.dart b/lib/common/widgets/video_card/video_card_h.dart index cefeb56a..1e965019 100644 --- a/lib/common/widgets/video_card/video_card_h.dart +++ b/lib/common/widgets/video_card/video_card_h.dart @@ -63,7 +63,7 @@ class VideoCardH extends StatelessWidget { onLongPress: onLongPress ?? () => imageSaveDialog( title: videoItem.title, - cover: videoItem.pic, + cover: videoItem.cover, ), onTap: onTap ?? () async { @@ -132,7 +132,7 @@ class VideoCardH extends StatelessWidget { clipBehavior: Clip.none, children: [ NetworkImgLayer( - src: videoItem.pic, + src: videoItem.cover, width: maxWidth, height: maxHeight, ), @@ -219,21 +219,20 @@ class VideoCardH extends StatelessWidget { overflow: TextOverflow.ellipsis, maxLines: 2, TextSpan( - children: [ - for (var i in item.titleList!) - TextSpan( - text: i['text'], - style: TextStyle( - fontSize: theme.textTheme.bodyMedium!.fontSize, - height: 1.42, - letterSpacing: 0.3, - color: i['type'] == 'em' - ? theme.colorScheme.primary - : theme.colorScheme.onSurface, - ), - ), - ], - ), + children: item.titleList! + .map((e) => TextSpan( + text: e.text, + style: TextStyle( + fontSize: + theme.textTheme.bodyMedium!.fontSize, + height: 1.42, + letterSpacing: 0.3, + color: e.isEm + ? theme.colorScheme.primary + : theme.colorScheme.onSurface, + ), + )) + .toList()), ), ) ] else diff --git a/lib/common/widgets/video_card/video_card_v.dart b/lib/common/widgets/video_card/video_card_v.dart index a65b4477..1f284cf2 100644 --- a/lib/common/widgets/video_card/video_card_v.dart +++ b/lib/common/widgets/video_card/video_card_v.dart @@ -36,7 +36,7 @@ class VideoCardV extends StatelessWidget { String? goto = videoItem.goto; switch (goto) { case 'bangumi': - PageUtils.viewBangumi(epId: videoItem.param!); + PageUtils.viewPgc(epId: videoItem.param!); break; case 'av': String bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid!); @@ -47,7 +47,7 @@ class VideoCardV extends StatelessWidget { PageUtils.toVideoPage( 'bvid=$bvid&cid=$cid', arguments: { - 'pic': videoItem.pic, + 'pic': videoItem.cover, 'heroTag': heroTag, }, ); @@ -106,7 +106,7 @@ class VideoCardV extends StatelessWidget { onTap: () => onPushDetail(Utils.makeHeroTag(videoItem.aid)), onLongPress: () => imageSaveDialog( title: videoItem.title, - cover: videoItem.pic, + cover: videoItem.cover, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -120,7 +120,7 @@ class VideoCardV extends StatelessWidget { clipBehavior: Clip.none, children: [ NetworkImgLayer( - src: videoItem.pic, + src: videoItem.cover, width: maxWidth, height: maxHeight, ), @@ -181,7 +181,7 @@ class VideoCardV extends StatelessWidget { children: [ if (videoItem.goto == 'bangumi') PBadge( - text: videoItem.bangumiBadge, + text: videoItem.pgcBadge, isStack: false, size: PBadgeSize.small, type: PBadgeType.line_primary, diff --git a/lib/common/widgets/video_popup_menu.dart b/lib/common/widgets/video_popup_menu.dart index 32b83214..2c9f50f3 100644 --- a/lib/common/widgets/video_popup_menu.dart +++ b/lib/common/widgets/video_popup_menu.dart @@ -3,7 +3,7 @@ import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/account_type.dart'; import 'package:PiliPlus/models/home/rcmd/result.dart'; import 'package:PiliPlus/models/model_video.dart'; -import 'package:PiliPlus/models/space_archive/item.dart'; +import 'package:PiliPlus/models_new/space/space_archive/item.dart'; import 'package:PiliPlus/pages/mine/controller.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; import 'package:PiliPlus/utils/storage.dart'; diff --git a/lib/http/api.dart b/lib/http/api.dart index 0a3a54a2..bd135b9c 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -16,11 +16,11 @@ class Api { // 视频流 // https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/video/videostream_url.md - static const String videoUrl = '/x/player/wbi/playurl'; + static const String ugcUrl = '/x/player/wbi/playurl'; // 番剧视频流 // https://api.bilibili.com/pgc/player/web/v2/playurl?cid=104236640&bvid=BV13t411n7ex - static const String bangumiVideoUrl = '/pgc/player/web/v2/playurl'; + static const String pgcUrl = '/pgc/player/web/v2/playurl'; // 字幕 // aid, cid @@ -51,7 +51,7 @@ class Api { // https://api.bilibili.com/x/web-interface/archive/has/like // static const String hasLikeVideo = '/x/web-interface/archive/has/like'; - static const String bangumiLikeCoinFav = '/pgc/season/episode/community'; + static const String pgcLikeCoinFav = '/pgc/season/episode/community'; // 视频点踩 web端不支持 @@ -279,7 +279,7 @@ class Api { static const String ab2c = '/x/player/pagelist'; // 番剧/剧集明细 - static const String bangumiInfo = '/pgc/view/web/season'; + static const String pgcInfo = '/pgc/view/web/season'; // https://api.bilibili.com/pgc/season/episode/web/info?ep_id=12345678 static const String episodeInfo = '/pgc/season/episode/web/info'; @@ -370,12 +370,11 @@ class Api { // order_avoided=true& // w_rid=d893cf98a4e010cf326373194a648360& // wts=1689767832 - static const String memberArchive = '/x/space/wbi/arc/search'; + static const String searchArchive = '/x/space/wbi/arc/search'; // 用户动态搜索 // static const String memberDynamicSearch = '/x/space/dynamic/search'; - static const String memberDynamicSearch = - '/x/polymer/web-dynamic/v1/feed/space/search'; + static const String dynSearch = '/x/polymer/web-dynamic/v1/feed/space/search'; // 用户动态 static const String memberDynamic = '/x/polymer/web-dynamic/v1/feed/space'; @@ -390,12 +389,12 @@ class Api { static const String toViewClear = '/x/v2/history/toview/clear'; // 追番 - static const String bangumiAdd = '/pgc/web/follow/add'; + static const String pgcAdd = '/pgc/web/follow/add'; // 取消追番 - static const String bangumiDel = '/pgc/web/follow/del'; + static const String pgcDel = '/pgc/web/follow/del'; - static const String bangumiUpdate = '/pgc/web/follow/status/update'; + static const String pgcUpdate = '/pgc/web/follow/status/update'; // 番剧列表 // https://api.bilibili.com/pgc/season/index/result? @@ -415,11 +414,11 @@ class Api { // season_type=1& // pagesize=20& // type=1 - static const String bangumiList = + static const String pgcIndex = '/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'; // 我的追番/追剧 ?type=1&pn=1&ps=15 - static const String bangumiFollowList = '/x/space/bangumi/follow/list'; + static const String favPgc = '/x/space/bangumi/follow/list'; // 黑名单 static const String blackLst = '/x/relation/blacks'; @@ -874,4 +873,8 @@ class Api { '${HttpString.appBaseUrl}/x/topic/pub/search'; static const String upowerRank = '/x/upower/up/member/rank/v2'; + + static const String favFavFolder = '/x/v3/fav/folder/fav'; + + static const String unfavFavFolder = '/x/v3/fav/folder/unfav'; } diff --git a/lib/http/black.dart b/lib/http/black.dart index 1630743d..9eedd512 100644 --- a/lib/http/black.dart +++ b/lib/http/black.dart @@ -1,22 +1,24 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/user/black.dart'; +import 'package:PiliPlus/models_new/blacklist/data.dart'; import 'package:PiliPlus/utils/storage.dart'; class BlackHttp { - static Future> blackList( + static Future> blackList( {required int pn, int? ps}) async { - var res = await Request().get(Api.blackLst, queryParameters: { - 'pn': pn, - 'ps': ps ?? 50, - 're_version': 0, - 'jsonp': 'jsonp', - 'csrf': Accounts.main.csrf, - }); + var res = await Request().get( + Api.blackLst, + queryParameters: { + 'pn': pn, + 'ps': ps ?? 50, + 're_version': 0, + 'jsonp': 'jsonp', + 'csrf': Accounts.main.csrf, + }, + ); if (res.data['code'] == 0) { - BlackListDataModel data = BlackListDataModel.fromJson(res.data['data']); - return Success(data); + return Success(BlackListData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index 6e777958..8bde6127 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -3,17 +3,17 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/article_info/data.dart'; import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart'; import 'package:PiliPlus/models/common/reply/reply_option_type.dart'; -import 'package:PiliPlus/models/dynamics/article_list/data.dart'; -import 'package:PiliPlus/models/dynamics/dyn_reserve/data.dart'; -import 'package:PiliPlus/models/dynamics/dyn_topic_feed/topic_card_list.dart'; -import 'package:PiliPlus/models/dynamics/dyn_topic_top/top_details.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models/dynamics/up.dart'; import 'package:PiliPlus/models/dynamics/vote_model.dart'; -import 'package:PiliPlus/models/space_article/item.dart'; +import 'package:PiliPlus/models_new/article/article_info/data.dart'; +import 'package:PiliPlus/models_new/article/article_list/data.dart'; +import 'package:PiliPlus/models_new/article/article_view/data.dart'; +import 'package:PiliPlus/models_new/dynamic/dyn_reserve/data.dart'; +import 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/topic_card_list.dart'; +import 'package:PiliPlus/models_new/dynamic/dyn_topic_top/top_details.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -41,36 +41,36 @@ class DynamicsHttp { }; var res = await Request().get(Api.followDynamic, queryParameters: data); if (res.data['code'] == 0) { - try { - DynamicsDataModel data = DynamicsDataModel.fromJson(res.data['data']); - final antiGoodsDyn = GStorage.antiGoodsDyn; - final filterWord = banWordForDyn.pattern.isNotEmpty; + // try { + DynamicsDataModel data = DynamicsDataModel.fromJson(res.data['data']); + final antiGoodsDyn = GStorage.antiGoodsDyn; + final filterWord = banWordForDyn.pattern.isNotEmpty; - data.items?.removeWhere( - (item) => - (antiGoodsDyn && - (item.orig?.modules.moduleDynamic?.additional?.type == - 'ADDITIONAL_TYPE_GOODS' || - item.modules.moduleDynamic?.additional?.type == - 'ADDITIONAL_TYPE_GOODS')) || - (filterWord && - (item.orig?.modules.moduleDynamic?.major?.opus?.summary?.text - ?.contains(banWordForDyn) == - true || - item.modules.moduleDynamic?.major?.opus?.summary?.text - ?.contains(banWordForDyn) == - true || - item.orig?.modules.moduleDynamic?.desc?.text - ?.contains(banWordForDyn) == - true || - item.modules.moduleDynamic?.desc?.text - ?.contains(banWordForDyn) == - true)), - ); - return Success(data); - } catch (err) { - return Error(err.toString()); - } + data.items?.removeWhere( + (item) => + (antiGoodsDyn && + (item.orig?.modules.moduleDynamic?.additional?.type == + 'ADDITIONAL_TYPE_GOODS' || + item.modules.moduleDynamic?.additional?.type == + 'ADDITIONAL_TYPE_GOODS')) || + (filterWord && + (item.orig?.modules.moduleDynamic?.major?.opus?.summary?.text + ?.contains(banWordForDyn) == + true || + item.modules.moduleDynamic?.major?.opus?.summary?.text + ?.contains(banWordForDyn) == + true || + item.orig?.modules.moduleDynamic?.desc?.text + ?.contains(banWordForDyn) == + true || + item.modules.moduleDynamic?.desc?.text + ?.contains(banWordForDyn) == + true)), + ); + return Success(data); + // } catch (err) { + // return Error(err.toString()); + // } } else { return Error(res.data['message']); } @@ -245,10 +245,11 @@ class DynamicsHttp { 'web_location': '333.1330', 'x-bili-device-req-json': '{"platform":"web","device":"pc","spmid":"333.1330"}', - if (Accounts.main.isLogin) 'csrf': Accounts.main.csrf, + if (!clearCookie && Accounts.main.isLogin) 'csrf': Accounts.main.csrf, }, - options: - clearCookie ? Options(extra: {'account': AnonymousAccount()}) : null, + options: clearCookie + ? Options(extra: {'account': AnonymousAccount(), 'checkReply': true}) + : null, ); if (res.data['code'] == 0) { try { @@ -311,7 +312,7 @@ class DynamicsHttp { } } - static Future> articleView( + static Future> articleView( {required dynamic cvId}) async { final res = await Request().get( Api.articleView, @@ -322,7 +323,7 @@ class DynamicsHttp { }), ); if (res.data['code'] == 0) { - return Success(SpaceArticleItem.fromJson(res.data['data'])); + return Success(ArticleViewData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } diff --git a/lib/http/fan.dart b/lib/http/fan.dart index a26136d1..9f35ede4 100644 --- a/lib/http/fan.dart +++ b/lib/http/fan.dart @@ -1,10 +1,10 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/fans/result.dart'; +import 'package:PiliPlus/models_new/fans/data.dart'; class FanHttp { - static Future> fans( + static Future> fans( {int? vmid, int? pn, int? ps, String? orderType}) async { var res = await Request().get(Api.fans, queryParameters: { 'vmid': vmid, @@ -14,7 +14,7 @@ class FanHttp { 'order_type': orderType, }); if (res.data['code'] == 0) { - return Success(FansDataModel.fromJson(res.data['data'])); + return Success(FansData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } diff --git a/lib/http/fav.dart b/lib/http/fav.dart new file mode 100644 index 00000000..6ba35cc2 --- /dev/null +++ b/lib/http/fav.dart @@ -0,0 +1,703 @@ +import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/http/api.dart'; +import 'package:PiliPlus/http/init.dart'; +import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models_new/fav/fav_article/data.dart'; +import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; +import 'package:PiliPlus/models_new/fav/fav_folder_info/data.dart'; +import 'package:PiliPlus/models_new/fav/fav_note/list.dart'; +import 'package:PiliPlus/models_new/fav/fav_pgc/data.dart'; +import 'package:PiliPlus/models_new/fav/fav_topic/data.dart'; +import 'package:PiliPlus/models_new/fav/fav_video/data.dart'; +import 'package:PiliPlus/models_new/fav/fav_video/list.dart'; +import 'package:PiliPlus/models_new/space/space_fav/data.dart'; +import 'package:PiliPlus/models_new/sub/sub_detail/data.dart'; +import 'package:PiliPlus/utils/storage.dart' show Accounts; +import 'package:PiliPlus/utils/utils.dart'; +import 'package:dio/dio.dart'; + +class FavHttp { + static Future favFavFolder(mediaId) async { + var res = await Request().post( + Api.favFavFolder, + data: { + 'media_id': mediaId, + 'csrf': Accounts.main.csrf, + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return const {'status': true, 'msg': '收藏成功'}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future unfavFavFolder(mediaId) async { + var res = await Request().post( + Api.unfavFavFolder, + data: { + 'media_id': mediaId, + 'csrf': Accounts.main.csrf, + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return const {'status': true, 'msg': '取消收藏成功'}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future> userFavFolderDetail( + {required int mediaId, + required int pn, + required int ps, + String keyword = '', + String order = 'mtime', + int type = 0}) async { + var res = await Request().get( + Api.favResourceList, + queryParameters: { + 'media_id': mediaId, + 'pn': pn, + 'ps': ps, + 'keyword': keyword, + 'order': order, + 'type': type, + 'tid': 0, + 'platform': 'web' + }, + ); + if (res.data['code'] == 0) { + return Success(FavDetailData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } + + static Future> favResourceList({ + required int id, + required int pn, + required int ps, + }) async { + var res = await Request().get( + Api.favResourceList, + queryParameters: { + 'media_id': id, + 'ps': ps, + 'pn': pn, + }, + ); + if (res.data['code'] == 0) { + return Success(SubDetailData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } + + // 取消订阅 + static Future cancelSub({required int id, required int type}) async { + var res = type == 11 + ? await Request().post( + Api.unfavFolder, + queryParameters: { + 'media_id': id, + 'csrf': Accounts.main.csrf, + }, + ) + : await Request().post( + Api.unfavSeason, + queryParameters: { + 'platform': 'web', + 'season_id': id, + 'csrf': Accounts.main.csrf, + }, + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future> favSeasonList({ + required int id, + required int pn, + required int ps, + }) async { + var res = await Request().get( + Api.favSeasonList, + queryParameters: { + 'season_id': id, + 'ps': ps, + 'pn': pn, + }, + ); + if (res.data['code'] == 0) { + return Success(SubDetailData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } + + static Future> favTopic({ + required int page, + }) async { + var res = await Request().get( + Api.favTopicList, + queryParameters: { + 'page_size': 24, + 'page_num': page, + 'web_location': 333.1387, + }, + ); + if (res.data['code'] == 0) { + return Success(FavTopicData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } + + static Future addFavTopic(topicId) async { + var res = await Request().post( + Api.addFavTopic, + data: { + 'topic_id': topicId, + 'csrf': Accounts.main.csrf, + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future delFavTopic(topicId) async { + var res = await Request().post( + Api.delFavTopic, + data: { + 'topic_id': topicId, + 'csrf': Accounts.main.csrf, + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future likeTopic(topicId, bool isLike) async { + var res = await Request().post( + Api.likeTopic, + data: { + 'action': isLike ? 'cancel_like' : 'like', + 'up_mid': Accounts.main.mid, + 'topic_id': topicId, + 'csrf': Accounts.main.csrf, + 'business': 'topic', + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future> favArticle({ + required int page, + }) async { + var res = await Request().get( + Api.favArticle, + queryParameters: { + 'page_size': 20, + 'page': page, + }, + ); + if (res.data['code'] == 0) { + return Success(FavArticleData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } + + static Future addFavArticle({ + required dynamic id, + }) async { + var res = await Request().post( + Api.addFavArticle, + data: { + 'id': id, + 'csrf': Accounts.main.csrf, + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future delFavArticle({ + required dynamic id, + }) async { + var res = await Request().post( + Api.delFavArticle, + data: { + 'id': id, + 'csrf': Accounts.main.csrf, + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future?>> userNoteList({ + required int page, + }) async { + var res = await Request().get( + Api.userNoteList, + queryParameters: { + 'pn': page, + 'ps': 10, + 'csrf': Accounts.main.csrf, + }, + ); + if (res.data['code'] == 0) { + List? list = (res.data['data']?['list'] as List?) + ?.map((e) => FavNoteItemModel.fromJson(e)) + .toList(); + return Success(list); + } else { + return Error(res.data['message']); + } + } + + static Future?>> noteList({ + required int page, + }) async { + var res = await Request().get( + Api.noteList, + queryParameters: { + 'pn': page, + 'ps': 10, + 'csrf': Accounts.main.csrf, + }, + ); + if (res.data['code'] == 0) { + List? list = (res.data['data']?['list'] as List?) + ?.map((e) => FavNoteItemModel.fromJson(e)) + .toList(); + return Success(list); + } else { + return Error(res.data['message']); + } + } + + static Future delNote({ + required bool isPublish, + required List noteIds, + }) async { + final res = await Request().post( + isPublish ? Api.delPublishNote : Api.delNote, + data: { + isPublish ? 'cvids' : 'note_ids': noteIds.join(','), + 'csrf': Accounts.main.csrf, + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future> favPgc({ + required dynamic mid, + required int type, + required int pn, + int? followStatus, + }) async { + var res = await Request().get( + Api.favPgc, + queryParameters: { + 'vmid': mid, + 'type': type, + if (followStatus != null) 'follow_status': followStatus, + 'pn': pn, + }, + ); + if (res.data['code'] == 0) { + return Success(FavPgcData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } + + // 收藏夹 + static Future> userfavFolder({ + required int pn, + required int ps, + required dynamic mid, + }) async { + var res = await Request().get( + Api.userFavFolder, + queryParameters: { + 'pn': pn, + 'ps': ps, + 'up_mid': mid, + }, + ); + if (res.data['code'] == 0) { + return Success(FavVideoData.fromJson(res.data['data'])); + } else { + return Error(res.data['message'] ?? '账号未登录'); + } + } + + static Future sortFavFolder({ + required List sort, + }) async { + Map data = { + 'sort': sort.join(','), + 'csrf': Accounts.main.csrf, + }; + Utils.appSign(data); + var res = await Request().post( + Api.sortFavFolder, + data: data, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future sortFav({ + required dynamic mediaId, + required List sort, + }) async { + Map data = { + 'media_id': mediaId, + 'sort': sort.join(','), + 'csrf': Accounts.main.csrf, + }; + Utils.appSign(data); + var res = await Request().post( + Api.sortFav, + data: data, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future cleanFav({ + required dynamic mediaId, + }) async { + var res = await Request().post( + Api.cleanFav, + data: { + 'media_id': mediaId, + 'platform': 'web', + 'csrf': Accounts.main.csrf, + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future deleteFolder({ + required List mediaIds, + }) async { + var res = await Request().post(Api.deleteFolder, + data: { + 'media_ids': mediaIds.join(','), + 'platform': 'web', + 'csrf': Accounts.main.csrf, + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + )); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future addOrEditFolder({ + required bool isAdd, + dynamic mediaId, + required String title, + required int privacy, + required String cover, + required String intro, + }) async { + var res = await Request().post(isAdd ? Api.addFolder : Api.editFolder, + data: { + 'title': title, + 'intro': intro, + 'privacy': privacy, + 'cover': cover.isNotEmpty ? Uri.encodeFull(cover) : cover, + 'csrf': Accounts.main.csrf, + if (mediaId != null) 'media_id': mediaId, + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + )); + if (res.data['code'] == 0) { + return { + 'status': true, + 'data': FavVideoItemModel.fromJson(res.data['data']) + }; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future folderInfo({ + dynamic mediaId, + }) async { + var res = await Request().get( + Api.folderInfo, + queryParameters: { + 'media_id': mediaId, + }, + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': FolderInfo.fromJson(res.data['data'])}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future seasonFav({ + required bool isFav, + required dynamic seasonId, + }) async { + var res = await Request().post( + Api.seasonFav + (isFav ? 'unfav' : 'fav'), + data: { + 'platform': 'web', + 'season_id': seasonId, + 'csrf': Accounts.main.csrf, + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return { + 'status': true, + }; + } else { + return { + 'status': false, + 'msg': res.data['message'], + }; + } + } + + static Future?>> spaceFav({ + required int mid, + }) async { + Map data = { + 'build': '8430300', + 'c_locale': 'zh_CN', + 'channel': 'bili', + 'mobi_app': 'android', + 'platform': 'android', + 's_locale': 'zh_CN', + 'statistics': Constants.statisticsApp, + 'up_mid': mid.toString(), + }; + var res = await Request().get( + Api.spaceFav, + queryParameters: data, + options: Options( + headers: { + 'bili-http-engine': 'cronet', + 'user-agent': Constants.userAgentApp, + }, + ), + ); + if (res.data['code'] == 0) { + return Success((res.data['data'] as List?) + ?.map((e) => SpaceFavData.fromJson(e)) + .toList()); + } else { + return Error(res.data['message']); + } + } + + static Future communityAction({ + required dynamic opusId, + required dynamic action, + }) async { + var res = await Request().post( + Api.communityAction, + queryParameters: { + 'csrf': Accounts.main.csrf, + }, + data: { + "entity": { + "object_id_str": opusId, + "type": {"biz": 2} + }, + "action": action, // 3 fav, 4 unfav + }, + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + // (取消)收藏 + static Future delFav({ + List? ids, + String? delIds, + }) async { + var res = await Request().post( + Api.delFav, + data: { + 'resources': ids?.join(','), + 'media_id': delIds, + 'platform': 'web', + 'csrf': Accounts.main.csrf, + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + // (取消)收藏 + static Future favVideo({ + int? aid, + String? addIds, + String? delIds, + int? type, + }) async { + var res = await Request().post( + Api.favVideo, + data: { + 'rid': aid, + 'type': type ?? 2, + 'add_media_ids': addIds ?? '', + 'del_media_ids': delIds ?? '', + 'csrf': Accounts.main.csrf, + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future copyOrMoveFav({ + required bool isCopy, + required bool isFav, + required dynamic srcMediaId, + required dynamic tarMediaId, + dynamic mid, + required List resources, + }) async { + var res = await Request().post( + isFav + ? isCopy + ? Api.copyFav + : Api.moveFav + : isCopy + ? Api.copyToview + : Api.moveToview, + data: { + if (srcMediaId != null) 'src_media_id': srcMediaId, + 'tar_media_id': tarMediaId, + if (mid != null) 'mid': mid, + 'resources': resources.join(','), + 'platform': 'web', + 'csrf': Accounts.main.csrf, + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + static Future allFavFolders(mid) async { + var res = await Request().get( + Api.favFolder, + queryParameters: {'up_mid': mid}, + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': FavVideoData.fromJson(res.data['data'])}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + + // 查看视频被收藏在哪个文件夹 + static Future videoInFolder({ + dynamic mid, + dynamic rid, + dynamic type, + }) async { + var res = await Request().get( + Api.favFolder, + queryParameters: { + 'up_mid': mid, + 'rid': rid, + if (type != null) 'type': type, + }, + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': FavVideoData.fromJson(res.data['data'])}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } +} diff --git a/lib/http/follow.dart b/lib/http/follow.dart index 4d35a1cf..00fd6ad1 100644 --- a/lib/http/follow.dart +++ b/lib/http/follow.dart @@ -1,10 +1,10 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/follow/result.dart'; +import 'package:PiliPlus/models_new/follow/data.dart'; class FollowHttp { - static Future> followings({ + static Future> followings({ int? vmid, int? pn, int? ps, @@ -19,14 +19,14 @@ class FollowHttp { }); if (res.data['code'] == 0) { return Success( - FollowDataModel.fromJson(res.data['data']), + FollowData.fromJson(res.data['data']), ); } else { return Error(res.data['message']); } } - static Future> followingsNew({ + static Future> followingsNew({ int? vmid, int? pn, int? ps, @@ -42,7 +42,7 @@ class FollowHttp { if (res.data['code'] == 0) { return Success( - FollowDataModel.fromJson(res.data['data']), + FollowData.fromJson(res.data['data']), ); } else { return Error(res.data['message']); diff --git a/lib/http/live.dart b/lib/http/live.dart index dde62d16..557f934a 100644 --- a/lib/http/live.dart +++ b/lib/http/live.dart @@ -3,63 +3,23 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/live_search_type.dart'; -import 'package:PiliPlus/models/live/live_area_list/area_item.dart'; -import 'package:PiliPlus/models/live/live_area_list/area_list.dart'; -import 'package:PiliPlus/models/live/live_emoticons/data.dart'; -import 'package:PiliPlus/models/live/live_emoticons/datum.dart'; -import 'package:PiliPlus/models/live/live_feed_index/data.dart'; -import 'package:PiliPlus/models/live/live_follow/data.dart'; -import 'package:PiliPlus/models/live/live_room/danmu_info.dart'; -import 'package:PiliPlus/models/live/live_room/item.dart'; -import 'package:PiliPlus/models/live/live_room/room_info.dart'; -import 'package:PiliPlus/models/live/live_room/room_info_h5.dart'; -import 'package:PiliPlus/models/live/live_search/data.dart'; -import 'package:PiliPlus/models/live/live_second_list/data.dart'; +import 'package:PiliPlus/models_new/live/live_area_list/area_item.dart'; +import 'package:PiliPlus/models_new/live/live_area_list/area_list.dart'; +import 'package:PiliPlus/models_new/live/live_dm_info/data.dart'; +import 'package:PiliPlus/models_new/live/live_emote/data.dart'; +import 'package:PiliPlus/models_new/live/live_emote/datum.dart'; +import 'package:PiliPlus/models_new/live/live_feed_index/data.dart'; +import 'package:PiliPlus/models_new/live/live_follow/data.dart'; +import 'package:PiliPlus/models_new/live/live_room_info_h5/data.dart'; +import 'package:PiliPlus/models_new/live/live_room_play_info/data.dart'; +import 'package:PiliPlus/models_new/live/live_search/data.dart'; +import 'package:PiliPlus/models_new/live/live_second_list/data.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:dio/dio.dart'; class LiveHttp { - static Future?>> liveList({ - int? vmid, - int? pn, - int? ps, - String? orderType, - String? gaiaVtoken, - }) async { - var res = await Request().get( - Api.liveList, - queryParameters: await WbiSign.makSign({ - 'page': pn, - 'page_size': 30, - 'platform': 'web', - 'web_location': 0.0, - if (gaiaVtoken != null) 'gaia_vtoken': gaiaVtoken, - }), - options: Options( - headers: { - 'origin': 'https://live.bilibili.com', - 'referer': 'https://live.bilibili.com/', - 'user-agent': Request.headerUa(type: 'pc'), - if (gaiaVtoken != null) 'cookie': 'x-bili-gaia-vtoken=$gaiaVtoken' - }, - ), - ); - if (res.data['code'] == 0) { - List? list = (res.data['data']?['list'] as List?) - ?.map((e) => LiveItemModel.fromJson(e)) - .toList(); - return Success(list); - } else { - String? vVoucher; - if (gaiaVtoken == null && res.data['code'] == -352) { - vVoucher = res.headers['x-bili-gaia-vvoucher']?.firstOrNull; - } - return Error(vVoucher ?? res.data['message']); - } - } - static Future sendLiveMsg({roomId, msg, dmType, emoticonOptions}) async { String csrf = Accounts.main.csrf; var res = await Request().post( @@ -118,7 +78,10 @@ class LiveHttp { }, ); if (res.data['code'] == 0) { - return {'status': true, 'data': RoomInfoModel.fromJson(res.data['data'])}; + return { + 'status': true, + 'data': RoomPlayInfoData.fromJson(res.data['data']) + }; } else { return {'status': false, 'msg': res.data['message']}; } @@ -131,7 +94,7 @@ class LiveHttp { if (res.data['code'] == 0) { return { 'status': true, - 'data': RoomInfoH5Model.fromJson(res.data['data']) + 'data': RoomInfoH5Data.fromJson(res.data['data']) }; } else { return {'status': false, 'msg': res.data['message']}; @@ -142,6 +105,12 @@ class LiveHttp { var res = await Request().get( Api.liveRoomDmPrefetch, queryParameters: {'roomid': roomId}, + options: Options( + headers: { + 'referer': 'https://live.bilibili.com/$roomId', + 'user-agent': Request.headerUa(type: 'pc'), + }, + ), ); if (res.data['code'] == 0) { return {'status': true, 'data': res.data['data']?['room']}; @@ -159,7 +128,10 @@ class LiveHttp { }), ); if (res.data['code'] == 0) { - return {'status': true, 'data': LiveDanmakuInfo.fromJson(res.data)}; + return { + 'status': true, + 'data': LiveDmInfoData.fromJson(res.data['data']) + }; } else { return {'status': false, 'msg': res.data['message']}; } diff --git a/lib/http/member.dart b/lib/http/member.dart index 11302419..52ec6084 100644 --- a/lib/http/member.dart +++ b/lib/http/member.dart @@ -8,19 +8,18 @@ import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/member/contribute_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; -import 'package:PiliPlus/models/follow/result.dart'; -import 'package:PiliPlus/models/member/archive.dart'; import 'package:PiliPlus/models/member/coin.dart'; import 'package:PiliPlus/models/member/info.dart'; -import 'package:PiliPlus/models/member/seasons.dart'; import 'package:PiliPlus/models/member/tags.dart'; -import 'package:PiliPlus/models/member_ss/item.dart'; -import 'package:PiliPlus/models/space/data.dart'; -import 'package:PiliPlus/models/space_archive/data.dart'; -import 'package:PiliPlus/models/space_article/data.dart'; -import 'package:PiliPlus/models/space_fav/space_fav.dart'; -import 'package:PiliPlus/models/space_opus/data.dart'; -import 'package:PiliPlus/models/upower_rank/data.dart'; +import 'package:PiliPlus/models_new/follow/data.dart'; +import 'package:PiliPlus/models_new/follow/list.dart'; +import 'package:PiliPlus/models_new/member/search_archive/data.dart'; +import 'package:PiliPlus/models_new/space/space/data.dart'; +import 'package:PiliPlus/models_new/space/space_archive/data.dart'; +import 'package:PiliPlus/models_new/space/space_article/data.dart'; +import 'package:PiliPlus/models_new/space/space_opus/data.dart'; +import 'package:PiliPlus/models_new/space/space_season_series/item.dart'; +import 'package:PiliPlus/models_new/upower_rank/data.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/wbi_sign.dart'; @@ -84,37 +83,7 @@ class MemberHttp { } } - static Future spaceFav({ - required int mid, - }) async { - Map data = { - 'build': '8430300', - 'c_locale': 'zh_CN', - 'channel': 'bili', - 'mobi_app': 'android', - 'platform': 'android', - 's_locale': 'zh_CN', - 'statistics': Constants.statisticsApp, - 'up_mid': mid.toString(), - }; - var res = await Request().get( - Api.spaceFav, - queryParameters: data, - options: Options( - headers: { - 'bili-http-engine': 'cronet', - 'user-agent': Constants.userAgentApp, - }, - ), - ); - if (res.data['code'] == 0) { - return Success(SpaceFav.fromJson(res.data).data); - } else { - return Error(res.data['message']); - } - } - - static Future> seasonSeriesList({ + static Future> seasonSeriesList({ required int? mid, required int pn, }) async { @@ -128,7 +97,7 @@ class MemberHttp { ); if (res.data['code'] == 0) { return Success( - MemberSsData.fromJson(res.data['data']?['items_lists'] ?? {})); + SpaceSsData.fromJson(res.data['data']?['items_lists'] ?? {})); } else { return Error(res.data['message']); } @@ -324,58 +293,7 @@ class MemberHttp { } } - static Future memberArchive({ - required int mid, - int ps = 30, - int tid = 0, - int? pn, - String? keyword, - String order = 'pubdate', - bool orderAvoided = true, - }) async { - String dmImgStr = Utils.base64EncodeRandomString(16, 64); - String dmCoverImgStr = Utils.base64EncodeRandomString(32, 128); - final params = await WbiSign.makSign({ - 'mid': mid, - 'ps': ps, - 'tid': tid, - 'pn': pn, - if (keyword != null) 'keyword': keyword, - 'order': order, - 'platform': 'web', - 'web_location': '1550101', - 'order_avoided': orderAvoided, - 'dm_img_list': '[]', - 'dm_img_str': dmImgStr, - 'dm_cover_img_str': dmCoverImgStr, - 'dm_img_inter': '{"ds":[],"wh":[0,0,0],"of":[0,0,0]}', - }); - var res = await Request().get( - Api.memberArchive, - queryParameters: params, - options: Options(headers: { - HttpHeaders.userAgentHeader: Request.headerUa(type: 'pc'), - HttpHeaders.refererHeader: '${HttpString.spaceBaseUrl}/$mid', - 'origin': HttpString.spaceBaseUrl, - }), - ); - if (res.data['code'] == 0) { - return { - 'status': true, - 'data': MemberArchiveDataModel.fromJson(res.data['data']) - }; - } else { - Map errMap = { - -352: '风控校验失败,请检查登录状态', - }; - return { - 'status': false, - 'msg': errMap[res.data['code']] ?? res.data['message'], - }; - } - } - - static Future memberArchiveNew({ + static Future> searchArchive({ required mid, int ps = 30, int tid = 0, @@ -402,7 +320,7 @@ class MemberHttp { 'dm_img_inter': '{"ds":[],"wh":[0,0,0],"of":[0,0,0]}', }); var res = await Request().get( - Api.memberArchive, + Api.searchArchive, queryParameters: params, options: Options(headers: { HttpHeaders.userAgentHeader: Request.headerUa(type: 'pc'), @@ -411,9 +329,9 @@ class MemberHttp { }), ); if (res.data['code'] == 0) { - return Success(MemberArchiveDataModel.fromJson(res.data['data'])); + return Success(SearchArchiveData.fromJson(res.data['data'])); } else { - Map errMap = { + Map errMap = const { -352: '风控校验失败,请检查登录状态', }; return Error(errMap[res.data['code']] ?? res.data['message']); @@ -453,7 +371,7 @@ class MemberHttp { } return Success(data); } else { - Map errMap = { + Map errMap = const { -352: '风控校验失败,请检查登录状态', }; return Error(errMap[res.data['code']] ?? res.data['message']); @@ -468,7 +386,7 @@ class MemberHttp { required String keyword, }) async { var res = await Request().get( - Api.memberDynamicSearch, + Api.dynSearch, queryParameters: { 'host_mid': mid, 'page': pn, @@ -491,14 +409,14 @@ class MemberHttp { } } - static Future memberDynamicSearchNew({ + static Future> dynSearch({ required int pn, required dynamic mid, required dynamic offset, required String keyword, }) async { var res = await Request().get( - Api.memberDynamicSearch, + Api.dynSearch, queryParameters: { 'host_mid': mid, 'page': pn, @@ -580,7 +498,7 @@ class MemberHttp { } // 获取某分组下的up - static Future> followUpGroup( + static Future> followUpGroup( int? mid, int? tagid, int? pn, @@ -596,7 +514,7 @@ class MemberHttp { }, ); if (res.data['code'] == 0) { - return Success(FollowDataModel( + return Success(FollowData( list: (res.data['data'] as List?) ?.map((e) => FollowItemModel.fromJson(e)) .toList())); @@ -687,23 +605,6 @@ class MemberHttp { } } - // 获取uo专栏 - static Future getMemberSeasons(int? mid, int? pn, int? ps) async { - var res = await Request().get(Api.getMemberSeasonsApi, queryParameters: { - 'mid': mid, - 'page_num': pn, - 'page_size': ps, - }); - if (res.data['code'] == 0) { - return { - 'status': true, - 'data': MemberSeasonsDataModel.fromJson(res.data['data']['items_lists']) - }; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - // 最近投币 static Future?>> getRecentCoinVideo( {required int mid}) async { @@ -760,38 +661,6 @@ class MemberHttp { } } - // 查看某个专栏 - static Future getSeasonDetail({ - required int mid, - required int seasonId, - bool sortReverse = false, - required int pn, - required int ps, - }) async { - var res = await Request().get( - Api.getSeasonDetailApi, - queryParameters: { - 'mid': mid, - 'season_id': seasonId, - 'sort_reverse': sortReverse, - 'page_num': pn, - 'page_size': ps, - }, - ); - if (res.data['code'] == 0) { - try { - return { - 'status': true, - 'data': MemberSeasonsList.fromJson(res.data['data']) - }; - } catch (err) { - debugPrint(err.toString()); - } - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - // 获取up播放数、点赞数 static Future memberView({required int mid}) async { var res = await Request() @@ -804,7 +673,7 @@ class MemberHttp { } // 搜索follow - static Future> getfollowSearch({ + static Future> getfollowSearch({ required int mid, required int ps, required int pn, @@ -827,7 +696,7 @@ class MemberHttp { 'wts': params['wts'], }); if (res.data['code'] == 0) { - return Success(FollowDataModel.fromJson(res.data['data'])); + return Success(FollowData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } diff --git a/lib/http/msg.dart b/lib/http/msg.dart index 63ed429f..eede587d 100644 --- a/lib/http/msg.dart +++ b/lib/http/msg.dart @@ -2,24 +2,21 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bfs_res/data.dart'; -import 'package:PiliPlus/models/msg/account.dart'; -import 'package:PiliPlus/models/msg/im_user_infos/datum.dart'; -import 'package:PiliPlus/models/msg/msg_dnd/uid_setting.dart'; -import 'package:PiliPlus/models/msg/msgfeed_at_me.dart'; -import 'package:PiliPlus/models/msg/msgfeed_like_me.dart'; -import 'package:PiliPlus/models/msg/msgfeed_reply_me.dart'; -import 'package:PiliPlus/models/msg/msgfeed_sys_msg.dart'; -import 'package:PiliPlus/models/msg/session.dart'; -import 'package:PiliPlus/models/msg/session_ss/data.dart'; +import 'package:PiliPlus/models_new/msg/im_user_infos/datum.dart'; +import 'package:PiliPlus/models_new/msg/msg_at/data.dart'; +import 'package:PiliPlus/models_new/msg/msg_dnd/uid_setting.dart'; +import 'package:PiliPlus/models_new/msg/msg_like/data.dart'; +import 'package:PiliPlus/models_new/msg/msg_reply/data.dart'; +import 'package:PiliPlus/models_new/msg/msg_sys/data.dart'; +import 'package:PiliPlus/models_new/msg/session_ss/data.dart'; +import 'package:PiliPlus/models_new/upload_bfs/data.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:dio/dio.dart'; -import 'package:flutter/material.dart'; import 'package:uuid/uuid.dart'; class MsgHttp { - static Future> msgFeedReplyMe({ + static Future> msgFeedReplyMe({ int? cursor, int? cursorTime, }) async { @@ -35,14 +32,13 @@ class MsgHttp { }, ); if (res.data['code'] == 0) { - MsgFeedReplyMe data = MsgFeedReplyMe.fromJson(res.data['data']); - return Success(data); + return Success(MsgReplyData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - static Future> msgFeedAtMe( + static Future> msgFeedAtMe( {int? cursor, int? cursorTime}) async { var res = await Request().get( Api.msgFeedAt, @@ -56,14 +52,13 @@ class MsgHttp { }, ); if (res.data['code'] == 0) { - MsgFeedAtMe data = MsgFeedAtMe.fromJson(res.data['data']); - return Success(data); + return Success(MsgAtData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - static Future> msgFeedLikeMe( + static Future> msgFeedLikeMe( {int? cursor, int? cursorTime}) async { var res = await Request().get(Api.msgFeedLike, queryParameters: { if (cursor != null) 'id': cursor, @@ -74,14 +69,13 @@ class MsgHttp { 'web_location': 333.40164, }); if (res.data['code'] == 0) { - MsgFeedLikeMe data = MsgFeedLikeMe.fromJson(res.data['data']); - return Success(data); + return Success(MsgLikeData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - static Future?>> msgFeedNotify( + static Future?>> msgFeedNotify( {int? cursor, int pageSize = 20}) async { var res = await Request().get( Api.msgSysNotify, @@ -94,10 +88,9 @@ class MsgHttp { }, ); if (res.data['code'] == 0) { - List? list = (res.data['data'] as List?) - ?.map((e) => SystemNotifyList.fromJson(e)) - .toList(); - return Success(list); + return Success((res.data['data'] as List?) + ?.map((e) => MsgSysItem.fromJson(e)) + .toList()); } else { return Error(res.data['message']); } @@ -169,7 +162,7 @@ class MsgHttp { if (res.data['code'] == 0) { return { 'status': true, - 'data': BfsResData.fromJson(res.data['data']), + 'data': UploadBfsResData.fromJson(res.data['data']), }; } else { return { @@ -331,81 +324,6 @@ class MsgHttp { } } - // 会话列表 - static Future?>> sessionList( - {int? endTs}) async { - final params = await WbiSign.makSign({ - 'session_type': 1, - 'group_fold': 1, - 'unfollow_fold': 0, - 'sort_rule': 2, - 'build': 0, - 'mobi_app': 'web', - if (endTs != null) 'end_ts': endTs, - }); - var res = await Request().get(Api.sessionList, queryParameters: params); - if (res.data['code'] == 0) { - try { - return Success( - SessionDataModel.fromJson(res.data['data']).sessionList, - ); - } catch (err) { - return Error(err.toString()); - } - } else { - return Error(res.data['message']); - } - } - - static Future accountList(uids) async { - var res = await Request().get(Api.sessionAccountList, queryParameters: { - 'uids': uids, - 'build': 0, - 'mobi_app': 'web', - }); - if (res.data['code'] == 0) { - try { - return { - 'status': true, - 'data': res.data['data'] - .map((e) => AccountListModel.fromJson(e)) - .toList(), - }; - } catch (err) { - debugPrint('err🔟: $err'); - } - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future> sessionMsg({ - int? talkerId, - beginSeqno, - endSeqno, - }) async { - final params = await WbiSign.makSign({ - 'talker_id': talkerId, - 'session_type': 1, - 'size': 20, - 'sender_device_id': 1, - 'build': 0, - 'mobi_app': 'web', - if (beginSeqno != null) 'begin_seqno': beginSeqno, - if (endSeqno != null) 'end_seqno': endSeqno, - }); - var res = await Request().get(Api.sessionMsg, queryParameters: params); - if (res.data['code'] == 0) { - try { - return Success(SessionMsgDataModel.fromJson(res.data['data'])); - } catch (err) { - return Error(err.toString()); - } - } else { - return Error(res.data['message']); - } - } - // 消息标记已读 static Future ackSessionMsg({ int? talkerId, diff --git a/lib/http/bangumi.dart b/lib/http/pgc.dart similarity index 77% rename from lib/http/bangumi.dart rename to lib/http/pgc.dart index 88bb69a4..89692c6f 100644 --- a/lib/http/bangumi.dart +++ b/lib/http/pgc.dart @@ -2,17 +2,17 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/pgc_review_type.dart'; -import 'package:PiliPlus/models/pgc/list.dart'; -import 'package:PiliPlus/models/pgc/pgc_index/condition.dart'; -import 'package:PiliPlus/models/pgc/pgc_index_item/data.dart'; -import 'package:PiliPlus/models/pgc/pgc_review/data.dart'; -import 'package:PiliPlus/models/pgc/pgc_timeline/pgc_timeline.dart'; -import 'package:PiliPlus/models/pgc/pgc_timeline/result.dart'; +import 'package:PiliPlus/models_new/pgc/pgc_index_condition/data.dart'; +import 'package:PiliPlus/models_new/pgc/pgc_index_result/data.dart'; +import 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart'; +import 'package:PiliPlus/models_new/pgc/pgc_review/data.dart'; +import 'package:PiliPlus/models_new/pgc/pgc_timeline/pgc_timeline.dart'; +import 'package:PiliPlus/models_new/pgc/pgc_timeline/result.dart'; import 'package:PiliPlus/utils/storage.dart' show Accounts; import 'package:dio/dio.dart'; -class BangumiHttp { - static Future> pgcIndexResult({ +class PgcHttp { + static Future> pgcIndexResult({ required int page, required Map params, seasonType, @@ -31,13 +31,13 @@ class BangumiHttp { }, ); if (res.data['code'] == 0) { - return Success(PgcIndexItemData.fromJson(res.data['data'])); + return Success(PgcIndexResult.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - static Future> pgcIndexCondition({ + static Future> pgcIndexCondition({ seasonType, type, indexType, @@ -51,43 +51,25 @@ class BangumiHttp { }, ); if (res.data['code'] == 0) { - return Success(PgcIndexCondition.fromJson(res.data['data'])); + return Success(PgcIndexConditionData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - static Future?>> bangumiList({ + static Future?>> pgcIndex({ int? page, int? indexType, }) async { - var res = await Request().get(Api.bangumiList, queryParameters: { - 'page': page, - if (indexType != null) 'index_type': indexType, - }); + var res = await Request().get( + Api.pgcIndex, + queryParameters: { + 'page': page, + if (indexType != null) 'index_type': indexType, + }, + ); if (res.data['code'] == 0) { - BangumiListDataModel data = - BangumiListDataModel.fromJson(res.data['data']); - return Success(data.list); - } else { - return Error(res.data['message']); - } - } - - static Future> bangumiFollowList({ - required dynamic mid, - required int type, - required int pn, - int? followStatus, - }) async { - var res = await Request().get(Api.bangumiFollowList, queryParameters: { - 'vmid': mid, - 'type': type, - if (followStatus != null) 'follow_status': followStatus, - 'pn': pn, - }); - if (res.data['code'] == 0) { - return Success(BangumiListDataModel.fromJson(res.data['data'])); + return Success(PgcIndexResult.fromJson(res.data['data']).list); } else { return Error(res.data['message']); } diff --git a/lib/http/reply.dart b/lib/http/reply.dart index 2456c9ec..6ad9ed71 100644 --- a/lib/http/reply.dart +++ b/lib/http/reply.dart @@ -2,9 +2,11 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/video/reply/data.dart'; -import 'package:PiliPlus/models/video/reply/emote.dart'; -import 'package:PiliPlus/models/video/reply/item.dart'; +import 'package:PiliPlus/models_new/emote/data.dart'; +import 'package:PiliPlus/models_new/emote/package.dart'; +import 'package:PiliPlus/models_new/reply/data.dart'; +import 'package:PiliPlus/models_new/reply/reply.dart'; +import 'package:PiliPlus/models_new/reply2reply/data.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:dio/dio.dart'; @@ -230,7 +232,7 @@ class ReplyHttp { } } - static Future?>> getEmoteList( + static Future?>> getEmoteList( {String? business}) async { var res = await Request().get(Api.myEmote, queryParameters: { 'business': business ?? 'reply', diff --git a/lib/http/search.dart b/lib/http/search.dart index 0b261f7c..5cf9fb30 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -4,11 +4,12 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/search_type.dart'; -import 'package:PiliPlus/models/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/models/search/result.dart'; -import 'package:PiliPlus/models/search/search_trending/trending_data.dart'; import 'package:PiliPlus/models/search/suggest.dart'; -import 'package:PiliPlus/models/topic_pub_search/data.dart'; +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/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter/material.dart'; @@ -16,33 +17,27 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; class SearchHttp { // 获取搜索建议 - static Future searchSuggest({required term}) async { - var res = await Request().get(Api.searchSuggest, - queryParameters: {'term': term, 'main_ver': 'v1', 'highlight': term}); + static Future searchSuggest({required String term}) async { + var res = await Request().get( + Api.searchSuggest, + queryParameters: { + 'term': term, + 'main_ver': 'v1', + 'highlight': term, + }, + ); if (res.data is String) { Map resultMap = json.decode(res.data); if (resultMap['code'] == 0) { if (resultMap['result'] is Map) { - resultMap['result']['term'] = term; + return { + 'status': true, + 'data': SearchSuggestModel.fromJson(resultMap['result']), + }; } - return { - 'status': true, - 'data': resultMap['result'] is Map - ? SearchSuggestModel.fromJson(resultMap['result']) - : null, - }; - } else { - return { - 'status': false, - 'msg': '请求错误 🙅', - }; } - } else { - return { - 'status': false, - 'msg': '请求错误 🙅', - }; } + return {'status': false, 'msg': '请求错误'}; } // 分类搜索 @@ -91,19 +86,19 @@ class SearchHttp { i['available'] = !blackMids.contains(i['mid']); } } - data = SearchVideoModel.fromJson(res.data['data']); + data = SearchVideoData.fromJson(res.data['data']); break; case SearchType.live_room: - data = SearchLiveModel.fromJson(res.data['data']); + data = SearchLiveData.fromJson(res.data['data']); break; case SearchType.bili_user: - data = SearchUserModel.fromJson(res.data['data']); + data = SearchUserData.fromJson(res.data['data']); break; case SearchType.media_bangumi || SearchType.media_ft: - data = SearchMBangumiModel.fromJson(res.data['data']); + data = SearchPgcData.fromJson(res.data['data']); break; case SearchType.article: - data = SearchArticleModel.fromJson(res.data['data']); + data = SearchArticleData.fromJson(res.data['data']); break; } return Success(data); @@ -116,7 +111,7 @@ class SearchHttp { } } - static Future> searchAll({ + static Future> searchAll({ required String keyword, required page, String? order, @@ -149,7 +144,7 @@ class SearchHttp { } if (res.data['code'] == 0) { try { - return Success(SearchAllModel.fromJson(res.data['data'])); + return Success(SearchAllData.fromJson(res.data['data'])); } catch (err) { debugPrint(err.toString()); return Error(err.toString()); @@ -181,17 +176,17 @@ class SearchHttp { } } - static Future> bangumiInfoNew( + static Future> pgcInfoNew( {int? seasonId, int? epId}) async { var res = await Request().get( - Api.bangumiInfo, + Api.pgcInfo, queryParameters: { if (seasonId != null) 'season_id': seasonId, if (epId != null) 'ep_id': epId, }, ); if (res.data['code'] == 0) { - return Success(BangumiInfoModel.fromJson(res.data['result'])); + return Success(PgcInfoModel.fromJson(res.data['result'])); } else { return Error(res.data['message']); } @@ -211,12 +206,12 @@ class SearchHttp { } } - static Future> bangumiInfo({ + static Future> pgcInfo({ dynamic seasonId, dynamic epId, }) async { var res = await Request().get( - Api.bangumiInfo, + Api.pgcInfo, queryParameters: { if (seasonId != null) 'season_id': seasonId, if (epId != null) 'ep_id': epId, @@ -225,14 +220,14 @@ class SearchHttp { if (res.data['code'] == 0) { return { 'status': true, - 'data': BangumiInfoModel.fromJson(res.data['result']), + 'data': PgcInfoModel.fromJson(res.data['result']), }; } else { return {'status': false, 'msg': res.data['message']}; } } - static Future> searchTrending( + static Future> searchTrending( {int limit = 30}) async { final res = await Request().get( Api.searchTrending, @@ -241,22 +236,25 @@ class SearchHttp { }, ); if (res.data['code'] == 0) { - return Success(TrendingData.fromJson(res.data['data'])); + return Success(SearchTrendingData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - static Future> searchRecommend() async { - final res = await Request().get(Api.searchRecommend, queryParameters: { - 'build': '8350200', - 'c_locale': 'zh_CN', - 'mobi_app': 'android', - 'platform': 'android', - 's_locale': 'zh_CN', - }); + static Future> searchRecommend() async { + final res = await Request().get( + Api.searchRecommend, + queryParameters: { + 'build': '8350200', + 'c_locale': 'zh_CN', + 'mobi_app': 'android', + 'platform': 'android', + 's_locale': 'zh_CN', + }, + ); if (res.data['code'] == 0) { - return Success(SearchKeywordData.fromJson(res.data['data'])); + return Success(SearchRcmdData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } diff --git a/lib/http/user.dart b/lib/http/user.dart index 82dd3ae0..5c961fba 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -2,22 +2,16 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/fav_article/data.dart'; -import 'package:PiliPlus/models/folder_info/data.dart'; -import 'package:PiliPlus/models/media_list/data.dart'; import 'package:PiliPlus/models/model_hot_video_item.dart'; -import 'package:PiliPlus/models/user/fav_detail.dart'; -import 'package:PiliPlus/models/user/fav_folder.dart'; -import 'package:PiliPlus/models/user/fav_topic/data.dart'; -import 'package:PiliPlus/models/user/history.dart'; import 'package:PiliPlus/models/user/info.dart'; import 'package:PiliPlus/models/user/stat.dart'; -import 'package:PiliPlus/models/user/sub_detail.dart'; -import 'package:PiliPlus/models/user/sub_folder.dart'; -import 'package:PiliPlus/models/video_tag/data.dart'; +import 'package:PiliPlus/models_new/history/data.dart'; +import 'package:PiliPlus/models_new/media_list/data.dart'; +import 'package:PiliPlus/models_new/sub/sub/data.dart'; +import 'package:PiliPlus/models_new/sub/sub/list.dart'; +import 'package:PiliPlus/models_new/video/video_tag/data.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/storage.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:dio/dio.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -53,180 +47,6 @@ class UserHttp { } } - // 收藏夹 - static Future> userfavFolder({ - required int pn, - required int ps, - required dynamic mid, - }) async { - var res = await Request().get(Api.userFavFolder, queryParameters: { - 'pn': pn, - 'ps': ps, - 'up_mid': mid, - }); - if (res.data['code'] == 0) { - return Success(FavFolderData.fromJson(res.data['data'])); - } else { - return Error(res.data['message'] ?? '账号未登录'); - } - } - - static Future sortFavFolder({ - required List sort, - }) async { - Map data = { - 'sort': sort.join(','), - 'csrf': Accounts.main.csrf, - }; - Utils.appSign(data); - var res = await Request().post( - Api.sortFavFolder, - data: data, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return {'status': true, 'data': res.data['data']}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future sortFav({ - required dynamic mediaId, - required List sort, - }) async { - Map data = { - 'media_id': mediaId, - 'sort': sort.join(','), - 'csrf': Accounts.main.csrf, - }; - Utils.appSign(data); - var res = await Request().post( - Api.sortFav, - data: data, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return {'status': true, 'data': res.data['data']}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future cleanFav({ - required dynamic mediaId, - }) async { - var res = await Request().post( - Api.cleanFav, - data: { - 'media_id': mediaId, - 'platform': 'web', - 'csrf': Accounts.main.csrf, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return {'status': true, 'data': res.data['data']}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future deleteFolder({ - required List mediaIds, - }) async { - var res = await Request().post(Api.deleteFolder, - data: { - 'media_ids': mediaIds.join(','), - 'platform': 'web', - 'csrf': Accounts.main.csrf, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - )); - if (res.data['code'] == 0) { - return {'status': true, 'data': res.data['data']}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future addOrEditFolder({ - required bool isAdd, - dynamic mediaId, - required String title, - required int privacy, - required String cover, - required String intro, - }) async { - var res = await Request().post(isAdd ? Api.addFolder : Api.editFolder, - data: { - 'title': title, - 'intro': intro, - 'privacy': privacy, - 'cover': cover.isNotEmpty ? Uri.encodeFull(cover) : cover, - 'csrf': Accounts.main.csrf, - if (mediaId != null) 'media_id': mediaId, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - )); - if (res.data['code'] == 0) { - return { - 'status': true, - 'data': FavFolderItemData.fromJson(res.data['data']) - }; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future folderInfo({ - dynamic mediaId, - }) async { - var res = await Request().get( - Api.folderInfo, - queryParameters: { - 'media_id': mediaId, - }, - ); - if (res.data['code'] == 0) { - return {'status': true, 'data': FolderInfo.fromJson(res.data['data'])}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future> userFavFolderDetail( - {required int mediaId, - required int pn, - required int ps, - String keyword = '', - String order = 'mtime', - int type = 0}) async { - var res = await Request().get(Api.favResourceList, queryParameters: { - 'media_id': mediaId, - 'pn': pn, - 'ps': ps, - 'keyword': keyword, - 'order': order, - 'type': type, - 'tid': 0, - 'platform': 'web' - }); - if (res.data['code'] == 0) { - return Success(FavDetailData.fromJson(res.data['data'])); - } else { - return Error(res.data['message']); - } - } - // 稍后再看 static Future> seeYouLater({ required int page, @@ -445,7 +265,7 @@ class UserHttp { } // 我的订阅 - static Future?>> userSubFolder({ + static Future?>> userSubFolder({ required int mid, required int pn, required int ps, @@ -460,227 +280,12 @@ class UserHttp { }, ); if (res.data['code'] == 0 && res.data['data'] is Map) { - return Success(SubFolderModelData.fromJson(res.data['data']).list); + return Success(SubData.fromJson(res.data['data']).list); } else { return Error(res.data['message']); } } - static Future> favSeasonList({ - required int id, - required int pn, - required int ps, - }) async { - var res = await Request().get( - Api.favSeasonList, - queryParameters: { - 'season_id': id, - 'ps': ps, - 'pn': pn, - }, - ); - if (res.data['code'] == 0) { - return Success(SubDetailModelData.fromJson(res.data['data'])); - } else { - return Error(res.data['message']); - } - } - - static Future> favTopic({ - required int page, - }) async { - var res = await Request().get( - Api.favTopicList, - queryParameters: { - 'page_size': 24, - 'page_num': page, - 'web_location': 333.1387, - }, - ); - if (res.data['code'] == 0) { - return Success(FavTopicData.fromJson(res.data['data'])); - } else { - return Error(res.data['message']); - } - } - - static Future addFavTopic(topicId) async { - var res = await Request().post( - Api.addFavTopic, - data: { - 'topic_id': topicId, - 'csrf': Accounts.main.csrf, - }, - options: Options(contentType: Headers.formUrlEncodedContentType), - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future delFavTopic(topicId) async { - var res = await Request().post( - Api.delFavTopic, - data: { - 'topic_id': topicId, - 'csrf': Accounts.main.csrf, - }, - options: Options(contentType: Headers.formUrlEncodedContentType), - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future likeTopic(topicId, bool isLike) async { - var res = await Request().post( - Api.likeTopic, - data: { - 'action': isLike ? 'cancel_like' : 'like', - 'up_mid': Accounts.main.mid, - 'topic_id': topicId, - 'csrf': Accounts.main.csrf, - 'business': 'topic', - }, - options: Options(contentType: Headers.formUrlEncodedContentType), - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future> favArticle({ - required int page, - }) async { - var res = await Request().get( - Api.favArticle, - queryParameters: { - 'page_size': 20, - 'page': page, - }, - ); - if (res.data['code'] == 0) { - return Success(FavArticleData.fromJson(res.data['data'])); - } else { - return Error(res.data['message']); - } - } - - static Future addFavArticle({ - required dynamic id, - }) async { - var res = await Request().post( - Api.addFavArticle, - data: { - 'id': id, - 'csrf': Accounts.main.csrf, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future delFavArticle({ - required dynamic id, - }) async { - var res = await Request().post( - Api.delFavArticle, - data: { - 'id': id, - 'csrf': Accounts.main.csrf, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future communityAction({ - required dynamic opusId, - required dynamic action, - }) async { - var res = await Request().post( - Api.communityAction, - queryParameters: { - 'csrf': Accounts.main.csrf, - }, - data: { - "entity": { - "object_id_str": opusId, - "type": {"biz": 2} - }, - "action": action, // 3 fav, 4 unfav - }, - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future> favResourceList({ - required int id, - required int pn, - required int ps, - }) async { - var res = await Request().get(Api.favResourceList, queryParameters: { - 'media_id': id, - 'ps': ps, - 'pn': pn, - }); - if (res.data['code'] == 0) { - return Success(SubDetailModelData.fromJson(res.data['data'])); - } else { - return Error(res.data['message']); - } - } - - // 取消订阅 - static Future cancelSub({required int id, required int type}) async { - late Response res; - if (type == 11) { - res = await Request().post( - Api.unfavFolder, - queryParameters: { - 'media_id': id, - 'csrf': Accounts.main.csrf, - }, - ); - } else { - res = await Request().post( - Api.unfavSeason, - queryParameters: { - 'platform': 'web', - 'season_id': id, - 'csrf': Accounts.main.csrf, - }, - ); - } - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - static Future> videoTags({required String bvid}) async { var res = await Request().get(Api.videoTags, queryParameters: {'bvid': bvid}); @@ -713,7 +318,7 @@ class UserHttp { 'type': type, 'biz_id': bizId, if (oid != null) 'oid': oid, - if (otype != null) 'otype': otype, // video:2 // bangumi: 24 + if (otype != null) 'otype': otype, // ugc:2 // pgc: 24 'ps': ps, 'direction': direction, 'desc': desc, diff --git a/lib/http/video.dart b/lib/http/video.dart index 9e2c250f..798339d2 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -8,20 +8,18 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/login.dart'; import 'package:PiliPlus/models/common/account_type.dart'; import 'package:PiliPlus/models/home/rcmd/result.dart'; -import 'package:PiliPlus/models/member/article.dart'; import 'package:PiliPlus/models/model_hot_video_item.dart'; import 'package:PiliPlus/models/model_rec_video_item.dart'; -import 'package:PiliPlus/models/pgc/pgc_rank/pgc_rank_item_model.dart'; import 'package:PiliPlus/models/pgc_lcf.dart'; -import 'package:PiliPlus/models/play_info/data.dart'; -import 'package:PiliPlus/models/triple/pgc_triple.dart'; -import 'package:PiliPlus/models/triple/ugc_triple.dart'; -import 'package:PiliPlus/models/user/fav_folder.dart'; -import 'package:PiliPlus/models/video/ai.dart'; -import 'package:PiliPlus/models/video/note_list/data.dart'; import 'package:PiliPlus/models/video/play/url.dart'; -import 'package:PiliPlus/models/video_detail/video_detail_response.dart'; -import 'package:PiliPlus/models/video_relation/data.dart'; +import 'package:PiliPlus/models_new/pgc/pgc_rank/pgc_rank_item_model.dart'; +import 'package:PiliPlus/models_new/triple/pgc_triple.dart'; +import 'package:PiliPlus/models_new/triple/ugc_triple.dart'; +import 'package:PiliPlus/models_new/video/video_ai_conclusion/data.dart'; +import 'package:PiliPlus/models_new/video/video_detail/video_detail_response.dart'; +import 'package:PiliPlus/models_new/video/video_note_list/data.dart'; +import 'package:PiliPlus/models_new/video/video_play_info/data.dart'; +import 'package:PiliPlus/models_new/video/video_relation/data.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/recommend_filter.dart'; @@ -213,7 +211,7 @@ class VideoHttp { try { var res = await Request().get( - epid != null && usePgcApi ? Api.bangumiVideoUrl : Api.videoUrl, + epid != null && usePgcApi ? Api.pgcUrl : Api.ugcUrl, queryParameters: params, ); @@ -281,33 +279,6 @@ class VideoHttp { } } - static Future seasonFav({ - required bool isFav, - required dynamic seasonId, - }) async { - var res = await Request().post( - Api.seasonFav + (isFav ? 'unfav' : 'fav'), - data: { - 'platform': 'web', - 'season_id': seasonId, - 'csrf': Accounts.main.csrf, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return { - 'status': true, - }; - } else { - return { - 'status': false, - 'msg': res.data['message'], - }; - } - } - static Future videoRelation({required dynamic bvid}) async { var res = await Request().get( Api.videoRelation, @@ -346,10 +317,10 @@ class VideoHttp { } } - // 获取点赞/投币/收藏状态 bangumi - static Future bangumiLikeCoinFav({dynamic epId}) async { + // 获取点赞/投币/收藏状态 pgc + static Future pgcLikeCoinFav({dynamic epId}) async { var res = await Request().get( - Api.bangumiLikeCoinFav, + Api.pgcLikeCoinFav, queryParameters: {'ep_id': epId}, ); if (res.data['code'] == 0) { @@ -383,7 +354,7 @@ class VideoHttp { } } - // 一键三连 bangumi + // 一键三连 pgc static Future triple({dynamic epId, required dynamic seasonId}) async { var res = await Request().post( Api.triple, @@ -524,121 +495,6 @@ class VideoHttp { } } - // (取消)收藏 - static Future delFav({ - List? ids, - String? delIds, - }) async { - var res = await Request().post( - Api.delFav, - data: { - 'resources': ids?.join(','), - 'media_id': delIds, - 'platform': 'web', - 'csrf': Accounts.main.csrf, - }, - options: Options(contentType: Headers.formUrlEncodedContentType), - ); - if (res.data['code'] == 0) { - return {'status': true, 'data': res.data['data']}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - // (取消)收藏 - static Future favVideo({ - int? aid, - String? addIds, - String? delIds, - int? type, - }) async { - var res = await Request().post( - Api.favVideo, - data: { - 'rid': aid, - 'type': type ?? 2, - 'add_media_ids': addIds ?? '', - 'del_media_ids': delIds ?? '', - 'csrf': Accounts.main.csrf, - }, - options: Options(contentType: Headers.formUrlEncodedContentType), - ); - if (res.data['code'] == 0) { - return {'status': true, 'data': res.data['data']}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future copyOrMoveFav({ - required bool isCopy, - required bool isFav, - required dynamic srcMediaId, - required dynamic tarMediaId, - dynamic mid, - required List resources, - }) async { - var res = await Request().post( - isFav - ? isCopy - ? Api.copyFav - : Api.moveFav - : isCopy - ? Api.copyToview - : Api.moveToview, - data: { - if (srcMediaId != null) 'src_media_id': srcMediaId, - 'tar_media_id': tarMediaId, - if (mid != null) 'mid': mid, - 'resources': resources.join(','), - 'platform': 'web', - 'csrf': Accounts.main.csrf, - }, - options: Options(contentType: Headers.formUrlEncodedContentType), - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - static Future allFavFolders(mid) async { - var res = await Request().get( - Api.favFolder, - queryParameters: {'up_mid': mid}, - ); - if (res.data['code'] == 0) { - FavFolderData data = FavFolderData.fromJson(res.data['data']); - return {'status': true, 'data': data}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - - // 查看视频被收藏在哪个文件夹 - static Future videoInFolder({ - dynamic mid, - dynamic rid, - dynamic type, - }) async { - var res = await Request().get( - Api.favFolder, - queryParameters: { - 'up_mid': mid, - 'rid': rid, - if (type != null) 'type': type, - }, - ); - if (res.data['code'] == 0) { - FavFolderData data = FavFolderData.fromJson(res.data['data']); - return {'status': true, 'data': data}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } - // 发表评论 replyAdd // type num 评论区类型代码 必要 类型代码见表 @@ -800,8 +656,8 @@ class VideoHttp { } // 添加追番 - static Future bangumiAdd({int? seasonId}) async { - var res = await Request().post(Api.bangumiAdd, queryParameters: { + static Future pgcAdd({int? seasonId}) async { + var res = await Request().post(Api.pgcAdd, queryParameters: { 'season_id': seasonId, 'csrf': Accounts.main.csrf, }); @@ -821,8 +677,8 @@ class VideoHttp { } // 取消追番 - static Future bangumiDel({int? seasonId}) async { - var res = await Request().post(Api.bangumiDel, queryParameters: { + static Future pgcDel({int? seasonId}) async { + var res = await Request().post(Api.pgcDel, queryParameters: { 'season_id': seasonId, 'csrf': Accounts.main.csrf, }); @@ -841,12 +697,12 @@ class VideoHttp { } } - static Future bangumiUpdate({ + static Future pgcUpdate({ required List seasonId, required dynamic status, }) async { var res = await Request().post( - Api.bangumiUpdate, + Api.pgcUpdate, data: { 'season_id': seasonId.join(','), 'status': status, @@ -890,7 +746,7 @@ class VideoHttp { if (res.data['code'] == 0 && res.data['data']['code'] == 0) { return { 'status': true, - 'data': AiConclusionModel.fromJson(res.data['data']), + 'data': AiConclusionData.fromJson(res.data['data']), }; } else { return {'status': false, 'msg': res.data['message']}; @@ -1016,7 +872,7 @@ class VideoHttp { } } - static Future> getVideoNoteList({ + static Future> getVideoNoteList({ dynamic oid, dynamic uperMid, required int page, @@ -1033,120 +889,9 @@ class VideoHttp { }, ); if (res.data['code'] == 0) { - return Success(NoteListData.fromJson(res.data['data'])); + return Success(VideoNoteData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - - static Future?>> noteList({ - required int page, - }) async { - var res = await Request().get( - Api.noteList, - queryParameters: { - 'pn': page, - 'ps': 10, - 'csrf': Accounts.main.csrf, - }, - ); - if (res.data['code'] == 0) { - List? list = (res.data['data']?['list'] as List?) - ?.map((e) => FavNoteModel.fromJson(e)) - .toList(); - return Success(list); - } else { - return Error(res.data['message']); - } - } - - static Future?>> userNoteList({ - required int page, - }) async { - var res = await Request().get( - Api.userNoteList, - queryParameters: { - 'pn': page, - 'ps': 10, - 'csrf': Accounts.main.csrf, - }, - ); - if (res.data['code'] == 0) { - List? list = (res.data['data']?['list'] as List?) - ?.map((e) => FavNoteModel.fromJson(e)) - .toList(); - return Success(list); - } else { - return Error(res.data['message']); - } - } - - static Future addNote({ - required oid, - required String title, - required String summary, - }) async { - String noteId = ''; - try { - final res = await Request().get(Api.archiveNote, queryParameters: { - 'oid': oid, - 'oid_type': 0, - 'csrf': Accounts.main.csrf, - }); - if (res.data['code'] == 0) { - if (res.data['data']?['noteIds'] != null) { - noteId = res.data['data']['noteIds'].first; - } - } - } catch (_) {} - - final res = await Request().post( - Api.addNote, - data: { - 'cont_len': summary.length, - 'note_id': noteId, - 'oid': oid, - 'oid_type': 0, - 'platform': 'web', - 'title': title, - 'summary': summary, - 'content': jsonEncode([ - {"insert": summary}, - ]), - 'from': 'close', - 'hash': DateTime.now().millisecondsSinceEpoch, - 'tags': '', - 'csrf': Accounts.main.csrf, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return Success(res.data['data']?['list']); - } else { - return Error(res.data['message']); - } - } - - static Future delNote({ - required bool isPublish, - required List noteIds, - }) async { - final res = await Request().post( - isPublish ? Api.delPublishNote : Api.delNote, - data: { - isPublish ? 'cvids' : 'note_ids': noteIds.join(','), - 'csrf': Accounts.main.csrf, - }, - options: Options( - contentType: Headers.formUrlEncodedContentType, - ), - ); - if (res.data['code'] == 0) { - return {'status': true}; - } else { - return {'status': false, 'msg': res.data['message']}; - } - } } diff --git a/lib/models/bfs_res/data.dart b/lib/models/bfs_res/data.dart deleted file mode 100644 index f8bfa428..00000000 --- a/lib/models/bfs_res/data.dart +++ /dev/null @@ -1,22 +0,0 @@ -class BfsResData { - String? imageUrl; - int? imageWidth; - int? imageHeight; - double? imgSize; - - BfsResData({this.imageUrl, this.imageWidth, this.imageHeight, this.imgSize}); - - factory BfsResData.fromJson(Map json) => BfsResData( - imageUrl: json['image_url'] as String?, - imageWidth: json['image_width'] as int?, - imageHeight: json['image_height'] as int?, - imgSize: (json['img_size'] as num?)?.toDouble(), - ); - - Map toJson() => { - 'image_url': imageUrl, - 'image_width': imageWidth, - 'image_height': imageHeight, - 'img_size': imgSize, - }; -} diff --git a/lib/models/common/episode_panel_type.dart b/lib/models/common/episode_panel_type.dart index 713ddb6b..27375bd4 100644 --- a/lib/models/common/episode_panel_type.dart +++ b/lib/models/common/episode_panel_type.dart @@ -1,7 +1,7 @@ enum EpisodeType { part('分P'), season('合集'), - bangumi('番剧'); + pgc('番剧'); final String title; const EpisodeType(this.title); diff --git a/lib/models/common/home_tab_type.dart b/lib/models/common/home_tab_type.dart index 27250d5e..40d7d6e0 100644 --- a/lib/models/common/home_tab_type.dart +++ b/lib/models/common/home_tab_type.dart @@ -1,11 +1,11 @@ import 'package:PiliPlus/models/common/enum_with_label.dart'; -import 'package:PiliPlus/pages/bangumi/controller.dart'; -import 'package:PiliPlus/pages/bangumi/view.dart'; import 'package:PiliPlus/pages/common/common_controller.dart'; import 'package:PiliPlus/pages/hot/controller.dart'; import 'package:PiliPlus/pages/hot/view.dart'; import 'package:PiliPlus/pages/live/controller.dart'; import 'package:PiliPlus/pages/live/view.dart'; +import 'package:PiliPlus/pages/pgc/controller.dart'; +import 'package:PiliPlus/pages/pgc/view.dart'; import 'package:PiliPlus/pages/rank/controller.dart'; import 'package:PiliPlus/pages/rank/view.dart'; import 'package:PiliPlus/pages/rcmd/controller.dart'; @@ -32,7 +32,7 @@ enum HomeTabType implements EnumWithLabel { HomeTabType.rank => (Get.find) as ScrollOrRefreshMixin Function(), HomeTabType.bangumi || HomeTabType.cinema => () => - Get.find(tag: name), + Get.find(tag: name), }; Widget get page => switch (this) { @@ -40,7 +40,7 @@ enum HomeTabType implements EnumWithLabel { HomeTabType.rcmd => const RcmdPage(), HomeTabType.hot => const HotPage(), HomeTabType.rank => const RankPage(), - HomeTabType.bangumi => const BangumiPage(tabType: HomeTabType.bangumi), - HomeTabType.cinema => const BangumiPage(tabType: HomeTabType.cinema), + HomeTabType.bangumi => const PgcPage(tabType: HomeTabType.bangumi), + HomeTabType.cinema => const PgcPage(tabType: HomeTabType.cinema), }; } diff --git a/lib/models/dynamics/article_content_model.dart b/lib/models/dynamics/article_content_model.dart index b274dbe9..ce6ad0ef 100644 --- a/lib/models/dynamics/article_content_model.dart +++ b/lib/models/dynamics/article_content_model.dart @@ -402,86 +402,3 @@ class Code { lang = json['lang']; } } - -// class ArticleContentModel { -// ArticleContentModel({ -// this.attributes, -// this.insert, -// }); -// Attributes? attributes; -// dynamic insert; - -// ArticleContentModel.fromJson(Map json) { -// attributes = json['attributes'] == null -// ? null -// : Attributes.fromJson(json['attributes']); -// insert = json['insert'] == null -// ? null -// : json['attributes']?['class'] == 'normal-img' -// ? Insert.fromJson(json['insert']) -// : json['insert']; -// } -// } - -// class Insert { -// Insert({ -// this.nativeImage, -// }); -// NativeImage? nativeImage; - -// Insert.fromJson(Map json) { -// nativeImage = json['native-image'] == null -// ? null -// : NativeImage.fromJson(json['native-image']); -// } -// } - -// class NativeImage { -// NativeImage({ -// this.alt, -// this.url, -// this.width, -// this.height, -// this.size, -// this.status, -// }); - -// dynamic alt; -// dynamic url; -// dynamic width; -// dynamic height; -// dynamic size; -// dynamic status; - -// NativeImage.fromJson(Map json) { -// alt = json['alt']; -// url = json['url']; -// width = json['width']; -// height = json['height']; -// size = json['size']; -// status = json['status']; -// } -// } - -// class Attributes { -// Attributes({ -// this.clazz, -// this.bold, -// this.color, -// this.italic, -// this.strike, -// }); -// String? clazz; -// bool? bold; -// String? color; -// bool? italic; -// bool? strike; - -// Attributes.fromJson(Map json) { -// clazz = json['class']; -// bold = json['bold']; -// color = json['color']; -// italic = json['italic']; -// strike = json['strike']; -// } -// } diff --git a/lib/models/dynamics/article_list/data.dart b/lib/models/dynamics/article_list/data.dart deleted file mode 100644 index f3ae7e6c..00000000 --- a/lib/models/dynamics/article_list/data.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:PiliPlus/models/dynamics/article_list/list.dart'; -import 'package:PiliPlus/models/model_owner.dart'; -import 'package:PiliPlus/models/space_article/item.dart'; - -class ArticleListData { - ArticleList? list; - List? articles; - Owner? author; - bool? attention; - - ArticleListData({ - this.list, - this.articles, - this.author, - this.attention, - }); - - factory ArticleListData.fromJson(Map json) => - ArticleListData( - list: json['list'] == null - ? null - : ArticleList.fromJson(json['list'] as Map), - articles: (json['articles'] as List?) - ?.map((e) => SpaceArticleItem.fromJson(e as Map)) - .toList(), - author: json['author'] == null - ? null - : Owner.fromJson(json['author'] as Map), - attention: json['attention'] as bool?, - ); -} diff --git a/lib/models/dynamics/article_opus/attributes.dart b/lib/models/dynamics/article_opus/attributes.dart deleted file mode 100644 index 6909675f..00000000 --- a/lib/models/dynamics/article_opus/attributes.dart +++ /dev/null @@ -1,9 +0,0 @@ -class Attributes { - String? clazz; - - Attributes({this.clazz}); - - factory Attributes.fromJson(Map json) => Attributes( - clazz: json['class'] as String?, - ); -} diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 47315081..03083f4e 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/models/dynamics/article_content_model.dart'; import 'package:PiliPlus/models/model_avatar.dart'; +import 'package:PiliPlus/models_new/live/live_feed_index/watched_show.dart'; class DynamicsDataModel { bool? hasMore; @@ -55,7 +56,7 @@ class DynamicItemModel { modules = json['item']?['modules'] == null ? ItemModulesModel() : ItemModulesModel.fromOpusJson( - (json['item']?['modules'] as List).cast()); + (json['item']['modules'] as List).cast()); if (json['fallback'] != null) { fallback = Fallback.fromJson(json['fallback']); @@ -1071,27 +1072,6 @@ class LivePlayInfo { ); } -class WatchedShow { - bool? watchedShowSwitch; - int? num; - String? textSmall; - String? textLarge; - - WatchedShow({ - this.watchedShowSwitch, - this.num, - this.textSmall, - this.textLarge, - }); - - factory WatchedShow.fromJson(Map json) => WatchedShow( - watchedShowSwitch: json["switch"], - num: json["num"], - textSmall: json["text_small"], - textLarge: json["text_large"], - ); -} - class DynamicTopicModel { DynamicTopicModel({ this.id, @@ -1443,9 +1423,11 @@ class ModuleStatModel { // DynamicStat? coin; ModuleStatModel.fromJson(Map json) { - comment = DynamicStat.fromJson(json['comment']); - forward = DynamicStat.fromJson(json['forward']); - like = DynamicStat.fromJson(json['like']); + comment = + json['comment'] == null ? null : DynamicStat.fromJson(json['comment']); + forward = + json['forward'] == null ? null : DynamicStat.fromJson(json['forward']); + like = json['like'] == null ? null : DynamicStat.fromJson(json['like']); if (json['favorite'] != null) { favorite = DynamicStat.fromJson(json['favorite']); } diff --git a/lib/models/dynamics/vote_model.dart b/lib/models/dynamics/vote_model.dart index 7a945e06..b02cb471 100644 --- a/lib/models/dynamics/vote_model.dart +++ b/lib/models/dynamics/vote_model.dart @@ -37,7 +37,7 @@ class VoteInfo extends SimpleVoteInfo { myVotes = (json['my_votes'] as List?)?.cast(); // doVote options = (json['options'] as List?)?.map((v) => Option.fromJson(v)).toList() ?? - []; +