6 Commits

Author SHA1 Message Date
4e8616dd97 Update install script and README to use precompiled release binary
Install script now downloads the latest GitHub release binary instead of
cloning and building from source. Build dependencies are no longer needed
for the quick install path.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 00:31:43 +00:00
9a54f5c6bd Bump version to 0.2.2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 00:27:40 +00:00
732001771e Fix artist list scrolling to bottom on click
Restore saved scroll offset into ListState before select() so ratatui
preserves the current viewport position instead of scrolling from zero.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 00:25:53 +00:00
0823168167 Bump version to 0.2.1
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 15:45:26 +00:00
cdf4f611fc Add OpenSSL dev headers to build dependencies in README
reqwest pulls in openssl-sys via native-tls, which requires
OpenSSL development headers to compile from source.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 15:43:04 +00:00
Jamie Hewitt
ee10c9fa55 Update README.md with correct curl 2026-01-28 11:05:40 +00:00
5 changed files with 34 additions and 38 deletions

2
Cargo.lock generated
View File

@@ -632,7 +632,7 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]] [[package]]
name = "ferrosonic" name = "ferrosonic"
version = "0.2.0" version = "0.2.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "ferrosonic" name = "ferrosonic"
version = "0.2.0" version = "0.2.2"
edition = "2021" edition = "2021"
description = "A terminal-based Subsonic music client with bit-perfect audio playback" description = "A terminal-based Subsonic music client with bit-perfect audio playback"
license = "MIT" license = "MIT"

View File

@@ -39,25 +39,17 @@ Ferrosonic requires the following at runtime:
| **D-Bus** | MPRIS2 desktop media controls | Recommended | | **D-Bus** | MPRIS2 desktop media controls | Recommended |
| **cava** | Audio visualizer | Optional | | **cava** | Audio visualizer | Optional |
Build dependencies (needed to compile from source):
| Dependency | Package (Arch) | Package (Fedora) | Package (Debian/Ubuntu) |
|---|---|---|---|
| **Rust toolchain** | `rustup` | via rustup.rs | via rustup.rs |
| **pkg-config** | `pkgconf` | `pkgconf-pkg-config` | `pkg-config` |
| **D-Bus dev headers** | `dbus` | `dbus-devel` | `libdbus-1-dev` |
### Quick Install ### Quick Install
Supports Arch, Fedora, and Debian/Ubuntu. Installs dependencies, Rust (if needed), builds from source, and installs to `/usr/local/bin/`: Supports Arch, Fedora, and Debian/Ubuntu. Installs runtime dependencies, downloads the latest precompiled binary, and installs to `/usr/local/bin/`:
```bash ```bash
curl -sSf https://github.com/jaidaken/ferrosonic/raw/branch/master/install.sh | sh curl -sSf https://raw.githubusercontent.com/jaidaken/ferrosonic/master/install.sh | sh
``` ```
### Manual Build ### Build from Source
If you prefer to build manually, install the dependencies listed above, then: If you prefer to build from source, you'll also need: Rust toolchain, pkg-config, OpenSSL dev headers, and D-Bus dev headers. Then:
```bash ```bash
git clone https://github.com/jaidaken/ferrosonic.git git clone https://github.com/jaidaken/ferrosonic.git

View File

