Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e8616dd97 | |||
| 9a54f5c6bd | |||
| 732001771e | |||
| 0823168167 | |||
| cdf4f611fc | |||
|
|
ee10c9fa55 |
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -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
|
||||||
|
|||||||
50
install.sh
50
install.sh
@@ -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."
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user