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.

Add setup command to install Typesense

+101
+8
Cargo.lock
··· 8887 8887 "prost", 8888 8888 "reqwest", 8889 8889 "rmpc", 8890 + "rockbox-typesense", 8890 8891 "serde", 8891 8892 "serde_json", 8892 8893 "tokio", ··· 9210 9211 "rockbox-search", 9211 9212 "rockbox-traits", 9212 9213 "serde", 9214 + ] 9215 + 9216 + [[package]] 9217 + name = "rockbox-typesense" 9218 + version = "0.1.0" 9219 + dependencies = [ 9220 + "anyhow", 9213 9221 ] 9214 9222 9215 9223 [[package]]
+1
cli/Cargo.toml
··· 32 32 open = "5.3.2" 33 33 warp = "0.3.7" 34 34 dirs = "6.0.0" 35 + rockbox-typesense = { path = "../crates/typesense" } 35 36 36 37 [build-dependencies] 37 38 tonic-build = "0.12.3"
+1
cli/src/cmd/mod.rs
··· 6 6 pub mod run; 7 7 pub mod scan; 8 8 pub mod service; 9 + pub mod setup; 9 10 pub mod start; 10 11 pub mod webui; 11 12 pub mod whoami;
+6
cli/src/cmd/setup.rs
··· 1 + use anyhow::Error; 2 + 3 + pub fn install_dependencies() -> Result<(), Error> { 4 + rockbox_typesense::setup()?; 5 + Ok(()) 6 + }
+6
cli/src/main.rs
··· 9 9 webui::*, whoami::*, 10 10 }; 11 11 12 + use crate::cmd::setup; 13 + 12 14 pub mod cmd; 13 15 14 16 fn cli() -> Command { ··· 90 92 .about("Display information about the currently logged in user") 91 93 .visible_alias("me"), 92 94 ) 95 + .subcommand(Command::new("setup").about("Setup Rockbox and its dependencies")) 93 96 .subcommand(Command::new("clear").about("Clear current playlist")) 94 97 } 95 98 ··· 166 169 Err(e) => {} 167 170 }; 168 171 println!("✅ Rockbox Playlist Cleared"); 172 + } 173 + Some(("setup", _)) => { 174 + setup::install_dependencies()?; 169 175 } 170 176 Some((_, args)) => { 171 177 if args.get_flag("rebuild") {
+10
crates/typesense/Cargo.toml
··· 1 + [package] 2 + name = "rockbox-typesense" 3 + version = "0.1.0" 4 + authors.workspace = true 5 + edition.workspace = true 6 + license.workspace = true 7 + repository.workspace = true 8 + 9 + [dependencies] 10 + anyhow.workspace = true
+69
crates/typesense/src/lib.rs
··· 1 + use std::process::{Command, Stdio}; 2 + 3 + pub fn setup() -> Result<(), anyhow::Error> { 4 + let mut cmd = Command::new("command") 5 + .arg("-v") 6 + .arg("typesense-server") 7 + .env( 8 + "PATH", 9 + format!( 10 + "{}:{}", 11 + std::env::var("PATH").unwrap_or_default(), 12 + "~/.rockbox/bin" 13 + ), 14 + ) 15 + .stderr(std::process::Stdio::null()) 16 + .stdout(std::process::Stdio::null()) 17 + .spawn()?; 18 + 19 + if cmd.wait()?.success() { 20 + return Ok(()); 21 + } 22 + 23 + let os = if cfg!(target_os = "linux") { 24 + "linux" 25 + } else if cfg!(target_os = "macos") { 26 + "darwin" 27 + } else { 28 + return Err(anyhow::anyhow!("Unsupported platform")); 29 + }; 30 + 31 + let arch = if cfg!(target_arch = "x86_64") { 32 + "amd64" 33 + } else if cfg!(target_arch = "aarch64") { 34 + "arm64" 35 + } else { 36 + return Err(anyhow::anyhow!("Unsupported architecture")); 37 + }; 38 + 39 + let version = std::env::var("RB_TYPESENSE_VERSION").unwrap_or_else(|_| "30.1".to_string()); 40 + let url = format!( 41 + "https://dl.typesense.org/releases/{version}/typesense-server-{version}-{os}-{arch}.tar.gz" 42 + ); 43 + let filename = format!("typesense-server-{version}-{os}-{arch}.tar.gz"); 44 + 45 + Command::new("curl") 46 + .arg("-L") 47 + .arg(&url) 48 + .arg("-o") 49 + .arg(&filename) 50 + .stdout(Stdio::inherit()) 51 + .stderr(Stdio::inherit()) 52 + .status()?; 53 + 54 + Command::new("tar") 55 + .arg("xzf") 56 + .arg(&filename) 57 + .stdout(Stdio::inherit()) 58 + .stderr(Stdio::inherit()) 59 + .status()?; 60 + 61 + Command::new("sh") 62 + .arg("-c") 63 + .arg("mkdir -p ~/.rockbox/bin && mv typesense-server ~/.rockbox/bin && chmod +x ~/.rockbox/bin/typesense-server && rm -f typesense-server-*.tar.gz typesense-server.md5.txt") 64 + .stdout(Stdio::inherit()) 65 + .stderr(Stdio::inherit()) 66 + .status()?; 67 + 68 + Ok(()) 69 + }