使用 Python 在 TIDAL 音乐服务上挥手致意。 (至少)在 Windows、macOS 和 GNU/Linux 上运行。
TIDAL 是一个以艺术家为先、以粉丝为中心的音乐流媒体平台,向全球音乐社区提供超过 1 亿首 HiFi 音质歌曲。 © 2024 TIDAL 音乐 AS
该项目受到qobuz-dl
的启发,特别是Tidal-Media-Downloader
的延续。该项目仅供私人使用:不用于分发受版权保护的内容。
该软件使用 LGPLv2.1 下的 FFmpeg 项目中的库。 FFmpeg 是 FFmpeg 项目创始人 Fabrice Bellard 的商标。
requests
包,系统代理受到尊重(HTTP、HTTPs、Socks);或者可以通过典型的环境变量指定requests
,非常简单的Cache-Control
请求缓存是通过CacheControl
发生的需要当前有效的 TIDAL 订阅才能运行tidal-wave
。此前,TIDAL 将可用的音频质量分为 HiFi 和 HiFi Plus 计划:现在,
当前所有 TIDAL 计划均采用 Max 音质格式,例如完全无损、HiRes FLAC 和杜比全景声(高达 24 位、192 kHz)。
有关音质的更多信息,请访问 TIDAL 网站。
ffmpeg
功能。chocolatey
是一种选择backoff
cachecontrol
dataclass-wizard
ffmpeg-python
mutagen
m3u8
platformdirs
pycryptodome
requests[socks]
typer
pip
使用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 宽通用公共许可证 (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
以查看可用选项。否则(包括如果您遵循上面的存储库克隆步骤),请从存储库根目录tidal-wave
运行python3 -m tidal_wave --help
。无论哪种情况,您都应该看到类似以下内容的内容:
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,它有所不同:无论哪种操作系统情况,确切的目录都由platformdirs
包的user_config_path()
函数确定。
同样,默认情况下,检索到的所有媒体都放置在用户默认音乐目录的子目录中:对于类 Unix 系统,这可能是/home/${USER}/Music
;对于 Windows,它可能是C:Users<USER>Music
。该目录由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
它对于调试当然很有用,并且也许可以使用软件的多个版本来了解调用的哪个二进制文件/包是哪个版本。从tidal-wave
版本 2024.7.1 开始,可以通过向任何命令添加--version
标志来实现这一点。用typer
话说,这是一个急切的命令,这意味着传递给tidal-wave
任何其他标志或参数都将被忽略,并且只会返回版本。例如
$ tidal-wave --version
tidal-wave 2024.7.1
tidal-wave
,不带其他参数,以便:以无损质量将专辑/艺术家/混音/播放列表/曲目检索到用户音乐目录的子目录以及案例中的信息级日志记录音频;在视频 URL 的情况下,将 1080p、H.264+AAC 质量的视频检索到用户音乐目录的子目录中,并使用 INFO 级日志记录。 (.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
请记住,需要提取来自 Android(首选)、Windows 或 macOS 设备的访问令牌并将其传递给此工具才能访问 HiRes FLAC 曲目
$ 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/...
如果您想要以尽可能高的质量检索给定艺术家的所有视频、专辑、EP 和单曲,那么使用 Docker 可能是一个有吸引力的想法。以下 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