API расписания

Расписания программ основных станций RadioMV: время эфира, категории и описания.

Эндпоинты

GET /english-programv2.json
GET /slavic-programv2.json
GET /spanish-programv2.json
GET /german-programv2.json

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

{
    "schemaVersion": "2.0.0",
    "lastUpdated": "2024-12-19",
    "station": {
        "id": 1,
        "name": "English",
        "language": "en",
        "timezone": "America/Los_Angeles"
    },
    "schedule": [
        {
            "id": "1-001",
            "name": "Kids Hour",
            "description": "An hour-long children's program.",
            "category": "children",
            "days": [0, 1, 2, 3, 4, 5, 6],
            "startTime": "07:00",
            "endTime": "08:00"
        }
    ]
}

Корневые поля

schemaVersion string обязательное
Семантическая версия формата схемы. Проверяйте её для совместимости.
lastUpdated string обязательное
Дата последнего изменения расписания в формате ISO 8601 (например, "2024-12-19").
station object обязательное
Объект с метаданными станции.
schedule array обязательное
Массив элементов расписания программ.

Объект station

id number обязательное
Уникальный идентификатор станции. Совпадает с ID в appv1.json.
name string обязательное
Отображаемое название станции.
language string обязательное
Код языка ISO 639-1: en, es, de, ru
timezone string обязательное
Идентификатор часового пояса IANA. Всё время в расписании указано в этом поясе.

Объект элемента расписания

id string обязательное
Уникальный идентификатор в формате {stationId}-{порядковый номер} (например, "1-001").
name string обязательное
Название программы на языке станции.
description string обязательное
Описание программы. Может быть пустой строкой.
category string обязательное
Стандартизированная категория для фильтрации. См. Категории.
days number[] обязательное
Массив номеров дней (0-6). См. Дни недели.
startTime string обязательное
Время начала в 24-часовом формате HH:MM.
endTime string обязательное
Время окончания в 24-часовом формате HH:MM.

Дни недели

Дни представлены числами по соглашению JavaScript Date.getDay():

Число День
0Воскресенье
1Понедельник
2Вторник
3Среда
4Четверг
5Пятница
6Суббота

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

Время указывается в 24-часовом формате (HH:MM) для единообразного разбора:

12-часовой 24-часовой
12:00 AM00:00
7:00 AM07:00
12:00 PM12:00
1:00 PM13:00
6:30 PM18:30
11:00 PM23:00
Часовой пояс Всё время указано в локальном часовом поясе станции (поле station.timezone). Сейчас все станции используют America/Los_Angeles (тихоокеанское время).

Категории

Стандартизированные категории позволяют фильтровать программы на всех станциях независимо от языка:

Категория Описание
bible-readingЧтение Писания (ВЗ, НЗ, Псалмы, Притчи)
bible-studyУглублённое изучение Библии
sermonПроповеди пасторов
testimonyЛичные свидетельства
musicМузыкальные программы
childrenДетские программы
familyПрограммы о семье
liveПрямые эфиры, программы со звонками
missionaryМиссионерские репортажи и новости
educationalОбразовательные/научные программы
audiobookЧтение аудиокниг
devotionalЕжедневные духовные размышления
talk-showДискуссии и интервью

Примеры кода

Текущая программа

function getCurrentProgram(schedule) {
    const now = new Date();
    const currentDay = now.getDay();
    const currentTime = now.toTimeString().slice(0, 5); // "HH:MM"

    return schedule.find(item =>
        item.days.includes(currentDay) &&
        item.startTime <= currentTime &&
        item.endTime > currentTime
    );
}

Расписание на сегодня

function getTodaySchedule(schedule) {
    const today = new Date().getDay();
    return schedule
        .filter(item => item.days.includes(today))
        .sort((a, b) => a.startTime.localeCompare(b.startTime));
}

Фильтр по категории

function getProgramsByCategory(schedule, category) {
    return schedule.filter(item => item.category === category);
}

// Все проповеди
const sermons = getProgramsByCategory(schedule, 'sermon');

Проверка обновлений

function isScheduleStale(data, maxAgeDays = 30) {
    const lastUpdated = new Date(data.lastUpdated);
    const now = new Date();
    const diffDays = (now - lastUpdated) / (1000 * 60 * 60 * 24);
    return diffDays > maxAgeDays;
}

Пример на Swift

func getScheduleForDay(_ schedule: [ScheduleItem], day: Int) -> [ScheduleItem] {
    return schedule
        .filter { $0.days.contains(day) }
        .sorted { $0.startTime < $1.startTime }
}

Пример на Kotlin

fun getProgramsByCategory(
    schedule: List<ScheduleItem>,
    category: String
): List<ScheduleItem> {
    return schedule.filter { it.category == category }
}