feat: music search (#1270)

* tweak

* feat: music search
This commit is contained in:
My-Responsitories
2025-09-17 00:33:33 +08:00
committed by GitHub
parent 3897efd82f
commit 349a4dfc0b
3 changed files with 113 additions and 69 deletions

View File

@@ -1,3 +1,4 @@
import 'dart:io';
import 'dart:math';
import 'package:PiliPlus/common/widgets/badge.dart';
@@ -448,10 +449,8 @@ class _MusicDetailPageState extends CommonDynPageState<MusicDetailPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GestureDetector(
// TODO: android intent ACTION_MEDIA_SEARCH
onTap: () => Utils.copyText(
item.musicTitle!,
),
onTap: () => _searchMusic(item),
onLongPress: () => Utils.copyText(item.musicTitle!),
behavior: HitTestBehavior.opaque,
child: MarqueeText(
item.musicTitle!,
@@ -493,13 +492,18 @@ class _MusicDetailPageState extends CommonDynPageState<MusicDetailPage> {
cid: item.mvCid!,
aid: item.mvAid,
),
child: ColoredBox(
color: theme.colorScheme.secondaryContainer
.withValues(alpha: 0.5),
child: DecoratedBox(
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(
Radius.circular(4),
),
color: theme.colorScheme.secondaryContainer
.withValues(alpha: 0.5),
),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 2,
horizontal: 3,
vertical: 3,
horizontal: 4,
),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -676,4 +680,18 @@ class _MusicDetailPageState extends CommonDynPageState<MusicDetailPage> {
),
);
}
Future<void> _searchMusic(MusicDetail item) async {
final res =
Platform.isAndroid &&
(await Utils.channel.invokeMethod<bool>('music', {
'title': item.musicTitle,
'artist': item.originArtist ?? item.originArtistList,
'album': item.album,
}) ??
false);
if (!res) {
Utils.copyText(item.musicTitle!);
}
}
}

View File

@@ -1,6 +1,5 @@
import 'dart:async' show FutureOr;
import 'dart:io' show Platform;
import 'dart:math';
import 'package:PiliPlus/grpc/grpc_req.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -21,13 +20,12 @@ import 'package:PiliPlus/utils/accounts/account.dart';
import 'package:PiliPlus/utils/request_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as web;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
abstract class LoginUtils {
static final random = Random();
static FutureOr setWebCookie([Account? account]) {
if (Platform.isWindows) {
return null;
@@ -163,7 +161,7 @@ abstract class LoginUtils {
static String generateBuvid() {
var md5Str = Iterable.generate(
32,
(_) => random.nextInt(16).toRadixString(16),
(_) => Utils.random.nextInt(16).toRadixString(16),
).join().toUpperCase();
return 'XY${md5Str[2]}${md5Str[12]}${md5Str[22]}$md5Str';
}
@@ -188,11 +186,11 @@ abstract class LoginUtils {
final String randomHex32 = List.generate(
32,
(index) => random.nextInt(16).toRadixString(16),
(index) => Utils.random.nextInt(16).toRadixString(16),
).join();
final String randomHex16 = List.generate(
16,
(index) => random.nextInt(16).toRadixString(16),
(index) => Utils.random.nextInt(16).toRadixString(16),
).join();
final String deviceID = randomHex32 + yyyyMMddHHmmss + randomHex16;