master
NaviPy
Accessible Navidrome desktop client built with PySide6. Keyboard-first controls, live region announcements, and XDG-compliant configuration keep the app friendly for screen readers and shared systems.
This project is vibe coded. If you have problems with fully AI generated code, move along, nothing to see here. For people with a brain, keep reading, you will be impressed.
Features
- Browse Artists, Albums, Favorites, Playlists, Genres, and Discover in separate tabs with native tables
- Keyboard-driven playback controls with live announcements
- Queue management (play now, next/previous, clear/remove)
- Track-change announcements (toggle in View → Announce Track Changes)
- Persistent accessible checkboxes for combining artists, albums, and songs across library views
- Context menus on library tables and search results (right click or Shift+F10/Menu) for play, queue, favorite
- Search dialog uses a results tree (artists/albums/songs/genres) with expand/collapse, Enter to play, and context menus
- Discover section with recently added/played, frequently played, random albums, server “Now Playing”, and “Similar to current track”
- Favorites tab listing starred songs; Enter plays a song, and Collection actions can play or queue all favorites
- Add-to-playlist from songs/albums/artists/genres/favorites via context menu (choose existing or create new)
- Desktop integrations via MPRIS (playback control, metadata, notifications)
- Config, data, and cache saved under XDG paths (
~/.config/stormux/navipy, etc.) - Does not log credentials; server secrets live in
servers.json
Requirements
- Python 3.9+ (PySide6)
- Qt multimedia runtime for audio playback (e.g.,
qt6-multimediapackage when using system Qt) - Navidrome server credentials
Setup
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Run
python3 navipy.py
Logs are written to ~/.local/share/stormux/navipy/navipy.log.
Configuration and Data Paths
- Config:
~/.config/stormux/navipy/settings.jsonandservers.json
Honors$XDG_CONFIG_HOME. Default path is~/.config/navipy. - Data (logs, runtime files):
~/.local/share/stormux/navipy/($XDG_DATA_HOMErespected) - Cache:
~/.cache/stormux/navipy/($XDG_CACHE_HOMErespected)
Keyboard Shortcuts
- Playback:
Spaceplay/pause,Xplay/resume,Ctoggle pause,Vstop - Navigation:
Zprevious,Bnext,Ctrl+Left/Rightprevious/next,Alt+Sshuffle,Alt+Rrepeat - Announcements:
Alt+Cannounce current track (live region),Ctrl+Tannounce track (dialog),Ctrl+Pannounce position - Volume:
Ctrl+Up/Downor0/9to adjust - Library/Search:
Ctrl+Oconnect,F5refresh,Ctrl+Fsearch,Alt+Icontext menu for current track/selection,Alt+Aactions for checked library items,Shift+F10or Menu key for item context menu
Browsing the Library
- Switch categories with
Ctrl+Tab/Ctrl+Shift+Tab, or focus the tab bar and use arrow keys. - Use arrow keys to navigate table rows and columns.
Tableaves the table for the next control. - Press
Enterto open an artist's albums, an album's tracks, or a playlist or genre. On a song,Enterstarts playback. - Use
Backspace,Alt+Left, or the Back button to return to the previous table and selection. - Use Play selected to play an entire selected album, artist, playlist, or genre without leaving the table.
- Use
Shift+F10, the Menu key, or Actions for play, queue, playlist, and favorite actions. - Library tables have a first
Selectedcheckbox column and initially focus the second, informational column. PressSpacefrom either column to check or uncheck an artist, album, or song. Checks remain selected while you browse other tabs and collections.Alt+Aopens actions for all checked items. - Collection actions applies to the collection currently being viewed, including all artists or favorites.
- Albums and genre tracks have a Load more button when more results are available.
- Each tab keeps its own browsing position. Refreshing the library resets the tables.
Ctrl+Ccopies the current row. Search remains available withCtrl+F.
Playback Persistence
- Volume, shuffle, and repeat preferences persist in
settings.json - Repeat defaults to off; shuffle retains your last choice across launches
Accessibility Notes
- Live region announcements for status updates and explicit announce commands
- Accessible names/descriptions on interactive widgets
- Keyboard-only navigation throughout the UI
Development Tips
- Keep secrets out of logs;
servers.jsonstores credentials and is not tracked - Respect XDG env vars in scripts/tests to avoid polluting real user data
- Placeholder tests can be added under
tests/withpytest
Languages
Python
99.5%
Shell
0.5%