update examples

Re-add default impl to SessionConfig and make Credentials::with_password generic over Into<String>

add docs for Credential

reintroduce old Default impl for SessionConfig

use the third argument for the track-to-play rather than a testing id
This commit is contained in:
ThouCheese 2021-03-06 01:29:08 +01:00
parent 963d50e725
commit ec1ec59b8a
7 changed files with 67 additions and 48 deletions

12
Cargo.lock generated
View file

@ -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"

View file

@ -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"

View file

@ -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(),
} }
} }

View file

@ -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,

View file

@ -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()
); );
} }

View file

@ -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");
} }

View file

@ -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);
} }
} }