A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
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}