Skip to main content

Tidal in your terminal!

Project description

ttydal

Tidal but in your terminal !

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

Requirements

  • Python 3.13 or higher
  • uv for development
  • Active Tidal subscription
  • MPV media player (for audio playback)

Installation

For users

Package deployement in progess :)

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

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

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.

Tracks cache

ttydal uses an intelligent 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. This handles albums with varying sizes (some playlists can have 5000+ tracks)
  • 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
  • Smart search: search (/) works across ALL cached tracks from all loaded albums

Cache info modal

Press i to open the cache info modal and see current cache statistics:

        Cache Status

   Tracks Cached
   ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁   25.0K/50.0K

   Albums: 42
   TTL: 1 hour

   ● complete  ● progress  ● pending

   Press ESC to close

The visual bar shows cache usage with theme-aware colors:

  • Complete (theme success color): filled cache slots
  • Progress (theme warning color): current slot being filled
  • Pending (theme muted color): empty slots available

Cache invalidation

If you make changes to your playlists/favorites on the Tidal website:

  • Press r on Albums list: clears the entire tracks cache and reloads albums
  • Press r on Tracks list: invalidates only the current album/playlist cache and reloads

Why albums list is not (yet) cached

The albums list is intentionally not cached because:

  1. users rarely reload it after initial load
  2. it's a small dataset that loads quickly

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 !

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ttydal-1.0.0.tar.gz (40.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ttydal-1.0.0-py3-none-any.whl (51.4 kB view details)

Uploaded Python 3

File details

Details for the file ttydal-1.0.0.tar.gz.

File metadata

  • Download URL: ttydal-1.0.0.tar.gz
  • Upload date:
  • Size: 40.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

Hashes for ttydal-1.0.0.tar.gz
Algorithm Hash digest
SHA256 4c5b16357ca2215020c62d01e5fbed7c37ac82c44bccec7891338f76a0bc3bdc
MD5 214e9e9e244877e0ce1c11753b6a30a5
BLAKE2b-256 7b720c3b066e6f3bf75330611e7fa75ff8d959ae7cd49f9a5926742a7999df15

See more details on using hashes here.

File details

Details for the file ttydal-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: ttydal-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 51.4 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

Hashes for ttydal-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b21280315f500bd936bf5bb0c9ca51d194d60c66e586d2811ea65fe0567b0369
MD5 8c76c00a720cefad0abc60feaebc354a
BLAKE2b-256 90c3671f111a32c9a52316f4677d970df00d8d9ad11285816e10e15946e846d4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page