Adding support for file title without renaming file, enhancing support for pt-BR, en-US, de-DE languages. (#114)
Co-authored-by: jb-alvarado <2212056+jb-alvarado@users.noreply.github.com>
This commit is contained in:
parent
bbe29428a5
commit
e961afbad5
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div v-if="show" class="z-50 fixed top-0 bottom-0 left-0 right-0 flex justify-center items-center bg-black/30">
|
||||
<div v-if="show" class="z-50 fixed top-0 bottom-0 left-0 right-0 flex justify-center items-center bg-black/30 overflow-auto m-auto max-h-screen space-y-1">
|
||||
<div class="flex flex-col bg-base-100 min-w-[400px] max-w-[90%] h-auto rounded-md p-5 shadow-xl">
|
||||
<div class="inline-block">
|
||||
<div class="flex gap-2">
|
||||
|
@ -56,9 +56,9 @@
|
||||
<div
|
||||
v-else
|
||||
class="h-1/3 font-bold text truncate"
|
||||
:title="filename(playlistStore.currentClip)"
|
||||
:title="playlistStore.currentClipTitle || filename(playlistStore.currentClip)"
|
||||
>
|
||||
{{ filename(playlistStore.currentClip) || $t('control.noClip') }}
|
||||
{{ playlistStore.currentClipTitle || filename(playlistStore.currentClip) || $t('control.noClip') }}
|
||||
</div>
|
||||
<div class="grow">
|
||||
<strong>{{ $t('player.duration') }}:</strong>
|
||||
@ -163,6 +163,7 @@
|
||||
import { storeToRefs } from 'pinia'
|
||||
import mpegts from 'mpegts.js'
|
||||
|
||||
const { t } = useI18n()
|
||||
const { $dayjs } = useNuxtApp()
|
||||
const authStore = useAuth()
|
||||
const configStore = useConfig()
|
||||
@ -171,7 +172,7 @@ const playlistStore = usePlaylist()
|
||||
const { filename, secToHMS } = stringFormatter()
|
||||
const { configID } = storeToRefs(useConfig())
|
||||
|
||||
playlistStore.currentClip = 'Es wird kein Clip abgespielt'
|
||||
playlistStore.currentClip = t('control.noClip')
|
||||
const timeStr = ref('00:00:00')
|
||||
const timer = ref()
|
||||
const errorCounter = ref(0)
|
||||
|
@ -84,7 +84,7 @@
|
||||
>
|
||||
<td class="ps-4 py-2 text-left">{{ secondsToTime(element.begin) }}</td>
|
||||
<td class="py-2 text-left truncate" :class="{ 'grabbing cursor-grab': width > 768 }">
|
||||
{{ filename(element.source) }}
|
||||
{{ element.title || filename(element.source) }}
|
||||
</td>
|
||||
<td class="py-2 text-center hover:text-base-content/70">
|
||||
<button @click="preview(element.source)">
|
||||
@ -254,6 +254,7 @@ function addClip(event: any) {
|
||||
playlistStore.playlist.splice(n, 0, {
|
||||
uid,
|
||||
begin: 0,
|
||||
title: mediaStore.folderTree.files[o].name,
|
||||
source: sourcePath,
|
||||
in: 0,
|
||||
out: mediaStore.folderTree.files[o].duration,
|
||||
|
@ -55,6 +55,10 @@ export default {
|
||||
start: 'Start',
|
||||
file: 'Datei',
|
||||
play: 'Abspielen',
|
||||
title: 'Titel',
|
||||
timeDuration: 'Dauerzeit (in Sekunden)',
|
||||
timeIn: 'Eintrittszeit (in Sekunden)',
|
||||
timeOut: 'Austrittszeit (in Sekunden)',
|
||||
duration: 'Dauer',
|
||||
in: 'Eingang',
|
||||
out: 'Ausgang',
|
||||
|
@ -55,6 +55,10 @@ export default {
|
||||
start: 'Start',
|
||||
file: 'File',
|
||||
play: 'Play',
|
||||
title: 'Title',
|
||||
timeDuration: 'Duration time (in seconds)',
|
||||
timeIn: 'Entry time (in seconds)',
|
||||
timeOut: 'Exit time (in seconds)',
|
||||
duration: 'Duration',
|
||||
in: 'In',
|
||||
out: 'Out',
|
||||
|
174
lang/pt-BR.js
174
lang/pt-BR.js
@ -8,11 +8,11 @@ export default {
|
||||
},
|
||||
button: {
|
||||
login: 'Logar',
|
||||
home: 'Sistema',
|
||||
player: 'Playout',
|
||||
media: 'Mídias',
|
||||
message: 'Mensagens',
|
||||
logging: 'Registros',
|
||||
home: 'Início',
|
||||
player: 'Player',
|
||||
media: 'Armazenamento',
|
||||
message: 'Legenda',
|
||||
logging: 'Registro',
|
||||
channels: 'Canais',
|
||||
configure: 'Configurar',
|
||||
logout: 'Sair',
|
||||
@ -26,57 +26,61 @@ export default {
|
||||
password: 'Senha',
|
||||
},
|
||||
system: {
|
||||
cpu: 'Processador',
|
||||
cpu: 'CPU',
|
||||
cores: 'Núcleos',
|
||||
load: 'Processos',
|
||||
load: 'Carga de CPU',
|
||||
memory: 'Memória',
|
||||
swap: 'Memória swap',
|
||||
swap: 'Swap',
|
||||
total: 'Total',
|
||||
usage: 'Uso',
|
||||
network: 'Rede',
|
||||
in: 'Download',
|
||||
out: 'Upload',
|
||||
in: 'Entrada',
|
||||
out: 'Saída',
|
||||
storage: 'Armazenamento',
|
||||
device: 'Dispositivo',
|
||||
size: 'Tamanho total',
|
||||
used: 'Disponível',
|
||||
},
|
||||
control: {
|
||||
noClip: 'Nenhuma mídia está sendo reproduzida!',
|
||||
ingest: 'Ingestão ao vivo',
|
||||
start: 'Iniciar Playout',
|
||||
last: 'Ir para a mídia anterior',
|
||||
stop: 'Parar serviço do Playout',
|
||||
reset: 'Redefinir estado do Playout',
|
||||
restart: 'Reiniciar Playout',
|
||||
next: 'Ir para o próxima mídia',
|
||||
noClip: 'Nenhum clipe está sendo reproduzido',
|
||||
ingest: 'Ingestão ao Vivo',
|
||||
start: 'Iniciar Serviço do Playout',
|
||||
last: 'Ir para o último Clipe',
|
||||
stop: 'Parar Serviço do Playout',
|
||||
reset: 'Redefinir Estado do Playout',
|
||||
restart: 'Reiniciar Serviço do Playout',
|
||||
next: 'Ir para o próximo Clipe',
|
||||
},
|
||||
player: {
|
||||
start: 'Horário',
|
||||
file: 'Mídia',
|
||||
play: 'Visualizar',
|
||||
file: 'Arquivo',
|
||||
play: 'Play',
|
||||
title: 'Título',
|
||||
timeDuration: 'Tempo de duração (em segundos)',
|
||||
timeIn: 'Tempo de entrada (em segundos)',
|
||||
timeOut: 'Tempo de saída (em segundos)',
|
||||
duration: 'Duração',
|
||||
in: 'Entrada',
|
||||
out: 'Saida',
|
||||
in: 'Início',
|
||||
out: 'Fim',
|
||||
ad: 'Ad',
|
||||
edit: 'Editar',
|
||||
delete: 'Deletar',
|
||||
copy: 'Copiar playlist',
|
||||
loop: 'Loop das mídias na playlist',
|
||||
remote: 'Adicionar fonte (remota) à playlist',
|
||||
loop: 'Repetir Clipes na Playlist',
|
||||
remote: 'Adicionar fonte (remota) à Playlist',
|
||||
import: 'Importar arquivo de texto/.m3u8',
|
||||
generate: 'Gerador de playlist simples e avançado',
|
||||
reset: 'Resetar playlist',
|
||||
save: 'Salvar playlist',
|
||||
deletePlaylist: 'Deletar playlist',
|
||||
unsavedProgram: 'Existe uma playlist que não está salva!',
|
||||
copyTo: 'Copiar programa atual para',
|
||||
generate: 'Gerador de Playlist simples e avançado',
|
||||
reset: 'Resetar Playlist',
|
||||
save: 'Salvar Playlist',
|
||||
deletePlaylist: 'Deletar Playlist',
|
||||
unsavedProgram: 'Existe uma Programação que não está salva!',
|
||||
copyTo: 'Copiar Programação atual para',
|
||||
addEdit: 'Adicionar/Editar Fonte',
|
||||
audio: 'Áudio',
|
||||
customFilter: 'Filtro Personalizado',
|
||||
deleteFrom: 'Excluir programa de',
|
||||
deleteFrom: 'Excluir programação de',
|
||||
deleteSuccess: 'Lista de reprodução excluída...',
|
||||
generateProgram: 'Gerar Programa',
|
||||
generateProgram: 'Gerar Programação',
|
||||
simple: 'Simples',
|
||||
advanced: 'Avançado',
|
||||
sorted: 'Ordenado',
|
||||
@ -86,26 +90,26 @@ export default {
|
||||
addBlock: 'Adicionar bloco de tempo',
|
||||
},
|
||||
media: {
|
||||
notExists: 'Mídia não existe!',
|
||||
create: 'Criar pasta',
|
||||
upload: 'Fazer upload de mídias',
|
||||
deleteTitle: 'Excluir mídia/pasta',
|
||||
deleteQuestion: 'Tem certeza que deseja excluir?',
|
||||
preview: 'Reproduzir',
|
||||
rename: 'Renomear mídia',
|
||||
newFile: 'Novo nome da mídia',
|
||||
createFolder: 'Criar pasta',
|
||||
foldername: 'Nome da pasta',
|
||||
notExists: 'O armazenamento não existe!',
|
||||
create: 'Criar Pasta',
|
||||
upload: 'Enviar Arquivos',
|
||||
deleteTitle: 'Deletar Arquivo/Pasta',
|
||||
deleteQuestion: 'Tem certeza que deseja deletar?',
|
||||
preview: 'Visualizar',
|
||||
rename: 'Renomear Arquivo',
|
||||
newFile: 'Novo nome de arquivo',
|
||||
createFolder: 'Criar Pasta',
|
||||
foldername: 'Nome da Pasta',
|
||||
current: 'Atual',
|
||||
overall: 'Total',
|
||||
uploading: 'Enviando',
|
||||
moveError: 'Erro ao mover',
|
||||
deleteError: 'Erro ao excluir!',
|
||||
deleteError: 'Erro ao deletar!',
|
||||
folderExists: 'A pasta já existe',
|
||||
folderCreate: 'Criação da pasta concluída...',
|
||||
folderError: 'Erro ao criar pasta',
|
||||
uploadError: 'Erro ao carregar',
|
||||
fileExists: 'A mídia já existe!',
|
||||
fileExists: 'O arquivo já existe!',
|
||||
},
|
||||
message: {
|
||||
savePreset: 'Salvar predefinição',
|
||||
@ -132,72 +136,72 @@ export default {
|
||||
},
|
||||
config: {
|
||||
channel: 'Canal',
|
||||
user: 'Usuários',
|
||||
channelConf: 'Configuração do canal',
|
||||
addChannel: 'Adicionar novo canal',
|
||||
user: 'Usuário',
|
||||
channelConf: 'Configuração do Canal',
|
||||
addChannel: 'Adicionar novo Canal',
|
||||
name: 'Nome',
|
||||
previewUrl: 'URL de visualização',
|
||||
configPath: 'Caminho de configuração',
|
||||
extensions: 'Extensões extras',
|
||||
previewUrl: 'URL de Visualização',
|
||||
configPath: 'Caminho de Configuração',
|
||||
extensions: 'Extensões Extras',
|
||||
service: 'Serviço',
|
||||
save: 'Salvar',
|
||||
delete: 'Deletar',
|
||||
updateChannelSuccess: 'Atualização da configuração do canal com sucesso!',
|
||||
updateChannelSuccess: 'Atualização da configuração do canal bem-sucedida!',
|
||||
updateChannelFailed: 'Falha na atualização da configuração do canal!',
|
||||
errorChannelDelete: 'O primeiro canal não pode ser excluído!',
|
||||
deleteChannelSuccess: 'Excluir configuração da GUI com sucesso!',
|
||||
deleteChannelFailed: 'Falha ao excluir configuração da GUI!',
|
||||
playoutConf: 'Configuração do ffplayout',
|
||||
errorChannelDelete: 'O primeiro canal não pode ser deletado!',
|
||||
deleteChannelSuccess: 'Exclusão da configuração da GUI bem-sucedida!',
|
||||
deleteChannelFailed: 'Falha na exclusão da configuração da GUI!',
|
||||
playoutConf: 'Configuração de Playout',
|
||||
general: 'Geral',
|
||||
rpcServer: 'RPC Server',
|
||||
mail: 'Email',
|
||||
logging: 'Registros',
|
||||
logging: 'Registro',
|
||||
processing: 'Processamento',
|
||||
ingest: 'Ingerir',
|
||||
ingest: 'Ingestão',
|
||||
playlist: 'Playlist',
|
||||
storage: 'Armazenamento',
|
||||
text: 'Texto',
|
||||
task: 'Tarefa',
|
||||
out: 'Transmissão',
|
||||
out: 'Saída',
|
||||
placeholderPass: 'Senha',
|
||||
help: 'Ajuda',
|
||||
generalText: `Às vezes pode acontecer que um arquivo esteja corrompido, mas ainda possa ser reproduzido, o que pode causar um erro de streaming 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 é com você. A melhor maneira é um serviço systemd no Linux.
|
||||
'stop_threshold' irá parar o ffplayout se for assíncrono no tempo acima deste valor. Um número menor que 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. Ao desativar esse serviço, o front end não responderá com as informações de mídia, entre outras funções.',
|
||||
mailText: `Enviar mensagens de erro para o endereço de e-mail, como lista de reprodução ausente; formato JSON inválido; faltando caminho do clipe. Deixe o destinatário em branco se não precisar dele. 'mail_level' pode ser INFO, WARNING ou ERROR. 'interval' eo tempo em segundos até que um novo e-mail seja enviado.`,
|
||||
logText: `Se 'log_to_file' estiver acionado, registre no arquivo; se for desativado, registre no console. 'backup_count' indica por quanto tempo os arquivos de registro serão salvos em dias. 'local_time' acionado definirá os carimbos de data e hora do log para UTC. Caminho para /var/log/ somente se você estiver executando como um daemon.
|
||||
'nível' pode ser DEBUG, INFO, WARNING, ERROR. 'ffmpeg_level' pode ser INFO, AVISO, ERRO. 'detect_silence' registra uma mensagem de erro se a linha de áudio ficar em silêncio por 15 segundos durante o processo de validação. 'ignore_lines' Ignorar erros de registros`,
|
||||
processingText: `Processamento padrão para todos os clipes para torná-los únicos. O modo pode ser Playlist ou Folder. 'aspecto' deve ser um número flutuante. 'logotipo' só é usado se o caminho existir.
|
||||
'logo_scale' dimensiona o logotipo para o tamanho desejado, deixe em branco se nenhum dimensionamento for necessário, o formato é 'largura:altura', por exemplo '100:-1' para dimensionamento proporcional. Com 'logo_opacity' você pode tornar o logotipo transparente.
|
||||
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 logotipo. 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.`,
|
||||
ingestText: `Execute um servidor para um fluxo de ingestão. Este fluxo 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.`,
|
||||
playlistText: `'path' Onde a playlist será salva. Para diretório especifique apenas a pasta raiz, por exemplo '/playlists', os subdiretórios serão lidos pelo programa. Os subdiretórios precisam desta estrutura '/playlists/2018/01'.
|
||||
'day_start' é o horário em que a playlist deve começar, deixe 'day_start' vazio se a playlist deve sempre começar do início. 'length' representa a duração alvo da lista de reprodução; se estiver vazio, a duração real não será considerada. 'infinit: true' funciona com um único arquivo de lista de reprodução e faz um loop infinito.`,
|
||||
storageText: `'path' E onde será salvo ás "Mídias" ou onde se encontrar elas. 'filler_clip' Serve para preencher na falta de "Mídia" no Playout, ele fará um loop quando necessário. Defina 'extensions' para pesquisar apenas arquivos com essa extensão. Defina 'shuffle' como 'true' para selecionar arquivos aleatoriamente.`,
|
||||
textText: `Sobreponha texto em combinação com libzmq para manipulação remota de texto. No Windows, o caminho do arquivo da fonte deve ser 'C\\:/WINDOWS/fonts/DejaVuSans.ttf'. 'text_from_filename' ativa a extração de texto de um nome de arquivo. Com 'style' você pode definir os parâmetros do 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.`,
|
||||
taskText: `Execute um programa externo 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.`,
|
||||
outText: `A compactação de playout final. 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 desejar transmitir para um servidor rtmp/rtsp/srt/.... Na produção, não sirva playlist hls com ffpapi, use nginx ou outro servidor web!`,
|
||||
restartTile: 'Reiniciar ffplayout',
|
||||
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.
|
||||
'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.`,
|
||||
rpcText: 'Execute um servidor JSON RPC para obter informações sobre o que está sendo reproduzido e para algumas funções de controle.',
|
||||
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.`,
|
||||
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. 'backup_count' define por quantos dias os arquivos de registro de log serão salvos. 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.
|
||||
'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.`,
|
||||
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.
|
||||
'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.
|
||||
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.`,
|
||||
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.`,
|
||||
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'.
|
||||
'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.`,
|
||||
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.`,
|
||||
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.`,
|
||||
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.`,
|
||||
outText: `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!`,
|
||||
restartTile: 'Reiniciar Playout',
|
||||
restartText: 'Reiniciar o ffplayout para aplicar as alterações?',
|
||||
},
|
||||
user: {
|
||||
title: 'Configuração do usuário',
|
||||
title: 'Configuração de usuário',
|
||||
add: 'Adicionar usuário',
|
||||
delete: 'Excluir',
|
||||
delete: 'Deletar',
|
||||
name: 'Nome de usuário',
|
||||
mail: 'Email',
|
||||
password: 'Senha',
|
||||
newPass: 'Nova senha',
|
||||
confirmPass: 'Confirmar senha',
|
||||
newPass: 'Nova Senha',
|
||||
confirmPass: 'Confirmar Senha',
|
||||
save: 'Salvar',
|
||||
admin: 'Administrador',
|
||||
deleteNotPossible: 'Excluir usuário atual não é possível!',
|
||||
deleteSuccess: 'Exclusão de usuário concluído!',
|
||||
deleteError: 'Erro ao excluir usuário',
|
||||
deleteNotPossible: 'Excluir o usuário atual não é possível!',
|
||||
deleteSuccess: 'Usuário deletado com sucesso!',
|
||||
deleteError: 'Erro ao deletar usuário',
|
||||
addSuccess: 'Usuário adicionado com sucesso!',
|
||||
addFailed: 'Falha ao adicionar usuário!',
|
||||
mismatch: 'Senha incorreta!',
|
||||
updateSuccess: 'Atualização das informações do usuário com sucesso!',
|
||||
updateFailed: 'Falha na atualização das informações do usuário!',
|
||||
mismatch: 'Senhas não coincidem!',
|
||||
updateSuccess: 'Atualização do perfil do usuário bem-sucedida! ',
|
||||
updateFailed: 'Atualização do perfil do usuário falhou!',
|
||||
},
|
||||
}
|
||||
|
@ -91,27 +91,27 @@ export default defineNuxtConfig({
|
||||
player: {
|
||||
de: '/wiedergabe',
|
||||
en: '/player',
|
||||
'pt-br': '/playout',
|
||||
'pt-br': '/player',
|
||||
},
|
||||
media: {
|
||||
de: '/medien',
|
||||
en: '/media',
|
||||
'pt-br': '/mídias',
|
||||
'pt-br': '/armazenamento',
|
||||
},
|
||||
message: {
|
||||
de: '/nachrichten',
|
||||
en: '/message',
|
||||
'pt-br': '/mensagens',
|
||||
'pt-br': '/legenda',
|
||||
},
|
||||
logging: {
|
||||
de: '/protokollierung',
|
||||
en: '/logging',
|
||||
'pt-br': '/registros',
|
||||
'pt-br': '/registro',
|
||||
},
|
||||
configure: {
|
||||
de: '/einstellungen',
|
||||
en: '/configure',
|
||||
'pt-br': '/configuração',
|
||||
'pt-br': '/configurar',
|
||||
},
|
||||
},
|
||||
detectBrowserLanguage: {
|
||||
|
@ -121,50 +121,56 @@
|
||||
|
||||
<GenericModal :show="showSourceModal" :title="$t('player.addEdit')" :modal-action="processSource">
|
||||
<div>
|
||||
<label class="form-control w-full mt-3">
|
||||
<label class="form-control w-auto mt-auto">
|
||||
<div class="label">
|
||||
<span class="label-text">{{ $t('player.in') }}</span>
|
||||
<span class="label-text">{{ $t('player.title') }}</span>
|
||||
</div>
|
||||
<input v-model.number="newSource.in" type="number" class="input input-sm input-bordered w-full" />
|
||||
<input v-model.number="newSource.title" type="text" class="input input-sm input-bordered w-auto" />
|
||||
</label>
|
||||
<label class="form-control w-auto mt-auto">
|
||||
<div class="label">
|
||||
<span class="label-text">{{ $t('player.timeIn') }}</span>
|
||||
</div>
|
||||
<input v-model.number="newSource.in" type="number" class="input input-sm input-bordered w-auto" />
|
||||
</label>
|
||||
|
||||
<label class="form-control w-full mt-3">
|
||||
<label class="form-control w-auto mt-auto">
|
||||
<div class="label">
|
||||
<span class="label-text">{{ $t('player.out') }}</span>
|
||||
<span class="label-text">{{ $t('player.timeOut') }}</span>
|
||||
</div>
|
||||
<input v-model.number="newSource.out" type="number" class="input input-sm input-bordered w-full" />
|
||||
<input v-model.number="newSource.out" type="number" class="input input-sm input-bordered w-auto" />
|
||||
</label>
|
||||
|
||||
<label class="form-control w-full mt-3">
|
||||
<label class="form-control w-auto mt-auto">
|
||||
<div class="label">
|
||||
<span class="label-text">{{ $t('player.duration') }}</span>
|
||||
<span class="label-text">{{ $t('player.timeDuration') }}</span>
|
||||
</div>
|
||||
<input
|
||||
v-model.number="newSource.duration"
|
||||
type="number"
|
||||
class="input input-sm input-bordered w-full"
|
||||
class="input input-sm input-bordered w-auto"
|
||||
/>
|
||||
</label>
|
||||
|
||||
<label class="form-control w-full mt-3">
|
||||
<label class="form-control w-auto mt-auto">
|
||||
<div class="label">
|
||||
<span class="label-text">{{ $t('player.file') }}</span>
|
||||
</div>
|
||||
<input v-model="newSource.source" type="text" class="input input-sm input-bordered w-full" />
|
||||
<input v-model="newSource.source" type="text" class="input input-sm input-bordered w-auto" />
|
||||
</label>
|
||||
|
||||
<label class="form-control w-full mt-3">
|
||||
<label class="form-control w-auto mt-auto">
|
||||
<div class="label">
|
||||
<span class="label-text">{{ $t('player.audio') }}</span>
|
||||
</div>
|
||||
<input v-model="newSource.audio" type="text" class="input input-sm input-bordered w-full" />
|
||||
<input v-model="newSource.audio" type="text" class="input input-sm input-bordered w-auto" />
|
||||
</label>
|
||||
|
||||
<label class="form-control w-full mt-3">
|
||||
<label class="form-control w-auto mt-auto">
|
||||
<div class="label">
|
||||
<span class="label-text">{{ $t('player.customFilter') }}</span>
|
||||
</div>
|
||||
<input v-model="newSource.custom_filter" type="text" class="input input-sm input-bordered w-full" />
|
||||
<input v-model="newSource.custom_filter" type="text" class="input input-sm input-bordered w-auto" />
|
||||
</label>
|
||||
|
||||
<div class="form-control">
|
||||
@ -240,6 +246,7 @@ const isVideo = ref(false)
|
||||
|
||||
const newSource = ref({
|
||||
begin: 0,
|
||||
title: '',
|
||||
in: 0,
|
||||
out: 0,
|
||||
duration: 0,
|
||||
@ -332,6 +339,7 @@ function processSource(process: boolean) {
|
||||
editId.value = -1
|
||||
newSource.value = {
|
||||
begin: 0,
|
||||
title: '',
|
||||
in: 0,
|
||||
out: 0,
|
||||
duration: 0,
|
||||
@ -349,6 +357,7 @@ function editPlaylistItem(i: number) {
|
||||
|
||||
newSource.value = {
|
||||
begin: playlistStore.playlist[i].begin,
|
||||
title: playlistStore.playlist[i].title,
|
||||
in: playlistStore.playlist[i].in,
|
||||
out: playlistStore.playlist[i].out,
|
||||
duration: playlistStore.playlist[i].duration,
|
||||
|
@ -17,6 +17,7 @@ export const usePlaylist = defineStore('playlist', {
|
||||
progressValue: 0,
|
||||
currentClip: '',
|
||||
currentClipIndex: 0,
|
||||
currentClipTitle: '',
|
||||
currentClipStart: 0,
|
||||
currentClipDuration: 0,
|
||||
currentClipIn: 0,
|
||||
@ -81,6 +82,7 @@ export const usePlaylist = defineStore('playlist', {
|
||||
this.currentClipIn = item.media.in
|
||||
this.currentClipOut = item.media.out
|
||||
this.currentClipDuration = item.media.duration
|
||||
this.currentClipTitle = item.media.title
|
||||
this.currentClipIndex = item.index
|
||||
this.elapsedSec = item.elapsed
|
||||
this.ingestRuns = item.ingest
|
||||
|
1
types/index.d.ts
vendored
1
types/index.d.ts
vendored
@ -55,6 +55,7 @@ declare global {
|
||||
date?: string
|
||||
uid: string
|
||||
begin: number
|
||||
title?: string | null
|
||||
source: string
|
||||
duration: number
|
||||
in: number
|
||||
|
Loading…
x
Reference in New Issue
Block a user