使用 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
。目錄由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