Skip to main content

ttydal screenshot

ttydal - Tidal in your terminal!

Static Badge

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
  • 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
  • Cover art display in albums list, tracks list, and player bar
  • Image caching for cover art
  • Vibrant color mode - colorize player bar text with album's vibrant color
  • Configurable keybindings - customize all keyboard shortcuts (see KEYBINDINGS.md)
  • new Auto-retry when network connection is lost
  • new Current track information is displayed on widget (via mvp/mpris-server)

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

  1. Clone the repository:

    git clone https://github.com/results-may-vary-org/ttydal.git
    cd ttydal
    
  2. Install dependencies using uv:

    uv sync
    
  3. Run the application:

    uv run ttydal
    
  4. 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.py
    

    This will automatically restart the application whenever you save changes to Python files.

Getting started

  1. Launch ttydal
  2. On first run, you'll see a login modal
  3. Press o to open the Tidal login URL in your browser
  4. Complete the authentication in your browser
  5. Press l to check login status
  6. Once logged in, your favorite albums, playlists, and tracks will load automatically

Keybindings

All keybindings are configurable. See KEYBINDINGS.md for the full reference and instructions on customizing them.

Flag for ttydal cmd

ttydal --init-config to create a config file, if not exist, from the default value

ttydal --init-config --force to overwrite the existing config file with the default value

ttydal --debug enable the log of debug information into the config folder

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 (debug.log in config directory)
  • API Logging: these logs can contains sensitive data enable or disable API request/response logging (debug-api.log in config directory)

All settings are automatically saved when changed.

Data directories

ttydal follows platform conventions for config and cache directories:

Type Linux MacOS Windows
Config & logs ~/.config/ttydal ~/Library/Application Support/ttydal %APPDATA%/ttydal
Image cache ~/.cache/ttydal/images ~/Library/Caches/ttydal/images %LOCALAPPDATA%/ttydal/images

Images cache

Loaded images are cached in the platform cache directory (see above).

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 r on Albums list that clears the entire tracks cache and reloads albums
  • Press r on 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?

Thanks !

Metadata

Release files for ttydal 1.6.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ttydal 1.6.1
File Size Uploaded Provenance Actions
ttydal-1.6.1.tar.gz 61.7 kB Without provenance Details for ttydal-1.6.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for ttydal 1.6.1
File Interpreter ABI Platform Actions
ttydal-1.6.1-py3-none-any.whl Python 3 none any Details for ttydal-1.6.1-py3-none-any.whl

Total release size: 138.6 kB

Release files / ttydal-1.6.1.tar.gz

Download URL ttydal-1.6.1.tar.gz
Size 61.7 kB
Tags Source
SHA-256 checksum
How to use checksums
a815c4f67dad6aed03ab3131b46f77e7d26a41e622ff170e0ad78b26cbd1a8f4
BLAKE2b-256 checksum
How to use checksums
fc0505b99e3d1ebb64815511b5cf19b475de380b41af868279bb0b7ba3381b52
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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}

Release files / ttydal-1.6.1-py3-none-any.whl

Download URL ttydal-1.6.1-py3-none-any.whl
Size 76.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6aca3a01b02c9bda3eb46af37a88d5600ea460af91dfee0a48379f9c130377dc
BLAKE2b-256 checksum
How to use checksums
96bfff8c6906a1aa195de7f703aa602efc82038e9a6e05e7446073a081460e1e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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}

Security for ttydal 1.6.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page