Массовый импорт треков в плейлист КИОН Музыки (бывшая МТС Музыка) из обычного текстового списка.
Штатного переноса плейлистов в сервисе сейчас нет — справка МТС прямо пишет, что функция недоступна. Сторонние конвертеры (Soundiiz, TuneMyMusic) КИОН как приёмник не поддерживают. Этот скрипт закрывает дыру: берёт список вида Исполнитель — Название, находит треки в каталоге и добавляет их в твой плейлист.
Работает в консоли браузера от имени уже вошедшего пользователя. Никаких паролей, никакой отправки данных наружу.
За качество кода не ручаюсь. Весь скрипт написан Claude Opus 5, я только гонял его в консоли, приносил ответы сервера и говорил, что сломалось. Задача была не «сделать красиво», а перестать вручную вбивать сотню треков в поиск.
Работает — но ревью его никто не делал, тестов нет, обработка ошибок ровно такая, какой хватило для моего случая. Если собираетесь запускать у себя: сначала scan(), гляньте глазами, что нашлось, и только потом push(). Ничего страшнее «в плейлист попал не тот трек» случиться не должно, но обещать не могу.
Правки и issue приветствуются, особенно от тех, кто в JS разбирается.
- Открой music.mts.ru, войди в аккаунт.
- Создай плейлист и открой его страницу — адрес будет вида
/custom-playlist/<uid>/<kind>. - Нажми F12 → вкладка Console. Если Chrome ругается на вставку, набери
allow pastingи нажми Enter. - Вставь содержимое
kion-playlist-import.js, нажми Enter. - Загрузи список и запусти поиск:
KION.load(`
Игорь Тальков — Я вернусь
КИНО — Кукушка
Би-2 — Серебро
`);
await KION.scan(); // ищет треки, ничего не меняет
await KION.push(); // заливает найденное в плейлистscan() печатает по строке на трек: слева — что искали, справа — что нашлось. Пробеги глазами перед push().
| Команда | Что делает |
|---|---|
KION.load(text) |
загрузить список, убрать дубликаты |
KION.scan() |
найти треки в каталоге, ничего не добавляя |
KION.push() |
залить найденное в плейлист |
KION.report() |
показать промахи текстом |
KION.config({...}) |
поменять настройки (см. ниже) |
KION.help() |
справка |
KION.config({
batchSize: 20, // треков в одном запросе на изменение
searchDelay: 350, // пауза между запросами поиска, мс
minScore: 7, // порог совпадения (макс. 14), ниже — считается промахом
uid: '...', // если не удалось определить плейлист из адреса
kind: '...'
});Мой txt я получил, распарсив страницу своего плейлиста в Яндекс Музыке — просто вытащил из разметки строки «исполнитель — название». Годится любой способ: выгрузка из Soundiiz или TuneMyMusic в текстовый файл, экспорт из локального плеера, да хоть руками набранный список. Скрипту всё равно, откуда текст, — лишь бы одна строка на трек.
Одна строка — один трек. Разделители: —, –, -, таб. Строки без разделителя считаются названием без исполнителя. Пустые строки и начинающиеся с # игнорируются.
Исполнитель — Название
КИНО — Пачка сигарет
# это комментарий
Скрипт сам срезает хвосты, которые ломают поиск: 2024 Remastered, из фильма «...», (feat. ...).
Пример: tracks.example.txt.
КИОН Музыка — витрина поверх бэкенда Яндекс.Музыки: запросы идут на music.mts.ru/ya-proxy/api/..., ответы приходят с полем hostname вида music-web-...yp-c.yandex.net, обложки лежат на avatars.yandex.net. Отсюда и знакомая механика API.
Используются три эндпоинта:
GET /ya-proxy/api/search-playlist/{uid}/{kind}?part={запрос}
→ { result: { suggestedTrackIds: ["38633760", ...] } }
GET /ya-proxy/api/tracks?trackIds=1,2,3
→ { result: [ { id, title, artists: [...], albums: [...] } ] }
POST /ya-proxy/api/users/{uid}/playlists/{kind}/change?revision={N}&diff={JSON}
diff: [{ "op": "insert", "at": 0, "tracks": [{ "id": "...", "albumId": "..." }] }]
Два нюанса, на которых легко споткнуться:
revision— номер версии плейлиста. Каждое изменение его увеличивает; с устаревшим номером сервер откажет. Скрипт берёт новый номер из ответа сервера.- Авторизация — GET-запросы проходят по кукам, а POST сайт отправляет с
credentials: 'omit'и заголовкамиAuthorization: OAuth <токен>,X-Yandex-Music-ClientиX-Yandex-Music-Web-Cookie. Без них прилетает401даже при живой сессии. Токен читается изlocalStorage["ya_token"]в момент запроса — скрипт его не сохраняет и не логирует.
Поиск идёт через эндпоинт подсказок, а он возвращает всего несколько кандидатов. Кандидаты ранжируются по совпадению названия и исполнителя; при счёте ниже minScore трек уходит в промахи, а не добавляется наугад. На практике на списке из 124 треков нашлось 118 — не находятся в основном сборные записи с длинным перечнем исполнителей.
Вставка всегда идёт в позицию 0, поэтому пачки отправляются с конца списка — так итоговый порядок совпадает с исходным.
- Только веб-версия, с телефона не запустить.
- Чего нет в каталоге — того нет; промахи придётся добить руками.
- Скрипт со временем сломается. API неофициальный, МТС ничего никому не обещал: поменяется формат ответа, путь эндпоинта или проверка версии клиента в
X-Yandex-Music-Client— и всё встанет. Написано и проверено в августе 2026 года на версии клиентаMTSMusicWebPremium/2.20.0-release-18717274. Если репозиторий давно не обновлялся, считайте описание API историческим документом, а не инструкцией. - Когда отвалится: повесьте перехватчик на
fetch, добавьте один трек руками через интерфейс и посмотрите, какой запрос уходит на самом деле — заголовки, путь, параметры. Дальше правится в одном месте:authHeaders(),findTrack()илиapplyDiff(). Актуальную версию клиента можно взять оттуда же. - Инструмент для переноса своей музыки в своём аккаунте. Не гоняйте его пачками и не выкручивайте задержки в ноль.
MIT. Неофициальный проект, никак не связан с МТС, КИОН и Яндексом.