التلويح في خدمة الموسيقى TIDAL مع بايثون. يعمل على (على الأقل) أنظمة Windows وmacOS وGNU/Linux.
TIDAL هي منصة بث الموسيقى الأولى للفنانين والتي تركز على المعجبين والتي توفر أكثر من 100 مليون أغنية بجودة صوت HiFi لمجتمع الموسيقى العالمي. © 2024 تايدال ميوزيك AS
هذا المشروع مستوحى من qobuz-dl
، وهو على وجه الخصوص استمرار لـ Tidal-Media-Downloader
. هذا المشروع مخصص للاستخدام الخاص فقط: وليس مخصصًا لتوزيع محتوى محمي بحقوق الطبع والنشر .
يستخدم هذا البرنامج مكتبات من مشروع FFmpeg ضمن LGPLv2.1. FFmpeg هي علامة تجارية مملوكة لفابريس بيلارد، منشئ مشروع 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 كيلو هرتز).
مزيد من المعلومات حول جودة الصوت على موقع تايدال هنا.
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: مع الإصدار 2.1 من ترخيص GNU العام الأصغر (LGPL). التثبيت بسيط مثل تنزيل الملف الثنائي الصحيح للنظام الأساسي الخاص بك مما يمنحه أذونات التنفيذ وتشغيله. الرجاء التأكد من أن المجموع الاختباري 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
لرؤية الخيارات المتاحة. بخلاف ذلك (بما في ذلك إذا اتبعت خطوات استنساخ المستودع المذكورة أعلاه)، قم بتشغيل 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. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
سيؤدي استدعاء هذه الأداة إلى تخزين بيانات الاعتماد في دليل معين في الدليل "الرئيسي" الخاص بالمستخدم: بالنسبة للأنظمة المشابهة لنظام Unix، سيكون هذا هو /home/${USER}/.config/tidal-wave
: بالنسبة لنظام التشغيل Windows، يختلف الأمر: في سواء في حالة نظام التشغيل، يتم تحديد الدليل الدقيق بواسطة وظيفة user_config_path()
لحزمة platformdirs
.
وبالمثل، بشكل افتراضي، يتم وضع جميع الوسائط المستردة في أدلة فرعية لدليل الموسيقى الافتراضي للمستخدم: بالنسبة للأنظمة المشابهة لنظام Unix، من المحتمل أن يكون هذا هو /home/${USER}/Music
؛ بالنسبة لنظام التشغيل Windows فمن المحتمل أن يكون C:Users<USER>Music
. يتم تحديد هذا الدليل بواسطة platformdirs.user_music_path()
.
output_directory
، فستتم كتابة جميع الوسائط إلى الدلائل الفرعية لهذا الدليل.المصدر: تايدال
قليل | عالي | ضياع | يستأجر FLAC | دولبي أتموس | فيديو (H.264 + AAC) | |
---|---|---|---|---|---|---|
أندرويد | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
تلفزيون النار؟ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
ماك | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
ويندوز | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
؟ هذا هو العميل الافتراضي لـ 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
بدون وسيطات أخرى من أجل: استرداد الألبوم/الفنان/المزيج/قائمة التشغيل/المسار بجودة لا تفقد البيانات إلى دليل فرعي لدليل الموسيقى الخاص بالمستخدم والتسجيل على مستوى المعلومات في الحالة من الصوت؛ يمكنك استرداد الفيديو بدقة 1080 بكسل وبجودة 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 فكرة جذابة في حالة رغبتك في استرداد جميع مقاطع الفيديو والألبومات وEPs والأغاني بأعلى جودة ممكنة لفنان معين. سوف يقوم استدعاء 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
الثانية تستدعي برنامج بايثون داخل الحاوية وتحتاج إلى 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