Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update examples #663

Merged
merged 1 commit into from
Mar 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ tokio = { version = "1.0", features = ["io-util", "net", "rt", "sync"] }
tokio-stream = "0.1"
tokio-util = { version = "0.6", features = ["codec"] }
url = "2.1"
uuid = { version = "0.8", default-features = false, features = ["v4"] }

[build-dependencies]
rand = "0.8"
Expand Down
18 changes: 15 additions & 3 deletions core/src/authentication.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use sha1::{Digest, Sha1};

use crate::protocol::authentication::AuthenticationType;

/// The credentials are used to log into the Spotify API.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Credentials {
pub username: String,
Expand All @@ -25,11 +26,22 @@ pub struct 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 {
username,
username: username.into(),
auth_type: AuthenticationType::AUTHENTICATION_USER_PASS,
auth_data: password.into_bytes(),
auth_data: password.into().into_bytes(),
}
}

Expand Down
12 changes: 12 additions & 0 deletions core/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ pub struct SessionConfig {
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)]
pub enum DeviceType {
Unknown = 0,
Expand Down
22 changes: 8 additions & 14 deletions examples/get_token.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use std::env;
use tokio_core::reactor::Core;

use librespot::core::authentication::Credentials;
use librespot::core::config::SessionConfig;
Expand All @@ -9,29 +8,24 @@ use librespot::core::session::Session;
const SCOPES: &str =
"streaming,user-read-playback-state,user-modify-playback-state,user-read-currently-playing";

fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();

#[tokio::main]
async fn main() {
let session_config = SessionConfig::default();

let args: Vec<_> = env::args().collect();
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..");
let credentials = Credentials::with_password(username, password);
let session = core
.run(Session::connect(session_config, credentials, None, handle))
.unwrap();
let credentials = Credentials::with_password(&args[1], &args[2]);
let session = Session::connect(session_config, credentials, None).await.unwrap();

println!(
"Token: {:#?}",
core.run(keymaster::get_token(&session, &client_id, SCOPES))
keymaster::get_token(&session, &args[3], SCOPES)
.await
.unwrap()
);
}
26 changes: 10 additions & 16 deletions examples/play.rs
Original file line number Diff line number Diff line change
@@ -1,47 +1,41 @@
use std::env;
use tokio_core::reactor::Core;

use librespot::core::authentication::Credentials;
use librespot::core::config::SessionConfig;
use librespot::core::session::Session;
use librespot::core::spotify_id::SpotifyId;
use librespot::playback::config::PlayerConfig;

use librespot::playback::audio_backend;
use librespot::playback::player::Player;

fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();

#[tokio::main]
async fn main() {
let session_config = SessionConfig::default();
let player_config = PlayerConfig::default();

let args: Vec<_> = env::args().collect();
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 password = args[2].to_owned();
let credentials = Credentials::with_password(username, password);
let credentials = Credentials::with_password(&args[1], &args[2]);

let track = SpotifyId::from_base62(&args[3]).unwrap();

let backend = audio_backend::find(None).unwrap();

println!("Connecting ..");
let session = core
.run(Session::connect(session_config, credentials, None, handle))
.unwrap();
let session = Session::connect(session_config, credentials, None).await.unwrap();

let (mut player, _) = Player::new(player_config, session.clone(), None, move || {
(backend)(None)
let (mut player, _) = Player::new(player_config, session, None, move || {
backend(None)
});

player.load(track, true, 0);

println!("Playing...");
core.run(player.get_end_of_track_future()).unwrap();

player.await_end_of_track().await;

println!("Done");
}
24 changes: 9 additions & 15 deletions examples/playlist_tracks.rs
Original file line number Diff line number Diff line change
@@ -1,42 +1,36 @@
use env_logger;
use std::env;
use tokio_core::reactor::Core;

use librespot::core::authentication::Credentials;
use librespot::core::config::SessionConfig;
use librespot::core::session::Session;
use librespot::core::spotify_id::SpotifyId;
use librespot::metadata::{Metadata, Playlist, Track};

fn main() {
#[tokio::main]
async fn main() {
env_logger::init();
let mut core = Core::new().unwrap();
let handle = core.handle();

let session_config = SessionConfig::default();

let args: Vec<_> = env::args().collect();
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 password = args[2].to_owned();
let credentials = Credentials::with_password(username, password);
let credentials = Credentials::with_password(&args[1], &args[2]);

let uri_split = args[3].split(":");
let uri_split = args[3].split(':');
let uri_parts: Vec<&str> = uri_split.collect();
println!("{}, {}, {}", uri_parts[0], uri_parts[1], uri_parts[2]);

let plist_uri = SpotifyId::from_base62(uri_parts[2]).unwrap();

let session = core
.run(Session::connect(session_config, credentials, None, handle))
.unwrap();
let session = Session::connect(session_config, credentials, None).await.unwrap();

let plist = core.run(Playlist::get(&session, plist_uri)).unwrap();
let plist = Playlist::get(&session, plist_uri).await.unwrap();
println!("{:?}", plist);
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);
}
}