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
This commit is contained in:
5 files changed
+65
-4
No files matched your search
@@ -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<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
|
||||
.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<TracksContainer, CoreError> {
|
||||
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<LabelPageData, CoreError> {
|
||||
let client = self.client.read().await;
|
||||
|
||||
@@ -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<u32>,
|
||||
offset: Option<u32>,
|
||||
bridge: State<'_, CoreBridgeState>,
|
||||
runtime: State<'_, RuntimeManagerState>,
|
||||
) -> Result<TracksContainer, RuntimeError> {
|
||||
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)]
|
||||
|
||||
@@ -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<TracksContainer, String> {
|
||||
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<LabelPageData, String> {
|
||||
self.core
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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<TracksContainer>('get_artist_tracks', {
|
||||
const artistTracks = await invoke<TracksContainer>('v2_get_artist_tracks', {
|
||||
artistId: id,
|
||||
limit: 30,
|
||||
offset: 0
|
||||
|
||||
Reference in new issue
Block a user