Сохраняем свои треки с Яндекс. Музыки

А что случилось то?

С началом СВО на Украине, последовавшими за этим санкциями на разные виды прав и контент, доступный в РФ, Яндексу перестали продлевать лицензии на музыку. Треки незаметно стали исчезать из плейлистов. Это было не сразу заметно и каково же моё разочарование, когда обнаружились потери в сборнике, тщательно формируемом на протяжении 5 лет. Никаких отметок об изменениях (удалении) в плейлисте «Мне нравится» не прослеживалось. В результате совершенно непонятно, какая часть композиций отсутствует. Интересное наблюдение: в плейлистах, созданных вручную недоступные треки хотя бы помечаются серым и не проигрываются — ура, можно хотя бы понять, что блокирнулось. В моём случае, автоматический сформированный плейлист «Мне нравится» значительно превосходил численностью все остальные, поэтому ситуация с пропажами выбесила.

Расстройств много, а что делать? Есть два варианта:

  • Мигрировать на другой сервис. Альтернативы: Youtube Music, Spotify, Apple Music и тд. Но есть нюанс — нужна карта, которую будут принимать данные сервисы, и МИР, к сожалению, в их число не входит. Поэтому данный вариант не рассматривается.
  • Скачивать оставшиеся треки для сохранения нажитого непосильным трудом. Вот об этом способе и поговорим.

Для скачивания существующих плейлистов (да и вообще музыки с Яндекс.Музыки) я нашел два инструмента:

  1. На Perl — Yandex Music Downloader | наиболее стабильный вариант
  2. На Python — yandex-music-downloader | периодически чудит

Базовый функционал +/- одинаковый, но так как у меня уже стоял python, выбор пал на yandex-music-downloader.

yandex-music-downloader / 2023-07-14

Установка:
git clone https://github.com/llistochek/yandex-music-downloader.git
cd yandex-music-downloader
pip install -r requirements.txt
python3 main.py

+ вытаскиваем из вашего браузера cookie для авторизации = Session_id и можно начинать.

Синтаксис скрипта:
usage: main.py [-h] [--hq] [--skip-existing] [--add-lyrics] [--embed-cover]
               [--stick-to-artist] [--cover-resolution <Разрешение обложки>]
               [--delay <Задержка>]
               [--log-level {CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET,VERBOSE}]
               (--artist-id <ID исполнителя> | --album-id <ID альбома> | --track-id <ID трека> | --playlist-id <владелец плейлиста>/<тип плейлиста> | -u URL)
               [--unsafe-path] [--dir <Папка>] [--path-pattern <Паттерн>]
               --session-id <ID сессии> [--user-agent <User-Agent>]

Загрузчик музыки с сервиса Яндекс.Музыка

optional arguments:
  -h, --help            show this help message and exit

Общие параметры:
  --hq                  Загружать треки в высоком качестве
  --skip-existing       Пропускать уже загруженные треки
  --add-lyrics          Загружать тексты песен
  --embed-cover         Встраивать обложку в .mp3 файл
  --stick-to-artist     Загружать только альбомы созданные данным исполнителем
  --cover-resolution <Разрешение обложки>
                        по умолчанию: 400
  --delay <Задержка>    Задержка между запросами, в секундах (по умолчанию: 3)
  --log-level {CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET,VERBOSE}

ID:
  --artist-id <ID исполнителя>
  --album-id <ID альбома>
  --track-id <ID трека>
  --playlist-id <владелец плейлиста>/<тип плейлиста>
  -u URL, --url URL     URL исполнителя/альбома/трека/плейлиста

Указание пути:
  --unsafe-path         Не очищать путь от недопустимых символов
  --dir <Папка>         Папка для загрузки музыки (по умолчанию: .)
  --path-pattern <Паттерн>
                        Поддерживает следующие заполнители: #number, #artist,
                        #album-artist, #title, #album, #year (по умолчанию:
                        #album-artist/#album/#number - #title)

Авторизация:
  --session-id <ID сессии>
  --user-agent <User-Agent>
                        по умолчанию: Mozilla/5.0 (X11; Linux x86_64)
                        AppleWebKit/537.36 (KHTML, like Gecko)
                        Chrome/106.0.0.0 Safari/537.36
Скачивание плейлиста «Мне нравиться» у меня выглядит так:
python3 main.py --session-id="ВАШ SESSION-ID" --hq --add-lyrics --embed-cover --url "ВАШ URL НА ПЛЕЙЛИСТ"

Важное примечание, если вы в процессе работы скрипта получаете ошибку формата:

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Необходимо проверить чтобы в настройках профиля была включена настройка «Публичный доступ к моей фонотеке» и чтобы в настройках самого плейлиста была отключена галка «Приватный плейлист».

