Skip to content

[Backend] Управлять режимами эфира с помощью json-конфигов #16

@grouzdev

Description

@grouzdev

Задача

Предлагаю вынести логику переключения режимов в json-файлы, к которым может обращаться и сервер и клиент. Это позволит:

  • включать и выключать режим события без правок на сервере и деплоя клиента
  • настраивать соотношение day/songs
  • в целом откроет возможность гибко редактировать эфирную сетку без правок кода

Условия, которые должны соблюдаться:

  • поддержка 4 потоков: основного, дневного, вечернего и ночного
  • основной поток должен работать синхронно с отдельными потоками
Image

Формат json-конфигов

Для каждого потока заводим свой json:

  • main.json — основной поток
  • day.json — поток в котором только дневные треки
  • evening.json — поток в котором только вечерние треки
  • night.json — поток в котором только ночные треки

Каждый json состоит из массива объектов с полями:

  • (int) time — Серверное (московское) время в минутах с начала суток
  • (string) air — указатель на другой эфир
  • (array) playlist — Массив объектов, описывающих какие треки нужно брать из плейлиста, параметры:
    • path — путь по которому нужно найти файл _playlist.txt
    • id — идентификатор airID по которому нужно выбирать файлы из _playlist.txt
    • count — количество треков, которые нужно взять прежде чем перейти к следующему элементу массива

Логика составления эфира

При составлении программы нужно выбрать один элемент массива, ориентируясь на текущее серверное время и параметр time. В time указано количество минут, которые должны пройти с серверной полуночи до активации программы, описанной элементом массива.

currentTime = Now().hours * 60 + Now().minutes
chosenAir = первый элемент массива
foreach element
  if ((currentTime >= element.time) && (element.time >= chosenAir.time){
    chosenAir = element

В результате в chosenAir получаем объект в котором содержится либо air (string) либо playlist (json).

Если получили air — значит сейчас нужно ретранслировать поток с таким идентификатором. По факту это нужно только для потока main (но в теории можно и делать ретрансляцию другой станции :)

Если получили playlist — значит нужно сформировать новую очередь файлов. Параметр playlist сам является массивом, содержащим объекты с такими полями:

Для каждого объекта нужно найти конфиг, который находится в файле path/_playlist.txt и добавить из него count треков, у которых airID совпадает с id текущего объекта.


main.json

Рассмотрим на примере основного потока, который должен работать по такой логике:

  • с 0 до 1 играет программа midnight, составляемая из файлов плейлиста
  • с 1 до 7 ведётся ретрансляция потока night
  • с 7 до 19 ведётся ретрансляция потока day
  • с 19 до 0 ведётся ретрансляция потока evening

Получаем такой код:

[
	{
		"time": 0,
		"playlist": [
			{
				"id": "midnight",
				"path": "music",
				"count": 10
			},
			{
				"id": "midnight",
				"path": "jingles",
				"count": 1
			}
		]
	},
	{
		"time": 60,
		"air": "night"
	},
	{
		"time": 420,
		"air": "day"
	},
	{
		"time": 1140,
		"air": "evening"
	}
]

Указаны тайминги:

  • 0 — полночь по Москве
  • 60 — 1 час
  • 420 — 7 часов
  • 1140 — 19 часов

Для ретрансляций в поле air просто указан поток, который нужно ретранслировать: night, day или evening.

Для полуночного эфира список формируется по _playlist.txt:

			{
				"id": "midnight",
				"path": "music",
				"count": 10
			},
			{
				"id": "midnight",
				"path": "jingles",
				"count": 1
			}
  1. Сначала смотрим в файл music/_playlist.txt, и выбираем из него 10 треков, у которых есть префикс "midnight/"
  2. Затем смотрим в файл jingles/_playlist.txt, и выбираем из него 1 трек, у которого есть префикс "midnight/"
  3. Повторяем цикл с п.1 пока не наберём нужное кол-во треков

Режим события

В такой реализации для переключения в режим события, когда на протяжении всего дня играет отдельный плейлист, достаточно просто подменить main.json, и не переключать ничего на сервере. Также к main.json должен быть доступ со стороны клиента, чтобы и деплоить его было не нужно.

Пример main.json для режима события:

[
    {
        "time": 0,
        "playlist": [
            {
                "id": "event",
                "path": "event/space",
                "count": 10
            },
            {
                "id": "event",
                "path": "jingles",
                "count": 1
            }
        ]
    }
]

Примеры всех четырёх конфигов см. в аттаче

evening.json

  • 10 треков из music/, с префиксом "evening"
  • 1 трек из jingles/ с префиксом "evening"

day.json

  • 2 трека из music/ с префиксом "day"
  • 1 трек из music/ с префиксом "songs"
  • 2 трека из music/ с префиксом "day"
  • 1 трек из music/ с префиксом "songs"
  • 2 трека из music/ с префиксом "day"
  • 1 трек из music/ с префиксом "songs"
  • 1 трек из jingles/ с префиксом "day"

night.json

Чередуются папки midnight (1 час) и night (11 часов)

с 0 до 1

  • 10 треков из music/ с префиксом "midnight"
  • 1 трек из jungles/ с префиксом "midnight"

с 1 до 12

  • 10 треков из music/ с префиксом "night"
  • 1 трек из jungles/ с префиксом "night"

с 12 до 13

  • 10 треков из music/ с префиксом "midnight"
  • 1 трек из jungles/ с префиксом "midnight"

с 13 до 0

  • 10 треков из music/ с префиксом "night"
  • 1 трек из jungles/ с префиксом "night"

evening.json
main.json
night.json
day.json

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions