Tidal in your terminal!
Project description
ttydal - Tidal in your termial!
Inspiration
This project is heavily inspired by what Maxteabag have done on is awesome project sqlit.
Features
- Browse your favorite albums, playlists, and tracks
- Fuzzy search across all loaded albums and tracks (
/key) - High-quality audio playback with three quality levels:
- Max: Hi-Res Lossless (up to 24bit/192kHz)
- High: Lossless (16bit/44.1kHz)
- Low: AAC 320kbps
- Real-time stream quality verification showing actual bit depth and sample rate
- Auto-play next track
- Shuffle mode for randomized playback
- Visual indicators showing currently playing track and source album/playlist
- Playback controls with seeking support
- Smart tracks caching for faster navigation and search
- Player bar displaying track info, artist, album, playback time, and quality metrics
- Multiple theme options for interface customization
- Fully keyboard-driven interface
- Settings auto-save on change
newCover art display in albums list, tracks list, and player barnewImage caching for cover art (stored in~/.cache/ttydal/images/)newVibrant color mode - colorize player bar text with album's vibrant color
warning: this video contain audio of music, mind your volume
https://github.com/user-attachments/assets/ea975bea-b8f6-4d1a-a309-ec2d54390c3a
Requirements
- Python 3.13 or higher
- uv for development
- Active Tidal subscription
- MPV media player (for audio playback)
Installation
For users
# pipx (recommend)
pipx install ttydal
# uv
uv tool install ttydal
# pip
pip install ttydal
Then use it:
ttydal
For development
-
Clone the repository:
git clone https://github.com/results-may-vary-org/ttydal.git cd ttydal
-
Install dependencies using uv:
uv sync -
Run the application:
uv run ttydal
-
For development with auto-reload (optional):
Install watchdog for automatic restart on file changes:
uv add --dev watchdog
Run with the development watcher:
python dev.pyThis will automatically restart the application whenever you save changes to Python files.
Getting started
- Launch ttydal
- On first run, you'll see a login modal
- Press
oto open the Tidal login URL in your browser - Complete the authentication in your browser
- Press
lto check login status - Once logged in, your favorite albums, playlists, and tracks will load automatically
Keybindings
Navigation
| Key | Action |
|---|---|
p |
Switch to Player page |
c |
Switch to Config page |
a |
Focus Albums/Playlists list |
t |
Focus Tracks list |
up/down |
Navigate through lists |
enter |
Select item / Play track (always starts from beginning) |
/ |
Open fuzzy search |
Search Modal
| Key | Action |
|---|---|
enter |
Navigate to selected album/track |
space |
Play selected track (tracks only) |
escape |
Close search |
Playback Controls
| Key | Action |
|---|---|
space |
Toggle play/pause (works anywhere on player page) |
shift+left |
Seek backward 10 seconds |
shift+right |
Seek forward 10 seconds |
N (shift+n) |
Play next track |
P (shift+p) |
Play previous track |
n |
Toggle auto-play next track on/off |
s |
Toggle shuffle mode on/off |
r |
Refresh current list (also clears relevant cache) |
i |
Open cache info modal |
v |
Toggle vibrant mode |
Login Modal
| Key | Action |
|---|---|
o |
Open login URL in browser |
c |
Copy login URL to clipboard |
l |
Check login status |
escape |
Close modal |
Application
| Key | Action |
|---|---|
q |
Quit application |
Configuration
All settings are accessible via the Config page (press c).
Settings
- Theme: choose from 12 built-in themes
- Audio Quality: select default quality for your playback (max, high, or low)
- Auto-Play: enable or disable automatic playback of next track
- Shuffle: enable or disable shuffle mode
- Debug Logging: enable or disable debug logging to
~/.ttydal/debug.log - API Logging: these logs can contains sensitive data enable or disable API request/response logging to
~/.ttydal/debug-api.log
All settings are automatically saved when changed.
Images cache
Loaded images are cached into ~/.cache/ttydal.
Tracks cache
ttydal uses a caching system for tracks to improve performance and enable smart search.
How it works
- In-memory cache: tracks are cached in memory (lost on app restart)
- TTL of 1 hour: each cached album/playlist expires after 1 hour
- Max 50,000 tracks: cache is limited by total track count, not album count.
- LRU eviction: when cache is full, oldest entries are evicted first
- Auto-preload: on startup, all albums are automatically preloaded into cache in the background (mostly for the search feature)
Cache info modal
Press i to open the cache info modal and see current cache statistics.
Cache invalidation
If you make changes to your playlists/favorites on the Tidal website:
- Press
ron Albums list that clears the entire tracks cache and reloads albums - Press
ron Tracks list that invalidates only the current album/playlist cache and reloads
Code of conduct, license, authors, changelog, contributing
See the following file :
Want to participate? Have a bug or a request feature?
Do not hesitate to open a pr or an issue. I reply when I can.
This project is possible because another cool projects exist
Want to support my work?
- Give me a tips
- Give a star on github
- Or just participate to the development :D
Thanks !
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ttydal-1.2.0.tar.gz.
File metadata
- Download URL: ttydal-1.2.0.tar.gz
- Upload date:
- Size: 47.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.25 {"installer":{"name":"uv","version":"0.9.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c8bcf68f3cd7ab74a1f118b15ecf79dff41d8d92e77100ada4c53bb5f0196c0
|
|
| MD5 |
44b9ce936e93cdcf3f7be1cb6479240a
|
|
| BLAKE2b-256 |
4f16d997e19b468254fa0376427a70d6643217de39a9c650330d154618038b9b
|
File details
Details for the file ttydal-1.2.0-py3-none-any.whl.
File metadata
- Download URL: ttydal-1.2.0-py3-none-any.whl
- Upload date:
- Size: 59.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.25 {"installer":{"name":"uv","version":"0.9.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa6c59370479d84335f7e08374dee6af8e770e68242c61bef812487b4b1d9801
|
|
| MD5 |
46ea66cb4b1f43aca5cac51718135c78
|
|
| BLAKE2b-256 |
750ec02edaeee7345fac3d6038ca90c08d606581d657f78fa29e3c182e3c00ab
|