Размахиваю музыкальным сервисом TIDAL с Python. Работает (как минимум) на Windows, macOS и GNU/Linux.
TIDAL — это платформа потоковой передачи музыки, ориентированная на исполнителей и фанатов, которая предоставляет мировому музыкальному сообществу более 100 миллионов песен в качестве звука HiFi. © 2024 TIDAL Music AS
Этот проект вдохновлен qobuz-dl
и, в частности, является продолжением Tidal-Media-Downloader
. Этот проект предназначен только для частного использования: он не предназначен для распространения контента, защищенного авторским правом .
Это программное обеспечение использует библиотеки из проекта FFmpeg под лицензией LGPLv2.1. FFmpeg — торговая марка Фабриса Беллара, создателя проекта FFmpeg.
requests
учитываются системные прокси (HTTP, HTTPs, Socks); или может быть задан типичной переменной средыrequests
происходит очень простое кэширование запросов Cache-Control
через CacheControl
Для запуска tidal-wave
необходима текущая действующая подписка TIDAL. Раньше TIDAL разделял доступные качества звука на планы HiFi и HiFi Plus: теперь
Все текущие планы TIDAL поддерживают форматы максимального качества звука, такие как Full Lossless, HiRes FLAC и Dolby Atmos (до 24 бит, 192 кГц).
Дополнительную информацию о качестве звука можно найти на сайте TIDAL здесь.
ffmpeg
.chocolatey
- вариантbackoff
cachecontrol
dataclass-wizard
ffmpeg-python
mutagen
m3u8
platformdirs
pycryptodome
requests[socks]
typer
pip
Установить из PyPi Установите этот проект с помощью pip
: либо в виртуальной среде (предпочтительно), либо любым другим способом:
# 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
Установить из репозитория Альтернативно вы можете клонировать этот репозиторий; cd
в него; и установить оттуда:
$ 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 .
Артефакты выпуска для этого проекта создаются с помощью PyInstaller. Он объединяет Python 3.12.6, FFmpeg 7.0 и программу tidal-wave
в один двоичный файл, лицензируемый на условиях FFmpeg: с GNU Lesser General Public License (LGPL) версии 2.1. Установка так же проста, как загрузка правильного двоичного файла для вашей платформы, предоставление ему разрешений на выполнение и его запуск. Убедитесь, что контрольная сумма SHA256 загруженного вами файла соответствует соответствующему файлу .sha256
на странице релизов!
$ 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
Извлеките изображение из репозитория контейнера 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
Если местоположение вашей установки Python доступно по пути, запустите tidal-wave --help
чтобы просмотреть доступные параметры. В противном случае (в том числе если вы выполнили описанные выше шаги по клонированию репозитория) запустите python3 -m tidal_wave --help
из корневого каталога репозитория, tidal-wave
. В любом случае вы должны увидеть что-то вроде следующего:
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. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
При вызове этого инструмента учетные данные сохраняются в определенном каталоге «домашнего» каталога пользователя: для Unix-подобных систем это будет /home/${USER}/.config/tidal-wave
: для Windows это может варьироваться: в В любой ситуации с ОС точный каталог определяется функцией user_config_path()
пакета platformdirs
.
Аналогично, по умолчанию все извлеченные медиафайлы помещаются в подкаталоги музыкального каталога пользователя по умолчанию: для Unix-подобных систем это, вероятно, /home/${USER}/Music
; для Windows это, вероятно, C:Users
. Этот каталог определяется platformdirs.user_music_path()
.
output_directory
, передается другой путь, то все носители записываются в подкаталоги этого каталога.Источник: ТИДАЛ
Низкий | Высокий | без потерь | Высокое разрешение FLAC | Долби Атмос | Видео (H.264 + AAC) | |
---|---|---|---|---|---|---|
Андроид | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Огонь телевизор? | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Окна | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
? Это клиент по умолчанию для tidal-wave
— поддельного Amazon Fire TV. Он вызывается во всех ситуациях, если только --audio-format hires
не передан как флаг командной строки:
$ 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
Для отладки и, возможно, использования нескольких версий программного обеспечения, безусловно, полезно знать, какая версия какого двоичного файла/пакета вызывается. Начиная с версии 2024.7.1 tidal-wave
это возможно путем добавления флага --version
к любой команде. На языке typer
это нетерпеливая команда, означающая, что любой другой флаг или аргумент, переданный в tidal-wave
будет игнорироваться, и будет просто возвращена версия. Например
$ tidal-wave --version
tidal-wave 2024.7.1
tidal-wave
без каких-либо других аргументов, чтобы: получить альбом/исполнителя/микс/список воспроизведения/трек в качестве без потерь в подкаталог музыкального каталога пользователя и ведение журнала на уровне INFO в этом случае. аудио; получить видео в формате 1080p, качество H.264+AAC в подкаталог музыкального каталога пользователя с журналированием на уровне INFO в случае URL-адреса видео. (.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
Имейте в виду, что для доступа к трекам HiRes FLAC необходимо извлечь токен доступа с устройства Android (предпочтительно), Windows или macOS.
$ tidal-wave https://tidal.com/browse/album/... --audio-format hires --loglevel warning
--audio-format
при получении видео невозможна. PS > C:UsersUser > & tidal-wave_windows.exe https: // tidal.com / browse / playlist / ...
--audio-format
при получении видео невозможна. $ ./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
. В каталоге, где вызывается tidal-wave
, --transparent
запишет ответы от TIDAL API в файлы .json. (.venv) $ tidal-wave https://listen.tidal.com/track/... --audio-format low --loglevel debug --transparent
По умолчанию, при передаче URL-адреса плейлиста или микса, tidal-wave
извлечет все треки и/или видео, указанные по этому URL-адресу, и запишет их в подкаталог Playlists
или Mixes
, который сам по себе является подкаталогом указанного output_directory
. Например, ~/Music/Mixes/My Daily Discovery [016dccd302e9ac6132d8334cfbc022]
. В этом каталоге после извлечения всех дорожек и/или видео они переименовываются в зависимости от порядка, в котором они появляются в списке воспроизведения. Например
(.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 '
Если это нежелательное поведение, передайте флаг --no-flatten
. Этот флаг предписывает tidal-wave
оставить треки и/или видео в каталоге, куда они были бы записаны, если бы они были переданы tidal-wave
независимо. Например
(.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 '
Параметры командной строки те же, что и при вызове Python, но для сохранения конфигурации и аудиоданных необходимо передать тома. Если они привязаны к каталогам, их необходимо создать перед выполнением docker run
чтобы избежать проблем с разрешениями ! Например,
$ 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/...
Использование Docker может быть привлекательной идеей, если вы хотите получить все видео, альбомы, EP и синглы в максимально возможном качестве для данного исполнителя. Следующий вызов Docker сделает это за вас:
$ 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
Возможно, вам нужен не однократный исполняемый тип вызова Docker, а скорее долгоживущий контейнер, в котором можно docker exec
, чтобы запросить носитель на досуге. Это одна из запрошенных функций в обсуждениях GitHub, особенно для пользователей Unraid. Для этого используйте следующую слегка измененную команду Docker:
$ 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/...
Примечание: первая tidal-wave
— это любое --name
вы дадите контейнеру, так что это может быть все, что душе угодно, но вторая tidal-wave
вызывает программу Python внутри контейнера и должна именно tidal-wave
.
Самый простой способ начать работу над разработкой — создать форк этого проекта на GitHub или клонировать репозиторий на свой локальный компьютер и позже выполнить запрос на включение на GitHub. В любом случае сначала нужно будет что-то получить с GitHub, поэтому, грубо говоря, процесс таков:
$ 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