Dem Musikdienst TIDAL mit Python zuwinken. Läuft (mindestens) unter Windows, macOS und GNU/Linux.
TIDAL ist eine künstlerorientierte, fanzentrierte Musik-Streaming-Plattform, die über 100 Millionen Songs in HiFi-Klangqualität an die globale Musik-Community liefert. © 2024 TIDAL Music AS
Dieses Projekt ist von qobuz-dl
inspiriert und insbesondere eine Fortsetzung von Tidal-Media-Downloader
. Dieses Projekt ist nur für den privaten Gebrauch bestimmt: Es ist nicht für die Verbreitung urheberrechtlich geschützter Inhalte bestimmt .
Diese Software verwendet Bibliotheken aus dem FFmpeg-Projekt unter LGPLv2.1. FFmpeg ist eine Marke von Fabrice Bellard, dem Urheber des FFmpeg-Projekts.
requests
Pakets werden System-Proxys respektiert (HTTP, HTTPs, Socks); oder kann durch eine typische Umgebungsvariable angegeben werdenrequests
erfolgt ein sehr einfaches Cache-Control
-Request-Caching über CacheControl
Zum Ausführen von tidal-wave
ist ein aktuelles, gültiges TIDAL-Abonnement erforderlich. Bisher hat TIDAL die verfügbaren Audioqualitäten in HiFi- und HiFi-Plus-Pläne unterteilt: Jetzt
Alle aktuellen TIDAL-Pläne bieten maximale Klangqualitätsformate wie Full Lossless, HiRes FLAC und Dolby Atmos (bis zu 24 Bit, 192 kHz).
Weitere Informationen zur Klangqualität finden Sie hier auf der Website von TIDAL.
ffmpeg
.chocolatey
ist eine Optionbackoff
cachecontrol
dataclass-wizard
ffmpeg-python
mutagen
m3u8
platformdirs
pycryptodome
requests[socks]
typer
pip
Von PyPi installieren Installieren Sie dieses Projekt mit pip
: entweder mit einer virtuellen Umgebung (bevorzugt) oder auf eine andere von Ihnen gewünschte Weise:
# 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
Installation aus dem Repository Alternativ können Sie dieses Repository klonen; cd
rein; und von dort installieren:
$ 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 .
Die Release-Artefakte für dieses Projekt werden mit PyInstaller erstellt. Es bündelt Python 3.12.6, FFmpeg 7.0 und das tidal-wave
-Programm in einer Binärdatei, lizenziert unter den Bedingungen von FFmpeg: mit der GNU Lesser General Public License (LGPL) Version 2.1. Die Installation ist so einfach wie das Herunterladen der richtigen Binärdatei für Ihre Plattform, das Erteilen von Ausführungsberechtigungen und das Ausführen. Bitte stellen Sie sicher, dass die SHA256-Prüfsumme der heruntergeladenen Datei mit der entsprechenden .sha256
Datei auf der Release-Seite übereinstimmt!
$ 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
Rufen Sie das Image aus dem GitHub-Container-Repository ab:
$ 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
Wenn der Speicherort Ihrer Python-Installation im Pfad verfügbar ist, führen Sie tidal-wave --help
aus, um die verfügbaren Optionen anzuzeigen. Andernfalls (auch wenn Sie die oben genannten Schritte zum Klonen des Repositorys befolgt haben) führen Sie python3 -m tidal_wave --help
im Repository-Stammverzeichnis tidal-wave
aus. In beiden Fällen sollten Sie etwa Folgendes sehen:
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. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Durch den Aufruf dieses Tools werden Anmeldeinformationen in einem bestimmten Verzeichnis im „Home“-Verzeichnis des Benutzers gespeichert: Bei Unix-ähnlichen Systemen ist dies /home/${USER}/.config/tidal-wave
; bei Windows variiert es: in In beiden Betriebssystemsituationen wird das genaue Verzeichnis durch die Funktion user_config_path()
des Pakets platformdirs
bestimmt.
Ebenso werden alle abgerufenen Medien standardmäßig in Unterverzeichnissen des Standard-Musikverzeichnisses des Benutzers abgelegt: Bei Unix-ähnlichen Systemen ist dies wahrscheinlich /home/${USER}/Music
; für Windows ist es wahrscheinlich C:Users
. Dieses Verzeichnis wird durch platformdirs.user_music_path()
bestimmt.
output_directory
ein anderer Pfad übergeben wird, werden alle Medien in Unterverzeichnisse dieses Verzeichnisses geschrieben.Quelle: TIDAL
Niedrig | Hoch | Verlustfrei | HiRes FLAC | Dolby Atmos | Video (H.264 + AAC) | |
---|---|---|---|---|---|---|
Android | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Fire-TV? | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Windows | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
? Dies ist der Standard-Client für tidal-wave
, ein gefälschtes Amazon Fire TV. Es wird in allen Situationen aufgerufen, es sei denn, --audio-format hires
wird als Befehlszeilen-Flag übergeben:
$ 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
Für das Debuggen und möglicherweise die Verwendung mehrerer Versionen einer Software ist es sicherlich nützlich zu wissen, welche Binärdatei/welches aufgerufene Paket welche Version hat. Ab Version 2024.7.1 von tidal-wave
ist dies durch Hinzufügen des Flags --version
zu jedem Befehl möglich. Dies ist im typer
ein eifriger Befehl, der bedeutet, dass alle anderen Flags oder Argumente, die an tidal-wave
übergeben werden, ignoriert werden und die Version einfach zurückgegeben wird. Z.B
$ tidal-wave --version
tidal-wave 2024.7.1
tidal-wave
, um: das Album/den Künstler/den Mix/die Wiedergabeliste/den Titel in verlustfreier Qualität in ein Unterverzeichnis des Musikverzeichnisses des Benutzers abzurufen und in diesem Fall eine Protokollierung auf INFO-Ebene durchzuführen von Audio; Rufen Sie das Video in 1080p, H.264+AAC-Qualität in ein Unterverzeichnis des Musikverzeichnisses des Benutzers mit Protokollierung auf INFO-Ebene im Falle einer Video-URL ab. (.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
Beachten Sie, dass ein Zugriffstoken von einem Android- (bevorzugt), Windows- oder macOS-Gerät extrahiert und an dieses Tool übergeben werden muss, um auf HiRes FLAC-Tracks zugreifen zu können
$ tidal-wave https://tidal.com/browse/album/... --audio-format hires --loglevel warning
--audio-format
ist beim Abrufen von Videos ein No-Op. PS > C:UsersUser > & tidal-wave_windows.exe https: // tidal.com / browse / playlist / ...
--audio-format
ist beim Abrufen von Videos ein No-Op. $ ./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
. In dem Verzeichnis, in dem tidal-wave
aufgerufen wird, schreibt --transparent
die Antworten von der TIDAL-API in .json-Dateien (.venv) $ tidal-wave https://listen.tidal.com/track/... --audio-format low --loglevel debug --transparent
Standardmäßig ruft tidal-wave
bei Übergabe einer Playlist- oder Mix-URL alle von dieser URL angegebenen Titel und/oder Videos ab und schreibt sie in ein Unterverzeichnis von Playlists
oder Mixes
, das wiederum ein Unterverzeichnis des angegebenen output_directory
ist . ZB ~/Music/Mixes/My Daily Discovery [016dccd302e9ac6132d8334cfbc022]
. Sobald alle Titel und/oder Videos in diesem Verzeichnis abgerufen wurden, werden sie basierend auf der Reihenfolge, in der sie in der Wiedergabeliste erscheinen, umbenannt. Z.B
(.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 '
Wenn dies nicht das gewünschte Verhalten ist, übergeben Sie das Flag --no-flatten
. Dieses Flag weist tidal-wave
an, die Tracks und/oder Videos in dem Verzeichnis zu belassen, in dem sie geschrieben worden wären, wenn sie unabhängig an tidal-wave
übergeben worden wären. Z.B
(.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 '
Die Befehlszeilenoptionen sind für den Python-Aufruf dieselben, aber um Konfigurations- und Audiodaten zu speichern, müssen Volumes übergeben werden. Wenn es sich um Bind-Mounts für Verzeichnisse handelt, müssen diese vor der Ausführung docker run
erstellt werden, um Berechtigungsprobleme zu vermeiden ! Zum Beispiel,
$ 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/...
Die Verwendung von Docker kann eine attraktive Idee sein, wenn Sie alle Videos, Alben, EPs und Singles eines bestimmten Künstlers in höchstmöglicher Qualität abrufen möchten. Der folgende Docker-Aufruf erledigt das für Sie:
$ 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
Vielleicht möchten Sie keinen ausführbaren Docker-Aufruf vom Typ „Single-Shot“, sondern einen langlebigen Container, in den man docker exec
ausführen kann, um nach Belieben Medien anzufordern. Dies ist eine der gewünschten Funktionen aus den GitHub-Diskussionen, insbesondere für Unraid-Benutzer. Verwenden Sie dazu den folgenden, leicht modifizierten Docker-Befehl:
$ 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/...
Hinweis: Die erste tidal-wave
ist der --name
den Sie dem Container geben. Das kann also alles sein, was Ihr Herz begehrt. Die zweite tidal-wave
ruft jedoch das Python-Programm im Container auf und muss genau tidal-wave
sein.
Der einfachste Weg, mit der Entwicklung zu beginnen, besteht darin, dieses Projekt auf GitHub zu forken oder das Repository auf Ihren lokalen Computer zu klonen und die Pull-Anfrage später auf GitHub durchzuführen. In jedem Fall muss zunächst etwas von GitHub abgerufen werden. Der Prozess sieht also ungefähr so aus:
$ 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