Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tidalify

┌─▄▄─┐ ▄▄ ▄▄─┐ ▄▄─┐ ▄▄   ▄▄─┐ ▄▄ ┌
  ▓░   ▓░ ▓░ │ ▓░ │ ▓░   ▓░   ▓░ │
  ▒░   ▒░ ▒░ │ ▒░─┤ ▒░   ▒░─  ▀▀─┤
  ░░   ░░ ░░ │ ░░ │ ░░ │ ░░   ░░_|
          ───┘      ───┘          

Open a Spotify link (or a pasted Slack message containing one) in the running TIDAL desktop app — no more "sample only, go search it manually."

$ ./tidalify "lose a few braincells https://open.spotify.com/track/0YmcHurKqkzDQeHB8zuzk0?si=…"
▶ TIDAL: $uicideboy$ — COUNT YOUR BLESSINGS
  tidal://track/450298202

How it works

input text → extract Spotify URL → Odesli (song.link) exact match
   ├─ match found → open  tidal://track|album/<id>      ← ~all links, zero auth
   └─ Odesli miss → tidalapi catalog search
                    → apfel (on-device Apple Intelligence) picks the best hit
                    → deterministic guard vetoes a wrong pick
                    → open tidal://track/<id>
  • Odesli matches by ISRC (the track's fingerprint), so the common path is exact and needs no login.
  • The tidal:// deep link is handled by the already-open TIDAL.app — it doesn't open a browser tab.
  • The fallback only fires when Odesli has no TIDAL entry. It uses tidalapi (TIDAL's own client — no developer keys) and the local apfel model to choose among real search results, then a string-similarity guard refuses to auto-open anything that doesn't actually resemble the source track.

Install

Phase 1 (the happy path) needs nothing but Python 3 and TIDAL.app. To enable the search fallback:

./setup.sh          # creates .venv, installs tidalapi, and apfel (via brew)
./tidalify --login  # one-time TIDAL browser sign-in (token cached in ~/.config/tidalify)

Dependencies

What When it's needed Install
Python 3, TIDAL.app always (Phase 1) already present
tidalapi fallback: catalog search setup.sh (pip, in .venv)
apfel fallback: auto-pick the match brew install apfel (needs Apple Intelligence, macOS 26+)

apfel is optional: without it the fallback still runs — it just lists the candidate tracks for you to pick manually instead of choosing automatically.

Optional — put it on your PATH:

ln -s "$PWD/tidalify" /usr/local/bin/tidalify   # or ~/bin

Usage

tidalify "<spotify url or text containing one>"   # open it in TIDAL
tidalify -n "<…>"          # dry-run: print the tidal:// link, don't open
echo "<…>" | tidalify      # read from stdin (used by the macOS Shortcut)
tidalify -c GB "<…>"       # regional availability (default US)
tidalify --login           # one-time TIDAL sign-in for the fallback

Exit code 1 on any failure (no link found, no match, network error).

macOS Shortcut (copy link in Slack → plays in TIDAL)

See SHORTCUT.md.

Notes

  • apfel --schema blocks on an open stdin; tidalify always calls it with stdin redirected to /dev/null.
  • The TIDAL OAuth token lives at ~/.config/tidalify/session.json. Treat it like a password; it is git-ignored.
  • Built on the shoulders of Odesli, tidalapi, and apfel. The tidalapi + session-file pattern is borrowed from tidal-mcp.

About

Open a Spotify link (or a pasted Slack message containing one) in the running TIDAL desktop app

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages