update translations, remove help text from db and apply it only in frontend

This commit is contained in:
Jonathan Baecker 2024-10-10 17:57:01 +02:00
parent ebc385bf68
commit 7a1a6f2868
8 changed files with 126 additions and 134 deletions

View File

@ -267,23 +267,19 @@ where
pub struct Configuration { pub struct Configuration {
pub id: i32, pub id: i32,
pub channel_id: i32, pub channel_id: i32,
pub general_help: String,
pub general_stop_threshold: f64, pub general_stop_threshold: f64,
pub mail_help: String,
pub mail_subject: String, pub mail_subject: String,
pub mail_recipient: String, pub mail_recipient: String,
pub mail_level: String, pub mail_level: String,
pub mail_interval: i64, pub mail_interval: i64,
pub logging_help: String,
pub logging_ffmpeg_level: String, pub logging_ffmpeg_level: String,
pub logging_ingest_level: String, pub logging_ingest_level: String,
pub logging_detect_silence: bool, pub logging_detect_silence: bool,
#[serde(default)] #[serde(default)]
pub logging_ignore: String, pub logging_ignore: String,
pub processing_help: String,
pub processing_mode: String, pub processing_mode: String,
pub processing_audio_only: bool, pub processing_audio_only: bool,
pub processing_copy_audio: bool, pub processing_copy_audio: bool,
@ -311,34 +307,28 @@ pub struct Configuration {
#[serde(default)] #[serde(default)]
pub processing_vtt_dummy: Option<String>, pub processing_vtt_dummy: Option<String>,
pub ingest_help: String,
pub ingest_enable: bool, pub ingest_enable: bool,
pub ingest_param: String, pub ingest_param: String,
#[serde(default)] #[serde(default)]
pub ingest_filter: String, pub ingest_filter: String,
pub playlist_help: String,
pub playlist_day_start: String, pub playlist_day_start: String,
pub playlist_length: String, pub playlist_length: String,
pub playlist_infinit: bool, pub playlist_infinit: bool,
pub storage_help: String,
pub storage_filler: String, pub storage_filler: String,
pub storage_extensions: String, pub storage_extensions: String,
pub storage_shuffle: bool, pub storage_shuffle: bool,
pub text_help: String,
pub text_add: bool, pub text_add: bool,
pub text_from_filename: bool, pub text_from_filename: bool,
pub text_font: String, pub text_font: String,
pub text_style: String, pub text_style: String,
pub text_regex: String, pub text_regex: String,
pub task_help: String,
pub task_enable: bool, pub task_enable: bool,
pub task_path: String, pub task_path: String,
pub output_help: String,
pub output_mode: String, pub output_mode: String,
pub output_param: String, pub output_param: String,
} }
@ -348,19 +338,15 @@ impl Configuration {
Self { Self {
id, id,
channel_id, channel_id,
general_help: config.general.help_text,
general_stop_threshold: config.general.stop_threshold, general_stop_threshold: config.general.stop_threshold,
mail_help: config.mail.help_text,
mail_subject: config.mail.subject, mail_subject: config.mail.subject,
mail_recipient: config.mail.recipient, mail_recipient: config.mail.recipient,
mail_level: config.mail.mail_level.to_string(), mail_level: config.mail.mail_level.to_string(),
mail_interval: config.mail.interval, mail_interval: config.mail.interval,
logging_help: config.logging.help_text,
logging_ffmpeg_level: config.logging.ffmpeg_level, logging_ffmpeg_level: config.logging.ffmpeg_level,
logging_ingest_level: config.logging.ingest_level, logging_ingest_level: config.logging.ingest_level,
logging_detect_silence: config.logging.detect_silence, logging_detect_silence: config.logging.detect_silence,
logging_ignore: config.logging.ignore_lines.join(";"), logging_ignore: config.logging.ignore_lines.join(";"),
processing_help: config.processing.help_text,
processing_mode: config.processing.mode.to_string(), processing_mode: config.processing.mode.to_string(),
processing_audio_only: config.processing.audio_only, processing_audio_only: config.processing.audio_only,
processing_audio_track_index: config.processing.audio_track_index, processing_audio_track_index: config.processing.audio_track_index,
@ -381,28 +367,22 @@ impl Configuration {
processing_filter: config.processing.custom_filter, processing_filter: config.processing.custom_filter,
processing_vtt_enable: config.processing.vtt_enable, processing_vtt_enable: config.processing.vtt_enable,
processing_vtt_dummy: config.processing.vtt_dummy, processing_vtt_dummy: config.processing.vtt_dummy,
ingest_help: config.ingest.help_text,
ingest_enable: config.ingest.enable, ingest_enable: config.ingest.enable,
ingest_param: config.ingest.input_param, ingest_param: config.ingest.input_param,
ingest_filter: config.ingest.custom_filter, ingest_filter: config.ingest.custom_filter,
playlist_help: config.playlist.help_text,
playlist_day_start: config.playlist.day_start, playlist_day_start: config.playlist.day_start,
playlist_length: config.playlist.length, playlist_length: config.playlist.length,
playlist_infinit: config.playlist.infinit, playlist_infinit: config.playlist.infinit,
storage_help: config.storage.help_text,
storage_filler: config.storage.filler, storage_filler: config.storage.filler,
storage_extensions: config.storage.extensions.join(";"), storage_extensions: config.storage.extensions.join(";"),
storage_shuffle: config.storage.shuffle, storage_shuffle: config.storage.shuffle,
text_help: config.text.help_text,
text_add: config.text.add_text, text_add: config.text.add_text,
text_font: config.text.font, text_font: config.text.font,
text_from_filename: config.text.text_from_filename, text_from_filename: config.text.text_from_filename,
text_style: config.text.style, text_style: config.text.style,
text_regex: config.text.regex, text_regex: config.text.regex,
task_help: config.task.help_text,
task_enable: config.task.enable, task_enable: config.task.enable,
task_path: config.task.path.to_string_lossy().to_string(), task_path: config.task.path.to_string_lossy().to_string(),
output_help: config.output.help_text,
output_mode: config.output.mode.to_string(), output_mode: config.output.mode.to_string(),
output_param: config.output.output_param, output_param: config.output.output_param,
} }

View File

@ -199,7 +199,6 @@ impl Channel {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct General { pub struct General {
pub help_text: String,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
pub id: i32, pub id: i32,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
@ -222,7 +221,6 @@ pub struct General {
impl General { impl General {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.general_help.clone(),
id: config.id, id: config.id,
channel_id: config.channel_id, channel_id: config.channel_id,
stop_threshold: config.general_stop_threshold, stop_threshold: config.general_stop_threshold,
@ -238,7 +236,6 @@ impl General {
#[derive(Debug, Clone, Deserialize, Serialize)] #[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Mail { pub struct Mail {
pub help_text: String,
pub subject: String, pub subject: String,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
pub smtp_server: String, pub smtp_server: String,
@ -256,7 +253,6 @@ pub struct Mail {
impl Mail { impl Mail {
fn new(global: &models::GlobalSettings, config: &models::Configuration) -> Self { fn new(global: &models::GlobalSettings, config: &models::Configuration) -> Self {
Self { Self {
help_text: config.mail_help.clone(),
subject: config.mail_subject.clone(), subject: config.mail_subject.clone(),
smtp_server: global.mail_smtp.clone(), smtp_server: global.mail_smtp.clone(),
starttls: global.mail_starttls, starttls: global.mail_starttls,
@ -272,7 +268,6 @@ impl Mail {
impl Default for Mail { impl Default for Mail {
fn default() -> Self { fn default() -> Self {
Mail { Mail {
help_text: String::default(),
subject: String::default(), subject: String::default(),
smtp_server: String::default(), smtp_server: String::default(),
starttls: bool::default(), starttls: bool::default(),
@ -287,7 +282,6 @@ impl Default for Mail {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Logging { pub struct Logging {
pub help_text: String,
pub ffmpeg_level: String, pub ffmpeg_level: String,
pub ingest_level: String, pub ingest_level: String,
pub detect_silence: bool, pub detect_silence: bool,
@ -297,7 +291,6 @@ pub struct Logging {
impl Logging { impl Logging {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.logging_help.clone(),
ffmpeg_level: config.logging_ffmpeg_level.clone(), ffmpeg_level: config.logging_ffmpeg_level.clone(),
ingest_level: config.logging_ingest_level.clone(), ingest_level: config.logging_ingest_level.clone(),
detect_silence: config.logging_detect_silence, detect_silence: config.logging_detect_silence,
@ -312,7 +305,6 @@ impl Logging {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Processing { pub struct Processing {
pub help_text: String,
pub mode: ProcessMode, pub mode: ProcessMode,
pub audio_only: bool, pub audio_only: bool,
pub copy_audio: bool, pub copy_audio: bool,
@ -345,7 +337,6 @@ pub struct Processing {
impl Processing { impl Processing {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.processing_help.clone(),
mode: ProcessMode::new(&config.processing_mode.clone()), mode: ProcessMode::new(&config.processing_mode.clone()),
audio_only: config.processing_audio_only, audio_only: config.processing_audio_only,
audio_track_index: config.processing_audio_track_index, audio_track_index: config.processing_audio_track_index,
@ -374,7 +365,6 @@ impl Processing {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Ingest { pub struct Ingest {
pub help_text: String,
pub enable: bool, pub enable: bool,
pub input_param: String, pub input_param: String,
pub custom_filter: String, pub custom_filter: String,
@ -385,7 +375,6 @@ pub struct Ingest {
impl Ingest { impl Ingest {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.ingest_help.clone(),
enable: config.ingest_enable, enable: config.ingest_enable,
input_param: config.ingest_param.clone(), input_param: config.ingest_param.clone(),
custom_filter: config.ingest_filter.clone(), custom_filter: config.ingest_filter.clone(),
@ -396,7 +385,6 @@ impl Ingest {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Playlist { pub struct Playlist {
pub help_text: String,
pub day_start: String, pub day_start: String,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
pub start_sec: Option<f64>, pub start_sec: Option<f64>,
@ -409,7 +397,6 @@ pub struct Playlist {
impl Playlist { impl Playlist {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.playlist_help.clone(),
day_start: config.playlist_day_start.clone(), day_start: config.playlist_day_start.clone(),
start_sec: None, start_sec: None,
length: config.playlist_length.clone(), length: config.playlist_length.clone(),
@ -421,7 +408,6 @@ impl Playlist {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Storage { pub struct Storage {
pub help_text: String,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
pub path: PathBuf, pub path: PathBuf,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
@ -438,7 +424,6 @@ pub struct Storage {
impl Storage { impl Storage {
fn new(config: &models::Configuration, path: PathBuf, shared_storage: bool) -> Self { fn new(config: &models::Configuration, path: PathBuf, shared_storage: bool) -> Self {
Self { Self {
help_text: config.storage_help.clone(),
path, path,
paths: vec![], paths: vec![],
filler: config.storage_filler.clone(), filler: config.storage_filler.clone(),
@ -456,7 +441,6 @@ impl Storage {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Text { pub struct Text {
pub help_text: String,
pub add_text: bool, pub add_text: bool,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
pub node_pos: Option<usize>, pub node_pos: Option<usize>,
@ -476,7 +460,6 @@ pub struct Text {
impl Text { impl Text {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.text_help.clone(),
add_text: config.text_add, add_text: config.text_add,
node_pos: None, node_pos: None,
zmq_stream_socket: None, zmq_stream_socket: None,
@ -492,7 +475,6 @@ impl Text {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Task { pub struct Task {
pub help_text: String,
pub enable: bool, pub enable: bool,
pub path: PathBuf, pub path: PathBuf,
} }
@ -500,7 +482,6 @@ pub struct Task {
impl Task { impl Task {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.task_help.clone(),
enable: config.task_enable, enable: config.task_enable,
path: PathBuf::from(config.task_path.clone()), path: PathBuf::from(config.task_path.clone()),
} }
@ -509,7 +490,6 @@ impl Task {
#[derive(Debug, Default, Clone, Deserialize, Serialize)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Output { pub struct Output {
pub help_text: String,
pub mode: OutputMode, pub mode: OutputMode,
pub output_param: String, pub output_param: String,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
@ -523,7 +503,6 @@ pub struct Output {
impl Output { impl Output {
fn new(config: &models::Configuration) -> Self { fn new(config: &models::Configuration) -> Self {
Self { Self {
help_text: config.output_help.clone(),
mode: OutputMode::new(&config.output_mode), mode: OutputMode::new(&config.output_mode),
output_param: config.output_param.clone(), output_param: config.output_param.clone(),
output_count: 0, output_count: 0,

View File

@ -9,6 +9,11 @@
<template v-for="(item, key) in configStore.playout" :key="key"> <template v-for="(item, key) in configStore.playout" :key="key">
<div class="text-xl pt-3 text-right">{{ setTitle(key.toString()) }}:</div> <div class="text-xl pt-3 text-right">{{ setTitle(key.toString()) }}:</div>
<div class="md:pt-4"> <div class="md:pt-4">
<label class="form-control mb-2">
<div class="whitespace-pre-line">
{{ setHelp(key.toString()) }}
</div>
</label>
<label <label
v-for="(prop, name) in (item as Record<string, any>)" v-for="(prop, name) in (item as Record<string, any>)"
:key="name" :key="name"
@ -22,14 +27,11 @@
!(name.toString() === 'path' && key.toString() === 'storage') !(name.toString() === 'path' && key.toString() === 'storage')
" "
> >
<div v-if="name.toString() !== 'help_text'" class="label"> <div class="label">
<span class="label-text !text-md font-bold">{{ name }}</span> <span class="label-text !text-md font-bold">{{ name }}</span>
</div> </div>
<div v-if="name.toString() === 'help_text'" class="whitespace-pre-line">
{{ setHelp(key.toString(), prop) }}
</div>
<input <input
v-else-if="name.toString() === 'sender_pass'" v-if="name.toString() === 'sender_pass'"
v-model="item[name]" v-model="item[name]"
type="password" type="password"
:placeholder="t('config.placeholderPass')" :placeholder="t('config.placeholderPass')"
@ -141,32 +143,33 @@ function setTitle(input: string): string {
} }
} }
function setHelp(key: string, text: string): string { function setHelp(key: string): string {
console.log('key:', key)
switch (key) { switch (key) {
case 'general': case 'general':
return t('config.generalText') return t('config.generalHelp')
case 'rpc_server': case 'rpc_server':
return t('config.rpcText') return t('config.rpcHelp')
case 'mail': case 'mail':
return t('config.mailText') return t('config.mailHelp')
case 'logging': case 'logging':
return t('config.logText') return t('config.logHelp')
case 'processing': case 'processing':
return t('config.processingText') return t('config.processingHelp')
case 'ingest': case 'ingest':
return t('config.ingestText') return t('config.ingestHelp')
case 'playlist': case 'playlist':
return t('config.playlistText') return t('config.playlistHelp')
case 'storage': case 'storage':
return t('config.storageText') return t('config.storageHelp')
case 'text': case 'text':
return t('config.textText') return t('config.textHelp')
case 'task': case 'task':
return t('config.taskText') return t('config.taskHelp')
case 'output': case 'output':
return t('config.outputText') return t('config.outputHelp')
default: default:
return text return ''
} }
} }

View File

@ -182,23 +182,32 @@ export default {
output: 'Ausgabe', output: 'Ausgabe',
placeholderPass: 'Passwort', placeholderPass: 'Passwort',
help: 'Hilfe', help: 'Hilfe',
generalText: `Manchmal kann es vorkommen, dass eine Datei beschädigt, aber noch abspielbar ist, was einen Streaming-Fehler bei allen folgenden Dateien verursachen kann. Die einzige Möglichkeit, dies zu beheben, besteht darin, ffplayout anzuhalten und neu zu starten. Wir sagen hier nur, wann es gestoppt werden muss, der Startvorgang ist Ihnen überlassen. Der beste Weg ist ein systemd-Dienst unter Linux. generalHelp: `Manchmal kann es vorkommen, dass eine Datei beschädigt ist, aber dennoch abspielbar. Dies kann einen Streaming-Fehler für alle folgenden Dateien verursachen. Die einzige Lösung in diesem Fall ist, ffplayout zu stoppen und es erneut zu starten.
'stop_threshold' wird ffplayout stoppen, wenn es zeitlich über diesem Wert liegt. Eine Zahl kleiner als 3 kann zu unerwarteten Fehlern führen.`, 'stop_threshold' stoppt ffplayout, wenn es asynchron in der Zeit über diesen Wert hinaus ist. Ein Wert unter 3 kann unerwartete Fehler verursachen.`,
rpcText: mailHelp: `Sende Fehlermeldungen an eine E-Mail-Adresse, wie z.B. fehlende Clips, fehlendes oder ungültiges Playlist-Format usw. Lass den Empfänger leer, wenn dies nicht benötigt wird.
'Führe einen JSON-RPC-Server aus, um Informationen über die Wiedergabe und einige Kontrollfunktionen zu erhalten.', 'mail_level' kann INFO, WARNING oder ERROR sein.
mailText: `Senden Sie Fehlermeldungen an die E-Mail-Adresse, z. B. fehlende Playlist, ungültiges json-Format, fehlender Clip-Pfad. Lassen Sie den Empfänger leer, wenn Sie keine Benachrichtigung benötigen. 'mail_level' kann INFO, WARNING oder ERROR sein. 'interval' bedeutet Sekunden, bis eine neue E-Mail gesendet wird.`, 'interval' bezieht sich auf die Anzahl der Sekunden bis zur nächsten E-Mail; der Wert muss in Schritten von 10 erfolgen und darf nicht weniger als 30 Sekunden betragen.`,
logText: `Wenn 'log_to_file' true ist, wird in eine Datei protokolliert, wenn false, in die Konsole. 'local_time' auf false setzt die Log-Zeitstempel auf UTC. Pfad zu /var/log/ nur, wenn Sie dies als Daemon ausführen. logHelp: `'ffmpeg_level/ingest_level' kann INFO, WARNING oder ERROR sein.
'level' kann DEBUG, INFO, WARNING, ERROR sein. 'ffmpeg_level' kann INFO, WARNING, ERROR sein. 'detect_silence' protokolliert eine Fehlermeldung, wenn die Audiospur während des Validierungsprozesses 15 Sekunden lang still ist.`, 'detect_silence' protokolliert eine Fehlermeldung, wenn die Audioleitung während des Validierungsprozesses 15 Sekunden lang stumm ist.
processingText: `Standardverarbeitung für alle Clips, um sie einheitlich zu machen. Modus kann "playlist" oder "folder" sein. 'aspect' muss eine Fließkommazahl sein. 'logo' wird nur verwendet, wenn der Pfad existiert. 'ignore' erlaubt dem Protokoll, Zeichenfolgen zu ignorieren, die übereinstimmende Zeilen enthalten; das Format ist eine durch Semikolons getrennte Liste.`,
'logo_scale' skaliert das Logo auf die Zielgröße, leer lassen, wenn keine Skalierung erforderlich ist, Format ist 'width:height', zum Beispiel '100:-1' für proportionale Skalierung. Mit 'logo_opacity' können Sie das Logo transparent machen. processingHelp: `Die Standardverarbeitung für alle Clips sorgt für Einzigartigkeit. Der Modus kann entweder 'playlist' oder 'folder' sein.
Mit 'audio_tracks' kann man einstellen, wie viele Audiospuren verarbeitet werden sollen. 'audio_channels' kann verwendet werden, wenn das Audio mehr Kanäle als nur Stereo hat. Mit 'logo_position' im Format 'x:y' wird die Position des Logos festgelegt. Mit 'custom_filter' ist es möglich, zusätzliche Filter anzuwenden. Die Filterausgänge sollten mit [c_v_out] für Videofilter und [c_a_out] für Audiofilter enden.`, Der Parameter 'aspect' muss eine Gleitkommazahl sein.
ingestText: `Startet einen Server für einen Live-Eingangsstream. Dieser Stream hat Vorrang vor dem normalen Streaming, bis er fertig ist. Es gibt nur einen sehr einfachen Authentifizierungsmechanismus, um zu prüfen, ob der Streamname korrekt ist. 'custom_filter' kann auf die gleiche Weise wie im Abschnitt Verarbeitung verwendet werden.`, Der Parameter 'audio_tracks' gibt an, wie viele Audiotracks verarbeitet werden sollen. 'audio_channels' kann verwendet werden, wenn das Audio mehr als Stereo-Kanäle hat.
playlistText: `'path' kann ein Pfad zu einer einzelnen Datei oder einem Verzeichnis sein. Bei Verzeichnissen geben Sie nur das Stammverzeichnis an, z. B. '/playlists', Unterverzeichnisse werden vom Program gelesen. Unterverzeichnisse benötigen diese Struktur '/playlists/2018/01'. Das 'logo' wird nur verwendet, wenn der Pfad existiert; der Pfad ist relativ zu deinem Speicherordner.
'day_start' ist die Uhrzeit, zu der die Wiedergabeliste beginnen soll; lassen Sie 'day_start' leer, wenn die Wiedergabeliste immer am Anfang beginnen soll. 'length' steht für die Ziellänge der Wiedergabeliste; wenn leer, wird die tatsächliche Länge nicht berücksichtigt. 'infinit: true' arbeitet mit einer einzelnen Wiedergabelistendatei und spielt diese in einer Endlosschleife.`, 'logo_scale' skaliert das Logo auf die Zielgröße. Lasse es leer, wenn keine Skalierung erforderlich ist. Das Format ist 'Breite:Höhe', z.B. '100:-1' für proportionale Skalierung. Die Option 'logo_opacity' ermöglicht es, das Logo transparent zu machen. Die 'logo_position' wird im Format 'x:y' angegeben, was die Position des Logos festlegt.
storageText: `Spielt geordnete oder zufällige Dateien aus dem Pfad ab. 'filler_clip' ist zum Füllen des Endes, um 24 Stunden zu erreichen, es wird eine Schleife abgespielt, wenn nötig. Setzen Sie 'extensions', um nur nach Dateien mit dieser Erweiterung zu suchen. Setzen Sie 'shuffle' auf 'true', um Dateien zufällig auszuwählen.`, Mit 'custom_filter' ist es möglich, zusätzliche Filter anzuwenden. Die Filterausgaben sollten mit [c_v_out] für Video-Filter und [c_a_out] für Audio-Filter enden.
textText: `Überlagernder Text in Kombination mit libzmq für die Remote-Textmanipulation. Unter Windows muss der Pfad der Schriftartdatei 'C\\:/WINDOWS/fonts/DejaVuSans.ttf' sein. 'text_from_filename' aktiviert die Textextraktion aus einem Dateinamen. Mit 'style' können Sie die Zeichentext-Parameter wie Position, Farbe, etc. festlegen. Post Text via API wird dies überschreiben. Mit 'regex' können Sie den Dateinamen formatieren, um einen Titel zu erhalten.`, 'vtt_enable' kann nur im HLS-Modus verwendet werden, und nur wenn *.vtt-Dateien mit demselben Dateinamen wie die Videodatei existieren.`,
taskText: `Führt ein externes Programm mit einem bestimmten Medienobjekt aus. Das Medienobjekt liegt im json-Format vor und enthält alle Informationen über den aktuellen Clip. Das externe Programm kann ein Skript oder eine Binärdatei sein. oder eine Binärdatei, sollte aber nur für kurze Zeit laufen.`, ingestHelp: `Starte einen Server für einen Eingabestream. Dieser Stream überschreibt den normalen Stream, bis er beendet ist. Es gibt nur einen sehr einfachen Authentifizierungsmechanismus, der überprüft, ob der Stream-Name korrekt ist.
outputText: `Die endgültige Playout-Kompression. Passen Sie die Einstellungen entsprechend Ihren Bedürfnissen an. 'mode' hat die Optionen 'desktop', 'hls', 'null', 'stream'. Verwenden Sie 'stream' und passen Sie die 'output_param:'-Einstellungen an, wenn Sie zu einem rtmp/rtsp/srt/... Server streamen wollen. In der Produktion sollten Sie die hls-Wiedergabeliste nicht mit ffpapi ausliefern, sondern nginx oder einen anderen Webserver verwenden!`, 'custom_filter' kann auf die gleiche Weise verwendet werden wie der im Verarbeitungsabschnitt.`,
playlistHelp: `'day_start' gibt an, zu welcher Zeit die Playlist starten soll; lass 'day_start' leer, wenn die Playlist immer am Anfang starten soll. 'length' stellt die Ziellänge der Playlist dar; wenn es leer ist, wird die reale Länge nicht berücksichtigt.
'infinite: true' funktioniert mit einer einzigen Playlist-Datei und schleift sie unendlich.`,
storageHelp: `'filler' wird verwendet, um anstelle einer fehlenden Datei oder zur Auffüllung der verbleibenden Zeit auf insgesamt 24 Stunden abzuspielen. Es kann eine Datei oder ein Ordner sein und wird bei Bedarf wiederholt.
'extensions' gibt an, nach welchen Dateien anhand dieser Erweiterung gesucht werden soll. Aktiviere 'shuffle', um Dateien zufällig auszuwählen.`,
textHelp: `Überlagere Text in Kombination mit libzmq zur Fernmanipulation von Text. 'font' ist ein relativer Pfad zu deinem Speicherordner.
'text_from_filename' aktiviert die Extraktion von Text aus einem Dateinamen. Mit 'style' kannst du die Drawtext-Parameter wie Position, Farbe usw. definieren. Die Übermittlung von Text über die API überschreibt dies. Mit 'regex' kannst du Dateinamen formatieren, um einen Titel daraus zu extrahieren.`,
taskHelp: `Führe ein externes Programm mit einem angegebenen Medienobjekt aus. Das Medienobjekt ist im JSON-Format und enthält alle Informationen über den aktuellen Clip. Das externe Programm kann ein Skript oder eine Binärdatei sein, aber es sollte nur für kurze Zeit ausgeführt werden.`,
outputHelp: `Das endgültige Playout-Encoding, passe die Einstellungen nach deinen Bedürfnissen an. 'mode' hat die Optionen 'desktop', 'hls', 'null' und 'stream'. Verwende 'stream' und passe die 'output_param:'-Einstellungen an, wenn du an einen RTMP/RTSP/SRT/...-Server streamen möchtest.
In der Produktion solltest du keine HLS-Playlists mit ffplayout bereitstellen; verwende Nginx oder einen anderen Webserver!`,
restartTile: 'Playout neustarten', restartTile: 'Playout neustarten',
restartText: 'ffplayout neustarten um Einstellungen anzuwenden?', restartText: 'ffplayout neustarten um Einstellungen anzuwenden?',
updatePlayoutSuccess: 'Update der Playout-Konfiguration erfolgreich!', updatePlayoutSuccess: 'Update der Playout-Konfiguration erfolgreich!',

View File

@ -182,22 +182,32 @@ export default {
output: 'Output', output: 'Output',
placeholderPass: 'Password', placeholderPass: 'Password',
help: 'Help', help: 'Help',
generalText: `Sometimes it can happen that a file is corrupted but still playable, this can cause a streaming error on all following files. The only way to fix this is to stop and restart ffplayout. Here we only say when to stop, the starting process is up to you. The best way is a systemd service on Linux. generalHelp: `Sometimes it can happen that a file is corrupt but still playable. This can produce a streaming error for all following files. The only solution in this case is to stop ffplayout and start it again.
'stop_threshold' will stop ffplayout if it is async in time above this value. A number less than 3 may cause unexpected errors.`, 'stop_threshold' stops ffplayout if it is asynchronous in time above this value. A number below 3 can cause unexpected errors.`,
rpcText: 'Run a JSON RPC server to get information about what is playing and for some control functions.', mailHelp: `Send error messages to an email address, such as missing clips, missing or invalid playlist format, etc.. Leave the recipient blank if you don't need this.
mailText: `Send error messages to the email address, such as missing playlist; invalid json format; missing clip path. Leave the recipient blank if you don't need it. 'mail_level' can be INFO, WARNING or ERROR. 'interval' means seconds until a new mail is sent.`, 'mail_level' can be INFO, WARNING, or ERROR.
logText: `If 'log_to_file' is true, log to file, if false, log to console. 'local_time' to false will set log timestamps to UTC. Path to /var/log/ only if you are running this as a daemon. 'interval' refers to the number of seconds until a new email is sent; the value must be in increments of 10 and not lower then 30 seconds.`,
'level' can be DEBUG, INFO, WARNING, ERROR. 'ffmpeg_level' can be INFO, WARNING, ERROR. 'detect_silence' logs an error message if the audio line is silent for 15 seconds during the validation process.`, logHelp: `'ffmpeg_level/ingest_level' can be INFO, WARNING, or ERROR.
processingText: `Default processing for all clips to make them unique. Mode can be Playlist or Folder. 'aspect' must be a float number. 'logo' is only used if the path exists. 'detect_silence' logs an error message if the audio line is silent for 15 seconds during the validation process.
'logo_scale' scales the logo to the target size, leave empty if no scaling is needed, format is 'width:height', for example '100:-1' for proportional scaling. With 'logo_opacity' you can make the logo transparent. 'ignore' allows logging to ignore strings that contain matched lines; the format is a semicolon-separated list.`,
With 'audio_tracks' it is possible to configure how many audio tracks should be processed. 'audio_channels' can be used if the audio has more channels than just stereo. With 'logo_position' in 'x:y' format you set the logo position. With 'custom_filter' it is possible to apply additional filters. The filter outputs should end with [c_v_out] for video filters and [c_a_out] for audio filters.`, processingHelp: `Default processing for all clips ensures uniqueness. The mode can be either 'playlist' or 'folder'.
ingestText: `Run a server for an ingest stream. This stream will override the normal streaming until it is done. There is only a very simple authentication mechanism to check if the stream name is correct. 'custom_filter' can be used in the same way as in the process section.`, The 'aspect' parameter must be a float number.
playlistText: `'path' can be a path to a single file or a directory. For directory specify only the root folder, for example '/playlists', subdirectories will be read by the program. Subdirectories need this structure '/playlists/2018/01'. The 'audio_tracks' parameter specifies how many audio tracks should be processed.'audio_channels' can be used if the audio has more channels than stereo.
'day_start' is the time at which the playlist should start, leave 'day_start' empty if the playlist should always start at the beginning. 'length' represents the target length of the playlist, if empty, real length will not be considered. 'infinit: true' works with single playlist file and loops it infinitely.`, The 'logo' is used only if the path exists; the path is relative to your storage folder.
storageText: `Play ordered or random files from path. 'filler_clip' is for filling the end to reach 24 hours, it will loop when necessary. Set 'extensions' to search only for files with that extension. Set 'shuffle' to 'true' to select files randomly.`, 'logo_scale' scales the logo to the target size. Leave it blank if no scaling is needed. The format is 'width:height', for example, '100:-1' for proportional scaling. The 'logo_opacity' option allows the logo to become transparent.'logo_position' is specified in the format 'x:y', which sets the logo's position.
textText: `Overlay text in combination with libzmq for remote text manipulation. On Windows, the font file path must be 'C\\:/WINDOWS/fonts/DejaVuSans.ttf'. 'text_from_filename' activates text extraction from a filename. With 'style' you can set the drawtext parameters like position, color, etc. Post Text via API will override this. With 'regex' you can format the filename to get a title.`, With 'custom_filter', it is possible to apply additional filters. The filter outputs should end with [c_v_out] for video filters and [c_a_out] for audio filters.
taskText: `Run an external program with a given media object. The media object is in json format and contains all the information about the current clip. The external program can be a script or a binary. or a binary, but should only run for a short time.`, 'vtt_enable' can only be used in HLS mode, and only when *.vtt files with the same filename as the video file exist.`,
outputText: `The final playout compression. Adjust the settings according to your needs. 'mode' has the options 'desktop', 'hls', 'null', 'stream'. Use 'stream' and adjust the 'output_param:' settings if you want to stream to an rtmp/rtsp/srt/... server. In production don't serve hls playlist with ffpapi, use nginx or another web server!`, ingestHelp: `Run a server for an ingest stream. This stream will override the normal streaming until it is finished. There is only a very simple authentication mechanism, which checks if the stream name is correct.
'custom_filter' can be used in the same way as the one in the process section.`,
playlistHelp: `'day_start' indicates at what time the playlist should start; leave 'day_start' blank if the playlist should always start at the beginning. 'length' represents the target length of the playlist; when it is blank, the real length will not be considered.
'infinite: true' works with a single playlist file and loops it infinitely.`,
storageHelp: `'filler' is used to play in place of a missing file or to fill the remaining time to reach a total of 24 hours. It can be a file or folder and will loop when necessary.
'extensions' specifies which files to search for by this extension. Activate 'shuffle' to pick files randomly.`,
textHelp: `Overlay text in combination with libzmq for remote text manipulation. 'font' is a relative path to your storage folder.
'text_from_filename' activates the extraction of text from a filename. With 'style', you can define the drawtext parameters, such as position, color, etc. Posting text over the API will override this. With 'regex', you can format file names to extract a title from them.`,
taskHelp: `Run an external program with a given media object. The media object is in JSON format and contains all the information about the current clip. The external program can be a script or a binary, but it should only run for a short time.`,
outputHelp: `The final playout encoding, set the settings according to your needs. 'mode' has the options 'desktop', 'hls', 'null', and 'stream'. Use 'stream' and adjust the 'output_param:' settings when you want to stream to an RTMP/RTSP/SRT/... server.
In production, don't serve HLS playlists with ffplayout; use Nginx or another web server!`,
restartTile: 'Restart Playout', restartTile: 'Restart Playout',
restartText: 'Restart ffplayout to apply changes?', restartText: 'Restart ffplayout to apply changes?',
updatePlayoutSuccess: 'Update playout config success!', updatePlayoutSuccess: 'Update playout config success!',

View File

@ -182,22 +182,33 @@ export default {
output: 'Saída', output: 'Saída',
placeholderPass: 'Senha', placeholderPass: 'Senha',
help: 'Ajuda', help: 'Ajuda',
generalText: `Às vezes pode acontecer que um arquivo esteja corrompido mas ainda assim ele pode ser reproduzido, isso pode causar um erro de transmissão em todos os arquivos seguintes. A única maneira de corrigir isso é parar e reiniciar o ffplayout. Aqui só dizemos quando parar, o processo de início é por sua conta. A melhor maneira é um serviço systemd no Linux. generalHelp: `Às vezes, pode acontecer que um arquivo esteja corrompido, mas ainda seja reproduzível. Isso pode produzir um erro de streaming para todos os arquivos seguintes. A única solução nesse caso é parar o ffplayout e iniciá-lo novamente.
'stop_threshold' vai parar o ffplayout se estiver assíncrono em um tempo acima deste valor. Um número menor que 3 pode causar erros inesperados.`, 'stop_threshold' para o ffplayout se ele estiver fora de sincronia no tempo acima desse valor. Um número abaixo de 3 pode causar erros inesperados.`,
rpcText: 'Execute um servidor JSON RPC para obter informações sobre o que está sendo reproduzido e para algumas funções de controle.', mailHelp: `Envie mensagens de erro para um endereço de e-mail, como clipes ausentes, formato de playlist ausente ou inválido, etc. Deixe o destinatário em branco se você não precisar disso.
mailText: `Envie mensagens de erro para o endereço de email, como lista de reprodução faltando; formato JSON inválido; caminho do clipe ausente. Deixe o destinatário em branco se não for necessário. 'mail_level' pode ser INFO, WARNING ou ERROR. 'interval' é o tempo em segundos até que um novo e-mail seja enviado.`, 'mail_level' pode ser INFO, WARNING ou ERROR.
logText: `Se 'log_to_file' estiver ativado (true), o registro de log será salvo em um arquivo de texto, e se desativado (false), registrará o log no console. Se 'local_time' estiver desativado (false) o sistema definirá os carimbos de data/hora do registro para UTC. Defina o caminho para /var/log/ apenas se você estiver executando o programa como daemon. 'interval' refere-se ao número de segundos até que um novo e-mail seja enviado; o valor deve ser em incrementos de 10 e não inferior a 30 segundos.`,
'level' pode ser DEBUG, INFO, WARNING, ERROR. 'ffmpeg_level' pode ser INFO, WARNING, ERROR. 'detect_silence' registra uma mensagem de erro se a linha de áudio ficar silenciosa por 15 segundos durante o processo de validação.`, logHelp: `'ffmpeg_level/ingest_level' pode ser INFO, WARNING ou ERROR.
processingText: `Processamento padrão para todos os clipes para torná-los únicos. O modo ('mode') pode ser Playlist ou Folder. 'aspect' deve ser um número de ponto flutuante. 'logo' é usado apenas se o caminho existir. 'detect_silence' registra uma mensagem de erro se a linha de áudio estiver em silêncio por 15 segundos durante o processo de validação.
'logo_scale' dimensiona o logo para o tamanho desejado, deixe esse campo de configuração vazio se nenhum dimensionamento for necessário, o formato é 'largura:altura', por exemplo '100:-1' para dimensionamento proporcional. Com 'logo_opacity' você pode tornar o logo transparente. 'ignore' permite que o log ignore cadeias de caracteres que contenham linhas correspondentes; o formato é uma lista separada por ponto e vírgula.`,
Com 'audio_tracks' é possível configurar quantas faixas de áudio devem ser processadas. 'audio_channels' pode ser usado se o áudio tiver mais canais do que apenas estéreo. Com 'logo_position' no formato 'x:y' você define a posição do logo. Com 'custom_filter' é possível aplicar filtros adicionais. As saídas do filtro devem terminar com [c_v_out] para filtros de vídeo e [c_a_out] para filtros de áudio.`, processingHelp: `O processamento padrão para todos os clipes garante a exclusividade. O modo pode ser 'playlist' ou 'folder'.
ingestText: `Execute um servidor de ingestão para poder receber um fluxo de stream a partir de uma fonte externa, como por exemplo um software de streaming como o OBS Studio. Este stream substituirá o streaming normal até que seja concluído. Existe apenas um mecanismo de autenticação muito simples para verificar se o nome do stream está correto. 'custom_filter' pode ser usado da mesma forma que na seção de processo.`, O parâmetro 'aspect' deve ser um número de ponto flutuante.
playlistText: `'path' é o caminho para o arquivo de playlist. 'path' pode ser um caminho para um único arquivo ou um diretório. Se um diretório for especificado, defina apenas a pasta raiz desse diretório, por exemplo '/playlists', subdiretórios serão lidos pelo programa. Subdiretórios precisam seguir a seguinte estrutura de diretórios: '/playlists/2018/01'. O parâmetro 'audio_tracks' especifica quantas trilhas de áudio devem ser processadas. 'audio_channels' pode ser usado se o áudio tiver mais canais que estéreo.
'day_start' é o horário fixo, inicial, em que a playlist será reproduzida, deixe 'day_start' vazio se a lista de reprodução sempre deve começar do início. 'length' representa a duração desejada da playlist, se vazio, a duração real não será considerada. 'infinit: true' funciona com um arquivo de lista de reprodução único e o repete infinitamente.`, O 'logo' é usado apenas se o caminho existir; o caminho é relativo à sua pasta de armazenamento.
storageText: `Reproduza arquivos de mídia de maneira ordenada ou aleatória a partir de um caminho de diretório ('path') especificado. 'filler_clip' define um "clipe de preenchimento", cuja função é preencher a lacuna de tempo de uma playlist com duração inferior a 24 horas completas, esse clipe ou conjunto de clipes também será repetido quando algum arquivo de mídia não puder ser reproduzido, quando estiver indisponível ou se nenhuma playlist válida estiver sendo reproduzida. Defina 'extensions' para delimitar a busca interna de arquivos de mídia apenas por arquivos com a extensão adicionada. Defina 'shuffle' como 'true' para selecionar arquivos aleatoriamente.`, 'logo_scale' redimensiona o logotipo para o tamanho desejado. Deixe em branco se não for necessário redimensionar. O formato é 'largura:altura', por exemplo, '100:-1' para redimensionamento proporcional. A opção 'logo_opacity' permite que o logotipo fique transparente. A 'logo_position' é especificada no formato 'x:y', que define a posição do logotipo.
textText: `Sobreponha texto (legenda) em combinação com o libzmq, para manipulação remota de texto. No Windows, o caminho do arquivo de fonte deve ser 'C\\:/WINDOWS/fonts/DejaVuSans.ttf'. 'text_from_filename' ativa a extração de texto (legenda) a partir de um arquivo de texto especificado. Com 'style' você pode definir os parâmetros drawtext como posição, cor, etc. Postar Texto via API irá substituir isso. Com 'regex' você pode formatar o nome do arquivo para obter um título.`, Com 'custom_filter', é possível aplicar filtros adicionais. As saídas de filtro devem terminar com [c_v_out] para filtros de vídeo e [c_a_out] para filtros de áudio.
taskText: `Execute um programa externo em conjunto com um determinado objeto de mídia. O objeto de mídia está no formato JSON e contém todas as informações sobre o clipe atual. O programa externo pode ser um script ou um binário. ou um binário, mas deve ser executado apenas por um curto período de tempo.`, 'vtt_enable' pode ser usado no modo HLS e somente quando existirem arquivos *.vtt com o mesmo nome do arquivo de vídeo.`,
outputText: `A compressão final do stream gerado pelo playout. Ajuste as configurações de acordo com suas necessidades. 'mode' possui as opções 'desktop', 'hls', 'null', 'stream'. Use 'stream' e ajuste as configurações de 'output_param:' se você desejar retransmitir o stream para um servidor rtmp/rtsp/srt/... Em ambiente de produção não sirva a playlist hls com ffpapi, use nginx ou outro servidor web!`, ingestHelp: `Execute um servidor para um fluxo de ingestão. Esse fluxo substituirá o streaming normal até que seja concluído. Existe apenas um mecanismo de autenticação muito simples, que verifica se o nome do fluxo está correto.
'custom_filter' pode ser usado da mesma forma que o da seção de processamento.`,
playlistHelp: `'day_start' indica a que horas a playlist deve começar; deixe 'day_start' em branco se a playlist sempre deve começar do início. 'length' representa a duração alvo da playlist; quando está em branco, o comprimento real não será considerado.
'infinite: true' funciona com um único arquivo de playlist e o repete infinitamente.`,
storageHelp: `'filler' é usado para tocar no lugar de um arquivo ausente ou para preencher o tempo restante para atingir um total de 24 horas. Pode ser um arquivo ou pasta e será repetido quando necessário.
'extensions' especifica quais arquivos procurar com base nessa extensão. Ative 'shuffle' para selecionar arquivos aleatoriamente.`,
textHelp: `Sobreponha texto em combinação com libzmq para manipulação remota de texto. 'font' é um caminho relativo à sua pasta de armazenamento.
'text_from_filename' ativa a extração de texto a partir de um nome de arquivo. Com 'style', você pode definir os parâmetros do drawtext, como posição, cor, etc. Enviar texto pela API substituirá isso. Com 'regex', você pode formatar nomes de arquivos para extrair um título deles.`,
taskHelp: `Execute um programa externo com um objeto de mídia fornecido. O objeto de mídia está no formato JSON e contém todas as informações sobre o clipe atual. O programa externo pode ser um script ou um binário, mas deve ser executado por um curto período de tempo.`,
outputHelp: `A codificação final do playout, ajuste as configurações conforme suas necessidades. 'mode' tem as opções 'desktop', 'hls', 'null' e 'stream'. Use 'stream' e ajuste as configurações 'output_param:' quando quiser transmitir para um servidor RTMP/RTSP/SRT/... .
Em produção, não sirva playlists HLS com ffplayout; use Nginx ou outro servidor web!`,
restartTile: 'Reiniciar Playout', restartTile: 'Reiniciar Playout',
restartText: 'Reiniciar o ffplayout para aplicar as alterações?', restartText: 'Reiniciar o ffplayout para aplicar as alterações?',
updatePlayoutSuccess: 'Sucesso na atualização da configuração do playout!', updatePlayoutSuccess: 'Sucesso na atualização da configuração do playout!',

View File

@ -182,22 +182,32 @@ export default {
output: 'Out', output: 'Out',
placeholderPass: 'Password', placeholderPass: 'Password',
help: 'Help', help: 'Help',
generalText: `Sometimes it can happen that a file is corrupted but still playable, this can cause a streaming error on all following files. The only way to fix this is to stop and restart ffplayout. Here we only say when to stop, the starting process is up to you. The best way is a systemd service on Linux. generalHelp: `Sometimes it can happen that a file is corrupt but still playable. This can produce a streaming error for all following files. The only solution in this case is to stop ffplayout and start it again.
'stop_threshold' will stop ffplayout if it is async in time above this value. A number less than 3 may cause unexpected errors.`, 'stop_threshold' stops ffplayout if it is asynchronous in time above this value. A number below 3 can cause unexpected errors.`,
rpcText: 'Запустите сервер JSON RPC, чтобы получить информацию о том, что воспроизводится, а также о некоторых функциях управления.', mailHelp: `Send error messages to an email address, such as missing clips, missing or invalid playlist format, etc.. Leave the recipient blank if you don't need this.
mailText: `Отправлять сообщения об ошибках на адрес электронной почты, например об отсутствии списка воспроизведения; неверный формат json; отсутствует путь к клипу. Оставьте получателя пустым, если он вам не нужен. 'mail_level' может быть ИНФОРМАЦИЯ, ПРЕДУПРЕЖДЕНИЕ или ОШИБКА. 'interval' означает секунды до отправки нового письма.`, 'mail_level' can be INFO, WARNING, or ERROR.
logText: `If 'log_to_file' is true, log to file, if false, log to console. 'local_time' to false will set log timestamps to UTC. Path to /var/log/ only if you are running this as a daemon. 'interval' refers to the number of seconds until a new email is sent; the value must be in increments of 10 and not lower then 30 seconds.`,
'level' can be DEBUG, INFO, WARNING, ERROR. 'ffmpeg_level' can be INFO, WARNING, ERROR. 'detect_silence' logs an error message if the audio line is silent for 15 seconds during the validation process.`, logHelp: `'ffmpeg_level/ingest_level' can be INFO, WARNING, or ERROR.
processingText: `Default processing for all clips to make them unique. Mode can be Playlist or Folder. 'aspect' must be a float number. 'logo' is only used if the path exists. 'detect_silence' logs an error message if the audio line is silent for 15 seconds during the validation process.
'logo_scale' scales the logo to the target size, leave empty if no scaling is needed, format is 'width:height', for example '100:-1' for proportional scaling. With 'logo_opacity' you can make the logo transparent. 'ignore' allows logging to ignore strings that contain matched lines; the format is a semicolon-separated list.`,
With 'audio_tracks' it is possible to configure how many audio tracks should be processed. 'audio_channels' can be used if the audio has more channels than just stereo. With 'logo_position' in 'x:y' format you set the logo position. With 'custom_filter' it is possible to apply additional filters. The filter outputs should end with [c_v_out] for video filters and [c_a_out] for audio filters.`, processingHelp: `Default processing for all clips ensures uniqueness. The mode can be either 'playlist' or 'folder'.
ingestText: `Запустите сервер для получения входящего потока. Этот поток будет переопределять обычную потоковую передачу до тех пор, пока она не будет завершена. Существует только очень простой механизм аутентификации, позволяющий проверить правильность имени потока. 'custom_filter' можно использовать так же, как в разделе "Настройки эфира".`, The 'aspect' parameter must be a float number.
playlistText: `'path' can be a path to a single file or a directory. For directory specify only the root folder, for example '/playlists', subdirectories will be read by the program. Subdirectories need this structure '/playlists/2018/01'. The 'audio_tracks' parameter specifies how many audio tracks should be processed.'audio_channels' can be used if the audio has more channels than stereo.
'day_start' is the time at which the playlist should start, leave 'day_start' empty if the playlist should always start at the beginning. 'length' represents the target length of the playlist, if empty, real length will not be considered. 'infinit: true' works with single playlist file and loops it infinitely.`, The 'logo' is used only if the path exists; the path is relative to your storage folder.
storageText: `Play ordered or random files from path. 'filler_clip' is for filling the end to reach 24 hours, it will loop when necessary. Set 'extensions' to search only for files with that extension. Set 'shuffle' to 'true' to select files randomly.`, 'logo_scale' scales the logo to the target size. Leave it blank if no scaling is needed. The format is 'width:height', for example, '100:-1' for proportional scaling. The 'logo_opacity' option allows the logo to become transparent.'logo_position' is specified in the format 'x:y', which sets the logo's position.
textText: `Overlay text in combination with libzmq for remote text manipulation. On Windows, the font file path must be 'C\\:/WINDOWS/fonts/DejaVuSans.ttf'. 'text_from_filename' activates text extraction from a filename. With 'style' you can set the drawtext parameters like position, color, etc. Post Text via API will override this. With 'regex' you can format the filename to get a title.`, With 'custom_filter', it is possible to apply additional filters. The filter outputs should end with [c_v_out] for video filters and [c_a_out] for audio filters.
taskText: `Run an external program with a given media object. The media object is in json format and contains all the information about the current clip. The external program can be a script or a binary. or a binary, but should only run for a short time.`, 'vtt_enable' can only be used in HLS mode, and only when *.vtt files with the same filename as the video file exist.`,
outputText: `The final playout compression. Adjust the settings according to your needs. 'mode' has the options 'desktop', 'hls', 'null', 'stream'. Use 'stream' and adjust the 'output_param:' settings if you want to stream to an rtmp/rtsp/srt/... server. In production don't serve hls playlist with ffpapi, use nginx or another web server!`, ingestHelp: `Run a server for an ingest stream. This stream will override the normal streaming until it is finished. There is only a very simple authentication mechanism, which checks if the stream name is correct.
'custom_filter' can be used in the same way as the one in the process section.`,
playlistHelp: `'day_start' indicates at what time the playlist should start; leave 'day_start' blank if the playlist should always start at the beginning. 'length' represents the target length of the playlist; when it is blank, the real length will not be considered.
'infinite: true' works with a single playlist file and loops it infinitely.`,
storageHelp: `'filler' is used to play in place of a missing file or to fill the remaining time to reach a total of 24 hours. It can be a file or folder and will loop when necessary.
'extensions' specifies which files to search for by this extension. Activate 'shuffle' to pick files randomly.`,
textHelp: `Overlay text in combination with libzmq for remote text manipulation. 'font' is a relative path to your storage folder.
'text_from_filename' activates the extraction of text from a filename. With 'style', you can define the drawtext parameters, such as position, color, etc. Posting text over the API will override this. With 'regex', you can format file names to extract a title from them.`,
taskHelp: `Run an external program with a given media object. The media object is in JSON format and contains all the information about the current clip. The external program can be a script or a binary, but it should only run for a short time.`,
outputHelp: `The final playout encoding, set the settings according to your needs. 'mode' has the options 'desktop', 'hls', 'null', and 'stream'. Use 'stream' and adjust the 'output_param:' settings when you want to stream to an RTMP/RTSP/SRT/... server.
In production, don't serve HLS playlists with ffplayout; use Nginx or another web server!`,
restartTile: 'Перезапуск Playout', restartTile: 'Перезапуск Playout',
restartText: 'Перезапустить ffplayout для применения изменений?', restartText: 'Перезапустить ffplayout для применения изменений?',
updatePlayoutSuccess: 'Обновление конфигурации воспроизведения прошло успешно!', updatePlayoutSuccess: 'Обновление конфигурации воспроизведения прошло успешно!',

View File

@ -82,19 +82,15 @@ CREATE TABLE
configurations ( configurations (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
channel_id INTEGER NOT NULL DEFAULT 1, channel_id INTEGER NOT NULL DEFAULT 1,
general_help TEXT NOT NULL DEFAULT "Sometimes it can happen that a file is corrupt but still playable. This can produce a streaming error for all following files. The only solution in this case is to stop ffplayout and start it again.\n'stop_threshold' stops ffplayout if it is asynchronous in time above this value. A number below 3 can cause unexpected errors.",
general_stop_threshold REAL NOT NULL DEFAULT 11.0, general_stop_threshold REAL NOT NULL DEFAULT 11.0,
mail_help TEXT NOT NULL DEFAULT "Send error messages to an email address, such as missing clips, missing or invalid playlist format, etc.. Leave the recipient blank if you don't need this.\n'mail_level' can be INFO, WARNING, or ERROR.\n'interval' refers to the number of seconds until a new email is sent; the value must be in increments of 10 and not lower then 30 seconds.",
mail_subject TEXT NOT NULL DEFAULT "Playout Error", mail_subject TEXT NOT NULL DEFAULT "Playout Error",
mail_recipient TEXT NOT NULL DEFAULT "", mail_recipient TEXT NOT NULL DEFAULT "",
mail_level TEXT NOT NULL DEFAULT "ERROR", mail_level TEXT NOT NULL DEFAULT "ERROR",
mail_interval INTEGER NOT NULL DEFAULT 120, mail_interval INTEGER NOT NULL DEFAULT 120,
logging_help TEXT NOT NULL DEFAULT "'ffmpeg_level/ingest_level' can be INFO, WARNING, or ERROR.\n'detect_silence' logs an error message if the audio line is silent for 15 seconds during the validation process.\n'ignore' allows logging to ignore strings that contain matched lines; the format is a semicolon-separated list.",
logging_ffmpeg_level TEXT NOT NULL DEFAULT "ERROR", logging_ffmpeg_level TEXT NOT NULL DEFAULT "ERROR",
logging_ingest_level TEXT NOT NULL DEFAULT "ERROR", logging_ingest_level TEXT NOT NULL DEFAULT "ERROR",
logging_detect_silence INTEGER NOT NULL DEFAULT 0, logging_detect_silence INTEGER NOT NULL DEFAULT 0,
logging_ignore TEXT NOT NULL DEFAULT "P sub_mb_type 4 out of range at;error while decoding MB;negative number of zero coeffs at;out of range intra chroma pred mode;non-existing SPS 0 referenced in buffering period", logging_ignore TEXT NOT NULL DEFAULT "P sub_mb_type 4 out of range at;error while decoding MB;negative number of zero coeffs at;out of range intra chroma pred mode;non-existing SPS 0 referenced in buffering period",
processing_help TEXT NOT NULL DEFAULT "Default processing for all clips ensures uniqueness. The mode can be either 'playlist' or 'folder'.\nThe 'aspect' parameter must be a float number.\nThe 'audio_tracks' parameter specifies how many audio tracks should be processed.'audio_channels' can be used if the audio has more channels than stereo.\nThe 'logo' is used only if the path exists; the path is relative to your storage folder.\n'logo_scale' scales the logo to the target size. Leave it blank if no scaling is needed. The format is 'width:height', for example, '100:-1' for proportional scaling. The 'logo_opacity' option allows the logo to become transparent.'logo_position' is specified in the format 'x:y', which sets the logo's position.\nWith 'custom_filter', it is possible to apply additional filters. The filter outputs should end with [c_v_out] for video filters and [c_a_out] for audio filters.\n'vtt_enable' can only be used in HLS mode, and only when *.vtt files with the same filename as the video file exist.",
processing_mode TEXT NOT NULL DEFAULT "playlist", processing_mode TEXT NOT NULL DEFAULT "playlist",
processing_audio_only INTEGER NOT NULL DEFAULT 0, processing_audio_only INTEGER NOT NULL DEFAULT 0,
processing_copy_audio INTEGER NOT NULL DEFAULT 0, processing_copy_audio INTEGER NOT NULL DEFAULT 0,
@ -115,28 +111,22 @@ CREATE TABLE
processing_filter TEXT NOT NULL DEFAULT "", processing_filter TEXT NOT NULL DEFAULT "",
processing_vtt_enable INTEGER NOT NULL DEFAULT 0, processing_vtt_enable INTEGER NOT NULL DEFAULT 0,
processing_vtt_dummy TEXT NULL DEFAULT "00-assets/dummy.vtt", processing_vtt_dummy TEXT NULL DEFAULT "00-assets/dummy.vtt",
ingest_help "Run a server for an ingest stream. This stream will override the normal streaming until it is finished. There is only a very simple authentication mechanism, which checks if the stream name is correct.\n'custom_filter' can be used in the same way as the one in the process section.",
ingest_enable INTEGER NOT NULL DEFAULT 0, ingest_enable INTEGER NOT NULL DEFAULT 0,
ingest_param TEXT NOT NULL DEFAULT "-f live_flv -listen 1 -i rtmp://127.0.0.1:1936/live/stream", ingest_param TEXT NOT NULL DEFAULT "-f live_flv -listen 1 -i rtmp://127.0.0.1:1936/live/stream",
ingest_filter TEXT NOT NULL DEFAULT "", ingest_filter TEXT NOT NULL DEFAULT "",
playlist_help TEXT NOT NULL DEFAULT "'day_start' indicates at what time the playlist should start; leave 'day_start' blank if the playlist should always start at the beginning. 'length' represents the target length of the playlist; when it is blank, the real length will not be considered.\n'infinite: true' works with a single playlist file and loops it infinitely.",
playlist_day_start TEXT NOT NULL DEFAULT "05:59:25", playlist_day_start TEXT NOT NULL DEFAULT "05:59:25",
playlist_length TEXT NOT NULL DEFAULT "24:00:00", playlist_length TEXT NOT NULL DEFAULT "24:00:00",
playlist_infinit INTEGER NOT NULL DEFAULT 0, playlist_infinit INTEGER NOT NULL DEFAULT 0,
storage_help TEXT NOT NULL DEFAULT "'filler' is used to play in place of a missing file or to fill the remaining time to reach a total of 24 hours. It can be a file or folder and will loop when necessary.\n'extensions' specifies which files to search for by this extension. Activate 'shuffle' to pick files randomly.",
storage_filler TEXT NOT NULL DEFAULT "filler/filler.mp4", storage_filler TEXT NOT NULL DEFAULT "filler/filler.mp4",
storage_extensions TEXT NOT NULL DEFAULT "mp4;mkv;webm", storage_extensions TEXT NOT NULL DEFAULT "mp4;mkv;webm",
storage_shuffle INTEGER NOT NULL DEFAULT 1, storage_shuffle INTEGER NOT NULL DEFAULT 1,
text_help TEXT NOT NULL DEFAULT "Overlay text in combination with libzmq for remote text manipulation. 'font' is a relative path to your storage folder.\n'text_from_filename' activates the extraction of text from a filename. With 'style', you can define the drawtext parameters, such as position, color, etc. Posting text over the API will override this. With 'regex', you can format file names to extract a title from them.",
text_add INTEGER NOT NULL DEFAULT 1, text_add INTEGER NOT NULL DEFAULT 1,
text_from_filename INTEGER NOT NULL DEFAULT 0, text_from_filename INTEGER NOT NULL DEFAULT 0,
text_font TEXT NOT NULL DEFAULT "00-assets/DejaVuSans.ttf", text_font TEXT NOT NULL DEFAULT "00-assets/DejaVuSans.ttf",
text_style TEXT NOT NULL DEFAULT "x=(w-tw)/2:y=(h-line_h)*0.9:fontsize=24:fontcolor=#ffffff:box=1:boxcolor=#000000:boxborderw=4", text_style TEXT NOT NULL DEFAULT "x=(w-tw)/2:y=(h-line_h)*0.9:fontsize=24:fontcolor=#ffffff:box=1:boxcolor=#000000:boxborderw=4",
text_regex TEXT NOT NULL DEFAULT "^.+[/\\](.*)(.mp4|.mkv|.webm)$", text_regex TEXT NOT NULL DEFAULT "^.+[/\\](.*)(.mp4|.mkv|.webm)$",
task_help TEXT NOT NULL DEFAULT "Run an external program with a given media object. The media object is in JSON format and contains all the information about the current clip. The external program can be a script or a binary, but it should only run for a short time.",
task_enable INTEGER NOT NULL DEFAULT 0, task_enable INTEGER NOT NULL DEFAULT 0,
task_path TEXT NOT NULL DEFAULT "", task_path TEXT NOT NULL DEFAULT "",
output_help TEXT NOT NULL DEFAULT "The final playout encoding, set the settings according to your needs. 'mode' has the options 'desktop', 'hls', 'null', and 'stream'. Use 'stream' and adjust the 'output_param:' settings when you want to stream to an RTMP/RTSP/SRT/... server.\nIn production, don't serve HLS playlists with ffplayout; use Nginx or another web server!",
output_mode TEXT NOT NULL DEFAULT "hls", output_mode TEXT NOT NULL DEFAULT "hls",
output_param TEXT NOT NULL DEFAULT "-c:v libx264 -crf 23 -x264-params keyint=50:min-keyint=25:scenecut=-1 -maxrate 1300k -bufsize 2600k -preset faster -tune zerolatency -profile:v Main -level 3.1 -c:a aac -ar 44100 -b:a 128k -flags +cgop -muxpreload 0 -muxdelay 0 -f hls -hls_time 6 -hls_list_size 600 -hls_flags append_list+delete_segments+omit_endlist -hls_segment_filename live/stream-%d.ts live/stream.m3u8", output_param TEXT NOT NULL DEFAULT "-c:v libx264 -crf 23 -x264-params keyint=50:min-keyint=25:scenecut=-1 -maxrate 1300k -bufsize 2600k -preset faster -tune zerolatency -profile:v Main -level 3.1 -c:a aac -ar 44100 -b:a 128k -flags +cgop -muxpreload 0 -muxdelay 0 -f hls -hls_time 6 -hls_list_size 600 -hls_flags append_list+delete_segments+omit_endlist -hls_segment_filename live/stream-%d.ts live/stream.m3u8",
FOREIGN KEY (channel_id) REFERENCES channels (id) ON UPDATE CASCADE ON DELETE CASCADE FOREIGN KEY (channel_id) REFERENCES channels (id) ON UPDATE CASCADE ON DELETE CASCADE