A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 60 lines 1.6 kB view raw
1use std::thread::{self, sleep}; 2 3use anyhow::Error; 4use serde::Deserialize; 5use warp::Filter; 6 7#[derive(Deserialize)] 8struct Token { 9 token: String, 10} 11 12pub async fn login(handle: &str) -> Result<(), Error> { 13 let client = reqwest::Client::new(); 14 let res = client 15 .post("https://api.rocksky.app/login") 16 .json(&serde_json::json!({ 17 "handle": handle, 18 "cli": true 19 })) 20 .send() 21 .await?; 22 23 let redirect = res.text().await?; 24 25 if !redirect.contains("authorize") { 26 return Err(anyhow::anyhow!("Failed to login, try again")); 27 } 28 29 println!("Open this link in your browser to login: \n{}", redirect); 30 open::that(redirect)?; 31 32 let cors = warp::cors() 33 .allow_any_origin() 34 .allow_methods(vec!["POST"]) 35 .allow_headers(vec!["content-type"]); 36 37 let routes = warp::post() 38 .and(warp::path("token")) 39 .and(warp::body::json()) 40 .and_then(|data: Token| async move { 41 let mut home = dirs::home_dir().unwrap(); 42 home.push(".config/rockbox.org/token"); 43 std::fs::write(home, data.token).unwrap(); 44 45 thread::spawn(move || { 46 sleep(std::time::Duration::from_secs(2)); 47 println!("Login successful!"); 48 std::process::exit(0); 49 }); 50 51 Ok::<_, warp::Rejection>(warp::reply::json(&serde_json::json!({ 52 "ok": 1 53 }))) 54 }) 55 .with(cors); 56 57 warp::serve(routes).run(([127, 0, 0, 1], 6996)).await; 58 59 Ok(()) 60}