Skip to main content

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

CategoryDeck dirTypeCooldownCadence slotliq cross override
arabic_hitsmedia/arabic_hitsmusic3 hnone (2 s)
egyptian_trendsmedia/egyptian_trendsmusic3 hnone (2 s)
arab_technomedia/arab_technomusic3 hnone (2 s)
englishmedia/englishmusic3 hnone (2 s)
mashupsmedia/mashupsmusic3 hMASHUP_EVERYnone (2 s)
adsmedia/adsimaging10 minAD_EVERY0.5
newsmedia/newsimaging10 minNEWS_EVERY0.5
jinglesmedia/jinglesimaging10 minsig-jingle slots0.5
sweepersmedia/sweepersimaging10 min0.5
sfxmedia/sfximaging10 minSTOCHASTIC_SFX_CHANCE0.2
shortsmedia/shortsmusic10 min0.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.

Ltarget=14 LUFS,TPmax=1.5 dBTP,LRA11 LUL_{target} = -14\ \mathrm{LUFS},\qquad TP_{max} = -1.5\ \mathrm{dBTP},\qquad LRA \le 11\ \mathrm{LU}

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:

τcross={0.2sfx, shorts0.5jingles, sweepers, ads, news, talkshow, programs2.0music, mashups (no override)\tau_{cross} = \begin{cases} 0.2 & \text{sfx, shorts} \\[2pt] 0.5 & \text{jingles, sweepers, ads, news, talkshow, programs} \\[2pt] 2.0 & \text{music, mashups (no override)} \end{cases}

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.