mirror of
https://github.com/librespot-org/librespot.git
synced 2024-12-18 17:11:53 +00:00
Merge pull request #663 from ThouCheese/tokio_migration
Update examples
This commit is contained in:
commit
1051f983ed
7 changed files with 67 additions and 48 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -1,5 +1,7 @@
|
||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "addr2line"
|
name = "addr2line"
|
||||||
version = "0.14.1"
|
version = "0.14.1"
|
||||||
|
@ -1358,6 +1360,7 @@ dependencies = [
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"url",
|
"url",
|
||||||
|
"uuid",
|
||||||
"vergen",
|
"vergen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2801,6 +2804,15 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uuid"
|
||||||
|
version = "0.8.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vergen"
|
name = "vergen"
|
||||||
version = "3.2.0"
|
version = "3.2.0"
|
||||||
|
|
|
@ -40,6 +40,7 @@ tokio = { version = "1.0", features = ["io-util", "net", "rt", "sync"] }
|
||||||
tokio-stream = "0.1"
|
tokio-stream = "0.1"
|
||||||
tokio-util = { version = "0.6", features = ["codec"] }
|
tokio-util = { version = "0.6", features = ["codec"] }
|
||||||
url = "2.1"
|
url = "2.1"
|
||||||
|
uuid = { version = "0.8", default-features = false, features = ["v4"] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
|
|
|
@ -10,6 +10,7 @@ use sha1::{Digest, Sha1};
|
||||||
|
|
||||||
use crate::protocol::authentication::AuthenticationType;
|
use crate::protocol::authentication::AuthenticationType;
|
||||||
|
|
||||||
|
/// The credentials are used to log into the Spotify API.
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub struct Credentials {
|
pub struct Credentials {
|
||||||
pub username: String,
|
pub username: String,
|
||||||
|
@ -25,11 +26,22 @@ pub struct Credentials {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Credentials {
|
impl Credentials {
|
||||||
pub fn with_password(username: String, password: String) -> Credentials {
|
/// Intialize these credentials from a username and a password.
|
||||||
|
///
|
||||||
|
/// ### Example
|
||||||
|
/// ```rust
|
||||||
|
/// use librespot_core::authentication::Credentials;
|
||||||
|
///
|
||||||
|
/// let creds = Credentials::with_password("my account", "my password");
|
||||||
|
/// ```
|
||||||
|
pub fn with_password(
|
||||||
|
username: impl Into<String>,
|
||||||
|
password: impl Into<String>,
|
||||||
|
) -> Credentials {
|
||||||
Credentials {
|
Credentials {
|
||||||
username,
|
username: username.into(),
|
||||||
auth_type: AuthenticationType::AUTHENTICATION_USER_PASS,
|
auth_type: AuthenticationType::AUTHENTICATION_USER_PASS,
|
||||||
auth_data: password.into_bytes(),
|
auth_data: password.into().into_bytes(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,18 @@ pub struct SessionConfig {
|
||||||
pub ap_port: Option<u16>,
|
pub ap_port: Option<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for SessionConfig {
|
||||||
|
fn default() -> SessionConfig {
|
||||||
|
let device_id = uuid::Uuid::new_v4().to_hyphenated().to_string();
|
||||||
|
SessionConfig {
|
||||||
|
user_agent: crate::version::version_string(),
|
||||||
|
device_id,
|
||||||
|
proxy: None,
|
||||||
|
ap_port: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Hash, PartialOrd, Ord, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, Hash, PartialOrd, Ord, PartialEq, Eq)]
|
||||||
pub enum DeviceType {
|
pub enum DeviceType {
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
use std::env;
|
use std::env;
|
||||||
use tokio_core::reactor::Core;
|
|
||||||
|
|
||||||
use librespot::core::authentication::Credentials;
|
use librespot::core::authentication::Credentials;
|
||||||
use librespot::core::config::SessionConfig;
|
use librespot::core::config::SessionConfig;
|
||||||
|
@ -9,29 +8,24 @@ use librespot::core::session::Session;
|
||||||
const SCOPES: &str =
|
const SCOPES: &str =
|
||||||
"streaming,user-read-playback-state,user-modify-playback-state,user-read-currently-playing";
|
"streaming,user-read-playback-state,user-modify-playback-state,user-read-currently-playing";
|
||||||
|
|
||||||
fn main() {
|
#[tokio::main]
|
||||||
let mut core = Core::new().unwrap();
|
async fn main() {
|
||||||
let handle = core.handle();
|
|
||||||
|
|
||||||
let session_config = SessionConfig::default();
|
let session_config = SessionConfig::default();
|
||||||
|
|
||||||
let args: Vec<_> = env::args().collect();
|
let args: Vec<_> = env::args().collect();
|
||||||
if args.len() != 4 {
|
if args.len() != 4 {
|
||||||
println!("Usage: {} USERNAME PASSWORD CLIENT_ID", args[0]);
|
eprintln!("Usage: {} USERNAME PASSWORD CLIENT_ID", args[0]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
let username = args[1].to_owned();
|
|
||||||
let password = args[2].to_owned();
|
|
||||||
let client_id = &args[3];
|
|
||||||
|
|
||||||
println!("Connecting..");
|
println!("Connecting..");
|
||||||
let credentials = Credentials::with_password(username, password);
|
let credentials = Credentials::with_password(&args[1], &args[2]);
|
||||||
let session = core
|
let session = Session::connect(session_config, credentials, None).await.unwrap();
|
||||||
.run(Session::connect(session_config, credentials, None, handle))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
"Token: {:#?}",
|
"Token: {:#?}",
|
||||||
core.run(keymaster::get_token(&session, &client_id, SCOPES))
|
keymaster::get_token(&session, &args[3], SCOPES)
|
||||||
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,47 +1,41 @@
|
||||||
use std::env;
|
use std::env;
|
||||||
use tokio_core::reactor::Core;
|
|
||||||
|
|
||||||
use librespot::core::authentication::Credentials;
|
use librespot::core::authentication::Credentials;
|
||||||
use librespot::core::config::SessionConfig;
|
use librespot::core::config::SessionConfig;
|
||||||
use librespot::core::session::Session;
|
use librespot::core::session::Session;
|
||||||
use librespot::core::spotify_id::SpotifyId;
|
use librespot::core::spotify_id::SpotifyId;
|
||||||
use librespot::playback::config::PlayerConfig;
|
use librespot::playback::config::PlayerConfig;
|
||||||
|
|
||||||
use librespot::playback::audio_backend;
|
use librespot::playback::audio_backend;
|
||||||
use librespot::playback::player::Player;
|
use librespot::playback::player::Player;
|
||||||
|
|
||||||
fn main() {
|
#[tokio::main]
|
||||||
let mut core = Core::new().unwrap();
|
async fn main() {
|
||||||
let handle = core.handle();
|
|
||||||
|
|
||||||
let session_config = SessionConfig::default();
|
let session_config = SessionConfig::default();
|
||||||
let player_config = PlayerConfig::default();
|
let player_config = PlayerConfig::default();
|
||||||
|
|
||||||
let args: Vec<_> = env::args().collect();
|
let args: Vec<_> = env::args().collect();
|
||||||
if args.len() != 4 {
|
if args.len() != 4 {
|
||||||
println!("Usage: {} USERNAME PASSWORD TRACK", args[0]);
|
eprintln!("Usage: {} USERNAME PASSWORD TRACK", args[0]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
let username = args[1].to_owned();
|
let credentials = Credentials::with_password(&args[1], &args[2]);
|
||||||
let password = args[2].to_owned();
|
|
||||||
let credentials = Credentials::with_password(username, password);
|
|
||||||
|
|
||||||
let track = SpotifyId::from_base62(&args[3]).unwrap();
|
let track = SpotifyId::from_base62(&args[3]).unwrap();
|
||||||
|
|
||||||
let backend = audio_backend::find(None).unwrap();
|
let backend = audio_backend::find(None).unwrap();
|
||||||
|
|
||||||
println!("Connecting ..");
|
println!("Connecting ..");
|
||||||
let session = core
|
let session = Session::connect(session_config, credentials, None).await.unwrap();
|
||||||
.run(Session::connect(session_config, credentials, None, handle))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let (mut player, _) = Player::new(player_config, session.clone(), None, move || {
|
let (mut player, _) = Player::new(player_config, session, None, move || {
|
||||||
(backend)(None)
|
backend(None)
|
||||||
});
|
});
|
||||||
|
|
||||||
player.load(track, true, 0);
|
player.load(track, true, 0);
|
||||||
|
|
||||||
println!("Playing...");
|
println!("Playing...");
|
||||||
core.run(player.get_end_of_track_future()).unwrap();
|
|
||||||
|
player.await_end_of_track().await;
|
||||||
|
|
||||||
println!("Done");
|
println!("Done");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use env_logger;
|
use env_logger;
|
||||||
use std::env;
|
use std::env;
|
||||||
use tokio_core::reactor::Core;
|
|
||||||
|
|
||||||
use librespot::core::authentication::Credentials;
|
use librespot::core::authentication::Credentials;
|
||||||
use librespot::core::config::SessionConfig;
|
use librespot::core::config::SessionConfig;
|
||||||
|
@ -8,35 +7,30 @@ use librespot::core::session::Session;
|
||||||
use librespot::core::spotify_id::SpotifyId;
|
use librespot::core::spotify_id::SpotifyId;
|
||||||
use librespot::metadata::{Metadata, Playlist, Track};
|
use librespot::metadata::{Metadata, Playlist, Track};
|
||||||
|
|
||||||
fn main() {
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
let mut core = Core::new().unwrap();
|
|
||||||
let handle = core.handle();
|
|
||||||
|
|
||||||
let session_config = SessionConfig::default();
|
let session_config = SessionConfig::default();
|
||||||
|
|
||||||
let args: Vec<_> = env::args().collect();
|
let args: Vec<_> = env::args().collect();
|
||||||
if args.len() != 4 {
|
if args.len() != 4 {
|
||||||
println!("Usage: {} USERNAME PASSWORD PLAYLIST", args[0]);
|
eprintln!("Usage: {} USERNAME PASSWORD PLAYLIST", args[0]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
let username = args[1].to_owned();
|
let credentials = Credentials::with_password(&args[1], &args[2]);
|
||||||
let password = args[2].to_owned();
|
|
||||||
let credentials = Credentials::with_password(username, password);
|
|
||||||
|
|
||||||
let uri_split = args[3].split(":");
|
let uri_split = args[3].split(':');
|
||||||
let uri_parts: Vec<&str> = uri_split.collect();
|
let uri_parts: Vec<&str> = uri_split.collect();
|
||||||
println!("{}, {}, {}", uri_parts[0], uri_parts[1], uri_parts[2]);
|
println!("{}, {}, {}", uri_parts[0], uri_parts[1], uri_parts[2]);
|
||||||
|
|
||||||
let plist_uri = SpotifyId::from_base62(uri_parts[2]).unwrap();
|
let plist_uri = SpotifyId::from_base62(uri_parts[2]).unwrap();
|
||||||
|
|
||||||
let session = core
|
let session = Session::connect(session_config, credentials, None).await.unwrap();
|
||||||
.run(Session::connect(session_config, credentials, None, handle))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let plist = core.run(Playlist::get(&session, plist_uri)).unwrap();
|
let plist = Playlist::get(&session, plist_uri).await.unwrap();
|
||||||
println!("{:?}", plist);
|
println!("{:?}", plist);
|
||||||
for track_id in plist.tracks {
|
for track_id in plist.tracks {
|
||||||
let plist_track = core.run(Track::get(&session, track_id)).unwrap();
|
let plist_track = Track::get(&session, track_id).await.unwrap();
|
||||||
println!("track: {} ", plist_track.name);
|
println!("track: {} ", plist_track.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue