From a73f2e1a136319a6d41f922fb14694765756621e Mon Sep 17 00:00:00 2001 From: zarzet Date: Thu, 26 Mar 2026 01:44:11 +0700 Subject: [PATCH] feat: auto-select recommended download service based on content source --- lib/screens/album_screen.dart | 12 ++++++++++++ lib/screens/artist_screen.dart | 12 ++++++++++++ lib/screens/home_tab.dart | 3 +++ lib/screens/playlist_screen.dart | 29 +++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+) diff --git a/lib/screens/album_screen.dart b/lib/screens/album_screen.dart index 3f020953..126c2f5e 100644 --- a/lib/screens/album_screen.dart +++ b/lib/screens/album_screen.dart @@ -241,6 +241,16 @@ class _AlbumScreenState extends ConsumerState { ); } + String? _recommendedDownloadService() { + if (widget.extensionId != null && widget.extensionId!.isNotEmpty) { + return widget.extensionId; + } + if (widget.albumId.startsWith('tidal:')) return 'tidal'; + if (widget.albumId.startsWith('qobuz:')) return 'qobuz'; + if (widget.albumId.startsWith('deezer:')) return 'deezer'; + return null; + } + @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; @@ -551,6 +561,7 @@ class _AlbumScreenState extends ConsumerState { trackName: track.name, artistName: track.artistName, coverUrl: track.coverUrl, + recommendedService: _recommendedDownloadService(), onSelect: (quality, service) { ref .read(downloadQueueProvider.notifier) @@ -623,6 +634,7 @@ class _AlbumScreenState extends ConsumerState { context, trackName: '${tracksToQueue.length} tracks', artistName: widget.albumName, + recommendedService: _recommendedDownloadService(), onSelect: (quality, service) { ref .read(downloadQueueProvider.notifier) diff --git a/lib/screens/artist_screen.dart b/lib/screens/artist_screen.dart index 7aefcd64..751bc797 100644 --- a/lib/screens/artist_screen.dart +++ b/lib/screens/artist_screen.dart @@ -152,6 +152,16 @@ class _ArtistScreenState extends ConsumerState { return tileSize + 64 + ((textScale - 1) * 14); } + String? _recommendedDownloadService() { + if (widget.extensionId != null && widget.extensionId!.isNotEmpty) { + return widget.extensionId; + } + if (widget.artistId.startsWith('tidal:')) return 'tidal'; + if (widget.artistId.startsWith('qobuz:')) return 'qobuz'; + if (widget.artistId.startsWith('deezer:')) return 'deezer'; + return null; + } + @override void initState() { super.initState(); @@ -889,6 +899,7 @@ class _ArtistScreenState extends ConsumerState { if (settings.askQualityBeforeDownload) { DownloadServicePicker.show( context, + recommendedService: _recommendedDownloadService(), onSelect: (quality, service) { _fetchAndQueueAlbums(albums, service, quality); }, @@ -1689,6 +1700,7 @@ class _ArtistScreenState extends ConsumerState { if (settings.askQualityBeforeDownload) { DownloadServicePicker.show( context, + recommendedService: _recommendedDownloadService(), onSelect: (quality, service) { if (!mounted) return; enqueue(service, quality: quality); diff --git a/lib/screens/home_tab.dart b/lib/screens/home_tab.dart index 890fbd09..2c0521e0 100644 --- a/lib/screens/home_tab.dart +++ b/lib/screens/home_tab.dart @@ -712,6 +712,8 @@ class _HomeTabState extends ConsumerState playlistName: trackState.playlistName!, coverUrl: trackState.coverUrl, tracks: trackState.tracks, + recommendedService: + trackState.searchExtensionId ?? trackState.searchSource, ), ), ); @@ -4470,6 +4472,7 @@ class _ExtensionPlaylistScreenState playlistName: widget.playlistName, coverUrl: widget.coverUrl, tracks: _tracks!, + recommendedService: widget.extensionId, ); } } diff --git a/lib/screens/playlist_screen.dart b/lib/screens/playlist_screen.dart index fb4818ea..f3af578e 100644 --- a/lib/screens/playlist_screen.dart +++ b/lib/screens/playlist_screen.dart @@ -21,6 +21,7 @@ class PlaylistScreen extends ConsumerStatefulWidget { final String? coverUrl; final List tracks; final String? playlistId; + final String? recommendedService; const PlaylistScreen({ super.key, @@ -28,6 +29,7 @@ class PlaylistScreen extends ConsumerStatefulWidget { this.coverUrl, required this.tracks, this.playlistId, + this.recommendedService, }); @override @@ -47,6 +49,31 @@ class _PlaylistScreenState extends ConsumerState { String get _playlistName => _resolvedPlaylistName ?? widget.playlistName; String? get _coverUrl => _resolvedCoverUrl ?? widget.coverUrl; + String? _recommendedDownloadService() { + final explicit = widget.recommendedService; + if (explicit != null && explicit.isNotEmpty) { + return explicit; + } + + final playlistId = widget.playlistId; + if (playlistId != null) { + if (playlistId.startsWith('tidal:')) return 'tidal'; + if (playlistId.startsWith('qobuz:')) return 'qobuz'; + if (playlistId.startsWith('deezer:')) return 'deezer'; + } + + final source = _tracks.firstOrNull?.source; + if (source != null && source.isNotEmpty) { + return source; + } + + final trackId = _tracks.firstOrNull?.id ?? ''; + if (trackId.startsWith('tidal:')) return 'tidal'; + if (trackId.startsWith('qobuz:')) return 'qobuz'; + if (trackId.startsWith('deezer:')) return 'deezer'; + return null; + } + @override void initState() { super.initState(); @@ -429,6 +456,7 @@ class _PlaylistScreenState extends ConsumerState { trackName: track.name, artistName: track.artistName, coverUrl: track.coverUrl, + recommendedService: _recommendedDownloadService(), onSelect: (quality, service) { ref .read(downloadQueueProvider.notifier) @@ -663,6 +691,7 @@ class _PlaylistScreenState extends ConsumerState { context, trackName: '${tracksToQueue.length} tracks', artistName: _playlistName, + recommendedService: _recommendedDownloadService(), onSelect: (quality, service) { ref .read(downloadQueueProvider.notifier)