A single-file Python tool that does two things:
- Sync — Scans your music library (Android phone or iTunes/Apple Music) and creates matching playlists on Tidal
- Download — Downloads tracks, albums, or playlists from Tidal as FLAC files with full metadata and album art
No third‑party sync services. Just a Tidal account.
- Batch adding – up to 50 tracks per API call, making sync up to 50× faster.
- Tidal ID embedding – every downloaded track stores its Tidal ID in a custom tag. Future syncs use these IDs for instant, 100% accurate additions – no searching, no mismatches.
- Local library indexing –
--build-localscans your music folder and builds a song file with Tidal IDs. - ID fetching –
--fetch-idsreads an existing song file, searches Tidal for missing IDs, and updates it (and can write IDs back into the audio files). - Custom song file –
--song-filelets you use any filename, so you can manage multiple libraries. - Backup your playlists – the included
Omni_List.pyexports all your Tidal playlists with track IDs, ready to re‑import.
- A Tidal account (any plan)
- Python 3.10 or newer
ffmpeginstalled on your system- For Android sync: ADB (Android Debug Bridge)
- For iTunes sync: iTunes with XML sharing enabled
The easiest way is to use the pre‑built binaries (no Python or dependencies needed).
- Go to the Releases page.
- Download the latest version for your operating system:
OmniTide-linux(Linux)OmniTide.exe(Windows)OmniTide-macos(macOS)
- Linux & macOS only: Make it executable:
chmod +x OmniTide-linux # or OmniTide-macos
git clone https://github.com/reveler-hub/OmniTide
cd OmniTide
# Create and activate a virtual environment
python3 -m venv ~/OmniTide_Env
source ~/OmniTide_Env/bin/activate # Linux/macOS
# or OmniTide_Env\Scripts\activate # Windows
# Install dependencies
pip install tidalapi requests mutagen pathvalidate python-ffmpeg
# Run
./OmniTide.py --loginRun --login first to authenticate:
./OmniTide-linux --login # Linux binary
.\OmniTide.exe --login # Windows binary
./OmniTide.py --login # venvThe script prints a URL. Open it in your browser, log in to Tidal, and the script continues automatically. Your session is saved to token.json – you won't need to log in again unless you delete it.
OmniTide supports three sources: Android phone, iTunes/Apple Music, and manual song files.
- Enable USB Debugging on your phone (Settings → About Phone → tap Build Number 7 times → Developer Options → USB Debugging).
- Connect your phone via USB and accept the ADB authorisation prompt.
- Run:
./OmniTide-linux --sync # binary
./OmniTide.py --sync # venvThe script scans /sdcard/Music/. Each subfolder becomes a Tidal playlist. Songs are matched on Tidal by artist and title.
./OmniTide-macos --sync --source itunes # binary
./OmniTide.py --sync --source itunes # venvThe --itunes flag is an alias for --source itunes (so --sync --itunes still works).
The script auto‑detects your library file at:
- macOS:
~/Music/Music/Music Library.xml - Windows:
%USERPROFILE%\Music\iTunes\iTunes Music Library.xml
If your library is elsewhere, specify it:
./OmniTide.py --sync --source itunes --itunes-path "path/to/library.xml"Create a plain text file (default: song_files.txt) with this format:
[Playlist Name]
Artist - Song Title
Artist - Song Title [TID:123456789] # optional Tidal ID
[Another Playlist]
Artist - Song Title
Then run:
./OmniTide.py --sync --song-file my_songs.txtIf a line includes [TID:...], the track is added instantly – no search, no errors. If the ID is missing, the script falls back to searching by artist/title.
If you have a folder of downloaded music (e.g., from OmniTide downloads or elsewhere), you can index it and generate a song_files.txt with Tidal IDs.
# Basic scan – reads existing TIDALID tags if present
./OmniTide.py --build-local ~/Tidal\ Download
# Also fetch missing IDs from Tidal (searches by artist/title)
./OmniTide.py --build-local ~/Tidal\ Download --fetch-idsThe script reads metadata from FLAC files, extracts ARTIST, TITLE, and the custom TIDALID tag (if present), and writes a song_files.txt in the current directory.
If you use --fetch-ids, it searches Tidal for any file missing a TIDALID and writes the ID back into the file and into the generated song file.
If you already have a song file without IDs (e.g., an old backup), you can update it:
./OmniTide.py --fetch-ids --song-file old_backup.txtThis reads old_backup.txt, searches Tidal for every line without a [TID:...], and rewrites the file with the found IDs.
The included script Omni_List.py exports all your user‑created playlists with track Tidal IDs.
./Omni_List.py > my_backup.txtThe output is a song_files.txt‑compatible file – you can later sync it to a new account instantly:
./OmniTide.py --sync --song-file my_backup.txtNear the top of OmniTide.py (or in the binary, you can’t edit it; use the Python version if you need this), you can set:
SKIP_AS_ARTIST– Folder names that should not be used as artist when guessing from the filename. Useful for mix folders likeWorkout Tracks.SKIP_PLAYLISTS– Folder names to completely ignore during sync (e.g., audiobooks, voice memos).
Download tracks, albums, or playlists by URL:
./OmniTide.py --download "https://tidal.com/browse/track/12345678"
./OmniTide.py --download "https://tidal.com/browse/album/12345678"
./OmniTide.py --download "https://tidal.com/browse/playlist/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"Files are saved to ~/Tidal Download/ with full metadata, album art, and the Tidal ID embedded in a custom TIDALID tag.
| Flag | Description |
|---|---|
--login |
Log in to Tidal and save your session token |
--sync |
Sync from your chosen source (phone or iTunes) |
--source {phone,itunes} |
Source to sync from (default: phone) |
--itunes |
Alias for --source itunes (kept for compatibility) |
--itunes-path PATH |
Path to iTunes Music Library.xml |
--download URL |
Download a track, album, or playlist |
--only NAME |
Only sync playlists whose names contain NAME |
--rescan |
Force re‑scan the source even if a song file exists |
--keep-existing |
Don't delete and replace existing Tidal playlists (add to them) |
--song-file FILE |
Use a custom song list file (default: song_files.txt) |
--build-local PATH |
Scan a local music folder and build a song file with Tidal IDs |
--fetch-ids |
Read a song file, search Tidal for missing IDs, and update it |
Login prompt appears every run / 401 errors
Delete token.json and run --login again. The script will automatically refresh your token on each run – if it fails, a fresh login is needed.
ADB says "no devices" or "unauthorized"
Enable USB Debugging and accept the authorisation prompt on your phone. Run adb devices to verify the connection.
Songs not found or wrong songs added
Run MusicBrainz Picard on your library to fix tags. After a sync, check unmatched_songs.txt for a list of everything that wasn’t found.
ffmpeg not found
Install ffmpeg (sudo apt install ffmpeg on Linux, or download from ffmpeg.org). Downloads will still work without it, but the seekbar may be broken.
iTunes library not found
Make sure Share iTunes Library XML is enabled (Music → Settings → Advanced on macOS, or Edit → Preferences → Advanced on Windows). Or use --itunes-path.
Batch adding fails with HTTP 400
The script automatically falls back to individual adds for the affected chunk – no action needed. If you see many 400s, try reducing the chunk size (edit chunk_size = 50 to a lower number in add_tracks_batch()).
This project is strictly for educational and personal archival purposes.
You must have an active Tidal subscription to use this tool. Do not use OmniTide to distribute copyrighted material, bypass DRM for piracy, or violate Tidal's Terms of Service.
The developers assume no liability for how this tool is used or any potential account bans resulting from excessive API calls. Use at your own risk.