← fenyochek.ru

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_playing
refresh_stats
Изменился топ-1 за 30 дней
Перезапросить top
ping
Каждые 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 секунды