Так же, если вы не хотите чтобы у вас в файле была отметка «Encoded by : https://github.com/llistochek/yandex-music-downloader«, в скрипте нужно закомментировать:

tag.encoded_by = ENCODED_BY
ИТОГ по yandex-music-downloader:
Минусы:
  • Под Windows дико нестабильный скрипт. Если качать отдельно альбомы и треки, то проблем нет. При попытке скачать плейлист «Мне нравится» ошибки лезут как из рога изобилия.
  • Второй минус, который для меня критичен: если у трека несколько исполнителей, тогда трек будет помещен в папку первого исполнителя.
  • Бесячая нумерация — 1,2,3 и т.д. ну кто так делает?))) 01,02,03 — вот наш выбор. Тут, конечно, личный загон, переделал под себя, но пул реквеста не стоит ждать.
  • Заполнители. Не знаю как словами описать. Они работают как-то не так. Вот в Yandex Music Downloader всё норм.
Плюсы:
  • В целом, продуманная каталогизация по умолчанию. VA скидываются в отдельную папку — «сборник». Удобно.
  • Засунул под крон в докере на unraid. Вроде работает стабильней, чем под Windows. Буду дальше тестировать.

Примеры ошибок которые вываливались при эксплуатации:

Yandex Music Downloader / 2023-07-14

С Perl не дружу, поэтому рассматривал этот скрипт в последнюю очередь. И зря.

Установка:
  • Качаем и устанавливаем Strawberry Perl, добавляем PATH
  • Устанавливаем модули:
cpan install Digest::MD5 File::Copy File::Spec File::Temp File::Util Getopt::Long::Descriptive HTML::Entities HTTP::Cookies JSON::PP LWP::Protocol::https LWP::UserAgent MP3::Tag Term::ANSIColor Mozilla::CA Win32::API Win32::Console Win32API::File
  • Клонируем, запускаем, проверяем:
git clone https://github.com/kaimi-io/yandex-music-download.git
cd yandex-music-download/src
perl ya.pl -h
Синтаксис скрипта:
ya.pl [-adhklpstu] [long options...]
        -p[=INT] --playlist[=INT]  playlist id to download
        -k[=STR] --kind[=STR]      playlist kind (eg. ya-playlist,
                                   music-blog, music-partners, etc.)
        -a[=INT] --album[=INT]     album to download
        -t[=INT] --track[=INT]     track to download (album id must be
                                   specified)
        -u[=STR] --url[=STR]       download by URL
        -d[=STR] --dir[=STR]       download path (current direcotry will be
                                   used by default)
        --skip-existing            skip downloading tracks that already exist
                                   on the specified path
        --proxy STR                HTTP-proxy (format: 1.2.3.4:8888)
        --exclude STR              skip tracks specified in file
        --include STR              download only tracks specified in file
        --delay INT                delay between downloads (in seconds)
        --mobile INT               use mobile API
        --auth STR                 authorization header for mobile version
                                   (OAuth...)
        --cookie STR               authorization cookie for web version
                                   (Session_id=...)
        --bitrate INT              bitrate (eg. 64, 128, 192, 320)
        --pattern STR              track naming pattern
        --path STR                 path saving pattern

        Available placeholders: #number, #artist,
        #title, #album, #year

        Path pattern will be used in addition to
        the download path directory

        Example path pattern: #artist/#album-#year

        -l --link                  do not fetch, only print links to the
                                   tracks
        -s --silent                do not print informational messages
        --debug                    print debug info during work
        -h --help                  print usage

        --include and --exclude options use weak
        match i.e. ~/$term/

Синтаксис неполный, как раз тот случай, когда автор положил болт на документацию. Читайте код. Точно можно заставить скрипт мимикрировать под мобильное приложение, но пока не получилось реализовать задумку.

Скачивание плейлиста «Мне нравиться» у меня выглядит так:
perl ya.pl --url "ВАШ URL НА ПЛЕЙЛИСТ" --cookie Session_id="ВАШ SESSION-ID" --skip-existing --delay 3 --bitrate 320
ИТОГ по Yandex Music Downloader:
Минусы:
  • Один. Perl. Я его не знаю и ничего не могу сделать со скриптом
Плюсы:
  • Стабильная работа. Работает как задумано и нужно.
  • Гибкая настройка.
  • Поддержка прокси.
  • Готовый докер образ.
Общий итог:

Продолжаю тестировать yandex-music-downloader, но уже есть понимание что на постоянную работу уйдет Yandex Music Downloader. Да он на Perl. Но! Его функционала вполне хватает.

Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии