feat: add built-in Tidal/Qobuz search with recommended service picker

- Add SearchAll() for Tidal and Qobuz in Go backend (tracks, artists, albums)
- Add searchTidalAll/searchQobuzAll platform routing for Android and iOS
- Add Tidal/Qobuz options to search provider dropdown in home tab
- Show (Recommended) label and auto-select service in download picker
This commit is contained in:
zarzet
2026-03-25 13:51:38 +07:00
parent 98fdc0ed7c
commit 4f365ca7fe
20 changed files with 720 additions and 97 deletions
+13 -1
View File
@@ -102,6 +102,7 @@ class DownloadServicePicker extends ConsumerStatefulWidget {
final String? artistName;
final String? coverUrl;
final void Function(String quality, String service) onSelect;
final String? recommendedService; // Service to show as "(Recommended)"
const DownloadServicePicker({
super.key,
@@ -109,6 +110,7 @@ class DownloadServicePicker extends ConsumerStatefulWidget {
this.artistName,
this.coverUrl,
required this.onSelect,
this.recommendedService,
});
@override
@@ -121,6 +123,7 @@ class DownloadServicePicker extends ConsumerStatefulWidget {
String? trackName,
String? artistName,
String? coverUrl,
String? recommendedService,
required void Function(String quality, String service) onSelect,
}) {
final colorScheme = Theme.of(context).colorScheme;
@@ -138,6 +141,7 @@ class DownloadServicePicker extends ConsumerStatefulWidget {
artistName: artistName,
coverUrl: coverUrl,
onSelect: onSelect,
recommendedService: recommendedService,
),
);
}
@@ -152,7 +156,13 @@ class _DownloadServicePickerState extends ConsumerState<DownloadServicePicker> {
@override
void initState() {
super.initState();
_selectedService = ref.read(settingsProvider).defaultService;
// Default to recommended service if available, otherwise use default
final recommended = widget.recommendedService;
if (recommended != null && recommended.isNotEmpty) {
_selectedService = recommended;
} else {
_selectedService = ref.read(settingsProvider).defaultService;
}
}
/// Get quality options for the selected service
@@ -282,6 +292,8 @@ class _DownloadServicePickerState extends ConsumerState<DownloadServicePicker> {
_ServiceChip(
label: service.isDisabled
? '${service.label} (${service.disabledReason})'
: widget.recommendedService == service.id
? '${service.label} (Recommended)'
: service.label,
isSelected: _selectedService == service.id,
isDisabled: service.isDisabled,