Content Categories — taxonomy, decks and cadence
The on-air channel is a playlist of categories. Each category is a deck on
disk (E:\radionew\media\<category>\), a set of files the scheduler samples to
build the rotation. This section documents every category in depth: what it is,
its file structure, how it is generated, the equations that govern its audio,
how the scheduler slots it into the rotation, and how to verify it on air.
The category table
| Category | Deck dir | Type | Cooldown | Cadence slot | liq cross override |
|---|---|---|---|---|---|
arabic_hits | media/arabic_hits | music | 3 h | — | none (2 s) |
egyptian_trends | media/egyptian_trends | music | 3 h | — | none (2 s) |
arab_techno | media/arab_techno | music | 3 h | — | none (2 s) |
english | media/english | music | 3 h | — | none (2 s) |
mashups | media/mashups | music | 3 h | MASHUP_EVERY | none (2 s) |
ads | media/ads | imaging | 10 min | AD_EVERY | 0.5 |
news | media/news | imaging | 10 min | NEWS_EVERY | 0.5 |
jingles | media/jingles | imaging | 10 min | sig-jingle slots | 0.5 |
sweepers | media/sweepers | imaging | 10 min | — | 0.5 |
sfx | media/sfx | imaging | 10 min | STOCHASTIC_SFX_CHANCE | 0.2 |
shorts | media/shorts | music | 10 min | — | 0.2 |
Two fundamental rules that apply to every category
1. Every file on air is R128-mastered to the same loudness. Every generator in the pipeline ends with two-pass EBU R128 normalisation to integrated −14 LUFS at −1.5 dBTP. The master stream is OGG Vorbis at 500 kbps and the HLS bridge re-encodes it to 256 k AAC, so a loudness-consistent source set is what keeps mixes and imaging from sounding louder or quieter than the songs.
2. Every track carries liq_cross_duration except music and mashups. The
remote Liquidsoap runs cross(duration=2.0) — it pre-buffers two seconds of the
incoming track before every transition. A 0.24 s stinger would starve that
buffer and glitch (72 cross-buffer warnings were logged before the fix), so the
m3u writer annotates short categories with an override:
Rotation anatomy (BUFFER_MAX = 120)
The scheduler builds a 120-track buffer (ROTATION.BUFFER_MAX) that is pushed
to the remote as main.m3u; Liquidsoap plays it linearly and the engine
rotates a new head whenever playback advances. The build interleaves:
Cadence slots are MASHUP_EVERY ≈ targetSize / mashupCap, AD_EVERY ≈ targetSize / 8, and the news cadence (~every 20–24 slots, ≈ hourly). The
signature jingle fires on a randomised cadence of 2–5 imaging slots. Deep night
(02–05) hard-gates the rotation to english music plus imaging.
Deck lifecycle (per category)
Refresh keeps every deck near its cap (arabic_hits 60, egyptian_trends 40,
arab_techno 40, english 40, ads 30, mashups 80); checkPoolHealth() restores
any deck that drops below 50 % of its cap from the archive.
Each sub-page below covers one category with its full definition, file structure, generator recipes, equations and verification steps.