diff --git a/lib/screens/album_screen.dart b/lib/screens/album_screen.dart index 273b86ce..fd625484 100644 --- a/lib/screens/album_screen.dart +++ b/lib/screens/album_screen.dart @@ -14,6 +14,7 @@ import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/utils/image_cache_utils.dart'; import 'package:spotiflac_android/utils/string_utils.dart'; import 'package:spotiflac_android/utils/nav_bar_inset.dart'; +import 'package:spotiflac_android/utils/provider_resource_ids.dart'; import 'package:spotiflac_android/widgets/download_service_picker.dart'; import 'package:spotiflac_android/widgets/animation_utils.dart'; import 'package:spotiflac_android/providers/library_collections_provider.dart'; @@ -92,31 +93,17 @@ class _AlbumScreenState extends ConsumerState { bool _tallHeader = false; final ScrollController _scrollController = ScrollController(); - String _legacyProviderIdFromResourceId(String value) { - if (value.startsWith('deezer:')) return 'deezer'; - if (value.startsWith('qobuz:')) return 'qobuz'; - if (value.startsWith('tidal:')) return 'tidal'; - if (value.startsWith('spotify:')) return 'spotify'; - return 'spotify'; - } String _effectiveMetadataProviderIdFromAlbumId() { if (widget.extensionId != null && widget.extensionId!.isNotEmpty) { return widget.extensionId!; } return resolveEffectiveMetadataProvider( - _legacyProviderIdFromResourceId(widget.albumId), + legacyProviderIdFromResourceId(widget.albumId) ?? 'spotify', ref.read(extensionProvider), ); } - String _stripPrefixedResourceId(String value) { - final colonIndex = value.indexOf(':'); - if (colonIndex <= 0 || colonIndex == value.length - 1) { - return value; - } - return value.substring(colonIndex + 1); - } @override void initState() { @@ -336,7 +323,7 @@ class _AlbumScreenState extends ConsumerState { } String _metadataResourceId(String providerId) { - return _stripPrefixedResourceId(widget.albumId); + return stripPrefixedResourceId(widget.albumId); } double _albumTitleFontSize() { diff --git a/lib/screens/artist_screen.dart b/lib/screens/artist_screen.dart index 375e5fb4..1b6c0145 100644 --- a/lib/screens/artist_screen.dart +++ b/lib/screens/artist_screen.dart @@ -14,6 +14,7 @@ import 'package:spotiflac_android/providers/local_library_provider.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/utils/string_utils.dart'; import 'package:spotiflac_android/utils/nav_bar_inset.dart'; +import 'package:spotiflac_android/utils/provider_resource_ids.dart'; import 'package:spotiflac_android/screens/album_screen.dart'; import 'package:spotiflac_android/screens/home_tab.dart' show ExtensionAlbumScreen; @@ -168,31 +169,17 @@ class _ArtistScreenState extends ConsumerState { return _directMetadataProviderId(); } - String _legacyProviderIdFromResourceId(String value) { - if (value.startsWith('deezer:')) return 'deezer'; - if (value.startsWith('qobuz:')) return 'qobuz'; - if (value.startsWith('tidal:')) return 'tidal'; - if (value.startsWith('spotify:')) return 'spotify'; - return 'spotify'; - } String _effectiveMetadataProviderIdFromArtistId() { if (widget.extensionId != null && widget.extensionId!.isNotEmpty) { return widget.extensionId!; } return resolveEffectiveMetadataProvider( - _legacyProviderIdFromResourceId(widget.artistId), + legacyProviderIdFromResourceId(widget.artistId) ?? 'spotify', ref.read(extensionProvider), ); } - String _stripPrefixedResourceId(String value) { - final colonIndex = value.indexOf(':'); - if (colonIndex <= 0 || colonIndex == value.length - 1) { - return value; - } - return value.substring(colonIndex + 1); - } String? _directMetadataProviderId() { final providerId = _effectiveMetadataProviderIdFromArtistId(); @@ -200,7 +187,7 @@ class _ArtistScreenState extends ConsumerState { } String _metadataResourceId(String providerId) { - return _stripPrefixedResourceId(widget.artistId); + return stripPrefixedResourceId(widget.artistId); } @override @@ -1104,7 +1091,7 @@ class _ArtistScreenState extends ConsumerState { Future> _fetchAlbumTracks(ArtistAlbum album) async { final providerId = album.providerId; if (providerId != null && providerId.isNotEmpty) { - final resourceId = _stripPrefixedResourceId(album.id); + final resourceId = stripPrefixedResourceId(album.id); final metadata = await PlatformBridge.getProviderMetadata( providerId, 'album', diff --git a/lib/screens/playlist_screen.dart b/lib/screens/playlist_screen.dart index a1f2e2f7..d77532e5 100644 --- a/lib/screens/playlist_screen.dart +++ b/lib/screens/playlist_screen.dart @@ -10,6 +10,7 @@ import 'package:spotiflac_android/providers/library_collections_provider.dart'; import 'package:spotiflac_android/utils/image_cache_utils.dart'; import 'package:spotiflac_android/utils/string_utils.dart'; import 'package:spotiflac_android/utils/nav_bar_inset.dart'; +import 'package:spotiflac_android/utils/provider_resource_ids.dart'; import 'package:spotiflac_android/providers/settings_provider.dart'; import 'package:spotiflac_android/providers/local_library_provider.dart'; import 'package:spotiflac_android/widgets/download_service_picker.dart'; @@ -57,23 +58,10 @@ class _PlaylistScreenState extends ConsumerState { String? get _headerVideoUrl => _resolvedHeaderVideoUrl ?? widget.headerVideoUrl; - String? _legacyProviderIdFromResourceId(String value) { - if (value.startsWith('deezer:')) return 'deezer'; - if (value.startsWith('qobuz:')) return 'qobuz'; - if (value.startsWith('tidal:')) return 'tidal'; - return null; - } - String _stripPrefixedResourceId(String value) { - final colonIndex = value.indexOf(':'); - if (colonIndex <= 0 || colonIndex == value.length - 1) { - return value; - } - return value.substring(colonIndex + 1); - } String? _metadataProviderId(String playlistId) { - final providerId = _legacyProviderIdFromResourceId(playlistId); + final providerId = legacyProviderIdFromResourceId(playlistId); if (providerId == null) return null; final effective = resolveEffectiveMetadataProvider( providerId, @@ -83,7 +71,7 @@ class _PlaylistScreenState extends ConsumerState { } String _metadataResourceId(String providerId, String playlistId) { - return _stripPrefixedResourceId(playlistId); + return stripPrefixedResourceId(playlistId); } String? _recommendedDownloadService() { @@ -109,7 +97,7 @@ class _PlaylistScreenState extends ConsumerState { } final trackId = _tracks.firstOrNull?.id ?? ''; - final trackProviderId = _legacyProviderIdFromResourceId(trackId); + final trackProviderId = legacyProviderIdFromResourceId(trackId); if (trackProviderId != null) { return resolveEffectiveDownloadService( trackProviderId, diff --git a/lib/utils/provider_resource_ids.dart b/lib/utils/provider_resource_ids.dart new file mode 100644 index 00000000..546d6b87 --- /dev/null +++ b/lib/utils/provider_resource_ids.dart @@ -0,0 +1,18 @@ +/// Maps a legacy prefixed resource id (e.g. "deezer:123") to its provider id, +/// or null when the value carries no known provider prefix. +String? legacyProviderIdFromResourceId(String value) { + if (value.startsWith('deezer:')) return 'deezer'; + if (value.startsWith('qobuz:')) return 'qobuz'; + if (value.startsWith('tidal:')) return 'tidal'; + if (value.startsWith('spotify:')) return 'spotify'; + return null; +} + +/// Strips a leading "provider:" prefix from a resource id, if present. +String stripPrefixedResourceId(String value) { + final colonIndex = value.indexOf(':'); + if (colonIndex <= 0 || colonIndex == value.length - 1) { + return value; + } + return value.substring(colonIndex + 1); +}