From eb17cc6d2281e4cd37c6c3f3bad52dff24505d6b Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Sun, 26 Apr 2026 11:51:33 -0600 Subject: [PATCH] refactor(v2): migrate get_releases_grid to v2 Path C: legacy command called client.get_releases_grid for the artist detail view's release-type pagination grid. No existing v2 equivalent, so add v2_get_releases_grid via QbzCore -> QobuzClient::get_releases_grid directly. cc --- crates/qbz-core/src/core.rs | 22 +++++++++++++++-- src-tauri/src/commands_v2/catalog.rs | 35 +++++++++++++++++++++++++++- src-tauri/src/core_bridge.rs | 19 +++++++++++++-- src-tauri/src/lib.rs | 1 + src/routes/+page.svelte | 4 ++-- 5 files changed, 74 insertions(+), 7 deletions(-) diff --git a/crates/qbz-core/src/core.rs b/crates/qbz-core/src/core.rs index 49c674634..71ac82fb7 100644 --- a/crates/qbz-core/src/core.rs +++ b/crates/qbz-core/src/core.rs @@ -10,8 +10,8 @@ use qbz_models::{ Album, Artist, ArtistAlbums, CoreEvent, DiscoverAlbum, DiscoverData, DiscoverPlaylistsResponse, DiscoverResponse, FrontendAdapter, GenreInfo, LabelExploreResponse, LabelGetListResponse, LabelListPage, LabelPageData, LabelStoryResponse, PageArtistResponse, - Playlist, PlaylistTag, Quality, QueueState, QueueTrack, RepeatMode, SearchResultsPage, - StreamUrl, Track, TracksContainer, UserSession, + Playlist, PlaylistTag, Quality, QueueState, QueueTrack, ReleasesGridResponse, RepeatMode, + SearchResultsPage, StreamUrl, Track, TracksContainer, UserSession, }; use qbz_player::{PlaybackState, Player, QueueManager}; use qbz_qobuz::QobuzClient; @@ -902,6 +902,24 @@ impl QbzCore { .map_err(CoreError::Api) } + /// Get an artist's releases grid (paginated by `release_type`). + pub async fn get_releases_grid( + &self, + artist_id: u64, + release_type: &str, + limit: u32, + offset: u32, + sort: Option<&str>, + ) -> Result { + let client = self.client.read().await; + let client = client.as_ref().ok_or(CoreError::NotInitialized)?; + + client + .get_releases_grid(artist_id, release_type, limit, offset, sort) + .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 c3ef50a7c..eda2e4086 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, TracksContainer, + Playlist, PlaylistTag, ReleasesGridResponse, SearchResultsPage, Track, TracksContainer, }; use crate::artist_blacklist::BlacklistState; @@ -487,6 +487,39 @@ pub async fn v2_get_artist_tracks( .map_err(RuntimeError::Internal) } +/// Get an artist's releases grid paginated by release_type (V2 - uses QbzCore). +#[tauri::command] +#[allow(non_snake_case)] +pub async fn v2_get_releases_grid( + artistId: u64, + releaseType: String, + limit: Option, + offset: Option, + sort: Option, + bridge: State<'_, CoreBridgeState>, + runtime: State<'_, RuntimeManagerState>, +) -> Result { + runtime + .manager() + .check_requirements(CommandRequirement::RequiresCoreBridgeAuth) + .await?; + + let limit = limit.unwrap_or(25); + let offset = offset.unwrap_or(0); + log::info!( + "[V2] get_releases_grid: {} type={} limit={} offset={}", + artistId, + releaseType, + limit, + offset + ); + let bridge = bridge.get().await; + bridge + .get_releases_grid(artistId, &releaseType, limit, offset, sort.as_deref()) + .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 3715ceec5..c9a5ce637 100644 --- a/src-tauri/src/core_bridge.rs +++ b/src-tauri/src/core_bridge.rs @@ -16,8 +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, TracksContainer, - UserSession, + QueueState, QueueTrack, ReleasesGridResponse, RepeatMode, SearchResultsPage, StreamUrl, Track, + TracksContainer, UserSession, }; use qbz_player::{PlaybackState, Player}; @@ -595,6 +595,21 @@ impl CoreBridge { .map_err(|e| e.to_string()) } + /// Get an artist's releases grid (paginated by `release_type`). + pub async fn get_releases_grid( + &self, + artist_id: u64, + release_type: &str, + limit: u32, + offset: u32, + sort: Option<&str>, + ) -> Result { + self.core + .get_releases_grid(artist_id, release_type, limit, offset, sort) + .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 8cdb2ae53..fea0e4565 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1706,6 +1706,7 @@ pub fn run() { commands_v2::v2_get_artist_albums, commands_v2::v2_get_artist_detail, commands_v2::v2_get_artist_tracks, + commands_v2::v2_get_releases_grid, commands_v2::v2_get_label_page, commands_v2::v2_get_label_explore, commands_v2::v2_get_label_albums, diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 144e2bc37..5b2835d88 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1857,7 +1857,7 @@ g => g.type === 'ep' || g.type === 'single' || g.type === 'epSingle' ); if (!hasEpGroup && selectedArtist.epsSingles.length === 0) { - invoke('get_releases_grid', { + invoke('v2_get_releases_grid', { artistId, releaseType: 'epSingle', limit: 25, offset: 0 }).then(result => { if (result.items.length > 0 && selectedArtist?.id === artistId) { @@ -2128,7 +2128,7 @@ isArtistAlbumsLoading = true; try { - const result = await invoke('get_releases_grid', { + const result = await invoke('v2_get_releases_grid', { artistId: selectedArtist.id, releaseType: apiReleaseType, limit: 25,