mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
114 lines
3.2 KiB
Dart
114 lines
3.2 KiB
Dart
import 'package:PiliPlus/http/loading_state.dart';
|
||
import 'package:PiliPlus/pages/common/common_controller.dart';
|
||
import 'package:PiliPlus/pages/search_result/controller.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:PiliPlus/http/search.dart';
|
||
import 'package:PiliPlus/models/common/search_type.dart';
|
||
import 'package:PiliPlus/utils/id_utils.dart';
|
||
import 'package:PiliPlus/utils/utils.dart';
|
||
|
||
class SearchPanelController extends CommonController {
|
||
SearchPanelController({
|
||
this.keyword,
|
||
required this.searchType,
|
||
required this.tag,
|
||
});
|
||
String? keyword;
|
||
SearchType searchType;
|
||
// 结果排序方式 搜索类型为视频、专栏及相簿时
|
||
RxString order = ''.obs;
|
||
// 视频时长筛选 仅用于搜索视频
|
||
RxInt duration = 0.obs;
|
||
int? tids;
|
||
int? orderSort;
|
||
int? userType;
|
||
int? categoryId;
|
||
String tag;
|
||
int? pubBegin;
|
||
int? pubEnd;
|
||
|
||
@override
|
||
void onInit() {
|
||
super.onInit();
|
||
queryData();
|
||
}
|
||
|
||
@override
|
||
bool customHandleResponse(Success response) {
|
||
try {
|
||
Get.find<SearchResultController>(tag: tag).count[searchType.index] =
|
||
response.response.numResults;
|
||
} catch (_) {}
|
||
if (response.response.list != null) {
|
||
isEnd = response.response.list.isEmpty;
|
||
if (currentPage != 1 && loadingState.value is Success) {
|
||
response.response.list
|
||
?.insertAll(0, (loadingState.value as Success).response);
|
||
}
|
||
loadingState.value = LoadingState.success(response.response.list);
|
||
if (currentPage == 1) {
|
||
onPushDetail(response.response.list);
|
||
}
|
||
} else {
|
||
isEnd = true;
|
||
if (currentPage == 1) {
|
||
loadingState.value = LoadingState.success([]);
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
void onPushDetail(resultList) async {
|
||
// 匹配输入内容,如果是AV、BV号且有结果 直接跳转详情页
|
||
Map matchRes = IdUtils.matchAvorBv(input: keyword);
|
||
List matchKeys = matchRes.keys.toList();
|
||
String? bvid;
|
||
try {
|
||
bvid = resultList.first.bvid;
|
||
} catch (_) {
|
||
bvid = null;
|
||
}
|
||
// keyword 可能输入纯数字
|
||
int? aid;
|
||
try {
|
||
aid = resultList.first.aid;
|
||
} catch (_) {
|
||
aid = null;
|
||
}
|
||
if (matchKeys.isNotEmpty && searchType == SearchType.video ||
|
||
aid.toString() == keyword) {
|
||
int cid = await SearchHttp.ab2c(aid: aid, bvid: bvid);
|
||
if (matchKeys.isNotEmpty &&
|
||
matchKeys.first == 'BV' &&
|
||
matchRes[matchKeys.first] == bvid ||
|
||
matchKeys.isNotEmpty &&
|
||
matchKeys.first == 'AV' &&
|
||
matchRes[matchKeys.first] == aid ||
|
||
aid.toString() == keyword) {
|
||
Get.toNamed(
|
||
'/video?bvid=$bvid&cid=$cid',
|
||
arguments: {
|
||
'videoItem': resultList.first,
|
||
'heroTag': Utils.makeHeroTag(bvid),
|
||
},
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<LoadingState> customGetData() => SearchHttp.searchByType(
|
||
searchType: searchType,
|
||
keyword: keyword!,
|
||
page: currentPage,
|
||
order: order.value,
|
||
duration: searchType.name != 'video' ? null : duration.value,
|
||
tids: tids,
|
||
orderSort: orderSort,
|
||
userType: userType,
|
||
categoryId: categoryId,
|
||
pubBegin: pubBegin,
|
||
pubEnd: pubEnd,
|
||
);
|
||
}
|