New crate for Last.fm, ListenBrainz, and MusicBrainz integrations. Designed to work WITHOUT Tauri for TUI/headless clients. Modules: - lastfm: Scrobbling and now-playing via Cloudflare Workers proxy - listenbrainz: Direct API client with user token auth - musicbrainz: Entity resolution with rate limiting Features: - `cache` (default): SQLite persistence for offline support - ListenBrainz: Credential storage, offline listen queue - MusicBrainz: Resolved entity cache with TTL Architecture: - Pure async Rust, no Tauri dependencies - Shared error types via IntegrationError enum - Rate limiting for MusicBrainz (1 req/sec direct, faster via proxy)
37 lines
799 B
TOML
37 lines
799 B
TOML
[package]
|
|
name = "qbz-integrations"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
description = "Third-party service integrations for QBZ (Last.fm, ListenBrainz, MusicBrainz)"
|
|
license = "MIT"
|
|
|
|
[dependencies]
|
|
# Async runtime
|
|
tokio = { version = "1", features = ["sync", "time"] }
|
|
|
|
# HTTP client
|
|
reqwest = { version = "0.12", features = ["json"] }
|
|
|
|
# Serialization
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
|
|
# Logging
|
|
log = "0.4"
|
|
|
|
# Error handling
|
|
thiserror = "1"
|
|
|
|
# URL encoding for API queries
|
|
urlencoding = "2"
|
|
|
|
# SQLite for caching (optional, enabled by default)
|
|
rusqlite = { version = "0.31", features = ["bundled"], optional = true }
|
|
|
|
# Time handling for cache TTL
|
|
chrono = { version = "0.4", optional = true }
|
|
|
|
[features]
|
|
default = ["cache"]
|
|
cache = ["dep:rusqlite", "dep:chrono"]
|