diff --git a/lib/http/api.dart b/lib/http/api.dart index 35ac1201..44156cc2 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -370,7 +370,9 @@ class Api { static const String memberArchive = '/x/space/wbi/arc/search'; // 用户动态搜索 - static const String memberDynamicSearch = '/x/space/dynamic/search'; + // static const String memberDynamicSearch = '/x/space/dynamic/search'; + static const String memberDynamicSearch = + '/x/polymer/web-dynamic/v1/feed/space/search'; // 用户动态 static const String memberDynamic = '/x/polymer/web-dynamic/v1/feed/space'; diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index 84efaeb6..32e9684f 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -102,7 +102,7 @@ class DynamicsHttp { if (id != null) 'id': id, if (rid != null) 'rid': rid, if (type != null) 'type': type, - 'features': 'itemOpusStyle', + 'features': 'itemOpusStyle,listOnlyfans', }, options: clearCookie ? Options(extra: {'account': AnonymousAccount()}) : null, diff --git a/lib/http/member.dart b/lib/http/member.dart index eddd29db..2032355a 100644 --- a/lib/http/member.dart +++ b/lib/http/member.dart @@ -428,23 +428,27 @@ class MemberHttp { // 搜索用户动态 static Future memberDynamicSearch({ - int? pn, - int? ps, - int? mid, + required int pn, + required dynamic mid, + required dynamic offset, required String keyword, }) async { - var res = await Request().get(Api.memberDynamicSearch, queryParameters: { - 'keyword': keyword, - 'mid': mid, - 'pn': pn, - 'ps': ps, - 'platform': 'web' - }); + var res = await Request().get( + Api.memberDynamicSearch, + queryParameters: { + 'host_mid': mid, + 'page': pn, + 'offset': offset, + 'keyword': keyword, + 'features': 'itemOpusStyle,listOnlyfans', + 'web_location': 333.1387, + }, + ); if (res.data['code'] == 0) { return { 'status': true, - 'data': res.data['data']['cards'], - 'count': res.data['data']['total'] + 'data': DynamicsDataModel.fromJson(res.data['data']).items, + 'count': res.data['data']?['total'], }; } else { return { diff --git a/lib/pages/member_search/controller.dart b/lib/pages/member_search/controller.dart index 0e136e4a..dec77342 100644 --- a/lib/pages/member_search/controller.dart +++ b/lib/pages/member_search/controller.dart @@ -22,6 +22,7 @@ class MemberSearchController extends GetxController bool isEndArchive = false; Rx archiveState = LoadingState.loading().obs; + String offset = ''; int dynamicPn = 1; RxInt dynamicCount = (-1).obs; bool isEndDynamic = false; @@ -66,6 +67,7 @@ class MemberSearchController extends GetxController } Future refreshDynamic() async { + offset = ''; dynamicPn = 1; isEndDynamic = false; await searchDynamic(); @@ -82,12 +84,12 @@ class MemberSearchController extends GetxController dynamic res = await MemberHttp.memberDynamicSearch( mid: mid, pn: dynamicPn, - ps: 30, + offset: offset, keyword: textEditingController.text, ); if (res['status']) { if (isRefresh) { - dynamicCount.value = res['count']; + dynamicCount.value = res['count'] ?? -1; } if (isRefresh.not && dynamicState.value is Success) { res['data'].insertAll(0, (dynamicState.value as Success).response); diff --git a/lib/pages/member_search/search_dynamic.dart b/lib/pages/member_search/search_dynamic.dart index 35091a49..80287a7f 100644 --- a/lib/pages/member_search/search_dynamic.dart +++ b/lib/pages/member_search/search_dynamic.dart @@ -1,14 +1,12 @@ -import 'dart:convert'; - import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/loading_widget.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/member_search/controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/grid.dart'; -import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; @@ -63,7 +61,7 @@ class SearchDynamic extends StatelessWidget { : LastChildLayoutType.none; }, children: (loadingState.response as List) - .map((item) => _buildItem(context, item)) + .map((item) => DynamicPanel(item: item)) .toList(), ) : SliverCrossAxisGroup( @@ -82,9 +80,8 @@ class SearchDynamic extends StatelessWidget { ctr.searchDynamic(false); }); } - return _buildItem( - context, - loadingState.response[index], + return DynamicPanel( + item: loadingState.response[index], ); }, childCount: loadingState.response.length, @@ -163,131 +160,4 @@ class SearchDynamic extends StatelessWidget { ], ); } - - Widget _buildItem(context, item) { - try { - dynamic json = jsonDecode('${item['card']}'); - return switch (item['desc']['type']) { - 1 => _buildDynamic( - context: context, - id: item['desc']['dynamic_id_str'], - face: json['user']['face'], - name: json['user']['uname'], - vip: item['desc']['user_profile']['vip'], - pubTime: item['desc']['timestamp'], - content: json['item']['content'], - ), - 2 => _buildDynamic( - context: context, - id: item['desc']['dynamic_id_str'], - face: json['user']['head_url'], - name: json['user']['name'], - vip: json['user']['vip'], - pubTime: json['item']['upload_time'], - content: json['item']['description'], - ), - 4 => _buildDynamic( - context: context, - id: item['desc']['dynamic_id_str'], - face: json['user']['face'], - name: json['user']['uname'], - vip: item['desc']['user_profile']['vip'], - pubTime: item['desc']['timestamp'], - content: json['item']['content'], - ), - 8 => _buildVideo(context, json), - _ => _buildDef(item), - }; - } catch (e) { - debugPrint('$e'); - return _buildDef(item); - } - } - - _buildDynamic({ - required dynamic id, - required BuildContext context, - required String face, - required String name, - required dynamic vip, - required dynamic pubTime, - required String content, - }) { - return InkWell( - onTap: () { - Utils.pushDynFromId(id); - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildHeader( - context: context, - face: face, - name: name, - vip: vip, - pubTime: pubTime, - ), - const SizedBox(height: 5), - Text( - content, - style: TextStyle(fontSize: 15), - ) - ], - ), - ), - ); - } - - _buildVideo(context, json) { - return ListTile( - dense: true, - onTap: () { - Utils.toViewPage( - 'bvid=${IdUtils.av2bv(json['aid'])}&cid=${json['cid']}', - arguments: { - 'heroTag': Utils.makeHeroTag(json['aid']), - }, - ); - }, - title: Text( - '${json['title']}', - maxLines: 20, - style: TextStyle(fontSize: 15), - ), - subtitle: Text( - '${Utils.dateFormat(json['pubdate'])} · ${Utils.numFormat(json['stat']['view'])}观看 · ${Utils.numFormat(json['stat']['danmaku'])}弹幕', - style: TextStyle( - fontSize: 13, - color: Theme.of(context).colorScheme.outline, - ), - ), - leading: (json['pic'] as String?)?.isNotEmpty == true - ? Container( - margin: const EdgeInsets.symmetric(vertical: 6), - child: LayoutBuilder( - builder: (context, constraints) { - return NetworkImgLayer( - radius: 6, - src: json['pic'], - width: constraints.maxHeight * StyleString.aspectRatio, - height: constraints.maxHeight, - ); - }, - ), - ) - : null, - ); - } - - _buildDef(item) => ListTile( - dense: true, - onTap: () { - Utils.copyText(jsonEncode(item)); - }, - title: Text('$item'), - subtitle: Text('${item['desc']['type']}'), - ); }