Для организаторов

Инструкция по подготовке 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",
    "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.

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": "2026-07-10-main-19:40-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, старое сохранение перестанет совпадать с событием.

Рекомендуемый шаблон:

<day>-<stage>-<time>-<index>

Например:

  • 2026-07-10-main-19:40-55
  • 2026-07-11-south-23:30-100

5) Порядок подготовки расписания

  1. Заполнить meta:
    • обязательно: title, startDate, endDate;
    • желательно: dates, location, schemaVersion, logoUrl.
  2. Добавить все сцены в stages.
  3. Добавить все дни в days.
  4. Добавить события в items.
  5. Проверить ссылки:
    • каждый items[].day есть в days;
    • каждый items[].stage есть в stages.
  6. Проверить уникальность id у сцен, дней и событий.
  7. Проверить формат времени HH:mm у time и (если задан) endTime.
  8. При необходимости заполнить stages[].location и items[].endTime.

6) Быстрая самопроверка перед публикацией

  • JSON валидный (без лишних запятых и комментариев).
  • В meta заполнены title, startDate, endDate.
  • startDate и endDate — валидные даты в формате YYYY-MM-DD.
  • Нет пустых title.
  • Нет дублей items[].id.
  • Для одного дня и сцены события логично идут по времени.
  • Если задан endTime, он позже time (с учётом перехода через полночь, например 23:3000:00).
  • После правок старые id сохранены (если не было цели их заменить).

7) Где разместить готовый файл

  • Опубликуйте JSON на любом публично доступном URL с https:// (сайт, облако, CDN).
  • В приложении добавьте событие по этой ссылке или через диплинк.
  • Для подготовки локально можно хранить черновик, например jsons/my-festival-2026.json, и затем выложить на хостинг.

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": "Открытие"
    }
  ]
}