From bbcde83088fa9d1727386cda2be7cdeed9aa4197 Mon Sep 17 00:00:00 2001 From: Tsiry Sandratraina Date: Thu, 16 Apr 2026 22:52:16 +0300 Subject: [PATCH] Add setup command to install Typesense --- Cargo.lock | 8 +++++ cli/Cargo.toml | 1 + cli/src/cmd/mod.rs | 1 + cli/src/cmd/setup.rs | 6 ++++ cli/src/main.rs | 6 ++++ crates/typesense/Cargo.toml | 10 ++++++ crates/typesense/src/lib.rs | 69 +++++++++++++++++++++++++++++++++++++ 7 files changed, 101 insertions(+) create mode 100644 cli/src/cmd/setup.rs create mode 100644 crates/typesense/Cargo.toml create mode 100644 crates/typesense/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4eb6a6ab15..8951dfe553 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8887,6 +8887,7 @@ dependencies = [ "prost", "reqwest", "rmpc", + "rockbox-typesense", "serde", "serde_json", "tokio", @@ -9212,6 +9213,13 @@ dependencies = [ "serde", ] +[[package]] +name = "rockbox-typesense" +version = "0.1.0" +dependencies = [ + "anyhow", +] + [[package]] name = "rockbox-webui" version = "0.1.0" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 3e27b2398a..d6658a9e33 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -32,6 +32,7 @@ serde_json = "1.0.128" open = "5.3.2" warp = "0.3.7" dirs = "6.0.0" +rockbox-typesense = { path = "../crates/typesense" } [build-dependencies] tonic-build = "0.12.3" diff --git a/cli/src/cmd/mod.rs b/cli/src/cmd/mod.rs index e153773623..b0bbac446c 100644 --- a/cli/src/cmd/mod.rs +++ b/cli/src/cmd/mod.rs @@ -6,6 +6,7 @@ pub mod repl; pub mod run; pub mod scan; pub mod service; +pub mod setup; pub mod start; pub mod webui; pub mod whoami; diff --git a/cli/src/cmd/setup.rs b/cli/src/cmd/setup.rs new file mode 100644 index 0000000000..c82401c6a8 --- /dev/null +++ b/cli/src/cmd/setup.rs @@ -0,0 +1,6 @@ +use anyhow::Error; + +pub fn install_dependencies() -> Result<(), Error> { + rockbox_typesense::setup()?; + Ok(()) +} diff --git a/cli/src/main.rs b/cli/src/main.rs index b5888b08fc..cb215f42e7 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -9,6 +9,8 @@ use cmd::{ webui::*, whoami::*, }; +use crate::cmd::setup; + pub mod cmd; fn cli() -> Command { @@ -90,6 +92,7 @@ fn cli() -> Command { .about("Display information about the currently logged in user") .visible_alias("me"), ) + .subcommand(Command::new("setup").about("Setup Rockbox and its dependencies")) .subcommand(Command::new("clear").about("Clear current playlist")) } @@ -167,6 +170,9 @@ async fn main() -> Result<(), Error> { }; println!("✅ Rockbox Playlist Cleared"); } + Some(("setup", _)) => { + setup::install_dependencies()?; + } Some((_, args)) => { if args.get_flag("rebuild") { env::set_var("ROCKBOX_UPDATE_LIBRARY", "1"); diff --git a/crates/typesense/Cargo.toml b/crates/typesense/Cargo.toml new file mode 100644 index 0000000000..aca6a84646 --- /dev/null +++ b/crates/typesense/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "rockbox-typesense" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true diff --git a/crates/typesense/src/lib.rs b/crates/typesense/src/lib.rs new file mode 100644 index 0000000000..83d5f051d7 --- /dev/null +++ b/crates/typesense/src/lib.rs @@ -0,0 +1,69 @@ +use std::process::{Command, Stdio}; + +pub fn setup() -> Result<(), anyhow::Error> { + let mut cmd = Command::new("command") + .arg("-v") + .arg("typesense-server") + .env( + "PATH", + format!( + "{}:{}", + std::env::var("PATH").unwrap_or_default(), + "~/.rockbox/bin" + ), + ) + .stderr(std::process::Stdio::null()) + .stdout(std::process::Stdio::null()) + .spawn()?; + + if cmd.wait()?.success() { + return Ok(()); + } + + let os = if cfg!(target_os = "linux") { + "linux" + } else if cfg!(target_os = "macos") { + "darwin" + } else { + return Err(anyhow::anyhow!("Unsupported platform")); + }; + + let arch = if cfg!(target_arch = "x86_64") { + "amd64" + } else if cfg!(target_arch = "aarch64") { + "arm64" + } else { + return Err(anyhow::anyhow!("Unsupported architecture")); + }; + + let version = std::env::var("RB_TYPESENSE_VERSION").unwrap_or_else(|_| "30.1".to_string()); + let url = format!( + "https://dl.typesense.org/releases/{version}/typesense-server-{version}-{os}-{arch}.tar.gz" + ); + let filename = format!("typesense-server-{version}-{os}-{arch}.tar.gz"); + + Command::new("curl") + .arg("-L") + .arg(&url) + .arg("-o") + .arg(&filename) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .status()?; + + Command::new("tar") + .arg("xzf") + .arg(&filename) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .status()?; + + Command::new("sh") + .arg("-c") + .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") + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .status()?; + + Ok(()) +} -- 2.51.2