YDL-Yandex-Audio: Как я чинил UUID через Deno и Bash
Проект по мульти-загрузке c ютубчека да с ЯндексМузыки: https://github.com/mnnoee/Yandex-YouTube-Audio-Grabber
Давайте будем честны: мой быдлоскрипт написаный на коленке не вершина программной инженерии.
Это костыль на костыле, созданный с одной целью:
заставить yt-dlp нормально качать плейлисты с Яндекс Музыки в 2026 году.
В чем проблема?
yt-dlp как нам всем известно швейцарский нож, но даже он пасует перед хитрожопостью ссылок Яндекса. Короткие ссылки, странные редиректы и структура плейлистов часто приводят к тому, что загрузка просто не начинается. А если и начинается, то HTTPS может отвалиться в самый неподходящий момент.
Главный костыль: yandex.ts
Я понял, что пытаться парсить современные веб-страницы голым Bash - это путь к безумию и бесконечной борьбе с капчей, это можно реализовать через grep, sed, awk, но борьба с капчей не уйдёт, а я и не хотел глубоко копаться.
Поэтому я делегировал мозги рантайму Deno, который к тому же скоро станет полноценой частью yt-dlp
Мой скрипт yandex.ts делает ровно одну вещь: фиксит и парсит UUID. Он притворяется браузером, идет по ссылке и вытаскивает login и kind (ID плейлиста) прямо из JSON-потрохов страницы.
Код "выпрямителя" ссылок:
const finalUrl = response.url;
if (finalUrl.includes("/users/")) {
console.log("Clean URL:", finalUrl);
} else {
const text = await response.text();
const login = text.match(/"login":"([^"]+)"/)?.[1];
const kind = text.match(/"kind":([0-9]+)/)?.[1];
if (login && kind) {
console.log(`https://music.yandex.ru/users/${login}/playlists/${kind}`); Дирижер хаоса: audio_grab.sh
Сам Bash-скрипт выступает в роли менеджера. Он принимает опции, проверяет зависимости и, самое главное, ловит вывод от Deno, чтобы скормить его yt-dlp.
Быдлокодинг он и в душе такой, главное выполняет свою работу:
Интеграция: Подтягивает куки из вашего браузера (флаг
-b), чтобы получить максимальный битрейт при наличии подписки.Логирование: Внутри полно душевных логов вроде
«тык-тык-тык. это костыль».Архив: Ведет файл
.downloaded.txt, чтобы не качать по кругу одно и то же.
# Тот самый кусок с костылем
if [[ "$url" == *"music.yandex.ru/playlists/"* ]]; then
log "тык-тык-тык. это костыль. тык-тык-тык"
cleaned_url=$(deno run --allow-net "$DENO_SCRIPT" "$url" | tail -n 1)
# ... дальше аргемнты + yt-dlp = рабочий скрипт
Важный нюанс про HTTPS
На текущий момент официальный yt-dlp имеет проблемы с обработкой некоторых HTTPS-запросов Яндекса. Поэтому мой скрипт работает пока что только с моим форком: github.com/mnnoee/yt-dlp (ветка yandexmusic-https).
Я отправил Pull Request в основной репозиторий, но пока его не приняли - сидим на моем "самопале". Кому интересен PR вот он: https://github.com/yt-dlp/yt-dlp/pull/15427
Итог
Оно работает? Да. Это красиво? ну... тут каждый решит сам за себя
!!YAPPI!!