mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-03 01:39:28 +02:00

* connect: simplify `handle_command` for SpircCommand * connect: simplify `handle_player_event` * connect: `handle_player_event` update log entries * connect: set `playback_speed` according to player state * connect: reduce/group state updates by delaying them slightly * connect: load entire context at once * connect: use is_playing from connect_state * connect: move `ResolveContext` in own file * connect: handle metadata correct * connect: resolve context rework - resolved contexts independently, by that we don't block our main loop - move resolve logic into own file - polish handling for play and transfer * connect: rework aftermath * general logging and comment fixups * connect: fix incorrect stopping * connect: always handle player seek event * connect: adjust behavior - rename `handle_context` to `handle_next_context` - disconnect should only pause the playback - find_next should not exceed queue length * fix typo and `find_next` * connect: fixes for context and transfer - fix context_metadata and restriction incorrect reset - do some state updates earlier - add more logging * revert removal of state setup * `clear_next_tracks` should never clear queued items just mimics official client behavior * connect: make `playing_track` optional and handle it correctly * connect: adjust finish of context resolving * connect: set track position when shuffling * example: adjust to model change * connect: remove duplicate track * connect: provide all recently played tracks to autoplay request - removes previously added workaround * connect: apply review suggestions - use drain instead of for with pop - use for instead of loop - use or_else instead of match - use Self::Error instead of the value - free memory for metadata and restrictions * connect: impl trait for player context * connect: fix incorrect playing and paused * connect: apply options as official clients * protocol: move trait impls into impl_trait mod
91 lines
2.6 KiB
Rust
91 lines
2.6 KiB
Rust
use librespot::{
|
|
core::{
|
|
authentication::Credentials, config::SessionConfig, session::Session, spotify_id::SpotifyId,
|
|
},
|
|
playback::{
|
|
audio_backend,
|
|
config::{AudioFormat, PlayerConfig},
|
|
mixer::NoOpVolume,
|
|
player::Player,
|
|
},
|
|
};
|
|
use librespot_connect::spirc::PlayingTrack;
|
|
use librespot_connect::{
|
|
spirc::{Spirc, SpircLoadCommand},
|
|
state::ConnectStateConfig,
|
|
};
|
|
use librespot_metadata::{Album, Metadata};
|
|
use librespot_playback::mixer::{softmixer::SoftMixer, Mixer, MixerConfig};
|
|
use std::env;
|
|
use std::sync::Arc;
|
|
use tokio::join;
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let session_config = SessionConfig::default();
|
|
let player_config = PlayerConfig::default();
|
|
let audio_format = AudioFormat::default();
|
|
let connect_config = ConnectStateConfig::default();
|
|
|
|
let mut args: Vec<_> = env::args().collect();
|
|
let context_uri = if args.len() == 3 {
|
|
args.pop().unwrap()
|
|
} else if args.len() == 2 {
|
|
String::from("spotify:album:79dL7FLiJFOO0EoehUHQBv")
|
|
} else {
|
|
eprintln!("Usage: {} ACCESS_TOKEN (ALBUM URI)", args[0]);
|
|
return;
|
|
};
|
|
|
|
let credentials = Credentials::with_access_token(&args[1]);
|
|
let backend = audio_backend::find(None).unwrap();
|
|
|
|
println!("Connecting...");
|
|
let session = Session::new(session_config, None);
|
|
|
|
let player = Player::new(
|
|
player_config,
|
|
session.clone(),
|
|
Box::new(NoOpVolume),
|
|
move || backend(None, audio_format),
|
|
);
|
|
|
|
let (spirc, spirc_task) = Spirc::new(
|
|
connect_config,
|
|
session.clone(),
|
|
credentials,
|
|
player,
|
|
Arc::new(SoftMixer::open(MixerConfig::default())),
|
|
)
|
|
.await
|
|
.unwrap();
|
|
|
|
join!(spirc_task, async {
|
|
let album = Album::get(&session, &SpotifyId::from_uri(&context_uri).unwrap())
|
|
.await
|
|
.unwrap();
|
|
|
|
println!(
|
|
"Playing album: {} by {}",
|
|
&album.name,
|
|
album
|
|
.artists
|
|
.first()
|
|
.map_or("unknown", |artist| &artist.name)
|
|
);
|
|
|
|
spirc.activate().unwrap();
|
|
spirc
|
|
.load(SpircLoadCommand {
|
|
context_uri,
|
|
start_playing: true,
|
|
seek_to: 0,
|
|
shuffle: false,
|
|
repeat: false,
|
|
repeat_track: false,
|
|
// the index specifies which track in the context starts playing, in this case the first in the album
|
|
playing_track: PlayingTrack::Index(0).into(),
|
|
})
|
|
.unwrap();
|
|
});
|
|
}
|