music_api
Last.fm scrobble cache & statistics API.
Данные берутся из локального кэша и обновляются автоматически каждые 5 минут,
а также после каждой смены трека.
Base URL
https://api.fenyochek.ru
HTTP эндпоинты
GET
/lastfm/stats
поведение определяется параметром
method
method=top
Топ N треков, артистов или альбомов за указанный период.
Параметры
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| methodreq | string | — | top |
| type | string | tracks | tracks / artists / albums |
| limit | number | 10 | Количество позиций в ответе |
| from | string | — | Начало периода. Форматы: YYYY-MM-DD или DD.MM.YY |
Пример запроса
HTTP
GET /lastfm/stats?method=top&type=tracks&limit=3&from=2026-02-01
Пример ответа
JSON
{
"type_of": "Tracks",
"top_list": [
{
"name": "The Scientist",
"artist": "Coldplay",
"album": "A Rush of Blood to the Head",
"cover_url": "https://lastfm.freetls.fastly.net/...",
"value": 42
}
]
}
method=history
История прослушиваний конкретного трека / артиста / альбома по дням за последние N дней.
Параметры
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| methodreq | string | — | history |
| type | string | tracks | tracks / artists / albums |
| name | string | "" | Название трека / артиста / альбома. Если пустой — история всех прослушиваний |
| artist | string | — | Артист (уточнение при type=tracks) |
| days | number | 30 | Глубина истории в днях. Максимум 365 |
Пример ответа
JSON
{
"name": "The Scientist",
"artist": "Coldplay",
"total": 7,
"history": [
{ "date": "2026-02-01", "plays": 0 },
{ "date": "2026-02-02", "plays": 3 },
{ "date": "2026-02-03", "plays": 4 }
]
}
method=now_playing
Возвращает текущий трек из кэша. Ответ мгновенный — без обращения к Last.fm.
Примечание: статус
nothing playing отправляется только после 5 подряд пустых ответов от Last.fm, чтобы избежать ложных срабатываний при кратких паузах.
Ответ — что-то играет
JSON
{
"album": { "name": "A Rush of Blood to the Head", "mbid": "" },
"artist": { "name": "Coldplay", "mbid": "" },
"title": { "name": "The Scientist", "url": "https://..." },
"image": {
"extralarge": { "url": "https://..." }
},
"utc_timestamp": 0
}
Ответ — ничего не играет
JSON
{ "status": "nothing playing" }
method=last_scrobble
Последний записанный трек из локального кэша (не обязательно играет сейчас).
Пример ответа
JSON
{
"name": "The Scientist",
"artist": "Coldplay",
"album": "A Rush of Blood to the Head",
"cover_url": "https://lastfm.freetls.fastly.net/...",
"timestamp": 1740994823
}
WebSocket
WS
/lastfm/ws
подписка на обновления в реальном времени
Постоянное соединение. Сервер сам шлёт команды когда меняется трек или статистика. Клиент ничего не отправляет.
Команды от сервера
Команда
Когда шлётся
Действие
refresh_now_playing
Сменился трек или музыка остановилась
Перезапросить
now_playingrefresh_stats
Изменился топ-1 за 30 дней
Перезапросить
topping
Каждые 30 секунд
Игнорировать (keepalive)
Подключение
JavaScript
const ws = new WebSocket('wss://api.fenyochek.ru/lastfm/ws');
ws.onmessage = (e) => {
const { cmd } = JSON.parse(e.data);
if (cmd === 'refresh_now_playing') fetchNowPlaying();
if (cmd === 'refresh_stats') fetchStats();
};
Логика синхронизации
Кэш скроблов обновляется автоматически
| Условие | Поведение |
|---|---|
| Отстали < 200 скроблов | 1 страница по 50 — быстро, легко |
| Отстали > 200 скроблов | Страницы по 1000 (первый запуск / даунтайм) |
| Фоновый синк | Каждые 5 минут |
| После смены трека | Дополнительный синк через 4 секунды |