4dbb3190ff
Three issues, all related to the player surface: 1. Player UI didn't update on track change. audio_handler's _onCurrentIndexChanged only kicked off the cover load — it never pushed the new MediaItem onto the mediaItem stream. Title/artist/ cover stayed pinned to whatever setQueueFromTracks(initialIndex:) set on first play. Now the listener pushes queue[idx] when the index changes. 2. Player kebab "Go to artist" 404'd while the same item from MostPlayed worked. Same TrackActionsSheet for both, but the player's _trackRefFromMediaItem was hardcoding artistId: '' because audio_handler's _toMediaItem never stashed it in extras. Stash artist_id alongside album_id; player_bar + now_playing_screen read it back. Both kebabs now navigate. 3. "Start radio" didn't exist on Flutter even though the server has /api/radio?seed_track=<id>. New RadioApi (lib/api/endpoints/ radio.dart) wraps the endpoint; PlayerActions.startRadio(trackId) fetches + plays the result via the existing playTracks path. New menu item between "Add to playlist" and the divider above "Go to album", calls startRadio with a snackbar error fallback.
28 lines
882 B
Dart
28 lines
882 B
Dart
import 'package:dio/dio.dart';
|
|
|
|
import '../../models/track.dart';
|
|
|
|
/// GET /api/radio?seed_track=<uuid>&limit=<int>. Returns the seed at
|
|
/// index 0 followed by up to `limit-1` weighted-shuffle picks scored
|
|
/// by the server's recommendation engine. The shape matches what
|
|
/// `playerActions.playTracks` expects, so a radio start is just one
|
|
/// fetch + one playTracks call.
|
|
class RadioApi {
|
|
RadioApi(this._dio);
|
|
final Dio _dio;
|
|
|
|
Future<List<TrackRef>> seedTrack(String trackId, {int? limit}) async {
|
|
final r = await _dio.get<Map<String, dynamic>>(
|
|
'/api/radio',
|
|
queryParameters: {
|
|
'seed_track': trackId,
|
|
if (limit != null) 'limit': limit,
|
|
},
|
|
);
|
|
final raw = (r.data?['tracks'] as List?) ?? const [];
|
|
return raw
|
|
.map((e) => TrackRef.fromJson((e as Map).cast<String, dynamic>()))
|
|
.toList(growable: false);
|
|
}
|
|
}
|