Da planilha às telas
- Comece pelo modelo. Salve o modelo como CSV ou XLSX, ou use sua própria planilha com as mesmas colunas.
- Preencha uma linha por linha de programação. Indique a tela (ou uma pasta ou uma tag), o arquivo, o início e o fim.
- Importe. Solte o arquivo na caixa de diálogo Importar da aba Programação do dashboard, ou execute
screenrig schedule import FILE. - Corrija as linhas com erros. Cada erro indica a linha, a coluna e um código. Edite a célula na caixa de diálogo, ou edite a planilha e importe de novo.
- Verifique a prévia. Ela lista os níveis que a planilha cria, os que altera ou remove e o calendário das telas que ela afeta.
- Publique. Todas as linhas são aplicadas juntas ou nenhuma é.
As etapas 1 a 5 não gravam nada. Uma tela precisa de um fuso horário (screen set-timezone) e de uma playlist padrão (screen assign) antes que uma linha possa programá-la, e um arquivo precisa ser uma imagem ou um vídeo aprovado.
A planilha
A primeira linha dá nome às colunas. Cada linha seguinte é uma linha de programação. Linhas em branco são ignoradas. Uma planilha é um arquivo CSV (UTF-8, separado por vírgula ou ponto e vírgula) ou uma pasta de trabalho XLSX, e uma pasta de trabalho XLSX é lida a partir da primeira planilha.
| Coluna | Também lido como | O que ele contém |
|---|---|---|
target | screen, screen code, code, room, room id, screen name, screen id | As telas que a linha programa. Obrigatório |
content | file, file name, media, asset, playlist | O que é reproduzido. Obrigatório |
start | start date, from, begin | Quando a linha começa |
end | end date, until, stop | Quando a linha termina |
timezone | time zone, tz | O fuso em que os horários da linha são escritos |
days | weekdays, day | Os dias da semana em que a linha é reproduzida |
daily start | window start, time from | A hora do dia em que cada janela de reprodução abre |
daily end | window end, time to | A hora do dia em que cada janela de reprodução fecha |
priority | De 0 a 100. O maior reproduz sobre o menor. Padrão 0 | |
name | level, label | Um nome para o nível que a linha cria |
display | displays, output | As saídas do videowall em que a linha é reproduzida, como 1 ou 1,2 |
Os cabeçalhos são comparados sem considerar maiúsculas, espaços e pontuação. Uma coluna que nada lê é ignorada, e a prévia a lista. Uma linha precisa de target, de content e de pelo menos um entre start, end, days ou uma janela diária.
Screen,File,Start,End,Timezone,Days,Daily start,Daily end,Priority,Name
LOBBY-01,welcome-spring.jpg,2026-11-05 18:00,2026-11-08 02:00,America/Los_Angeles,,,,0,
folder:Casino Floor,happy-hour.mp4,2026-11-05,2026-11-30,,Mon-Fri,16:00,19:00,5,Happy hour
tag:elevators,playlist:Holiday loop,2026-12-01 09:00,2026-12-26,,,,,0,
- A linha 2 reproduz
welcome-spring.jpgna tela com o códigoLOBBY-01das 18h de 5 de novembro até as 2h de 8 de novembro, horário do Pacífico. - A linha 3 reproduz
happy-hour.mp4em todas as telas da pastaCasino Floore das pastas dentro dela, das 16h às 19h nos dias úteis, de 5 de novembro ao fim de 30 de novembro. - A linha 4 reproduz a playlist
Holiday loopem todas as telas com a tagelevators, das 9h de 1º de dezembro ao fim de 25 de dezembro.
Alvos
Um alvo é um destes:
- Uma tela. O id de uma tela, o valor de qualquer campo da tela (um código de sala, um número de loja) ou o nome da tela.
--code-fieldoucode_fieldlimita a correspondência a um campo, comocodeouroom_id. - Uma pasta.
folder:NAMEoufolder:Parent/Child. Alcança a pasta e todas as pastas dentro dela. - Uma tag.
tag:NAMEalcança todas as telas com a tag.
Vários alvos em uma célula são separados por ; ou |, como em LOBBY-01;LOBBY-02|tag:elevators.
Conteúdo
- Um arquivo. O nome de um arquivo de mídia do projeto, ou o nome original de um upload convertido. O arquivo é reproduzido em tela cheia. O primeiro commit que usa um arquivo cria a playlist de um arquivo
Scheduled: FILE, e as importações seguintes a reutilizam. - Uma playlist.
playlist:NAMEou o id de uma playlist. A playlist tem uma versão aprovada e não é um template.
Horários
- Datas e horários.
2026-11-05 18:00,2026-11-05T18:00,11/5/2026 6:00 PMe células de data de planilha são lidos. Um horário com deslocamento, comoZou+02:00, é recusado. - O relógio próprio de cada tela. Os horários são lidos no relógio das telas que a linha alcança, então
18:00é 18h onde quer que a tela esteja. - Outro fuso horário. Uma célula
timezone(ou otimezoneda requisição) indica que a linha está escrita nesse fuso. Os horários são convertidos para o fuso das telas quando todas as telas da linha compartilham o mesmo fuso. Uma linha que alcança telas em vários fusos deixatimezonevazio e lê o relógio próprio de cada tela. - Uma data sozinha como fim encerra esse dia:
2026-11-30termina ao fim de 30 de novembro. Uma data sozinha como início começa à meia-noite. - Sem fim mantém a linha em reprodução até que uma importação posterior a remova. A prévia avisa com
open_end. - Dias.
Mon-Fri,Mon,Wed,Fri,Sat,Sun,weekdays,weekendsoudaily. Uma linha comdayse sem janela diária reproduz o dia todo nesses dias. - Uma janela diária.
daily startedaily endinformam as horas de cada dia, como16:00e19:00ou4:00 PMe7:00 PM. Informe os dois. Um fim igual ou anterior ao início atravessa a meia-noite e pertence ao dia em que começa. Semdays, a janela vale todos os dias.
Prévia e erros
A prévia verifica cada linha e cada célula antes que algo seja gravado. Uma linha com erro é exibida com suas células, e cada erro indica a coluna, um código e o que alterar.
| Código | Coluna | Significado e correção |
|---|---|---|
required | target, content, daily start, daily end | A célula está vazia, ou apenas uma das células da janela diária está preenchida. Preencha-a |
unknown_screen | target | Nenhuma tela tem esse id, valor de campo ou nome. Verifique o código ou o campo que code_field nomeia |
ambiguous_screen | target | O valor corresponde a várias telas. Use o id da tela ou um código único |
unknown_folder | target | Nenhuma pasta de telas tem esse nome. Verifique a grafia |
ambiguous_folder | target | Várias pastas têm esse nome. Escreva o caminho, como folder:Hotel/Casino Floor |
unknown_tag | target | Nenhuma tela tem a tag. Verifique a grafia |
unknown_file | content | Nenhum arquivo ou playlist tem esse nome. Envie o arquivo ou corrija o nome |
ambiguous_file | content | Vários arquivos têm esse nome. Renomeie um deles, ou escreva playlist:NAME |
not_playable | content | O arquivo não é uma imagem nem um vídeo, a mídia aguarda revisão, ou a playlist é um template ou não tem versão aprovada. Aprove-a, ou escolha outra |
invalid_time | start, end, daily start, daily end | A célula não é uma data e hora, ou traz um deslocamento de fuso. Escreva 2026-11-05 18:00 |
reversed_times | end | O fim não é posterior ao início. Corrija um dos dois |
past_end | end | O fim já passou. Mova-o para mais tarde, ou remova a linha |
no_timing | start | A linha não diz nada sobre quando. Informe um início, um fim, dias ou uma janela diária |
invalid_value | days, priority, display | A célula não é uma lista de dias como Mon-Fri, um número inteiro de 0 a 100, ou números de display como 1,2 |
timezone | timezone | O fuso é desconhecido, ou o alvo contém telas em vários fusos. Use um fuso como America/Los_Angeles, ou deixe vazio |
screen_not_ready | target | Uma tela não tem fuso horário ou não tem playlist padrão. Execute screen set-timezone ou screen assign |
overlap | priority | Duas linhas vigoram ao mesmo tempo em uma tela com a mesma prioridade. Dê a uma delas outra prioridade, ou mude um horário |
limit | target | Uma tela teria mais de 32 níveis próprios, ou a organização mais de 100 campanhas (cada nível compartilhado é uma). Agrupe linhas, ou use como alvo uma pasta ou uma tag |
Dois avisos não interrompem uma importação. open_end marca uma linha sem fim. outranked marca uma linha sobre a qual um nível compartilhado (uma linha para várias telas, uma pasta ou uma tag) é reproduzido em uma tela.
Uma planilha sem linhas, um arquivo que não é UTF-8, mais de 5.000 linhas, um arquivo acima de 8 MiB ou um commit que gravaria mais de 400 programações próprias de telas é recusado com o motivo.
Níveis
Linhas que coincidem em conteúdo, horários, prioridade, nome e display viram um nível. O alvo não entra na comparação, então dez linhas que reproduzem o mesmo arquivo nos mesmos horários em dez telas formam um nível.
- Uma tela cria uma entrada na programação própria dessa tela.
- Várias telas, uma pasta ou uma tag criam um nível compartilhado, uma campanha sobre esse público. Um nível compartilhado prevalece sobre os níveis próprios de uma tela.
Agrupar transforma as 200 telas de um local em uma campanha e não em 200 entradas, e uma correção na planilha altera um nível. A coluna name dá nome a um nível compartilhado. Sem ela, o nível recebe o nome da importação, do conteúdo e do alvo, como em Spring promos: happy-hour.mp4 on Casino Floor.
Importar de novo
O name de uma importação a identifica, e o padrão é import. Ao importar de novo com o mesmo nome:
- atualiza os níveis que criou, mesmo quando as datas de uma linha mudaram;
- adiciona os níveis das linhas novas;
- remove os níveis cujas linhas não estão mais na planilha;
- não altera nada quando a planilha é a mesma.
Os níveis criados por uma importação a carregam em seu id (as entradas de uma tela começam com imp_) e as campanhas levam uma marca import. Os níveis que você criou à mão nunca são tocados. Use um nome para cada planilha e um nome diferente para outra.
Executar uma importação
Dashboard
Abra a aba Programação de um projeto e escolha Importar. Solte um arquivo CSV ou XLSX. A caixa de diálogo mostra uma tabela com as linhas e cada erro ao lado de sua célula, e você edita a célula no local. Em seguida ela mostra o calendário composto das telas que a importação altera. Publicar confirma a importação.
Linha de comando
screenrig schedule template --output schedule.csv
screenrig schedule import schedule.csv --name "Spring promos" --timezone America/Los_Angeles
screenrig schedule import schedule.csv --name "Spring promos" --timezone America/Los_Angeles --commit
schedule import gera a prévia e não grava nada. --commit aplica a planilha quando todas as linhas são válidas.
| Opção | Significado |
|---|---|
--name NAME | O nome da importação, de 1 a 80 caracteres. O padrão é o nome do arquivo sem a extensão |
--timezone ZONE | O fuso em que os horários são escritos quando uma linha não tem timezone |
--code-field FIELD | Ler um código de tela somente deste campo da tela |
--commit | Aplique a planilha |
--format csv|xlsx | schedule template: o formato do modelo |
--output FILE | schedule template: onde salvar |
O comando sai com 0 para uma planilha válida, 8 quando há linhas com erros (nada é gravado) e 5 quando o projeto mudou desde a prévia (execute de novo). FILE é um arquivo .csv, .xlsx ou .json, ou - para a entrada padrão. Um arquivo JSON contém um array de objetos de linha, ou {"rows": [...]}, indexados pelo nome da coluna.
API
Envie a planilha como linhas JSON, ou como corpo CSV ou XLSX com as configurações como parâmetros de consulta. A prévia exige acesso de leitura. O commit exige uma credencial com acesso de escrita, concedida por uma pessoa que possa aprovar no dashboard.
curl -s https://api.screenrig.ai/api/schedule/imports/preview \
--header "Authorization: Bearer $SCREENRIG_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"name": "Spring promos",
"timezone": "America/Los_Angeles",
"rows": [
{"target": "LOBBY-01", "content": "welcome-spring.jpg", "start": "2026-11-05 18:00", "end": "2026-11-08 02:00"},
{"target": "folder:Casino Floor", "content": "happy-hour.mp4", "start": "2026-11-05", "end": "2026-11-30",
"days": "Mon-Fri", "daily_start": "16:00", "daily_end": "19:00", "priority": 5, "name": "Happy hour"}
]
}'
A mesma planilha como arquivo:
curl -s "https://api.screenrig.ai/api/schedule/imports/preview?name=Spring%20promos&timezone=America/Los_Angeles" \
--header "Authorization: Bearer $SCREENRIG_TOKEN" \
--header "Content-Type: text/csv" \
--data-binary @schedule.csv
A resposta, resumida:
{
"name": "Spring promos",
"valid": false,
"fingerprint": "FINGERPRINT",
"columns": ["target", "content", "start", "end", "days", "daily_start", "daily_end", "priority", "name"],
"summary": {"rows": 2, "rows_with_errors": 1, "levels": 1, "creates": 1, "updates": 0,
"unchanged": 0, "removes": 0, "screens": 1, "playlists": 1},
"rows": [
{"row": 2, "status": "ok", "level": "LEVEL_KEY"},
{"row": 3, "status": "error",
"errors": [{"column": "content", "code": "unknown_file",
"message": "No file or playlist is named \"happy-hour.mp4\"."}]}
],
"levels": [{"key": "LEVEL_KEY", "action": "create", "home": "screen", "screen_id": "scr_LOBBY",
"content": {"kind": "file", "id": "med_WELCOME", "name": "welcome-spring.jpg"},
"screens": 1, "priority": 0, "from": "2026-11-05T18:00", "until": "2026-11-08T02:00", "rows": [2]}],
"removals": []
}
rows[].cells retorna as células de cada linha como a planilha as forneceu, para que o cliente as corrija e envie as linhas novamente. valid é true quando nenhuma linha tem erro. calendar tem o formato de GET /api/schedule/calendar e mostra as telas que a importação altera como ficariam após um commit.
O commit envia a mesma planilha e o fingerprint da sua prévia, como membro do corpo JSON ou como parâmetro de consulta com um arquivo. Envie um Idempotency-Key para repetir com segurança.
curl -s https://api.screenrig.ai/api/schedule/imports \
--header "Authorization: Bearer $SCREENRIG_TOKEN" \
--header "Idempotency-Key: spring-promos-1" \
--header "Content-Type: application/json" \
--data @commit.json
A resposta traz preview e applied, as contagens do que foi criado, atualizado, deixado sem alteração e removido, com as telas gravadas e as playlists criadas. Um commit é recusado, e não grava nada, como:
| Problema | Status | Significado e correção |
|---|---|---|
schedule_import_invalid | 422 | Há linhas com erros. Corrija-as e pré-visualize de novo |
schedule_import_stale | 409 | Telas, mídias, playlists ou níveis mudaram desde a prévia, ou as linhas são lidas de outra forma. Pré-visualize de novo e faça o commit com a nova fingerprint |
GET /api/schedule/imports/template?format=csv e format=xlsx respondem com o modelo.
Limites
- 5.000 linhas e 8 MiB por planilha.
- 32 níveis próprios por tela. Uma organização comporta até 100 campanhas em todos os seus projetos, e cada nível compartilhado é uma delas.
- 400 programações próprias de telas gravadas por commit. Uma linha de pasta ou de tag alcança qualquer número de telas.
- O nome de uma importação tem de 1 a 80 caracteres.