feat: add search filters for Deezer default search

- Add filter parameter to Deezer SearchAll (track/artist/album/playlist)
- When filter is specified, increase limit for that type only
- Add default Deezer filters when not using extension search
- Reduce artist limit from 5 to 2 in home search results
- Filter bar now shows for both extension and default Deezer search
- Fix filter not being passed correctly during search (preserve filter state)
This commit is contained in:
zarzet committed 2026-01-31 15:12:10 +07:00
1 parent ff7135bf2c
commit fd3158fd15
6 files changed
+220 -163

No files matched your search

+20 -5
View File
@@ -204,11 +204,12 @@ class _HomeTabState extends ConsumerState<HomeTab> with AutomaticKeepAliveClient
}
}
Future<void> _performSearch(String query) async {
Future<void> _performSearch(String query, {String? filterOverride}) async {
final settings = ref.read(settingsProvider);
final extState = ref.read(extensionProvider);
final searchProvider = settings.searchProvider;
final selectedFilter = ref.read(trackProvider).selectedSearchFilter;
// Use filterOverride if provided, otherwise read from state
final selectedFilter = filterOverride ?? ref.read(trackProvider).selectedSearchFilter;
final searchKey = '${searchProvider ?? 'default'}:$query:${selectedFilter ?? 'all'}';
if (_lastSearchQuery == searchKey) return;
@@ -229,7 +230,7 @@ class _HomeTabState extends ConsumerState<HomeTab> with AutomaticKeepAliveClient
if (searchProvider != null && searchProvider.isNotEmpty && !isExtensionEnabled) {
ref.read(settingsProvider.notifier).setSearchProvider(null);
}
await ref.read(trackProvider.notifier).search(query, metadataSource: settings.metadataSource);
await ref.read(trackProvider.notifier).search(query, metadataSource: settings.metadataSource, filterOverride: selectedFilter);
}
ref.read(settingsProvider.notifier).setHasSearchedBefore();
}
@@ -510,11 +511,25 @@ class _HomeTabState extends ConsumerState<HomeTab> with AutomaticKeepAliveClient
final selectedSearchFilter = ref.watch(trackProvider.select((s) => s.selectedSearchFilter));
Extension? currentSearchExtension;
List<SearchFilter> searchFilters = [];
if (currentSearchProvider != null && currentSearchProvider.isNotEmpty) {
// Check if using extension search provider
final isUsingExtensionSearch = currentSearchProvider != null &&
currentSearchProvider.isNotEmpty &&
extState.extensions.any((e) => e.id == currentSearchProvider && e.enabled);
if (isUsingExtensionSearch) {
currentSearchExtension = extState.extensions.where((e) => e.id == currentSearchProvider && e.enabled).firstOrNull;
if (currentSearchExtension?.searchBehavior?.filters.isNotEmpty == true) {
searchFilters = currentSearchExtension!.searchBehavior!.filters;
}
} else {
// Default Deezer filters
searchFilters = const [
SearchFilter(id: 'track', label: 'Tracks', icon: 'music'),
SearchFilter(id: 'artist', label: 'Artists', icon: 'artist'),
SearchFilter(id: 'album', label: 'Albums', icon: 'album'),
SearchFilter(id: 'playlist', label: 'Playlists', icon: 'playlist'),
];
}
if (hasActualResults && isShowingRecentAccess) {
@@ -2127,7 +2142,7 @@ class _HomeTabState extends ConsumerState<HomeTab> with AutomaticKeepAliveClient
// Reset last search query to force new search
_lastSearchQuery = null;
_performSearch(text);
_performSearch(text, filterOverride: filter);
}
Widget _buildSearchBar(ColorScheme colorScheme) {