Для организаторов
Инструкция по подготовке schedule.json
Как подготовить JSON-файл расписания для подключения события в приложении Сценарий.
Инструкция по подготовке schedule.json
1) Общая структура файла
Минимально ожидается такой JSON:
{
"id": "gorodskoj-koncert-2026",
"meta": {
"title": "Городской концерт 2026",
"dates": "8–12 июля 2026",
"location": "Фестивальная площадка",
"schemaVersion": 1,
"startDate": "2026-07-08",
"endDate": "2026-07-12",
"logicalDayStartHour": 8,
"lastItemId": 0,
"logoUrl": "https://example.ru/logo.png"
},
"stages": [],
"days": [],
"items": []
}
Примечание: в проекте используется только поле items.
Корневой id (обязательно) — непустая строка на верхнем уровне рядом с meta. Без неё приложение не принимает файл. Один и тот же id нельзя добавить дважды в список событий (в том числе если ссылка на JSON другая).
2) Поля meta: где отображаются и как используются
Ниже перечислены поля, которые встречаются в текущем проекте.
meta.title
- Где используется: в приложении как название события в списке событий.
- Как отображается: как основной заголовок карточки события.
- Требования: строка, не пустая (иначе в UI будет fallback
Без названия).
meta.startDate и meta.endDate
- Где используется: в приложении для:
- отображения диапазона дат на карточке события;
- сортировки событий в списке;
- валидации при загрузке расписания по удалённой ссылке.
- Как отображаются: форматируются в подпись с датами (например,
08.07.2026 - 12.07.2026). - Требования: строка даты
YYYY-MM-DD, например2026-07-08. - Важно: при сценарии “добавить событие по ссылке” оба поля должны быть заполнены корректно, иначе загрузка отклоняется.
meta.logoUrl
- Где используется: в приложении для изображения события (логотип в списке и в диалоге выбора).
- Как отображается: как обложка/иконка события.
- Требования: валидный URL изображения (лучше
https://). - Если не задано: карточка откроется без логотипа (с placeholder).
meta.dates
- Где используется: в JSON как человекочитаемое описание дат фестиваля.
- Как отображается: в приложении основная дата строится из
startDate/endDate; полеdatesможно использовать для подписи в свободном формате. - Требования: строка в свободном формате.
meta.location
- Где используется: в JSON как общее описание места проведения события.
- Как отображается: в приложении отдельно не выводится; для адресов конкретных площадок используйте
stages[].location. - Требования: строка в свободном формате.
meta.schemaVersion
- Где используется: в JSON как служебная версия схемы.
- Как отображается: пользователю напрямую не показывается.
- Требования: число; обычно
1.
meta.logicalDayStartHour (опционально)
- Где используется: в приложении для границы «фестивального дня» (ночные сеты до этого часа относятся к предыдущему дню афиши).
- Как отображается: пользователю напрямую не показывается.
- Требования: целое число
0–23(час от полуночи). Если не задано — используется значение по умолчанию8(08:00). - Пример:
"logicalDayStartHour": 8— день афиши длится с 08:00 до 07:59 следующего календарного дня.
meta.lastItemId (рекомендуется при числовых items[].id)
- Где используется: монотонный счётчик выданных id слотов; следующий новый id =
lastItemId + 1. - Как отображается: пользователю не показывается.
- Требования: целое число
≥ 0. Должно быть не меньше любого чисто числовогоitems[].id. - При удалении слотов: значение не уменьшать, чтобы не пересечься с id, которые уже могли попасть в «Мой план».
- Пример: после слотов
"1"…"188"указать"lastItemId": 188.
3) Обязательные поля
stages[]
Каждая сцена:
{
"id": "main",
"name": "Главная сцена",
"short": "Главная",
"color": "#e6e04f",
"location": "ул. Примерная, 1"
}
Правила:
id— уникальный, латиница/цифры/дефис, стабильный.color— HEX в формате#RRGGBB.
stages[].location (опционально)
- Где используется: в приложении для отображения адреса площадки сцены.
- Как отображается: подпись к сцене в расписании (если задано).
- Требования: строка в свободном формате, например
ул. Первомайская, 14 (Площадь Солнца). - Если не задано: сцена отображается без адреса.
days[]
Каждый день:
{
"id": "2026-07-08",
"label": "8 июля",
"weekday": "среда"
}
Правила:
idдолжен быть в форматеYYYY-MM-DD.idдня должен быть уникальным.
items[]
Каждое событие:
{
"id": "55",
"day": "2026-07-10",
"stage": "main",
"time": "19:40",
"endTime": "20:10",
"title": "Браво"
}
Правила:
dayдолжен существовать вdays[].id.stageдолжен существовать вstages[].id.time— строгоHH:mm(например,09:05,23:40,00:00).idсобытия — уникальный и стабильный.
items[].endTime (опционально)
- Где используется: в приложении для отображения интервала выступления.
- Как отображается: вместе с
time, например19:40–20:10. - Требования: строка
HH:mmв том же формате, что иtime(допустимо00:00для окончания после полуночи). - Если не задано: в UI показывается только время начала (
time).
4) Критично про id событий
id нельзя без необходимости менять у уже опубликованных событий.
Почему: приложение хранит “Мой план” пользователей по event.id.
Если поменять id, старое сохранение перестанет совпадать с событием.
Рекомендуемый формат — короткий числовой id (строка):
"1", "2", "3", …
Правила нумерации:
- при создании расписания нумеровать слоты подряд с
"1"и выставитьmeta.lastItemIdна последний номер; - при добавлении новых слотов брать
meta.lastItemId + 1, затем обновитьmeta.lastItemId; - при удалении слотов
meta.lastItemIdне уменьшать; - если
meta.lastItemIdещё нет — fallback:max(числовые items[].id) + 1, иначе"1"; - старые длинные id вида
2026-07-10-main-19:40-55оставлять как есть — новые слоты в том же файле можно нумеровать коротко, опираясь наlastItemId.
5) Порядок подготовки расписания
- Заполнить
meta:- обязательно:
title,startDate,endDate; - желательно:
dates,location,schemaVersion,logoUrl,lastItemId.
- обязательно:
- Добавить все сцены в
stages. - Добавить все дни в
days. - Добавить события в
items. - Проверить ссылки:
- каждый
items[].dayесть вdays; - каждый
items[].stageесть вstages.
- каждый
- Проверить уникальность
idу сцен, дней и событий. - Проверить формат времени
HH:mmуtimeи (если задан)endTime. - При необходимости заполнить
stages[].locationиitems[].endTime.
6) Быстрая самопроверка перед публикацией
- JSON валидный (без лишних запятых и комментариев).
- В
metaзаполненыtitle,startDate,endDate. startDateиendDate— валидные даты в форматеYYYY-MM-DD.- Нет пустых
title. - Нет дублей
items[].id. - Для одного дня и сцены события логично идут по времени.
- Если задан
endTime, он позжеtime(с учётом перехода через полночь, например23:30→00:00). - После правок старые
idсохранены (если не было цели их заменить).
7) Где разместить готовый файл
- Опубликуйте JSON на любом публично доступном URL с
https://(сайт, облако, CDN). - В приложении добавьте событие по этой ссылке или через диплинк.
8) Пример минимального рабочего файла
{
"meta": {
"title": "Тестовое событие",
"dates": "1-2 августа 2026",
"location": "Тестовая площадка",
"schemaVersion": 1,
"startDate": "2026-08-01",
"endDate": "2026-08-02",
"logoUrl": "https://example.com/festival-logo.png"
},
"stages": [
{
"id": "main",
"name": "Главная сцена",
"short": "Главная",
"color": "#e6e04f",
"location": "Фестивальная площадка, главный вход"
}
],
"days": [
{
"id": "2026-08-01",
"label": "1 августа",
"weekday": "суббота"
}
],
"items": [
{
"id": "2026-08-01-main-18:00-0",
"day": "2026-08-01",
"stage": "main",
"time": "18:00",
"endTime": "18:30",
"title": "Открытие"
}
]
}
Для пользователей приложения
Если вы гость фестиваля, а не организатор — пошаговое руководство по всем функциям приложения (расписание, личный план, «Сейчас», напоминания, PDF) опубликовано на странице Как пользоваться приложением Сценарий .
Сформировать диплинк
Когда JSON с расписанием уже размещён на вашем сайте, в облаке или на другом хостинге с публичной ссылкой, здесь можно сформировать диплинк — по нему событие откроется сразу в приложении, без ручного ввода URL.