-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Задача
Предлагаю вынести логику переключения режимов в json-файлы, к которым может обращаться и сервер и клиент. Это позволит:
- включать и выключать режим события без правок на сервере и деплоя клиента
- настраивать соотношение day/songs
- в целом откроет возможность гибко редактировать эфирную сетку без правок кода
Условия, которые должны соблюдаться:
- поддержка 4 потоков: основного, дневного, вечернего и ночного
- основной поток должен работать синхронно с отдельными потоками
Формат 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 сам является массивом, содержащим объекты с такими полями:
- (string) id — Идентификатор эфира (airID из тикета [Backend] Формировать плейлисты по текствовму файлу со списком треков #15 )
- (string) path — Относительный путь к файлу _playlist.txt
- (int) count — Количество треков, которые нужно добавить в очередь
Для каждого объекта нужно найти конфиг, который находится в файле 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
}
- Сначала смотрим в файл music/_playlist.txt, и выбираем из него 10 треков, у которых есть префикс "midnight/"
- Затем смотрим в файл jingles/_playlist.txt, и выбираем из него 1 трек, у которого есть префикс "midnight/"
- Повторяем цикл с п.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"