chore(qconnect): checkpoint current poc state

cx
This commit is contained in:
vicrodh committed 2026-03-13 17:28:05 -06:00
1 parent 6d20360dc3
commit de29f1e2e0
92 files changed
+3886 -2433

No files matched your search

+22 -30
View File
@@ -8,11 +8,11 @@ use tokio::sync::RwLock;
use qbz_models::{
Album, Artist, CoreEvent, DiscoverAlbum, DiscoverData, DiscoverPlaylistsResponse,
DiscoverResponse, FrontendAdapter, GenreInfo, LabelDetail, LabelExploreResponse,
LabelPageData, PageArtistResponse, Playlist,
PlaylistTag, Quality, QueueState, QueueTrack, RepeatMode, SearchResultsPage, StreamUrl, Track, UserSession,
DiscoverResponse, FrontendAdapter, GenreInfo, LabelDetail, LabelExploreResponse, LabelPageData,
PageArtistResponse, Playlist, PlaylistTag, Quality, QueueState, QueueTrack, RepeatMode,
SearchResultsPage, StreamUrl, Track, UserSession,
};
use qbz_player::{Player, PlaybackState, QueueManager};
use qbz_player::{PlaybackState, Player, QueueManager};
use qbz_qobuz::QobuzClient;
use crate::error::CoreError;
@@ -63,9 +63,10 @@ impl<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
let client = QobuzClient::new().map_err(|e| CoreError::Internal(e.to_string()))?;
// Extract bundle tokens (required before any API calls)
client.init().await.map_err(|e| {
CoreError::Internal(format!("Failed to extract bundle tokens: {}", e))
})?;
client
.init()
.await
.map_err(|e| CoreError::Internal(format!("Failed to extract bundle tokens: {}", e)))?;
*self.client.write().await = Some(client);
@@ -115,10 +116,7 @@ impl<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
let client = self.client.read().await;
let client = client.as_ref().ok_or(CoreError::NotInitialized)?;
client.set_session(session.clone()).await;
self.emit(CoreEvent::LoggedIn {
session,
})
.await;
self.emit(CoreEvent::LoggedIn { session }).await;
Ok(())
}
@@ -398,23 +396,17 @@ impl<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
/// Pause playback
pub fn pause(&self) -> Result<(), CoreError> {
self.player
.pause()
.map_err(|e| CoreError::Playback(e))
self.player.pause().map_err(|e| CoreError::Playback(e))
}
/// Resume playback
pub fn resume(&self) -> Result<(), CoreError> {
self.player
.resume()
.map_err(|e| CoreError::Playback(e))
self.player.resume().map_err(|e| CoreError::Playback(e))
}
/// Stop playback
pub fn stop(&self) -> Result<(), CoreError> {
self.player
.stop()
.map_err(|e| CoreError::Playback(e))
self.player.stop().map_err(|e| CoreError::Playback(e))
}
/// Seek to position in seconds
@@ -503,7 +495,10 @@ impl<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
let client = self.client.read().await;
let client = client.as_ref().ok_or(CoreError::NotInitialized)?;
client.get_playlist(playlist_id).await.map_err(CoreError::Api)
client
.get_playlist(playlist_id)
.await
.map_err(CoreError::Api)
}
/// Add tracks to playlist
@@ -612,14 +607,14 @@ impl<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
let client = self.client.read().await;
let client = client.as_ref().ok_or(CoreError::NotInitialized)?;
client
.get_genres(parent_id)
.await
.map_err(CoreError::Api)
client.get_genres(parent_id).await.map_err(CoreError::Api)
}
/// Get discover index
pub async fn get_discover_index(&self, genre_ids: Option<Vec<u64>>) -> Result<DiscoverResponse, CoreError> {
pub async fn get_discover_index(
&self,
genre_ids: Option<Vec<u64>>,
) -> Result<DiscoverResponse, CoreError> {
let client = self.client.read().await;
let client = client.as_ref().ok_or(CoreError::NotInitialized)?;
@@ -651,10 +646,7 @@ impl<A: FrontendAdapter + Send + Sync + 'static> QbzCore<A> {
let client = self.client.read().await;
let client = client.as_ref().ok_or(CoreError::NotInitialized)?;
client
.get_playlist_tags()
.await
.map_err(CoreError::Api)
client.get_playlist_tags().await.map_err(CoreError::Api)
}
/// Get discover albums from a specific browse endpoint
+1 -1
View File
@@ -56,7 +56,7 @@ pub mod core;
pub mod error;
// Re-exports from qbz-models for convenience
pub use qbz_models::{CoreEvent, FrontendAdapter, NoOpAdapter, LoggingAdapter};
pub use qbz_models::{CoreEvent, FrontendAdapter, LoggingAdapter, NoOpAdapter};
// Re-exports from this crate
pub use core::QbzCore;