Python을 사용하여 TIDAL 음악 서비스에서 손을 흔들고 있습니다. (적어도) Windows, macOS, GNU/Linux에서 실행됩니다.
TIDAL은 1억 곡이 넘는 노래를 HiFi 음질로 글로벌 음악 커뮤니티에 제공하는 아티스트 우선, 팬 중심 음악 스트리밍 플랫폼입니다. © 2024 타이달 뮤직 AS
이 프로젝트는 qobuz-dl
에서 영감을 얻었으며 특히 Tidal-Media-Downloader
의 연속입니다. 이 프로젝트는 개인적인 용도로만 사용할 수 있으며 저작권이 있는 콘텐츠를 배포할 수 없습니다 .
이 소프트웨어는 LGPLv2.1에 따른 FFmpeg 프로젝트의 라이브러리를 사용합니다. FFmpeg는 FFmpeg 프로젝트 창시자인 Fabrice Bellard의 상표입니다.
requests
패키지를 사용하기 때문에 시스템 프록시(HTTP, HTTPs, Socks)가 존중됩니다. 또는 일반적인 환경 변수로 지정할 수 있습니다.requests
사용하기 때문에 CacheControl
통해 매우 간단한 Cache-Control
요청 캐싱이 발생합니다. tidal-wave
실행하려면 현재 유효한 TIDAL 구독이 필요합니다. 이전에 TIDAL은 사용 가능한 오디오 품질을 HiFi 및 HiFi Plus 계획으로 분류했습니다.
현재의 모든 TIDAL 요금제는 완전 무손실, HiRes FLAC 및 Dolby Atmos(최대 24비트, 192kHz)와 같은 최대 음질 형식을 제공합니다.
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
프로그램을 GNU LGPL(Lesser General Public License) 버전 2.1을 사용하여 FFmpeg 조건에 따라 라이선스가 부여된 하나의 바이너리로 묶습니다. 설치는 플랫폼에 맞는 올바른 바이너리를 다운로드하여 실행 권한을 부여하고 실행하는 것만큼 간단합니다. 다운로드한 파일의 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. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
이 도구를 호출하면 사용자의 "home" 디렉터리에 있는 특정 디렉터리에 자격 증명이 저장됩니다. Unix 계열 시스템의 경우 이는 /home/${USER}/.config/tidal-wave
입니다. Windows의 경우 다양합니다. 어느 OS 상황에서든 정확한 디렉토리는 platformdirs
패키지의 user_config_path()
함수에 의해 결정됩니다.
마찬가지로, 기본적으로 검색된 모든 미디어는 사용자의 기본 음악 디렉토리의 하위 디렉토리에 배치됩니다. Unix 계열 시스템의 경우 이는 아마도 /home/${USER}/Music
입니다. Windows의 경우 아마도 C:Users<USER>Music
일 것입니다. 이 디렉터리는 platformdirs.user_music_path()
에 의해 결정됩니다.
output_directory
에 다른 경로가 전달되면 모든 미디어가 해당 디렉터리의 하위 디렉터리에 기록됩니다.출처: 타이달
낮은 | 높은 | 무손실 | 고해상도 FLAC | 돌비 애트모스 | 비디오(H.264 + AAC) | |
---|---|---|---|---|---|---|
기계적 인조 인간 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
소방 TV? | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
윈도우 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
? 이는 스푸핑된 Amazon Fire TV인 tidal-wave
의 기본 클라이언트입니다. --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
의 첫 번째 인수로 전달하면 됩니다. 무손실 품질의 앨범/아티스트/믹스/재생 목록/트랙을 사용자 음악 디렉터리의 하위 디렉터리로 검색하고 경우에 INFO 수준 로깅을 수행합니다. 오디오; 비디오 URL의 경우 INFO 수준 로깅을 사용하여 1080p, H.264+AAC 품질의 비디오를 사용자 음악 디렉터리의 하위 디렉터리로 검색합니다 . (.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- 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
실행할 수 있는 장기간 컨테이너를 원할 것입니다. 이는 특히 Unraid 사용자를 위해 GitHub 토론에서 요청한 기능 중 하나입니다. 이를 수행하려면 다음과 같이 약간 수정된 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