feat(slint): wire track context-menu actions (favorite/radio/share/playlist/nav)

Connects the previously-inert track context-menu items now that the
backends exist:

  - Add to library -> add_favorite("track").
  - Go to album / Go to artist -> resolve the track (get_track) to its
    album / performer and navigate there.
  - Create radio -> Qobuz track radio (new get_radio_track core wrapper
    over the existing qbz-qobuz endpoint + playback::play_track_radio).
  - Share Qobuz link -> https://www.qobuz.com/track/{id} to clipboard
    (new arboard dep + share module).
  - Share Song.link -> Odesli (api.song.link) pageUrl resolution to
    clipboard.
  - Add to playlist -> a global picker modal (PlaylistPickerModal +
    PlaylistPickerState/Actions + playlist_picker controller) listing
    the user's playlists; picking one calls add_tracks_to_playlist.

Add to mixtape / Make available offline / Track info stay unwired
(no backend yet).

cc
This commit is contained in:
vicrodh committed 2026-05-22 02:54:52 -06:00
1 parent 1ebec6cbc1
commit db8a6ac5b1
10 files changed
+450 -1

No files matched your search

+13
View File
@@ -1138,6 +1138,19 @@ impl<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
.map_err(CoreError::Api)
}
/// Qobuz track radio (`/radio/track`).
pub async fn get_radio_track(
&self,
track_id: &str,
) -> Result<qbz_models::RadioResponse, CoreError> {
let client = self.client.read().await;
let client = client.as_ref().ok_or(CoreError::NotInitialized)?;
client
.get_radio_track(track_id)
.await
.map_err(CoreError::Api)
}
/// Dynamic mix suggestions (`/dynamic/suggest`) seeded from
/// recently-listened track ids. Returns the suggested tracks.
pub async fn get_dynamic_suggest(