Tidarr is a Docker image that provides a web interface to download up to 24-bit 192.0 kHz media from Tidal (tracks, albums, playlists, music videos). Format on the fly with Beets, automatically update your Plex library, and push notifications with Gotify.
- Need an official (shared ?) Tidal account
- For educational purposes and personal use only
- Do not forget to support your local artists (merch, live, ...) ๐โค๏ธ
- Downloadable media : tracks, albums, playlists, mixes, music videos
- Max quality : FLAC, 24 bit 192.0 kHz (if available)
- Tidal trends content
- User playlists, mixes, favorites
- Search by keywords
- Search by url : artist url, album url, playlist url, track url, mix url
- Download covers
- Admin password
- M3U file for playlist with customizable path
- Watch and sync playlists, mixes, favorites and artists with cron
- Skip download if track exists
- Custom CSS
- Docker platforms:
linux/amd64andlinux/arm64
- Beets.io - Tag releases
- Gotify - Push notifications
- Apprise API - Push notifications
- Webhook push over - Push notifications using webhook (MatterMost)
- Plex - Library update
- Song recognition : Shazarr project (Android)
- Server-side download list processing
- UI built with ReactJS + ExpressJS API
- Self-hostable with Docker using a Linuxserver.io base image (uncompressed size: ~190 MB)
- Download Tidal content with Tiddl (2.7.0)
Example docker-compose.yml :
services:
tidarr:
image: cstaelen/tidarr
container_name: 'tidarr'
ports:
- 8484:8484
volumes:
- /any/folder/to/tidarr/config:/home/app/standalone/shared
- /any/folder/to/library:/home/app/standalone/library
restart: 'unless-stopped'or
docker run \
--rm \
--name tidarr \
-p 8484:8484 \
-v /any/folder/to/tidarr/config:/home/app/standalone/shared \
-v /any/folder/to/library:/home/app/standalone/library \
cstaelen/tidarr:latest(if no tiddl.json file provided) :
Authorize your device using the UI token dialog
or
docker compose exec -it -e TIDDL_PATH=/home/app/standalone/shared tidarr tiddl auth loginor
docker exec -it -e TIDDL_PATH=/home/app/standalone/shared tidarr tiddl auth-> You can set download options in /your/docker/path/to/tidarr/config/tiddl.json.
/!\ Be ware to set the right folder templates
See default :
{
// More tiddl details : https://github.com/oskvr37/tiddl/wiki/Template-formatting
"template": {
"album": "{album_artist}/{album}/{number:02d}. {title}",
"track": "{artist}/_tracks/{artist} - {title}",
"video": "_videos/{artist}/{artist} - {title}",
"playlist": "_playlists/{playlist}/{playlist_number:02d}. {artist} - {title}"
},
"download": {
// Default high (16bit 44.1khz), max available: master (24bit 192khz max)
// https://github.com/oskvr37/tiddl?tab=readme-ov-file#download-quality
"quality": "high",
// Should not be changed (otherwise downloads will fail) /!\
"path": "/home/app/standalone/download/incomplete",
// `scan_path` is used to skip existing files. Set it to null if you want to override.
"scan_path": "/home/app/standalone/library",
"threads": 4,
"embed_lyrics": false,
// Include or not singles while downloading "all releases"
"singles_filter": "none", // "none", "only", "include"
// Show video content
"download_video": true,
// Add playlist file
"save_playlist_m3u": true
},
"cover": {
"save": false,
"size": 1280,
"filename": "cover.jpg"
},
// Will be automatically filled by in-app authentication
"auth": {
"token": "",
"refresh_token": "",
"expires": 0,
"user_id": "",
"country_code": ""
},
"omit_cache": false
}For template format update, please see Tiddl formatting documentation
environment:
- ...
- PUID=1234
- PGID=123
- UMASK=0022If not set, no password is required to access the app.
environment:
- ...
- ADMIN_PASSWORD=<string> # if not set, no password are required to accessForce use of tiddl.json quality value and disable quality selector in app
environment:
- ...
- LOCK_QUALITY=trueYou may want to use proxy for tidal server queries to enhance privacy.
environment:
- ...
- ENABLE_TIDAL_PROXY=trueDefault base path used in .m3u : ./
You can custom base path used by track path in .m3u file :
environment:
- ...
- M3U_BASEPATH_FILE="../../"Default value is daily sync at 3 am (0 3 * * *).
You can set a custom cron expression using SYNC_CRON_EXPRESSION env var.
To run task at midnight (00:00) every Monday :
environment:
- ...
- SYNC_CRON_EXPRESSION="0 0 * * 1"* Syntaxe :
- Minute (0 - 59)
- Hour (0 - 23)
- Day of the month (1 - 31)
- Month (1 - 12)
- Day of the week (0 - 7) (Sunday is both 0 and 7)
You can customize Tidarr's appearance using the UI in settings dialog, or by editing the custom.css file. This file is automatically created in your config folder on first launch.
File location: /your/docker/path/to/tidarr/config/custom.css
Add to your docker-compose file in environment: section :
environment:
- ...
- ENABLE_BEETS=trueBeets options in </mounted/config/folder/>beets-config.yml:
Add to your docker-compose file in environment: section :
environment:
- ...
- ENABLE_PLEX_UPDATE=true
- PLEX_URL=<url|ip:port>
- PLEX_LIBRARY=<music_library_id>
- PLEX_TOKEN=<x-plex-token>
- PLEX_PATH=/path/to/scan # optional - if not set, update whole library- PlexToken : your Plex token : https://www.plexopedia.com/plex-media-server/general/plex-token/
- Library ID : In Plex server web ui, go to your music library tab and check
source=in the URL http://192.168.1.20:32400/web/index.html#!/media/abcdef12345678/com.plexapp.plugins.library?**source=3** - Folder (optional) : path to folder to scan url (if not set, all music library will be scanned)
Doc : https://www.plexopedia.com/plex-media-server/api/library/scan-partial/
Add to your docker-compose file in environment: section :
environment:
- ...
- ENABLE_GOTIFY=true
- GOTIFY_URL=<url|ip:port>
- GOTIFY_TOKEN=<gotify_app_token>Add to your docker-compose file in environment: section :
environment:
- ...
- ENABLE_APPRISE_API=true
- APPRISE_API_ENDPOINT=http://{apprise_api_url}:{port}/notify/{config_id}
- APPRISE_API_TAG=tidarr # optionalIf no tag is defined, default tag value will be "all".
Many push over services can be used as an URL to curl with a payload. Exemple with MatterMost :
curl -i -X POST -H 'Content-Type: application/json' -d '{"text": "Hello, this is some text\nThis is more text. ๐"}' https://your-mattermost-server.com/hooks/xxx-generatedkey-xxxYou can set URL in Tidarr env vars
environment:
- ...
- PUSH_OVER_URL=https://your-mattermost-server.com/hooks/xxx-generatedkey-xxxIt should also works with other services using the same payload format {"text": "..."}.
As I'am the only maintainer for now, user requested features can takes time.
- Feel free to create an issue with
enhancementorbugtag. - Be my guest, fork and dev !
If you would like to support this project, please do not hesitate to make a donation. It contributes a lot to motivation, gives me the energy to continue maintaining the project and adding the features requested by the users :)
Want more features and/or contribute ? Be my guest, fork and dev <3
Check docker environment variables in compose.yml before running :
make devThe docker-build Makefile target now relies on Docker Buildx so you can produce images for several architectures in one command.
- Build a multi-platform image (default:
linux/amd64andlinux/arm64):
make docker-build IMAGE_TAG=latest BUILD_VERSION=1.2.3- Build a custom platform image or local image for your host (example
linux/arm64):
make docker-build PLATFORMS=linux/arm64 IMAGE_TAG=dev BUILD_VERSION=0.0.0-devRun tests :
make testing-build
make testing-runOpen http://localhost:3000 with your browser to see the result.
- Renovate old torrent dl media library with full FLAC
- Just for coding
- Just for fun

