Do not probe Song.Link when ISRC results are valid, fix rate limit

This commit is contained in:
Seungmin Kim 2025-03-27 03:10:01 -07:00
parent 2c5cd8d505
commit 88f208a7d0
4 changed files with 32 additions and 27 deletions

View File

@ -69,34 +69,39 @@ extension TrackExtensions on Track {
} }
} }
extension TrackSimpleExtensions on TrackSimple { extension IterableTrackSimpleExtensions on Iterable<TrackSimple> {
Future<Track> asTrack(AlbumSimple album, ref) async { Future<List<Track>> asTracks(AlbumSimple album, ref) async {
try { try {
final spotify = ref.read(spotifyProvider); 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) { } catch (e, stack) {
// Ignore errors and create the track locally // Ignore errors and create the track locally
AppLogger.reportError(e, stack); AppLogger.reportError(e, stack);
Track track = Track(); List<Track> tracks = [];
track.name = name; for (final trackSimple in this) {
track.album = album; Track track = Track();
track.artists = artists; track.album = album;
track.availableMarkets = availableMarkets; track.name = trackSimple.name;
track.discNumber = discNumber; track.artists = trackSimple.artists;
track.durationMs = durationMs; track.availableMarkets = trackSimple.availableMarkets;
track.explicit = explicit; track.discNumber = trackSimple.discNumber;
track.externalUrls = externalUrls; track.durationMs = trackSimple.durationMs;
track.href = href; track.explicit = trackSimple.explicit;
track.id = id; track.externalUrls = trackSimple.externalUrls;
track.isPlayable = isPlayable; track.href = trackSimple.href;
track.linkedFrom = linkedFrom; track.id = trackSimple.id;
track.name = name; track.isPlayable = trackSimple.isPlayable;
track.previewUrl = previewUrl; track.linkedFrom = trackSimple.linkedFrom;
track.trackNumber = trackNumber; track.previewUrl = trackSimple.previewUrl;
track.type = type; track.trackNumber = trackSimple.trackNumber;
track.uri = uri; track.type = trackSimple.type;
return track; track.uri = trackSimple.uri;
tracks.add(track);
}
return tracks;
} }
} }
} }

View File

@ -54,8 +54,7 @@ class AlbumCard extends HookConsumerWidget {
Future<List<Track>> fetchAllTrack() async { Future<List<Track>> fetchAllTrack() async {
if (album.tracks != null && album.tracks!.isNotEmpty) { if (album.tracks != null && album.tracks!.isNotEmpty) {
return await Future.wait( return album.tracks!.asTracks(album, ref);
album.tracks!.map((track) => track.asTrack(album, ref)));
} }
await ref.read(albumTracksProvider(album).future); await ref.read(albumTracksProvider(album).future);
return ref.read(albumTracksProvider(album).notifier).fetchAll(); return ref.read(albumTracksProvider(album).notifier).fetchAll();

View File

@ -33,7 +33,7 @@ class AlbumTracksNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier<Track,
final tracks = await spotify.invoke( final tracks = await spotify.invoke(
(api) => api.albums.tracks(arg.id!).getPage(limit, offset), (api) => api.albums.tracks(arg.id!).getPage(limit, offset),
); );
final List<Track> items = await Future.wait(tracks.items?.map((e) => e.asTrack(arg, ref)) ?? []); final items = await tracks.items!.asTracks(arg, ref);
return ( return (
items: items, items: items,

View File

@ -284,12 +284,13 @@ class YoutubeSourcedTrack extends SourcedTrack {
}) async { }) async {
final videoResults = <YoutubeVideoInfo>[]; final videoResults = <YoutubeVideoInfo>[];
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 links = await SongLinkService.links(track.id!);
final ytLink = links.firstWhereOrNull((link) => link.platform == "youtube"); final ytLink = links.firstWhereOrNull((link) => link.platform == "youtube");
if (ytLink?.url != null) { if (isrcResults.isEmpty && ytLink?.url != null) {
try { try {
videoResults.add( videoResults.add(
YoutubeVideoInfo.fromVideo( YoutubeVideoInfo.fromVideo(