GooseOb's Music Player

A YouTube/SoundCloud/Bandcamp search music player with local playback, downloads, and OS media controls, built with iced.
Features
- Search — YouTube Music (Songs / Videos / Artists / Albums / Playlists) via ytmusicapi with yt-dlp fallback, plus SoundCloud, Bandcamp, Last.fm (built-in app key), and MusicBrainz search. Drill into artists, albums, and playlists.
- Streaming & caching — Stream audio via yt-dlp (YouTube/SoundCloud) or direct HTTP (Bandcamp), with fully native decoding, cached to disk for instant replay.
- Downloads — Download tracks to MP3 via yt-dlp, with a Downloads view and on-row indicators.
- Local music & playlists — Add local files (MP3, FLAC, WAV, OGG, M4A, AAC, OPUS, WMA) and create, rename, delete, and organize playlists.
- Library — Save albums, artists, and playlists; browse them from the sidebar.
- Artist pages — Header with stats plus Most popular, Albums, Playlists, and Fans-also-like sections, each with its own provider picker.
- Radio — Song radio and artist radio from search results.
- Queue — Queue panel with Up Next and Recently Played tabs.
- Split panes — Split the main view.
- Drag & drop — Drag tracks between views, into the queue, onto playlists (reorder or turn a card into a local playlist), and into the Library.
- Lyrics — Free, no-key LRCLib lyrics with synced lines that seek on click, plus Genius with per-line annotations, the song blurb, and a language picker row for its translations (loaded on demand); cached per track. Add your own named custom lyrics per track (plain or
[mm:ss.xx]-synced) — they appear as tabs next to the providers, editable and deletable from the lyrics view. Attach multi-line notes to any custom line with#comment lines; the active line's note shows in an editable block below the lyrics. Translate with AI — translate the active lyrics (with learner notes) via any OpenAI-compatible server or local Ollama; the API key, server URL, and model live in Settings, and the result opens in the lyrics editor for review. - Media controls — OS media keys / MPRIS (Linux) / SMTC (Windows) / Now Playing (macOS) via souvlaki.
- More — Search history, volume normalization, navigation history, session restore, right-click context menu, dark theme.
- Localization — 13 languages: English, Polski, Español, Português (Brasil), 简体中文, العربية, Беларуская, Français, Deutsch, 日本語, Русский, हिन्दी, Українська.
Installation
Quick install (Linux / macOS)
|
Detects your platform, downloads the latest release, and installs everything. On Linux it also sets up the desktop entry and icon.
Windows
Download the latest release and extract to a folder. Run goosemusic.exe.
Manual install
Download from GitHub releases or compile from source:
Linux desktop integration
The release tarball includes a .desktop file and icon. After extracting:
macOS
Extract the .app.tar.gz and drag Goosemusic.app to your Applications folder. On first open, right-click → Open if macOS blocks it (unsigned app).
Supported languages
| Language | Code |
|---|---|
| English | en |
| Polski (Polish) | pl |
| Español (Spanish) | es |
| Português (Brasil) | pt_br |
| 简体中文 (Chinese, Simplified) | zh_cn |
| العربية (Arabic) | ar |
| Беларуская (Belarusian) | be |
| Français (French) | fr |
| Deutsch (German) | de |
| 日本語 (Japanese) | ja |
| Русский (Russian) | ru |
| हिन्दी (Hindi) | hi |
| Українська (Ukrainian) | uk |
Pick a language from the in-app Settings view. To add one, copy src/i18n/en.rs to a new module, translate the strings, and append one entry
to the languages! macro in src/i18n/mod.rs — the Language enum and picker are generated from that list.
Install & run
Prerequisites
- Rust (stable, edition 2021)
- yt-dlp — YouTube audio streaming and downloads
- Python 3 +
ytmusicapi— YouTube Music search (optional; falls back to yt-dlp) - D-Bus session bus (Linux) — for MPRIS
- Network access — lyrics fetch live from LRCLib and Genius (no keys)
Keyboard shortcuts
| Key | Action |
|---|---|
| Space | Toggle play/pause |
| Esc | Close in-list search → close search history → clear selection → return to Search |
| Delete | Delete selected tracks (playlist view only) |
| ←/→ or h/l | Move focus between queue panel and track list |
| ↑/↓ or k/j | Move through the focused list (auto-scrolls, wraps) |
| gg / G, Home/End | First / last row |
| PgUp/PgDn, Ctrl+U/D | Page / half-page |
| Shift+↑/↓ (J/K), Ctrl+Space | Extend selection / toggle selection on focused row |
| Ctrl+F | In-list fuzzy search over the hovered track list (n/p step matches) |
| Enter | Play the focused (or hovered) track |
| Ctrl+C / Ctrl+V | Copy / paste selected tracks |
| Ctrl+A | Select all tracks in the focused list |
| Alt+P / Alt+1..5, Alt+S | Stage search provider / scope (pending until Enter) |
| Alt+Enter | Run the pending search from anywhere |
| Alt+↑/↓, Ctrl+K | Prev/next playlist, playlist jumper (Enter open, Shift+Enter play) |
| Alt+←/→ | Back / forward in the focused pane |
| N / P | Next / previous track |
| Q / R / Shift+L | Toggle queue / repeat / lyrics |
| T | Switch queue panel tab: Queue ↔ Recently Played (opens panel if hidden) |
| M, -/=, ,/. | Mute, volume, seek ∓5s (Shift ∓10s) |
| </kbd> / Shift+</kbd> | Split focused pane side by side / stacked |
| Ctrl+W | Close the focused pane |
| Ctrl+←/→/↑/↓ | Move focus to the adjacent pane |
| Ctrl+Tab, Ctrl+1..4 | Cycle / jump between panes |
| ? / F1 | Show this cheatsheet in-app |
Configuration
Config lives at ~/.config/goosemusic/config.json and is also editable live from the in-app Settings view.
| Field | Description | Default |
|---|---|---|
download_dir |
Download directory | ~/Music/goosemusic |
cache_max_size_mb |
Max stream cache size (MB) | 1024 |
max_search_history_stored |
Search history entries kept on disk | 100 |
max_search_history_visible |
Entries shown in the dropdown | 10 |
max_recently_played |
Tracks kept in Recently Played | 50 |
volume_normalization |
Consistent loudness across tracks | false |
cookie_browser |
Browser yt-dlp reads cookies from (age-restricted videos) | none |
Persistent data goes to ~/.local/share/goosemusic (playlists, library, downloads, search history); regenerable caches (session, streamed audio,
thumbnails, lyrics) go to ~/.cache/goosemusic.
Technical notes
State — All state lives in one MusicPlayer; view() is a pure function of &MusicPlayer. Background work (search, download, thumbnails)
returns via an mpsc channel drained by a 250ms tick. Stores implement a JsonStore trait and degrade to defaults on failure.
Audio — A dedicated output thread runs the rodio sink. yt-dlp streams AAC-in-M4A into a still-growing cache file; a custom
SymphoniaStreamingSource over a non-seekable GrowingMediaSource decodes sequentially so playback starts within a few KB.
Cached/downloaded/local files use the same source in seekable mode. Per-track normalization gain is computed once (symphonia) and applied on
replay.
License
MIT