API конфигурации приложения

Список станций, URL потоков, пути метаданных, обложки, расписания и настройки — один JSON-файл, на котором работает полноценный клиент RadioMV.

Эндпоинт

GET https://stream.radiomv.com/static/appv3.json

Текущая конфигурация (v3). Это единственный URL, который приложению нужно «зашить» — всё остальное берётся из него.

Как работают URL в v3 config.baseUrl — корень для всех относительных путей в файле. Чтобы получить полный URL, добавьте его в начало: baseUrl + station.streams.hls → https://stream.radiomv.com/stream/slavic.m3u8. Пути, уже начинающиеся с https:// (например, shareUrl), используются как есть. Сохраняйте query-строки (например, ?v=1 у обложек) — они версионируют кэш.

Формат ответа

{
    "config": {
        "version": "20260428.2044",
        "baseUrl": "https://stream.radiomv.com",
        "analytics": "/api/analytics"
    },
    "navigation": { ... },
    "settings": { ... },
    "stations": [ ... ]
}

Объект config

version string обязательное
Версия на основе даты в формате YYYYMMDD.HHMM. Используйте для инвалидации кэша.
baseUrl string обязательное
Корневой URL для всех относительных путей в этом файле.
analytics string обязательное
Относительный путь эндпоинта аналитики воспроизведения (официальные приложения отправляют туда пакеты событий по POST).

Навигационные URL по языковым группам — у каждой группы есть абсолютный URL explore:

{
    "navigation": {
        "english": { "explore": "https://radiomv.com/support/#english" },
        "spanish": { ... },
        "german": { ... },
        "slavic": { ... }
    }
}

Объект settings

Контактная информация и ссылки по языковым группам:

{
    "settings": {
        "slavic": {
            "website": "https://sl.radiomv.com/",
            "office": "+1-425-296-7829",
            "sms": "+1-919-283-9868",
            "beta-program": "https://...",
            "report-a-bug": "https://...",
            "share-url": "https://radiomv.com/apps/"
        }
    }
}
website string
Основной сайт для данного языка.
office string
Телефон офиса.
sms string
Номер для SMS.
beta-program string
URL записи в бета-программу.
report-a-bug string
URL формы сообщения об ошибке.
share-url string
URL, которым делятся при рекомендации приложений.

Массив stations

Массив всех объектов станций. Каждая станция содержит:

{
    "id": "slavic",
    "name": "Христианское Радио",
    "language": "slavic",
    "isMain": true,
    "streams": {
        "hls": "/stream/slavic.m3u8",
        "mp3": "/stream/slavic.m3u"
    },
    "metadata": "/api/metadata/slavic",
    "artwork": {
        "1x1": "/assets/slavic/artwork-1x1.jpg?v=1",
        "1x1Small": "/assets/slavic/artwork-1x1-small.jpg?v=1",
        "16x9": "/assets/slavic/artwork-16x9.jpg?v=1",
        "nowPlaying": "/assets/slavic/artwork-now-playing.jpg?v=1",
        "nowPlayingSmall": "/assets/slavic/artwork-now-playing-small.jpg?v=1",
        "miniPlayer": "/assets/slavic/mini-player.jpg?v=1"
    },
    "video": "/assets/slavic/video-loop.mp4?v=1",
    "schedule": "/static/schedules/slavic.json",
    "shareUrl": "https://player.radiomv.com/slavic.html"
}

Поля станции

id string обязательное
Идентификатор-слаг станции (например, slavic, slavic-nt). Совпадает с ID станций в API стриминга и метаданных.
name string обязательное
Отображаемое название станции на её языке.
language string обязательное
Языковая группа: english, spanish, german или slavic. Совпадает с ключами navigation и settings.
isMain boolean обязательное
Основная это станция (true) или дополнительный канал (false).
streams.hls string обязательное
Относительный путь HLS мастер-плейлиста (.m3u8). Предпочтительный поток для приложений.
streams.mp3 string обязательное
Относительный путь MP3-плейлиста (.m3u) — загрузите его и перейдите по URL потока внутри. Резервный вариант для плееров без HLS.
metadata string обязательное
Относительный путь JSON-эндпоинта «сейчас в эфире». Добавьте /events для живого SSE-потока — см. Стриминг и метаданные.
artwork object обязательное
Относительные пути обложек: 1x1, 1x1Small, 16x9, nowPlaying, nowPlayingSmall, miniPlayer; у некоторых станций дополнительно motionArtwork4x3 / motionArtwork1x1 (MP4). Сохраняйте query ?v= — она сбрасывает кэш при обновлении обложек.
video string необязательное
Относительный путь фонового видео-лупа (MP4). Присутствует у некоторых основных станций.
schedule string необязательное
Относительный путь JSON-расписания станции. Присутствует только у станций с опубликованным расписанием — см. Расписание.
shareUrl string обязательное
Абсолютный URL веб-плеера для «поделиться».

Список станций

ID Название Язык Основная
englishEnglishenglishДа
english-otEnglish Old TestamentenglishНет
english-ntEnglish New TestamentenglishНет
spanishRadio Cristiana en EspañolspanishДа
spanish-otEl Antiguo TestamentospanishНет
spanish-ntEl Nuevo TestamentospanishНет
germanDeutsch RadioMvgermanДа
german-otAltes TestamentgermanНет
german-ntNeues TestamentgermanНет
slavicХристианское РадиоslavicДа
slavic-musicМузыкальный КаналslavicНет
slavic-kidsДетский КаналslavicНет
slavic-ntНовый ЗаветslavicНет
slavic-otВетхий ЗаветslavicНет

Примеры кода

Загрузка конфигурации и разрешение URL

const response = await fetch('https://stream.radiomv.com/static/appv3.json');
const data = await response.json();

// Разрешаем относительный путь через baseUrl
const resolve = (path) =>
    path.startsWith('http') ? path : data.config.baseUrl + path;

Все основные станции

const mainStations = data.stations.filter(s => s.isMain);
// Возвращает: english, spanish, german, slavic

Воспроизведение станции

const station = data.stations.find(s => s.id === 'slavic');
const hlsUrl = resolve(station.streams.hls);
// https://stream.radiomv.com/stream/slavic.m3u8 — передайте вашему плееру

Показ «сейчас в эфире»

const now = await (await fetch(resolve(station.metadata))).json();
console.log(now.title, now.artist);

// Или подписка на живые обновления (SSE)
const es = new EventSource(resolve(station.metadata) + '/events');

Проверка обновлений конфигурации

async function checkForUpdates(cachedVersion) {
    const response = await fetch('https://stream.radiomv.com/static/appv3.json');
    const data = await response.json();

    if (data.config.version !== cachedVersion) {
        // Доступна новая версия — обновляем кэш
        return { updated: true, data };
    }
    return { updated: false };
}

Устаревшие версии

appv1.json и appv2.json (обслуживаются с api.radiomv.studio) — предыдущие поколения конфигурации: числовые ID станций, абсолютные URL в каждом поле и текстовые эндпоинты метаданных. Они остаются доступными для существующих сборок приложений, но устарели — не используйте их в новых проектах.