Implement BumperEndpoints and remove deprecated bumper-related functionality
Added new BumperEndpoints to the API for managing bumper templates and variants, enhancing the channel management capabilities. Removed outdated bumper-related commands and handlers from the application, streamlining the codebase and improving maintainability. Updated ChannelEndpoints to reflect these changes and ensure proper routing for the new endpoints.
This commit is contained in:
@@ -457,8 +457,6 @@ export const en = {
|
||||
everyDay: 'every day',
|
||||
daypart: 'Daypart',
|
||||
slotKind: 'Slot type',
|
||||
group: 'Group',
|
||||
pickGroup: 'pick a group',
|
||||
strategy: 'Strategy',
|
||||
cooldownDays: 'Cooldown, days',
|
||||
cooldownHint: 'Skip what already aired within this period.',
|
||||
@@ -475,8 +473,6 @@ export const en = {
|
||||
maxDrift: 'Allowance, min',
|
||||
snap: 'Snap',
|
||||
snapOff: 'off',
|
||||
bumperConditionsHint:
|
||||
'How often a bumper is inserted and on which transitions is a junction-element condition, not a channel setting.',
|
||||
resizeSlot: 'Drag the edge to change duration',
|
||||
copyDay: 'Copy day',
|
||||
copyDayFrom: 'Copy {{day}} to:',
|
||||
@@ -497,7 +493,6 @@ export const en = {
|
||||
grid: 'Grid',
|
||||
rules: 'Rules',
|
||||
junctions: 'Junctions',
|
||||
bumpers: 'Bumpers',
|
||||
viewer: 'Viewer',
|
||||
settings: 'Settings',
|
||||
air: 'On air',
|
||||
@@ -603,30 +598,12 @@ export const en = {
|
||||
'What plays between programmes: ads, promos, bumpers. A slot may pick its own junction, otherwise the default one is used.',
|
||||
defaultJunction: 'Default junction',
|
||||
noJunction: 'no junction',
|
||||
newJunctionName: 'New junction',
|
||||
addJunctionElement: '+ break',
|
||||
junctionEmpty: 'empty',
|
||||
junctionFrom: 'end',
|
||||
junctionTo: 'start',
|
||||
junctionElement: 'Break',
|
||||
junctionKind: 'Kind',
|
||||
junctionKinds: { Ad: 'Ad', Promo: 'Promo', Bumper: 'Bumper', Filler: 'Filler' },
|
||||
junctionAmountMode: 'Measured in',
|
||||
junctionAmountModes: { Count: 'Units', Duration: 'Minutes' },
|
||||
junctionCount: 'How many units',
|
||||
junctionMinutes: 'How many minutes',
|
||||
junctionAmountHint:
|
||||
'For a mixed group (clips and ready-made blocks) count in minutes: one "unit" there is either a clip or a whole block.',
|
||||
junctionRequired: 'Required — never dropped when time runs short',
|
||||
junctionOnlyOnChange: 'Only when the show changes',
|
||||
junctionMinInterval: 'No more often than once per, min',
|
||||
junctionMinIntervalHint: '0 — no limit.',
|
||||
junctionBetween: 'Junction inside the slot',
|
||||
junctionAfter: 'Junction after the slot',
|
||||
junctionDefault: 'default',
|
||||
bumperTemplate: 'Bumper block',
|
||||
pickBumperTemplate: 'pick a block',
|
||||
minutesShort: ' min',
|
||||
junctionsUsed: 'Used by this channel',
|
||||
junctionsNoneUsed: 'The channel references no junction — nothing plays between programmes.',
|
||||
openJunctionEditor: 'Junction editor',
|
||||
pendingChanges: 'Rules changed — the air still follows the old ones.',
|
||||
restore: 'Discard changes',
|
||||
restoreConfirm:
|
||||
@@ -677,64 +654,150 @@ export const en = {
|
||||
enabled: 'On air',
|
||||
enabledLabel: 'Channel on air',
|
||||
settings: 'Settings',
|
||||
bumpers: 'TV bumpers',
|
||||
bumpersLabel: 'Transition bumpers',
|
||||
bumpersHint: 'Short “Now / Next” bumper between different shows',
|
||||
bumperSelection: 'Block selection',
|
||||
bumperSelectionRandom: 'Random',
|
||||
bumperSelectionWeighted: 'Weighted random',
|
||||
bumperSelectionAlwaysFirst: 'Always first',
|
||||
bumperFont: 'Font',
|
||||
bumperFontSans: 'Sans',
|
||||
bumperFontSerif: 'Serif',
|
||||
bumperNowLabel: '“Now” label',
|
||||
bumperNextLabel: '“Next” label',
|
||||
bumperBg: 'Background (color 1)',
|
||||
bumperBg2: 'Background (color 2)',
|
||||
bumperAccent: 'Accent',
|
||||
bumperText: 'Text',
|
||||
bumperTemplates: 'Bumper blocks',
|
||||
bumperTemplatesHint:
|
||||
'Each block has its own sound and style. The first block is the default and cannot be removed. Bumper length follows the sound length.',
|
||||
bumperAddTemplate: 'Add block',
|
||||
bumperTemplateName: 'Name',
|
||||
bumperVariants: 'Sub-blocks (text)',
|
||||
bumperVariantsHint:
|
||||
'Different text over the same music and style. Each sub-block has its own show rule.',
|
||||
bumperAddVariant: 'Add text',
|
||||
bumperVariantName: 'Name',
|
||||
bumperTextKind: 'Text mode',
|
||||
bumperKindNowNext: 'Now / Next',
|
||||
bumperKindFree: 'Free text',
|
||||
bumperLine1: 'Line 1',
|
||||
bumperLine2: 'Line 2',
|
||||
bumperTrigger: 'Show on',
|
||||
bumperTriggerOnShowChange: 'Show change',
|
||||
bumperTriggerBetweenEpisodes: 'Between episodes',
|
||||
bumperTriggerBoth: 'Both',
|
||||
bumperVariantWeight: 'Weight',
|
||||
bumperVariantWeightHint:
|
||||
'For the “weighted random” strategy: higher = more often (0 — never picked)',
|
||||
bumperDefault: 'default',
|
||||
bumperSeconds: 's',
|
||||
bumperDefaultDuration: '≈8 s (jingle)',
|
||||
bumperAudio: 'Sound',
|
||||
bumperAudioHint: 'Bumper sound; otherwise a synthesized jingle',
|
||||
bumperPreview: 'Render samples',
|
||||
bumperPreviewRendering: 'Rendering…',
|
||||
bumperPreviewHint:
|
||||
'Samples of all sub-blocks with sound and animation (example show names). Uses saved settings.',
|
||||
bumperBackground: 'Background image',
|
||||
bumperBackgroundHint: 'Background image; otherwise the show poster or a gradient',
|
||||
bumperBackgroundPick: 'Pick from gallery',
|
||||
bumperFileLoaded: 'loaded',
|
||||
bumperFileDefault: 'default',
|
||||
bumperUpload: 'Upload',
|
||||
bumperReset: 'Reset',
|
||||
filler: 'Filler',
|
||||
noFiller: 'No filler',
|
||||
noSchedule: 'Schedule not built yet',
|
||||
},
|
||||
junctions: {
|
||||
title: 'Junctions',
|
||||
hint: 'What plays between programmes: ads, promos, bumpers. A junction is shared across channels — a channel only picks which one a slot uses.',
|
||||
newName: 'New junction',
|
||||
empty0: 'No junctions yet.',
|
||||
empty: 'empty',
|
||||
from: 'end',
|
||||
to: 'start',
|
||||
fork: 'fork',
|
||||
addElement: '+ break',
|
||||
maxTotal: 'Cap, s',
|
||||
usedInChannels: 'in channels: {{count}}',
|
||||
cannotDeleteUsed: 'The junction is used by channels — drop the references first.',
|
||||
splitOut: 'Take out of the fork',
|
||||
mergeIntoFork: 'Merge with the previous one into a fork',
|
||||
element: 'Break',
|
||||
kind: 'Type',
|
||||
kinds: {
|
||||
Ad: 'Ad',
|
||||
Promo: 'Promo',
|
||||
Bumper: 'Bumper',
|
||||
Filler: 'Filler',
|
||||
},
|
||||
group: 'Group',
|
||||
pickGroup: 'pick a group',
|
||||
bumperTemplate: 'Bumper block',
|
||||
pickBumper: 'pick a block',
|
||||
bumperVariant: 'Text variant',
|
||||
bumperVariantAuto: 'by trigger and weights',
|
||||
bumperVariantHint:
|
||||
'Keep "by trigger and weights" so show changes and episode breaks get different texts.',
|
||||
amountMode: 'Measured in',
|
||||
amountModes: { Count: 'Units', Duration: 'Minutes' },
|
||||
count: 'How many units',
|
||||
minutes: 'How many minutes',
|
||||
minutesShort: ' min',
|
||||
amountHint:
|
||||
'For a mixed group (spots and ready-made blocks) count in minutes: one unit there is either a spot or a whole block.',
|
||||
required: 'Required',
|
||||
requiredHint:
|
||||
'Required only decides what gets dropped when time runs short. It does not affect the order — that is the position in the chain.',
|
||||
choiceWeight: 'Weight in the fork',
|
||||
choiceWeightHint: 'The higher, the more often this break plays (0 — never picked).',
|
||||
conditions: 'Conditions',
|
||||
onlyOnChange: 'Only on show change',
|
||||
chance: 'Chance, %',
|
||||
chanceHint:
|
||||
'Chance and interval are per break; the roll comes from the generation seed, so rebuilds do not reshuffle breaks.',
|
||||
minInterval: 'No more often than once per, min',
|
||||
dayparts: 'Dayparts',
|
||||
daypartsHint: 'Nothing selected — the break plays in any daypart.',
|
||||
timeWindow: 'Channel time window',
|
||||
clearWindow: 'Clear',
|
||||
timeWindowHint: 'Empty — any time. The window may cross midnight.',
|
||||
badgeOnChange: 'on change',
|
||||
badgeInterval: 'once per {{minutes}} min',
|
||||
},
|
||||
bumpers: {
|
||||
title: 'Bumpers',
|
||||
hint: 'Bumper blocks are shared across channels: look and sound belong to the block, text to its variants. A bumper reaches air as a junction break.',
|
||||
empty: 'No bumper blocks yet.',
|
||||
newName: 'New block',
|
||||
newNamePlaceholder: 'Block name',
|
||||
newVariantName: 'New text',
|
||||
sampleChannel: 'Preview as channel',
|
||||
sampleChannelNone: 'no channel',
|
||||
sampleChannelHint: 'The block is shared, but sample values come from the selected channel.',
|
||||
name: 'Name',
|
||||
font: 'Font',
|
||||
fontSans: 'Sans',
|
||||
fontSerif: 'Serif',
|
||||
colorBg: 'Background (colour 1)',
|
||||
colorBg2: 'Background (colour 2)',
|
||||
colorAccent: 'Accent',
|
||||
colorText: 'Text',
|
||||
saveStyle: 'Save look',
|
||||
seconds: 's',
|
||||
defaultDuration: '≈8 s (jingle)',
|
||||
variantsCount: 'texts: {{count}}',
|
||||
usedInJunctions: 'in breaks: {{count}}',
|
||||
cannotDeleteUsed: 'The block is used by junction breaks — drop the references first.',
|
||||
audio: 'Sound',
|
||||
audioHint: 'The sound length sets the bumper duration; without it a jingle is synthesised.',
|
||||
background: 'Background',
|
||||
backgroundFieldHint: 'Block background image; otherwise a palette gradient or a show poster.',
|
||||
backgroundPick: 'Pick from gallery',
|
||||
backgrounds: {
|
||||
Template: 'Block background',
|
||||
NextPoster: 'Next show poster',
|
||||
NowPoster: 'Previous show poster',
|
||||
},
|
||||
fileLoaded: 'loaded',
|
||||
fileDefault: 'default',
|
||||
upload: 'Upload',
|
||||
reset: 'Reset',
|
||||
variants: 'Text variants',
|
||||
variantsHint:
|
||||
'Different text over the same music and look. Trigger and background are per variant.',
|
||||
addVariant: 'Add text',
|
||||
variantName: 'Name',
|
||||
trigger: 'Show on',
|
||||
triggers: {
|
||||
OnShowChange: 'Show change',
|
||||
BetweenEpisodes: 'Between episodes',
|
||||
Both: 'Both',
|
||||
},
|
||||
weight: 'Weight',
|
||||
lineStyles: { Label: 'Label', Title: 'Title', Caption: 'Caption' },
|
||||
lineColors: { Accent: 'Accent', Text: 'Text' },
|
||||
addLine: 'Line',
|
||||
presets: 'Presets',
|
||||
preset_nowNext: 'Now / Next',
|
||||
preset_nextAt: 'Next at …',
|
||||
preset_channel: 'Channel ident',
|
||||
presetNow: 'NOW',
|
||||
presetNext: 'NEXT',
|
||||
presetNextAt: 'NEXT AT',
|
||||
framePreview: 'Frame',
|
||||
framePreviewHint: 'Sample substitution: this is how the line looks on air.',
|
||||
unknownPlaceholder: 'Unknown placeholder: {{tokens}}',
|
||||
volatileHint: 'every airing is unique — the render cache stops working',
|
||||
render: 'Render samples',
|
||||
rendering: 'Rendering…',
|
||||
renderHint: 'A real ffmpeg render of every variant with sound — takes a few seconds.',
|
||||
tokens: {
|
||||
channel: 'Channel name',
|
||||
'channel.number': 'Channel number',
|
||||
'now.title': 'Current show',
|
||||
'next.title': 'Next show',
|
||||
'now.episode': 'Current episode',
|
||||
'next.episode': 'Next episode',
|
||||
'next.year': 'Next show year',
|
||||
'next.genre': 'Next show genre',
|
||||
'next.time': 'Next start time',
|
||||
time: 'Bumper airing time',
|
||||
date: 'Date',
|
||||
weekday: 'Weekday',
|
||||
slot: 'Slot title',
|
||||
},
|
||||
},
|
||||
maintenance: {
|
||||
title: 'Maintenance',
|
||||
warning: 'These actions are irreversible — data and files are deleted permanently.',
|
||||
|
||||
Reference in New Issue
Block a user