diff --git a/go_backend/tidal.go b/go_backend/tidal.go index 226e66d3..2e201904 100644 --- a/go_backend/tidal.go +++ b/go_backend/tidal.go @@ -688,6 +688,10 @@ func findTidalArtistPageModule(page *tidalPublicArtistPage, moduleType string) * func (t *TidalDownloader) GetAvailableAPIs() []string { return []string{ + "https://eu-central.monochrome.tf", + "https://us-west.monochrome.tf", + "https://api.monochrome.tf", + "https://monochrome-api.samidy.com", "https://tidal-api.binimum.org", "https://tidal.kinoplus.online", "https://triton.squid.wtf", diff --git a/lib/providers/track_provider.dart b/lib/providers/track_provider.dart index ac5b507a..9547b6f3 100644 --- a/lib/providers/track_provider.dart +++ b/lib/providers/track_provider.dart @@ -609,17 +609,16 @@ class TrackNotifier extends Notifier { .map((ext) => ext.id) .firstOrNull; } + resolvedProvider ??= 'tidal'; } final isEnabledExtensionProvider = - resolvedProvider != null && resolvedProvider.isNotEmpty && extensionState.extensions.any( (ext) => ext.enabled && ext.id == resolvedProvider, ); - if (resolvedProvider != null && - resolvedProvider.isNotEmpty && + if (resolvedProvider.isNotEmpty && resolvedProvider != 'tidal' && resolvedProvider != 'qobuz' && !isEnabledExtensionProvider && @@ -639,10 +638,10 @@ class TrackNotifier extends Notifier { .where((ext) => ext.enabled && ext.hasCustomSearch) .map((ext) => ext.id) .firstOrNull; + resolvedProvider ??= 'tidal'; } - if (resolvedProvider != null && - resolvedProvider.isNotEmpty && + if (resolvedProvider.isNotEmpty && resolvedProvider != 'tidal' && resolvedProvider != 'qobuz' && extensionState.extensions.any( @@ -663,7 +662,9 @@ class TrackNotifier extends Notifier { final effectiveBuiltInProvider = resolvedProvider == 'tidal' || resolvedProvider == 'qobuz' ? resolvedProvider - : builtInSearchProvider; + : (builtInSearchProvider?.isNotEmpty == true + ? builtInSearchProvider + : 'tidal'); if (effectiveBuiltInProvider == null || effectiveBuiltInProvider.isEmpty) { state = TrackState( diff --git a/lib/screens/home_tab.dart b/lib/screens/home_tab.dart index 7fcbfcba..d806fb19 100644 --- a/lib/screens/home_tab.dart +++ b/lib/screens/home_tab.dart @@ -480,7 +480,7 @@ class _HomeTabState extends ConsumerState ))) { return explicit; } - return _defaultSearchExtension(extensions)?.id; + return _defaultSearchExtension(extensions)?.id ?? 'tidal'; } String? _sanitizeSearchFilterForProvider( @@ -524,8 +524,7 @@ class _HomeTabState extends ConsumerState _canonicalSearchFilterId(candidate.label!) == canonicalFilter) || (candidate.icon != null && - _canonicalSearchFilterId(candidate.icon!) == - canonicalFilter), + _canonicalSearchFilterId(candidate.icon!) == canonicalFilter), ) .firstOrNull; return match?.id; @@ -1289,28 +1288,28 @@ class _HomeTabState extends ConsumerState (hasHomeFeedExtension || hasExploreContent) && hasExploreContent; - ref.listen( - settingsProvider.select((s) => s.defaultSearchTab), - (previous, next) { - if (previous == next) return; - final selectedSearchFilter = ref.read( - trackProvider.select((s) => s.selectedSearchFilter), - ); - if (selectedSearchFilter != null && selectedSearchFilter.isNotEmpty) { - return; - } + ref.listen(settingsProvider.select((s) => s.defaultSearchTab), ( + previous, + next, + ) { + if (previous == next) return; + final selectedSearchFilter = ref.read( + trackProvider.select((s) => s.selectedSearchFilter), + ); + if (selectedSearchFilter != null && selectedSearchFilter.isNotEmpty) { + return; + } - final text = _urlController.text.trim(); - if (text.isEmpty || text.length < _minLiveSearchChars) return; - if (text.startsWith('http') || text.startsWith('spotify:')) return; + final text = _urlController.text.trim(); + if (text.isEmpty || text.length < _minLiveSearchChars) return; + if (text.startsWith('http') || text.startsWith('spotify:')) return; - WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) return; - _lastSearchQuery = null; - _performSearch(text); - }); - }, - ); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + _lastSearchQuery = null; + _performSearch(text); + }); + }); if (hasActualResults && isShowingRecentAccess && @@ -3554,8 +3553,10 @@ class _SearchProviderDropdown extends ConsumerWidget { .where((ext) => ext.enabled && ext.hasCustomSearch) .toList(); final primarySearchExtension = _defaultSearchExtension(searchProviders); + final defaultProviderTarget = + primarySearchExtension?.displayName ?? 'Tidal'; final defaultProviderLabel = - primarySearchExtension?.displayName ?? 'Deezer'; + '${context.l10n.extensionsHomeFeedAuto} ($defaultProviderTarget)'; final defaultProviderIconPath = primarySearchExtension?.iconPath; final currentProvider = rawCurrentProvider != null && diff --git a/lib/screens/settings/options_settings_page.dart b/lib/screens/settings/options_settings_page.dart index 176abc8b..147394aa 100644 --- a/lib/screens/settings/options_settings_page.dart +++ b/lib/screens/settings/options_settings_page.dart @@ -742,8 +742,10 @@ class _MetadataSourceSelector extends ConsumerWidget { final rawSearchProvider = settings.searchProvider?.trim() ?? ''; final isValidBuiltIn = _builtInProviders.containsKey(rawSearchProvider); final primarySearchExtension = _defaultSearchExtension(extState.extensions); + final defaultProviderTarget = + primarySearchExtension?.displayName ?? 'Tidal'; final defaultProviderLabel = - primarySearchExtension?.displayName ?? 'Deezer'; + '${context.l10n.extensionsHomeFeedAuto} ($defaultProviderTarget)'; final searchProvider = isValidBuiltIn || extState.extensions.any(