feat: 稍后再看

This commit is contained in:
guozhigq
2023-05-23 11:18:23 +08:00
parent 51c4a082ac
commit bbba3083bc
9 changed files with 132 additions and 5 deletions

View File

@ -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';
}

View File

@ -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<dynamic> seeYouLater() async {
var res = await Request().get(Api.seeYouLater);
if (res.data['code'] == 0) {
List<HotVideoItemModel> 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']};
}
}
}

View File

@ -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;
}

View File

@ -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<HotVideoItemModel> 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;
}
}

View File

@ -0,0 +1,4 @@
library later;
export './controller.dart';
export './view.dart';

75
lib/pages/later/view.dart Normal file
View File

@ -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<LaterPage> createState() => _LaterPageState();
}
class _LaterPageState extends State<LaterPage> {
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,
),
)
],
),
);
}
}

View File

@ -27,8 +27,8 @@ class MediaController extends GetxController {
},
{
'icon': Icons.watch_later_outlined,
'title': '再看',
'onTap': () => {},
'title': '再看',
'onTap': () => Get.toNamed('/later'),
},
];

View File

@ -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()),
];
}

View File

@ -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 '';