Экспорт скачанной музыки из Яндекс Музыки на ПК с сохранением тегов и обложек

Важный дисклеймер!

Данная статья написана исключительно в образовательных и исследовательских целях.
Её основная задача — показать, как устроено локальное хранение скачанных треков в десктопной версии Яндекс Музыки и как можно организовать более удобное хранение уже законно полученной по подписке музыки на своём компьютере.

Автор не призывает к обходу ограничений сервиса, взлому, распространению или иному незаконному получению музыкальных файлов.
Все действия, описанные в статье, предполагают, что пользователь имеет действующую подписку и использует скачанные треки только для личного прослушивания, в рамках правил сервиса.

Пожалуйста, поддерживайте авторов музыки и используйте легальные способы доступа к контенту, оплачивая подписку на музыкальные сервисы.

Автор не несёт ответственности за возможное неправомерное использование приведённой информации.


Что делает скрипт

Скрипт лежит по ссылке https://tarkus-notes.com/tools/yandex_music_export.py и делает следующее:

  1. Находит папку кеша Яндекс Музыки автоматически (для ОС Windows)
  2. Читает базу кеша
  3. Проходит по всем локально скачанным в кеше mp3 файлам
  4. Получает метаданные из базы данных
  5. Находит обложку в кеше обложек альбомов
  6. Копирует файл музыкальный файл в папку export, переименовывая его в формат «Песня-Исполнитель.mp3«
  7. Записывает в файл ID3-теги и обложку

Дополнительно умеет:

  • разбивать по папкам Исполнитель/Альбом
  • перезаписывать файлы или сохранять дубликаты
  • запускаться без указания путей

Автоопределение кеша

Скрипт ищет:

LOCALAPPDATA\Packages\*Yandex.Music*\LocalState

или использует текущую папку, если запускать сразу из LocalState.

Если не найдено — можно указать путь через параметр запуска вручную:

python yandex_music_export.py --base-dir "ПУТЬ_К_КЕШУ_ЯМ"

Запуск

Для начала нужны некоторые зависимости:

pip install mutagen tqdm

Простой запуск — определит папку кеша, создаст export в этой же папке кеша:

python yandex_music_export.py

С разбиением по папкам:

python yandex_music_export.py --organize

С сохранением дублей:

python yandex_music_export.py --keep-duplicates

С указанием пути экспорта:

python yandex_music_export.py --export-dir "D:\My_Music\"

Тестовый режим:

python yandex_music_export.py --dry-run

Без ID3:

python yandex_music_export.py --no-tags

Разработка скрипта

У десктопной версии Яндекс Музыки есть возможность скачивать треки для офлайн-прослушивания на компьютер.
Но если открыть папку кеша, можно увидеть, что файлы лежат в виде:

54012620.mp3<br>36961739.mp3<br>12837461.mp3

Без названий, без ID3-тегов и без обложек.

При этом рядом лежит SQLite-база и папка с обложками.
Это значит, что всю информацию можно восстановить.

В этой статье покажу, как устроен кеш Яндекс Музыки и как написать Python-скрипт, который:

  • находит кеш автоматически
  • извлекает названия треков, исполнителей, альбомы и жанры из SQLite
  • находит обложки альбомов
  • записывает ID3-теги
  • экспортирует музыку в нормальном виде

Где лежит кеш Яндекс Музыки

У Windows-версии он находится в папке:

C:\Users\<USER>\AppData\Local\Packages\<что-то>.Yandex.Music_<id>\LocalState\

Внутри есть:

CachedCovers/<br>Music/<br>musicdb_<GUID>.sqlite

Пример:

LocalState/<br>  CachedCovers/<br>  Music/<br>    31b9739d67fd476b199bdd23ff2dd316/<br>      54012620.mp3<br>      36961739.mp3<br>  musicdb_<code>31b9739d67fd476b199bdd23ff2dd316.sqlite

GUID — это идентификатор пользователя.


Что лежит в SQLite

Основные таблицы:

T_Track

Id
Title
CoverUri
IsOffline

T_Artist

Id
Name

T_Album

Id
Title
Year
GenreTitle
CoverUri

T_TrackArtist

Связь трек → артист

T_TrackAlbum

Связь трек → альбом

То есть все данные для восстановления есть.


Как связаны mp3 и база

Имя файла = Id трека

54012620.mp3 → T_Track.Id = 54012620

Дальше через join:

Track → TrackArtist → Artist
Track → TrackAlbum → Album

Можно получить:

  • название
  • исполнителя
  • альбом
  • жанр
  • год
  • номер трека
  • обложку

Где лежат обложки

В папке:

CachedCovers/

Имена выглядят достаточно странно:

avatars.yandex.net¿get-music-content¿2266607¿3038751b.a.7755216-2¿460x460

Но в базе есть поле:

CoverUri = avatars.yandex.net/get-music-content/2266607/3038751b.a.7755216-2/%%

Достаточно:

  • заменить /¿
  • заменить %%460x460

и получаем имя файла.


Итог

Яндекс Музыка хранит офлайн-треки в удобном для себя формате, но вся информация лежит рядом.

SQLite + CachedCovers → можно полностью восстановить библиотеку.

Python отлично подходит для такой задачи:

  • sqlite3
  • mutagen
  • tqdm

И в итоге можно получить нормальную коллекцию mp3 с тегами и обложками.