diff --git a/lib/http/bangumi.dart b/lib/http/bangumi.dart index b08027551..c01a890f3 100644 --- a/lib/http/bangumi.dart +++ b/lib/http/bangumi.dart @@ -1,17 +1,18 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/list.dart'; -import 'package:PiliPlus/models/bangumi/pgc_index/condition.dart'; -import 'package:PiliPlus/models/bangumi/pgc_review/data.dart'; -import 'package:PiliPlus/models/bangumi/pgc_timeline/pgc_timeline.dart'; -import 'package:PiliPlus/models/bangumi/pgc_timeline/result.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/utils/storage.dart' show Accounts; import 'package:dio/dio.dart'; class BangumiHttp { - static Future pgcIndexResult({ + static Future> pgcIndexResult({ required int page, required Map params, seasonType, @@ -30,7 +31,7 @@ class BangumiHttp { }, ); if (res.data['code'] == 0) { - return Success(res.data['data']); + return Success(PgcIndexItemData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } diff --git a/lib/http/member.dart b/lib/http/member.dart index 7f6fac9ac..2423bc7a6 100644 --- a/lib/http/member.dart +++ b/lib/http/member.dart @@ -14,6 +14,7 @@ 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'; @@ -112,7 +113,7 @@ class MemberHttp { } } - static Future seasonSeriesList({ + static Future> seasonSeriesList({ required int? mid, required int pn, }) async { @@ -125,7 +126,8 @@ class MemberHttp { }, ); if (res.data['code'] == 0) { - return Success(res.data['data']?['items_lists']); + return Success( + MemberSsData.fromJson(res.data['data']?['items_lists'] ?? {})); } else { return Error(res.data['message']); } diff --git a/lib/http/search.dart b/lib/http/search.dart index 5e920754c..fdcf412d3 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -3,8 +3,8 @@ import 'dart:convert'; import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/info.dart'; import 'package:PiliPlus/models/common/search_type.dart'; +import 'package:PiliPlus/models/pgc/info.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'; diff --git a/lib/http/user.dart b/lib/http/user.dart index 79a76f8d6..14057a005 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -2,6 +2,7 @@ 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/model_hot_video_item.dart'; import 'package:PiliPlus/models/user/fav_detail.dart'; import 'package:PiliPlus/models/user/fav_folder.dart'; @@ -12,6 +13,7 @@ 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/later.dart'; +import 'package:PiliPlus/models/video_tag/data.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -549,7 +551,7 @@ class UserHttp { } } - static Future favArticle({ + static Future> favArticle({ required int page, }) async { var res = await Request().get( @@ -560,7 +562,7 @@ class UserHttp { }, ); if (res.data['code'] == 0) { - return Success(res.data['data']); + return Success(FavArticleData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } @@ -679,7 +681,10 @@ class UserHttp { var res = await Request().get(Api.videoTags, queryParameters: {'bvid': bvid}); if (res.data['code'] == 0) { - return {'status': true, 'data': res.data['data']}; + List? list = (res.data['data'] as List?) + ?.map((e) => VideoTagItem.fromJson(e)) + .toList(); + return {'status': true, 'data': list}; } else { return {'status': false}; } diff --git a/lib/http/video.dart b/lib/http/video.dart index b6a21a73f..0a948b9b1 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -6,14 +6,15 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/login.dart'; -import 'package:PiliPlus/models/bangumi/pgc_rank/pgc_rank_item_model.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/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_res.dart'; import 'package:PiliPlus/utils/extension.dart'; @@ -1015,7 +1016,7 @@ class VideoHttp { } } - static Future getVideoNoteList({ + static Future> getVideoNoteList({ dynamic oid, dynamic uperMid, required int page, @@ -1032,13 +1033,13 @@ class VideoHttp { }, ); if (res.data['code'] == 0) { - return Success(res.data['data']); + return Success(NoteListData.fromJson(res.data['data'])); } else { return Error(res.data['message']); } } - static Future?>> noteList({ + static Future?>> noteList({ required int page, }) async { var res = await Request().get( @@ -1050,8 +1051,8 @@ class VideoHttp { }, ); if (res.data['code'] == 0) { - List? list = (res.data['data']?['list'] as List?) - ?.map((e) => FavArticleModel.fromJson(e)) + List? list = (res.data['data']?['list'] as List?) + ?.map((e) => FavNoteModel.fromJson(e)) .toList(); return Success(list); } else { @@ -1059,7 +1060,7 @@ class VideoHttp { } } - static Future?>> userNoteList({ + static Future?>> userNoteList({ required int page, }) async { var res = await Request().get( @@ -1071,8 +1072,8 @@ class VideoHttp { }, ); if (res.data['code'] == 0) { - List? list = (res.data['data']?['list'] as List?) - ?.map((e) => FavArticleModel.fromJson(e)) + List? list = (res.data['data']?['list'] as List?) + ?.map((e) => FavNoteModel.fromJson(e)) .toList(); return Success(list); } else { diff --git a/lib/models/fav_article/author.dart b/lib/models/fav_article/author.dart new file mode 100644 index 000000000..d32240e6f --- /dev/null +++ b/lib/models/fav_article/author.dart @@ -0,0 +1,16 @@ +class Author { + Author({ + this.mid, + this.name, + this.face, + }); + String? mid; + String? name; + String? face; + + Author.fromJson(Map json) { + mid = json["mid"]; + name = json["name"]; + face = json['face']; + } +} diff --git a/lib/models/fav_article/cover.dart b/lib/models/fav_article/cover.dart new file mode 100644 index 000000000..ae44359f8 --- /dev/null +++ b/lib/models/fav_article/cover.dart @@ -0,0 +1,13 @@ +class Cover { + String? url; + int? width; + int? height; + + Cover({this.url, this.width, this.height}); + + factory Cover.fromJson(Map json) => Cover( + url: json['url'] as String?, + width: json['width'] as int?, + height: json['height'] as int?, + ); +} diff --git a/lib/models/fav_article/data.dart b/lib/models/fav_article/data.dart new file mode 100644 index 000000000..02b6f5b87 --- /dev/null +++ b/lib/models/fav_article/data.dart @@ -0,0 +1,22 @@ +import 'package:PiliPlus/models/fav_article/item.dart'; + +class FavArticleData { + List? items; + bool? hasMore; + String? offset; + + FavArticleData({ + this.items, + this.hasMore, + this.offset, + }); + + factory FavArticleData.fromJson(Map json) => FavArticleData( + items: (json['items'] as List?) + ?.map( + (e) => FavArticleItemModel.fromJson(e as Map)) + .toList(), + hasMore: json['has_more'] as bool?, + offset: json['offset'] as String?, + ); +} diff --git a/lib/models/fav_article/item.dart b/lib/models/fav_article/item.dart new file mode 100644 index 000000000..b9e22ed24 --- /dev/null +++ b/lib/models/fav_article/item.dart @@ -0,0 +1,43 @@ +import 'package:PiliPlus/models/fav_article/author.dart'; +import 'package:PiliPlus/models/fav_article/cover.dart'; +import 'package:PiliPlus/models/fav_article/stat.dart'; + +class FavArticleItemModel { + String? jumpUrl; + String? opusId; + String? content; + dynamic badge; + Author? author; + Cover? cover; + Stat? stat; + String? pubTime; + + FavArticleItemModel({ + this.jumpUrl, + this.opusId, + this.content, + this.badge, + this.author, + this.cover, + this.stat, + this.pubTime, + }); + + factory FavArticleItemModel.fromJson(Map json) => + FavArticleItemModel( + jumpUrl: json['jump_url'] as String?, + opusId: json['opus_id'] as String?, + content: json['content'] as String?, + badge: json['badge'] as dynamic, + author: json['author'] == null + ? null + : Author.fromJson(json['author'] as Map), + cover: json['cover'] == null + ? null + : Cover.fromJson(json['cover'] as Map), + stat: json['stat'] == null + ? null + : Stat.fromJson(json['stat'] as Map), + pubTime: json['pub_time'] as String?, + ); +} diff --git a/lib/models/fav_article/stat.dart b/lib/models/fav_article/stat.dart new file mode 100644 index 000000000..1164032cc --- /dev/null +++ b/lib/models/fav_article/stat.dart @@ -0,0 +1,11 @@ +class Stat { + String? view; + String? like; + + Stat({this.view, this.like}); + + factory Stat.fromJson(Map json) => Stat( + view: json['view'] as String?, + like: json['like'] as String?, + ); +} diff --git a/lib/models/member/article.dart b/lib/models/member/article.dart index 33152a7ed..adcf57110 100644 --- a/lib/models/member/article.dart +++ b/lib/models/member/article.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/pages/common/multi_select_controller.dart'; -class FavArticleModel with MultiSelectData { - FavArticleModel({ +class FavNoteModel with MultiSelectData { + FavNoteModel({ this.webUrl, this.title, this.summary, @@ -19,7 +19,7 @@ class FavArticleModel with MultiSelectData { dynamic cvid; dynamic noteId; - FavArticleModel.fromJson(Map json) { + FavNoteModel.fromJson(Map json) { webUrl = json['web_url']; title = json['title']; summary = json['summary']; diff --git a/lib/models/member_ss/archive.dart b/lib/models/member_ss/archive.dart new file mode 100644 index 000000000..f27606e7e --- /dev/null +++ b/lib/models/member_ss/archive.dart @@ -0,0 +1,55 @@ +import 'package:PiliPlus/models/member_ss/stat.dart'; + +class MemberSsArchive { + int? aid; + String? bvid; + int? ctime; + int? duration; + bool? enableVt; + bool? interactiveVideo; + String? pic; + int? playbackPosition; + int? pubdate; + MemberSsStat? stat; + int? state; + String? title; + int? ugcPay; + String? vtDisplay; + int? isLessonVideo; + MemberSsArchive({ + this.aid, + this.bvid, + this.ctime, + this.duration, + this.enableVt, + this.interactiveVideo, + this.pic, + this.playbackPosition, + this.pubdate, + this.stat, + this.state, + this.title, + this.ugcPay, + this.vtDisplay, + this.isLessonVideo, + }); + + factory MemberSsArchive.fromJson(Map json) => + MemberSsArchive( + aid: json["aid"], + bvid: json["bvid"], + ctime: json["ctime"], + duration: json["duration"], + enableVt: json["enable_vt"], + interactiveVideo: json["interactive_video"], + pic: json["pic"], + playbackPosition: json["playback_position"], + pubdate: json["pubdate"], + stat: json["stat"] == null ? null : MemberSsStat.fromJson(json["stat"]), + state: json["state"], + title: json["title"], + ugcPay: json["ugc_pay"], + vtDisplay: json["vt_display"], + isLessonVideo: json["is_lesson_video"], + ); +} diff --git a/lib/models/member_ss/item.dart b/lib/models/member_ss/item.dart new file mode 100644 index 000000000..949d685cb --- /dev/null +++ b/lib/models/member_ss/item.dart @@ -0,0 +1,26 @@ +import 'package:PiliPlus/models/member_ss/page.dart'; +import 'package:PiliPlus/models/member_ss/season.dart'; + +class MemberSsData { + MemberSsPage? page; + List? seasonsList; + List? seriesList; + + MemberSsData({ + this.page, + this.seasonsList, + this.seriesList, + }); + + factory MemberSsData.fromJson(Map json) => MemberSsData( + page: json["page"] == null ? null : MemberSsPage.fromJson(json["page"]), + seasonsList: json["seasons_list"] == null + ? null + : List.from( + json["seasons_list"]!.map((x) => MemberSsModel.fromJson(x))), + seriesList: json["series_list"] == null + ? null + : List.from( + json["series_list"]!.map((x) => MemberSsModel.fromJson(x))), + ); +} diff --git a/lib/models/member_ss/page.dart b/lib/models/member_ss/page.dart new file mode 100644 index 000000000..f4a5c0425 --- /dev/null +++ b/lib/models/member_ss/page.dart @@ -0,0 +1,17 @@ +class MemberSsPage { + int? pageNum; + int? pageSize; + int? total; + + MemberSsPage({ + this.pageNum, + this.pageSize, + this.total, + }); + + factory MemberSsPage.fromJson(Map json) => MemberSsPage( + pageNum: json["page_num"], + pageSize: json["page_size"], + total: json["total"], + ); +} diff --git a/lib/models/member_ss/season.dart b/lib/models/member_ss/season.dart new file mode 100644 index 000000000..f5db88125 --- /dev/null +++ b/lib/models/member_ss/season.dart @@ -0,0 +1,25 @@ +import 'package:PiliPlus/models/member_ss/archive.dart'; +import 'package:PiliPlus/models/member_ss/stat.dart'; + +class MemberSsModel { + List? archives; + MemberSsMeta? meta; + List? recentAids; + + MemberSsModel({ + this.archives, + this.meta, + this.recentAids, + }); + + factory MemberSsModel.fromJson(Map json) => MemberSsModel( + archives: json["archives"] == null + ? null + : List.from( + json["archives"]!.map((x) => MemberSsArchive.fromJson(x))), + meta: json["meta"] == null ? null : MemberSsMeta.fromJson(json["meta"]), + recentAids: json["recent_aids"] == null + ? null + : List.from(json["recent_aids"]!.map((x) => x)), + ); +} diff --git a/lib/models/member_ss/stat.dart b/lib/models/member_ss/stat.dart new file mode 100644 index 000000000..9e0c42f66 --- /dev/null +++ b/lib/models/member_ss/stat.dart @@ -0,0 +1,50 @@ +class MemberSsStat { + int? view; + int? vt; + + MemberSsStat({ + this.view, + this.vt, + }); + + factory MemberSsStat.fromJson(Map json) => MemberSsStat( + view: json["view"], + vt: json["vt"], + ); +} + +class MemberSsMeta { + int? category; + String? cover; + String? description; + int? mid; + String? name; + int? ptime; + int? total; + dynamic seasonId; + dynamic seriesId; + + MemberSsMeta({ + this.category, + this.cover, + this.description, + this.mid, + this.name, + this.ptime, + this.total, + this.seasonId, + this.seriesId, + }); + + factory MemberSsMeta.fromJson(Map json) => MemberSsMeta( + category: json["category"], + cover: json["cover"], + description: json["description"], + mid: json["mid"], + name: json["name"], + ptime: json["ptime"], + total: json["total"], + seasonId: json["season_id"], + seriesId: json["series_id"], + ); +} diff --git a/lib/models/bangumi/info.dart b/lib/models/pgc/info.dart similarity index 100% rename from lib/models/bangumi/info.dart rename to lib/models/pgc/info.dart diff --git a/lib/models/bangumi/list.dart b/lib/models/pgc/list.dart similarity index 90% rename from lib/models/bangumi/list.dart rename to lib/models/pgc/list.dart index 6dc463b3f..b84627615 100644 --- a/lib/models/bangumi/list.dart +++ b/lib/models/pgc/list.dart @@ -66,7 +66,7 @@ class BangumiListItemModel with MultiSelectData { String? subTitle; String? title; String? titleIcon; - Map? newEp; + NewEp? newEp; String? progress; String? renewalTime; @@ -88,7 +88,15 @@ class BangumiListItemModel with MultiSelectData { subTitle = json['sub_title']; title = json['title']; titleIcon = json['title_icon']; - newEp = json['new_ep']; + newEp = json['new_ep'] == null ? null : NewEp.fromJson(json['new_ep']); progress = json['progress']; } } + +class NewEp { + String? indexShow; + + NewEp.fromJson(Map json) { + indexShow = json['index_show']; + } +} diff --git a/lib/models/bangumi/pgc_index/condition.dart b/lib/models/pgc/pgc_index/condition.dart similarity index 100% rename from lib/models/bangumi/pgc_index/condition.dart rename to lib/models/pgc/pgc_index/condition.dart diff --git a/lib/models/pgc/pgc_index_item/data.dart b/lib/models/pgc/pgc_index_item/data.dart new file mode 100644 index 000000000..e93632f2b --- /dev/null +++ b/lib/models/pgc/pgc_index_item/data.dart @@ -0,0 +1,22 @@ +import 'package:PiliPlus/models/pgc/pgc_index_item/list.dart'; + +class PgcIndexItemData { + int? hasNext; + List? list; + int? num; + int? size; + int? total; + + PgcIndexItemData({this.hasNext, this.list, this.num, this.size, this.total}); + + factory PgcIndexItemData.fromJson(Map json) => + PgcIndexItemData( + hasNext: json['has_next'] as int?, + list: (json['list'] as List?) + ?.map((e) => PgcIndexItemModel.fromJson(e as Map)) + .toList(), + num: json['num'] as int?, + size: json['size'] as int?, + total: json['total'] as int?, + ); +} diff --git a/lib/models/pgc/pgc_index_item/list.dart b/lib/models/pgc/pgc_index_item/list.dart new file mode 100644 index 000000000..39747b0bd --- /dev/null +++ b/lib/models/pgc/pgc_index_item/list.dart @@ -0,0 +1,57 @@ +class PgcIndexItemModel { + String? badge; + int? badgeType; + String? cover; + String? indexShow; + int? isFinish; + String? link; + int? mediaId; + String? order; + String? orderType; + String? score; + int? seasonId; + int? seasonStatus; + int? seasonType; + String? subTitle; + String? title; + String? titleIcon; + + PgcIndexItemModel({ + this.badge, + this.badgeType, + this.cover, + this.indexShow, + this.isFinish, + this.link, + this.mediaId, + this.order, + this.orderType, + this.score, + this.seasonId, + this.seasonStatus, + this.seasonType, + this.subTitle, + this.title, + this.titleIcon, + }); + + factory PgcIndexItemModel.fromJson(Map json) => + PgcIndexItemModel( + badge: json['badge'] as String?, + badgeType: json['badge_type'] as int?, + cover: json['cover'] as String?, + indexShow: json['index_show'] as String?, + isFinish: json['is_finish'] as int?, + link: json['link'] as String?, + mediaId: json['media_id'] as int?, + order: json['order'] as String?, + orderType: json['order_type'] as String?, + score: json['score'] as String?, + seasonId: json['season_id'] as int?, + seasonStatus: json['season_status'] as int?, + seasonType: json['season_type'] as int?, + subTitle: json['subTitle'] as String?, + title: json['title'] as String?, + titleIcon: json['title_icon'] as String?, + ); +} diff --git a/lib/models/bangumi/pgc_rank/badge_info.dart b/lib/models/pgc/pgc_rank/badge_info.dart similarity index 100% rename from lib/models/bangumi/pgc_rank/badge_info.dart rename to lib/models/pgc/pgc_rank/badge_info.dart diff --git a/lib/models/bangumi/pgc_rank/data.dart b/lib/models/pgc/pgc_rank/data.dart similarity index 88% rename from lib/models/bangumi/pgc_rank/data.dart rename to lib/models/pgc/pgc_rank/data.dart index 2b61e6a51..68d49a9ac 100644 --- a/lib/models/bangumi/pgc_rank/data.dart +++ b/lib/models/pgc/pgc_rank/data.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/models/bangumi/pgc_rank/pgc_rank_item_model.dart'; +import 'package:PiliPlus/models/pgc/pgc_rank/pgc_rank_item_model.dart'; class Data { List? list; diff --git a/lib/models/bangumi/pgc_rank/icon_font.dart b/lib/models/pgc/pgc_rank/icon_font.dart similarity index 100% rename from lib/models/bangumi/pgc_rank/icon_font.dart rename to lib/models/pgc/pgc_rank/icon_font.dart diff --git a/lib/models/bangumi/pgc_rank/new_ep.dart b/lib/models/pgc/pgc_rank/new_ep.dart similarity index 100% rename from lib/models/bangumi/pgc_rank/new_ep.dart rename to lib/models/pgc/pgc_rank/new_ep.dart diff --git a/lib/models/bangumi/pgc_rank/pgc_rank_item_model.dart b/lib/models/pgc/pgc_rank/pgc_rank_item_model.dart similarity index 89% rename from lib/models/bangumi/pgc_rank/pgc_rank_item_model.dart rename to lib/models/pgc/pgc_rank/pgc_rank_item_model.dart index 938a3880a..9f7c8e1fb 100644 --- a/lib/models/bangumi/pgc_rank/pgc_rank_item_model.dart +++ b/lib/models/pgc/pgc_rank/pgc_rank_item_model.dart @@ -1,7 +1,7 @@ -import 'package:PiliPlus/models/bangumi/pgc_rank/badge_info.dart'; -import 'package:PiliPlus/models/bangumi/pgc_rank/icon_font.dart'; -import 'package:PiliPlus/models/bangumi/pgc_rank/new_ep.dart'; -import 'package:PiliPlus/models/bangumi/pgc_rank/stat.dart'; +import 'package:PiliPlus/models/pgc/pgc_rank/badge_info.dart'; +import 'package:PiliPlus/models/pgc/pgc_rank/icon_font.dart'; +import 'package:PiliPlus/models/pgc/pgc_rank/new_ep.dart'; +import 'package:PiliPlus/models/pgc/pgc_rank/stat.dart'; class PgcRankItemModel { String? badge; diff --git a/lib/models/bangumi/pgc_rank/stat.dart b/lib/models/pgc/pgc_rank/stat.dart similarity index 100% rename from lib/models/bangumi/pgc_rank/stat.dart rename to lib/models/pgc/pgc_rank/stat.dart diff --git a/lib/models/bangumi/pgc_review/author.dart b/lib/models/pgc/pgc_review/author.dart similarity index 100% rename from lib/models/bangumi/pgc_review/author.dart rename to lib/models/pgc/pgc_review/author.dart diff --git a/lib/models/bangumi/pgc_review/data.dart b/lib/models/pgc/pgc_review/data.dart similarity index 87% rename from lib/models/bangumi/pgc_review/data.dart rename to lib/models/pgc/pgc_review/data.dart index fb6b10d4e..9b249e642 100644 --- a/lib/models/bangumi/pgc_review/data.dart +++ b/lib/models/pgc/pgc_review/data.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/models/bangumi/pgc_review/list.dart'; +import 'package:PiliPlus/models/pgc/pgc_review/list.dart'; class PgcReviewData { List? list; diff --git a/lib/models/bangumi/pgc_review/list.dart b/lib/models/pgc/pgc_review/list.dart similarity index 91% rename from lib/models/bangumi/pgc_review/list.dart rename to lib/models/pgc/pgc_review/list.dart index 8344d36e8..45c7cad96 100644 --- a/lib/models/bangumi/pgc_review/list.dart +++ b/lib/models/pgc/pgc_review/list.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/models/bangumi/pgc_review/author.dart'; -import 'package:PiliPlus/models/bangumi/pgc_review/stat.dart'; +import 'package:PiliPlus/models/pgc/pgc_review/author.dart'; +import 'package:PiliPlus/models/pgc/pgc_review/stat.dart'; class PgcReviewItemModel { Author? author; diff --git a/lib/models/bangumi/pgc_review/stat.dart b/lib/models/pgc/pgc_review/stat.dart similarity index 100% rename from lib/models/bangumi/pgc_review/stat.dart rename to lib/models/pgc/pgc_review/stat.dart diff --git a/lib/models/bangumi/pgc_timeline/episode.dart b/lib/models/pgc/pgc_timeline/episode.dart similarity index 97% rename from lib/models/bangumi/pgc_timeline/episode.dart rename to lib/models/pgc/pgc_timeline/episode.dart index 7d4a405e3..5b3502c76 100644 --- a/lib/models/bangumi/pgc_timeline/episode.dart +++ b/lib/models/pgc/pgc_timeline/episode.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/models/bangumi/pgc_timeline/icon_font.dart'; +import 'package:PiliPlus/models/pgc/pgc_timeline/icon_font.dart'; class Episode { String? cover; diff --git a/lib/models/bangumi/pgc_timeline/icon_font.dart b/lib/models/pgc/pgc_timeline/icon_font.dart similarity index 100% rename from lib/models/bangumi/pgc_timeline/icon_font.dart rename to lib/models/pgc/pgc_timeline/icon_font.dart diff --git a/lib/models/bangumi/pgc_timeline/pgc_timeline.dart b/lib/models/pgc/pgc_timeline/pgc_timeline.dart similarity index 89% rename from lib/models/bangumi/pgc_timeline/pgc_timeline.dart rename to lib/models/pgc/pgc_timeline/pgc_timeline.dart index 7772da821..c3917be90 100644 --- a/lib/models/bangumi/pgc_timeline/pgc_timeline.dart +++ b/lib/models/pgc/pgc_timeline/pgc_timeline.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/models/bangumi/pgc_timeline/result.dart'; +import 'package:PiliPlus/models/pgc/pgc_timeline/result.dart'; class PgcTimeline { int? code; diff --git a/lib/models/bangumi/pgc_timeline/result.dart b/lib/models/pgc/pgc_timeline/result.dart similarity index 92% rename from lib/models/bangumi/pgc_timeline/result.dart rename to lib/models/pgc/pgc_timeline/result.dart index 872b8b755..cc51e9281 100644 --- a/lib/models/bangumi/pgc_timeline/result.dart +++ b/lib/models/pgc/pgc_timeline/result.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/models/bangumi/pgc_timeline/episode.dart'; +import 'package:PiliPlus/models/pgc/pgc_timeline/episode.dart'; class Result { String? date; diff --git a/lib/models/space/favourite2.dart b/lib/models/space/favourite2.dart index 0f14102f7..b1d20d240 100644 --- a/lib/models/space/favourite2.dart +++ b/lib/models/space/favourite2.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/models/space_fav/list.dart'; import 'package:json_annotation/json_annotation.dart'; part 'favourite2.g.dart'; @@ -5,7 +6,7 @@ part 'favourite2.g.dart'; @JsonSerializable() class Favourite2 { int? count; - List? item; + List? item; Favourite2({this.count, this.item}); diff --git a/lib/models/space/favourite2.g.dart b/lib/models/space/favourite2.g.dart index 55858366d..9f25de80e 100644 --- a/lib/models/space/favourite2.g.dart +++ b/lib/models/space/favourite2.g.dart @@ -8,11 +8,13 @@ part of 'favourite2.dart'; Favourite2 _$Favourite2FromJson(Map json) => Favourite2( count: (json['count'] as num?)?.toInt(), - item: json['item'] as List?, + item: (json['item'] as List?) + ?.map((e) => SpaceFavItemModel.fromJson(e)) + .toList(), ); Map _$Favourite2ToJson(Favourite2 instance) => { 'count': instance.count, - 'item': instance.item, + 'item': instance.item?.map((e) => e.toJson()).toList(), }; diff --git a/lib/models/space_fav/list.dart b/lib/models/space_fav/list.dart index 798646461..33e39d874 100644 --- a/lib/models/space_fav/list.dart +++ b/lib/models/space_fav/list.dart @@ -4,7 +4,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'list.g.dart'; @JsonSerializable() -class FavList { +class SpaceFavItemModel { int? id; int? fid; int? mid; @@ -36,8 +36,14 @@ class FavList { int? type; String? link; String? bvid; + int? mediaId; + int? count; + int? isPublic; - FavList({ + SpaceFavItemModel({ + this.mediaId, + this.count, + this.isPublic, this.id, this.fid, this.mid, @@ -63,7 +69,8 @@ class FavList { this.bvid, }); - factory FavList.fromJson(Map json) => _$ListFromJson(json); + factory SpaceFavItemModel.fromJson(Map json) => + _$ListFromJson(json); Map toJson() => _$ListToJson(this); } diff --git a/lib/models/space_fav/list.g.dart b/lib/models/space_fav/list.g.dart index 6b18e2489..ac288bdbc 100644 --- a/lib/models/space_fav/list.g.dart +++ b/lib/models/space_fav/list.g.dart @@ -6,7 +6,11 @@ part of 'list.dart'; // JsonSerializableGenerator // ************************************************************************** -FavList _$ListFromJson(Map json) => FavList( +SpaceFavItemModel _$ListFromJson(Map json) => + SpaceFavItemModel( + mediaId: (json['media_id'] as num?)?.toInt(), + count: (json['count'] as num?)?.toInt(), + isPublic: (json['is_public'] as num?)?.toInt(), id: (json['id'] as num?)?.toInt(), fid: (json['fid'] as num?)?.toInt(), mid: (json['mid'] as num?)?.toInt(), @@ -34,7 +38,8 @@ FavList _$ListFromJson(Map json) => FavList( bvid: json['bvid'] as String?, ); -Map _$ListToJson(FavList instance) => { +Map _$ListToJson(SpaceFavItemModel instance) => + { 'id': instance.id, 'fid': instance.fid, 'mid': instance.mid, diff --git a/lib/models/space_fav/media_list_response.dart b/lib/models/space_fav/media_list_response.dart index 4c50af7ae..281e99f65 100644 --- a/lib/models/space_fav/media_list_response.dart +++ b/lib/models/space_fav/media_list_response.dart @@ -6,7 +6,7 @@ part 'media_list_response.g.dart'; @JsonSerializable() class MediaListResponse { int? count; - List? list; + List? list; @JsonKey(name: 'has_more') bool? hasMore; diff --git a/lib/models/space_fav/media_list_response.g.dart b/lib/models/space_fav/media_list_response.g.dart index f599b1c10..57e30041a 100644 --- a/lib/models/space_fav/media_list_response.g.dart +++ b/lib/models/space_fav/media_list_response.g.dart @@ -10,7 +10,7 @@ MediaListResponse _$MediaListResponseFromJson(Map json) => MediaListResponse( count: (json['count'] as num?)?.toInt(), list: (json['list'] as List?) - ?.map((item) => FavList.fromJson(item)) + ?.map((item) => SpaceFavItemModel.fromJson(item)) .toList(), hasMore: json['has_more'] as bool?, ); diff --git a/lib/models/video/note_list/author.dart b/lib/models/video/note_list/author.dart new file mode 100644 index 000000000..943fbfe2e --- /dev/null +++ b/lib/models/video/note_list/author.dart @@ -0,0 +1,39 @@ +import 'package:PiliPlus/models/model_avatar.dart'; +import 'package:PiliPlus/models/model_owner.dart'; + +class Author extends Owner { + int? level; + int? isSeniorMember; + Vip? vipInfo; + Pendant? pendant; + BaseOfficialVerify? official; + + Author({ + super.mid, + super.face, + super.name, + this.level, + this.isSeniorMember, + this.vipInfo, + this.pendant, + this.official, + }); + + factory Author.fromJson(Map json) => Author( + mid: json['mid'] as int?, + name: json['name'] as String?, + face: json['face'] as String?, + level: json['level'] as int?, + isSeniorMember: json['is_senior_member'] as int?, + vipInfo: json['vip_info'] == null + ? null + : Vip.fromJson(json['vip_info'] as Map), + pendant: json['pendant'] == null + ? null + : Pendant.fromJson(json['pendant'] as Map), + official: json['official'] == null + ? null + : BaseOfficialVerify.fromJson( + json['official'] as Map), + ); +} diff --git a/lib/models/video/note_list/data.dart b/lib/models/video/note_list/data.dart new file mode 100644 index 000000000..97dfd8924 --- /dev/null +++ b/lib/models/video/note_list/data.dart @@ -0,0 +1,22 @@ +import 'package:PiliPlus/models/video/note_list/list.dart'; +import 'package:PiliPlus/models/video/note_list/page.dart'; + +class NoteListData { + List? list; + Page? page; + bool? showPublicNote; + String? message; + + NoteListData({this.list, this.page, this.showPublicNote, this.message}); + + factory NoteListData.fromJson(Map json) => NoteListData( + list: (json['list'] as List?) + ?.map((e) => NoteListItemModel.fromJson(e as Map)) + .toList(), + page: json['page'] == null + ? null + : Page.fromJson(json['page'] as Map), + showPublicNote: json['show_public_note'] as bool?, + message: json['message'] as String?, + ); +} diff --git a/lib/models/video/note_list/list.dart b/lib/models/video/note_list/list.dart new file mode 100644 index 000000000..77e8f89eb --- /dev/null +++ b/lib/models/video/note_list/list.dart @@ -0,0 +1,41 @@ +import 'package:PiliPlus/models/video/note_list/author.dart'; + +class NoteListItemModel { + int? cvid; + String? title; + String? summary; + String? pubtime; + String? webUrl; + String? message; + Author? author; + int? likes; + bool? hasLike; + + NoteListItemModel({ + this.cvid, + this.title, + this.summary, + this.pubtime, + this.webUrl, + this.message, + this.author, + this.likes, + this.hasLike, + }); + + factory NoteListItemModel.fromJson(Map json) => + NoteListItemModel( + cvid: json['cvid'] as int?, + title: json['title'] as String?, + summary: json['summary'] as String?, + pubtime: json['pubtime'] as String?, + webUrl: json['web_url'] as String?, + message: json['message'] as String?, + author: json['author'] == null + ? null + : Author.fromJson(json['author'] as Map), + likes: json['likes'] as int?, + hasLike: json['has_like'] as bool?, + ); + +} diff --git a/lib/models/video/note_list/page.dart b/lib/models/video/note_list/page.dart new file mode 100644 index 000000000..ad1920e0e --- /dev/null +++ b/lib/models/video/note_list/page.dart @@ -0,0 +1,13 @@ +class Page { + int? total; + int? size; + int? num; + + Page({this.total, this.size, this.num}); + + factory Page.fromJson(Map json) => Page( + total: json['total'] as int?, + size: json['size'] as int?, + num: json['num'] as int?, + ); +} diff --git a/lib/models/video_pbp/data.dart b/lib/models/video_pbp/data.dart new file mode 100644 index 000000000..98954c387 --- /dev/null +++ b/lib/models/video_pbp/data.dart @@ -0,0 +1,28 @@ +class PbpData { + int? stepSec; + Events? events; + + PbpData({ + this.stepSec, + this.events, + }); + + factory PbpData.fromJson(Map json) => PbpData( + stepSec: json["step_sec"], + events: json["events"] == null ? null : Events.fromJson(json["events"]), + ); +} + +class Events { + List? eDefault; + + Events({ + this.eDefault, + }); + + factory Events.fromJson(Map json) => Events( + eDefault: json["default"] == null + ? null + : List.from(json["default"]!.map((x) => x?.toDouble())), + ); +} diff --git a/lib/models/video_shot/data.dart b/lib/models/video_shot/data.dart new file mode 100644 index 000000000..257766848 --- /dev/null +++ b/lib/models/video_shot/data.dart @@ -0,0 +1,29 @@ +class VideoShotData { + String? pvdata; + int? imgXLen; + int? imgYLen; + int? imgXSize; + int? imgYSize; + List? image; + List? index; + + VideoShotData({ + this.pvdata, + this.imgXLen, + this.imgYLen, + this.imgXSize, + this.imgYSize, + this.image, + this.index, + }); + + factory VideoShotData.fromJson(Map json) => VideoShotData( + pvdata: json["pvdata"], + imgXLen: json["img_x_len"], + imgYLen: json["img_y_len"], + imgXSize: json["img_x_size"], + imgYSize: json["img_y_size"], + image: json["image"] == null ? null : List.from(json["image"]), + index: json["index"] == null ? null : List.from(json["index"]), + ); +} diff --git a/lib/models/video_tag/data.dart b/lib/models/video_tag/data.dart new file mode 100644 index 000000000..ec2b045d7 --- /dev/null +++ b/lib/models/video_tag/data.dart @@ -0,0 +1,20 @@ +class VideoTagItem { + int? tagId; + String? tagName; + String? musicId; + String? jumpUrl; + + VideoTagItem({ + this.tagId, + this.tagName, + this.musicId, + this.jumpUrl, + }); + + factory VideoTagItem.fromJson(Map json) => VideoTagItem( + tagId: json["tag_id"], + tagName: json["tag_name"], + musicId: json["music_id"], + jumpUrl: json["jump_url"], + ); +} diff --git a/lib/pages/bangumi/controller.dart b/lib/pages/bangumi/controller.dart index 81f254167..4c3bd9f30 100644 --- a/lib/pages/bangumi/controller.dart +++ b/lib/pages/bangumi/controller.dart @@ -1,8 +1,8 @@ import 'package:PiliPlus/http/bangumi.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/list.dart'; -import 'package:PiliPlus/models/bangumi/pgc_timeline/result.dart'; import 'package:PiliPlus/models/common/home_tab_type.dart'; +import 'package:PiliPlus/models/pgc/list.dart'; +import 'package:PiliPlus/models/pgc/pgc_timeline/result.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; diff --git a/lib/pages/bangumi/view.dart b/lib/pages/bangumi/view.dart index 20debfa64..0f2432479 100644 --- a/lib/pages/bangumi/view.dart +++ b/lib/pages/bangumi/view.dart @@ -6,10 +6,10 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/list.dart'; -import 'package:PiliPlus/models/bangumi/pgc_timeline/result.dart'; import 'package:PiliPlus/models/common/fav_type.dart'; import 'package:PiliPlus/models/common/home_tab_type.dart'; +import 'package:PiliPlus/models/pgc/list.dart'; +import 'package:PiliPlus/models/pgc/pgc_timeline/result.dart'; import 'package:PiliPlus/pages/bangumi/controller.dart'; import 'package:PiliPlus/pages/bangumi/widgets/bangumi_card_v.dart'; import 'package:PiliPlus/pages/bangumi/widgets/bangumi_card_v_timeline.dart'; diff --git a/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart b/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart index 768cf6200..d435cd4fa 100644 --- a/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart +++ b/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; +import 'package:PiliPlus/models/pgc/pgc_index_item/list.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; @@ -12,7 +13,7 @@ class BangumiCardVPgcIndex extends StatelessWidget { required this.bangumiItem, }); - final dynamic bangumiItem; + final PgcIndexItemModel bangumiItem; @override Widget build(BuildContext context) { @@ -21,10 +22,10 @@ class BangumiCardVPgcIndex extends StatelessWidget { margin: EdgeInsets.zero, child: InkWell( onLongPress: () => imageSaveDialog( - title: bangumiItem['title'], - cover: bangumiItem['cover'], + title: bangumiItem.title, + cover: bangumiItem.cover, ), - onTap: () => PageUtils.viewBangumi(seasonId: bangumiItem['season_id']), + onTap: () => PageUtils.viewBangumi(seasonId: bangumiItem.seasonId), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -37,19 +38,19 @@ class BangumiCardVPgcIndex extends StatelessWidget { clipBehavior: Clip.none, children: [ NetworkImgLayer( - src: bangumiItem['cover'], + src: bangumiItem.cover, width: maxWidth, height: maxHeight, ), PBadge( - text: bangumiItem['badge'], + text: bangumiItem.badge, top: 6, right: 6, bottom: null, left: null, ), PBadge( - text: bangumiItem['order'], + text: bangumiItem.order, top: null, right: null, bottom: 6, @@ -76,7 +77,7 @@ class BangumiCardVPgcIndex extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - bangumiItem['title'], + bangumiItem.title!, textAlign: TextAlign.start, style: const TextStyle( letterSpacing: 0.3, @@ -85,9 +86,9 @@ class BangumiCardVPgcIndex extends StatelessWidget { overflow: TextOverflow.ellipsis, ), const SizedBox(height: 1), - if (bangumiItem['index_show'] != null) + if (bangumiItem.indexShow != null) Text( - bangumiItem['index_show'], + bangumiItem.indexShow!, maxLines: 1, style: TextStyle( fontSize: theme.textTheme.labelMedium!.fontSize, diff --git a/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart b/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart index 27db40fa0..7edf648e8 100644 --- a/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart +++ b/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart @@ -1,8 +1,8 @@ import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; -import 'package:PiliPlus/models/bangumi/pgc_timeline/episode.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; +import 'package:PiliPlus/models/pgc/pgc_timeline/episode.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index 189fe191d..f9f3aa98d 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -11,9 +11,9 @@ import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; -import 'package:PiliPlus/models/bangumi/info.dart' as bangumi; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/episode_panel_type.dart'; +import 'package:PiliPlus/models/pgc/info.dart' as bangumi; import 'package:PiliPlus/models/video_detail_res.dart' as video; import 'package:PiliPlus/pages/common/common_slide_page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; @@ -195,7 +195,8 @@ class _EpisodePanelState extends CommonSlidePageState { @override Widget buildPage(ThemeData theme) { - final isMutil = widget.type == EpisodeType.season && widget.list.length > 1; + final isMulti = widget.type == EpisodeType.season && widget.list.length > 1; + Widget tabbar() => TabBar( controller: _tabController, padding: const EdgeInsets.only(right: 60), @@ -205,20 +206,18 @@ class _EpisodePanelState extends CommonSlidePageState { dividerColor: theme.dividerColor.withValues(alpha: 0.1), ); - if (isMutil && enableSlide) { + if (isMulti && enableSlide) { return CustomTabBarView( controller: _tabController, physics: const CustomTabBarViewScrollPhysics(), bgColor: theme.colorScheme.surface, - header: isMutil - ? Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildToolbar(theme), - tabbar(), - ], - ) - : _buildToolbar(theme), + header: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildToolbar(theme), + tabbar(), + ], + ), children: List.generate( widget.list.length, (index) => _buildBody( @@ -237,7 +236,7 @@ class _EpisodePanelState extends CommonSlidePageState { child: Column( children: [ _buildToolbar(theme), - if (isMutil) ...[ + if (isMulti) ...[ tabbar(), Expanded( child: Material( diff --git a/lib/pages/fav/article/controller.dart b/lib/pages/fav/article/controller.dart index 4898da821..d757dc74c 100644 --- a/lib/pages/fav/article/controller.dart +++ b/lib/pages/fav/article/controller.dart @@ -1,9 +1,12 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; +import 'package:PiliPlus/models/fav_article/data.dart'; +import 'package:PiliPlus/models/fav_article/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -class FavArticleController extends CommonListController { +class FavArticleController + extends CommonListController { @override void onInit() { super.onInit(); @@ -11,20 +14,16 @@ class FavArticleController extends CommonListController { } @override - List? getDataList(response) { - return response?['items']; - } - - @override - bool customHandleResponse(bool isRefresh, Success response) { - if (response.response?['has_more'] == false) { + List? getDataList(FavArticleData response) { + if (response.hasMore == false) { isEnd = true; } - return false; + return response.items; } @override - Future customGetData() => UserHttp.favArticle(page: page); + Future> customGetData() => + UserHttp.favArticle(page: page); Future onRemove(index, id) async { final res = await UserHttp.communityAction(opusId: id, action: 4); diff --git a/lib/pages/fav/article/view.dart b/lib/pages/fav/article/view.dart index abe3b75f8..5f48694e3 100644 --- a/lib/pages/fav/article/view.dart +++ b/lib/pages/fav/article/view.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models/fav_article/item.dart'; import 'package:PiliPlus/pages/fav/article/controller.dart'; import 'package:PiliPlus/pages/fav/article/widget/item.dart'; import 'package:PiliPlus/utils/grid.dart'; @@ -47,7 +48,7 @@ class _FavArticlePageState extends State ); } - Widget _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => SliverGrid( gridDelegate: Grid.videoCardHDelegate(context), @@ -74,7 +75,7 @@ class _FavArticlePageState extends State onConfirm: () { _favArticleController.onRemove( index, - response[index]['opus_id'], + response[index].opusId, ); }, ), diff --git a/lib/pages/fav/article/widget/item.dart b/lib/pages/fav/article/widget/item.dart index 62fec58f4..c42e22a75 100644 --- a/lib/pages/fav/article/widget/item.dart +++ b/lib/pages/fav/article/widget/item.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; +import 'package:PiliPlus/models/fav_article/item.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -12,7 +13,7 @@ class FavArticleItem extends StatelessWidget { required this.onDelete, }); - final dynamic item; + final FavArticleItemModel item; final VoidCallback onDelete; @override @@ -27,7 +28,7 @@ class FavArticleItem extends StatelessWidget { onTap: () => Get.toNamed( '/articlePage', parameters: { - 'id': item['opus_id'], + 'id': item.opusId!.toString(), 'type': 'opus', }, ), @@ -40,14 +41,14 @@ class FavArticleItem extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (item['cover'] != null) ...[ + if (item.cover != null) ...[ AspectRatio( aspectRatio: StyleString.aspectRatio, child: LayoutBuilder( builder: (BuildContext context, BoxConstraints boxConstraints) { return NetworkImgLayer( - src: item['cover']['url'], + src: item.cover!.url, width: boxConstraints.maxWidth, height: boxConstraints.maxHeight, ); @@ -63,7 +64,7 @@ class FavArticleItem extends StatelessWidget { children: [ Expanded( child: Text( - item['content'], + item.content!, style: TextStyle( fontSize: theme.textTheme.bodyMedium!.fontSize, height: 1.42, @@ -77,7 +78,7 @@ class FavArticleItem extends StatelessWidget { children: [ // StatView( // context: context, - // value: item['stat']['view'], + // value: item.stat!.view!, // goto: 'picture', // textColor: theme.colorScheme.outline, // ), @@ -85,16 +86,15 @@ class FavArticleItem extends StatelessWidget { StatView( context: context, goto: 'like', - value: item['stat']['like'] == '' - ? 0 - : item['stat']['like'], + value: + item.stat!.like == '' ? 0 : item.stat!.like!, textColor: theme.colorScheme.outline, ), ], ), const SizedBox(height: 3), Text( - '${item['author']['name']} · ${item['pub_time']}', + '${item.author!.name} · ${item.pubTime}', maxLines: 1, style: TextStyle( fontSize: 13, diff --git a/lib/pages/fav/note/child_view.dart b/lib/pages/fav/note/child_view.dart index 2c644e8a0..b1296bf9c 100644 --- a/lib/pages/fav/note/child_view.dart +++ b/lib/pages/fav/note/child_view.dart @@ -132,7 +132,7 @@ class _FavNoteChildPageState extends State ); } - Widget _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => SliverGrid( gridDelegate: Grid.videoCardHDelegate(context), diff --git a/lib/pages/fav/note/controller.dart b/lib/pages/fav/note/controller.dart index d8a55b847..a3521d72a 100644 --- a/lib/pages/fav/note/controller.dart +++ b/lib/pages/fav/note/controller.dart @@ -5,7 +5,7 @@ import 'package:PiliPlus/pages/common/multi_select_controller.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; class FavNoteController - extends MultiSelectController?, FavArticleModel> { + extends MultiSelectController?, FavNoteModel> { FavNoteController(this.isPublish); final bool isPublish; @@ -28,15 +28,15 @@ class FavNoteController } @override - Future?>> customGetData() { + Future?>> customGetData() { return isPublish ? VideoHttp.userNoteList(page: page) : VideoHttp.noteList(page: page); } Future onRemove() async { - List dataList = (loadingState.value as Success).response; - Set removeList = + List dataList = (loadingState.value as Success).response; + Set removeList = dataList.where((item) => item.checked == true).toSet(); final res = await VideoHttp.delNote( isPublish: isPublish, @@ -45,7 +45,7 @@ class FavNoteController .toList(), ); if (res['status']) { - List remainList = + List remainList = dataList.toSet().difference(removeList).toList(); loadingState.value = Success(remainList); enableMultiSelect.value = false; diff --git a/lib/pages/fav/note/widget/item.dart b/lib/pages/fav/note/widget/item.dart index c6e86b64a..19b459508 100644 --- a/lib/pages/fav/note/widget/item.dart +++ b/lib/pages/fav/note/widget/item.dart @@ -13,7 +13,7 @@ class FavNoteItem extends StatelessWidget { required this.onSelect, }); - final FavArticleModel item; + final FavNoteModel item; final FavNoteController ctr; final VoidCallback onSelect; diff --git a/lib/pages/fav/pgc/child_view.dart b/lib/pages/fav/pgc/child_view.dart index 9b1085462..9ecf306db 100644 --- a/lib/pages/fav/pgc/child_view.dart +++ b/lib/pages/fav/pgc/child_view.dart @@ -4,7 +4,7 @@ import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/list.dart'; +import 'package:PiliPlus/models/pgc/list.dart'; import 'package:PiliPlus/pages/fav/pgc/controller.dart'; import 'package:PiliPlus/pages/fav/pgc/widget/item.dart'; import 'package:PiliPlus/utils/grid.dart'; @@ -111,15 +111,15 @@ class _FavPgcChildPageState extends State ), ), const Spacer(), - ...[ - {'followStatus': 1, 'title': '想看'}, - {'followStatus': 2, 'title': '在看'}, - {'followStatus': 3, 'title': '看过'}, + ...const <({int followStatus, String title})>[ + (followStatus: 1, title: '想看'), + (followStatus: 2, title: '在看'), + (followStatus: 3, title: '看过'), ] .where((item) => - item['followStatus'] != widget.followStatus) + item.followStatus != widget.followStatus) .map( - (Map item) => Padding( + (item) => Padding( padding: const EdgeInsets.only(left: 25), child: GestureDetector( behavior: HitTestBehavior.opaque, @@ -127,14 +127,14 @@ class _FavPgcChildPageState extends State if (_favPgcController.checkedCount.value != 0) { _favPgcController - .onUpdateList(item['followStatus']); + .onUpdateList(item.followStatus); } }, child: Padding( padding: const EdgeInsets.symmetric( vertical: 14, horizontal: 5), child: Text( - '标记为${item['title']}', + '标记为${item.title}', style: TextStyle( color: theme.colorScheme.onSurfaceVariant, ), diff --git a/lib/pages/fav/pgc/controller.dart b/lib/pages/fav/pgc/controller.dart index c2c706952..2f7895ad4 100644 --- a/lib/pages/fav/pgc/controller.dart +++ b/lib/pages/fav/pgc/controller.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/http/bangumi.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; -import 'package:PiliPlus/models/bangumi/list.dart'; +import 'package:PiliPlus/models/pgc/list.dart'; import 'package:PiliPlus/pages/common/multi_select_controller.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pages/fav/pgc/widget/item.dart b/lib/pages/fav/pgc/widget/item.dart index 627e40969..63d7b02c6 100644 --- a/lib/pages/fav/pgc/widget/item.dart +++ b/lib/pages/fav/pgc/widget/item.dart @@ -2,8 +2,8 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; -import 'package:PiliPlus/models/bangumi/list.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; +import 'package:PiliPlus/models/pgc/list.dart'; import 'package:PiliPlus/pages/common/multi_select_controller.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; @@ -144,10 +144,10 @@ class FavPgcItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(item.title!), - if (item.newEp?['index_show'] != null) ...[ + if (item.newEp?.indexShow != null) ...[ const SizedBox(height: 6), Text( - '${item.newEp?['index_show']}${item.isFinish == 0 && item.renewalTime?.isNotEmpty == true ? ',${item.renewalTime}' : ''}', + '${item.newEp!.indexShow}${item.isFinish == 0 && item.renewalTime?.isNotEmpty == true ? ',${item.renewalTime}' : ''}', style: TextStyle( fontSize: 13, color: theme.colorScheme.onSurfaceVariant, @@ -156,8 +156,7 @@ class FavPgcItem extends StatelessWidget { ], if (item.progress != null) ...[ SizedBox( - height: - item.newEp?['index_show'] != null ? 2 : 6), + height: item.newEp?.indexShow != null ? 2 : 6), Text( item.progress!, style: TextStyle( diff --git a/lib/pages/media/controller.dart b/lib/pages/media/controller.dart index 037e8ac07..6fcb20f03 100644 --- a/lib/pages/media/controller.dart +++ b/lib/pages/media/controller.dart @@ -8,39 +8,32 @@ import 'package:get/get.dart'; class MediaController extends CommonDataController { - List list = [ - // { - // 'icon': Icons.file_download_outlined, - // 'title': '离线缓存', - // 'onTap': () { - // SmartDialog.showToast('功能开发中'); - // }, - // }, - { - 'icon': Icons.history, - 'title': '观看记录', - 'onTap': () => Get.toNamed('/history'), - }, - { - 'icon': Icons.subscriptions_outlined, - 'title': '我的订阅', - 'onTap': () => Get.toNamed('/subscription'), - }, - { - 'icon': Icons.watch_later_outlined, - 'title': '稍后再看', - 'onTap': () => Get.toNamed('/later'), - }, - { - 'icon': Icons.create_outlined, - 'title': '创作中心', - 'onTap': () => Get.toNamed( + final list = <({IconData icon, String title, VoidCallback onTap})>[ + ( + icon: Icons.history, + title: '观看记录', + onTap: () => Get.toNamed('/history'), + ), + ( + icon: Icons.subscriptions_outlined, + title: '我的订阅', + onTap: () => Get.toNamed('/subscription'), + ), + ( + icon: Icons.watch_later_outlined, + title: '稍后再看', + onTap: () => Get.toNamed('/later'), + ), + ( + icon: Icons.create_outlined, + title: '创作中心', + onTap: () => Get.toNamed( '/webview', parameters: { 'url': 'https://member.bilibili.com/platform/home', }, ), - }, + ), ]; int? mid; RxInt count = (-1).obs; diff --git a/lib/pages/media/view.dart b/lib/pages/media/view.dart index 29741973f..a8c1cfd43 100644 --- a/lib/pages/media/view.dart +++ b/lib/pages/media/view.dart @@ -77,12 +77,12 @@ class _MediaPageState extends CommonPageState ), for (var item in controller.list) ListTile( - onTap: item['onTap'], + onTap: item.onTap, dense: true, leading: Padding( padding: const EdgeInsets.only(left: 15), child: Icon( - item['icon'], + item.icon, color: primary, ), ), @@ -90,7 +90,7 @@ class _MediaPageState extends CommonPageState const EdgeInsets.only(left: 15, top: 2, bottom: 2), minLeadingWidth: 0, title: Text( - item['title'], + item.title, style: const TextStyle(fontSize: 15), ), ), diff --git a/lib/pages/member_favorite/controller.dart b/lib/pages/member_favorite/controller.dart index 175e84163..9e1b90634 100644 --- a/lib/pages/member_favorite/controller.dart +++ b/lib/pages/member_favorite/controller.dart @@ -66,10 +66,11 @@ class MemberFavoriteCtr extends CommonDataController { page++; firstEnd.value = res.data['data']['has_more'] == false; if (res.data['data'] != null) { - List list = (res.data['data']['list'] as List?) - ?.map((item) => FavList.fromJson(item)) - .toList() ?? - []; + List list = + (res.data['data']['list'] as List?) + ?.map((item) => SpaceFavItemModel.fromJson(item)) + .toList() ?? + []; first.value.mediaListResponse?.list?.addAll(list); first.refresh(); } else { @@ -91,10 +92,11 @@ class MemberFavoriteCtr extends CommonDataController { page++; secondEnd.value = res.data['data']['has_more'] == false; if (res.data['data'] != null) { - List list = (res.data['data']['list'] as List?) - ?.map((item) => FavList.fromJson(item)) - .toList() ?? - []; + List list = + (res.data['data']['list'] as List?) + ?.map((item) => SpaceFavItemModel.fromJson(item)) + .toList() ?? + []; second.value.mediaListResponse?.list?.addAll(list); second.refresh(); } else { diff --git a/lib/pages/member_favorite/view.dart b/lib/pages/member_favorite/view.dart index 0aaacc9f9..9317dab9d 100644 --- a/lib/pages/member_favorite/view.dart +++ b/lib/pages/member_favorite/view.dart @@ -115,7 +115,7 @@ class _MemberFavoriteState extends State ), controlAffinity: ListTileControlAffinity.leading, children: [ - ...(data.mediaListResponse?.list as List).map( + ...(data.mediaListResponse?.list as List).map( (item) => SizedBox( height: 98, child: MemberFavItem( diff --git a/lib/pages/member_favorite/widget/item.dart b/lib/pages/member_favorite/widget/item.dart index 2b3db0198..e0c52c8d5 100644 --- a/lib/pages/member_favorite/widget/item.dart +++ b/lib/pages/member_favorite/widget/item.dart @@ -12,7 +12,7 @@ import 'package:get/get.dart'; class MemberFavItem extends StatelessWidget { const MemberFavItem({super.key, required this.item, this.callback}); - final FavList item; + final SpaceFavItemModel item; final ValueChanged? callback; @override diff --git a/lib/pages/member_home/widget/fav_item.dart b/lib/pages/member_home/widget/fav_item.dart index 872f7207f..51ba36a43 100644 --- a/lib/pages/member_home/widget/fav_item.dart +++ b/lib/pages/member_home/widget/fav_item.dart @@ -1,6 +1,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; +import 'package:PiliPlus/models/space_fav/list.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -8,7 +9,7 @@ import 'package:get/get.dart'; class MemberFavItem extends StatelessWidget { const MemberFavItem({super.key, required this.item}); - final dynamic item; + final SpaceFavItemModel item; @override Widget build(BuildContext context) { @@ -16,19 +17,19 @@ class MemberFavItem extends StatelessWidget { color: Colors.transparent, child: InkWell( onTap: () { - if (item['type'] == 2) { + if (item.type == 2) { Get.toNamed( '/favDetail', parameters: { - 'mediaId': item['media_id'].toString(), - 'heroTag': Utils.makeHeroTag(item['media_id']), + 'mediaId': item.mediaId.toString(), + 'heroTag': Utils.makeHeroTag(item.mediaId), }, ); } }, onLongPress: () => imageSaveDialog( - title: item['title'], - cover: item['cover'], + title: item.title, + cover: item.cover, ), child: Padding( padding: const EdgeInsets.symmetric( @@ -44,7 +45,7 @@ class MemberFavItem extends StatelessWidget { child: LayoutBuilder( builder: (context, boxConstraints) { return NetworkImgLayer( - src: item['cover'], + src: item.cover, width: boxConstraints.maxWidth, height: boxConstraints.maxHeight, ); @@ -58,13 +59,13 @@ class MemberFavItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - item['title'] ?? '', + item.title!, maxLines: 2, overflow: TextOverflow.ellipsis, ), const Spacer(), Text( - '${item['count']}个内容 · ${item['is_public'] == 1 ? '私密' : '公开'}', + '${item.count}个内容 · ${item.isPublic == 1 ? '私密' : '公开'}', style: TextStyle( fontSize: 12, color: Theme.of(context).colorScheme.outline, diff --git a/lib/pages/member_season_series/controller.dart b/lib/pages/member_season_series/controller.dart index 8f4241df7..4f929132b 100644 --- a/lib/pages/member_season_series/controller.dart +++ b/lib/pages/member_season_series/controller.dart @@ -1,8 +1,11 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/member.dart'; +import 'package:PiliPlus/models/member_ss/item.dart'; +import 'package:PiliPlus/models/member_ss/season.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; -class SeasonSeriesController extends CommonListController { +class SeasonSeriesController + extends CommonListController { SeasonSeriesController(this.mid); final int mid; int? count; @@ -14,9 +17,10 @@ class SeasonSeriesController extends CommonListController { } @override - List? getDataList(response) { - return ((response['seasons_list'] as List?) ?? []) + - ((response['series_list'] as List?) ?? []); + List? getDataList(MemberSsData response) { + count = response.page?.total; + return (response.seasonsList ?? []) + + (response.seriesList ?? []); } @override @@ -27,13 +31,8 @@ class SeasonSeriesController extends CommonListController { } @override - bool customHandleResponse(bool isRefresh, Success response) { - count = response.response['page']?['total']; - return false; - } - - @override - Future customGetData() => MemberHttp.seasonSeriesList( + Future> customGetData() => + MemberHttp.seasonSeriesList( mid: mid, pn: page, ); diff --git a/lib/pages/member_season_series/view.dart b/lib/pages/member_season_series/view.dart index 758a5decb..3a581bc19 100644 --- a/lib/pages/member_season_series/view.dart +++ b/lib/pages/member_season_series/view.dart @@ -3,6 +3,7 @@ import 'package:PiliPlus/common/skeleton/video_card_h.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/member/contribute_type.dart'; +import 'package:PiliPlus/models/member_ss/season.dart' show MemberSsModel; import 'package:PiliPlus/pages/member_season_series/controller.dart'; import 'package:PiliPlus/pages/member_season_series/widget/season_series_card.dart'; import 'package:PiliPlus/pages/member_video/view.dart'; @@ -52,7 +53,7 @@ class _SeasonSeriesPageState extends State ); } - Widget _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => SliverGrid( gridDelegate: Grid.videoCardHDelegate(context), @@ -71,18 +72,17 @@ class _SeasonSeriesPageState extends State if (index == response.length - 1) { _controller.onLoadMore(); } - dynamic item = response[index]; + MemberSsModel item = response[index]; return SeasonSeriesCard( item: item, onTap: () { - bool isSeason = item['meta']['season_id'] != null; - dynamic id = isSeason - ? item['meta']['season_id'] - : item['meta']['series_id']; + bool isSeason = item.meta!.seasonId != null; + dynamic id = + isSeason ? item.meta!.seasonId : item.meta!.seriesId; Get.to( Scaffold( appBar: AppBar( - title: Text(item['meta']['name']), + title: Text(item.meta!.name!), ), body: SafeArea( top: false, @@ -95,7 +95,7 @@ class _SeasonSeriesPageState extends State mid: widget.mid, seasonId: isSeason ? id : null, seriesId: isSeason ? null : id, - title: item['meta']['name'], + title: item.meta!.name, ), ), ), @@ -106,9 +106,7 @@ class _SeasonSeriesPageState extends State childCount: response!.length, ), ) - : HttpError( - onReload: _controller.onReload, - ), + : HttpError(onReload: _controller.onReload), Error(:var errMsg) => HttpError( errMsg: errMsg, onReload: _controller.onReload, diff --git a/lib/pages/member_season_series/widget/season_series_card.dart b/lib/pages/member_season_series/widget/season_series_card.dart index d269c8336..29eaa86ed 100644 --- a/lib/pages/member_season_series/widget/season_series_card.dart +++ b/lib/pages/member_season_series/widget/season_series_card.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; +import 'package:PiliPlus/models/member_ss/season.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -11,15 +12,15 @@ class SeasonSeriesCard extends StatelessWidget { required this.item, required this.onTap, }); - final dynamic item; + final MemberSsModel item; final VoidCallback onTap; @override Widget build(BuildContext context) { return InkWell( onLongPress: () => imageSaveDialog( - title: item['meta']['name'], - cover: item['meta']['cover'], + title: item.meta!.name, + cover: item.meta!.cover, ), onTap: onTap, child: Padding( @@ -41,13 +42,13 @@ class SeasonSeriesCard extends StatelessWidget { clipBehavior: Clip.none, children: [ NetworkImgLayer( - src: item['meta']['cover'], + src: item.meta!.cover, width: maxWidth, height: maxHeight, ), PBadge( text: - '${item['meta']['season_id'] != null ? '合集' : '列表'}: ${item['meta']['total']}', + '${item.meta!.seasonId != null ? '合集' : '列表'}: ${item.meta!.total}', bottom: 6.0, right: 6.0, ), @@ -71,7 +72,7 @@ class SeasonSeriesCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - item['meta']['name'], + item.meta!.name!, textAlign: TextAlign.start, style: TextStyle( fontSize: theme.textTheme.bodyMedium!.fontSize, @@ -83,7 +84,7 @@ class SeasonSeriesCard extends StatelessWidget { ), const Spacer(), Text( - Utils.dateFormat(item['meta']['ptime']), + Utils.dateFormat(item.meta!.ptime), maxLines: 1, style: TextStyle( fontSize: 12, diff --git a/lib/pages/pgc_index/controller.dart b/lib/pages/pgc_index/controller.dart index 82a835e50..109e0b30a 100644 --- a/lib/pages/pgc_index/controller.dart +++ b/lib/pages/pgc_index/controller.dart @@ -1,10 +1,13 @@ import 'package:PiliPlus/http/bangumi.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/pgc_index/condition.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_index_item/list.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:get/get.dart'; -class PgcIndexController extends CommonListController { +class PgcIndexController + extends CommonListController { PgcIndexController(this.indexType); int? indexType; Rx> conditionState = @@ -42,7 +45,8 @@ class PgcIndexController extends CommonListController { } @override - Future customGetData() => BangumiHttp.pgcIndexResult( + Future> customGetData() => + BangumiHttp.pgcIndexResult( page: page, params: indexParams, seasonType: indexType == null ? 1 : null, @@ -51,16 +55,10 @@ class PgcIndexController extends CommonListController { ); @override - List? getDataList(response) { - return response['list']; - } - - @override - bool customHandleResponse(bool isRefresh, Success response) { - if (response.response['has_next'] == null || - response.response['has_next'] == 0) { + List? getDataList(PgcIndexItemData response) { + if (response.hasNext == null || response.hasNext == 0) { isEnd = true; } - return false; + return response.list; } } diff --git a/lib/pages/pgc_index/view.dart b/lib/pages/pgc_index/view.dart index f5e6d026a..3d97700a6 100644 --- a/lib/pages/pgc_index/view.dart +++ b/lib/pages/pgc_index/view.dart @@ -3,7 +3,8 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/pgc_index/condition.dart'; +import 'package:PiliPlus/models/pgc/pgc_index/condition.dart'; +import 'package:PiliPlus/models/pgc/pgc_index_item/list.dart'; import 'package:PiliPlus/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart'; import 'package:PiliPlus/pages/pgc_index/controller.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; @@ -200,7 +201,7 @@ class _PgcIndexPageState extends State ], ); - Widget _buildList(LoadingState?> loadingState) { + Widget _buildList(LoadingState?> loadingState) { return switch (loadingState) { Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), Success(:var response) => response?.isNotEmpty == true diff --git a/lib/pages/pgc_review/child/controller.dart b/lib/pages/pgc_review/child/controller.dart index 3c6cc3aae..e0a915a80 100644 --- a/lib/pages/pgc_review/child/controller.dart +++ b/lib/pages/pgc_review/child/controller.dart @@ -1,8 +1,8 @@ import 'package:PiliPlus/http/bangumi.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/pgc_review/data.dart'; -import 'package:PiliPlus/models/bangumi/pgc_review/list.dart'; import 'package:PiliPlus/models/common/pgc_review_type.dart'; +import 'package:PiliPlus/models/pgc/pgc_review/data.dart'; +import 'package:PiliPlus/models/pgc/pgc_review/list.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; diff --git a/lib/pages/pgc_review/child/view.dart b/lib/pages/pgc_review/child/view.dart index c2e48e607..ef5317308 100644 --- a/lib/pages/pgc_review/child/view.dart +++ b/lib/pages/pgc_review/child/view.dart @@ -5,9 +5,9 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/bangumi/pgc_review/list.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models/common/pgc_review_type.dart'; +import 'package:PiliPlus/models/pgc/pgc_review/list.dart'; import 'package:PiliPlus/pages/pgc_review/child/controller.dart'; import 'package:PiliPlus/pages/pgc_review/post/view.dart'; import 'package:PiliPlus/utils/extension.dart'; diff --git a/lib/pages/rank/zone/widget/pgc_rank_item.dart b/lib/pages/rank/zone/widget/pgc_rank_item.dart index fc352389f..9f94cc855 100644 --- a/lib/pages/rank/zone/widget/pgc_rank_item.dart +++ b/lib/pages/rank/zone/widget/pgc_rank_item.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; -import 'package:PiliPlus/models/bangumi/pgc_rank/pgc_rank_item_model.dart'; +import 'package:PiliPlus/models/pgc/pgc_rank/pgc_rank_item_model.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 294e55785..04450dd95 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -23,6 +23,7 @@ import 'package:PiliPlus/models/common/video/video_quality.dart'; import 'package:PiliPlus/models/video/later.dart'; import 'package:PiliPlus/models/video/play/url.dart'; import 'package:PiliPlus/models/video_detail_res.dart'; +import 'package:PiliPlus/models/video_pbp/data.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; import 'package:PiliPlus/pages/video/medialist/view.dart'; @@ -1596,12 +1597,12 @@ class VideoDetailController extends GetxController showSteinEdgeInfo.value = false; } - List? dmTrend; + List? dmTrend; Future _getDmTrend() async { - dmTrend = []; + dmTrend = null; try { - dynamic res = await Request().get( + var res = await Request().get( 'https://bvc.bilivideo.com/pbp/data', queryParameters: { 'bvid': bvid, @@ -1609,12 +1610,12 @@ class VideoDetailController extends GetxController }, ); - int stepSec = (res.data['step_sec'] as num?)?.toInt() ?? 0; - late List events = (res.data['events']['default'] as List?) ?? []; - if (stepSec != 0 && events.isNotEmpty) { - dmTrend = events; + PbpData data = PbpData.fromJson(res.data); + int stepSec = data.stepSec ?? 0; + if (stepSec != 0 && data.events?.eDefault?.isNotEmpty == true) { + dmTrend = data.events?.eDefault; if (plPlayerController.dmTrend.isEmpty) { - plPlayerController.dmTrend.value = events; + plPlayerController.dmTrend.value = dmTrend!; } } } catch (e) { diff --git a/lib/pages/video/introduction/pgc/controller.dart b/lib/pages/video/introduction/pgc/controller.dart index e6132edcf..be4ba8fdc 100644 --- a/lib/pages/video/introduction/pgc/controller.dart +++ b/lib/pages/video/introduction/pgc/controller.dart @@ -6,8 +6,9 @@ import 'package:PiliPlus/grpc/view.dart'; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/http/video.dart'; -import 'package:PiliPlus/models/bangumi/info.dart'; +import 'package:PiliPlus/models/pgc/info.dart'; import 'package:PiliPlus/models/user/fav_folder.dart'; +import 'package:PiliPlus/models/video_tag/data.dart'; import 'package:PiliPlus/pages/dynamics_repost/view.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; @@ -50,7 +51,7 @@ class BangumiIntroController extends GetxController { // 是否收藏 RxBool hasFav = false.obs; - dynamic videoTags; + List? videoTags; List? favIds; Rx favFolderData = FavFolderData().obs; diff --git a/lib/pages/video/introduction/pgc/view.dart b/lib/pages/video/introduction/pgc/view.dart index 2853c9df6..2bb98003a 100644 --- a/lib/pages/video/introduction/pgc/view.dart +++ b/lib/pages/video/introduction/pgc/view.dart @@ -5,8 +5,8 @@ import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; -import 'package:PiliPlus/models/bangumi/info.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart'; +import 'package:PiliPlus/models/pgc/info.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart'; import 'package:PiliPlus/pages/video/introduction/pgc/widgets/bangumi_panel.dart'; diff --git a/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart b/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart index abfb32926..8650f0bf2 100644 --- a/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart +++ b/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:PiliPlus/models/bangumi/info.dart'; +import 'package:PiliPlus/models/pgc/info.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; diff --git a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart index d14b92116..65ab24542 100644 --- a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart +++ b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart @@ -1,18 +1,21 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart'; +import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart'; import 'package:PiliPlus/common/widgets/page/tabs.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; -import 'package:PiliPlus/models/bangumi/info.dart'; +import 'package:PiliPlus/models/pgc/info.dart'; +import 'package:PiliPlus/models/video_tag/data.dart'; import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/pgc_review/view.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide TabBarView; import 'package:get/get.dart'; class IntroDetail extends CommonCollapseSlidePage { final BangumiInfoModel bangumiDetail; - final dynamic videoTags; + final List? videoTags; const IntroDetail({ super.key, @@ -27,10 +30,12 @@ class IntroDetail extends CommonCollapseSlidePage { class _IntroDetailState extends CommonCollapseSlidePageState { late final _tabController = TabController(length: 2, vsync: this); + final _controller = ScrollController(); @override void dispose() { _tabController.dispose(); + _controller.dispose(); super.dispose(); } @@ -50,6 +55,13 @@ class _IntroDetailState extends CommonCollapseSlidePageState { tabAlignment: TabAlignment.start, dividerColor: Colors.transparent, tabs: const [Tab(text: '详情'), Tab(text: '点评')], + onTap: (index) { + if (!_tabController.indexIsChanging) { + if (index == 0) { + _controller.animToTop(); + } + } + }, ), ), iconButton( @@ -63,7 +75,7 @@ class _IntroDetailState extends CommonCollapseSlidePageState { ], ), children: [ - buildList(theme), + KeepAliveWrapper(builder: (context) => buildList(theme)), PgcReviewPage( name: widget.bangumiDetail.title!, mediaId: widget.bangumiDetail.mediaId, @@ -79,7 +91,7 @@ class _IntroDetailState extends CommonCollapseSlidePageState { color: theme.colorScheme.onSurface, ); return ListView( - controller: ScrollController(), + controller: _controller, physics: const AlwaysScrollableScrollPhysics(), padding: EdgeInsets.only( left: 14, @@ -90,9 +102,7 @@ class _IntroDetailState extends CommonCollapseSlidePageState { children: [ SelectableText( widget.bangumiDetail.title!, - style: const TextStyle( - fontSize: 16, - ), + style: const TextStyle(fontSize: 16), ), const SizedBox(height: 4), Row( @@ -149,23 +159,21 @@ class _IntroDetailState extends CommonCollapseSlidePageState { widget.bangumiDetail.actors!, style: smallTitle.copyWith(fontSize: 14), ), - if (widget.videoTags is List && widget.videoTags.isNotEmpty) ...[ + if (widget.videoTags?.isNotEmpty == true) ...[ const SizedBox(height: 10), Wrap( spacing: 8, runSpacing: 8, - children: (widget.videoTags as List) + children: widget.videoTags! .map( (item) => SearchText( fontSize: 13, - text: item['tag_name'], - onTap: (_) => Get.toNamed( + text: item.tagName!, + onTap: (tagName) => Get.toNamed( '/searchResult', - parameters: { - 'keyword': item['tag_name'], - }, + parameters: {'keyword': tagName}, ), - onLongPress: (_) => Utils.copyText(item['tag_name']), + onLongPress: (tagName) => Utils.copyText(tagName), ), ) .toList(), diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index 0c853f644..50def7a4a 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -11,6 +11,7 @@ import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/user/fav_folder.dart'; import 'package:PiliPlus/models/video/ai.dart'; import 'package:PiliPlus/models/video_detail_res.dart'; +import 'package:PiliPlus/models/video_tag/data.dart'; import 'package:PiliPlus/pages/dynamics_repost/view.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/pay_coins/view.dart'; @@ -50,7 +51,7 @@ class VideoIntroController extends GetxController { // up主粉丝数 RxMap userStat = RxMap({'follower': '-'}); - dynamic videoTags; + List? videoTags; // 是否点赞 RxBool hasLike = false.obs; @@ -187,6 +188,7 @@ class VideoIntroController extends GetxController { } Future queryVideoTags() async { + videoTags = null; var result = await UserHttp.videoTags(bvid: bvid); if (result['status']) { videoTags = result['data']; diff --git a/lib/pages/video/introduction/ugc/view.dart b/lib/pages/video/introduction/ugc/view.dart index faf6300ae..b5198aba5 100644 --- a/lib/pages/video/introduction/ugc/view.dart +++ b/lib/pages/video/introduction/ugc/view.dart @@ -697,8 +697,8 @@ class _VideoInfoState extends State { ), ), ], - if (videoIntroController.videoTags is List && - videoIntroController.videoTags.isNotEmpty) ...[ + if (videoIntroController.videoTags?.isNotEmpty == + true) ...[ GestureDetector( onTap: () {}, behavior: HitTestBehavior.opaque, @@ -708,20 +708,17 @@ class _VideoInfoState extends State { child: Wrap( spacing: 8, runSpacing: 8, - children: (videoIntroController.videoTags - as List) + children: videoIntroController.videoTags! .map( (item) => SearchText( fontSize: 13, - text: item['tag_name'], - onTap: (_) => Get.toNamed( + text: item.tagName!, + onTap: (tagName) => Get.toNamed( '/searchResult', - parameters: { - 'keyword': item['tag_name'] - }, + parameters: {'keyword': tagName}, ), - onLongPress: (_) => - Utils.copyText(item['tag_name']), + onLongPress: (tagName) => + Utils.copyText(tagName), ), ) .toList(), diff --git a/lib/pages/video/note/controller.dart b/lib/pages/video/note/controller.dart index eca5a3ac0..eb5db5212 100644 --- a/lib/pages/video/note/controller.dart +++ b/lib/pages/video/note/controller.dart @@ -1,9 +1,12 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; +import 'package:PiliPlus/models/video/note_list/data.dart'; +import 'package:PiliPlus/models/video/note_list/list.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:get/get.dart'; -class NoteListPageCtr extends CommonListController { +class NoteListPageCtr + extends CommonListController { NoteListPageCtr({this.oid, this.upperMid}); final dynamic oid; final dynamic upperMid; @@ -17,8 +20,9 @@ class NoteListPageCtr extends CommonListController { } @override - List? getDataList(response) { - return response['list']; + List? getDataList(NoteListData response) { + count.value = response.page?.total ?? -1; + return response.list; } @override @@ -29,14 +33,8 @@ class NoteListPageCtr extends CommonListController { } @override - bool customHandleResponse(bool isRefresh, Success response) { - dynamic data = response.response; - count.value = data['page']?['total'] ?? -1; - return false; - } - - @override - Future customGetData() => VideoHttp.getVideoNoteList( + Future> customGetData() => + VideoHttp.getVideoNoteList( oid: oid, uperMid: upperMid, page: page, diff --git a/lib/pages/video/note/view.dart b/lib/pages/video/note/view.dart index d6d53e6b2..762c76393 100644 --- a/lib/pages/video/note/view.dart +++ b/lib/pages/video/note/view.dart @@ -5,10 +5,10 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/image_type.dart'; +import 'package:PiliPlus/models/video/note_list/list.dart'; import 'package:PiliPlus/pages/common/common_slide_page.dart'; import 'package:PiliPlus/pages/video/note/controller.dart'; import 'package:PiliPlus/pages/webview/view.dart'; -import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart' show Accounts; import 'package:flutter/material.dart'; @@ -156,7 +156,7 @@ class _NoteListPageState extends CommonSlidePageState { } Widget _buildBody( - ThemeData theme, LoadingState?> loadingState) { + ThemeData theme, LoadingState?> loadingState) { return switch (loadingState) { Loading() => SliverToBoxAdapter( child: ListView.builder( @@ -190,24 +190,26 @@ class _NoteListPageState extends CommonSlidePageState { }; } - Widget _itemWidget(ThemeData theme, dynamic item) { + Widget _itemWidget(ThemeData theme, NoteListItemModel item) { return InkWell( - onTap: () { - if (item['web_url'] != null && item['web_url'] != '') { - PiliScheme.routePushFromUrl(item['web_url']); - } - }, + onTap: () => Get.toNamed( + '/articlePage', + parameters: { + 'id': item.cvid!.toString(), + 'type': 'read', + }, + ), child: Padding( padding: const EdgeInsets.all(12), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( - onTap: () => Get.toNamed('/member?mid=${item['author']['mid']}'), + onTap: () => Get.toNamed('/member?mid=${item.author!.mid}'), child: NetworkImgLayer( height: 34, width: 34, - src: item['author']['face'], + src: item.author!.face, type: ImageType.avatar, ), ), @@ -218,17 +220,15 @@ class _NoteListPageState extends CommonSlidePageState { crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( - onTap: () => - Get.toNamed('/member?mid=${item['author']['mid']}'), + onTap: () => Get.toNamed('/member?mid=${item.author!.mid}'), child: Row( children: [ Text( - item['author']['name'], + item.author!.name!, style: TextStyle( - color: (item['author']?['vip_info']?['status'] ?? - 0) > - 0 && - item['author']?['vip_info']?['type'] == 2 + color: item.author?.vipInfo?.status != null && + item.author!.vipInfo!.status > 0 && + item.author!.vipInfo!.type == 2 ? context.vipColor : theme.colorScheme.outline, fontSize: 13, @@ -236,38 +236,38 @@ class _NoteListPageState extends CommonSlidePageState { ), const SizedBox(width: 6), Image.asset( - 'assets/images/lv/lv${item['author']['level']}.png', + 'assets/images/lv/lv${item.author!.isSeniorMember == 1 ? '6_s' : item.author!.level}.png', height: 11, ), ], ), ), const SizedBox(height: 4), - Text( - item['pubtime'], - style: TextStyle( - color: theme.colorScheme.outline, - fontSize: 12, + if (item.pubtime != null) + Text( + item.pubtime!, + style: TextStyle( + color: theme.colorScheme.outline, + fontSize: 12, + ), ), - ), - if (item['summary'] != null) ...[ + if (item.summary != null) ...[ const SizedBox(height: 5), Text( - item['summary'], + item.summary!, style: TextStyle( height: 1.75, fontSize: theme.textTheme.bodyMedium!.fontSize, ), ), - if (item['web_url'] != null && item['web_url'] != '') - Text( - '查看全部', - style: TextStyle( - color: theme.colorScheme.primary, - height: 1.75, - fontSize: theme.textTheme.bodyMedium!.fontSize, - ), + Text( + '查看全部', + style: TextStyle( + color: theme.colorScheme.primary, + height: 1.75, + fontSize: theme.textTheme.bodyMedium!.fontSize, ), + ), ], ], ), diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index c17c5b152..5b30e1776 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -10,10 +10,11 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' show ReplyInfo; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/main.dart'; -import 'package:PiliPlus/models/bangumi/info.dart' as bangumi; import 'package:PiliPlus/models/common/episode_panel_type.dart'; import 'package:PiliPlus/models/common/search_type.dart'; +import 'package:PiliPlus/models/pgc/info.dart' as bangumi; import 'package:PiliPlus/models/video_detail_res.dart' as video; +import 'package:PiliPlus/models/video_tag/data.dart'; import 'package:PiliPlus/pages/danmaku/view.dart'; import 'package:PiliPlus/pages/episode_panel/view.dart'; import 'package:PiliPlus/pages/video/ai/view.dart'; @@ -2077,7 +2078,8 @@ class _VideoDetailPageVState extends State ); } - void showIntroDetail(bangumi.BangumiInfoModel videoDetail, videoTags) { + void showIntroDetail( + bangumi.BangumiInfoModel videoDetail, List? videoTags) { videoDetailController.childKey.currentState?.showBottomSheet( backgroundColor: Colors.transparent, (context) => bangumi.IntroDetail( diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index e749607f5..052e83dfd 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/models/common/audio_normalization.dart'; import 'package:PiliPlus/models/common/sponsor_block/segment_type.dart'; import 'package:PiliPlus/models/common/sponsor_block/skip_type.dart'; import 'package:PiliPlus/models/user/danmaku_rule.dart'; +import 'package:PiliPlus/models/video_shot/data.dart'; import 'package:PiliPlus/pages/mine/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/data_source.dart'; import 'package:PiliPlus/plugin/pl_player/models/data_status.dart'; @@ -510,7 +511,7 @@ class PlPlayerController { List? segmentList, List? viewPointList, bool? showVP, - List? dmTrend, + List? dmTrend, bool autoplay = true, // 默认不循环 PlaylistMode looping = PlaylistMode.none, @@ -536,7 +537,7 @@ class PlPlayerController { this.segmentList.value = segmentList ?? []; this.viewPointList.value = viewPointList ?? []; this.showVP.value = showVP ?? true; - this.dmTrend.value = dmTrend ?? []; + this.dmTrend.value = dmTrend ?? []; _autoPlay = autoplay; _looping = looping; // 初始化视频倍速 @@ -1600,7 +1601,7 @@ class PlPlayerController { if (res.data['code'] == 0) { videoShot = { 'status': true, - 'data': res.data['data'], + 'data': VideoShotData.fromJson(res.data['data']), }; } else { videoShot = {'status': false}; @@ -1611,7 +1612,7 @@ class PlPlayerController { _isQueryingVideoShot = false; } - late final RxList dmTrend = [].obs; + late final RxList dmTrend = [].obs; late final RxBool showDmTreandChart = true.obs; } diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index fa596a8a7..73c38de7d 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -7,6 +7,7 @@ import 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.da import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart'; import 'package:PiliPlus/models/common/super_resolution_type.dart'; import 'package:PiliPlus/models/video_detail_res.dart'; +import 'package:PiliPlus/models/video_shot/data.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; @@ -1772,7 +1773,7 @@ Widget buildDmChart( plPlayerController.dmTrend.length, (index) => FlSpot( index.toDouble(), - plPlayerController.dmTrend[index].toDouble(), + plPlayerController.dmTrend[index], ), ), isCurved: true, @@ -1793,98 +1794,84 @@ Widget buildDmChart( Widget buildSeekPreviewWidget(PlPlayerController plPlayerController) { return Obx(() { - if (plPlayerController.showPreview.value.not) { - return SizedBox.shrink( - key: ValueKey(plPlayerController.previewDx.value), - ); - } - if (plPlayerController.videoShot == null) { + if (!plPlayerController.showPreview.value || + plPlayerController.videoShot?['status'] != true) { plPlayerController.getVideoShot(); return SizedBox.shrink( key: ValueKey(plPlayerController.previewDx.value), ); - } else if (plPlayerController.videoShot!['status'] == false) { - return SizedBox.shrink( - key: ValueKey(plPlayerController.previewDx.value), - ); } + VideoShotData data = plPlayerController.videoShot!['data']; + return LayoutBuilder( - key: ValueKey(plPlayerController.previewDx.value), - builder: (context, constraints) { - try { - double scale = plPlayerController.isFullScreen.value && - plPlayerController.direction.value == 'horizontal' - ? 4 - : 2.5; - // offset - double left = (plPlayerController.previewDx.value - 48 * scale / 2) - .clamp(8, constraints.maxWidth - 48 * scale - 8); + key: ValueKey(plPlayerController.previewDx.value), + builder: (context, constraints) { + try { + double scale = plPlayerController.isFullScreen.value && + plPlayerController.direction.value == 'horizontal' + ? 4 + : 2.5; + // offset + double left = (plPlayerController.previewDx.value - 48 * scale / 2) + .clamp(8, constraints.maxWidth - 48 * scale - 8); - // index - // int index = plPlayerController.sliderPositionSeconds.value ~/ 5; - int index = max( - 0, - (List.from(plPlayerController.videoShot!['data']['index']) - .where((item) => - item <= - plPlayerController.sliderPositionSeconds.value) - .length - - 2)); - - // pageIndex - int pageIndex = (index ~/ 100).clamp( + // index + // int index = plPlayerController.sliderPositionSeconds.value ~/ 5; + int index = max( 0, - (plPlayerController.videoShot!['data']['image'] as List).length, - ); + (data.index! + .where((item) => + item <= + plPlayerController.sliderPositionSeconds.value) + .length - + 2)); - // alignment - double cal(m) { - return -1 + 2 / 9 * m; - } + // pageIndex + int pageIndex = (index ~/ 100).clamp(0, data.image!.length); - int align = index % 100; - int x = align % 10; - int y = align ~/ 10; - double dx = cal(x); - double dy = cal(y); - Alignment alignment = Alignment(dx, dy); + // alignment + double cal(m) { + return -1 + 2 / 9 * m; + } - // url - String parseUrl(String url) { - return url.startsWith('//') ? 'https:$url' : url; - } + int align = index % 100; + int x = align % 10; + int y = align ~/ 10; + double dx = cal(x); + double dy = cal(y); + Alignment alignment = Alignment(dx, dy); - return Container( - alignment: Alignment.centerLeft, - padding: EdgeInsets.only(left: left), - child: UnconstrainedBox( - child: ClipRRect( - borderRadius: scale == 2.5 - ? const BorderRadius.all(Radius.circular(6)) - : StyleString.mdRadius, - child: Align( - widthFactor: 0.1, - heightFactor: 0.1, - alignment: alignment, - child: CachedNetworkImage( - fit: BoxFit.fill, - width: 480 * scale, - height: 270 * scale, - imageUrl: parseUrl(plPlayerController.videoShot!['data'] - ['image'][pageIndex]), - ), + return Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only(left: left), + child: UnconstrainedBox( + child: ClipRRect( + borderRadius: scale == 2.5 + ? const BorderRadius.all(Radius.circular(6)) + : StyleString.mdRadius, + child: Align( + widthFactor: 0.1, + heightFactor: 0.1, + alignment: alignment, + child: CachedNetworkImage( + fit: BoxFit.fill, + width: 480 * scale, + height: 270 * scale, + imageUrl: data.image![pageIndex].http2https, ), ), ), - ); - } catch (e) { - debugPrint('seek preview: $e'); - return SizedBox.shrink( - key: ValueKey(plPlayerController.previewDx.value), - ); - } - }); + ), + ); + } catch (e) { + debugPrint('seek preview: $e'); + return SizedBox.shrink( + key: ValueKey(plPlayerController.previewDx.value), + ); + } + }, + ); }); } diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index f1860f274..acac62105 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -1,5 +1,5 @@ -import 'package:PiliPlus/models/bangumi/info.dart'; import 'package:PiliPlus/models/live/live_room/room_info_h5.dart'; +import 'package:PiliPlus/models/pgc/info.dart'; import 'package:PiliPlus/models/video_detail_res.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_status.dart'; diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index be72b6656..122e43006 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -596,7 +596,7 @@ class PiliScheme { : pathSegments.first; debugPrint('area: $area'); switch (area) { - case 'note': + case 'note' || 'note-app': String? id = uri.queryParameters['cvid']; if (id != null) { PageUtils.toDupNamed( diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index b4b00eb47..650c54d35 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -4,11 +4,11 @@ import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactivevie import 'package:PiliPlus/grpc/im.dart'; import 'package:PiliPlus/http/dynamics.dart'; import 'package:PiliPlus/http/search.dart'; -import 'package:PiliPlus/models/bangumi/info.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/models/common/search_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models/live/live_room/item.dart'; +import 'package:PiliPlus/models/pgc/info.dart'; import 'package:PiliPlus/pages/contact/view.dart'; import 'package:PiliPlus/pages/fav_panel/view.dart'; import 'package:PiliPlus/pages/share/view.dart';