A terminal‑based music player that streams from YouTube and syncs your listening activity with ListenBrainz.
- 🎧 Browse your liked tracks, weekly jams, and weekly exploration playlists
- 🔎 Search YouTube and pick from results inside the TUI
- 📋 Browse your personal playlists
- 🔍 Filter any track list in real‑time
- 🎮 Vim‑friendly keybindings (
j/k,/,:) - 📡 Automatic scrobbling and “now playing” status
git clone https://github.com/mobsenpai/listenbrainz_player
cd listenbrainz_player
nix develop
lbThe TUI opens immediately. The Liked tab loads automatically.
Requirements: mpv and yt-dlp must be installed on your system.
pip install .
lbCreate a .env file in the project root:
LISTENBRAINZ_TOKEN=your_api_token_here
LB_USERNAME=your_listenbrainz_usernameYou can get your API token from your ListenBrainz profile → “User token”.
| Key | Tab | Loads |
|---|---|---|
1 |
Liked | Your loved tracks |
2 |
Weekly Jams | This week’s jams |
3 |
Weekly Explor. | Weekly exploration playlist |
4 |
Search | Search YouTube (type query + Enter) |
5 |
Playlist | Browse your ListenBrainz playlists |
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
Enter |
Play selected track |
p / Space |
Pause / resume |
n |
Next track |
b |
Previous track |
s |
Toggle shuffle |
/ |
Filter current playlist (Search tab: new query) |
: |
Command prompt (:play, :liked, etc.) |
q |
Quit |
-
Press
/and type a search term, thenEnter.
The track list is narrowed down instantly. -
To clear the filter, press
/+Enter(empty query) or type:filter.
| Command | Action |
|---|---|
:play <query> |
Instantly play the first YouTube result |
:liked |
Load liked tracks |
:weekly |
Load weekly jams |
:weeklyexpl |
Load weekly exploration |
:playlist <mbid> |
Load a specific playlist |
:clear |
Clear queue and stop playback |
:pause / :stop |
Pause |
:next / :prev |
Next / previous track |
:shuffle |
Toggle shuffle |
:quit |
Quit |
-
Now playing is sent as soon as a track starts.
-
Scrobbling happens only after the track has been listened to for at least 30 seconds (configurable via
SCROBBLE_THRESHOLDinconfig.py). -
The “now playing” status is cleared immediately when you quit.