@@ -1,25 +1,36 @@
#!/bin/sh #!/bin/sh
set -e set -e
REPO="https://github.com/jaidaken/ferrosonic.git" REPO="https://github.com/jaidaken/ferrosonic"
INSTALL_DIR="/usr/local/bin" INSTALL_DIR="/usr/local/bin"
echo "Ferrosonic installer" echo "Ferrosonic installer"
echo "====================" echo "===================="
# Detect package manager and install dependencies # Detect architecture
ARCH=$(uname -m)
case "$ARCH" in
x86_64) ASSET="ferrosonic-linux-x86_64" ;;
*)
echo "No precompiled binary for $ARCH. Please build from source."
echo "See: $REPO#manual-build"
exit 1
;;
esac
# Detect package manager and install runtime dependencies
if command -v pacman >/dev/null 2>&1; then if command -v pacman >/dev/null 2>&1; then
echo "Detected Arch Linux" echo "Detected Arch Linux"
sudo pacman -S --needed --noconfirm mpv pipewire wireplumber base-devel pkgconf dbus sudo pacman -S --needed --noconfirm mpv pipewire wireplumber dbus
elif command -v dnf >/dev/null 2>&1; then elif command -v dnf >/dev/null 2>&1; then
echo "Detected Fedora" echo "Detected Fedora"
sudo dnf install -y mpv pipewire wireplumber gcc pkgconf-pkg-config dbus-devel sudo dnf install -y mpv pipewire wireplumber dbus
elif command -v apt >/dev/null 2>&1; then elif command -v apt >/dev/null 2>&1; then
echo "Detected Debian/Ubuntu" echo "Detected Debian/Ubuntu"
sudo apt update sudo apt update
sudo apt install -y mpv pipewire wireplumber build-essential pkg-config libdbus-1-dev sudo apt install -y mpv pipewire wireplumber libdbus-1-3
else else
echo "Unknown package manager. Please install manually: mpv, pipewire, wireplumber, pkg-config, dbus dev headers" echo "Unknown package manager. Please install manually: mpv, pipewire, wireplumber, dbus"
echo "Then re-run this script." echo "Then re-run this script."
exit 1 exit 1
fi fi
@@ -47,26 +58,17 @@ else
echo "Skipping cava. You can install it later and enable it in Settings (F5)." echo "Skipping cava. You can install it later and enable it in Settings (F5)."
fi fi
# Install Rust if not present # Download latest release binary
if ! command -v cargo >/dev/null 2>&1; then echo "Downloading ferrosonic..."
echo "Installing Rust toolchain..." LATEST=$(curl -sI "$REPO/releases/latest" | grep -i '^location:' | sed 's/.*tag\///' | tr -d '\r')
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y DOWNLOAD_URL="$REPO/releases/download/$LATEST/$ASSET"
. "$HOME/.cargo/env" TMPFILE=$(mktemp)
fi curl -sL "$DOWNLOAD_URL" -o "$TMPFILE"
chmod +x "$TMPFILE"
# Clone and build
TMPDIR=$(mktemp -d)
echo "Building ferrosonic..."
git clone "$REPO" "$TMPDIR/ferrosonic"
cd "$TMPDIR/ferrosonic"
cargo build --release
# Install # Install
sudo cp target/release/ferrosonic "$INSTALL_DIR/ferrosonic" sudo mv "$TMPFILE" "$INSTALL_DIR/ferrosonic"
# Cleanup
rm -rf "$TMPDIR"
echo "" echo ""
echo "Ferrosonic installed to $INSTALL_DIR/ferrosonic" echo "Ferrosonic $LATEST installed to $INSTALL_DIR/ferrosonic"
echo "Run 'ferrosonic' to start." echo "Run 'ferrosonic' to start."

View File

@@ -156,6 +156,7 @@ fn render_tree(frame: &mut Frame, area: Rect, state: &mut AppState, colors: &The
} }
let mut list_state = ListState::default(); let mut list_state = ListState::default();
*list_state.offset_mut() = state.artists.tree_scroll_offset;
if focused { if focused {
list_state.select(state.artists.selected_index); list_state.select(state.artists.selected_index);
} }
@@ -267,6 +268,7 @@ fn render_songs(frame: &mut Frame, area: Rect, state: &mut AppState, colors: &Th
} }
let mut list_state = ListState::default(); let mut list_state = ListState::default();
*list_state.offset_mut() = state.artists.song_scroll_offset;
if focused { if focused {
list_state.select(artists.selected_song); list_state.select(artists.selected_song);
} }