Это Node.js обертка для Yandex.Music API, используемого в мобильных приложениях (iOS/Android).
npm install yamd2yarn add yamd2pnpm add yamd2bun add yamd2npm install github:Dirold2/yamd2#__dist__import { YMApi, WrappedYMApi, Types } from "yamd2";
const api = new YMApi();
(async () => {
try {
await api.init({ access_token: "EXAMPLE_TOKEN", uid: 0 });
const result = await api.search.query("gorillaz", { type: "artist" });
const artist = result.artists?.results?.[0];
const tracks = await api.artists.getArtistTracks(artist.id);
console.log(tracks);
} catch (e) {
console.log(`api error ${e.message}`);
}
})();Получите токен здесь, а uid здесь.
Методы сгруппированы по доменам — полям на экземпляре YMApi:
init(config)— Аутентификация и инициализация
getAccountStatus()— Статус аккаунтаgetFeed()— Лента пользователя
getChart(chartType?)— ЧартgetNewReleases()— Новые альбомыgetNewPlaylists()— Новые плейлистыgetPodcasts()— ПодкастыgetGenres()— Список жанров
query(q, options?)— Поиск по всем или конкретному типуartists(q, options?)— Поиск исполнителейtracks(q, options?)— Поиск трековalbums(q, options?)— Поиск альбомовall(q, options?)— Поиск по всем типам
getTrack(trackId)— Получить трек(и)getSingleTrack(trackId)— Получить один трекgetTrackSupplement(trackId)— Доп. информацияgetTrackDownloadInfo(trackId, quality?, canUseStreaming?)— Информация о загрузкеgetTrackDownloadInfoNew(trackId, quality?, codecs?, transport?)— Новый endpointgetTrackDirectLink(downloadUrl, short?)— Прямая ссылкаgetTrackDirectLinkNew(trackUrl)— Прямая ссылка (новый формат)getTrackShareLink(track)— Ссылка для шарингаgetSimilarTracks(trackId)— Похожие трекиgetTrackSupplement(trackId)— Доп. информация о треке
getAlbum(albumId, withTracks?)— Получить альбомgetAlbums(albumIds)— Несколько альбомовgetAlbumWithTracks(albumId)— Альбом с треками
getArtist(artistId)— Информация об исполнителеgetArtists(artistIds)— Несколько исполнителейgetArtistTracks(artistId, options?)— Треки исполнителя
getPlaylist(playlistId, user?)— Получить плейлистgetPlaylists(playlistIds, user?, options?)— Несколько плейлистовgetUserPlaylists(userId)— Плейлисты пользователяcreatePlaylist(name, options?)— Создать плейлистremovePlaylist(playlistId)— Удалить плейлистrenamePlaylist(playlistId, name)— Переименовать плейлистaddTracksToPlaylist(playlistId, tracks, revision, options?)— Добавить трекиremoveTracksFromPlaylist(playlistId, tracks, revision, options?)— Удалить треки
getAllStationsList(language?)— Все станцииgetRecomendedStationsList()— Рекомендованные станцииgetStationTracks(stationId, queue?)— Треки станцииgetStationInfo(stationId)— Информация о станцииcreateRotorSession(seeds, includeTracksInResponse?)— Создать ротор-сессиюpostRotorSessionTracks(sessionId, options)— Получить треки сессии
getLikedTracks(userId?)— Понравившиеся трекиgetDislikedTracks(userId?)— Непонравившиеся треки
getQueues()— Все очередиgetQueue(queueId)— Конкретная очередь
Почти все методы обернутого API могут быть вызваны с ID сущности или URL
- getConcreteDownloadInfo
- getMp3DownloadInfo
- getMp3DownloadUrl
- getPlaylist
- getAlbum
- getAlbumWithTracks
- getArtist
- getShortenedLink
import { WrappedYMApi } from "yamd2";
const wrappedApi = new WrappedYMApi();
await wrappedApi.init({ access_token: "TOKEN", uid: 123 });
// Получить информацию для загрузки
const downloadInfo = await wrappedApi.getDownloadInfo("123456", {
codec: "flac",
quality: "lossless"
});
// Получить прямую ссылку для загрузки
const downloadUrl = await wrappedApi.getDownloadUrl("123456", {
codec: "flac",
quality: "lossless"
});
// Получить лучшую доступную ссылку (по приоритету кодеков)
const bestUrl = await wrappedApi.getBestDownloadUrl("123456");
// Получить ссылку для FFmpeg (RAW MP3)
const ffmpegUrl = await wrappedApi.getDownloadUrlForFFmpeg("123456");// Все методы принимают как ID, так и URL
const track = await wrappedApi.getTrack("123456");
const trackFromUrl = await wrappedApi.getTrack(
"https://music.yandex.ru/track/123456"
);
const playlist = await wrappedApi.getPlaylist("123456");
const playlistFromUrl = await wrappedApi.getPlaylist(
"https://music.yandex.ru/users/username/playlists/123456"
);
const album = await wrappedApi.getAlbum("123456");
const albumFromUrl = await wrappedApi.getAlbum(
"https://music.yandex.ru/album/123456"
);
const artist = await wrappedApi.getArtist("123456");
const artistFromUrl = await wrappedApi.getArtist(
"https://music.yandex.ru/artist/123456"
);// MP3 загрузка
const mp3Info = await wrappedApi.getMp3DownloadInfo("123456");
const mp3Url = await wrappedApi.getMp3DownloadUrl("123456");
// AAC загрузка
const aacInfo = await wrappedApi.getAacDownloadInfo("123456");
const aacUrl = await wrappedApi.getAacDownloadUrl("123456");
// FLAC загрузка
const flacInfo = await wrappedApi.getFlacDownloadInfo("123456");
const flacUrl = await wrappedApi.getFlacDownloadUrl("123456");- FLAC - Без потерь, высокое качество
- FLAC-MP4 - Без потерь в MP4 контейнере
- AAC - Стандартное сжатие
- AAC-MP4 - AAC в MP4 контейнере
- HE-AAC - Высокая эффективность
- HE-AAC-MP4 - HE-AAC в MP4 контейнере
- MP3 - Широкая совместимость
При использовании getBestDownloadUrl() кодеки проверяются в следующем порядке:
- FLAC-MP4
- FLAC
- AAC-MP4
- AAC
- HE-AAC-MP4
- HE-AAC
- MP3
import { YMApiError, ExtractionError, DownloadError } from "yamd2";
try {
const result = await wrappedApi.getDownloadUrl("invalid-url");
} catch (error) {
if (error instanceof ExtractionError) {
console.log(`Не удалось извлечь ID из URL: ${error.input}`);
} else if (error instanceof DownloadError) {
console.log(
`URL не найден для трека ${error.trackId} с кодеком ${error.codec}`
);
} else if (error instanceof YMApiError) {
console.log(`Ошибка API: ${error.message}`);
}
}- Автоматическое извлечение ID из URL
- Поддержка зашифрованных ссылок для FLAC
- Приоритет кодеков для автоматического выбора лучшего качества
- Обработка ошибок с конкретными типами исключений
- Поддержка FFmpeg для RAW MP3 загрузки
- Кэширование для повышения производительности