From 88f208a7d07ee3f1bd6035fe0606d80d6faaa53a Mon Sep 17 00:00:00 2001 From: Seungmin Kim <8457324+ehfd@users.noreply.github.com> Date: Thu, 27 Mar 2025 03:10:01 -0700 Subject: [PATCH] Do not probe Song.Link when ISRC results are valid, fix rate limit --- lib/extensions/track.dart | 49 ++++++++++--------- lib/modules/album/album_card.dart | 3 +- lib/provider/spotify/album/tracks.dart | 2 +- .../sourced_track/sources/youtube.dart | 5 +- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/lib/extensions/track.dart b/lib/extensions/track.dart index f333f859..92d8b0da 100644 --- a/lib/extensions/track.dart +++ b/lib/extensions/track.dart @@ -69,34 +69,39 @@ extension TrackExtensions on Track { } } -extension TrackSimpleExtensions on TrackSimple { - Future asTrack(AlbumSimple album, ref) async { +extension IterableTrackSimpleExtensions on Iterable { + Future> asTracks(AlbumSimple album, ref) async { try { final spotify = ref.read(spotifyProvider); - return await spotify.invoke((api) => api.tracks.get(id!)); + final tracks = await spotify.invoke( + (api) => api.tracks.list(map((trackSimple) => trackSimple.id!).toList())); + return tracks.toList(); } catch (e, stack) { // Ignore errors and create the track locally AppLogger.reportError(e, stack); - Track track = Track(); - track.name = name; - track.album = album; - track.artists = artists; - track.availableMarkets = availableMarkets; - track.discNumber = discNumber; - track.durationMs = durationMs; - track.explicit = explicit; - track.externalUrls = externalUrls; - track.href = href; - track.id = id; - track.isPlayable = isPlayable; - track.linkedFrom = linkedFrom; - track.name = name; - track.previewUrl = previewUrl; - track.trackNumber = trackNumber; - track.type = type; - track.uri = uri; - return track; + List tracks = []; + for (final trackSimple in this) { + Track track = Track(); + track.album = album; + track.name = trackSimple.name; + track.artists = trackSimple.artists; + track.availableMarkets = trackSimple.availableMarkets; + track.discNumber = trackSimple.discNumber; + track.durationMs = trackSimple.durationMs; + track.explicit = trackSimple.explicit; + track.externalUrls = trackSimple.externalUrls; + track.href = trackSimple.href; + track.id = trackSimple.id; + track.isPlayable = trackSimple.isPlayable; + track.linkedFrom = trackSimple.linkedFrom; + track.previewUrl = trackSimple.previewUrl; + track.trackNumber = trackSimple.trackNumber; + track.type = trackSimple.type; + track.uri = trackSimple.uri; + tracks.add(track); + } + return tracks; } } } diff --git a/lib/modules/album/album_card.dart b/lib/modules/album/album_card.dart index 43e94242..5fee9cc4 100644 --- a/lib/modules/album/album_card.dart +++ b/lib/modules/album/album_card.dart @@ -54,8 +54,7 @@ class AlbumCard extends HookConsumerWidget { Future> fetchAllTrack() async { if (album.tracks != null && album.tracks!.isNotEmpty) { - return await Future.wait( - album.tracks!.map((track) => track.asTrack(album, ref))); + return album.tracks!.asTracks(album, ref); } await ref.read(albumTracksProvider(album).future); return ref.read(albumTracksProvider(album).notifier).fetchAll(); diff --git a/lib/provider/spotify/album/tracks.dart b/lib/provider/spotify/album/tracks.dart index c69dc0e9..13c48886 100644 --- a/lib/provider/spotify/album/tracks.dart +++ b/lib/provider/spotify/album/tracks.dart @@ -33,7 +33,7 @@ class AlbumTracksNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier api.albums.tracks(arg.id!).getPage(limit, offset), ); - final List items = await Future.wait(tracks.items?.map((e) => e.asTrack(arg, ref)) ?? []); + final items = await tracks.items!.asTracks(arg, ref); return ( items: items, diff --git a/lib/services/sourced_track/sources/youtube.dart b/lib/services/sourced_track/sources/youtube.dart index 13ead3ef..2dc0c815 100644 --- a/lib/services/sourced_track/sources/youtube.dart +++ b/lib/services/sourced_track/sources/youtube.dart @@ -284,12 +284,13 @@ class YoutubeSourcedTrack extends SourcedTrack { }) async { final videoResults = []; - videoResults.addAll(await fetchFromIsrc(track: track, provider: youtubeEngineProvider, ref: ref)); + final isrcResults = await fetchFromIsrc(track: track, provider: youtubeEngineProvider, ref: ref); + videoResults.addAll(isrcResults); final links = await SongLinkService.links(track.id!); final ytLink = links.firstWhereOrNull((link) => link.platform == "youtube"); - if (ytLink?.url != null) { + if (isrcResults.isEmpty && ytLink?.url != null) { try { videoResults.add( YoutubeVideoInfo.fromVideo(