Saludando al servicio de música TIDAL con Python. Se ejecuta en (al menos) Windows, macOS y GNU/Linux.
TIDAL es una plataforma de transmisión de música centrada en los fanáticos y centrada en los artistas que ofrece más de 100 millones de canciones con calidad de sonido HiFi a la comunidad musical global. © 2024 TIDAL Música AS
Este proyecto está inspirado en qobuz-dl
y, particularmente, es una continuación de Tidal-Media-Downloader
. Este proyecto está destinado únicamente para uso privado: no está destinado a la distribución de contenido protegido por derechos de autor .
Este software utiliza bibliotecas del proyecto FFmpeg bajo LGPLv2.1. FFmpeg es una marca registrada de Fabrice Bellard, creador del proyecto FFmpeg.
requests
, se respetan los proxies del sistema (HTTP, HTTPs, Socks); o puede especificarse mediante una variable de entorno típicarequests
, el almacenamiento en caché de solicitudes Cache-Control
es muy simple a través de CacheControl
Se requiere una suscripción TIDAL vigente y válida para poder ejecutar tidal-wave
. Anteriormente, TIDAL segmentaba las calidades de audio disponibles en planes HiFi y HiFi Plus: ahora,
Todos los planes TIDAL actuales cuentan con formatos de calidad de sonido máxima, como Full Lossless, HiRes FLAC y Dolby Atmos (hasta 24 bits, 192 kHz).
Más información sobre calidad de sonido en el sitio de TIDAL aquí.
ffmpeg
.chocolatey
es una opciónbackoff
cachecontrol
dataclass-wizard
ffmpeg-python
mutagen
m3u8
platformdirs
pycryptodome
requests[socks]
typer
pip
Instalar desde PyPi Instale este proyecto con pip
: ya sea con un entorno virtual (preferido) o de cualquier otra forma que desee:
# 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
Instalar desde el repositorio Alternativamente, puedes clonar este repositorio; cd
en él; e instalar desde allí:
$ 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 .
Los artefactos de lanzamiento para este proyecto se crean con PyInstaller. Incluye Python 3.12.6, FFmpeg 7.0 y el programa tidal-wave
en un binario, con licencia según los términos de FFmpeg: con la licencia pública general reducida (LGPL) de GNU versión 2.1. La instalación es tan simple como descargar el binario correcto para su plataforma, otorgarle permisos de ejecución y ejecutarlo. ¡Asegúrese de que la suma de verificación SHA256 del archivo que ha descargado coincida con el archivo .sha256
correspondiente en la página de lanzamientos!
$ 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
Extraiga la imagen del repositorio del contenedor de 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 la ubicación de su instalación de Python está disponible en la ruta, ejecute tidal-wave --help
para ver las opciones disponibles. De lo contrario (incluso si siguió los pasos anteriores para clonar el repositorio), ejecute python3 -m tidal_wave --help
desde el directorio raíz del repositorio, tidal-wave
. En cualquier caso, debería ver algo como lo siguiente:
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. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
La invocación de esta herramienta almacenará las credenciales en un directorio particular en el directorio "inicio" del usuario: para sistemas tipo Unix, este será /home/${USER}/.config/tidal-wave
: para Windows, varía: en En cualquier situación del sistema operativo, el directorio exacto lo determina la función user_config_path()
del paquete platformdirs
.
De manera similar, de forma predeterminada, todos los medios recuperados se colocan en subdirectorios del directorio de música predeterminado del usuario: para sistemas tipo Unix, probablemente sea /home/${USER}/Music
; para Windows probablemente sea C:Users
. Este directorio está determinado por platformdirs.user_music_path()
.
output_directory
, todos los medios se escriben en subdirectorios de ese directorio.Fuente: MAREA
Bajo | Alto | Sin pérdidas | Contrata FLAC | Dolby Atmos | Vídeo (H.264 + AAC) | |
---|---|---|---|---|---|---|
Androide | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
¿Fuego de televisión? | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macos | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
ventanas | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
? Este es el cliente predeterminado de tidal-wave
, un Amazon Fire TV falsificado. Es el que se invoca en todas las situaciones a menos que se pase --audio-format hires
como indicador de línea de comando:
$ 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
Sin duda es útil para depurar y, tal vez, usar múltiples versiones de un software, saber qué binario/paquete invocado es qué versión. A partir de la versión 2024.7.1 de tidal-wave
, esto es posible agregando el indicador --version
a cualquier comando. Este es un comando ansioso , en el lenguaje typer
, lo que significa que cualquier otra bandera o argumento pasado a tidal-wave
será ignorado y la versión simplemente será devuelta. P.ej
$ tidal-wave --version
tidal-wave 2024.7.1
tidal-wave
sin otros argumentos para: recuperar el álbum/artista/mezcla/lista de reproducción/pista en calidad Lossless a un subdirectorio del directorio de música del usuario y al registro a nivel de INFORMACIÓN en el caso. de audio; recupere el video en 1080p, calidad H.264+AAC en un subdirectorio del directorio de música del usuario con registro de nivel INFORMACIÓN en el caso de una URL de video. (.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
Tenga en cuenta que será necesario extraer un token de acceso de un dispositivo Android (preferido), Windows o macOS y pasarlo a esta herramienta para poder acceder a las pistas FLAC de alta resolución.
$ tidal-wave https://tidal.com/browse/album/... --audio-format hires --loglevel warning
--audio-format
no es una operación al recuperar videos. PS > C:UsersUser > & tidal-wave_windows.exe https: // tidal.com / browse / playlist / ...
--audio-format
no es una operación al recuperar videos. $ ./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
. En el directorio donde se llama tidal-wave
, --transparent
escribirá las respuestas de la API de TIDAL en archivos .json (.venv) $ tidal-wave https://listen.tidal.com/track/... --audio-format low --loglevel debug --transparent
De forma predeterminada, cuando se pasa una lista de reproducción o una URL de mezcla, tidal-wave
recuperará todas las pistas y/o videos especificados por esa URL y los escribirá en un subdirectorio de Playlists
o Mixes
, que a su vez es un subdirectorio del output_directory
especificado. . Por ejemplo, ~/Music/Mixes/My Daily Discovery [016dccd302e9ac6132d8334cfbc022]
. En este directorio, una vez recuperadas todas las pistas y/o vídeos, se les cambia el nombre según el orden en que aparecen en la lista de reproducción. P.ej
(.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 este no es el comportamiento deseado, pase la bandera --no-flatten
. Esta bandera indica tidal-wave
que deje las pistas y/o vídeos en el directorio donde se habrían escrito si se hubieran pasado a tidal-wave
de forma independiente. P.ej
(.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 '
Las opciones de la línea de comando son las mismas para la invocación de Python, pero para guardar la configuración y los datos de audio, es necesario pasar volúmenes. Si son montajes vinculados a directorios, deben crearse antes de ejecutar docker run
para evitar problemas de permisos . Por ejemplo,
$ 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/...
Usar Docker puede ser una idea atractiva en caso de que desees recuperar todos los vídeos, álbumes, EP y sencillos con la mayor calidad posible de un artista determinado. La siguiente invocación de Docker lo hará por usted:
$ 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
Quizás no desee un tipo de invocación de Docker ejecutable de un solo disparo, sino más bien un contenedor de larga duración en el que se pueda docker exec
para solicitar medios cuando lo desee. Esta es una de las características solicitadas en las Discusiones de GitHub, en particular para los usuarios de Unraid. Para hacer esto, use el siguiente comando Docker ligeramente modificado:
$ 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/...
Nota: el primer tidal-wave
es cualquier --name
que le dé al contenedor, por lo que puede ser lo que su corazón desee, pero el segundo tidal-wave
invoca el programa Python dentro del contenedor y necesita exactamente tidal-wave
.
La forma más sencilla de comenzar a trabajar en el desarrollo es bifurcar este proyecto en GitHub o clonar el repositorio en su máquina local y realizar la solicitud de extracción en GitHub más tarde. En cualquier caso, primero será necesario obtener algo de GitHub, por lo que, aproximadamente, el proceso es:
$ 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