diff --git a/lib/http/api.dart b/lib/http/api.dart index 9684f337..a33e7039 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -128,4 +128,12 @@ class Api { // 正在直播的up & 关注的up // https://api.bilibili.com/x/polymer/web-dynamic/v1/portal + + // 关注的up动态 + + // 获取稍后再看 + static const String seeYouLater = '/x/v2/history/toview'; + + // 获取历史记录 + static const String historyList = '/x/web-interface/history/cursor'; } diff --git a/lib/http/user.dart b/lib/http/user.dart index 6d4be974..b6a52af8 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -1,5 +1,6 @@ import 'package:pilipala/http/api.dart'; import 'package:pilipala/http/init.dart'; +import 'package:pilipala/models/model_hot_video_item.dart'; import 'package:pilipala/models/user/fav_detail.dart'; import 'package:pilipala/models/user/fav_folder.dart'; import 'package:pilipala/models/user/info.dart'; @@ -76,4 +77,21 @@ class UserHttp { return {'status': false, 'data': [], 'msg': res.data['message']}; } } + + // 稍后再看 + static Future seeYouLater() async { + var res = await Request().get(Api.seeYouLater); + if (res.data['code'] == 0) { + List list = []; + for (var i in res.data['data']['list']) { + list.add(HotVideoItemModel.fromJson(i)); + } + return { + 'status': true, + 'data': {'list': list, 'count': res.data['data']['count']} + }; + } else { + return {'status': false, 'data': [], 'msg': res.data['message']}; + } + } } diff --git a/lib/models/model_hot_video_item.dart b/lib/models/model_hot_video_item.dart index 1a9f582e..db331a4c 100644 --- a/lib/models/model_hot_video_item.dart +++ b/lib/models/model_hot_video_item.dart @@ -80,7 +80,7 @@ class HotVideoItemModel { pubLocation = json["pub_location"]; seasontype = json["seasontype"]; isOgv = json["isOgv"]; - rcmdReason = json['rcmd_reason'] != '' + rcmdReason = json['rcmd_reason'] != '' && json['rcmd_reason'] != null ? RcmdReason.fromJson(json['rcmd_reason']) : null; } diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart new file mode 100644 index 00000000..6f6c376c --- /dev/null +++ b/lib/pages/later/controller.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:pilipala/http/user.dart'; +import 'package:pilipala/models/model_hot_video_item.dart'; + +class LaterController extends GetxController { + final ScrollController scrollController = ScrollController(); + RxList laterList = [HotVideoItemModel()].obs; + int count = 0; + + Future queryLaterList() async { + var res = await UserHttp.seeYouLater(); + if (res['status']) { + laterList.value = res['data']['list']; + count = res['data']['count']; + } + return res; + } +} diff --git a/lib/pages/later/index.dart b/lib/pages/later/index.dart new file mode 100644 index 00000000..3c4fefd9 --- /dev/null +++ b/lib/pages/later/index.dart @@ -0,0 +1,4 @@ +library later; + +export './controller.dart'; +export './view.dart'; diff --git a/lib/pages/later/view.dart b/lib/pages/later/view.dart new file mode 100644 index 00000000..dd435363 --- /dev/null +++ b/lib/pages/later/view.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:pilipala/common/skeleton/video_card_h.dart'; +import 'package:pilipala/common/widgets/http_error.dart'; +import 'package:pilipala/common/widgets/video_card_h.dart'; +import 'package:pilipala/pages/later/index.dart'; + +class LaterPage extends StatefulWidget { + const LaterPage({super.key}); + + @override + State createState() => _LaterPageState(); +} + +class _LaterPageState extends State { + final LaterController _laterController = Get.put(LaterController()); + Future? _futureBuilderFuture; + + @override + void initState() { + _futureBuilderFuture = _laterController.queryLaterList(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('稍后再看'), + centerTitle: false, + ), + body: CustomScrollView( + controller: _laterController.scrollController, + slivers: [ + FutureBuilder( + future: _futureBuilderFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + Map data = snapshot.data as Map; + if (data['status']) { + return Obx( + () => SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + return VideoCardH( + videoItem: _laterController.laterList[index], + ); + }, childCount: _laterController.laterList.length), + ), + ); + } else { + return HttpError( + errMsg: data['msg'], + fn: () => setState(() {}), + ); + } + } else { + // 骨架屏 + return SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + return const VideoCardHSkeleton(); + }, childCount: 5), + ); + } + }, + ), + SliverToBoxAdapter( + child: SizedBox( + height: MediaQuery.of(context).padding.bottom + 10, + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/media/controller.dart b/lib/pages/media/controller.dart index 2f4ec8f6..bb2e3661 100644 --- a/lib/pages/media/controller.dart +++ b/lib/pages/media/controller.dart @@ -27,8 +27,8 @@ class MediaController extends GetxController { }, { 'icon': Icons.watch_later_outlined, - 'title': '稍候再看', - 'onTap': () => {}, + 'title': '稍后再看', + 'onTap': () => Get.toNamed('/later'), }, ]; diff --git a/lib/router/app_pages.dart b/lib/router/app_pages.dart index 1ac52a93..e8030d96 100644 --- a/lib/router/app_pages.dart +++ b/lib/router/app_pages.dart @@ -3,6 +3,7 @@ import 'package:pilipala/pages/fav/index.dart'; import 'package:pilipala/pages/favDetail/index.dart'; import 'package:pilipala/pages/home/index.dart'; import 'package:pilipala/pages/hot/index.dart'; +import 'package:pilipala/pages/later/index.dart'; import 'package:pilipala/pages/preview/index.dart'; import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/pages/webview/index.dart'; @@ -29,5 +30,7 @@ class Routes { GetPage(name: '/fav', page: () => const FavPage()), // GetPage(name: '/favDetail', page: () => const FavDetailPage()), + // 稍后再看 + GetPage(name: '/later', page: () => const LaterPage()), ]; } diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 084a6e6f..56bdef4a 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -31,9 +31,9 @@ class Utils { int minute = time ~/ 60; double res = time / 60; if (minute != res) { - return '$minute:${(time - minute * 60) < 10 ? '0${(time - minute * 60)}' : (time - minute * 60)}'; + return '${minute < 10 ? '0$minute' : minute} :${(time - minute * 60) < 10 ? '0${(time - minute * 60)}' : (time - minute * 60)}'; } else { - return minute.toString(); + return '$minute:00'; } } else { return '';