From e8a32a61491d4868af5f1360080404750bc3e5db Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Tue, 21 Oct 2025 17:20:24 +0800 Subject: [PATCH] custom audio order Closes #1636 Signed-off-by: bggRGjQaUbCoE --- lib/grpc/audio.dart | 3 ++- lib/pages/audio/controller.dart | 16 +++++++++++++- lib/pages/audio/view.dart | 37 +++++++++++++++++++++++++-------- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/lib/grpc/audio.dart b/lib/grpc/audio.dart index a21f63d3..1d36efaf 100644 --- a/lib/grpc/audio.dart +++ b/lib/grpc/audio.dart @@ -44,6 +44,7 @@ class AudioGrpc { String? next, int qn = 80, int fnval = 4048, + ListOrder order = ListOrder.ORDER_NORMAL, }) { return GrpcReq.request( GrpcUrl.audioPlayList, @@ -63,7 +64,7 @@ class AudioGrpc { voiceBalance: Int64(1), ), extraId: extraId, - sortOpt: SortOption(order: ListOrder.ORDER_NORMAL), + sortOpt: SortOption(order: order), pagination: Pagination(pageSize: 20, next: next), ), PlaylistResp.fromBuffer, diff --git a/lib/pages/audio/controller.dart b/lib/pages/audio/controller.dart index 11bd3d7f..6bca111f 100644 --- a/lib/pages/audio/controller.dart +++ b/lib/pages/audio/controller.dart @@ -9,7 +9,8 @@ import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart' PlaylistResp, PlaylistSource, PlayInfo, - ThumbUpReq_ThumbType; + ThumbUpReq_ThumbType, + ListOrder; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/ua_type.dart'; import 'package:PiliPlus/pages/common/common_intro_controller.dart' @@ -78,6 +79,8 @@ class AudioController extends GetxController String? _next; bool get reachStart => _prev == null; + ListOrder order = ListOrder.ORDER_NORMAL; + @override void onInit() { super.onInit(); @@ -163,6 +166,7 @@ class AudioController extends GetxController ? _next : null, extraId: extraId, + order: order, ); if (res.isSuccess) { final PlaylistResp data = res.data; @@ -576,6 +580,9 @@ class AudioController extends GetxController if (index != null && playlist != null && player != null) { final next = index! + 1; if (next < playlist!.length) { + if (next == playlist!.length - 1 && _next != null) { + _queryPlayList(isLoadNext: true); + } playIndex(next); return true; } @@ -644,6 +651,13 @@ class AudioController extends GetxController } } + void onChangeOrder(ListOrder value) { + if (order != value) { + order = value; + _queryPlayList(isInit: true); + } + } + @override void onClose() { // _cancelTimer(); diff --git a/lib/pages/audio/view.dart b/lib/pages/audio/view.dart index 10cc9b2e..f9964d73 100644 --- a/lib/pages/audio/view.dart +++ b/lib/pages/audio/view.dart @@ -56,6 +56,10 @@ class AudioPage extends StatefulWidget { ); } +extension _ListOrderExt on ListOrder { + String get title => const ['无序', '正序', '倒序', '随机'][value]; +} + class _AudioPageState extends State { final _controller = Get.put( AudioController(), @@ -75,15 +79,30 @@ class _AudioPageState extends State { final padding = MediaQuery.viewPaddingOf(context); return Scaffold( appBar: AppBar( - actions: _controller.isVideo - ? [ - IconButton( - onPressed: _showMore, - icon: const Icon(Icons.more_vert), - ), - const SizedBox(width: 5), - ] - : null, + actions: [ + Builder( + builder: (context) { + return PopupMenuButton( + tooltip: '排序', + icon: const Icon(Icons.sort), + initialValue: _controller.order, + onSelected: (value) { + _controller.onChangeOrder(value); + (context as Element).markNeedsBuild(); + }, + itemBuilder: (context) => ListOrder.values + .map((e) => PopupMenuItem(value: e, child: Text(e.title))) + .toList(), + ); + }, + ), + if (_controller.isVideo) + IconButton( + onPressed: _showMore, + icon: const Icon(Icons.more_vert), + ), + const SizedBox(width: 5), + ], ), body: Padding( padding: EdgeInsets.only(