Важный дисклеймер!
Данная статья написана исключительно в образовательных и исследовательских целях.
Её основная задача — показать, как устроено локальное хранение скачанных треков в десктопной версии Яндекс Музыки и как можно организовать более удобное хранение уже законно полученной по подписке музыки на своём компьютере.
Автор не призывает к обходу ограничений сервиса, взлому, распространению или иному незаконному получению музыкальных файлов.
Все действия, описанные в статье, предполагают, что пользователь имеет действующую подписку и использует скачанные треки только для личного прослушивания, в рамках правил сервиса.
Пожалуйста, поддерживайте авторов музыки и используйте легальные способы доступа к контенту, оплачивая подписку на музыкальные сервисы.
Автор не несёт ответственности за возможное неправомерное использование приведённой информации.
Что делает скрипт
Скрипт лежит по ссылке https://tarkus-notes.com/tools/yandex_music_export.py и делает следующее:
- Находит папку кеша Яндекс Музыки автоматически (для ОС Windows)
- Читает базу кеша
- Проходит по всем локально скачанным в кеше mp3 файлам
- Получает метаданные из базы данных
- Находит обложку в кеше обложек альбомов
- Копирует файл музыкальный файл в папку export, переименовывая его в формат «Песня-Исполнитель.mp3«
- Записывает в файл 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 с тегами и обложками.