feat: 我的订阅新增播单支持

This commit is contained in:
orz12
2024-04-26 23:41:29 +08:00
parent c90f75de72
commit 30998611da
6 changed files with 100 additions and 37 deletions

View File

@@ -517,8 +517,11 @@ class Api {
/// 我的订阅
static const userSubFolder = '/x/v3/fav/folder/collected/list';
/// 我的订阅详情
static const userSubFolderDetail = '/x/space/fav/season/list';
/// 我的订阅-合集详情
static const favSeasonList = '/x/space/fav/season/list';
/// 我的订阅-播单详情
static const favResourceList = '/x/v3/fav/resource/list';
/// 发送私信
static const String sendMsg = '${HttpString.tUrl}/web_im/v1/web_im/send_msg';
@@ -526,6 +529,9 @@ class Api {
/// 排行榜
static const String getRankApi = "/x/web-interface/ranking/v2";
/// 取消订阅
static const String cancelSub = '/x/v3/fav/season/unfav';
/// 取消订阅-合集
static const String unfavSeason = '/x/v3/fav/season/unfav';
/// 取消订阅-播单
static const String unfavFolder = '/x/v3/fav/folder/unfav';
}

View File

@@ -334,13 +334,33 @@ class UserHttp {
}
}
static Future userSubFolderDetail({
required int seasonId,
static Future favSeasonList({
required int id,
required int pn,
required int ps,
}) async {
var res = await Request().get(Api.userSubFolderDetail, data: {
'season_id': seasonId,
var res = await Request().get(Api.favSeasonList, data: {
'season_id': id,
'ps': ps,
'pn': pn,
});
if (res.data['code'] == 0) {
return {
'status': true,
'data': SubDetailModelData.fromJson(res.data['data'])
};
} else {
return {'status': false, 'msg': res.data['message']};
}
}
static Future favResourceList({
required int id,
required int pn,
required int ps,
}) async {
var res = await Request().get(Api.favResourceList, data: {
'media_id': id,
'ps': ps,
'pn': pn,
});
@@ -355,15 +375,26 @@ class UserHttp {
}
// 取消订阅
static Future cancelSub({required int seasonId}) async {
var res = await Request().post(
Api.cancelSub,
queryParameters: {
'platform': 'web',
'season_id': seasonId,
'csrf': await Request.getCsrf(),
},
);
static Future cancelSub({required int id, required int type}) async {
late dynamic res;
if (type == 11) {
res = await Request().post(
Api.unfavFolder,
queryParameters: {
'media_id': id,
'csrf': await Request.getCsrf(),
},
);
} else {
res = await Request().post(
Api.unfavSeason,
queryParameters: {
'platform': 'web',
'season_id': id,
'csrf': await Request.getCsrf(),
},
);
}
if (res.data['code'] == 0) {
return {'status': true};
} else {

View File

@@ -66,7 +66,8 @@ class SubController extends GetxController {
),
TextButton(
onPressed: () async {
var res = await UserHttp.cancelSub(seasonId: subFolderItem.id!);
var res = await UserHttp.cancelSub(
id: subFolderItem.id!, type: subFolderItem.type!);
if (res['status']) {
subFolderData.value.list!.remove(subFolderItem);
subFolderData.update((val) {});

View File

@@ -24,7 +24,7 @@ class SubItem extends StatelessWidget {
arguments: subFolderItem,
parameters: {
'heroTag': heroTag,
'seasonId': subFolderItem.id.toString(),
'id': subFolderItem.id.toString(),
},
),
child: Padding(
@@ -77,6 +77,14 @@ class VideoContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
// subFolderItem.type == 11播单
// subFolderItem.type == 21合集
// 其它:其它
String typeString = subFolderItem.type == 11
? '播单'
: subFolderItem.type == 21
? '合集'
: '其它:${subFolderItem.type}';
return Expanded(
child: Stack(
children: [
@@ -95,7 +103,7 @@ class VideoContent extends StatelessWidget {
),
const SizedBox(height: 2),
Text(
'合集 UP主${subFolderItem.upper!.name!}',
'[$typeString] UP主${subFolderItem.upper!.name!}',
textAlign: TextAlign.start,
style: TextStyle(
fontSize: Theme.of(context).textTheme.labelMedium!.fontSize,

View File

@@ -7,7 +7,7 @@ import '../../models/user/sub_folder.dart';
class SubDetailController extends GetxController {
late SubFolderItemData item;
late int seasonId;
late int id;
late String heroTag;
int currentPage = 1;
bool isLoadingMore = false;
@@ -15,12 +15,14 @@ class SubDetailController extends GetxController {
RxList<SubDetailMediaItem> subList = <SubDetailMediaItem>[].obs;
RxString loadingText = '加载中...'.obs;
int mediaCount = 0;
RxInt playCount = 0.obs;
@override
void onInit() {
item = Get.arguments;
if (playCount.value == 0) playCount.value = item.viewCount!;
if (Get.parameters.keys.isNotEmpty) {
seasonId = int.parse(Get.parameters['seasonId']!);
id = int.parse(Get.parameters['id']!);
heroTag = Get.parameters['heroTag']!;
}
super.onInit();
@@ -32,16 +34,28 @@ class SubDetailController extends GetxController {
return;
}
isLoadingMore = true;
var res = await UserHttp.userSubFolderDetail(
seasonId: seasonId,
ps: 20,
pn: currentPage,
);
late Map<String,dynamic> res;
if (item.type! == 11) {
res = await UserHttp.favResourceList(
id: id,
ps: 20,
pn: currentPage,
);
} else {
res = await UserHttp.favSeasonList(// item.type! == 21
id: id,
ps: 20,
pn: currentPage,
);
}
if (res['status']) {
subInfo.value = res['data'].info;
if (currentPage == 1 && type == 'init') {
subList.value = res['data'].medias;
mediaCount = res['data'].info.mediaCount;
if (item.type == 11) {
playCount.value = res['data'].info.cntInfo!['play'];
}
} else if (type == 'onLoad') {
subList.addAll(res['data'].medias);
}

View File

@@ -26,12 +26,12 @@ class _SubDetailPageState extends State<SubDetailPage> {
Get.put(SubDetailController());
late StreamController<bool> titleStreamC; // a
late Future _futureBuilderFuture;
late String seasonId;
late String id;
@override
void initState() {
super.initState();
seasonId = Get.parameters['seasonId']!;
id = Get.parameters['id']!;
_futureBuilderFuture = _subDetailController.queryUserSubFolderDetail();
titleStreamC = StreamController<bool>();
_controller.addListener(
@@ -162,14 +162,17 @@ class _SubDetailPageState extends State<SubDetailPage> {
),
),
const SizedBox(height: 4),
Text(
'${Utils.numFormat(_subDetailController.item.viewCount)}次播放',
style: TextStyle(
fontSize: Theme.of(context)
.textTheme
.labelSmall!
.fontSize,
color: Theme.of(context).colorScheme.outline),
Obx(
() => Text(
'${Utils.numFormat(_subDetailController.playCount.value)}次播放',
style: TextStyle(
fontSize: Theme.of(context)
.textTheme
.labelSmall!
.fontSize,
color:
Theme.of(context).colorScheme.outline),
),
),
],
),