From 7d89ae77ef6478f39a7c29f902fe97930a3a284f Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Sun, 26 Apr 2026 11:48:29 -0600 Subject: [PATCH] refactor(v2): migrate get_artist_tracks to v2 Path C: legacy command called client.get_artist_tracks (the /artist/get?extra=tracks path) and returned a TracksContainer. No existing v2 equivalent, so add v2_get_artist_tracks via QbzCore -> QobuzClient::get_artist_tracks directly. cc --- crates/qbz-core/src/core.rs | 18 ++++++++++- src-tauri/src/commands_v2/catalog.rs | 32 ++++++++++++++++++- src-tauri/src/core_bridge.rs | 16 +++++++++- src-tauri/src/lib.rs | 1 + .../immersive/panels/SuggestionsPanel.svelte | 2 +- 5 files changed, 65 insertions(+), 4 deletions(-) diff --git a/crates/qbz-core/src/core.rs b/crates/qbz-core/src/core.rs index 7e692f674..49c674634 100644 --- a/crates/qbz-core/src/core.rs +++ b/crates/qbz-core/src/core.rs @@ -11,7 +11,7 @@ use qbz_models::{ DiscoverResponse, FrontendAdapter, GenreInfo, LabelExploreResponse, LabelGetListResponse, LabelListPage, LabelPageData, LabelStoryResponse, PageArtistResponse, Playlist, PlaylistTag, Quality, QueueState, QueueTrack, RepeatMode, SearchResultsPage, - StreamUrl, Track, UserSession, + StreamUrl, Track, TracksContainer, UserSession, }; use qbz_player::{PlaybackState, Player, QueueManager}; use qbz_qobuz::QobuzClient; @@ -886,6 +886,22 @@ impl QbzCore { .map_err(CoreError::Api) } + /// Get an artist's popular/top tracks (`/artist/get?extra=tracks`). + pub async fn get_artist_tracks( + &self, + artist_id: u64, + limit: u32, + offset: u32, + ) -> Result { + let client = self.client.read().await; + let client = client.as_ref().ok_or(CoreError::NotInitialized)?; + + client + .get_artist_tracks(artist_id, limit, offset) + .await + .map_err(CoreError::Api) + } + /// Get label page (aggregated: top tracks, releases, playlists, artists) pub async fn get_label_page(&self, label_id: u64) -> Result { let client = self.client.read().await; diff --git a/src-tauri/src/commands_v2/catalog.rs b/src-tauri/src/commands_v2/catalog.rs index f33375879..c3ef50a7c 100644 --- a/src-tauri/src/commands_v2/catalog.rs +++ b/src-tauri/src/commands_v2/catalog.rs @@ -4,7 +4,7 @@ use qbz_models::{ Album, Artist, ArtistAlbums, AwardPageData, DiscoverAlbum, DiscoverData, DiscoverPlaylistsResponse, DiscoverResponse, GenreInfo, LabelExploreResponse, LabelGetListResponse, LabelListPage, LabelPageData, LabelStoryResponse, PageArtistResponse, - Playlist, PlaylistTag, SearchResultsPage, Track, + Playlist, PlaylistTag, SearchResultsPage, Track, TracksContainer, }; use crate::artist_blacklist::BlacklistState; @@ -457,6 +457,36 @@ pub async fn v2_get_artist_detail( .map_err(RuntimeError::Internal) } +/// Get an artist's popular/top tracks (V2 - uses QbzCore). +#[tauri::command] +#[allow(non_snake_case)] +pub async fn v2_get_artist_tracks( + artistId: u64, + limit: Option, + offset: Option, + bridge: State<'_, CoreBridgeState>, + runtime: State<'_, RuntimeManagerState>, +) -> Result { + runtime + .manager() + .check_requirements(CommandRequirement::RequiresCoreBridgeAuth) + .await?; + + let limit = limit.unwrap_or(50); + let offset = offset.unwrap_or(0); + log::info!( + "[V2] get_artist_tracks: {} limit={} offset={}", + artistId, + limit, + offset + ); + let bridge = bridge.get().await; + bridge + .get_artist_tracks(artistId, limit, offset) + .await + .map_err(RuntimeError::Internal) +} + /// Get label page (aggregated: top tracks, releases, playlists, artists) #[tauri::command] #[allow(non_snake_case)] diff --git a/src-tauri/src/core_bridge.rs b/src-tauri/src/core_bridge.rs index 66158957b..3715ceec5 100644 --- a/src-tauri/src/core_bridge.rs +++ b/src-tauri/src/core_bridge.rs @@ -16,7 +16,8 @@ use qbz_models::{ Album, Artist, ArtistAlbums, DiscoverAlbum, DiscoverData, DiscoverPlaylistsResponse, DiscoverResponse, GenreInfo, LabelExploreResponse, LabelGetListResponse, LabelListPage, LabelPageData, LabelStoryResponse, PageArtistResponse, Playlist, PlaylistTag, Quality, - QueueState, QueueTrack, RepeatMode, SearchResultsPage, StreamUrl, Track, UserSession, + QueueState, QueueTrack, RepeatMode, SearchResultsPage, StreamUrl, Track, TracksContainer, + UserSession, }; use qbz_player::{PlaybackState, Player}; @@ -581,6 +582,19 @@ impl CoreBridge { .map_err(|e| e.to_string()) } + /// Get an artist's popular/top tracks. + pub async fn get_artist_tracks( + &self, + artist_id: u64, + limit: u32, + offset: u32, + ) -> Result { + self.core + .get_artist_tracks(artist_id, limit, offset) + .await + .map_err(|e| e.to_string()) + } + /// Get label page (aggregated: top tracks, releases, playlists, artists) pub async fn get_label_page(&self, label_id: u64) -> Result { self.core diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index f2adc5f5b..8cdb2ae53 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1705,6 +1705,7 @@ pub fn run() { commands_v2::v2_get_artist_with_albums, commands_v2::v2_get_artist_albums, commands_v2::v2_get_artist_detail, + commands_v2::v2_get_artist_tracks, commands_v2::v2_get_label_page, commands_v2::v2_get_label_explore, commands_v2::v2_get_label_albums, diff --git a/src/lib/components/immersive/panels/SuggestionsPanel.svelte b/src/lib/components/immersive/panels/SuggestionsPanel.svelte index 82c472052..89ffd8657 100644 --- a/src/lib/components/immersive/panels/SuggestionsPanel.svelte +++ b/src/lib/components/immersive/panels/SuggestionsPanel.svelte @@ -133,7 +133,7 @@ if (tracks.length < 5) { console.log(`[Suggestions] Sparse tracks_appears_on (${tracks.length}), fetching artist tracks...`); try { - const artistTracks = await invoke('get_artist_tracks', { + const artistTracks = await invoke('v2_get_artist_tracks', { artistId: id, limit: 30, offset: 0