Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #52 from tsirysndr/feat/cli/install-rockboxd

cli: verify if rockboxd is available, download and install it if not …

authored by

Tsiry Sandratraina and committed by
GitHub
05aaec4b 03c8dc9b

+123 -13
+18 -3
cli/src/cmd/scan.rs
··· 1 - use std::env; 1 + use std::{env, thread}; 2 2 3 3 use anyhow::Error; 4 - use rockbox::api::rockbox::v1alpha1::{ 5 - library_service_client::LibraryServiceClient, ScanLibraryRequest, 4 + use rockbox::{ 5 + api::rockbox::v1alpha1::{library_service_client::LibraryServiceClient, ScanLibraryRequest}, 6 + install_rockboxd, wait_for_rockboxd, 6 7 }; 8 + 9 + use super::start::*; 7 10 8 11 pub async fn scan(path: Option<String>) -> Result<(), Error> { 12 + install_rockboxd()?; 13 + let handle = thread::spawn(|| match start() { 14 + Ok(_) => {} 15 + Err(e) => { 16 + eprintln!("Failed to start Rockbox server: {}", e); 17 + } 18 + }); 19 + 9 20 let host = env::var("ROCKBOX_HOST").unwrap_or_else(|_| "localhost".to_string()); 10 21 let port = env::var("ROCKBOX_PORT").unwrap_or_else(|_| "6061".to_string()); 22 + 23 + wait_for_rockboxd(port.parse()?, None)?; 24 + 11 25 let url = format!("tcp://{}:{}", host, port); 12 26 let mut client = LibraryServiceClient::connect(url).await?; 13 27 let request = tonic::Request::new(ScanLibraryRequest { path }); 14 28 client.scan_library(request).await?; 15 29 println!("Scan request sent to Rockbox server"); 30 + handle.join().unwrap(); 16 31 Ok(()) 17 32 }
+18 -5
cli/src/cmd/start.rs
··· 1 - use std::process::Command; 1 + use std::{env, process::Command}; 2 2 3 3 use anyhow::Error; 4 + use rockbox::{install_rockboxd, wait_for_rockboxd}; 4 5 5 6 pub fn start() -> Result<(), Error> { 7 + install_rockboxd()?; 6 8 let video_driver = std::env::var("SDL_VIDEODRIVER").unwrap_or_else(|_| "dummy".to_string()); 7 9 8 - let mut child = Command::new("rockboxd") 9 - .env("SDL_VIDEODRIVER", video_driver) 10 - .spawn()?; 10 + let port = env::var("ROCKBOX_PORT").unwrap_or_else(|_| "6061".to_string()); 11 + let ui_port = env::var("ROCKBOX_UI_PORT").unwrap_or_else(|_| "6062".to_string()); 12 + let http_port = env::var("ROCKBOX_HTTP_PORT").unwrap_or_else(|_| "6063".to_string()); 11 13 12 - child.wait()?; 14 + match wait_for_rockboxd(port.parse()?, Some(1)) { 15 + Ok(_) => {} 16 + Err(_) => { 17 + let mut child = Command::new("rockboxd") 18 + .env("SDL_VIDEODRIVER", video_driver) 19 + .env("ROCKBOX_PORT", port) 20 + .env("ROCKBOX_GRAPHQL_PORT", ui_port) 21 + .env("ROCKBOX_TCP_PORT", http_port) 22 + .spawn()?; 13 23 24 + child.wait()?; 25 + } 26 + }; 14 27 Ok(()) 15 28 }
+22 -3
cli/src/cmd/webui.rs
··· 1 + use std::{env, thread}; 2 + 3 + use anyhow::Error; 1 4 use opener::open; 2 5 use owo_colors::OwoColorize; 6 + use rockbox::{install_rockboxd, wait_for_rockboxd}; 3 7 4 - pub fn webui() { 5 - match open("http://localhost:6062") { 8 + use super::start::*; 9 + 10 + pub fn webui() -> Result<(), Error> { 11 + let port = env::var("ROCKBOX_UI_PORT").unwrap_or_else(|_| "6062".to_string()); 12 + install_rockboxd()?; 13 + 14 + let handle = thread::spawn(|| match start() { 15 + Ok(_) => {} 16 + Err(e) => { 17 + eprintln!("Failed to start Rockbox server: {}", e); 18 + } 19 + }); 20 + 21 + wait_for_rockboxd(port.parse()?, None)?; 22 + match open(format!("http://localhost:{}", port)) { 6 23 Ok(_) => {} 7 24 Err(_) => println!( 8 25 "Open this link in your browser {}", 9 - "http://localhost:6062".purple() 26 + format!("http://localhost:{}", port).purple() 10 27 ), 11 28 }; 29 + handle.join().unwrap(); 30 + Ok(()) 12 31 }
+61
cli/src/lib.rs
··· 1 + use std::{ 2 + env, 3 + process::{Command, Stdio}, 4 + }; 5 + 6 + use anyhow::Error; 7 + 1 8 pub mod api { 2 9 #[path = ""] 3 10 pub mod rockbox { ··· 6 13 pub mod v1alpha1; 7 14 } 8 15 } 16 + 17 + pub fn install_rockboxd() -> Result<(), Error> { 18 + let mut child = Command::new("sh") 19 + .arg("-c") 20 + .arg("type rockboxd > /dev/null 2>&1 || curl -fsSL https://raw.githubusercontent.com/tsirysndr/rockbox-zig/HEAD/install.sh | bash") 21 + .stdin(Stdio::inherit()) 22 + .stdout(Stdio::inherit()) 23 + .stderr(Stdio::inherit()) 24 + .spawn()?; 25 + child.wait()?; 26 + Ok(()) 27 + } 28 + 29 + pub fn wait_for_rockboxd(port: u32, timeout: Option<u32>) -> Result<(), Error> { 30 + setup_pkgx()?; 31 + let cmd = format!( 32 + "pkgx deno run -A npm:wait-port localhost:{} -t {}", 33 + port, 34 + timeout.unwrap_or(60) * 1000 35 + ); 36 + let mut child = Command::new("sh") 37 + .arg("-c") 38 + .arg(cmd) 39 + .stdin(Stdio::inherit()) 40 + .stdout(Stdio::inherit()) 41 + .stderr(Stdio::inherit()) 42 + .spawn()?; 43 + let status = child.wait()?; 44 + 45 + if !status.success() { 46 + return Err(Error::msg("Timeout waiting for Rockbox server")); 47 + } 48 + 49 + Ok(()) 50 + } 51 + 52 + pub fn setup_pkgx() -> Result<(), Error> { 53 + let path = format!( 54 + "{}:{}", 55 + env::var("PATH")?, 56 + format!("{}/.local/bin", env::var("HOME")?) 57 + ); 58 + env::set_var("PATH", &path); 59 + let mut child = Command::new("sh") 60 + .arg("-c") 61 + .arg("type pkgx > /dev/null 2>&1 || curl -fsS https://pkgx.sh | sh") 62 + .stdin(Stdio::inherit()) 63 + .stdout(Stdio::inherit()) 64 + .stderr(Stdio::inherit()) 65 + .spawn()?; 66 + child.wait()?; 67 + 68 + Ok(()) 69 + }
+4 -2
cli/src/main.rs
··· 58 58 start()?; 59 59 } 60 60 Some(("webui", _)) => { 61 - webui(); 61 + webui()?; 62 62 } 63 - _ => start()?, 63 + _ => { 64 + start()?; 65 + } 64 66 } 65 67 Ok(()) 66 68 }