# Ferrosonic A terminal-based Subsonic music client written in Rust, featuring bit-perfect audio playback, gapless transitions, and full desktop integration. Ferrosonic is inspired by [Termsonic](https://git.sixfoisneuf.fr/termsonic/about/), the original terminal Subsonic client written in Go by [SixFoisNeuf](https://www.sixfoisneuf.fr/posts/termsonic-a-terminal-client-for-subsonic/). Ferrosonic is a ground-up rewrite in Rust with additional features including PipeWire sample rate switching for bit-perfect audio, MPRIS2 media controls, multiple color themes, and mouse support. ## Features - **Bit-perfect audio** - Automatic PipeWire sample rate switching to match the source material (44.1kHz, 48kHz, 96kHz, 192kHz, etc.) - **Gapless playback** - Seamless transitions between tracks with pre-buffered next track - **MPRIS2 integration** - Full desktop media control support (play, pause, stop, next, previous, seek) - **Artist/album browser** - Tree-based navigation with expandable artists and album listings - **Playlist support** - Browse and play server playlists with shuffle capability - **Play queue management** - Add, remove, reorder, shuffle, and clear queue history - **Audio quality display** - Real-time display of sample rate, bit depth, codec format, and channel layout - **Audio visualizer** - Integrated cava audio visualizer with theme-matched gradient colors - **13 built-in themes** - Default, Monokai, Dracula, Nord, Gruvbox, Catppuccin, Solarized, Tokyo Night, Rosé Pine, Everforest, Kanagawa, One Dark, and Ayu Dark - **Custom themes** - Create your own themes as TOML files in `~/.config/ferrosonic/themes/` - **Mouse support** - Clickable buttons, tabs, lists, and progress bar seeking - **Artist filtering** - Real-time search/filter on the artist list - **Multi-disc album support** - Proper disc and track number display - **Keyboard-driven** - Vim-style navigation (j/k) alongside arrow keys ## Screenshots ![Ferrosonic](screenshots/ferrosonic.png) ## Installation ### Dependencies Ferrosonic requires the following at runtime: | Dependency | Purpose | Required | |---|---|---| | **mpv** | Audio playback engine (via JSON IPC) | Yes | | **PipeWire** | Automatic sample rate switching for bit-perfect audio | Recommended | | **WirePlumber** | PipeWire session manager | Recommended | | **D-Bus** | MPRIS2 desktop media controls | Recommended | | **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` | | **OpenSSL dev headers** | `openssl` | `openssl-devel` | `libssl-dev` | | **D-Bus dev headers** | `dbus` | `dbus-devel` | `libdbus-1-dev` | ### Quick Install Supports Arch, Fedora, and Debian/Ubuntu. Installs dependencies, Rust (if needed), builds from source, and installs to `/usr/local/bin/`: ```bash curl -sSf https://raw.githubusercontent.com/jaidaken/ferrosonic/master/install.sh | sh ``` ### Manual Build If you prefer to build manually, install the dependencies listed above, then: ```bash git clone https://github.com/jaidaken/ferrosonic.git cd ferrosonic cargo build --release sudo cp target/release/ferrosonic /usr/local/bin/ ``` ## Usage ```bash # Run with default config (~/.config/ferrosonic/config.toml) ferrosonic # Run with a custom config file ferrosonic -c /path/to/config.toml # Enable verbose/debug logging ferrosonic -v ``` ## Configuration Configuration is stored at `~/.config/ferrosonic/config.toml`. You can edit it manually or configure the server connection through the application's Server page (F4). ```toml BaseURL = "https://your-subsonic-server.com" Username = "your-username" Password = "your-password" Theme = "Default" ``` | Field | Description | |---|---| | `BaseURL` | URL of your Subsonic-compatible server (Navidrome, Airsonic, Gonic, etc.) | | `Username` | Your server username | | `Password` | Your server password | | `Theme` | Color theme name (e.g. `Default`, `Catppuccin`, `Tokyo Night`) | Logs are written to `~/.config/ferrosonic/ferrosonic.log`. ## Keyboard Shortcuts ### Global | Key | Action | |---|---| | `q` | Quit | | `p` / `Space` | Toggle play/pause | | `l` | Next track | | `h` | Previous track | | `Ctrl+R` | Refresh data from server | | `t` | Cycle to next theme | | `F1` | Artists page | | `F2` | Queue page | | `F3` | Playlists page | | `F4` | Server configuration page | | `F5` | Settings page | ### Artists Page (F1) | Key | Action | |---|---| | `/` | Filter artists by name | | `Esc` | Clear filter | | `Up` / `k` | Move selection up | | `Down` / `j` | Move selection down | | `Left` / `Right` | Switch focus between tree and song list | | `Enter` | Expand/collapse artist, or play album/song | | `Backspace` | Return to tree from song list | | `e` | Add selected item to end of queue | | `n` | Add selected item as next in queue | ### Queue Page (F2) | Key | Action | |---|---| | `Up` / `k` | Move selection up | | `Down` / `j` | Move selection down | | `Enter` | Play selected song | | `d` | Remove selected song from queue | | `J` (Shift+J) | Move selected song down | | `K` (Shift+K) | Move selected song up | | `r` | Shuffle queue (current song stays in place) | | `c` | Clear played history (remove songs before current) | ### Playlists Page (F3) | Key | Action | |---|---| | `Tab` / `Left` / `Right` | Switch focus between playlists and songs | | `Up` / `k` | Move selection up | | `Down` / `j` | Move selection down | | `Enter` | Load playlist songs or play selected song | | `e` | Add selected item to end of queue | | `n` | Add selected song as next in queue | | `r` | Shuffle play all songs in selected playlist | ### Server Page (F4) | Key | Action | |---|---| | `Tab` | Move between fields | | `Enter` | Test connection or Save configuration | | `Backspace` | Delete character in text field | ### Settings Page (F5) | Key | Action | |---|---| | `Up` / `Down` | Move between settings | | `Left` | Previous option | | `Right` / `Enter` | Next option | Settings include theme selection and cava visualizer toggle. Changes are saved automatically. ## Mouse Support - Click page tabs in the header to switch pages - Click playback control buttons (Previous, Play, Pause, Stop, Next) in the header - Click items in lists to select them - Click the progress bar in the Now Playing widget to seek ## Audio Features ### Bit-Perfect Playback Ferrosonic uses PipeWire's `pw-metadata` to automatically switch the system sample rate to match the source material. When a track at 96kHz starts playing, PipeWire is instructed to output at 96kHz, avoiding unnecessary resampling. The original sample rate is restored when the application exits. ### Gapless Playback The next track in the queue is pre-loaded into MPV's internal playlist before the current track finishes, allowing seamless transitions with no gap or click between songs. ### Now Playing Display The Now Playing widget shows: - Artist, album, and track title - Audio quality: format/codec, bit depth, sample rate, and channel layout - Visual progress bar with elapsed/total time ## Themes Ferrosonic ships with 13 themes. On first run, the built-in themes are written as TOML files to `~/.config/ferrosonic/themes/`. | Theme | Description | |---|---| | **Default** | Cyan/yellow on dark background (hardcoded) | | **Monokai** | Classic Monokai syntax highlighting palette | | **Dracula** | Purple/pink Dracula color scheme | | **Nord** | Arctic blue Nord palette | | **Gruvbox** | Warm retro Gruvbox colors | | **Catppuccin** | Soothing pastel Catppuccin Mocha palette | | **Solarized** | Ethan Schoonover's Solarized Dark | | **Tokyo Night** | Dark Tokyo Night color scheme | | **Rosé Pine** | Soho vibes Rosé Pine palette | | **Everforest** | Comfortable green Everforest Dark | | **Kanagawa** | Dark Kanagawa wave palette | | **One Dark** | Atom One Dark color scheme | | **Ayu Dark** | Ayu Dark color scheme | Change themes with `t` from any page, from the Settings page (F5), or by editing the `Theme` field in `config.toml`. ### Custom Themes Create a `.toml` file in `~/.config/ferrosonic/themes/` and it will appear in the theme list. The filename becomes the display name (e.g. `my-theme.toml` becomes "My Theme"). ```toml [colors] primary = "#89b4fa" secondary = "#585b70" accent = "#f9e2af" artist = "#a6e3a1" album = "#f5c2e7" song = "#94e2d5" muted = "#6c7086" highlight_bg = "#45475a" highlight_fg = "#cdd6f4" success = "#a6e3a1" error = "#f38ba8" playing = "#f9e2af" played = "#6c7086" border_focused = "#89b4fa" border_unfocused = "#45475a" [cava] gradient = ["#a6e3a1", "#94e2d5", "#89dceb", "#74c7ec", "#cba6f7", "#f5c2e7", "#f38ba8", "#f38ba8"] horizontal_gradient = ["#f38ba8", "#eba0ac", "#fab387", "#f9e2af", "#a6e3a1", "#94e2d5", "#89b4fa", "#cba6f7"] ``` You can also edit the built-in theme files to customize them. They will not be overwritten unless deleted. ## Compatible Servers Ferrosonic works with any server implementing the Subsonic API, including: - [Navidrome](https://www.navidrome.org/) - [Airsonic](https://airsonic.github.io/) - [Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced) - [Gonic](https://github.com/sentriz/gonic) - [Supysonic](https://github.com/spl0k/supysonic) ## Acknowledgements Ferrosonic is inspired by [Termsonic](https://git.sixfoisneuf.fr/termsonic/about/) by SixFoisNeuf, a terminal Subsonic client written in Go. Ferrosonic builds on that concept with a Rust implementation, bit-perfect audio via PipeWire, and additional features. ## License MIT