11use std:: env;
22
33use librespot:: core:: { authentication:: Credentials , config:: SessionConfig , session:: Session } ;
4+ use librespot:: protocol:: authentication:: AuthenticationType ;
45
56const SCOPES : & str =
67 "streaming,user-read-playback-state,user-modify-playback-state,user-read-currently-playing" ;
@@ -10,36 +11,43 @@ async fn main() {
1011 let mut session_config = SessionConfig :: default ( ) ;
1112
1213 let args: Vec < _ > = env:: args ( ) . collect ( ) ;
13- if args. len ( ) == 4 {
14- session_config. client_id = args[ 3 ] . clone ( )
15- } else if args. len ( ) != 3 {
16- eprintln ! ( "Usage: {} USERNAME PASSWORD [CLIENT_ID]" , args[ 0 ] ) ;
14+ if args. len ( ) == 3 {
15+ session_config. client_id = args[ 2 ] . clone ( )
16+ } else if args. len ( ) != 2 {
17+ eprintln ! ( "Usage: {} ACCESS_TOKEN [CLIENT_ID]" , args[ 0 ] ) ;
1718 return ;
1819 }
19- let username = & args[ 1 ] ;
20- let password = & args[ 2 ] ;
20+ let access_token = & args[ 1 ] ;
2121
22+ // Now create a new session with that token.
2223 let session = Session :: new ( session_config. clone ( ) , None ) ;
23- let credentials = Credentials :: with_password ( username, password) ;
24- println ! ( "Connecting with password.." ) ;
25- let token = match session. connect ( credentials, false ) . await {
26- Ok ( ( ) ) => {
27- println ! ( "Session username: {:#?}" , session. username( ) ) ;
28- session. token_provider ( ) . get_token ( SCOPES ) . await . unwrap ( )
24+ let credentials = Credentials :: with_access_token ( access_token) ;
25+ println ! ( "Connecting with token.." ) ;
26+ match session. connect ( credentials, false ) . await {
27+ Ok ( ( ) ) => println ! ( "Session username: {:#?}" , session. username( ) ) ,
28+ Err ( e) => {
29+ println ! ( "Error connecting: {e}" ) ;
30+ return ;
2931 }
32+ } ;
33+
34+ // This will fail. You can't use keymaster from an access token authed session.
35+ // let token = session2.token_provider().get_token(SCOPES).await.unwrap();
36+
37+ // Instead, derive stored credentials and auth a new session using those.
38+ let stored_credentials = Credentials {
39+ username : Some ( session. username ( ) ) ,
40+ auth_type : AuthenticationType :: AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS ,
41+ auth_data : session. auth_data ( ) ,
42+ } ;
43+ let session2 = Session :: new ( session_config, None ) ;
44+ match session2. connect ( stored_credentials, false ) . await {
45+ Ok ( ( ) ) => println ! ( "Session username: {:#?}" , session2. username( ) ) ,
3046 Err ( e) => {
3147 println ! ( "Error connecting: {}" , e) ;
3248 return ;
3349 }
3450 } ;
35- println ! ( "Token: {:#?}" , token) ;
36-
37- // Now create a new session with that token.
38- let session = Session :: new ( session_config, None ) ;
39- let credentials = Credentials :: with_access_token ( token. access_token ) ;
40- println ! ( "Connecting with token.." ) ;
41- match session. connect ( credentials, false ) . await {
42- Ok ( ( ) ) => println ! ( "Session username: {:#?}" , session. username( ) ) ,
43- Err ( e) => println ! ( "Error connecting: {}" , e) ,
44- }
51+ let token = session2. token_provider ( ) . get_token ( SCOPES ) . await . unwrap ( ) ;
52+ println ! ( "Got me a token: {token:#?}" ) ;
4553}
0 commit comments