feat: auto-select recommended download service based on content source

This commit is contained in:
zarzet
2026-03-26 01:44:11 +07:00
parent 091e3fadd9
commit a73f2e1a13
4 changed files with 56 additions and 0 deletions
+12
View File
@@ -241,6 +241,16 @@ class _AlbumScreenState extends ConsumerState<AlbumScreen> {
);
}
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<AlbumScreen> {
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<AlbumScreen> {
context,
trackName: '${tracksToQueue.length} tracks',
artistName: widget.albumName,
recommendedService: _recommendedDownloadService(),
onSelect: (quality, service) {
ref
.read(downloadQueueProvider.notifier)
+12
View File
@@ -152,6 +152,16 @@ class _ArtistScreenState extends ConsumerState<ArtistScreen> {
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<ArtistScreen> {
if (settings.askQualityBeforeDownload) {
DownloadServicePicker.show(
context,
recommendedService: _recommendedDownloadService(),
onSelect: (quality, service) {
_fetchAndQueueAlbums(albums, service, quality);
},
@@ -1689,6 +1700,7 @@ class _ArtistScreenState extends ConsumerState<ArtistScreen> {
if (settings.askQualityBeforeDownload) {
DownloadServicePicker.show(
context,
recommendedService: _recommendedDownloadService(),
onSelect: (quality, service) {
if (!mounted) return;
enqueue(service, quality: quality);
+3
View File
@@ -712,6 +712,8 @@ class _HomeTabState extends ConsumerState<HomeTab>
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,
);
}
}
+29
View File
@@ -21,6 +21,7 @@ class PlaylistScreen extends ConsumerStatefulWidget {
final String? coverUrl;
final List<Track> 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<PlaylistScreen> {
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<PlaylistScreen> {
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<PlaylistScreen> {
context,
trackName: '${tracksToQueue.length} tracks',
artistName: _playlistName,
recommendedService: _recommendedDownloadService(),
onSelect: (quality, service) {
ref
.read(downloadQueueProvider.notifier)