Melambai di layanan musik TIDAL dengan Python. Berjalan di (setidaknya) Windows, macOS, dan GNU/Linux.
TIDAL adalah platform streaming musik pertama artis yang berpusat pada penggemar yang menghadirkan lebih dari 100 juta lagu dalam kualitas suara HiFi ke komunitas musik global. © 2024 Musik PASANG SURUT SEBAGAI
Proyek ini terinspirasi oleh qobuz-dl
, dan, khususnya, merupakan kelanjutan dari Tidal-Media-Downloader
. Proyek ini ditujukan untuk penggunaan pribadi saja: tidak dimaksudkan untuk distribusi konten berhak cipta .
Perangkat lunak ini menggunakan perpustakaan dari proyek FFmpeg di bawah LGPLv2.1. FFmpeg adalah merek dagang dari Fabrice Bellard, pencetus proyek FFmpeg.
requests
, proxy sistem dihormati (HTTP, HTTPs, Socks); atau dapat ditentukan oleh variabel lingkungan yang khasrequests
, cache permintaan Cache-Control
yang sangat sederhana terjadi melalui CacheControl
Langganan TIDAL yang valid saat ini diperlukan untuk menjalankan tidal-wave
. Sebelumnya, TIDAL mengelompokkan kualitas audio yang tersedia ke dalam paket HiFi dan HiFi Plus: sekarang,
Semua paket TIDAL saat ini menampilkan format kualitas suara Max seperti full lossless, HiRes FLAC, dan Dolby Atmos (hingga 24-bit, 192 kHz).
Informasi lebih lanjut tentang kualitas suara di situs TIDAL di sini.
ffmpeg
.chocolatey
adalah pilihanbackoff
cachecontrol
dataclass-wizard
ffmpeg-python
mutagen
m3u8
platformdirs
pycryptodome
requests[socks]
typer
pip
dari PyPi Instal proyek ini dengan pip
: baik dengan lingkungan virtual (lebih disukai) atau cara lain yang Anda inginkan:
# 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
Instal dari Repositori Alternatifnya, Anda dapat mengkloning repositori ini; cd
ke dalamnya; dan instal dari sana:
$ 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 .
Artefak rilis untuk proyek ini dibuat dengan PyInstaller. Ini menggabungkan Python 3.12.6, FFmpeg 7.0, dan program tidal-wave
ke dalam satu biner, dilisensikan berdasarkan ketentuan FFmpeg: dengan GNU Lesser General Public License (LGPL) versi 2.1. Instalasinya semudah mengunduh biner yang benar untuk platform Anda, memberinya izin eksekusi, dan menjalankannya. Harap pastikan bahwa checksum SHA256 dari file yang telah Anda unduh cocok dengan file .sha256
yang sesuai di halaman rilis!
$ 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
Tarik gambar dari repo kontainer 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
Jika lokasi instalasi Python Anda tersedia di jalurnya, jalankan tidal-wave --help
untuk melihat opsi yang tersedia. Jika tidak (termasuk jika Anda mengikuti langkah-langkah kloning repositori di atas), jalankan python3 -m tidal_wave --help
dari direktori root repositori, tidal-wave
. Apa pun kasusnya, Anda akan melihat sesuatu seperti berikut:
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. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Pemanggilan alat ini akan menyimpan kredensial dalam direktori tertentu di direktori "home" pengguna: untuk sistem mirip Unix, ini akan menjadi /home/${USER}/.config/tidal-wave
: untuk Windows, bervariasi: di baik situasi OS, direktori pastinya ditentukan oleh fungsi user_config_path()
dari paket platformdirs
.
Demikian pula, secara default, semua media yang diambil ditempatkan di subdirektori direktori musik default pengguna: untuk sistem mirip Unix, ini mungkin /home/${USER}/Music
; untuk Windows mungkin C:Users
. Direktori ini ditentukan oleh platformdirs.user_music_path()
.
output_directory
, maka semua media ditulis ke subdirektori dari direktori tersebut.Sumber: PASANG SURUT
Rendah | Tinggi | Tanpa kerugian | Pekerjakan FLAC | Dolby Atmos | Video (H.264 + AAC) | |
---|---|---|---|---|---|---|
Android | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
televisi api? | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
jendela | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
? Ini adalah klien default untuk tidal-wave
, Amazon Fire TV palsu. Ini adalah yang dipanggil dalam semua situasi kecuali --audio-format hires
diteruskan sebagai tanda baris perintah:
$ 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
Hal ini tentunya berguna untuk melakukan debug, dan, mungkin, menggunakan beberapa versi perangkat lunak, untuk mengetahui biner/paket mana yang dipanggil pada versi yang mana. Mulai tidal-wave
versi 2024.7.1, hal ini dapat dilakukan dengan menambahkan tanda --version
ke perintah apa pun. Ini adalah perintah yang sangat bersemangat , dalam bahasa typer
, yang berarti bahwa tanda atau argumen lain apa pun yang diteruskan ke tidal-wave
akan diabaikan dan versinya akan dikembalikan begitu saja. Misalnya
$ tidal-wave --version
tidal-wave 2024.7.1
tidal-wave
tanpa argumen lain untuk: mengambil album/artis/mix/playlist/track dalam kualitas Lossless ke subdirektori direktori musik pengguna dan pencatatan tingkat INFO dalam kasus tersebut audio; mengambil video dalam kualitas 1080p, H.264+AAC ke subdirektori direktori musik pengguna dengan pencatatan level INFO jika berupa URL video. (.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
Ingatlah bahwa token akses dari perangkat Android (lebih disukai), Windows, atau macOS perlu diekstraksi dan diteruskan ke alat ini untuk mengakses trek HiRes FLAC
$ tidal-wave https://tidal.com/browse/album/... --audio-format hires --loglevel warning
--audio-format
tidak boleh dilakukan saat mengambil video. PS > C:UsersUser > & tidal-wave_windows.exe https: // tidal.com / browse / playlist / ...
--audio-format
tidak boleh dilakukan saat mengambil video. $ ./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
. Di direktori tempat tidal-wave
dipanggil, --transparent
akan menulis respons dari TIDAL API ke file .json (.venv) $ tidal-wave https://listen.tidal.com/track/... --audio-format low --loglevel debug --transparent
Secara default, ketika melewati playlist atau URL campuran, tidal-wave
akan mengambil semua trek dan/atau video yang ditentukan oleh URL tersebut, dan menulisnya ke subdirektori Playlists
atau Mixes
, yang merupakan subdirektori dari output_directory
yang ditentukan . Misalnya ~/Music/Mixes/My Daily Discovery [016dccd302e9ac6132d8334cfbc022]
. Dalam direktori ini, setelah semua trek dan/atau video diambil, namanya akan diubah berdasarkan urutan kemunculannya dalam daftar putar. Misalnya
(.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 '
Jika ini bukan perilaku yang diinginkan, berikan tanda --no-flatten
. Bendera ini menginstruksikan tidal-wave
untuk meninggalkan trek dan/atau video di direktori tempat penulisannya jika diteruskan ke tidal-wave
secara independen. Misalnya
(.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 '
Opsi baris perintah sama untuk pemanggilan Python, tetapi untuk menyimpan konfigurasi dan data audio, volume harus diteruskan. Jika mereka mengikat ke direktori, mereka harus dibuat sebelum menjalankan docker run
untuk menghindari masalah izin ! Misalnya,
$ 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/...
Menggunakan Docker mungkin merupakan ide yang menarik jika Anda ingin mengambil semua video, album, EP, dan single dalam kualitas setinggi mungkin untuk artis tertentu. Doa Docker berikut akan melakukannya untuk Anda:
$ 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
Mungkin Anda tidak menginginkan jenis pemanggilan Docker yang dapat dieksekusi satu kali, melainkan wadah yang berumur panjang di mana seseorang dapat melakukan docker exec
untuk meminta media kapan saja. Ini adalah salah satu fitur yang diminta dari Diskusi GitHub, khususnya untuk pengguna Unraid. Untuk melakukan ini, gunakan perintah Docker berikut yang sedikit dimodifikasi:
$ 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/...
Catatan: tidal-wave
pertama adalah apa pun --name
yang Anda berikan pada wadahnya, sehingga bisa sesuai keinginan hati Anda, tetapi tidal-wave
kedua memanggil program Python di dalam wadah dan harus tepat tidal-wave
.
Cara termudah untuk mulai mengerjakan pengembangan adalah dengan melakukan fork proyek ini di GitHub, atau mengkloning repositori ke mesin lokal Anda dan melakukan permintaan tarik di GitHub nanti. Bagaimanapun, perlu ada yang mendapatkannya dari GitHub terlebih dahulu, jadi, kira-kira, prosesnya adalah:
$ 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