โบกมือให้กับบริการเพลง TIDAL ด้วย Python ทำงานบน (อย่างน้อย) Windows, macOS และ GNU/Linux
TIDAL เป็นแพลตฟอร์มสตรีมเพลงที่เน้นศิลปินเป็นหลักและเน้นแฟนๆ เป็นหลัก ซึ่งส่งมอบเพลงมากกว่า 100 ล้านเพลงในคุณภาพเสียงแบบ HiFi สู่ชุมชนดนตรีทั่วโลก © 2024 TIDAL Music AS
โปรเจ็กต์นี้ได้รับแรงบันดาลใจจาก qobuz-dl
และโดยเฉพาะอย่างยิ่งคือความต่อเนื่องของ Tidal-Media-Downloader
โครงการนี้มีไว้สำหรับการใช้งานส่วนตัวเท่านั้น: ไม่ได้มีไว้สำหรับการเผยแพร่เนื้อหาที่มีลิขสิทธิ์
ซอฟต์แวร์นี้ใช้ไลบรารีจากโครงการ FFmpeg ภายใต้ LGPLv2.1 FFmpeg เป็นเครื่องหมายการค้าของ Fabrice Bellard ผู้ก่อตั้งโครงการ FFmpeg
requests
พร็อกซีของระบบจึงได้รับการเคารพ (HTTP, HTTPs, Socks) หรือสามารถระบุได้ด้วยตัวแปรสภาพแวดล้อมทั่วไปrequests
Cache-Control
แคชที่ง่ายมากจึงเกิดขึ้นผ่าน CacheControl
จำเป็นต้องสมัครสมาชิก TIDAL ที่ถูกต้องในปัจจุบันเพื่อเรียกใช้ tidal-wave
ก่อนหน้านี้ TIDAL ได้แบ่งคุณภาพเสียงที่มีอยู่ออกเป็นแผน HiFi และ HiFi Plus: ตอนนี้
แผน TIDAL ในปัจจุบันทั้งหมดมีรูปแบบคุณภาพเสียงสูงสุด เช่น Full Lossless, HiRes FLAC และ Dolby Atmos (สูงสุด 24 บิต, 192 kHz)
ข้อมูลเพิ่มเติมเกี่ยวกับคุณภาพเสียงที่เว็บไซต์ของ 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
ดึงรูปภาพจาก repo คอนเทนเนอร์ 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. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
การเรียกใช้เครื่องมือนี้จะจัดเก็บข้อมูลรับรองในไดเร็กทอรีเฉพาะในไดเร็กทอรี "home" ของผู้ใช้: สำหรับระบบที่คล้าย Unix จะเป็น /home/${USER}/.config/tidal-wave
: สำหรับ Windows จะแตกต่างกันไป: ใน ไม่ว่าสถานการณ์ OS ใดก็ตาม ไดเร็กทอรีที่แน่นอนจะถูกกำหนดโดยฟังก์ชัน user_config_path()
ของแพ็คเกจ platformdirs
ในทำนองเดียวกัน ตามค่าเริ่มต้น สื่อทั้งหมดที่ดึงมาจะถูกวางไว้ในไดเร็กทอรีย่อยของไดเร็กทอรีเพลงเริ่มต้นของผู้ใช้: สำหรับระบบที่คล้าย Unix อาจเป็น /home/${USER}/Music
; สำหรับ Windows อาจเป็น C:Users<USER>Music
ไดเร็กทอรีนี้ถูกกำหนดโดย platformdirs.user_music_path()
output_directory
สื่อทั้งหมดจะถูกเขียนไปยังไดเร็กทอรีย่อยของไดเร็กทอรีนั้นที่มา: TIDAL
ต่ำ | สูง | ไม่มีการสูญเสีย | HiRes 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
โดยไม่มีข้อโต้แย้งอื่นเพื่อ: ดึงข้อมูลอัลบั้ม/ศิลปิน/มิกซ์/เพลย์ลิสต์/แทร็กในคุณภาพแบบ Lossless ไปยังไดเร็กทอรีย่อยของไดเร็กทอรีเพลงของผู้ใช้และการบันทึกระดับ 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
โปรดทราบว่าจะต้องแยกโทเค็นการเข้าถึงจากอุปกรณ์ 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/...
การใช้ 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