Saluer le service musical TIDAL avec Python. Fonctionne sur (au moins) Windows, macOS et GNU/Linux.
TIDAL est une plateforme de streaming musical axée sur les artistes et les fans, qui propose plus de 100 millions de chansons en qualité sonore HiFi à la communauté musicale mondiale. © 2024 TIDAL Music AS
Ce projet s'inspire de qobuz-dl
, et, notamment, est une continuation de Tidal-Media-Downloader
. Ce projet est destiné à un usage privé uniquement : il n'est pas destiné à la distribution de contenu protégé par le droit d'auteur .
Ce logiciel utilise les bibliothèques du projet FFmpeg sous LGPLv2.1. FFmpeg est une marque de Fabrice Bellard, initiateur du projet FFmpeg.
requests
, les proxys du système sont respectés (HTTP, HTTPs, Socks) ; ou peut être spécifié par une variable d'environnement typiquerequests
, une mise en cache très simple des requêtes Cache-Control
se produit via CacheControl
Un abonnement TIDAL actuel et valide est requis pour exécuter tidal-wave
. Auparavant, TIDAL segmentait les qualités audio disponibles en forfaits HiFi et HiFi Plus : désormais,
Tous les forfaits TIDAL actuels proposent des formats de qualité sonore maximale tels que Full Lossless, HiRes FLAC et Dolby Atmos (jusqu'à 24 bits, 192 kHz).
Plus d'informations sur la qualité sonore sur le site de TIDAL ici.
ffmpeg
.chocolatey
est une optionbackoff
cachecontrol
dataclass-wizard
ffmpeg-python
mutagen
m3u8
platformdirs
pycryptodome
requests[socks]
typer
pip
Installer depuis PyPi Installez ce projet avec pip
: soit avec un environnement virtuel (de préférence) ou de toute autre manière que vous désirez :
# GNU/Linux or macOS or Android (e.g. Termux)
$ python3 -m pip install tidal-wave
# Windows
PS > python.exe - m pip install tidal - wave
pip
Installer à partir du référentiel Alternativement, vous pouvez cloner ce référentiel ; cd
dedans ; et installez à partir de là :
$ git clone --depth=1 https://github.com/ebb-earl-co/tidal-wave.git
$ cd tidal-wave
$ python3 -m venv .venv
$ source .venv/bin/activate
$ (.venv) pip install .
Les artefacts de version pour ce projet sont créés avec PyInstaller. Il regroupe Python 3.12.6, FFmpeg 7.0 et le programme tidal-wave
en un seul binaire, sous licence selon les termes de FFmpeg : avec la licence GNU Lesser General Public License (LGPL) version 2.1. L'installation est aussi simple que de télécharger le binaire correct pour votre plate-forme en lui donnant les autorisations d'exécution et en l'exécutant. Veuillez vous assurer que la somme de contrôle SHA256 du fichier que vous avez téléchargé correspond au fichier .sha256
correspondant sur la page des versions !
$ wget https://github.com/ebb-earl-co/tidal-wave/releases/latest/download/tidal-wave_ubuntu_24.04_amd64
$ wget https://github.com/ebb-earl-co/tidal-wave/releases/latest/download/tidal-wave_ubuntu_24.04_amd64.sha256
$ sha256sum --check tidal-wave_ubuntu_24.04_amd64.sha256
# ONLY CONTINUE IF THE OUTPUT IS THE FOLLOWING: 'tidal-wave_ubuntu_24.04_amd64.sha256: OK'
# Otherwise, delete the downloaded binary and try to download it again
$ chmod +x ./tidal-wave_ubuntu_24.04_amd64
$ ./tidal-wave_ubuntu_24.04_amd64 --help
# For just the lifetime of this PowerShell process, don't block the download from GitHub
PS > Set-ExecutionPolicy - ExecutionPolicy Bypass - Scope Process
PS > Invoke-WebRequest " https://github.com/ebb-earl-co/tidal-wave/releases/latest/download/tidal-wave_windows.exe " - OutFile " tidal-wave_windows.exe "
PS > Invoke-WebRequest " https://github.com/ebb-earl-co/tidal-wave/releases/latest/download/tidal-wave_windows.exe.sha256 " - OutFile " tidal-wave_windows.exe.sha256 "
# Get the checksum value from the tidal-wave_windows.exe.sha256 file and compare it to the just-downloaded EXE
# (Get-FileHash .tidal-wave_windows.exe -Algorithm SHA256).Hash -eq (Get-Content .tidal-wave_windows.exe.sha256)
PS > ( Get-FileHash . tidal-wave_windows.exe - Algorithm SHA256).Hash -eq " e02f69eb850a98e6e1df2bc033fd12566cf27305421a36ec5372fd432ccc8e70 " # This checksum is from version 2024.4.3
# ONLY CONTINUE IF THE OUTPUT OF THE PREVIOUS COMMAND IS 'True'
PS > & . tidal-wave_windows.exe -- help
Extrayez l'image du dépôt de conteneur GitHub :
$ docker pull ghcr.io/ebb-earl-co/tidal-wave:latest
# Or, the main branch of this repository, which will be ahead of `latest`:
$ docker pull ghcr.io/ebb-earl-co/tidal-wave:trunk
Si l'emplacement de votre installation Python est disponible sur le chemin, exécutez tidal-wave --help
pour voir les options disponibles. Sinon (y compris si vous avez suivi les étapes de clonage du référentiel ci-dessus), exécutez python3 -m tidal_wave --help
à partir du répertoire racine du référentiel, tidal-wave
. Dans les deux cas, vous devriez voir quelque chose comme ce qui suit :
Usage: python -m tidal_wave [OPTIONS] TIDAL_URL [OUTPUT_DIRECTORY]
╭─ Arguments ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * tidal_url TEXT The Tidal album or artist or mix or playlist or track or video to download [default: None] [required] │
│ output_directory [OUTPUT_DIRECTORY] The parent directory under which directory(ies) of files will be written [default: ~ /Music] │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --audio-format [Atmos | HiRes | Lossless | High | Low] [default: Lossless] │
│ --loglevel [DEBUG | INFO | WARNING | ERROR | CRITICAL] [default: INFO] │
│ --include-eps-singles No-op unless passing TIDAL artist. Whether to include artist ' s EPs and singles with albums │
│ --no-extra-files Whether to not even attempt to retrieve artist bio, artist image, album credits, album review, or playlist m3u8 │
│ --no-flatten Whether to treat playlists or mixes as a list of tracks/videos and, as such, retrieve them independently │
| --transparent Whether to dump JSON responses from TIDAL API; maximum verbosity |
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
L'invocation de cet outil stockera les informations d'identification dans un répertoire particulier du répertoire « home » de l'utilisateur : pour les systèmes de type Unix, ce sera /home/${USER}/.config/tidal-wave
: pour Windows, cela varie : Quelle que soit la situation du système d'exploitation, le répertoire exact est déterminé par la fonction user_config_path()
du package platformdirs
.
De même, par défaut, tous les médias récupérés sont placés dans des sous-répertoires du répertoire musical par défaut de l'utilisateur : pour les systèmes de type Unix, il s'agit probablement de /home/${USER}/Music
; pour Windows, il s'agit probablement C:Users<USER>Music
. Ce répertoire est déterminé par platformdirs.user_music_path()
.
output_directory
, alors tous les médias sont écrits dans les sous-répertoires de ce répertoire.Source : MARÉE
Faible | Haut | Sans perte | Embauche FLAC | Dolby Atmos | Vidéo (H.264 + AAC) | |
---|---|---|---|---|---|---|
Androïde | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Télévision sur le feu ? | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Fenêtres | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
? Il s'agit du client par défaut pour tidal-wave
, un Amazon Fire TV usurpé. C'est celui invoqué dans toutes les situations, sauf si --audio-format hires
est passé comme indicateur de ligne de commande :
$ tidal-wave https://listen.tidal.com/album/000000
$ # no --audio-format flag passed will instruct tidal-wave to use the Fire TV client, as it implies --audio-format lossless
$ tidal-wave https://listen.tidal.com/album/000000 --audio-format high
$ # specifying low, high, lossless, or atmos will instruct tidal-wave to use the Fire TV client
$ tidal-wave https://listen.tidal.com/album/000000 --audio-format hires
$ # the above forces tidal-wave to ask for an access token gleaned from an Android, macOS, or Windows device, as laid out in the above table
Il est certainement utile pour le débogage et, peut-être, pour l'utilisation de plusieurs versions d'un logiciel, de savoir quel binaire/paquet invoqué est quelle version. À partir de la version 2024.7.1 de tidal-wave
, cela est possible en ajoutant l'indicateur --version
à n'importe quelle commande. Il s'agit d'une commande hâtive , dans le langage typer
, ce qui signifie que tout autre indicateur ou argument passé à tidal-wave
sera ignoré et la version sera simplement renvoyée. Par exemple
$ tidal-wave --version
tidal-wave 2024.7.1
tidal-wave
sans autre argument afin de : récupérer l'album/artiste/mix/playlist/track en qualité sans perte dans un sous-répertoire du répertoire musical de l'utilisateur et une journalisation au niveau INFO dans le cas du son ; récupérez la vidéo en qualité 1080p, H.264+AAC dans un sous-répertoire du répertoire musical de l'utilisateur avec journalisation au niveau INFO dans le cas d'une URL vidéo. (.venv) $ tidal-wave https://tidal.com/browse/track/226092704
--no-extra-files
: (.venv) $ tidal-wave https://tidal.com/browse/track/226092704 --no-extra-files
(.venv) $ tidal-wave https://tidal.com/browse/track/... --audio-format atmos --loglevel debug
Gardez à l'esprit qu'un jeton d'accès d'un appareil Android (de préférence), Windows ou macOS devra être extrait et transmis à cet outil afin d'accéder aux pistes HiRes FLAC.
$ tidal-wave https://tidal.com/browse/album/... --audio-format hires --loglevel warning
--audio-format
n'est pas une opération lors de la récupération de vidéos. PS > C:UsersUser > & tidal-wave_windows.exe https: // tidal.com / browse / playlist / ...
--audio-format
n'est pas une opération lors de la récupération de vidéos. $ ./tidal-wave_ubuntu_24.04_amd64 https://tidal.com/browse/mix/...
(.venv) $ python3 -m tidal_wave https://listen.tidal.com/artist/... --audio-format high --loglevel debug
(.venv) $ tidal-wave https://listen.tidal.com/artist/... --audio-format hires --include-eps-singles
--transparent
. Dans le répertoire où tidal-wave
est appelé, --transparent
écrira les réponses de l'API TIDAL dans les fichiers .json (.venv) $ tidal-wave https://listen.tidal.com/track/... --audio-format low --loglevel debug --transparent
Par défaut, lorsqu'on lui transmet une liste de lecture ou une URL de mixage, tidal-wave
récupérera toutes les pistes et/ou vidéos spécifiées par cette URL et les écrira dans un sous-répertoire de Playlists
ou Mixes
, qui est lui-même un sous-répertoire du output_directory
spécifié. . Par exemple ~/Music/Mixes/My Daily Discovery [016dccd302e9ac6132d8334cfbc022]
. Dans ce répertoire, une fois tous les morceaux et/ou vidéos récupérés, ils sont renommés en fonction de leur ordre d'apparition dans la playlist. Par exemple
(.venv) $ tidal-wave https://listen.tidal.com/playlist/1b418bb8-90a7-4f87-901d-707993838346
$ ls ~ /Music/Playlists/New Arrivals [1b418bb8-90a7-4f87-901d-707993838346]/
' 001 - Dance Alone [CD].flac '
' 002 - Kissing Strangers [CD].flac '
' 003 - Sunday Service [CD].flac '
Si ce n'est pas le comportement souhaité, transmettez l'indicateur --no-flatten
. Ce drapeau indique tidal-wave
de laisser les pistes et/ou vidéos dans le répertoire où elles auraient été écrites si elles avaient été passées à tidal-wave
indépendamment. Par exemple
(.venv) $ tidal-wave https://listen.tidal.com/playlist/1b418bb8-90a7-4f87-901d-707993838346 --no-flatten
$ ls ~ /Music/
' Sia/Dance Alone [343225498] [2024]/01 - Dance Alone [CD].flac '
' USHER/COMING HOME [339249017] [2024]/05 - Kissing Strangers [CD].flac '
' Latto/Sunday Service [344275657] [2024]/01 - Sunday Service [CD].flac '
Les options de ligne de commande sont les mêmes pour l'invocation Python, mais afin de sauvegarder la configuration et les données audio, des volumes doivent être transmis. S'il s'agit de montages liés à des répertoires, ils doivent être créés avant d'exécuter docker run
pour éviter les problèmes d'autorisations ! Par exemple,
$ mkdir -p ./Music/ ./config/tidal-wave/
$ docker run
--rm -it
--name tidal-wave
--volume ./Music:/home/debian/Music
--volume ./config/tidal-wave:/home/debian/.config/tidal-wave
ghcr.io/ebb-earl-co/tidal-wave:latest
https://tidal.com/browse/track/...
Utiliser Docker peut être une idée intéressante si vous souhaitez récupérer toutes les vidéos, albums, EP et singles avec la meilleure qualité possible pour un artiste donné. L'invocation Docker suivante le fera pour vous :
$ mkdir -p ./Music/ ./config/tidal-wave/
$ docker run
--name tidal-wave
--rm -it
--volume ./Music:/home/debian/Music
--volume ./config/tidal-wave:/home/debian/.config/tidal-wave
ghcr.io/ebb-earl-co/tidal-wave:latest
https://listen.tidal.com/artist/...
--audio-format hires
--include-eps-singles
Peut-être ne voulez-vous pas d'un type d'invocation Docker exécutable en une seule fois, mais plutôt d'un conteneur de longue durée dans lequel on peut docker exec
afin de demander des médias à loisir. C'est l'une des fonctionnalités demandées dans les discussions GitHub, notamment pour les utilisateurs d'Unraid. Pour ce faire, utilisez la commande Docker suivante, légèrement modifiée :
$ mkdir -p ./Music/ ./config/tidal-wave/
$ docker run
--name tidal-wave
-dit # is short for: --detach --interactive --tty
--volume ./Music:/home/debian/Music
--volume ./config/tidal-wave:/home/debian/.config/tidal-wave
--entrypoint " /bin/bash "
ghcr.io/ebb-earl-co/tidal-wave:latest
$ docker exec -it tidal-wave tidal-wave https://tidal.com/browse/album/...
$ docker exec -it tidal-wave tidal-wave https://tidal.com/browse/mix/...
$ docker exec -it tidal-wave tidal-wave https://tidal.com/browse/playlist/...
$ docker exec -it tidal-wave tidal-wave https://tidal.com/browse/track/...
Remarque : le premier tidal-wave
est le --name
que vous donnez au conteneur, cela peut donc être tout ce que votre cœur désire, mais le deuxième tidal-wave
invoque le programme Python à l'intérieur du conteneur et doit exactement tidal-wave
.
Le moyen le plus simple de commencer à travailler sur le développement est de créer ce projet sur GitHub ou de cloner le référentiel sur votre machine locale et d'effectuer la demande d'extraction sur GitHub plus tard. Dans tous les cas, il faudra d'abord obtenir des informations depuis GitHub, donc, en gros, le processus est le suivant :
$ git clone --depth=1 https://github.com/ebb-earl-co/tidal-wave/git
* Obviously replace the URL with your forked version if you've followed that strategy
(some-virtual-env) $ python3 -m pip install -r requirements.txt
* optional packages to follow the coding style and build process; `pyinstaller`, `black`: `(some-virtual-env) $ python3 -m pip install black pyinstaller`
* optionally, Docker to build the OCI container artifacts
from tidal_wave import album , artist , dash , hls , login , main , media , mix , models , oauth , playlist , requesting , track , utils , video
from tidal_wave . main import logging , user_music_path , Path