Documentazione

Riferimento comandi CLI

Il CLI screenRIG pubblica contenuti multimediali, playlist e applicazioni su TV e kiosk da un terminale o da un agente. Trova comandi, parametri, output JSON e regole di revisione per pubblicare contenuti e gestire schermi.

Ogni comando viene eseguito allo stesso modo

screenrig [--json | --human] [--api-url URL] [--config PATH] [--request-id ID]
      [--project-id ID] [--idempotency-key KEY] [--timeout MS] [--beta-key KEY] <command> [args]

Flag globali

SegnalaTipoPredefinitoNote
--jsonbooleanJSON per operazioniOutput JSON esplicito, mantenuto per compatibilità. Seleziona anche aiuto strutturato. Non può essere combinato con --human.
--humanbooleanspentoSeleziona un output operativo leggibile. Non può essere combinato con --json.
--project-id IDstringultimo progetto usatoCorreggi questa invocazione a un progetto memorizzato nella cache senza cambiare la selezione. Ogni comando mantiene il suo obiettivo e stato di recupero per tutta la sua esecuzione.
--api-url URLstringhttps://api.screenrig.aiOrigine del piano di controllo. SCREENRIG_API_URL imposta la stessa cosa.
--config PATHpathil file di configurazione utenteUsa un file di configurazione specifico. SCREENRIG_CONFIG imposta la stessa cosa.
--request-id IDstringgenerato per esecuzioneIl tuo ID richiesta personale, restituito come request_id. Conservalo nei report.
--idempotency-key KEYstringderivato per scritturaRiutilizza la stessa chiave per ritentare una scrittura ambigua. Il server restituisce il risultato originale per ventiquattro ore; un corpo diverso sotto la stessa chiave è idempotency_mismatch.
--timeout MSinteger30.000 per richiestaLimita ogni richiesta HTTP. Su un comando che attende un’operazione è invece il termine di attesa, e il valore predefinito è 120000.
--beta-key KEYstringnon impostatoInviato solo quando il piano di controllo ne richiede uno. SCREENRIG_BETA_KEY imposta la stessa cosa.
--help, -hbooleanspentoStampa l’aiuto focalizzato per il comando o gruppo ed esci. Aggiungi --json per aiuto strutturato.
--version, -VbooleanspentoStampa la versione CLI inclusa ed esci. Uguale al comando version.

Ambiente

VariabileEffetto
SCREENRIG_API_URLOrigine del piano di controllo, che sovrascrive la configurazione memorizzata.
SCREENRIG_CONFIGPercorso al file di configurazione.
XDG_CONFIG_HOMEBase della directory di configurazione. Altrimenti %APPDATA%\screenrig su Windows, o ~/.config/screenrig.
SCREENRIG_BETA_KEYChiave beta, quando il piano di controllo ne richiede una.
SCREENRIG_FFMPEGPercorso assoluto a ffmpeg, quando media upload non deve prenderlo da PATH.
SCREENRIG_FFPROBEPercorso assoluto a ffprobe.
SCREENRIG_CWEBPPercorso assoluto a cwebp, il fallback ancora codificatore.
SCREENRIG_CLIENT_IDEsegui come questo service client (scl_…), con esattamente uno dei due seguenti.
SCREENRIG_CLIENT_KEY_FILEIl file chiave privata del client di servizio, JWK o PEM, firmato in un’asserzione private_key_jwt.
SCREENRIG_CLIENT_SECRETIl segreto del client di servizio, inviato con HTTP Basic.

Non esiste flag token né variabile ambiente token. La CLI legge la sessione che il plugin ha salvato per questa installazione, in un file privato utente che sopravvive a un aggiornamento plugin, e la rinnova da sola. Con SCREENRIG_CLIENT_ID impostato, accede come quel service client invece, mantiene il token in memoria e non legge né scrive la config salvata.

Output

I comandi operativi scrivono JSON su stdout per impostazione predefinita, inclusi gli errori. Un singolo risultato contiene una busta: ok, poi data, request_id, operation_id e warnings[] in caso di successo, o error in caso di fallimento. Avanzamento, URL sicuri e note umane vanno su stderr. events follow emette NDJSON: una busta JSON per evento, su una riga propria. Reindirizzare stdout non cambia il formato.

Usa --human per l’ispezione manuale. I comandi evento stampano una riga logfmt per evento. Aiuto e gruppi di comandi semplici restano testo leggibile per impostazione predefinita; usa screenrig --json playlist --help per la scoperta strutturata. --json e --human non possono essere combinati.

I bundle plugin più vecchi possono richiedere --json esplicito per i risultati operativi. Controlla l’aiuto della CLI installata quando lavori con un bundle più vecchio. I file di authoring playlist restano documenti JSON; un involucro risultato comando non è un documento playlist modificabile.

Una busta di errore contiene error.status, un error.code stabile e spesso error.next.command che indica esattamente cosa eseguire dopo. Ramifica su quelli invece che sul testo.

Una modifica che attende la revisione di una persona è un successo, non un errore: ok: true, esci 0, data.status: pending_review con il review, un avviso pending_review che indica l’URL della revisione, e data.next che punta a reviews show ID. Una rietichettatura di media approvati in revisione è ok, esci 0, con avviso media_review_pending invece: la sua revisione appare in reviews list entro pochi secondi. Vedi Revisioni.

Codici uscita

CodiceSignificato
0Successo.
1Errore imprevisto.
2Errore di utilizzo. Non è stato inviato nulla.
3Problema di credenziale. Questa installazione non può autenticarsi.
4Non trovato.
5Conflitto.
6Precondizione fallita, incluso revision_conflict: la revisione --expect-rev era obsoleta.
7Limite di frequenza. Rispetta Retry-After, mostrato come retry_after_seconds.
8Rifiuto lato client diverso.
9Errore del server.
10Errore di rete.
11Tempo scaduto.
12Errore di configurazione.
13L’operazione stessa è fallita.

Codici problema comuni nell’envelope:

CodiceSignificatoPasso successivo
not_enrolledQuesta installazione non ha ancora credenziali di progetto.Crea un progetto con screenrig agent enroll --email ADDRESS --organization NAME, oppure accedi a questo installazione in un progetto di cui fai parte con screenrig login.
session_endedL’accesso è stato revocato, scaduto o terminato.screenrig login, approvato da una persona nel dashboard.
insufficient_accessIl livello di accesso della sessione non può fare questo: Read only non cambia nulla, e Propose non può eliminare, controllare schermi o spendere.screenrig agent status mostra effective_access. Quando access_limited_by nomina project o person, il proprietario del progetto modifica l’impostazione della revisione; altrimenti screenrig login --access manage, approvato da una persona.
approver_requiredSolo il proprietario del progetto o un membro che può approvare può farlo, come concedere a un agente Gestisci.Chiedi al proprietario del progetto di attivare Può approvare, o scegliere Solo lettura o Proporre.
playlist_not_approvedLa playlist non ha ancora una versione approvata, quindi nessuno schermo può mostrarla.Attendere la sua revisione (screenrig reviews show ID), oppure scegliere una playlist approvata.
review_not_pendingLa revisione è già stata decisa, ritirata o sostituita.screenrig reviews show ID per il suo stato.
login_denied, login_expiredLa persona ha negato l’accesso, o il suo codice 24 ore è scaduto.Esegui di nuovo screenrig login.
client_auth_failedLa chiave, il segreto o l’id di un client di servizio è stato rifiutato.Confronta il file di chiave o di segreto con cui accede la configurazione (login --client-id ID --client-key-file FILE o --client-secret-file FILE) con screenrig service-client show ID.
capability_requiredIl progetto non ha la capacità necessaria per questo comando, come screens o advertiser.screenrig project capabilities, poi scegli il --intent corrispondente per un nuovo progetto o cambia lo scopo del progetto.
rate_limitedTroppe richieste nella finestra corrente.Attendere retry_after_seconds, quindi riprovare.
free_organization_limitLa persona possiede già la sua organizzazione Standard gratuita, quindi project create non può avviarne un’altra.Aggiungi il progetto all’organizzazione indicata nei dettagli: screenrig project create NAME --organization-id ID. Un’altra organizzazione richiede Plus, Premium o Enterprise tramite il modulo di contatto su https://screenrig.ai/contact#message.
organization_plan_requiredL’organizzazione non ammette nuovi schermi finché un piano non lo paga.Il proprietario sposta il progetto con screenrig project moves e screenrig project move --organization-id ID, oppure l’organizzazione attiva Plus, Premium o Enterprise tramite il modulo di contatto su https://screenrig.ai/contact#message.

Revisioni e ritentativi

I guardiani di revisione sono opzionali. Ometti --expect-rev per scrivere la risorsa corrente senza una lettura di revisione precedente. Forniscilo con un revision noto per rifiutare scritture obsolete. Su revision_conflict, recupera nuovamente la risorsa, riapplica la modifica e ritenta con la revisione restituita. Su un errore di trasporto ambiguo, ritenta con lo stesso --idempotency-key; il piano di controllo restituisce il risultato originale invece di scrivere due volte.

Crediti

Il control plane conteggia un credito per ogni comando autenticato fatturato e uno per ogni evento project-stream fatturato. Questi comandi control-plane non lo scalano e continuano a funzionare a zero: project show, agent status, notes list, notes show, screen reload, screen toast e screen screenshot. Aprire events follow costa un credito come subscribe, e il replay dopo riconnessione è gratuito. Un comando fleet, screen assign, screen reload, screen toast o screen tag con più ID schermo o --tag, è un’azione fatturata senza limite di schermi, incluse tutte le continuazioni, quindi un reload o toast fleet è fatturato anche se uno singolo è gratuito. screen screenshot --tag segue tutte le pagine lista, ciascuna fatturata, per risolvere gli schermi taggati; le catture stesse sono gratuite. Le email di notifica e gli avvisi di schermo sono gratuiti. Ogni tentativo di consegna webhook di un evento del progetto è conteggiato come un evento listen-stream fatturato. Ogni pagina JSON di playback plays o playback list è una richiesta fatturata, e un export CSV playback è una richiesta fatturata per l’intervallo completo.

Interfaccia CLI inclusa

I comandi sono raggruppati come nel CLI. Installazione e primo uso sono coperti in Start; la scelta tra caricamento, generazione, card e selettori è coperta in Compose.

Nomi comandi e scoperta

Usa show per ispezionare una risorsa, list per collezioni, e kv get / kv set per valori. Usa --name per nomi visualizzati, --screen-id, --app-id, --playlist-id e --release-id per selettori risorsa, --expect-rev per revision guard, e --after per cursori evento. Il gruppo è app; “application” è il nome risorsa. I commenti mantengono comment ACTION screen|playlist ID.

Usa screenrig help --all per l’inventario completo o screenrig playlist init --help per aiuto mirato. Aggiungi --json per metadati argomento, scelte, predefiniti, esempi, alias e relazioni opzioni. I gruppi exactlyOne, atLeastOne e together sono controllati prima di configurazione o accesso rete; requires indica che la prima opzione richiede tutte le restanti. Leggi stdin solo dove l’aiuto comando supporta esplicitamente -.

Crea un nuovo progetto

screenrig agent enroll --email ADDRESS --organization "Screens"

agent enroll crea un’identità, un’organizzazione, un progetto Screens e un’appartenenza, e memorizza credenziali di identità e progetto in modo privato. Riutilizza il nome dell’organizzazione già fornito, o usa Screens senza prompt di scelta. --organization è obbligatorio; --name nomina separatamente l’agente. Usa l’email di contatto reale della persona. L’iscrizione invia un invito a membro del progetto; non rivela se quell’indirizzo ha già un accesso. La persona apre l’invito e crea un accesso con passkey, o accede per aggiungere il progetto al proprio accesso esistente. L’accettazione sposta il progetto nell’organizzazione che detiene il dominio email verificato della persona, altrimenti nell’organizzazione Standard gratuita che già possiede, rinominata in caso di conflitto di nomi.

Aggiungi --intent advertising per un progetto che acquista annunci invece di associare schermi. --force sostituisce lo stato di iscrizione o connessione in sospeso di questa installazione quando si crea intenzionalmente un altro progetto.

agent enroll --email ADDRESS --organization NAME [--name NAME]
    [--intent signage|advertising] [--force]

Accedi con AgentID

Un agente con un AgentID accede a https://api.screenrig.ai/agentid/start, riceve un codice di richiesta, installa il plugin ufficiale ed esegue screenrig agent enroll --agentid-claim CODE --organization NAME. L’email verificata del proprietario riceve l’invito al dashboard.

Accedi a un account esistente

screenrig login

login registra questa installazione in un account già esistente. Stampa un indirizzo dashboard e un codice, poi attende fino a 24 ore. Una persona apre l’indirizzo, che contiene il codice, verifica che corrisponda, modifica il progetto, Read only, Proponi o Gestisci, o le aree di capacità se desidera, e preme Connetti una volta; un accesso dashboard dell’ultima ora è la prova, quindi non c’è un secondo prompt passkey. La CLI memorizza la sessione, seleziona il progetto approvato e restituisce status: signed_in con progetto, organizzazione e access.

login [--project ID] [--access read|propose|manage] [--name NAME] [--no-wait] [--resume ID]
logout

--access chiede un livello; il predefinito è manage, e la persona decide. --project suggerisce il progetto. --no-wait restituisce status: pending con il verification_uri_complete, il user_code e una maniglia login_ che non contiene segreti; login --resume ID attende l’approvazione successiva. Esegui di nuovo login su un’installazione con accesso per aggiungere un altro progetto o per elevare un progetto Read only o Propose a Manage.

Ogni sessione include aree di capacità: screens, content, playlists, advertising, reports e project. Una sessione richiama solo i comandi nelle sue aree; reports legge anche qualsiasi area. Un comando fuori da queste restituisce 403 forbidden con dettaglio This agent credential lacks the <name> capability.. Le sessioni di sola lettura elencano e leggono. Le sessioni di proposta caricano anche contenuti multimediali, scrivono note e propongono modifiche a contenuti, playlist e schermi, che attendono la revisione di una persona. Una modifica oltre il livello della sessione restituisce 403 insufficient_access.

logout revoca l’accesso sul server e rimuove i token memorizzati. Un errore che potrebbe non aver raggiunto il server li mantiene, quindi rieseguire logout è sicuro. doctor mostra quando la sessione termina: 90 giorni dopo l’ultimo uso e al massimo un anno dopo l’accesso. Vedi Autenticazione.

Ciclo di vita progetto e organizzazione

Il progetto corrente è l’ultimo usato. Ogni busta JSON include contesto organizzazione e progetto; l’output umano nomina entrambi. Le credenziali identità sono limitate dall’appartenenza al progetto selezionato. Lo stato retry resta separato per progetto.

project list
project use ID
project create NAME [--organization-id ID | --organization NAME]
project moves
project move --organization-id ID
project transfer-owner --user-id ID
project deletion-preview
project delete --name NAME --revision N --yes
organization list
organization rename ID NAME
agent revoke-identity --yes

project list verifica le iscrizioni accessibili. project use ne seleziona una. La creazione richiede un nome unico nella propria organizzazione e predefinisce l’organizzazione del progetto corrente, poi quella che amministri; quando nessuna è nominata, l’organizzazione che detiene il dominio email verificato del proprietario viene prima. La persona responsabile diventa proprietaria. Ogni piano limita quanti progetti può contenere un’organizzazione; ogni persona ha una organizzazione Standard gratuita, e una seconda richiede Plus, Premium o Enterprise. Senza progetto corrente e senza organizzazione nominata, il server assegna il progetto allo stesso modo. --organization NAME avvia una nuova organizzazione solo per una persona che non ne possiede una gratuita; altrimenti la creazione è rifiutata con free_organization_limit, il cui dettaglio nomina l’organizzazione da usare. L’iscrizione è regolata da limiti di frequenza.

Il proprietario può spostare in una destinazione restituita da project moves, o trasferire la proprietà a un membro verificato esistente. Uno spostamento trasporta schermi, e un’organizzazione di destinazione che ha già tanti progetti quanti ne consente il suo piano lo rifiuta con project_limit_reached. L’eliminazione usa il nome esatto corrente e la revisione positiva dalla sua anteprima. Richiede zero schermi non archiviati, nessun piano proprio, nessun obbligo di portafoglio e nessuna pubblicità attiva. Invia email ai membri e mantiene una lapide.

I nomi delle organizzazioni possono ripetersi; usa ID espliciti quando rinomini un’organizzazione che amministri. Un’organizzazione ha amministratori designati e membri che vi appartengono; gli amministratori invitano altri amministratori e membri via email dal dashboard. organization list indica le organizzazioni free e plan_required e riporta new_organization_allowed. La sua lista di progetti non concede accesso ai contenuti dei progetti. L’organizzazione paga: i suoi soldi e le assegnazioni sono condivisi dai suoi progetti; l’utilizzo resta attribuito ai progetti e gli addebiti storici mantengono il pagatore originale.

login --project ID chiede quel progetto con la stessa identità. Solo l’approvazione esplicita di questa richiesta concede l’appartenenza. agent disconnect --yes revoca un’appartenenza; agent revoke-identity --yes revoca separatamente l’identità e tutte le appartenenze. Una risposta ambigua mantiene le credenziali locali e lo stato di ritentativo per la riconciliazione.

I report pubblicitari mantengono i dati di liquidazione oltre la conservazione degli eventi. Leggi i metadati di copertura: riproduzioni storiche mancanti o durata approvata sconosciuta sono sconosciute, mai zero. Un report può avere totali finanziari completi e cronologia degli esiti incompleta.

Progetti, inviti e diagnostica

I comandi del progetto elencano le appartenenze, selezionano un progetto, creano progetti e gestiscono nomi, proprietari, spostamenti ed eliminazioni. Gli inviti aggiungono persone a progetti o reti pubblicitarie.

project show#

Leggi il record del progetto e il credito residuo.

project show

Nessun parametro.

screenrig project show

data.credit_remaining è un conteggio intero di crediti. Sotto 1000 la busta può mostrare un avviso credits_low. Fino al 1° gennaio 2027 l’uso è gratuito entro limiti ragionevoli, quindi il credito residuo è un contatore intero che un agente può leggere, non un’istruzione di spegnimento.

project rename#

Imposta il nome che le persone vedono nel selettore progetto della dashboard.

project rename NAME

project capabilities#

Leggi il piano del progetto, i flag delle funzionalità indipendenti screens e advertiser e il set di capacità effettive. Un diniego di percorso prevale su una lettura di capacità obsoleta.

project capabilities

project uptime#

Leggi la disponibilità giornaliera degli schermi del progetto su giorni UTC.

project uptime [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
ParametroTipoObbligatorioPredefinitoNote
--day-from YYYY-MM-DDstringno29 giorni prima di --day-toPrimo giorno UTC, incluso.
--day-to YYYY-MM-DDstringnooggiUltimo giorno UTC, incluso. Al massimo 366 giorni dopo --day-from.
screenrig project uptime
screenrig project uptime --day-from 2026-09-01 --day-to 2026-09-30

Intervallo e predefiniti sono quelli di screen uptime. data.items elenca una riga per ogni giorno UTC, dal più vecchio al più recente: online_s e offline_s sommati sugli schermi con stato registrato quel giorno, availability, coverage (la quota del giorno di quegli schermi con stato registrato) e screens (quanti avevano uno stato registrato). La riga di oggi copre gli intervalli terminati finora; screen list mostra chi è online ora.

project health-trend#

Leggi la salute della flotta per ora UTC: schermi che segnalano, caldi, display disconnessi, crash.

project health-trend [--from TIME] [--to TIME]
ParametroTipoObbligatorioPredefinitoNote
--from TIMEstringno24 ore prima di --toInizio inclusivo dell’ora: un istante RFC 3339 con secondi e offset (normalizzato a UTC), now, o un’età come 7d, 12h o 30m.
--to TIMEstringnooraFine esclusiva, nelle stesse forme. Al massimo 93 giorni dopo --from.
screenrig project health-trend
screenrig project health-trend --from 7d

data.items elenca la salute della flotta per ora UTC: hour, screens_reporting, hot (temperatura massima pari o superiore a 80 °C), display_disconnected e crashing (3 o più crash in 24 ore). La CLI segue next_cursor fino alla fine e risponde ogni ora con next_cursor null. Le ore seguono i report con un ritardo fino a circa 5 minuti.

invitations#

Crea, elenca o revoca inviti per membri del progetto e acquirenti di annunci.

invitations create --email ADDRESS[,ADDRESS] [--kind member|ad-buyer]
invitations create --link
    [--screen-id ID] [--slot-id ID] [--policy trusted|review_required]
invitations list [--kind member|ad-buyer] [--status STATUS]
invitations revoke ID

--kind predefinito a member. La consegna email è predefinita e scade dopo sette giorni. --email accetta destinatari separati da virgola, fino a cinquanta per richiesta. --link è solo per membri, richiede esattamente un destinatario previsto, e restituisce un URL di invito valido 24 ore una volta per consegna diretta. Non mettere mai quell’URL in log, note o trascrizioni condivise. Le liste non lo restituiscono mai.

Gli acquirenti di annunci usano solo email e necessitano di uno schermo o ambito slot posseduto (o entrambi). --screen-id e --slot-id accettano ID separati da virgola; --policy seleziona trusted o review_required. I filtri di stato sono queued, sent, issued, accepted, revoked, expired e failed.

screenrig invitations create --email teammate@example.com
screenrig invitations create --kind ad-buyer --email buyer@example.com --screen-id scr_LOBBY --policy review_required

Gli agenti non accettano inviti. La persona invitata apre l’email, accede o crea una passkey, e accetta nel dashboard. La registrazione tramite link verifica prima la loro email. Revocare un invito accettato non annulla un’appartenenza; usa i controlli di appartenenza acquirente per revocare l’accesso pubblicitario.

agent status#

Segnala se questa installazione possiede una credenziale utilizzabile.

agent status

Nessun parametro.

screenrig agent status

Sola lettura. Non modifica mai lo stato locale o server e non costa nulla. Il risultato include il access della sessione, il suo effective_access e, quando l’impostazione di revisione del progetto o un membro senza approvazione lo mantengono basso, access_limited_by (project o person).

login#

Accedi a questa installazione in un account esistente, con l’approvazione di una persona nel dashboard.

login [--project ID] [--access read|propose|manage] [--name NAME] [--no-wait] [--resume ID]
ParametroTipoObbligatorioPredefinitoNote
--project IDstringnonessunoSuggerisci il progetto che la persona approva.
--access LEVELstringnogestireread, propose o manage. La persona prende la decisione finale.
--name NAMEstringnonessunoDai un nome a questa installazione, massimo 80 caratteri.
--no-waitbooleannospentoRestituisci status: pending con l’indirizzo, il codice e una maniglia login_.
--resume IDstringnonessunoAttendere l’accesso in sospeso avviato da --no-wait.
screenrig login --access read

Stampa l’indirizzo del dashboard e un codice di otto lettere su stderr, poi attende fino a 24 ore. La persona verifica che il codice corrisponda e preme Connetti una volta, senza un secondo prompt passkey dopo un accesso al dashboard nell’ultima ora. La busta riporta status: signed_in, il progetto, l’organizzazione e access. Eseguirlo di nuovo su un’installazione con accesso aggiunge un progetto o eleva da Solo lettura o Proponi progetto a Gestisci. Il rifiuto è login_denied e la scadenza è login_expired.

logout#

Termina l’accesso di questa installazione e rimuovi i suoi token.

logout

Nessun parametro.

screenrig logout

Revoca l’accesso sul server, quindi rimuove i token memorizzati e segnala status: signed_out. Un errore che potrebbe non aver raggiunto il server li mantiene, quindi rieseguire è sicuro. Esegui screenrig login per accedere di nuovo.

dashboard#

Apri l’URL ordinario del dashboard. Questo comando non crea un link di accesso, non crea una sessione e non richiede credenziali agente.

dashboard [open]
screenrig dashboard

Il dashboard mostra i progetti della persona dopo l’accesso. La selezione progetto nel browser non cambia il progetto associato a un agente.

dashboard reset-sign-in#

Richiedi un’email di reset accesso senza credenziali agente.

dashboard reset-sign-in --email ADDRESS

La conferma non rivela se l’email ha un accesso. Il reset inviato scade dopo un’ora; la persona crea una nuova passkey. Il completamento sostituisce le credenziali di accesso e revoca altre sessioni.

doctor#

Controlla questa installazione e segnala ogni controllo per nome.

doctor [--repair-config]
Parametro Tipo Obbligatorio Predefinito Note
--repair-config boolean no spento Restringi i permessi su un file di configurazione esistente leggibile da gruppo o altri.
screenrig doctor

data.checks nomina ogni controllo e il suo stato: runtime Node, percorso di configurazione risolto e permessi, origine del control-plane e sue rotte di servizio, capacità feedback pubblicizzata, e la toolchain multimediale opzionale (ffmpeg, ffprobe, encoder_libx264, encoder_libx265, encoder_libwebp, cwebp, filter_hdr_tonemap).

Qualsiasi controllo fallito fa uscire doctor con codice non zero, quindi leggi i nomi individuali prima di chiamare l’installazione unhealthy. Una toolchain media mancante interessa solo media upload.

version#

Stampa la versione CLI inclusa e il suo adattatore di protocollo.

version

Nessun parametro.

screenrig version

Esegui prima questo in una sessione. Una busta riuscita dimostra che il launcher ha risolto la CLI inclusa. --version e -V fanno lo stesso da qualsiasi punto della riga di comando.

Client di servizio

Un client di servizio è un server, uno script o un processo CI di proprietà del progetto, che accede con la propria chiave o il proprio segreto invece dell’approvazione di una persona. Per creare o modificare un client, l’agente deve avere accesso Gestisci per la propria identità con l’ambito identity, una propria autorizzazione Gestisci con la capacità project sul progetto di destinazione e una persona responsabile verificata che amministri l’organizzazione di quel progetto. Un client di servizio non gestisce mai altri client. Per eseguire comandi come client, imposta SCREENRIG_CLIENT_ID con SCREENRIG_CLIENT_KEY_FILE o SCREENRIG_CLIENT_SECRET. Vedi Client di servizio.

service-client list#

Elenca i client di servizio di questo progetto, attivi e revocati, con le loro chiavi, ID segreti e utilizzo

service-client list

Nessun parametro.

screenrig service-client list

Non restituisce mai un segreto.

service-client show#

Mostra un cliente del servizio.

service-client show ID
ParametroTipoObbligatorioPredefinitoNote
IDstringsìnessunoL’id client, scl_….
screenrig service-client show scl_ID

Elenca l’kid di ogni chiave e l’css_ di ogni segreto per la rotazione

service-client create#

Crea un client di servizio di proprietà di questo progetto.

service-client create --name NAME [--capability NAME]... [--access read|propose|manage] [--key-file PATH] [--secret-file PATH]
ParametroTipoObbligatorioPredefinitoNote
--name NAMEstringsìnessunoAl massimo 80 caratteri.
--capability NAMEstringnotutti e seiRipetibile: screens, content, playlists, advertising, reports, project, ciascuno entro i tuoi.
--access LEVELstringnoleggiread, propose o manage. propose invia playlist e modifiche dello schermo alla revisione di una persona.
--key-file PATHpathuno di questinessunoUn JWK o PEM: Ed25519, EC P-256 o RSA di almeno 2048 bit. Viene inviato solo il mezzo pubblico.
--secret-file PATHpathuno di questinessunoGenera un segreto e scrivilo in questo nuovo file 0600. Viene mostrato una sola volta.
screenrig service-client create --name "Nightly report" --access read --capability reports --key-file screenrig-client.pem

Richiede le autorizzazioni di identità, progetto e amministrazione dell’organizzazione descritte sopra. Al massimo 50 client attivi per organizzazione, conteggiati in tutti i suoi progetti. Una chiave senza il proprio kid è identificata dalla sua impronta RFC 7638.

service-client add-key#

Registra una seconda chiave pubblica per una rotazione senza interruzioni.

service-client add-key ID --key-file PATH
ParametroTipoObbligatorioPredefinitoNote
IDstringsìnessunoL’id client.
--key-file PATHpathsìnessunoLa nuova chiave pubblica, un JWK o PEM.
screenrig service-client add-key scl_ID --key-file new.pem

Un client possiede al massimo due chiavi.

service-client add-secret#

Genera un secondo segreto per una rotazione senza interruzioni.

service-client add-secret ID --secret-file PATH
ParametroTipoObbligatorioPredefinitoNote
IDstringsìnessunoL’id client.
--secret-file PATHpathsìnessunoUn nuovo file 0600 che riceve il segreto.
screenrig service-client add-secret scl_ID --secret-file new-secret

Un client possiede al massimo due segreti. Quello attuale continua a funzionare finché non lo rimuovi.

service-client remove-key#

Rimuovi una chiave; i token emessi con essa smettono di funzionare in pochi secondi.

service-client remove-key ID --kid KID
ParametroTipoObbligatorioPredefinitoNote
IDstringsìnessunoL’id client.
--kid KIDstringsìnessunoL’id della chiave da service-client show.
screenrig service-client remove-key scl_ID --kid KID

Un client mantiene almeno una chiave o un segreto.

service-client remove-secret#

Rimuovi un segreto; i token emessi con esso smettono di funzionare in pochi secondi.

service-client remove-secret ID --secret-id css_ID
ParametroTipoObbligatorioPredefinitoNote
IDstringsìnessunoL’id client.
--secret-id IDstringsìnessunoL’ID segreto css_ da service-client show.
screenrig service-client remove-secret scl_ID --secret-id css_ID

service-client revoke#

Revoca permanentemente un client di servizio.

service-client revoke ID --yes
ParametroTipoObbligatorioPredefinitoNote
IDstringsìnessunoL’id client.
--yesbooleansìspentoConferma la revoca permanente.
screenrig service-client revoke scl_ID --yes

Elimina le sue chiavi e segreti; i suoi token smettono di funzionare entro pochi secondi. Il record resta per audit.

Contenuti multimediali

Un oggetto media è un fermo immagine, un clip o una traccia audio MP3, memorizzato come esattamente una resa. Non esiste fallback per dispositivo, quindi qualunque cosa media upload o media generate memorizzi è ciò che ogni schermo deve decodificare.

Le cartelle media organizzano la libreria. Un ID cartella inizia con mfd_ e un ID file con med_. Un caricamento arriva alla radice della libreria a meno che --folder non nomini una cartella, media move e media folder update riorganizzino l’albero, e un selettore playlist by:folder riproduca i file direttamente dentro una cartella, non quelli delle sue sottocartelle. Un’organizzazione contiene al massimo 1000 cartelle in tutti i suoi progetti, annidate fino a 10 livelli, con nomi da 1 a 100 caratteri.

Un media mantiene il suo ID quando il file cambia: media replace sostituisce il file sul posto, così ogni playlist e pianificazione che lo usa riproduce il nuovo, e media versions elenca tutti i file che l’elemento ha avuto.

media generate#

Genera un’immagine statica presentabile a pagina intera nello store dei contenuti multimediali del progetto.

media generate --prompt TEXT [--aspect-ratio RATIO] [--quality low|medium|high] [--tag TAG]
               [--no-progress]
ParametroTipoObbligatorioPredefinitoNote
--prompt TEXTstringsìnessunoDa 1 a 4000 caratteri. Inserisci ogni dato e tutto il testo nel prompt affinché il modello di immagini lo impagini.
--aspect-ratio RATIOstringno16:91:1, 16:9, 9:16, 4:3, 3:4, 3:2 o 2:3.
--qualitystringnomediumlow, medium, o high. Cambia il livello di dettaglio dell’immagine statica.
--tag TAGstringnonessunoStesso tag da 1 a 32 lettere o cifre dell’upload.
--no-progressbooleannospentoSopprimi la riga di avvio stderr.
screenrig media generate --prompt "A 16:9 restaurant menu poster for North Lobby Cafe. Dark walnut, gold type. Title NORTH LOBBY CAFE. Items: Espresso $4, Cortado $4.50, House Blend $3. Footer Open 7am to 7pm. Typeset every line of copy in the image." --aspect-ratio 16:9 --quality high --tag LobbyMenu

Il comando memorizza un WebP lossy nello store multimediale del progetto e restituisce data.media_id (med_…). Non ricaricare i byte. Mai stampare pixel o prompt. L’albero di authoring e il contratto prompt vivono su Compose.

media upload#

Converti un file locale in byte di consegna, caricalo e attendi che l’oggetto sia pronto.

media upload <file> [--content-type TYPE] [--tag TAG] [--folder ID] [--no-wait] [--poll-ms MS]
             [--timeout MS] [--no-transcode] [--codec h264|hevc] [--max-fps N]
             [--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
             [--preset signage-1080p30|signage-4k30] [--no-audio]
ParametroTipoObbligatorioPredefinitoNote
<file>pathsìnessunoIl frame statico sorgente, clip o traccia audio. Il nome file diventa il nome leggibile in elenchi, playlist e report di riproduzione, quindi nominarlo per ciò che mostra.
--content-type TYPEstringnorilevato dai byte caricatiDichiarare il tipo di media personalmente invece di lasciare che la CLI lo rilevi.
--tag TAGstringnonessunoDa uno a 32 lettere o cifre, corrispondenti a ^[A-Za-z0-9]{1,32}$. I trattini sono rifiutati. Un tag è ciò che rende media list --tag TAG una mappa affidabile da nome file a ID.
--folder IDstringnoradice della libreriaUna cartella media mfd_ esistente, controllata prima di iniziare qualsiasi lavoro. L’upload pronto si sposta in essa e data.folder_id lo segnala. Rifiutato con --no-wait (usage_error, uscita 2), perché l’ID media non esiste ancora: esegui media move una volta che l’oggetto è pronto.
--no-waitbooleannospentoRestituisci non appena il commit è accettato. L’oggetto non è ancora pronto; termina con operations wait.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
--timeout MSintegerno120000Scadenza per l’attesa. Limita anche ogni richiesta sottostante.
--no-transcodebooleannospentoCarica i byte sorgente senza modificarli. ffmpeg, ffprobe e cwebp non vengono eseguiti. WebP senza perdita è comunque rifiutato.
--codecstringnoh264h264 o hevc; avc e h265 sono accettati come alias. Usa hevc solo quando ogni schermo che riprodurrà il clip è un Player nativo.
--max-fps Nnumberno30Frequenza di fotogrammi di uscita costante. Ogni video è codificato esattamente a questa frequenza indipendentemente dalla frequenza sorgente, quindi i clip consecutivi non cambiano mai frequenza. Maggiore di 0 e al massimo 240.
--max-edge PIXELSintegerno3840Vincolo applicato a ogni bordo, da 16 a 3840. Il rapporto d’aspetto è preservato e una sorgente più piccola non viene mai ingrandita.
--webp-qualityintegerno90Qualità immagine statica per la codifica WebP, da 1 a 100.
--presetstringnonon impostatosignage-1080p30 o signage-4k30. Dimensione video orientata e costante a 30 fps. --max-edge e --max-fps possono restringere un preset ma non ingrandirlo. Solo video; non può combinarsi con --no-transcode.
--no-audiobooleannospentoOmetti la traccia audio dalla consegna video. Solo video; non può combinarsi con --no-transcode.
--no-progressbooleannospentoNon emettere output di avanzamento. L’avanzamento va sempre su stderr; stdout resta riservato all’unico risultato.
screenrig media upload ./lobby-welcome-loop.mp4 --tag LobbyLoop

Il video diventa un MP4: profilo High H.264 livello 4.2 per default, o H.265 con --codec hevc, in yuv420p taggato Rec. 709. Una sorgente HDR è mappata a tono Rec. 709. L’audio, se presente nella sorgente, è AAC a 192 kbit/s, 48 kHz, stereo.

Le immagini statiche diventano WebP lossy a qualità 90, mantenendo l’alpha se presente nella sorgente. Una sorgente animata cicla all’infinito. Un WebP che già rispetta il limite di dimensione viene passato senza ricodifica.

L’audio diventa un MP3 per la colonna sonora della playlist. Una sorgente MP3 si carica senza modifiche; sorgenti WAV, AAC, M4A, OGG e FLAC si convertono in MP3 a 128 kb/s, che richiede una build ffmpeg con libmp3lame. Una traccia dura da 1 secondo a 3 ore. playlist init trasforma gli input audio in tracce colonna sonora invece che pagine. L’oggetto pronto è un media audio con durata. Non può essere posizionato su una pagina; nominarlo come colonna sonora audio nella playlist.

L’ID dell’oggetto pronto è data.media_id. Lo stesso valore è data.id e data.operation.result.media_id. Questo ID è ciò che prende un selettore di playlist.

Un nome file con poche informazioni come video.mp4 aggiunge un avviso generic_filename all’involucro. Il caricamento ha comunque successo e la CLI non rinomina mai il file; scegli il nome prima di eseguire il comando.

La conversione esegue ffmpeg e ffprobe da PATH, o dai percorsi assoluti in SCREENRIG_FFMPEG e SCREENRIG_FFPROBE. Le immagini preferiscono il codificatore ffmpeg libwebp e ricadono su cwebp su PATH o SCREENRIG_CWEBP. Esegui doctor prima del primo caricamento di una sessione.

--preset signage-1080p30 limita il lato lungo a 1920, il lato corto a 1080 e la frequenza a 30 fps costanti. signage-4k30 limita il lato lungo a 3840, il lato corto a 2160 e la frequenza a 30 fps costanti. Entrambi funzionano con contenuti orizzontali, verticali e quadrati. --no-audio omette la codifica audio per clip silenziose. Queste opzioni si applicano solo al video.

screenrig media upload ./lobby.mov --preset signage-1080p30 --no-audio
screenrig media upload ./menu.png --folder mfd_01EXAMPLEFOLDER000000000

L’upload arriva alla radice della libreria e si sposta nella cartella una volta pronto. media upload-batch --folder sposta ogni elemento caricato allo stesso modo.

Con accesso Proponi, o quando il progetto richiede revisione per modifiche agent, un nuovo caricamento attende la revisione di una persona prima che un tag, una cartella o un selettore all lo riproduca; vedi Revisioni.

media upload-batch#

Carica molti file locali da un manifesto, riprendendo da un file di stato richiesto.

media upload-batch <manifest.json> [--state FILE] [--concurrency N] [--tag TAG] [--folder ID]
                   [--poll-ms MS] [--timeout MS] [--no-transcode] [--codec h264|hevc]
                   [--max-fps N] [--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
                   [--preset signage-1080p30|signage-4k30] [--no-audio]
ParametroTipoObbligatorioPredefinitoNote
<manifest.json>pathsìnessuno{ "items": [ { "path": "./a.png", "tag"?: "Lobby", "content_type"?: "image/png" } ] } con da 1 a 1000 elementi. I percorsi sono relativi al file manifest.
--state FILEpathnofile privato accanto alla configurazioneUn file JSON 0600 indicizzato dal SHA-256 dei byte locali di ogni file sorgente. Gli elementi già presenti con un media_id sono segnalati come resumed. Non condividere un file di stato tra progetti.
--concurrency Nintegernopredefinito CLICaricamenti paralleli.
--no-transcodebooleannospentoCarica i byte sorgente senza modificarli, come fa media upload.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
--timeout MSintegerno120000Scadenza per l’attesa. Limita anche ogni richiesta sottostante.
--codecstringnoh264h264 o hevc; avc e h265 sono accettati come alias. Usa hevc solo quando ogni schermo che riprodurrà il clip è un Player nativo.
--max-fps Nnumberno30Frequenza di fotogrammi di uscita costante. Ogni video è codificato esattamente a questa frequenza indipendentemente dalla frequenza sorgente, quindi i clip consecutivi non cambiano mai frequenza. Maggiore di 0 e al massimo 240.
--max-edge PIXELSintegerno3840Vincolo applicato a ogni bordo, da 16 a 3840. Il rapporto d’aspetto è preservato e una sorgente più piccola non viene mai ingrandita.
--webp-qualityintegerno90Qualità immagine statica per la codifica WebP, da 1 a 100.
--presetstringnonon impostatosignage-1080p30 o signage-4k30. Dimensione video orientata e costante a 30 fps. --max-edge e --max-fps possono restringere un preset ma non ingrandirlo. Solo video; non può combinarsi con --no-transcode.
--no-audiobooleannospentoOmetti la traccia audio dalla consegna video. Solo video; non può combinarsi con --no-transcode.
--tag TAGstringnonessunoApplicato quando un elemento omette il proprio tag.
--folder IDstringnoradice della libreriaUna cartella media mfd_ esistente. Ogni elemento caricato si sposta in essa dopo l’upload, e data.folder_id lo segnala.
--no-progressbooleannospentoNon emettere output di avanzamento.
screenrig media upload-batch ./images.json --state ./upload-state.json

La busta contiene data.items[] in ordine di manifest; ciascuno con path, source_filename, sha256, outcome (accepted o resumed), e media_id. data.failed[] contiene gli elementi non consegnati.

media replace#

Sostituisce sul posto il file di un media. Il suo ID, le sue playlist e le sue pianificazioni continuano a funzionare.

media replace <id> <file> [--expect-rev REVISION] [--note TEXT] [--content-type TYPE] [--no-wait]
              [--poll-ms MS] [--timeout MS] [--no-transcode] [--codec h264|hevc] [--max-fps N]
              [--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
              [--preset signage-1080p30|signage-4k30] [--no-audio]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
<file>pathsìnessunoLa nuova immagine, il nuovo clip o la nuova traccia audio. Deve essere dello stesso tipo del media: immagine per immagine, video per video, audio per audio. Verificato prima che inizi qualsiasi lavoro (usage_error, codice di uscita 2).
--expect-rev REVISIONstringnonessunoPrecondizione di revisione facoltativa. Un valore obsoleto fornito è revision_conflict e il caricamento dichiarato viene annullato: leggi media show ID ed esegui di nuovo il comando.
--note TEXTstringnonessunoConservata con la nuova versione e mostrata alla persona che la revisiona. Al massimo 280 caratteri.
--content-type TYPEstringnorilevato dai byte caricatiDichiarare il tipo di media personalmente invece di lasciare che la CLI lo rilevi.
--no-waitbooleannospentoRestituisci non appena la sostituzione è accettata. Il nuovo file non è ancora in uso; termina con operations wait.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
--timeout MSintegerno120000Scadenza per l’attesa. Limita anche ogni richiesta sottostante.
--no-transcodebooleannospentoCarica i byte sorgente senza modificarli. ffmpeg, ffprobe e cwebp non vengono eseguiti. WebP senza perdita è comunque rifiutato.
--codecstringnoh264h264 o hevc; avc e h265 sono accettati come alias. Usa hevc solo quando ogni schermo che riprodurrà il clip è un Player nativo.
--max-fps Nnumberno30Frequenza di fotogrammi di uscita costante. Ogni video è codificato esattamente a questa frequenza indipendentemente dalla frequenza sorgente, quindi i clip consecutivi non cambiano mai frequenza. Maggiore di 0 e al massimo 240.
--max-edge PIXELSintegerno3840Vincolo applicato a ogni bordo, da 16 a 3840. Il rapporto d’aspetto è preservato e una sorgente più piccola non viene mai ingrandita.
--webp-qualityintegerno90Qualità immagine statica per la codifica WebP, da 1 a 100.
--presetstringnonon impostatosignage-1080p30 o signage-4k30. Dimensione video orientata e costante a 30 fps. --max-edge e --max-fps possono restringere un preset ma non ingrandirlo. Solo video; non può combinarsi con --no-transcode.
--no-audiobooleannospentoOmetti la traccia audio dalla consegna video. Solo video; non può combinarsi con --no-transcode.
--no-progressbooleannospentoNon emettere output di avanzamento. L’avanzamento va sempre su stderr; stdout resta riservato all’unico risultato.
screenrig media replace med_01EXAMPLEIMAGE0000000000 ./menu-v2.png
screenrig media replace med_01EXAMPLEVIDEO0000000000 ./intro.mp4 --expect-rev 3 --note "Spring cut"

Il media mantiene il suo ID, i suoi tag e la sua cartella, così ogni playlist e pianificazione che lo nomina riproduce il nuovo file al manifesto successivo, e anche i selettori per tag, cartella e all lo recepiscono. Nulla viene ripianificato. Il comando esegue gli stessi passaggi di media upload (conversione, limite di byte video del piano, limiti di dimensione, quota di archiviazione, trasferimento firmato) e poi sostituisce invece di aggiungere un nuovo media. Non accetta --tag né --folder.

Per impostazione predefinita il comando attende l’elaborazione. data.media_id e data.id sono l’ID del media, data.version è il numero del nuovo file in media versions e data.revision è la nuova revisione del media. data.warnings, data.operation, data.upload, data.transcode e i tempi sono riportati come per media upload, e l’ID dell’operazione è nella risposta. Con --no-wait, data.operation è l’operazione accettata, e data.version e data.warnings sono assenti.

Un cambio di proporzioni è consentito. La risposta contiene un avviso aspect_ratio_changed e data.warnings[].playlists indica le playlist che usano il media, quindi controlla come appaiono. Un file con gli stessi byte di quello attuale viene rifiutato con resource_conflict (codice di uscita 13).

Ogni file precedente rimane nella cronologia del media e conta nei byte archiviati finché la sua versione non viene eliminata; vedi media versions.

Con accesso Propose, o quando il progetto richiede revisione per le modifiche dell’agente, la sostituzione attende una persona e il comando riesce (codice di uscita 0): data.status è pending_review, data.review_id indica la revisione, l’avviso pending_review fornisce il suo URL e data.next è screenrig reviews show ID. Il media continua a riprodurre il file attuale finché una persona non approva; dille quindi che è in attesa e non ripetere la scrittura. Una sostituzione più recente dello stesso media sostituisce quella in attesa. Vedi Revisioni.

media versions#

Elenca i file che un media ha avuto, con il file in uso per primo.

media versions <id> [--limit N] [--cursor CURSOR]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
--limit Nintegernoogni paginaLeggi una pagina di questo numero di versioni, da 1 a 100.
--cursor CURSORstringnonessunoLeggi la pagina successiva al data.next_cursor della pagina precedente.
screenrig media versions med_01EXAMPLEIMAGE0000000000

data.items ha una voce per ogni file che il media ha avuto: number, current, filename, content_type, sha256, bytes, width, height, duration_ms, codecs, source (upload, replace, sync o restore), note, by (tipo person, agent, client o sync, con ID e nome) e restored_from. Il file in uso viene per primo (current: true), poi gli altri dal più recente. La versione 1 è il primo caricamento; ogni sostituzione, ripristino o modifica della sincronizzazione dei media aggiunge il numero successivo.

Senza --limit e --cursor vengono lette tutte le pagine e data.next_cursor è null. Con uno dei due viene letta una pagina: finché data.next_cursor è una stringa, esegui di nuovo il comando con --cursor impostato su di essa. Basta l’accesso di sola lettura. I byte di una versione precedente restano archiviati e contano nei byte archiviati del progetto finché media version delete non li elimina; non c’è limite al numero di versioni conservate, e i byte archiviati oltre l’archiviazione gratuita del piano sono fatturati come qualsiasi altra archiviazione.

media restore#

Rimette in uso una versione precedente come nuova versione.

media restore <id> --number N [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
--number NintegersìnessunoIl numero della versione da rimettere in uso, come lo elenca media versions.
--expect-rev REVISIONstringnonessunoPrecondizione di revisione facoltativa. Un valore obsoleto fornito è revision_conflict: leggi media show ID ed esegui di nuovo il comando.
--note TEXTstringnonessunoConservata con la nuova versione e mostrata alla persona che la revisiona. Al massimo 280 caratteri.
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2 --expect-rev 5 --note "Back to the winter menu"

Il media mantiene il suo ID e passa a una nuova revisione, e ogni playlist e pianificazione che lo nomina riproduce di nuovo quel file. La versione che copia resta nella cronologia e condivide i suoi byte; la nuova versione conta nei byte archiviati come qualsiasi altra. data.media è il media e data.warnings contiene aspect_ratio_changed, che indica le playlist che usano il media, quando il file ripristinato ha proporzioni diverse.

La versione in uso non può essere ripristinata (resource_conflict, codice di uscita 5) e una versione sconosciuta è not_found (codice di uscita 4). Con accesso Propose, o quando il progetto richiede revisione per le modifiche dell’agente, il ripristino attende una persona e il comando riesce (codice di uscita 0): data.status è pending_review con data.review, l’avviso pending_review fornisce il suo URL e data.next è screenrig reviews show ID. Il media continua a riprodurre il file attuale finché una persona non approva, quindi non ripetere la scrittura.

media version delete#

Elimina una versione precedente e i suoi byte archiviati.

media version delete <id> --number N
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
--number NintegersìnessunoIl numero della versione da eliminare, come lo elenca media versions.
screenrig media version delete med_01EXAMPLEIMAGE0000000000 --number 2

Il record della versione scompare e i suoi byte lasciano subito i byte archiviati del progetto. L’oggetto archiviato viene rimosso dopo 24 ore, a meno che un’altra versione o il file in uso contenga lo stesso file. Una versione eliminata non può essere ripristinata. La versione in uso non può essere eliminata e nessuna versione può essere eliminata mentre una sostituzione del media è in attesa di revisione; entrambi i casi sono resource_conflict (codice di uscita 5), e media versions ID mostra quale versione è in uso. Una versione sconosciuta è not_found (codice di uscita 4). L’eliminazione richiede l’accesso Manage: una credenziale Propose viene rifiutata con insufficient_access, e l’eliminazione non viene mai proposta per revisione.

media show#

Leggi un oggetto contenuti multimediali, inclusa la sua revisione corrente.

media show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
screenrig media show med_01EXAMPLEIMAGE0000000000

media download#

Scrivi una resa memorizzata su disco per ispezione. Mai stampare i byte.

media download <id> [--output FILE]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
--output FILEpathno./<id>.<ext> nella directory correnteUn percorso file, non una cartella. Un file esistente viene sovrascritto. L’estensione segue il tipo di contenuto.
screenrig media download med_01EXAMPLEIMAGE0000000000 --output ./lobby.webp

La busta riporta media_id, path, bytes, sha256, content_type, primitive, filename, opzionale source_filename e width / height. Non contiene mai pixel. Usala per verificare un fermo immagine generato prima che venga mostrato sullo schermo.

media list#

Elenca gli oggetti multimediali, filtrabili per tag e tipo primitivo

media list [--tag TAG] [--primitive image|video|audio] [--folder ID|root] [--library]
ParametroTipoObbligatorioPredefinitoNote
--tag TAGstringnonessunoCorrispondenza ^[A-Za-z0-9]{1,32}$. Gli oggetti non etichettati sono omessi ogni volta che questo filtro è presente.
--primitivestringnotuttiimage, video o audio. Restringi l’elenco a still, clip o tracce audio.
--folder ID|rootstringnoogni cartellaSolo file direttamente dentro questa cartella mfd_, non le sue sottocartelle, o con root solo file alla radice della libreria. L’API applica il filtro.
--librarybooleannospentoElenca invece i contenuti multimediali della Libreria dell’organizzazione, in sola lettura: le righe riportano library: true. Usa i loro ID nelle pagine della playlist; modificali solo nel progetto Libreria.
screenrig media list --tag LobbyLoop --primitive video
screenrig media list --folder mfd_01EXAMPLEFOLDER000000000
screenrig media list --library

Ogni riga contiene folder_id, che non è presente alla radice della libreria.

media update#

Modifica o cancella il tag su un oggetto. La sua regola di disponibilità si imposta con media availability.

media update <id> (--tag TAG | --tags TAG1,TAG2 | --clear-tag) [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
--tag TAGstringuno dei duenessunoIl tag sostitutivo, da una a 32 lettere o cifre.
--clear-tagbooleanuno dei duespentoInvia null e lascia l’oggetto non etichettato.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig media update med_01EXAMPLEIMAGE0000000000 --tag LobbyLoop

Con accesso Proponi, o quando il progetto richiede revisione per modifiche agent, il rietichettamento di media approvati risponde a ok con avviso media_review_pending: gli schermi continuano a riprodurlo con i tag approvati finché una persona approva la modifica, e un rifiuto ripristina i tag. La revisione appare in reviews list entro pochi secondi; un rietichettamento che non modifica playlist approvate o in attesa di revisione si applica da solo. Vedi Revisioni.

media availability#

Imposta o cancella quando i selettori dinamici possono scegliere un file.

media availability <id> (--file FILE | --clear) [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
--file FILEstringuno dei duenessunoUna regola di disponibilità JSON.
--clearbooleanuno dei duespentoRimuove la regola; il file è sempre disponibile.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig media availability med_01EXAMPLEIMAGE0000000000 --file rule.json

I membri e il comportamento della regola sono descritti in Disponibilità dei media.

media delete#

Elimina un oggetto media.

media delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID oggetto med_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig media delete med_01EXAMPLEIMAGE0000000000

media move#

Sposta file e cartelle multimediali in una cartella, o torna alla radice della libreria.

media move <id>... (--folder ID | --root)
ParametroTipoObbligatorioPredefinitoNote
<id>...stringsìnessunoUno o più ID file med_ e ID cartella mfd_, al massimo 1000 in totale.
--folder IDstringuno dei duenessunoLa cartella di destinazione mfd_.
--rootbooleanuno dei duespentoSposta alla radice della libreria.
screenrig media move med_01EXAMPLEIMAGE0000000000 med_01EXAMPLEVIDEO0000000000 --folder mfd_01EXAMPLEFOLDER000000000
screenrig media move mfd_01EXAMPLEFOLDER000000000 --root

Lo spostamento è una richiesta tutto o niente. Una cartella non può spostarsi dentro se stessa o una cartella al suo interno, e le cartelle si annidano al massimo a 10 livelli. Gli elementi già nella destinazione restano come sono. data.media e data.folders contano ciò che è stato spostato.

Spostare file cambia cosa riproducono i selettori by:folder delle loro vecchie e nuove cartelle, dalla risoluzione del selettore successivo di ogni schermo; spostare una cartella non cambia i file propri di nessuna cartella. Sotto Propose access, o quando il progetto richiede revisione per modifiche agente, ogni file spostato attende la revisione di una persona (reviews list) e le playlist approvate continuano a riprodurlo tramite la cartella con cui è stato approvato; vedi Revisioni.

media folder list#

Elenca le cartelle multimediali del progetto

media folder list [--library]
ParametroTipoObbligatorioPredefinitoNote
--librarybooleannospentoElenca invece le cartelle della Libreria dell’organizzazione, in sola lettura: le righe riportano library: true, e un selettore by:folder può indicarne una per riprodurne i file.
screenrig media folder list
screenrig media folder list --library

Restituisce tutte le cartelle del progetto, al massimo 1000, ordinate per nome: data.items con id, name, parent_id (null alla radice della libreria) e revision. Costruisci l’albero da parent_id. La cartella di un file è folder_id su media list e media show; è assente alla radice della libreria.

media folder show#

Leggi una cartella contenuti multimediali.

media folder show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID cartella mfd_.
screenrig media folder show mfd_01EXAMPLEFOLDER000000000

La busta contiene il name, parent_id e revision della cartella.

media folder create#

Crea una cartella contenuti multimediali nella radice della libreria o all’interno di un’altra cartella.

media folder create --name NAME [--parent ID]
ParametroTipoObbligatorioPredefinitoNote
--name NAMEstringsìnessunoDa 1 a 100 caratteri, senza spazi. I nomi possono ripetersi.
--parent IDstringnoradice della libreriaLa cartella mfd_ in cui crearla.
screenrig media folder create --name Menus
screenrig media folder create --name Lunch --parent mfd_01EXAMPLEFOLDER000000000

Un’organizzazione contiene al massimo 1000 cartelle in tutti i suoi progetti, annidate fino a 10 livelli. Una playlist riproduce i file di una cartella con un selettore by:folder.

media folder update#

Rinomina una cartella media o spostala con tutto il contenuto in un’altra cartella.

media folder update <id> [--name NAME] [--parent ID | --root] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID cartella mfd_.
--name NAMEstringalmeno uno tra --name, --parent, --rootinvariatoIl nuovo nome, da 1 a 100 caratteri.
--parent IDstringalmeno uno tra --name, --parent, --rootinvariatoSposta la cartella, con tutto il suo contenuto, in questa cartella mfd_. Non con --root.
--rootbooleanalmeno uno tra --name, --parent, --rootspentoSposta la cartella nella radice della libreria. Non con --parent.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --name Archive
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --root

Una cartella non può spostarsi dentro se stessa o in una cartella al suo interno, e uno spostamento deve mantenere ogni cartella entro 10 livelli. Inviare i valori correnti è un’operazione nulla.

media folder delete#

Elimina una cartella media. I suoi file e cartelle vengono spostati di un livello verso l’alto.

media folder delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID cartella mfd_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig media folder delete mfd_01EXAMPLEFOLDER000000000

Elimina solo la cartella. I suoi file e cartelle vengono spostati nel genitore, o nella radice della libreria se non ne ha uno. Un selettore by:folder che la nomina poi non corrisponde a nulla, quindi ripuntare prima quelle playlist.

Sincronizzazione dei media

Una sincronizzazione dei media mantiene una cartella media allineata a una cartella SharePoint, OneDrive for work, Dropbox o Google Drive. Ogni esecuzione importa le immagini (png, jpeg, webp, gif), i video (mp4, webm) e l’audio (mp3) direttamente dentro la cartella di origine; le sottocartelle vengono ignorate. Un file modificato sostituisce i propri byte mantenendo lo stesso ID media, quindi si aggiorna ogni playlist che lo riproduce, e un file rimosso o spostato fuori all’origine esce dalla riproduzione: il suo media viene eliminato oppure, finché uno schermo lo mostra ancora, spostato in una sottocartella Removed ed eliminato quando nessuno lo usa più. Gli altri file sono elencati come saltati con il motivo: mostra in una playlist un file Office o un PDF con un link a un documento, ed esporta MOV e simili come MP4 H.264. Una playlist riproduce la cartella con un selettore by:folder.

Ogni sincronizzazione legge tramite un account del progetto. Un ID account inizia con msa_ e un ID sincronizzazione con msy_. media sync account add microsoft365 memorizza la tua app Microsoft Entra, oppure indica una connessione Microsoft del progetto; media sync account add dropbox stampa un link monouso per la persona titolare dell’account Dropbox; media sync account add google-drive legge le cartelle condivise con l’indirizzo di un account di servizio, quello di screenRIG o il tuo. Testa l’account, poi crea una sincronizzazione dall’indirizzo di una cartella: è da eseguire subito.

Fornisci un segreto client con --secret-file FILE e una chiave Google Drive con --key-file FILE, oppure - per stdin, mai come argomento. I segreti vengono sigillati sul server e restituiti solo come data.secret {set, hint}. La lettura richiede l’accesso Read, e ogni modifica richiede l’accesso Manage.

media sync account add microsoft365#

Aggiungi la tua app Microsoft Entra, oppure una connessione Microsoft del progetto, così una sincronizzazione può leggere una cartella SharePoint o OneDrive for work.

media sync account add microsoft365 --name NAME
    (--tenant-id TENANT --client-id ID --secret-file FILE | --connection-id ID)
ParametroTipoObbligatorioPredefinitoNote
--name NAMEstringsìnessunoDa 1 a 80 caratteri.
--tenant-id TENANTstringsenza --connection-idnessunoL’ID directory (tenant) della tua organizzazione, o il suo dominio principale come contoso.onmicrosoft.com; mai common, organizations o consumers. Insieme a --client-id e --secret-file.
--client-id IDstringsenza --connection-idnessunoL’ID applicazione (client) della registrazione dell’app, un GUID.
--secret-file FILEstringsenza --connection-idnessunoLeggi il valore del segreto client da questo file, oppure - per stdin (mai un argomento); il file contiene solo il valore.
--connection-id IDstringsenza --tenant-idnessunoAccedi tramite una connessione Microsoft (pcn_…) del progetto, in entrambe le modalità, al posto di --tenant-id, --client-id e --secret-file. Non insieme a essi.
screenrig media sync account add microsoft365 --name Contoso --tenant-id contoso.onmicrosoft.com --client-id 0b1d2f3a-4c5e-4f60-8a7b-9c0d1e2f3a4b --secret-file secret.txt
screenrig media sync account add microsoft365 --name Contoso --connection-id pcn_01EXAMPLECONNECTION0000

Nell’interfaccia di amministrazione di Microsoft Entra registra un’app a tenant singolo senza URI di reindirizzamento, aggiungi un segreto client (copia il suo valore, non l’ID del segreto), aggiungi l’autorizzazione dell’applicazione Microsoft Graph Sites.Selected (poi concedi all’app l’accesso in lettura a ogni sito) oppure Files.Read.All, e concedi il consenso dell’amministratore. L’app appartiene a questo progetto. Poi esegui media sync account test.

media sync account add dropbox#

Aggiungi un account Dropbox e stampa il link monouso che il suo titolare apre, dopo aver effettuato l’accesso a Dropbox, per collegarlo.

media sync account add dropbox --name NAME [--app-key KEY]
ParametroTipoObbligatorioPredefinitoNote
--name NAMEstringsìnessunoDa 1 a 80 caratteri.
--app-key KEYstringnol’app Dropbox di screenRIGL’app key della tua app Dropbox: da 1 a 64 lettere e cifre, mai il segreto dell’app.
screenrig media sync account add dropbox --name "Marketing Dropbox"
screenrig media sync account add dropbox --name "Marketing Dropbox" --app-key YOURAPPKEY

data.authorize_url è il link e data.authorize_expires_at la sua scadenza. La CLI non apre mai un browser: invia il link alla persona titolare dell’account Dropbox, che concede l’accesso in sola lettura (files.metadata.read, files.content.read, account_info.read). Esegui media sync account show finché data.state non è ready (parte come pending_consent), poi media sync create dropbox. La tua app Dropbox deve avere abilitati quei permessi e l’URI di reindirizzamento che l’output stampa.

media sync account add google-drive#

Aggiungi un account Google Drive, subito pronto, e stampa l’indirizzo dell’account di servizio con cui vengono condivise le cartelle.

media sync account add google-drive --name NAME [--key-file FILE]
ParametroTipoObbligatorioPredefinitoNote
--name NAMEstringsìnessunoDa 1 a 80 caratteri.
--key-file FILEstringnol’account di servizio di screenRIGLeggi da questo file la chiave JSON del tuo account di servizio Google Cloud, oppure - per stdin (mai un argomento).
screenrig media sync account add google-drive --name "Marketing Drive"
screenrig media sync account add google-drive --name "Marketing Drive" --key-file key.json

data.config.service_account_email è l’indirizzo con cui condividere ogni cartella; basta il ruolo Lettore. Tramite l’account di servizio di screenRIG una cartella si sincronizza solo quando un membro di questo progetto con un’email verificata l’ha condivisa o ne è il proprietario (altrimenti media_sync_sharer_not_member). Con la tua chiave si sincronizza qualsiasi cartella condivisa con l’account di servizio.

media sync account list#

Elenca gli account di sincronizzazione dei media di questo progetto con il loro tipo, stato e ultimo test; non viene restituito alcun segreto.

media sync account list

Nessun parametro.

screenrig media sync account list

media sync account show#

Ispeziona un account: il suo tenant e ID client, lo stato, il segreto mascherato e l’ultimo test.

media sync account show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’account (msa_…).
screenrig media sync account show msa_01EXAMPLEACCOUNT0000000

Un account Dropbox mostra anche chi lo ha collegato e il suo app_key; un account Google Drive mostra il suo service_account_email.

media sync account update#

Rinomina un account, modifica il tenant, l’ID applicazione o il segreto client di un’app Microsoft, oppure sostituisci la chiave propria di un account Google Drive.

media sync account update <id> [--name NAME] [--tenant-id TENANT] [--client-id ID]
    [--secret-file FILE | --key-file FILE] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’account (msa_…).
--name NAMEstringnoinvariatoRinomina l’account.
--tenant-id TENANTstringnoinvariatoL’ID directory o il dominio principale del tenant.
--client-id IDstringnoinvariatoL’ID applicazione (client) della registrazione dell’app.
--secret-file FILEstringnoinvariatoLeggi il valore del nuovo segreto client da questo file, oppure - per stdin; sostituisce il segreto memorizzato. Un segreto omesso viene conservato.
--key-file FILEstringnoinvariatoLeggi da questo file la chiave JSON propria di un account Google Drive, oppure - per stdin; deve appartenere allo stesso account di servizio. Non con --secret-file.
--expect-rev REVISIONintegernonessunoRifiuta la modifica se l’account non è a questa revisione (revision_conflict, uscita 6).
screenrig media sync account update msa_01EXAMPLEACCOUNT0000000 --secret-file new-secret.txt
screenrig media sync account update msa_01EXAMPLEACCOUNT0000000 --name "Contoso tenant" --expect-rev 2

È richiesta almeno una modifica. Una modifica delle credenziali cancella last_test: testa di nuovo l’account. I segreti client di Entra scadono, quindi sostituisci qui il segreto prima che scada.

media sync account connect#

Crea un nuovo link monouso per collegare, o ricollegare, un account Dropbox.

media sync account connect <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’account (msa_…).
screenrig media sync account connect msa_01EXAMPLEACCOUNT0000000

data.authorize_url e data.authorize_expires_at contengono il link, che sostituisce il precedente. Invialo alla persona titolare dell’account Dropbox. Usalo quando la persona non ha completato l’operazione o l’account è reconnect_required (Dropbox non accetta più la connessione). Un account collegato resta collegato finché il nuovo consenso non è completato, e un altro account Dropbox che accede subentra nella connessione.

media sync account test#

Controlla un account: l’accesso e le autorizzazioni Graph di un’app Microsoft, oppure la connessione o la chiave di un account Dropbox o Google Drive.

media sync account test <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’account (msa_…).
screenrig media sync account test msa_01EXAMPLEACCOUNT0000000

La risposta viene memorizzata come last_test. Per un’app Microsoft riporta credentials (Microsoft ha emesso un token; un rifiuto contiene il suo codice AADSTS, come AADSTS7000215 per un segreto che è l’ID anziché il valore) e permissions (le autorizzazioni dell’applicazione Graph che il token possiede). Sites.Selected da sola è un avviso: ogni sito richiede ancora la propria concessione, e un link di condivisione richiede Files.Read.All. Il test non valuta la concessione di un sito né una cartella: media sync create legge la cartella che indichi. Un controllo non riuscito è data.ok false con uscita 0.

media sync account delete#

Elimina un account che nessuna sincronizzazione usa.

media sync account delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’account (msa_…).
--expect-rev REVISIONintegernonessunoRifiuta l’eliminazione se l’account non è a questa revisione (revision_conflict, uscita 6).
screenrig media sync account delete msa_01EXAMPLEACCOUNT0000000

Finché delle sincronizzazioni usano l’account, la risposta è resource_conflict (uscita 5), che le nomina: eliminale prima.

media sync create sharepoint#

Sincronizza una cartella SharePoint o OneDrive for work in una cartella media.

media sync create sharepoint --account-id ID --url URL [--folder-id ID] [--every DURATION] [--name NAME]
ParametroTipoObbligatorioPredefinitoNote
--account-id IDstringsìnessunoL’account tramite cui leggere (msa_…).
--url URLstringsìnessunoL’indirizzo SharePoint della cartella, come https://contoso.sharepoint.com/sites/Marketing/Shared%20Documents/Lobby%20Signs, che funziona con Sites.Selected una volta concesso l’accesso al sito, oppure il suo link di condivisione (Condividi, Copia collegamento), che richiede Files.Read.All. Un OneDrive personale (onedrive.live.com, 1drv.ms) non può essere letto con un’app dell’organizzazione.
--folder-id IDstringnouna nuova cartella media con il nome della cartella di origineLa cartella media (mfd_…) in cui finiscono i file.
--every DURATIONstringno15mOgni quanto cercare modifiche, da 5 minuti a 24 ore: 15m, 1h, 6h, oppure semplici secondi (da 300 a 86400).
--name NAMEstringnoil nome della cartella di origineDa 1 a 80 caratteri.
screenrig media sync create sharepoint --account-id msa_01EXAMPLEACCOUNT0000000 --url https://contoso.sharepoint.com/sites/Marketing/Shared%20Documents/Lobby%20Signs
screenrig media sync create sharepoint --account-id msa_01EXAMPLEACCOUNT0000000 --url "https://contoso.sharepoint.com/:f:/s/Marketing/EabcDEF" --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h --name "Lobby signs"

Una cartella che Microsoft rifiuta è media_sync_source_refused (uscita 5), con l’autorizzazione da concedere; non viene memorizzato nulla.

media sync create dropbox#

Sincronizza una cartella Dropbox in una cartella media.

media sync create dropbox --account-id ID --url URL|PATH [--folder-id ID] [--every DURATION] [--name NAME]
ParametroTipoObbligatorioPredefinitoNote
--account-id IDstringsìnessunoL’account Dropbox collegato tramite cui leggere (msa_…).
--url URLstringsìnessunoL’indirizzo Dropbox della cartella (https://www.dropbox.com/home/...), il link di una cartella condivisa che l’account ha aggiunto al proprio Dropbox, oppure un percorso che inizia con /. Una cartella dello spazio del team viene letta dalla radice del team.
--folder-id IDstringnouna nuova cartella media con il nome della cartella di origineLa cartella media (mfd_…) in cui finiscono i file.
--every DURATIONstringno15mOgni quanto cercare modifiche, da 5 minuti a 24 ore: 15m, 1h, 6h, oppure semplici secondi (da 300 a 86400).
--name NAMEstringnoil nome della cartella di origineDa 1 a 80 caratteri.
screenrig media sync create dropbox --account-id msa_01EXAMPLEACCOUNT0000000 --url https://www.dropbox.com/home/Marketing/Lobby%20Signs
screenrig media sync create dropbox --account-id msa_01EXAMPLEACCOUNT0000000 --url /Marketing/Lobby --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h --name "Lobby signs"

Ogni esecuzione riprende dalla posizione salvata da Dropbox nella cartella e legge solo ciò che è cambiato. Una cartella che l’account non può aprire è media_sync_source_refused, e una connessione che Dropbox non accetta più è dropbox_reconnect_required (media sync account connect): entrambe terminano con uscita 5, senza memorizzare nulla.

media sync create google-drive#

Sincronizza una cartella Google Drive condivisa con l’account di servizio dell’account in una cartella media.

media sync create google-drive --account-id ID --url URL|ID [--folder-id ID] [--every DURATION] [--name NAME]
ParametroTipoObbligatorioPredefinitoNote
--account-id IDstringsìnessunoL’account Google Drive tramite cui leggere (msa_…).
--url URLstringsìnessunoL’indirizzo della cartella (https://drive.google.com/drive/folders/ID), oppure il suo ID. Prima condividi la cartella con il service_account_email dell’account; basta il ruolo Lettore.
--folder-id IDstringnouna nuova cartella media con il nome della cartella di origineLa cartella media (mfd_…) in cui finiscono i file.
--every DURATIONstringno15mOgni quanto cercare modifiche, da 5 minuti a 24 ore: 15m, 1h, 6h, oppure semplici secondi (da 300 a 86400).
--name NAMEstringnoil nome della cartella di origineDa 1 a 80 caratteri.
screenrig media sync create google-drive --account-id msa_01EXAMPLEACCOUNT0000000 --url https://drive.google.com/drive/folders/1AbCdEfGhIjKlMnOpQrStUvWxYz --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h
screenrig media sync create google-drive --account-id msa_01EXAMPLEACCOUNT0000000 --url 1AbCdEfGhIjKlMnOpQrStUvWxYz

Tramite l’account di servizio di screenRIG la cartella si sincronizza solo quando un membro di questo progetto con un’email verificata l’ha condivisa o ne è il proprietario (media_sync_sharer_not_member, uscita 3, nulla viene memorizzato). Ogni esecuzione lo verifica di nuovo, e una cartella che perde un tale condivisore ferma la sincronizzazione nello stato error con i suoi media conservati: condividila di nuovo dall’account Google di un membro, poi esegui media sync update ID --resume. I file di Google Documenti, Fogli e Presentazioni vengono saltati come unsupported_type. Una cartella che l’indirizzo non può aprire è media_sync_source_refused (uscita 5): condividila con l’account di servizio.

media sync list#

Elenca le sincronizzazioni dei media di questo progetto con la loro cartella media, cadenza, stato e stato dell’ultima esecuzione.

media sync list

Nessun parametro.

screenrig media sync list

media sync show#

Ispeziona una sincronizzazione e il riepilogo della sua ultima esecuzione.

media sync show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa sincronizzazione (msy_…).
screenrig media sync show msy_01EXAMPLESYNC000000000

data.last_run contiene status (ok, partial o error), added, updated, removed, pending_delete (file rimossi ancora in uso su uno schermo, in attesa nella cartella Removed) e skipped con il motivo di ogni file (unsupported_type, too_large, storage, subfolder, download_failed, unreadable, in_use); un’esecuzione non riuscita contiene error con un code e un detail che indicano la correzione. data.source aggiunge path per Dropbox e shared_by per Google Drive.

Una sincronizzazione nello stato error va riparata. La sua cartella media è stata eliminata: indirizzala a un’altra con media sync update --folder-id. La sua cartella di origine è stata eliminata o spostata: elimina la sincronizzazione e creane una nuova. Per Google Drive tramite l’account di servizio di screenRIG, la cartella ha perso il suo condivisore verificato (sharer_not_member): condividila di nuovo dall’account Google di un membro del progetto, poi media sync update ID --resume. Un’esecuzione Dropbox fallisce con reconnect_required quando Dropbox smette di accettare la connessione (media sync account connect).

media sync update#

Modifica il nome, la cadenza o la cartella media di una sincronizzazione, oppure mettila in pausa e riprendila.

media sync update <id> [--name NAME] [--every DURATION] [--folder-id ID]
    [--pause | --resume] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa sincronizzazione (msy_…).
--name NAMEstringnoinvariatoRinomina la sincronizzazione.
--every DURATIONstringnoinvariatoOgni quanto cercare modifiche, da 5 minuti a 24 ore.
--folder-id IDstringnoinvariatoPopola invece questa cartella media (mfd_…). La prossima esecuzione legge di nuovo l’intera origine e vi colloca ogni file sincronizzato.
--pausebooleannospentoInterrompi l’esecuzione finché non viene ripresa. Non con --resume.
--resumebooleannospentoRiprendi l’esecuzione; riavvia anche una sincronizzazione fermata da un errore. Non con --pause.
--expect-rev REVISIONintegernonessunoRifiuta la modifica se la sincronizzazione non è a questa revisione (revision_conflict, uscita 6).
screenrig media sync update msy_01EXAMPLESYNC000000000 --every 1h
screenrig media sync update msy_01EXAMPLESYNC000000000 --pause
screenrig media sync update msy_01EXAMPLESYNC000000000 --folder-id mfd_01EXAMPLEFOLDER000000000 --expect-rev 3

È richiesta almeno una modifica.

media sync run#

Esegui subito una sincronizzazione invece di attendere il suo prossimo orario.

media sync run <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa sincronizzazione (msy_…).
screenrig media sync run msy_01EXAMPLESYNC000000000

La sincronizzazione viene eseguita entro circa 30 secondi, e media sync show mostra poi la sua ultima esecuzione. Una sincronizzazione in pausa deve prima essere ripresa.

media sync delete#

Ferma una sincronizzazione; i suoi media e la cartella restano.

media sync delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa sincronizzazione (msy_…).
--expect-rev REVISIONintegernonessunoRifiuta l’eliminazione se la sincronizzazione non è a questa revisione (revision_conflict, uscita 6).
screenrig media sync delete msy_01EXAMPLESYNC000000000

La sincronizzazione dimentica quale file di origine è diventato quale media. I media importati e la cartella media restano, e nulla viene rimosso.

Applicazioni

Un’app è una directory statica già costruita con una root index.html. Il packer inietta l’SDK browser a _screenrig/runtime.js e aggiunge il suo tag script, così l’app raggiunge window.screenrig senza passaggi di build e senza aggiunte alle dipendenze. Nulla nella directory viene mai costruito o eseguito durante il packing.

app pack#

Impacchetta una cartella statica in un archivio deterministico senza caricarla.

app pack <directory> [--output FILE]
ParametroTipoObbligatorioPredefinitoNote
<directory>pathsìnessunoLa directory statica costruita. Richiede una root index.html.
--output FILEpathnonulla è scrittoScrivi anche l’archivio in questo percorso. Senza di esso il comando riporta l’archivio e lo mantiene in memoria.
screenrig app pack ./lobby-board --output ./lobby-board.tgz

La busta riporta sha256, compressed_bytes, expanded_bytes, file_count, la lista delle voci e se il runtime SDK è stato iniettato. app upload contiene la cartella stessa, quindi usa questo comando solo se vuoi ispezionare prima l’archivio.

Le applicazioni funzionano sotto una content security policy che blocca il codice inline. Il packing sposta gli stili e script inline in file sotto _screenrig/inline/ e li collega. I gestori di eventi inline come onclick= e URL javascript: non possono essere spostati; il packing li rifiuta e indica file e riga.

app upload#

Impacchetta una cartella, pubblicala come nuova release dell’applicazione e attendi il successo della pubblicazione.

app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]
ParametroTipoObbligatorioPredefinitoNote
<directory>pathsìnessunoLa directory statica costruita.
--name NAMEstringnonessunoNome applicazione, massimo 120 caratteri.
--no-waitbooleannospentoRestituisci prima che l’operazione di pubblicazione finisca. Esegui operations wait prima di fissare la release in una playlist.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
--timeout MSintegerno120000Scadenza per l’attesa. Limita anche ogni richiesta sottostante.
screenrig app upload ./lobby-board --name "Lobby board"

Leggi tre campi: data.operation.state è succeeded, data.application.release_id è l’ID rel_ un primitivo application pin, e data.application.id è l’ID app_ che i comandi kv usano. Un’operazione riuscita, non un ID di rilascio da solo, indica che il rilascio è utilizzabile.

Ogni app upload crea una nuova applicazione e una prima release immutabile. Per pubblicare una release successiva della stessa app, usa app update. Una playlist continua a servire la release già fissata finché non modifichi quel primitivo.

app update#

Pubblica una nuova versione di un'applicazione esistente, preservando identità, nome e K/V dell'applicazione.

app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID applicazione app_.
<directory>pathsìnessunoLa directory statica costruita.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
--no-waitbooleannospentoRestituisci prima che l’operazione di pubblicazione finisca. Esegui operations wait prima di fissare la release in una playlist.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board

Attendere data.operation.state: "succeeded", quindi usare playlist replace-release per rivedere la pagina esatta, il primitivo, la nuova versione e gli schermi interessati. Applicare con il token di impatto restituito e una facoltativa protezione di revisione come descritto nel flusso di lavoro della playlist. I pin esistenti della playlist rimangono invariati fino all’applicazione. In caso di conflitto di revisione, leggere nuovamente l’app prima di decidere se riprovare; non creare un’applicazione sostitutiva solo per bypassare il conflitto.

app list#

Elenca le applicazioni del progetto

app list

Nessun parametro.

screenrig app list

app show#

Leggi un’applicazione.

app show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID applicazione app_.
screenrig app show app_01EXAMPLEAPP00000000000

latest_ready_release è assente fino a quando una prima pubblicazione non raggiunge lo stato pronto. Lo stato di pubblicazione vive sull’operazione e sulla release, non sull’app.

app delete#

Elimina un’app e tutte le sue release.

app delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID applicazione app_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig app delete app_01EXAMPLEAPP00000000000

Non esiste un’eliminazione per release. Mentre uno schermo mostra una delle release dell’applicazione, l’eliminazione risponde application_in_use: assegna prima altri contenuti a quegli schermi. L’eliminazione non controlla playlist che fissano una release senza mostrarla, quindi aggiorna o elimina anche quelle playlist.

Chiave/valore applicazione

L’archiviazione chiave/valore appartiene a un’applicazione e supporta dati binari. Ogni comando prende --app-id con l’id app_ da app upload, mai un id di release. Usa esattamente una modalità valore per scrittura.

kv list#

Elenca le chiavi archiviate per un’applicazione

kv list --app-id ID
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
screenrig kv list --app-id app_01EXAMPLEAPP00000000000

kv get#

Leggi una chiave.

kv get --app-id ID <key>
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
<key>stringsìnessunoLa chiave da leggere.
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menu

kv set#

Scrivi una chiave da JSON, un file o byte base64.

kv set --app-id ID <key> --json-value JSON [--expect-rev REVISION]
kv set --app-id ID <key> --file FILE [--content-type TYPE] [--expect-rev REVISION]
kv set --app-id ID <key> --value-base64 BASE64 [--content-type TYPE] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
<key>stringsìnessunoLa chiave da scrivere.
--json-value JSONstringuna modalitànessunoUn valore JSON, canonicalizzato prima dell’invio, sempre memorizzato come application/json. È accettato anche un tipo di contenuto application/json esplicito.
--file FILEpathuna modalitànessunoLeggi i byte di valore da un file, o da stdin con -. Predefinito a application/octet-stream.
--value-base64 BASE64stringuna modalitànessunoBase64 standard canonica con padding senza spazi bianchi, al massimo 1.398.104 caratteri. Predefinito a application/octet-stream.
--content-type TYPEstringnoapplication/octet-stream per byteDa uno a 127 caratteri.
--expect-rev REVISIONstringnonessunoScrivi solo se la voce memorizzata è ancora a questa revisione.
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'

kv delete#

Elimina una chiave.

kv delete --app-id ID <key> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
<key>stringsìnessunoLa chiave da eliminare.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu

Webhook chiave/valore

Un webhook chiave/valore è un URL che scrive una chiave di un’applicazione, così qualsiasi sistema esterno, come un punto vendita, uno script di foglio di calcolo o un cron job, invia dati agli schermi con una singola richiesta HTTP POST. Un’applicazione che si iscrive con kv.onChange si aggiorna in pochi secondi su ogni schermo che la esegue. Un’applicazione può avere al massimo 20 webhook.

Il mittente si autentica con il segreto del webhook, srkw_…, come Authorization: Bearer <secret>, o con HTTP Basic usando l’id webhook come nome utente e il segreto come password; un segreto in URL o query string non è mai accettato. Il corpo grezzo, massimo 1 MiB, diventa il valore della chiave e Content-Type il suo content type. Ogni post è una richiesta API fatturata, misurata e conteggiata come kv set, aumenta la revisione e risponde con i nuovi metadati della chiave, mai il suo valore. Un header Idempotency-Key opzionale evita duplicati di ritentativi del mittente per 24 ore. Un webhook accetta al massimo 120 post al minuto, e un segreto mancante o errato o un webhook sconosciuto risponde 401. Push data da un altro sistema ha curl esempi.

Il segreto è mostrato solo da kv webhook create e kv webhook rotate-secret. L’URL non è segreto. Creare, ruotare ed eliminare un webhook aggiunge kv_webhook.created, kv_webhook.secret_rotated e kv_webhook.deleted al log eventi del progetto, e ogni post aggiunge kv.updated come qualsiasi scrittura.

Codice problemaEsciSignificato
kv_webhook_limit_reached5L’applicazione ha già 20 webhook. Non è stato creato nulla. Elimina prima uno.
not_found4L’applicazione non è in questo progetto, o nessun webhook ha questo id su di essa.

kv webhook create#

Crea un webhook che scrive una chiave e ricevi il suo URL e segreto una sola volta.

kv webhook create <key> --app-id ID [--description TEXT]
ParametroTipoObbligatorioPredefinitoNote
<key>stringsìnessunoLa chiave che ogni post scrive, da 1 a 256 caratteri: una lettera o cifra prima, poi lettere, cifre, ., _, :, / o -. La chiave può non esistere ancora.
--app-id IDstringsìnessunoL’ID applicazione app_.
--description TEXTstringnonessunoCosa invia, massimo 200 caratteri. Non deve contenere credenziali.
screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"

La busta è il webhook: data.id (kvw_…), data.key, data.url (https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write) e data.secret (srkw_…). Inserisci URL e segreto nel sistema di invio ora. Nessun comando successivo mostra di nuovo questo segreto.

kv webhook list#

Elenca i webhook di un’applicazione, dal più vecchio

kv webhook list --app-id ID
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000

Ogni elemento ha id, key, description, url, created_at e, una volta scritto, last_used_at. Una lista non contiene mai un segreto.

kv webhook delete#

Elimina un webhook. Il suo URL smette di funzionare immediatamente e la chiave mantiene il suo valore.

kv webhook delete <webhook_id> --app-id ID
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--app-id IDstringsìnessunoL’ID applicazione app_.
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000

kv webhook rotate-secret#

Sostituisci il segreto di un webhook e ricevi quello nuovo una volta sola.

kv webhook rotate-secret <webhook_id> --app-id ID
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--app-id IDstringsìnessunoL’ID applicazione app_.
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000

La busta contiene il nuovo segreto in data.secret. Il vecchio segreto smette di funzionare immediatamente, quindi inserisci il nuovo nel sistema di invio.

Webhook delle schede

Un webhook di scheda è un URL che scrive il documento dati di una scheda, così un sistema esterno come un CMS, un punto vendita o uno script invia dati a una scheda con una singola richiesta HTTP POST. kv webhook create, list, rotate-secret e delete accettano --card CARD_ID al posto di --app-id; update e deliveries qui sotto funzionano solo con le schede. Una scheda può avere al massimo 20 webhook.

kv webhook create --card CARD_ID [--description TEXT] [--map FILE|-] [--signing]
kv webhook list --card CARD_ID
kv webhook rotate-secret <webhook_id> --card CARD_ID [--signing]
kv webhook delete <webhook_id> --card CARD_ID

La creazione di un webhook di scheda non richiede una chiave. --map FILE (o - per stdin) è la mappatura e --signing attiva la firma. La risposta contiene data.secret e, se il webhook firma, data.signing_secret, ciascuno mostrato una sola volta.

Il mittente si autentica come per un webhook di applicazione: Authorization: Bearer <secret> con il segreto srkw_…, oppure HTTP Basic con l'ID del webhook come nome utente, quindi https://kvw_ID:srkw_…@api.screenrig.ai/… va bene per un mittente che accetta solo un URL. Il corpo, al massimo 1 MiB, è JSON oppure application/x-www-form-urlencoded; un nome di modulo ripetuto diventa un array. Senza mappatura, l'oggetto inviato è il documento dati della scheda.

Una mappatura è un modello JSON che costruisce il documento dal corpo. Una stringa con segnaposto come {{body.alert.title}} o {{body.items[0].name}} è testo, e una stringa che è esattamente un segnaposto mantiene il tipo del valore. Un percorso inizia con body o query (i parametri di query dell'URL), e un percorso che non contiene nulla è vuoto nel testo e omette un valore isolato. $each mappa un array con item e index nell'ambito, $group con $by raggruppa nell'ordine della prima comparsa, $number legge 1,234.50, $3.50, 3,50 € o 12% (aggiungi "$decimal": "," per la virgola decimale), $bool legge true, yes, y, 1 e x, e $text con $max taglia il testo. Il modello viene controllato al salvataggio: invalid_request indica il punto che ha fallito.

{
  "title": "{{body.alert.title}}",
  "body": "{{body.alert.message}}",
  "items": { "$each": "{{body.items}}", "$limit": 20, "$template": { "text": "{{item.name}}" } }
}
curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks/kvw_01EXAMPLEWEBHOOK00000/write \
  -H "Authorization: Bearer $CARD_WEBHOOK_SECRET" \
  -H "Content-Type: application/json" \
  --data '{"alert":{"title":"Fire drill","message":"Leave by the east door"},"items":[{"name":"Floor 2"}]}'

Ogni invio viene controllato come i dati della scheda stessa: card_data_invalid indica il percorso e non viene scritto nulla. Un documento uguale a quello attuale della scheda risponde unchanged e non scrive nulla, quindi nessuno schermo viene svegliato. Un invio accettato è una richiesta API fatturata, un webhook accetta al massimo 120 invii al minuto e un'intestazione Idempotency-Key deduplica i nuovi tentativi di un mittente per 24 ore.

Un indirizzo sbagliato, un segreto errato o mancante, un webhook disattivato, una firma mancante o errata e ogni GET ricevono la stessa risposta 404, così un'anteprima di link o un tentativo non rivela nulla. kv webhook deliveries ne spiega il motivo.

Con --signing, ogni invio deve anche includere ScreenRig-Signature: t=<unix seconds>,v1=<hex>, dove v1 è l'HMAC-SHA256 di t, un punto e il corpo grezzo con il segreto di firma whsec_…, e t deve distare al massimo cinque minuti dall'orologio del server. È il formato delle firme dei webhook di screenRIG.

Firme e handshake dei fornitori

I fornitori firmano i loro invii a modo loro, e alcuni non possono inviare affatto il tuo segreto. Un webhook delle schede può verificare la firma del fornitore al posto del segreto e rispondere all’handshake di configurazione del fornitore, così GitHub, Stripe, Shopify, Slack, Linear, Vercel, Asana, Microsoft Graph, monday.com, Trello e Azure Event Grid inviano direttamente, senza intermediari. Funziona anche qualsiasi altro mittente che firma con HMAC. Imposta verify e handshake tramite l’API quando crei o modifichi il webhook (POST /api/cards/{id}/kv-webhooks, poi PATCH /api/cards/{id}/kv-webhooks/{webhook_id}).

  • verify è {vendor, secret}, più, per generic_hmac, il header, la encoding (hex o base64), un timestamp_header e tolerance_seconds (300 per impostazione predefinita). Un invio che porta la firma valida del fornitore viene accettato senza il segreto srkw_ del webhook, che continua a funzionare accanto. Il segreto del fornitore è memorizzato sigillato e mostrato solo come set e i suoi ultimi quattro caratteri. Una modifica che invia verify senza secret mantiene quello memorizzato finché il fornitore resta lo stesso, e verify: null rimuove la verifica. verify e --signing si escludono a vicenda.
  • handshake è microsoft_graph, monday, trello o azure_event_grid, e null lo rimuove. Slack e Asana rispondono ai propri handshake tramite verify.vendor.
verify.vendorIntestazioneCosa viene firmatoMarca temporale
githubX-Hub-Signature-256HMAC-SHA256 del corpoNessuno
stripeStripe-SignatureHMAC-SHA256 della marca temporale, di un punto e del corpo; qualsiasi v1 può corrispondere5 minuti
shopifyX-Shopify-Hmac-Sha256HMAC-SHA256 del corpo, in base64Nessuno
slackX-Slack-SignatureHMAC-SHA256 di v0:, della marca temporale, di due punti e del corpoX-Slack-Request-Timestamp, 5 minuti
linearLinear-SignatureHMAC-SHA256 del corpowebhookTimestamp nel corpo, 1 minuto
vercelx-vercel-signatureHMAC-SHA1 del corpoNessuno
asanaX-Hook-SignatureHMAC-SHA256 del corpo, con il X-Hook-Secret dell’handshake come chiaveNessuno
generic_hmacL’header che indichiHMAC-SHA256 del corpo oppure, con un timestamp_header, della marca temporale, di un punto e del corpotolerance_seconds

La chiave di ogni HMAC è il testo del segreto come lo mostra il fornitore (quello di Stripe include whsec_). Una firma viene verificata sul corpo esattamente come è arrivato, in tempo costante, prima che l’invio consumi budget di scrittura, e viene giudicata prima della sua marca temporale: timestamp_stale significa sempre che il segreto era giusto. Un corpo può essere JSON, un modulo o multipart/form-data, dove un campo di testo è body.FIELD e i file vengono contati, non letti.

FornitorescreenRIG rispondeInvii successivi
Slack (verify.vendor slack)Il url_verification firmato con il suo challenge; una persona che prova con curl può inviare invece il segreto del webhookFirmati con il segreto di firma
Asana (asana)L’X-Hook-Secret dell’handshake, che conserva sigillato come chiave di ogni X-Hook-Signature. Lo stesso segreto di nuovo è un nuovo tentativo; uno diverso viene rifiutato come handshake_invalidX-Hook-Signature
Microsoft Graph (microsoft_graph)Il ?validationToken= decodificato come text/plainPortano il segreto del webhook
monday.com (monday)Il challenge che invia, restituito come JSONPortano il segreto del webhook
Trello (trello)Un controllo HEAD risponde 200 senza corpo, solo per questo webhookPortano il segreto del webhook
Azure Event Grid (azure_event_grid){"validationResponse": "CODE"}Portano il segreto del webhook

Un handshake riceve risposta solo per un webhook configurato per quel fornitore, prima che venga richiesta qualsiasi credenziale, a una richiesta che è quell’handshake, e mai da un webhook disattivato. Non scrive nulla, non viene mai fatturato e non consuma budget di frequenza. Microsoft Graph, monday.com, Trello e Azure Event Grid non inviano alcuna intestazione che screenRIG verifichi, quindi le loro consegne sono accettate solo con il segreto del webhook. Azure Event Grid lo porta come intestazione di consegna statica, Authorization: Bearer srkw_…, contrassegnata come segreta, e i suoi eventi arrivano come array, quindi una mappatura legge body[0].

FornitoreNelle impostazioni del fornitore
GitHubSettings, Webhooks, Add webhook: la Payload URL è l’url del webhook, il tipo di contenuto è application/json, e lo stesso segreto. Il ping di GitHub è firmato e accettato
StripeWorkbench, Webhooks: aggiungi l’url e rivela il suo segreto di firma. Mentre Stripe ruota un segreto invia un v1 per ciascuno e uno qualsiasi dei due è accettato; poi sostituisci il segreto memorizzato con un PATCH
ShopifyIscriviti con l’url in formato JSON. Il segreto è il segreto client dell’app
SlackLa Request URL della Events API è l’url, e il segreto è il segreto di firma dell’app. Un comando slash invia un modulo: {{body.text}}, {{body.user_name}}
LinearNelle impostazioni dell’API crea un webhook con l’url e copia il suo segreto di firma. Il webhookTimestamp del corpo deve essere entro un minuto dall’orologio del server
VercelTeam settings, Webhooks: creane uno con l’url. Vercel mostra il segreto una sola volta
AsanaCrea il webhook con {"verify": {"vendor": "asana"}}: non ha ancora un segreto e rifiuta gli eventi come secret_pending. Poi crea il webhook Asana con target impostato sull’url, e l’handshake imposta il segreto. Per adottare un nuovo segreto, PATCH con verify nullo, poi di nuovo con il fornitore
Microsoft GraphCrea la sottoscrizione con notificationUrl impostato sull’url
monday.comEsegui create_webhook con l’url
TrelloPOST /1/webhooks con callbackURL impostato sull’url
Azure Event GridCrea la sottoscrizione agli eventi con l’url come endpoint del webhook, e aggiungi l’intestazione di consegna qui sopra
curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks \
  -H "Authorization: Bearer $SCREENRIG_TOKEN" -H "Content-Type: application/json" \
  --data '{"description":"Pushes","verify":{"vendor":"github","secret":"YOUR_SECRET"},
    "mapping":{"title":"{{body.repository.full_name}}","body":"{{body.head_commit.message}}"}}'

Un mittente che firma con il proprio HMAC indica l’intestazione, la codifica e, se firma una marca temporale, l’intestazione della marca temporale:

curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks \
  -H "Authorization: Bearer $SCREENRIG_TOKEN" -H "Content-Type: application/json" \
  --data '{"verify":{"vendor":"generic_hmac","secret":"YOUR_SECRET","header":"X-Acme-Signature",
    "encoding":"base64","timestamp_header":"X-Acme-Time","tolerance_seconds":120},
    "mapping":{"title":"{{body.sensor}}","body":"{{body.state}}"}}'
ts=$(date +%s); body='{"sensor":"door","state":"open"}'
sig=$(printf '%s.%s' "$ts" "$body" | openssl dgst -sha256 -hmac "$SECRET" -binary | openssl base64 -A)
curl "$URL" -H "Content-Type: application/json" -H "X-Acme-Time: $ts" -H "X-Acme-Signature: $sig" -d "$body"

Ogni errore dà lo stesso 404 di qualsiasi altro rifiuto. kv webhook deliveries mostra il motivo, e un handshake compare con l’esito handshake:

MotivoSignificato
signature_missingverify è impostato e l’invio non portava né il segreto né l’intestazione del fornitore
signature_invalidL’intestazione è malformata o non corrisponde al corpo
timestamp_missingLa firma richiede una marca temporale che l’invio non portava
timestamp_staleLa firma è valida e la sua marca temporale è fuori finestra
secret_pendingUna verifica Asana attende ancora il suo handshake
handshake_invalidLa richiesta è l’handshake di un fornitore e non può ricevere risposta

kv webhook update#

Modifica un webhook di scheda: descrizione, mappatura, stato di attivazione o firma.

kv webhook update <webhook_id> --card CARD_ID [--description TEXT] [--map FILE|-] [--clear-map]
                   [--enable|--disable] [--signing|--no-signing]
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--card CARD_IDstringsìnessunoL'ID scheda crd_.
--description TEXTstringnonessunoCosa invia, massimo 200 caratteri. Non deve contenere credenziali.
--map FILEpathnonessunoSostituisci la mappatura con un oggetto JSON letto da un file, oppure - per stdin.
--clear-mapbooleannospentoRimuovi la mappatura: l'oggetto inviato diventa il documento.
--enable / --disablebooleannospento--disable risponde a ogni invio come a un segreto errato finché non si usa --enable.
--signing / --no-signingbooleannospento--signing richiede l'intestazione di firma e stampa il segreto di firma una sola volta; --no-signing smette di richiederla.
screenrig kv webhook update kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --map alert-map.json

La busta è il webhook. data.signing_secret compare una sola volta, nella risposta che ha attivato la firma.

kv webhook deliveries#

Leggi il registro delle consegne di un webhook di scheda, dal più recente, degli ultimi sette giorni.

kv webhook deliveries <webhook_id> --card CARD_ID [--limit N]
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--card CARD_IDstringsìnessunoL'ID scheda crd_.
--limit Nnumberno100Quante consegne restituire, da 1 a 100.
screenrig kv webhook deliveries kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

Ogni voce ha at, outcome (written, unchanged, refused, invalid o handshake), reason (per esempio credentials, signature, disabled, body, mapping, card_data_invalid o rate_limited), detail, status, bytes, revision e request_id. Non viene memorizzato alcun corpo, intestazione o credenziale, e un invio a un indirizzo sbagliato non lascia alcuna riga.

Playlist

Una playlist è un documento JSON di pagine. playlist init prepara un documento a schermo intero da input ordinati. playlist create e playlist update leggono quel documento da un file; la forma è riassunta sotto i comandi.

playlist init#

Prepara una playlist a schermo intero modificabile da file multimediali locali, ID media pronti, ID release app o URL HTTP o HTTPS.

playlist init <inputs...> --name NAME --output FILE [--overwrite] [--screen-id ID]
              [--target-width PX --target-height PX] [--duration-ms MS] [--fit contain|cover|fill]
              [--no-transcode] [--no-progress] [--poll-ms MS]
ParametroTipoObbligatorioPredefinitoNote
<inputs...>file, ID med_, ID rel_ o URL HTTP o HTTPSsìnessunoOrdine di riproduzione. I file immagine/video locali si caricano e attendono la disponibilità a meno che --no-transcode. I media esistenti devono essere già pronti. Gli URL HTTP e HTTPS possono includere host della rete locale e credenziali incorporate e non vengono scaricati. L’app web del Player richiede URL HTTPS senza nome utente o password.
--name NAMEstringsìnessunoNome visualizzato della playlist.
--output FILEpathsìnessunoScrivi il documento {name, pages} modificabile. Le cartelle genitore sono create. Esclusivo per impostazione predefinita.
--overwritebooleannospentoSostituisci un file di output esistente in modo atomico.
--screen-id IDstringnonessunoLeggi le dimensioni e la revisione dello schermo di destinazione.
--target-width PX / --target-height PXintegerinsiemenon impostatoSovrascrivi la dimensione della tela. Entrambe o nessuna. Richiesto quando non è fornito uno schermo o lo schermo riporta superfici sconosciute o multiple.
--duration-ms MSintegerno8000Durata per pagine non video.
--fitstringnocontaincontain, cover o fill per pagine di immagini e video. Applicazioni e iframe usano fill.
--no-transcodebooleannospentoByte del file caricato accettati senza modifiche.
--no-progressbooleannospentoSopprimi il progresso di caricamento su stderr.
--poll-ms MSintegerno1000Intervallo di polling per il caricamento.
screenrig playlist init med_POSTER med_VIDEO --name "Lobby loop" --screen-id scr_LOBBY --output lobby.json

La preparazione scrive il documento locale e può caricare contenuti multimediali; non crea una playlist remota né assegna uno schermo. Ispeziona il documento, poi screen publish. Vedi Prepara, pubblica e modifica playlist.

playlist validate#

Valida un documento playlist localmente prima di creare o aggiornare. Nessuna rete.

playlist validate <file>
ParametroTipoObbligatorioPredefinitoNote
<file>pathsìnessunoIl documento della playlist.
screenrig playlist validate ./lobby-loop.json

Gli errori indicano percorsi JSON esatti. Un pass significa che la forma locale e la semantica cross-field sono valide; autorizzazione, prontezza media, conteggi selettore dinamico, durate e disponibilità remota richiedono ancora controlli server. Create e update eseguono questo controllo prima della scrittura. Il risultato include anche segnalazioni di geometria lint che non fanno fallire il controllo: motion_overuse, collision, safe_margin e adjacent_repeat. Per vedere come appare una pagina, pubblicala ed esegui screen screenshot.

playlist create#

Crea una playlist da un documento JSON, da un modello o dal modello integrato Avviso urgente.

playlist create [file] [--from-template ID --name NAME [--set NAME=VALUE...] [--dry-run]] [--starter KEY [--name NAME]] [--format-region REGION --format-orientation ORIENTATION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
[file]pathnonessunoIl documento della playlist. Indicalo, oppure --from-template, oppure --starter.
--from-template IDstringnonessunoCrea la playlist da questo modello (un id pl_): le sue pagine attuali con i valori di --set, verificata come qualsiasi playlist.
--name NAMEstringcon --from-templatenessunoIl nome della nuova playlist.
--set NAME=VALUEstringnonessunoCon --from-template: il valore di un campo; per un campo multimediale, l'id di un'immagine o di un video pronto. Ripetibile.
--dry-runbooleannospentoCon --from-template: verifica i valori e riporta il numero di pagine senza creare nulla.
--starter KEYstringnonessunoAggiungi un modello integrato: urgent-notice, un titolo e un messaggio per annunci rapidi.
--format-region REGIONstringnonessunoheader, footer o side: trasforma la playlist in una fascia disegnata sopra la pagina lungo quel bordo e sostituisce un format nel file. Indicala insieme a --format-orientation. Vedi fasce.
--format-orientation ORIENTATIONstringcon --format-regionnessunolandscape o portrait: l’orientamento del display per cui è fatta la fascia, come lo vede lo spettatore.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig playlist create ./lobby-loop.json
screenrig playlist create --from-template pl_01EXAMPLETEMPLATE00000 --name "Monday notice" --set headline="Open late"

data.id della busta è l'id pl_ che accetta screen assign. Quando la modifica attende la revisione, data è {status: pending_review, review, playlist}: la playlist esiste con approved_revision: 0 e nessuno schermo può mostrarla finché una persona non approva (playlist_not_approved). Un modello è una playlist che dichiara fields; non viene mai mostrato su uno schermo (playlist_is_template), e una playlist creata da esso è una playlist normale da assegnare, pianificare e rivedere.

playlist update#

Sostituisci un documento playlist.

playlist update <id> <file> [--format-region REGION --format-orientation ORIENTATION] [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID playlist pl_.
<file>pathsìnessunoIl documento sostitutivo.
--format-region REGIONstringnonessunoheader, footer o side: trasforma la playlist in una fascia disegnata sopra la pagina lungo quel bordo e sostituisce un format nel file. Indicala insieme a --format-orientation. Vedi fasce.
--format-orientation ORIENTATIONstringcon --format-regionnessunolandscape o portrait: l’orientamento del display per cui è fatta la fascia, come lo vede lo spettatore.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig playlist update pl_01EXAMPLEPLAYLIST000000 ./lobby-loop.json

Quando la modifica attende la revisione, la playlist live continua a suonare senza cambiamenti finché una persona non approva la proposta.

playlist show#

Leggi una playlist, inclusa la sua revisione corrente.

playlist show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID playlist pl_.
screenrig playlist show pl_01EXAMPLEPLAYLIST000000

Restituisce la versione live. approved_revision è 0 per una playlist che nessuna persona ha ancora approvato, e approval nomina la revisione aperta mentre un cambiamento attende; reviews show ID restituisce la proposta.

playlist list#

Elenca le playlist del progetto

playlist list [--templates] [--library]
ParametroTipoObbligatorioPredefinitoNote
--templatesbooleannospentoSolo modelli: playlist che dichiarano dei campi.
--librarybooleannospentoElenca invece le playlist della Libreria dell’organizzazione, in sola lettura: assegnale a schermi, programmazioni e pile, oppure copiane una con playlist create --from-template; modificale solo nel progetto Libreria.
screenrig playlist list --templates
screenrig playlist list --library

playlist fields#

Mostra i campi di un modello o i valori di una copia, oppure cambia i valori e aggiorna la copia.

playlist fields <id> [--set NAME=VALUE...] [--clear NAME...] [--refresh] [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id pl_ di un modello o di una playlist creata da un modello.
--set NAME=VALUEstringnonessunoImposta il valore di un campo. Ripetibile.
--clear NAMEstringnonessunoCancella il valore di un campo facoltativo. Ripetibile.
--refreshbooleannospentoRicostruisce le pagine dalla revisione attuale del modello, qualunque siano i valori.
--expect-rev REVISIONstringnonessunoRichiede facoltativamente questa revisione della risorsa.
--note TEXTstringnonessunoUna nota per la persona che esamina la modifica.
screenrig playlist fields pl_01EXAMPLECOPY00000000 --set headline="Closed today"

Senza opzioni mostra i campi di un modello e quante playlist sono state create da esso, oppure i valori di una copia, la revisione del modello da cui è stata creata e se il modello ne ha una più recente. Ogni modifica, e --refresh da solo, ricostruisce le pagine della copia dalla revisione attuale del modello, ed è così che una modifica del marchio fatta sul modello raggiunge le copie esistenti; nulla viene inviato automaticamente. I valori vengono verificati come in una creazione. Con l'accesso Propose, una modifica diventa una revisione.

playlist instances#

Elenca le playlist create da un modello e la revisione del modello da cui è stata creata ciascuna.

playlist instances <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id pl_ del modello.
screenrig playlist instances pl_01EXAMPLETEMPLATE00000

outdated indica una playlist creata da una revisione precedente del modello; playlist fields ID --refresh la aggiorna.

playlist revisions#

Elenca le revisioni di una playlist, dalla più recente.

playlist revisions <id> [--after CURSOR]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID playlist pl_.
--after CURSORstringnonessunoIl next_cursor della pagina precedente.
screenrig playlist revisions pl_01EXAMPLEPLAYLIST000000

Ogni revisione indica cosa l'ha creata (created, edited, promoted con la revisione copiata, oppure baseline, la revisione che la playlist aveva quando è iniziata la sua cronologia), chi l'ha fatta, quando, quante pagine contiene e se è quella corrente. Una pagina contiene 50 revisioni; next_cursor legge la successiva.

playlist revision show#

Leggi una revisione e la playlist com'era in quella revisione.

playlist revision show <id> --revision N
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID playlist pl_.
--revision NintegersìnessunoLa revisione da leggere.
screenrig playlist revision show pl_01EXAMPLEPLAYLIST000000 --revision 3

playlist promote#

Rendi di nuovo corrente una revisione precedente copiandola come nuova revisione.

playlist promote <id> --revision N --expect-rev CURRENT
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID playlist pl_.
--revision NintegersìnessunoLa revisione da copiare.
--expect-rev CURRENTstringsìnessunoLa revisione corrente della playlist (playlist show). Un valore obsoleto è revision_conflict: rileggi la playlist e riprova.
screenrig playlist promote pl_01EXAMPLEPLAYLIST000000 --revision 3 --expect-rev 9

Le pagine, la colonna sonora e il formato della revisione diventano la revisione successiva. Il nome resta invariato, le revisioni precedenti restano nell'elenco e ogni schermo che mostra la playlist si aggiorna. La promozione richiede una credenziale che pubblica dal vivo; una le cui modifiche attendono una revisione riceve forbidden. Una revisione il cui contenuto è già quello corrente non cambia nulla.

playlist delete#

Elimina una playlist.

playlist delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID playlist pl_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig playlist delete pl_01EXAMPLEPLAYLIST000000

playlist export#

Esporta file di immagini e video, audio della colonna sonora e URL iframe come bundle di playlist portatile.

playlist export <id> --output DIRECTORY [--skip-applications]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID playlist pl_.
--output DIRECTORYpathsìnessunoCartella di destinazione. Non deve già esistere; il pacchetto viene scritto tramite un file temporaneo e rinominato in posizione.
--skip-applicationsflagnospentoElimina le primitive applicative e le pagine vuote o controllate da un’applicazione. Deve rimanere almeno una pagina. Il risultato elenca gli ID delle primitive e delle pagine saltate.
screenrig playlist export pl_01EXAMPLEPLAYLIST000000 --output ./lobby-bundle

Il bundle contiene un manifest, il documento della playlist e file di immagini, video e audio della colonna sonora indirizzati in base al contenuto. I selettori dinamici all, tag e folder vengono fissati su ID esatti, gli URL iframe vengono conservati e i commenti vengono esclusi.

Le schede, gli stream e le pagine adslot interrompono l’esportazione prima del download dei media. Anche le applicazioni la interrompono per impostazione predefinita; --skip-applications rimuove le primitive applicative e le pagine vuote o controllate da un’applicazione, indicando gli ID delle primitive e delle pagine saltate. Deve rimanere almeno una pagina. Le schede, gli stream e le pagine adslot interrompono l’esportazione anche con questa opzione.

Per ottenere un documento modificabile che conservi i riferimenti a schede e applicazioni, usa screenrig playlist show pl_01EXAMPLEPLAYLIST000000 --output playlist.json. Il documento usa le risorse esistenti dello stesso progetto.

playlist import#

Crea una playlist da una directory bundle o aggiorna una esistente da essa.

playlist import <directory> [--name NAME] [--update ID [--expect-rev REVISION] [--note TEXT]]
ParametroTipoObbligatorioPredefinitoNote
<directory>pathsìnessunoUna cartella bundle scritta da playlist export.
--name NAMEstringnonome playlist del bundleDa 1 a 120 caratteri. Importa il pacchetto come nuova playlist con questo nome.
--update IDstringnouna nuova playlist è creataAggiorna questa pl_ playlist invece di crearne una nuova. Accetta opzionale --expect-rev.
--expect-rev REVISIONstringnonessunoLa revisione corrente della playlist di destinazione.
--note TEXTstringnonessunoCon --update: una nota per la persona che revisiona la modifica, al massimo 280 caratteri.
screenrig playlist import ./lobby-bundle
screenrig playlist import ./lobby-bundle --name "Lobby loop (copy)"

I nomi visualizzati delle playlist possono ripetersi. L’importazione crea una playlist separata anche quando il nome corrisponde; usa --update con un ID per sostituire una playlist esistente.

L’importazione convalida l’intero bundle localmente prima che tocchi il progetto: manifest, documento, percorsi, tipi di media, lunghezze e hash. I media esistenti sono riutilizzati se corrispondono esattamente per nome file, tipo media, lunghezza byte, hash e tag; il resto viene caricato senza conversione, e la playlist è scritta solo dopo che ogni oggetto è pronto.

L’importazione non elimina né pota media remoti. Se un passaggio successivo fallisce dopo l’inizio di un caricamento, l’errore elenca gli oggetti confermati pronti e indica se la scrittura della playlist è iniziata. Ritentare lo stesso bundle riutilizza quegli oggetti.

Il documento della playlist

Una playlist è name più pages, con una colonna sonora audio opzionale. Ogni pagina porta id, canvas, transition, advance, visibility opzionale, audio_cue opzionale e primitives.

Un modello aggiunge fields al documento, [{name, label, type, required, max_length?}] con type pari a text, media o url, e può contrassegnare qualsiasi primitiva come locked: true. Una pagina legge un campo come {field.NAME} nei params di una scheda (campi testo e indirizzo), come selector.media_id di un'immagine o di un video (un campo multimediale) o come src completo di un iframe (un campo indirizzo). Ogni segnaposto deve indicare un campo dichiarato del tipo giusto, ogni campo deve essere letto e una primitiva bloccata non ne legge alcuno; playlist validate lo verifica offline. Solo il proprietario o un membro che può approvare modifica una primitiva bloccata (primitive_locked).

Le sei primitive sono image, caricate video, live stream, web iframe e application, e card. Copy e chrome non sono tipi wire: posiziona una card per il testo live, oppure carica un’immagine statica finita (media generate ne crea una) e posizionala come immagine.

Uno stream prende una o due sorgenti ordinate con protocolli unici e un’immagine pronta dallo stesso progetto come fallback_media_id. Usa al massimo uno stream per pagina e avanzamento basato sulla durata. HLS usa un URL HTTPS pubblico; i Player Android e Qt si collegano direttamente ai flussi RTSP delle telecamere, credenziali incluse. Consulta i dettagli sui trasporti delle telecamere per i formati di URL aperti da ciascun Player; il multicast diretto UDP/MPEG-TS opzionale su Android e Qt usa un gruppo IPv4 in 239/8 e una porta. Una sorgente può indicare solo il suo url e lasciare che lo schema indichi il protocollo. Altri Player selezionano l’alternativa HLS o mostrano il fallback. I byte dello stream non sono memorizzati in cache per la riproduzione. L’audio è disattivato di default. L’import e l’export del bundle playlist non supportano gli stream.

{
  "id": "live",
  "primitive": "stream",
  "sources": [
    {
      "protocol": "udp-mpegts",
      "group": "239.10.0.1",
      "port": 5000
    },
    {
      "protocol": "hls",
      "url": "https://example.com/live.m3u8"
    }
  ],
  "fallback_media_id": "med_fallback",
  "muted": true,
  "rect": {
    "x": 0,
    "y": 0,
    "width": 1920,
    "height": 1080
  },
  "layer": 0,
  "content_fit": "contain"
}

Usa questa primitiva su una pagina con advance: {"mode":"duration","after_ms":30000}. Sostituisci il feed di esempio e l’ID di fallback. Requisiti del lettore e configurazione del trasporto.

Ogni primitivo è piatto: id, primitive, i campi propri di quel primitivo, poi rect, layer, content_fit e opzionale enter. Non esiste un oggetto contenuto annidato.

Le primitive immagine e video richiedono selector. selector.by è id con un media_id pronto e one_at_a_time false, ids con da 1 a 1,024 media_ids pronti univoci, all per ogni oggetto pronto di quella primitiva, tag che corrisponde a ^[A-Za-z0-9]{1,32}$, oppure folder con il folder_id di una cartella media mfd_ esistente, che riproduce i file pronti direttamente al suo interno e nessuna delle sue sottocartelle. Non mettere media_id sulla primitiva stessa e non inviare elementi risolti dal server. Una primitiva application fissa un release_id e una primitiva iframe richiede un src e un titolo, quindi nessuna delle due accetta un selettore. src è qualsiasi pagina http o https che lo schermo può raggiungere, inclusa una pagina LAN o dietro un login; un link YouTube viene memorizzato come il suo embed con riproduzione automatica. src, e il fallback_src facoltativo di un iframe, possono contenere token dello schermo come {screen.field.kiosk_id}, e una primitiva application può avere params con gli stessi token, così una playlist dà a ogni schermo la propria pagina. I Player Android, Amazon Signage Stick, Linux, Raspberry Pi e Windows aprono direttamente la pagina. L'app web Player e i Player macOS, Samsung Tizen, LG webOS e BrightSign la inseriscono in un frame, quindi una pagina che invia X-Frame-Options (DENY, SAMEORIGIN o l'obsoleto ALLOW-FROM), o un elenco Content-Security-Policy frame-ancestors senza l'origine del Player, mostra un frame bloccato su di essi, e l'app web Player mostra solo pagine https senza login nell'indirizzo. Quando la pubblicazione rileva una pagina HTTPS pubblica che rifiuta il framing, la scrittura riesce comunque e la CLI stampa la voce warnings del server: codice iframe_framing_refused, page_id, primitive_id e src, l'header che ha rifiutato e il passo successivo (usare una pagina che consente il framing dall'origine del Player, o chiedere al suo proprietario di consentire quell'origine). Il server aggiunge inoltre un'avvertenza playlist.iframe_framing_refused al registro eventi, una per pagina che rifiuta, che events list stampa con primitive_id. Una pagina LAN, una pagina http e una pagina che il server non raggiunge entro pochi secondi non vengono controllate. Un Player segnala una playlist come in riproduzione una volta che il suo manifest è a schermo, quindi una pubblicazione verificata non dimostra che una pagina iframe sia stata visualizzata: agisci sull'avvertenza, o guarda lo schermo. Entrambe le primitive web richiedono content_fit di fill, perché nessuna delle due ha una dimensione intrinseca.

advance.mode è duration con after_ms, che su una pagina con esattamente un video YouTube (non una playlist né una diretta) può portare anche until impostato su video_end, così la pagina dura fino alla fine del video e after_ms è il tempo per cui viene mostrata quando lo schermo non riesce a leggere la durata del video, media_end su una pagina con esattamente un primitivo immagine o video, audio_end su una pagina il cui audio_cue nomina una traccia sonora, o application con max_ms quando l’app termina il proprio turno chiamando window.screenrig.nextPage(). Una pagina application necessita esattamente un primitivo marcato controller; ogni altra modalità lo vieta.

transition.type è uno tra crossfade, swipe-left, swipe-right, swipe-up, swipe-down, dip, wipe-left, wipe-right, wipe-up, wipe-down, slide-left, slide-right, slide-up, slide-down o stinger. duration_ms è obbligatorio, da 0 a 60000. La pagina predefinita è una dissolvenza incrociata di 200 ms. Lo swipe muove entrambe le pagine insieme come un carosello. Lo slide sposta la pagina in entrata sopra quella in uscita, che si sposta di un quarto della distanza. Il wipe scopre la pagina in entrata dietro un bordo netto in movimento. Il dip dissolve la pagina in uscita in un colore solido e poi nella pagina in entrata; color è un #RRGGBB opzionale, predefinito #000000, valido solo su dip. I nomi delle direzioni indicano la direzione del movimento: wipe-left è un bordo che si muove verso sinistra. ease è opzionale: linear, in, out o in-out; il predefinito è linear per crossfade e swipe-* e in-out per dip, wipe-* e slide-*; non è consentito su stinger. La pagina in entrata gestisce la propria transizione. La prima pagina di una playlist non ha transizione.

Uno stinger è una grafica a tema a schermo intero che copre la pagina in uscita, sostituisce la pagina in entrata mentre lo schermo è coperto, poi la scopre. Usalo per nominare una sezione di una playlist: mettilo sulla prima pagina della sezione. L’oggetto stinger è obbligatorio per type: "stinger" e non consentito per altri tipi. Tutti i suoi membri sono opzionali. theme è uno tra neomustard (default), cyanotype, propaganda, signal, avant-garde, bloom o primetime, e corrisponde ai temi delle schede. title è fino a 40 caratteri e subtitle fino a 60, impostati nel tipo di visualizzazione del tema. logo è media: più l’id di un’immagine pronta nel progetto, per esempio media:med_01EXAMPLE. accent è un #RRGGBB opzionale che sostituisce l’accento del tema. duration_ms per uno stinger è da 2000 a 6000 e copre tutto il bumper; le durate tipiche sono da 2700 a 4000. Il titolo resta completamente visibile per hang_ms, da 0 a 6000, default 1000 (un secondo), e hang_ms è al massimo il 60% di duration_ms; un hang più lungo richiede un duration_ms più lungo. Un Player che non può disegnare uno stinger riproduce un crossfade della stessa durata. Vedi la pagina live Stinger card per guardare la transizione in azione.

L’esempio seguente mostra una transizione di pagina con stinger:

{ "type": "stinger", "duration_ms": 3500, "stinger": { "theme": "primetime", "title": "BREAKFAST", "subtitle": "Served until 11", "logo": "media:med_01EXAMPLE", "hang_ms": 1000 } }

Un oggetto enter opzionale su un primitivo aggiunge un’animazione oggetto: fade-up, fade-down, fade-left, fade-right, fade-in, zoom-in o zoom-out.

Un oggetto pagina visibility opzionale limita quando la pagina viene riprodotta: un booleano enabled obbligatorio, limiti civili from e until opzionali, e fino a 16 ricorrenze windows di giorni e orari civili. Ogni playlist mantiene almeno una pagina senza alcun campo visibility, e uno schermo che esegue una playlist programmata necessita di un fuso orario. Imposta prima quel fuso orario; screen assign e playlist update rifiutano localmente senza uno e indicano il comando che lo risolve.

Una condizione visibility.data di pagina, {key, path?, equals?}, mostra la pagina solo finché un documento dati della scheda corrisponde: key è una chiave dati della scheda o un ID scheda, path un puntatore RFC 6901 nel documento e equals una stringa, un numero, un booleano o null (omettilo per verificare che il valore esista). La chiave {screen.weather} legge il meteo della posizione propria di ogni schermo, che screen update ID --location LAT,LON imposta: {"enabled":true,"data":{"key":"{screen.weather}","path":"/condition","equals":"rain"}} mostra la pagina solo finché piove dove si trova quello schermo. Il documento meteo ha condition (clear, cloud, fog, rain, snow, storm o wind), band (freezing sotto 0 °C, cold da 0 a 9, mild da 10 a 17, warm da 18 a 24, hot da 25), temperatureC in gradi interi e isDay. È il meteo attuale della cella da 0,25 gradi dello schermo, aggiornato circa ogni ora, non una previsione. Uno schermo senza posizione non mostra mai la pagina, e la pubblicazione rifiuta un path o un equals che il documento non può contenere, come cloudy al posto di cloud. Mantieni una pagina ordinaria senza visibility come alternativa.

Un oggetto audio opzionale di livello superiore aggiunge una colonna sonora che suona continuamente mentre le pagine cambiano. tracks elenca da 1 a 128 voci in ordine di riproduzione, ciascuna con un id unico (il pattern id pagina) e il media_id di un oggetto media audio pronto. loop predefinito è true e ricomincia dalla prima traccia dopo l’ultima; volume predefinito è 1 e varia da 0 a 1, moltiplicato per il volume del Player; cued predefinito è false, e true ferma la colonna sonora dopo ogni traccia così che una traccia suona solo quando una pagina audio_cue la avvia. Una pagina ordinaria può portare audio_cue con un id track da quella lista e un booleano restart opzionale (default false): quando la pagina appare, il Player passa a quella traccia dall’inizio, riavviandola solo se già in riproduzione e restart è true. I cue sono suggerimenti, le pagine adslot non possono portarli, e un cue senza colonna sonora è rifiutato. Una pagina con advance {"mode":"audio_end"} termina quando finisce la traccia che il suo audio_cue nomina, quindi richiede quel cue e una colonna sonora, non prende after_ms, e segue le regole duration per primitiva immagine e video; una primitiva stream necessita ancora di una pagina duration, e un’app sulla pagina non è mai il suo controller; max_ms è un suggerimento opzionale che il server sovrascrive. playlist update sostituisce l’intero documento, quindi omettere audio rimuove la colonna sonora. Composizione colonna sonora.

Schede

Scopri i tipi di scheda, crea un’istanza e aggiorna i suoi dati in tempo reale. Una playlist colloca l’ID della scheda restituito.

screenrig cards list
screenrig cards show gauge
screenrig card create --type gauge --file gauge-params.json
screenrig card list
screenrig card show crd_EXAMPLE
screenrig card params crd_EXAMPLE --file gauge-params.json
screenrig card data get crd_EXAMPLE
screenrig card data put crd_EXAMPLE --file gauge-data.json --expect-rev 1
screenrig card preview crd_EXAMPLE --output gauge.png

Schermi

Uno schermo è un lettore. Questi comandi lo leggono, lo puntano a una playlist e gestiscono la sua vita. Le precondizioni di revisione sono opzionali nelle scritture.

I tag raggruppano gli schermi in flotte. Ogni schermo porta da 0 a 16 tag unici di 1 a 32 lettere o cifre, impostati con screen tag. screen assign, screen reload, screen toast, screen tag e screen screenshot prendono un id schermo, più id o --tag TAG, e una risposta flotta riporta ogni schermo: vedi Risultati flotta.

Le cartelle di schermi raggruppano gli schermi per luogo, una cartella per schermo. Anche un comando di flotta accetta --folder ID: vedi Cartelle di schermi.

screen pair#

Associa un Player con il codice mostrato sul suo schermo.

screenrig screen pair "$PAIRING_CODE" --name "Lobby"

screen list#

Elenca gli schermi. Gli schermi archiviati sono esclusi a meno che non vengano richiesti

screen list [--state archived] [--tag TAG] [--folder ID|root]
ParametroTipoObbligatorioPredefinitoNote
--statestringnoschermi attiviL’unico valore accettato è archived, che elenca solo gli schermi archiviati.
--tag TAGstringnoogni schermoElenca solo gli schermi con questo tag esatto
--folder ID|rootstringnoogni schermoElenca solo gli schermi direttamente dentro questa cartella di schermi sfd_, non quelli delle sue sottocartelle, o con root solo gli schermi fuori da ogni cartella.
screenrig screen list --tag Lobby
screenrig screen list --folder sfd_01EXAMPLEFOLDER000000000

Ogni riga contiene il tags dello schermo. Con --human, la tabella aggiunge una colonna TAGS quando almeno uno degli schermi elencati ha tag.

screen show#

Leggi uno schermo, inclusi revisione, assegnazione e stato online.

screen show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
screenrig screen show scr_01EXAMPLESCREEN00000000

tags elenca i tag della flotta dello schermo. effective_playlist, takeover e playlist_schedule riportano cosa riproduce lo schermo e perché; vedi Programmazioni e takeover. health e le capacità host del Player sono in Salute e alimentazione del dispositivo. online è vero mentre un Player è connesso, inclusa una breve finestra di riconnessione. last_online_at e last_ip opzionali appaiono dopo la prima connessione. observation opzionale riporta le superfici dipinte da un Player: id, width, height, pixel_ratio e presentation. Tutti questi sono di sola lettura; screen update non può inviarli, e uno schermo archiviato restituisce comunque la sua riga.

commands elenca gli ultimi 10 riavvii, ricaricamenti, svuotamenti della cache, riavvii dell'app e aggiornamenti dello schermo, dal più vecchio, ciascuno con il suo type, il suo state (queued, sent, done, failed, expired, cancelled o superseded), il suo source (schedule per un riavvio emesso da una programmazione dei riavvii; assente per uno richiesto da una persona), il suo expires_at e quando è stato inviato o completato. reboot_schedule e next_reboot_at riportano la programmazione dei riavvii dello schermo e l'inizio della sua prossima finestra di riavvio. Uno svuotamento della cache, un riavvio dell'app o un aggiornamento concluso dal Player contiene anche il suo cause e un breve detail, che --human stampa come colonna CAUSE e come riga sotto la tabella. suspension contiene message e since di uno schermo sospeso. Uno schermo archiviato da screen replace riporta replaced_by, lo schermo a cui è passato il suo dispositivo. Con --human, screen show li stampa tutti.

last_outage riporta l’ultima interruzione dello schermo: offline_since, back_at e duration_s e, quando un report di salute la determina, una likely_cause tra device_restart, app_crash, app_restart, network o platform; è assente quando screenRIG non riesce a determinarla. Un riavvio viene stabilito al ritorno dello schermo, mentre una causa di rete o di screenRIG attende il successivo report di salute del Player, che può richiedere fino a quindici minuti. glass contiene i verdetti che screenRIG ha tratto dai report di riproduzione e dagli screenshot dello schermo. Con --human, screen show stampa Last outage e Likely cause, e Playlist stalled, Blank screen o Frozen picture per un verdetto che ha trovato un problema; Notifiche dice cosa i verdetti lasciano fuori.

screen update#

Modifica nome schermo, assegnazione playlist o fuso orario in una sola chiamata.

screen update <id> [--name NAME] [--playlist-id ID] [--timezone ZONE] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--name NAMEstringnoinvariatoNome schermo.
--playlist-id IDstringnoinvariatoLa playlist pl_ che questo schermo dovrebbe eseguire.
--timezone ZONEstringnoinvariatoUn identificatore di zona IANA come America/Los_Angeles. Validato contro il database zone del server. Una patch non cancella mai una zona.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen update scr_01EXAMPLESCREEN00000000 --name "Lobby"

In revisione, una modifica solo a --playlist-id è proposta come screen assign; una sessione Proponi non può modificare gli altri campi.

screen publish#

Crea una nuova playlist da un file preparato e assegnala a uno schermo.

screen publish <id> <file> [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
<file>pathsìnessunoIl documento della playlist preparato, o - per stdin.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione schermo. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig screen publish scr_LOBBY lobby.json

Questo crea una nuova playlist e la assegna. Non aggiorna una playlist esistente per nome. Controlla prima il documento preparato. Ripeti l’input identico per riprendere un errore ambiguo. La lettura dell’assegnazione non prova la riproduzione; richiedi uno screenshot separatamente. In revisione restituisce stage: pending_review con entrambe le revisioni. Vedi Prepara, pubblica e modifica playlist.

screen assign#

Indirizza uno schermo, o una flotta di schermi, a una playlist.

screen assign (<id>... | --tag TAG) --playlist-id ID [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_. Diversi ID vengono eseguiti come una singola richiesta flotta.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--playlist-id IDstringsìnessunoLa playlist pl_ da eseguire.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale. Ometti per scrivere la risorsa corrente. Un valore stale fornito è revision_conflict: rifetch, reapply, retry.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig screen assign scr_01EXAMPLESCREEN00000000 --playlist-id pl_01EXAMPLEPLAYLIST000000
screenrig screen assign --tag Lobby --playlist-id pl_01EXAMPLEPLAYLIST000000

Se la playlist programma qualsiasi pagina e lo schermo non ha fuso orario, il CLI rifiuta prima di inviare qualsiasi cosa e indica il comando screen set-timezone da eseguire. Nessuna revisione è consumata da quel rifiuto. In una flotta, ogni schermo applica quella regola da solo: uno schermo senza fuso orario fallisce nel suo risultato e gli altri sono assegnati.

Per pubblicare su una flotta, crea la playlist una volta con playlist create, poi esegui screen assign --tag TAG --playlist-id ID. screen publish punta a uno schermo.

screen set-timezone#

Imposta il fuso orario civile in cui viene letta una playlist programmata.

screen set-timezone <id> --timezone ZONE [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--timezone ZONEstringsìnessunoUn identificatore di zona IANA come Europe/Berlin.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen set-timezone scr_01EXAMPLESCREEN00000000 --timezone America/Los_Angeles

Gli orari pagina sono orari civili, quindi privi di significato senza una zona. Cambiare la zona rinnova la revisione del manifesto.

screen archive#

Nascondi uno schermo e scurisci il vetro.

screen archive <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen archive scr_01EXAMPLESCREEN00000000

L’archiviazione nasconde lo schermo dall’elenco predefinito e scurisce il vetro. Non dissocia il lettore.

screen unarchive#

Ripristina uno schermo archiviato nella lista predefinita.

screen unarchive <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen unarchive scr_01EXAMPLESCREEN00000000

Un Player può anche archiviare il proprio schermo: un reset confermato su un Player che detiene una chiave, o la dissociazione di un Player browser associato tramite cookie. screen show quindi segnala archive_reason come device_reset o device_unpair (project per un archivio richiesto), con archived_at. Lo schermo mantiene il suo vincolo dispositivo per ogni motivo, quindi un Player che ancora detiene quella chiave o cookie dispositivo resta spento e riprende su ripristino senza nuova associazione. Il Player che è stato resettato o dissociato perde la sua chiave o cookie e si associa di nuovo come nuovo schermo. Una chiave sostituita da un recupero schermo confermato resta ritirata.

Uno schermo archiviato come replaced da screen replace non mantiene alcun vincolo dispositivo, quindi il ripristino dall’archivio lo rifiuta e screen delete lo rimuove.

screen suspend#

Mostra un avviso su uno schermo al posto dei suoi contenuti, finché non viene ripreso.

screen suspend <id> --message TEXT [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--message TEXTstringsìnessunoL’avviso che lo schermo mostra: da 1 a 280 caratteri dopo il trim. Il ritorno a capo è l’unico carattere di controllo, e il Player manda a capo il testo e ne mantiene i ritorni a capo.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen suspend scr_01EXAMPLESCREEN00000000 --message "Closed for stocktake. Back at 9am."

Uno schermo sospeso mostra il messaggio al posto dei suoi contenuti. Non cambia nient’altro: la sua playlist, la programmazione, il takeover e il controllo del display restano al loro posto e continuano a evolversi, e screen resume mostra ciò che lo schermo starebbe mostrando ora. screen show riporta suspension con message e since; sospendere uno schermo già sospeso sostituisce il messaggio e mantiene since. Sospendere aggiorna la revisione dello schermo, e il Player recupera subito i dati aggiornati. Uno schermo archiviato risponde screen_archived.

screen resume#

Termina la sospensione di uno schermo così che torni a mostrare i propri contenuti.

screen resume <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen resume scr_01EXAMPLESCREEN00000000

Riprendere mostra di nuovo i contenuti propri dello schermo, a partire da ciò che lo schermo starebbe mostrando ora, e il Player recupera subito i dati aggiornati. Uno schermo non sospeso risponde invariato, senza cambio di revisione. Uno schermo archiviato risponde screen_archived.

screen delete#

Elimina uno schermo.

screen delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen delete scr_01EXAMPLESCREEN00000000

Eliminare rimuove uno schermo solo finché nessuna chiave Player è associata ad esso, e screen show riporta deletable: true per quello schermo. Un Player che si associa tramite codice, nativo o browser, detiene una chiave, e la chiave resta associata al suo schermo: eliminare quello schermo risponde 409 screen_archive_required (codice di uscita 5); archiviarlo invece. Solo un Player browser associato tramite cookie non detiene alcuna chiave, e il suo schermo si elimina sia che sia associato sia che sia ancora in attesa.

screen replace#

Sposta su questo schermo il dispositivo associato come un altro schermo, mantenendo le impostazioni e la cronologia di questo schermo.

screen replace <id> --with ID [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLo schermo scr_ da mantenere.
--with IDstringsìnessunoLo schermo scr_ il cui dispositivo associato subentra. Deve essere un altro schermo del progetto.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione sullo schermo da mantenere. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen replace scr_01EXAMPLESCREEN00000000 --with scr_01EXAMPLENEWSCREEN000000

Associa prima il nuovo hardware come schermo a sé stante, poi sostituisci. La chiave del dispositivo, o la credenziale di un Player browser, ora apre <id>, che mantiene nome, tag, fuso orario, playlist, programmazioni, takeover, programmazione display e override, video wall, commenti, campi, posizione e cronologia, e prende l’host e il Player dello schermo sostitutivo. Salute, stato, spazio di archiviazione e comandi in coda ricominciano da zero. Lo schermo indicato da --with viene archiviato con archive_reason replaced e replaced_by che indica <id>. Non mantiene alcun vincolo dispositivo, quindi screen unarchive non può ripristinarlo e screen delete lo rimuove. La chiave che <id> deteneva viene ritirata dopo una finestra di grazia di quindici minuti, poi il suo vecchio dispositivo viene rifiutato. Entrambi gli schermi devono essere attivi con un Player associato: uno schermo ancora in attesa di associazione risponde resource_conflict, uno archiviato risponde screen_archived, e un video wall richiede un Player sostitutivo che dichiara display.wall (wall_unsupported). La richiesta porta sempre una chiave di idempotenza, e un retry esatto restituisce la risposta originale.

screen rotate-public-id#

Emettere un nuovo ID pubblico per uno schermo.

screen rotate-public-id <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen rotate-public-id scr_01EXAMPLESCREEN00000000

screen reload#

Chiedi al lettore di uno schermo, o a tutti i lettori di una flotta, di ricaricare una volta.

screen reload (<id>... | --tag TAG) [--expires-in DURATION] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_. Diversi ID vengono eseguiti come una singola richiesta flotta.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--expires-in DURATIONstringno24h, applicato dal serverQuanto a lungo la richiesta attende che uno schermo offline torni online: 90s, 30m, 2h o 1d, da 60s a 24h.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen reload scr_01EXAMPLESCREEN00000000
screenrig screen reload scr_01EXAMPLESCREEN00000000 --expires-in 2h
screenrig screen reload --tag Lobby

La risposta include un reload_id, un state e un expires_at. Uno schermo online riceve subito la ricarica (state sent); uno schermo offline la mantiene in stato queued e la riceve quando torna online prima di expires_at, 24 ore dopo la richiesta salvo diversa indicazione in --expires-in. Una ricarica più recente sostituisce quella ancora in coda, screen show elenca i commands dello schermo e screen command cancel annulla una ricarica ancora in coda. In una flotta, il reload di ogni risultato contiene lo stesso state. Un Player web si ricarica al prossimo cambio pagina; un Player nativo si ricollega, recupera il manifesto e verifica aggiornamenti. Un Player ignora una ricarica entro dieci minuti dall’ultima eseguita. La ricarica funziona su schermi attivi e archiviati e non cambia la revisione dello schermo.

screen toast#

Invia un messaggio transitorio come stage chrome su uno schermo live o una flotta.

screen toast (<id>... | --tag TAG) --text TEXT [--level info] [--duration-ms MS]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_. Diversi ID vengono eseguiti come una singola richiesta flotta.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--text TEXTstringsìnessunoDa uno a 120 caratteri, interruzione solo a capo, massimo tre righe.
--level LEVELstringnoinfoinfo, alert o error. Il Player ospitato mostra notifiche di errore. Info e alert sono livelli diagnostici che possono essere soppressi; il successo del comando non garantisce visibilità.
--duration-ms MSintegerno10.000, applicati dal serverTra 2000 e 60000 se fornito.
screenrig screen toast scr_01EXAMPLESCREEN00000000 --text "Lobby closed"
screenrig screen toast --tag Lobby --text "Closing in ten minutes"

Un toast non è un primitivo: non occupa slot canvas, non ha layer e non partecipa a readiness o crossfade. Vince l’ultimo, non c’è coda né annulla, e l’involucro accettato è solo { expires_at }. Non mettere mai credenziali o altri materiali segreti nel testo.

screen identify#

Mostra il nome di uno schermo sopra i suoi contenuti per un po’, così da trovarlo in loco.

screen identify <id> [--duration DURATION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--duration DURATIONstringno60s, applicato dal serverQuanto a lungo resta visibile la sovrapposizione, contando da quando il Player riceve la richiesta: 30s, 2m o 1m30s, da 2s a 10m.
screenrig screen identify scr_01EXAMPLESCREEN00000000
screenrig screen identify scr_01EXAMPLESCREEN00000000 --duration 2m

Il Player disegna una sovrapposizione a schermo intero sopra i propri contenuti, con il nome dello schermo molto grande e il suo ID in piccolo sotto. La riproduzione continua al di sotto, e un’identificazione più recente sostituisce la sovrapposizione. La busta accettata contiene identify_id, duration_ms e un expires_at 60 secondi dopo la richiesta, così uno schermo offline non la mostra mai in seguito. Solo un Player che dichiara la capacità identify mostra la sovrapposizione: qualsiasi altro schermo risponde 409 identify_unsupported (codice di uscita 5) e non viene inviato nulla, quindi aggiorna il Player o mostra il nome con screen toast. Uno schermo archiviato risponde screen_archived e uno schermo ancora in attesa di associazione risponde resource_conflict. Identificare non cambia la revisione dello schermo.

screen screenshot#

Cattura un fermo immagine di uno schermo attivo, o di ogni schermo in una flotta, e scrivilo su disco.

screen screenshot <id> [--output FILE] [--timeout MS] [--poll-ms MS]
screen screenshot (<id> <id>... | --tag TAG) [--output DIRECTORY] [--concurrency N] [--timeout MS] [--poll-ms MS]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag, senza limite al numero di schermi.
--output FILEpathno./<id>.webpPer uno schermo, un percorso file; un file esistente viene sovrascritto senza richiesta. Per più ID o --tag, una directory, creata se mancante, che riceve un <screen_id>.webp per schermo.
--concurrency Nintegerno4Catture in corso contemporaneamente per diversi ID o --tag, da 1 a 8.
--timeout MSintegerno35000Quanto tempo attendere per la cattura.
--poll-ms MSintegerno500Intervallo tra i poll di stato cattura.
screenrig screen screenshot scr_01EXAMPLESCREEN00000000 --output ./lobby.webp
screenrig screen screenshot --tag Lobby --output ./lobby-shots

Il comando blocca finché il WebP non è su disco; non esiste --no-wait. La busta riporta screen_id, capture_id, path, bytes, sha256, width e height, e mai i byte immagine. Vince l’ultimo: una richiesta successiva sostituisce una cattura in corso. Uno screenshot del Player web disegna ogni pagina iframe come un riquadro grigio scuro con l’etichetta «Embedded web page» e ogni applicazione come si renderizza da sola; l’immagine non porta alcun segno del riquadro, quindi non prova che una pagina iframe sia stata renderizzata.

Per più ID o --tag, la risposta è un risultato flotta con action: "screenshot", il selector, e la directory output; ogni risultato ok contiene path, bytes, sha256, width e height. Con --tag, la CLI elenca prima gli schermi taggati, seguendo ogni pagina di elenco; ogni pagina è fatturata e le catture sono gratuite, e più ID non richiedono elenco. --idempotency-key è rifiutato in questa forma, perché ogni cattura usa la propria chiave. Se una cattura fallisce inaspettatamente, il risultato di quello schermo è unexpected_error, non iniziano nuove catture, gli schermi in attesa riportano not_attempted e il codice di uscita è 1.

screen tag#

Imposta, aggiungi, rimuovi o cancella i tag su uno schermo o una flotta.

screen tag (<id>... | --tag TAG) (--set TAGS | --add TAGS | --remove TAGS | --clear) [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_. Diversi ID vengono eseguiti come una singola richiesta flotta.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--set TAGSstringesattamente un’azionenessunoSostituisci l’intero set con questi tag separati da virgola, come Lobby,Floor2.
--add TAGSstringesattamente un’azionenessunoAggiungi questi tag separati da virgola.
--remove TAGSstringesattamente un’azionenessunoRimuovi questi tag separati da virgola.
--clearbooleanesattamente un’azionespentoRimuovi ogni tag.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen tag scr_01EXAMPLESCREEN00000000 --set Lobby,Floor2
screenrig screen tag scr_01EXAMPLESCREEN00000000 --add Spring
screenrig screen tag --tag Lobby --add Spring

Un tag è da 1 a 32 lettere o cifre, e uno schermo porta al massimo 16 tag unici. I tag selezionano flotte; non sono mai autorizzazione e non raggiungono mai il Player. Cambiare i tag aggiorna la revisione dello schermo, non quella del manifesto. Per uno schermo l’involucro è lo schermo aggiornato. --add e --remove leggono prima lo schermo e scrivono il nuovo set protetto da --expect-rev o dalla revisione appena letta, così un cambiamento concorrente restituisce revision_conflict (exit 6) invece di essere sovrascritto; rilancia il comando. In una flotta, --add e --remove si applicano atomicamente contro il set memorizzato di ogni schermo, e uno schermo che supererebbe 16 tag fallisce nel proprio risultato con invalid_request.

Ovunque i tag cambino (screen tag, un aggiornamento dello schermo tramite l'API, l'editor di tag della dashboard), il levels della risposta elenca, sotto gained e lost, le campagne il cui pubblico di tag lo schermo ha raggiunto o lasciato, ciascuna con il suo source (campaign), il suo id, il conteggio di screens e, quando la campagna ha una copertura, reach_before e reach_after. Un screen tag di flotta li somma sulla flotta. Leggi levels.lost prima di considerare innocua una modifica di tag: rimuovere l'ultimo tag corrispondente dagli schermi di una campagna svuota quel gruppo e fa scattare le notifiche reach_dropped e group_empty.

Risultati flotta

Con più ID schermo o --tag, screen assign, screen reload, screen toast e screen tag eseguono un’azione misurata senza limite sul numero di schermi. Il CLI segue automaticamente le pagine di risultato limitate, attende quando i budget di controllo sono esauriti e mantiene la stessa chiave e fleet selezionata. --tag seleziona solo schermi attivi; gli ID possono indicare qualsiasi schermo. Un singolo ID schermo mantiene la risposta a schermo singolo. I comandi fleet non accettano --expect-rev perché le protezioni di revisione sono per schermo. Ogni comando fleet ha una chiave di idempotenza. Dopo una richiesta interrotta, come una connessione persa, rieseguire lo stesso comando per riprodurre gli schermi completati senza ripetere gli effetti collaterali. Dopo una risposta definitiva con errori, riprovare solo gli ID falliti: rieseguire l’intero comando agisce su ogni schermo di nuovo. Riutilizzare lo stesso --idempotency-key esplicito entro 24 ore restituisce la risposta registrata invece.

La busta mantiene ok: true. Il successo parziale è una risposta normale, non un errore di trasporto:

{
  "ok": true,
  "data": {
    "action": "reload",
    "matched": 3, "succeeded": 2, "failed": 1,
    "results": [
      { "screen_id": "scr_LOBBY", "status": "ok", "reload": { "reload_id": "…", "expires_at": "…", "state": "sent" } },
      { "screen_id": "scr_GONE", "status": "failed", "problem": { "code": "not_found", "status": 404 } },
      { "screen_id": "scr_ENTRANCE", "status": "ok", "reload": { "reload_id": "…", "expires_at": "…", "state": "queued" } }
    ]
  },
  "warnings": [{ "code": "fleet_partial_failure", "message": "1 of 3 screens failed; 2 succeeded." }]
}

Un risultato ok contiene il risultato per singolo schermo: revision per assign, revision e tags per modifiche tag, reload per ricarica e toast per toast. Un risultato failed contiene il problema che la richiesta dello schermo avrebbe restituito. I limiti per schermo si applicano ancora dentro un’azione di flotta, quindi una ricarica o un toast di flotta può riportare rate_limited per uno schermo appena ricaricato o con toast; riprovare quell’id schermo più tardi. I limiti per schermo sono 6 ricariche e 20 toast al minuto. Le ricariche e i toast di flotta consumano anche un budget organizzazione di 600 schermi al minuto: il server si mette in pausa quando il budget residuo è esaurito, e la CLI rispetta Retry-After prima di continuare automaticamente.

RisultatoCodice uscitaAvviso
Ogni schermo abbinato ha avuto successo0nessuno
Alcuni o tutti gli schermi hanno fallitoIl codice del primo schermo fallito, come 4 per not_found o 6 per revision_conflictfleet_partial_failure
Nessuno schermo corrisponde0fleet_no_match
Selettore o azione malformati2 o il codice della richiesta; nessuna modifica allo schermonessuno

Cartelle schermi

Una cartella di schermi organizza gli schermi per luogo. L’id di una cartella inizia con sfd_, e uno schermo sta al massimo in una cartella, riportata come folder_id in screen show e screen list e assente alla radice del progetto. Un’organizzazione contiene al massimo 1000 cartelle in tutti i suoi progetti, annidate fino a 10 livelli, con nomi da 1 a 100 caratteri univoci tra le cartelle sorelle. I tag restano per i gruppi che attraversano i luoghi.

screen folder list
screen folder show <id>
screen folder create --name NAME [--parent ID] [--default-playlist-id ID]
screen folder update <id> [--name NAME] [--parent ID | --root] [--default-playlist-id ID | --clear-default] [--expect-rev REVISION]
screen folder delete <id> [--expect-rev REVISION]
screen move <id>... (--folder ID | --root)
screenrig screen folder create --name "North Tower"
screenrig screen folder create --name "Level 2" --parent sfd_01EXAMPLEFOLDER000000000 --default-playlist-id pl_01EXAMPLEPLAYLIST000000
screenrig screen move scr_01EXAMPLESCREEN00000000 --folder sfd_01EXAMPLEFOLDER000000000

screen folder list restituisce tutte le cartelle in data.items con id, name, parent_id (null alla radice del progetto), default_playlist_id se impostato, screens (gli schermi attivi direttamente al suo interno) e revision. screen move accetta id di schermi e di cartelle in qualsiasi combinazione, al massimo 1000 in un’unica richiesta tutto o niente; una cartella si sposta con tutto il suo contenuto e non può essere spostata dentro se stessa né dentro una cartella che contiene. screen list --folder ID elenca solo gli schermi direttamente dentro una cartella.

Su ogni comando di flotta che accetta --tag TAG, --folder ID seleziona ogni schermo attivo di quella cartella e di ogni cartella al suo interno. Una campagna accetta lo stesso: --folder ID su campaign create e campaign update, oppure una regola {"folder":"sfd_…"} in --audience, che si combina con le regole di tag come in {"all":[{"folder":"sfd_BUILDING"},{"tag":"overhead"}]}.

La playlist predefinita di una cartella è ciò che i suoi schermi mostrano quando non hanno una playlist propria. Vince la cartella più vicina sopra uno schermo che ne imposta una, e effective_playlist riporta source folder con l’id della cartella come entry_id. Un takeover, una campagna, una programmazione e la playlist assegnata allo schermo stesso hanno tutti la precedenza su di essa; vedi Programmazioni e takeover. La playlist deve essere approvata (playlist_not_approved, exit 5).

Spostare schermi o una cartella, o cambiare la playlist predefinita di una cartella, risolve di nuovo gli schermi interessati entro circa 15 secondi. Il levels della risposta elenca, sotto gained e lost, le campagne il cui pubblico di cartella quegli schermi hanno raggiunto o lasciato e le playlist predefinite di cartella che hanno iniziato o smesso di mostrare, ciascuna con il suo source (campaign o folder), il suo id e il conteggio di screens. Eliminare una cartella non elimina nulla al suo interno: i suoi schermi e le sue cartelle salgono nella cartella superiore, e resource_conflict (exit 5) rifiuta l'eliminazione finché il pubblico di una campagna nomina la cartella. L'eliminazione risponde con 200 con levels, come uno spostamento.

Le scritture richiedono l’accesso Gestisci e non attendono mai revisione: una sessione Propose risponde con 403 insufficient_access. Ogni scrittura aggiunge screen.folder_created, screen.folder_updated, screen.folder_deleted o screen.moved agli eventi del progetto.

Programmazioni e takeover

Le campagne di uno schermo e le voci di programmazione della playlist sono livelli di un unico stack. Il server decide cosa riproduce ogni schermo partendo dall’alto: il suo takeover, le campagne che lo raggiungono (prima --priority, poi la più recente), le voci di programmazione proprie dello schermo in ordine, la playlist assegnata con screen assign, poi la playlist predefinita della cartella schermi più vicina che ne imposta una. Riproduce il primo livello valido. I passaggi avvengono entro circa un minuto da un confine e i Player non richiedono aggiornamenti. Un foglio di righe di programmazione per molti schermi si importa in un solo passaggio: vedi Importazione programmazione.

Un livello è in vigore finché lo sono tutte le sue regole: from e until, windows settimanali, regole monthly, dates, date except, una condizione data e una condizione interaction. Una regola monthly è un day del mese (da 1 a 31; un mese senza quel giorno la salta) oppure il giorno della settimana di posizione nth (da 1 a 4, o -1 per l’ultimo) con un weekday; una voce dates è una singola date; entrambe accettano orari start e end facoltativi e altrimenti coprono l’intera giornata. Una data except rimuove ogni occorrenza che inizia in quel giorno, compresi i prolungamenti notturni, e un’occorrenza notturna appartiene alla data in cui inizia. data è {key, path?, equals?} ed è in vigore finché quei dati della scheda esistono o sono uguali allo scalare. interaction è {idle_s} (da 5 a 3600, 60 per impostazione predefinita): il livello viene riprodotto finché qualcuno usa lo schermo con un tocco o un clic e torna indietro dopo idle_s secondi senza input, come una pagina interattiva sopra un loop promozionale. displays elenca le uscite del video wall (da 1 a 12) su cui viene riprodotto il livello. start è next_item (predefinito), che attende la fine dell’elemento corrente, oppure on_time, che lo interrompe nell’istante esatto. Un lettore che risolve il proprio stack riproduce i livelli interaction, data e displays; campaign explain segnala il livello per qualsiasi altro lettore come off con il motivo stack_only (richiede un lettore che risolve il proprio stack).

screen show, screen list e ogni comando sottostante restituiscono effective_playlist ({id, source, entry_id?, until?}, dove source è takeover, campaign, schedule, default o folder), takeover e playlist_schedule. entry_id è l’id della campagna per campaign, l’id della voce per schedule e l’id della cartella per folder. until è il momento successivo in cui si sa che la scelta cambia. screen show --human la stampa nel fuso orario dello schermo, come in Assigned: pl_LUNCH (schedule entry lunch until 2026-08-14 15:00 America/Los_Angeles) o Assigned: pl_LUNCH (campaign cmp_LUNCH until 2026-08-14 15:00 America/Los_Angeles) (UTC, etichettato, quando lo schermo non ha fuso); l’output JSON mantiene istanti RFC 3339. Le tabelle orarie umane sono etichettate con il fuso dello schermo, e screen list --human aggiunge una colonna ASSIGNED quando uno schermo elencato riproduce qualcosa di diverso dalla sua playlist predefinita.

Codice problemaEsciSignificato
invalid_request8Lo schermo non ha una playlist predefinita assegnata (next è screen assign), una programmazione indirizza uno schermo senza fuso orario (next è screen set-timezone) o non si può assegnare una playlist nominata.
screen_archived5Uno schermo archiviato rifiuta schedule e takeover. next è screen unarchive.
revision_conflict6La revisione --expect-rev era obsoleta.
rate_limited7La programmazione e le scritture di takeover condividono limiti per minuto: 600 per organizzazione, 20 per schermo e 60 per IP. Attendere retry_after_seconds.

Con un ID schermo, questi comandi restituiscono lo schermo aggiornato e --expect-rev protegge la sua revisione. Più ID o --tag eseguono come una richiesta fleet con envelope e regole di uscita; ogni schermo fallisce da solo, e il CLI si mette in pausa e riprende automaticamente quando il budget del progetto è esaurito.

screen schedule show#

Mostra la programmazione della playlist di uno schermo e la playlist attualmente selezionata.

screen schedule show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
screenrig screen schedule show scr_CAFE

L’output JSON può tornare direttamente a screen schedule set --file.

screen schedule set#

Sostituisci la programmazione playlist su uno schermo o una fleet.

screen schedule set (<id>... | --tag TAG) --file FILE [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--file FILEpathsìnessunoIl documento di programmazione, o - per stdin.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig screen schedule set scr_CAFE --file dayparts.json
screenrig screen schedule set --tag Cafe --file dayparts.json

Ogni playlist nominata da una programmazione è validata come assegnazione, e lo schermo necessita di un fuso orario e una playlist predefinita assegnata. Quando nessuna voce è in vigore, si riproduce la playlist assegnata. Se una playlist programmata non può più essere mostrata, le sue voci sono saltate e screen.playlist_unavailable è registrato.

screen schedule clear#

Rimuovi la programmazione playlist da uno schermo o una flotta.

screen schedule clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig screen schedule clear --tag Cafe

screen schedule preview#

Mostrare cosa cambierebbe sostituire il programma di playlist di uno schermo, senza farlo.

screen schedule preview <id> --file FILE [--calendar-from INSTANT] [--calendar-to INSTANT]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--file FILEpathsìnessunoIl documento del programma come lo accetta screen schedule set, oppure - per stdin. Si accetta di ritorno il JSON di screen schedule show.
--calendar-from INSTANTstringnooraAvvia i calendari in questo istante con fuso, ad esempio 2026-12-01T00:00:00Z.
--calendar-to INSTANTstringnouna settimana dopo l’inizioTermina i calendari in questo istante con fuso, al massimo 93 giorni dopo l’inizio.
screenrig screen schedule preview scr_LOBBY --file dayparts.json
screenrig screen schedule preview scr_LOBBY --file dayparts.json --calendar-from 2026-12-01T00:00:00Z --calendar-to 2027-01-01T00:00:00Z

Non viene scritto nulla. Le voci sono controllate come le controlla screen schedule set, perciò un’anteprima rifiuta ciò che rifiuta il set. data.gained e data.lost dicono se lo schermo guadagnerebbe o perderebbe livelli del suo programma; una voce con "paused": true non è su alcuno schermo, quindi pubblicarla la guadagna. data.calendar.before e data.calendar.after sono il calendario dello schermo com’è e come sarebbe da --calendar-from a --calendar-to.

screen schedule revisions#

Elenca le revisioni del programma di playlist di uno schermo, la più recente per prima.

screen schedule revisions <id> [--after CURSOR]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--after CURSORstringnola prima paginaContinua dal data.next_cursor della pagina precedente.
screenrig screen schedule revisions scr_LOBBY
screenrig screen schedule revisions scr_LOBBY --after CURSOR

data.items contiene al massimo 50 revisioni, ciascuna con revision (la revisione dello schermo alla scrittura, perciò i numeri hanno lacune dove lo schermo è cambiato in altro modo), created_at, change, current, author quando noto e entries, l’intero programma dopo quella scrittura (none significa che lo schermo non aveva un programma). change è edited (un set, un clear o un’importazione di programmi), restored (una copia della revisione precedente indicata da restored_from) oppure baseline. Finché data.next_cursor è una stringa, restano revisioni più vecchie: esegui di nuovo il comando con --after impostato su quel valore. Le revisioni vanno via con l’eliminazione definitiva dello schermo. Basta l’accesso in sola lettura.

screen schedule restore#

Rimettere su uno schermo il programma di una revisione precedente copiandolo in avanti.

screen schedule restore <id> --revision N [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--revision NintegersìnessunoLa revisione da copiare in avanti, come la numera screen schedule revisions.
--expect-rev REVISIONstringnola revisione appena lettaRichiedi questa revisione corrente dello schermo, non N. Senza, la CLI legge lo schermo subito prima della scrittura e invia quella revisione; una modifica nel frattempo è revision_conflict (exit 6).
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig screen schedule restore scr_LOBBY --revision 4
screenrig screen schedule restore scr_LOBBY --revision 4 --expect-rev 9

Le voci della revisione N diventano il programma dello schermo, la stessa scrittura di screen schedule set con quelle voci (o screen schedule clear se quella revisione non ne aveva), controllate come lo sono ora: una playlist eliminata nel frattempo la rifiuta. Con accesso Propose, o in un progetto che richiede revisione per le modifiche degli agenti, il ripristino attende una persona come il set, e sullo schermo non cambia nulla finché non lo approva. Le revisioni precedenti restano com’erano.

screen takeover#

Mostra una playlist su uno schermo o una flotta prima delle campagne, della programmazione e dell’assegnazione.

screen takeover [set] (<id>... | --tag TAG) --playlist-id ID [--until TIME | --for DURATION] [--reason TEXT] [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--playlist-id IDstringsìnessunoLa playlist pl_ da mostrare.
--until TIMEstringnoin attesa di cancellazioneUn istante RFC 3339 rigoroso con secondi e offset, nella forma YYYY-MM-DDTHH:MM:SSZ o YYYY-MM-DDTHH:MM:SS-07:00, inviato normalizzato in UTC; rigorosamente futuro e al massimo 7 giorni avanti. Oppure none per trattenere fino a screen takeover clear.
--for DURATIONstringnoin attesa di cancellazione30m, 2h o 3d, fino a 6d23h59m, convertito in un until dall’orologio di questo computer. 7d è rifiutato localmente; usa --until per un’intera settimana. Non con --until.
--reason TEXTstringnonessunoUna nota operatore sul takeover e i suoi eventi. Tagliata, massimo 120 caratteri, senza caratteri di controllo.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig screen takeover scr_LOBBY --playlist-id pl_DRILL --for 30m --reason "Fire drill"
screenrig screen takeover --tag Lobby --playlist-id pl_LAUNCH --for 2h
screenrig screen takeover scr_A scr_B --playlist-id pl_NOTICE --until none

screen takeover ID è l’abbreviazione di screen takeover set ID. Un nuovo takeover sostituisce quello precedente. Quando termina, lo schermo torna automaticamente a una campagna in vigore, al suo programma o alla playlist assegnata. Un takeover la cui playlist non può essere mostrata termina. Una riesecuzione --for dopo un errore ambiguo calcola una nuova fine ed è inviata come nuova richiesta.

screen takeover clear#

Termina il takeover su uno schermo o una flotta.

screen takeover clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
--note TEXTstringnonessunoUna nota per la persona che revisiona la modifica: testo semplice, massimo 280 caratteri. Ignorata se la modifica si applica subito.
screenrig screen takeover clear --tag Lobby

Il file di programmazione

Un programma elenca da 1 a 32 voci in ordine di priorità; vince la prima voce in vigore. Una voce imposta almeno una regola di un livello: windows, monthly, dates, except, data, interaction, from o until, e facoltativamente displays, start e paused. windows ha da 1 a 16 elementi nel fuso orario dello schermo: days usa mon a sun, e start e end sono HH:MM; ometti entrambi per tutto il giorno. Un end a o prima di start attraversa la mezzanotte e appartiene al giorno di inizio. from (inclusivo) e until (esclusivo) facoltativi sono minuti civili come 2026-12-24T18:00, senza offset. Un id omesso diventa entry_N. Una voce con "paused": true è una bozza: non è nello stack di alcuno schermo, screen schedule show la contrassegna e il calendario la disegna tratteggiata. Invia di nuovo il programma senza paused per pubblicarla. La CLI verifica questa forma prima di inviare qualsiasi cosa. Fasce orarie per colazione, pranzo e cena:

{
  "entries": [
    { "id": "breakfast", "playlist_id": "pl_BREAKFAST",
      "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "06:00", "end": "11:00" },
                  { "days": ["sat", "sun"], "start": "08:00", "end": "12:00" }] },
    { "id": "lunch", "playlist_id": "pl_LUNCH",
      "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "11:00", "end": "15:00" }] },
    { "id": "dinner", "playlist_id": "pl_DINNER",
      "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], "start": "17:00", "end": "22:00" }] }
  ]
}

Un menu che viene riprodotto finché qualcuno usa lo schermo, sopra un brunch della prima domenica che salta una data:

{
  "entries": [
    { "id": "browse", "playlist_id": "pl_MENU", "interaction": { "idle_s": 90 } },
    { "id": "brunch", "playlist_id": "pl_BRUNCH",
      "monthly": [{ "nth": 1, "weekday": "sun", "start": "10:00", "end": "14:00" }],
      "except": ["2026-12-06"] }
  ]
}

Un programma playlist sceglie tra playlist; la pagina visibility dentro una playlist sceglie ancora tra le sue pagine.

Programmazione e takeover eventi

events list e events follow stampano screen.playlist_switched (playlist_id, previous_playlist_id, source, entry_id, until), screen.takeover_started (playlist_id, until, dove none significa trattenuto fino a cancellazione, e reason), screen.takeover_ended (reason expired, cleared, replaced, playlist_deleted, o playlist_unavailable), e l’avviso screen.playlist_unavailable (playlist_id, entry_ids, e code playlist_deleted o playlist_unavailable).

Eliminare una playlist che può ancora essere mostrata da qualsiasi schermo, inclusi quelli archiviati, fallisce con resource_conflict (exit 5): assegnata, nominata da una voce di programmazione, trattenuta da un takeover, mostrata da una campagna o effettiva. next punta a screen list.

Campagne

Una campagna commuta ogni schermo di un pubblico su una playlist finché sono in vigore le sue regole, e lo fa tornare indietro quando cessano. Una campagna trasmette i menu del pranzo in ogni negozio north, e anche uno schermo taggato north in un secondo momento la riceve. Senza alcuna regola impostata è sempre in vigore.

Per ogni schermo il server sceglie il suo takeover, altrimenti la prima campagna in vigore (--priority da 0 a 100, prima il valore più alto, poi la più recente), altrimenti la programmazione playlist, altrimenti la playlist assegnata; vedi Programmazioni e takeover per lo stack e le regole. Una campagna raggiunge uno schermo che ha una playlist predefinita (screen assign). Una con una regola di data o di orario necessita anche del fuso orario dello schermo (screen set-timezone), perché sono orari civili letti nel fuso orario proprio di ogni schermo. Gli schermi cambiano entro circa un minuto, e i lettori non necessitano di aggiornamenti.

Una campagna in pausa è una bozza: non è su alcuno schermo finché campaign publish non la pubblica, volendo prima su una cartella di prova o su pochi schermi di prova, e poi campaign promote le dà il suo pubblico. campaign preview mostra una modifica prima che venga fatta, e campaign revisions e campaign restore conservano e ripristinano le versioni precedenti. Le stesse bozze, anteprime e cronologia esistono per le voci di programma qui sotto; vedi bozze, prova e promozione, cronologia.

I comandi di campagna usano la capacità screens. Le scritture richiedono l’accesso Gestisci e non attendono mai revisione: una sessione Propose risponde con 403 insufficient_access. Un’organizzazione ha al massimo 100 campagne in tutti i suoi progetti (campaign_limit_reached, exit 5), e la playlist deve essere approvata (playlist_not_approved, exit 5). Ogni scrittura aggiunge campaign.created, campaign.updated o campaign.deleted agli eventi del progetto, e uno schermo che una campagna sposta registra screen.playlist_switched con source campaign e l’id della campagna come entry_id. ads campaigns acquistano tempo pubblicitario su altri schermi e sono una risorsa diversa.

campaign list#

Elenca le campagne del progetto nell’ordine in cui gli schermi le leggono.

campaign list

Nessun parametro.

screenrig campaign list

data.items contiene al massimo 100 campagne, prima quelle con la priorità più alta e, a parità di priorità, le più recenti per prime. Una campagna in pausa è elencata e non si applica da nessuna parte.

campaign show#

Leggi una campagna.

campaign show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
screenrig campaign show cmp_LUNCH

Restituisce name, playlist_id, audience (la regola esatta), priority, paused, i from, until, windows, monthly, dates, except, interaction, displays e start impostati, e revision, il valore per --expect-rev in una scrittura successiva. reach riporta quanti schermi il pubblico comprende: published quando la campagna è stata pubblicata l'ultima volta (creata, o aggiornata con un nuovo pubblico, una nuova playlist o uno stato di pausa), current e at per il conteggio più recente, e empty_groups, le foglie tag:NAME e folder:ID del pubblico che non corrispondono ad alcuno schermo. Un tag, una cartella, un'archiviazione o un'eliminazione che cambia il conteggio viene ricalcolato entro circa 15 secondi; campaign list riporta anche reach, e le notifiche reach_dropped e group_empty lo controllano. Un id da ads campaigns list risponde qui con not_found (exit 4).

campaign create#

Commuta gli schermi di un pubblico su una playlist, sempre o finché sono in vigore le sue regole.

campaign create --name NAME --playlist-id ID (--tag TAG | --any-tag TAG | --screen-id ID | --folder ID | --all-screens | --audience RULE) [--from TIME] [--until TIME] [--window SPEC] [--monthly SPEC] [--date SPEC] [--except DATES] [--on-touch [IDLE_S]] [--displays N[,N]] [--start on-time|next-item] [--covers WHERE] [--priority N] [--paused]
ParametroTipoObbligatorioPredefinitoNote
--name NAMEstringsìnessunoUn nome da 1 a 120 caratteri.
--playlist-id IDstringsìnessunoLa playlist pl_ che il pubblico mostra finché la campagna è in vigore. Deve essere approvata.
--tag TAGstringun’opzione di pubbliconessunoSchermi che hanno questo tag. Ripeti o separa con virgole per richiedere ogni tag elencato.
--any-tag TAGstringun’opzione di pubbliconessunoSchermi che hanno almeno uno di questi tag. Ripeti o separa con virgole.
--screen-id IDstringun’opzione di pubbliconessunoQuesti schermi. Ripeti o separa con virgole.
--folder IDstringun’opzione di pubbliconessunoGli schermi di questa cartella di schermi sfd_ e di ogni cartella al suo interno. Per combinare una cartella con i tag, usa --audience.
--all-screensbooleanun’opzione di pubblicospentoOgni schermo del progetto.
--audience RULEstringun’opzione di pubbliconessunoUna regola come JSON, @FILE per leggerla da un file, o - per stdin.
--from TIMEstringnonessun inizioInizia a quest’ora civile nel fuso orario di ogni schermo, YYYY-MM-DDTHH:MM senza offset.
--until TIMEstringnonessuna fineTermina prima di quest’ora civile nel fuso orario di ogni schermo, nella stessa forma e dopo --from.
--window SPECstringnonessunoResta in vigore solo in questa finestra settimanale, DAYS o DAYS@HH:MM-HH:MM, ad esempio mon-fri@09:00-17:00 o sat,sun. Ripeti fino a 16 volte; la campagna è in vigore in una qualsiasi di esse.
--monthly SPECstringnonessunoResta in vigore solo in questa ricorrenza mensile: un giorno del mese (15 o day15; un mese senza quel giorno la salta) oppure l’ennesimo giorno della settimana (1st-mon, 2nd-tue, 3rd-wed, 4th-thu, last-sun), ciascuno con un @HH:MM-HH:MM facoltativo. Ripeti fino a 16 volte.
--date SPECstringnonessunoResta in vigore solo in questo giorno, YYYY-MM-DD o YYYY-MM-DD@HH:MM-HH:MM. Ripeti fino a 100 volte.
--except DATEstringnonessunoSalta queste date, YYYY-MM-DD, ripetute o separate da virgole, fino a 100. Un’eccezione rimuove ogni occorrenza che inizia in quella data, compresi i prolungamenti notturni.
--on-touch [IDLE_S]integernospentoResta in vigore solo mentre qualcuno usa lo schermo con un tocco o un clic, finché non passano IDLE_S secondi, da 5 a 3600 (60 per impostazione predefinita), senza input.
--displays N[,N]stringnotutte le usciteRiproduci solo su queste uscite del video wall, da 1 a 12, separate da virgole.
--start WHENstringnonext-itemon-time cambia nell’istante esatto e interrompe l’elemento in corso; next-item attende che finisca.
--covers WHEREstringnofullDove viene riprodotta la playlist: full (la pagina), main o header, footer o side, una fascia disegnata sopra la pagina che richiede una playlist fatta per quella regione. Vedi fasce.
--priority Nintegerno0Da 0 a 100. Vince il numero più alto quando due campagne sono in vigore su uno schermo.
--pausedbooleannospentoCreala in pausa: una bozza che non è su alcuno schermo fino a campaign publish o campaign resume.
screenrig campaign create --name "Lunch menu" --playlist-id pl_LUNCH --tag north --window mon-fri@11:00-14:00
screenrig campaign create --name "North Tower welcome" --playlist-id pl_WELCOME --folder sfd_01EXAMPLEFOLDER000000000
screenrig campaign create --name "Holiday hours" --playlist-id pl_HOLIDAY --tag Lobby --from 2026-12-20T00:00 --until 2027-01-02T00:00 --priority 10
screenrig campaign create --name "North cafes" --playlist-id pl_CAFE --audience '{"all":[{"tag":"North"},{"any":[{"tag":"Cafe"},{"tag":"Patio"}]}]}' --paused
screenrig campaign create --name "Brunch" --playlist-id pl_BRUNCH --tag Cafe --monthly 1st-sun@10:00-14:00 --except 2026-12-06
screenrig campaign create --name "Touch to browse" --playlist-id pl_MENU --screen-id scr_KIOSK --on-touch 90
screenrig campaign create --name "Holiday opening" --playlist-id pl_HOLIDAY --tag Lobby --date 2026-12-24@18:00-22:00 --start on-time
screenrig campaign create --name "Wall outputs 1 and 2" --playlist-id pl_WALL --screen-id scr_WALL --displays 1,2

I tag sono da 1 a 32 lettere o cifre. DAYS è daily, un giorno (mon), un intervallo (mon-fri; fri-mon supera la fine della settimana) o un elenco separato da virgole (sat,sun). Senza un orario la finestra è l’intera giornata, e una fine uguale o precedente all’inizio attraversa la mezzanotte e appartiene al giorno di inizio. In una regola --audience ogni membro ha esattamente uno tra all, any, tag, screen_id o folder, i gruppi si annidano al massimo a 3 livelli, un pubblico ha al massimo 500 regole e {"all":[]} è ogni schermo.

Dopo una creazione interrotta o ambigua, riesegui lo stesso comando entro 24 ore: riutilizza la chiave di idempotenza salvata e il server restituisce la stessa campagna invece di crearne un’altra.

campaign update#

Modifica una campagna; gli schermi del suo vecchio e del suo nuovo pubblico vengono rivalutati entro un minuto.

campaign update <id> [--name NAME] [--playlist-id ID] [audience option] [--from TIME | --clear-from] [--until TIME | --clear-until] [--window SPEC | --clear-windows] [--monthly SPEC | --clear-monthly] [--date SPEC | --clear-dates] [--except DATES | --clear-except] [--on-touch [IDLE_S] | --clear-on-touch] [--displays N[,N] | --clear-displays] [--start WHEN] [--covers WHERE] [--priority N] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--name NAMEstringnoinvariatoRinomina la campagna.
--playlist-id IDstringnoinvariatoMostra invece questa playlist. Deve essere approvata.
--tag, --any-tag, --screen-id, --folder, --all-screens, --audiencestringnoinvariatoAl massimo una, scritta come in campaign create. Sostituisce l’intero pubblico.
--from TIME, --until TIMEstringnoinvariatoUn’ora civile come in campaign create. --from deve restare prima di --until, altrimenti invalid_request (exit 8).
--clear-from, --clear-untilbooleannospentoRimuovi l’inizio o la fine.
--window SPECstringnoinvariatoSostituisce ogni finestra con queste. Ripeti fino a 16 volte.
--clear-windowsbooleannospentoRimuovi ogni finestra.
--monthly SPEC, --date SPEC, --except DATEstringnoinvariatoCome in campaign create; ciascuna sostituisce tutte le regole del suo tipo.
--on-touch [IDLE_S], --displays N[,N], --start WHENstringnoinvariatoCome in campaign create; --on-touch senza valore equivale a 60 secondi.
--clear-monthly, --clear-dates, --clear-except, --clear-on-touch, --clear-displaysbooleannospentoLi rimuove. Una campagna senza alcuna regola è sempre in vigore.
--covers WHEREstringnoinvariatofull, main, header, footer o side, come in campaign create.
--priority NintegernoinvariatoDa 0 a 100.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig campaign update cmp_LUNCH --playlist-id pl_LUNCH2 --expect-rev 2
screenrig campaign update cmp_LUNCH --tag Lobby --window sat,sun --priority 20
screenrig campaign update cmp_LUNCH --clear-until --clear-windows
screenrig campaign update cmp_BRUNCH --monthly 2nd-sun@10:00-14:00 --except 2026-12-13,2027-01-10
screenrig campaign update cmp_BROWSE --clear-on-touch --clear-displays

Passa almeno una modifica; cambiano solo i campi passati. Un nuovo --playlist-id è verificato come in creazione. Dopo una richiesta interrotta o ambigua, riesegui lo stesso comando: riutilizza la chiave di idempotenza salvata e il server restituisce l’aggiornamento già avvenuto invece di applicarlo di nuovo.

campaign pause#

Ferma una campagna su ogni schermo senza eliminarla.

campaign pause <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig campaign pause cmp_LUNCH

Gli schermi che la mostravano tornano a ciò che mostrerebbero senza di essa entro un minuto. campaign resume l’avvia di nuovo.

campaign resume#

Avvia di nuovo una campagna in pausa.

campaign resume <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig campaign resume cmp_LUNCH

Ogni schermo del pubblico a cui la campagna può applicarsi passa alla sua playlist entro un minuto finché la campagna è in vigore.

campaign delete#

Elimina una campagna.

campaign delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig campaign delete cmp_LUNCH

La campagna non ritorna. Ogni schermo che la mostra torna a ciò che mostrerebbe senza di essa entro un minuto; playlist, schermi e tag restano. campaign pause ferma una campagna e la conserva.

campaign screens#

Mostra gli schermi raggiunti da una campagna e lo stato di ciascuno.

campaign screens <id> [--limit N] [--cursor CURSOR]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--limit Nintegerno100Schermi per pagina, da 1 a 500.
--cursor CURSORstringnola prima paginaIl data.next_cursor della pagina precedente.
screenrig campaign screens cmp_LUNCH

data.counts copre ogni schermo live del pubblico: audience, poi un conteggio per ogni stato presente. data.items è una pagina di quegli schermi in ordine di id schermo, ciascuno con il status della campagna. data.next_cursor è assente nell’ultima pagina. Su uno schermo il cui lettore risolve il proprio stack, lo stato è quello che lo stack assegna alla campagna: una campagna a fascia o main viene riprodotta nella sua regione, e una campagna --displays sui suoi display.

StatoSignificato
playingLo schermo mostra la playlist della campagna.
pendingDovrebbe essere mostrata, e il cambiamento avviene entro un minuto.
waitingOra fuori da --from, --until e dalle finestre; next_start quando inizia entro otto giorni.
ended--until è passato.
outrankedÈ in vigore, ma vince un takeover dello schermo (reason takeover) o un’altra campagna (reason campaign, con by).
conditionalÈ in vigore per orario e viene riprodotta mentre qualcuno usa lo schermo (reason interaction) o mentre la sua condizione sui dati è soddisfatta (reason data). Solo il lettore vede i suoi input e i dati delle schede.
pausedLa campagna è in pausa.
blockedNon può essere mostrata qui. reason è no_default_playlist (screen assign), no_timezone (screen set-timezone), playlist_unavailable (la playlist manca, non è approvata o non si adatta allo schermo), region_not_laid_out (non entra in nessun display dello schermo: la sua fascia non entra in nessuno, o il suo --displays non ne indica nessuno, e la campagna resta fuori dal suo stack) o stack_only (il lettore dello schermo non risolve il proprio stack, e solo uno che lo fa rispetta una regione, un blocco dei display, --on-touch o una condizione sui dati).

campaign explain#

Mostra perché ogni campagna viene riprodotta o meno su uno schermo, ora o in un momento scelto.

campaign explain <screen-id> [--at TIME] [--to TIME]
ParametroTipoObbligatorioPredefinitoNote
<screen-id>stringsìnessunoL’ID schermo scr_.
--at TIMEstringnooraSpiega questo momento invece di ora: un istante con fuso (2026-12-24T10:00:00-08:00) o un orario sull’orologio dello schermo (2026-12-24T18:00). Un orario che l’ora legale salta o ripete viene rifiutato.
--to TIMEstringnonessunoElenca anche i cambi di playlist da --at (predefinito: ora) fino a questo momento, nelle stesse forme. Non c’è limite alla distanza; una risposta elenca al massimo 500 intervalli.
screenrig campaign explain scr_LOBBY
screenrig campaign explain scr_LOBBY --at 2026-12-24T18:00 --to 2026-12-26T00:00

data.items elenca ogni campagna del progetto nell’ordine in cui lo schermo le legge, ciascuna con uno stato da campaign screens o not_in_audience; una riga blocked indica la correzione. data.effective_playlist è la playlist che lo schermo riproduce ora (id, source e, per campaign, l’id della campagna come entry_id), o null quando lo schermo non mostra alcuna playlist. Non cambia nulla.

Con --at, data.at contiene la risposta per quel momento: effective_playlist (il suo until è il cambio successivo) e una riga verdicts per il takeover, ogni campagna e ogni voce del programma, nell’ordine in cui lo schermo le legge.

Un verdetto è won (la playlist mostrata), outranked (è in vigore, e by indica la vincitrice), not_started (prima dell’inizio), ended (dopo la fine), outside_hours (dentro le date, fuori dalle finestre, dalle regole mensili o dalle date, o in una data di eccezione), conditional (è in vigore per orario e viene riprodotta mentre qualcuno usa lo schermo, reason interaction, o mentre la sua condizione sui dati è soddisfatta, reason data) o off (non si applica, e reason dice perché, ad esempio stack_only). Su uno schermo il cui lettore risolve il proprio stack, i verdetti leggono quello stack: un livello a fascia o main vince o viene superato nella sua regione, e un blocco dei display sui suoi display. effective_playlist e la sequenza temporale restano la pagina del display 1, e data.at.not_judged elenca player_stack.

--to aggiunge data.at.timeline, gli intervalli in cui la playlist non cambia, e timeline_truncated segnala una risposta che si è fermata prima di --to. data.at.not_judged indica ciò che non viene giudicato: il takeover, il programma e le campagne sono letti come sono ora, e data.items resta lo stato attuale.

campaign preview#

Mostrare cosa farebbe creare o modificare una campagna prima di farlo.

campaign preview [<id>] [campaign create or update flags] [--paused | --publish] [--calendar-from INSTANT] [--calendar-to INSTANT]
ParametroTipoObbligatorioPredefinitoNote
<id>stringnouna nuova campagnaLa campagna cmp_ di cui vedere in anteprima una modifica. Omettila per vedere in anteprima una nuova campagna dai flag di campaign create.
--name, --playlist-id, un’opzione di pubblico, i flag delle regolestringnonessunoI flag di campaign create per una nuova campagna (--name, --playlist-id e un’opzione di pubblico sono obbligatori), oppure di campaign update per una modifica. Sono controllati come li controlla la scrittura, perciò un’anteprima rifiuta ciò che rifiuta la scrittura.
--pausedbooleannospentoAnteprima come bozza: in pausa, su alcuno schermo.
--publishbooleannospentoAnteprima della ripresa dalla pausa della campagna. Con un’opzione di pubblico, anteprima della sua pubblicazione per quel pubblico.
--calendar-from INSTANTstringnooraAvvia i calendari in questo istante con fuso, ad esempio 2026-12-01T00:00:00Z.
--calendar-to INSTANTstringnouna settimana dopo l’inizioTermina i calendari in questo istante con fuso, al massimo 93 giorni dopo l’inizio.
screenrig campaign preview cmp_LUNCH --tag Lobby
screenrig campaign preview cmp_LUNCH --publish --folder sfd_TEST
screenrig campaign preview cmp_LUNCH --publish --calendar-from 2026-12-01T00:00:00Z --calendar-to 2027-01-01T00:00:00Z
screenrig campaign preview --name "Holiday hours" --playlist-id pl_HOLIDAY --tag Lobby --from 2026-12-20T00:00 --until 2027-01-02T00:00

Non viene scritto nulla. data.gained e data.lost sono {count, screen_ids} (i primi 500 per id): gli schermi che porterebbero la campagna e ora non la portano, e quelli che non la porterebbero più. Una campagna in pausa non è su alcuno schermo, quindi pubblicarla ne guadagna il pubblico; una modifica che mantiene la campagna su uno schermo si vede solo nei calendari. data.calendar.before e data.calendar.after sono i calendari dei programmi da --calendar-from a --calendar-to per gli schermi del vecchio e del nuovo pubblico, con le bozze disegnate come livelli in pausa. --human stampa i tratti del primo display e le bozze che sarebbero in vigore, e dice quando il calendario non cambia.

campaign publish#

Togliere la pausa a una campagna in bozza, volendo solo per una cartella di prova o pochi schermi di prova.

campaign publish <id> [--test-folder ID | --test-screen ID] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--test-folder IDstringnoil pubblico della campagnaPubblica solo sugli schermi di questa cartella di schermi sfd_ e di ogni cartella al suo interno.
--test-screen IDstringnoil pubblico della campagnaPubblica solo su questi schermi. Ripeti o separa con virgole.
--expect-rev REVISIONstringnola revisione appena lettaRichiedi questa revisione corrente della campagna. Senza, la CLI legge la campagna subito prima della scrittura e invia quella revisione; una modifica nel frattempo è revision_conflict (exit 6).
screenrig campaign publish cmp_LUNCH
screenrig campaign publish cmp_LUNCH --test-folder sfd_TEST
screenrig campaign publish cmp_LUNCH --test-screen scr_LOBBY,scr_CAFE --expect-rev 2

Una bozza è una campagna in pausa: non è su alcuno schermo finché non viene pubblicata. Senza opzione di prova, la campagna raggiunge il suo pubblico entro un minuto. Un’opzione di prova sostituisce il pubblico nella stessa scrittura, così cambiano solo gli schermi di prova. Il flusso abituale: campaign create --paused con il pubblico reale, campaign publish ID --test-folder FOLDER, guardare gli schermi di prova, poi campaign promote ID --revision N. campaign preview ID --publish mostra prima l’effetto.

campaign promote#

Mettere il pubblico di una bozza sulla campagna dopo la sua prova.

campaign promote <id> --revision N [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--revision NintegersìnessunoLa revisione in pausa della bozza, come la numera campaign revisions. La campagna prende il pubblico di quella revisione.
--expect-rev REVISIONstringnola revisione appena lettaRichiedi questa revisione corrente della campagna. Senza, la CLI legge la campagna subito prima della scrittura e invia quella revisione; una modifica nel frattempo è revision_conflict (exit 6).
screenrig campaign promote cmp_LUNCH --revision 1
screenrig campaign promote cmp_LUNCH --revision 1 --expect-rev 2

Il pubblico della revisione N diventa quello della campagna in una scrittura, una nuova revisione il cui change è promoted, e ogni schermo del vecchio e del nuovo pubblico si risolve di nuovo entro un minuto. La revisione N deve essere una revisione in pausa (altrimenti invalid_request la nomina), e la campagna deve essere attiva: una campagna ora in pausa non ha alcuna prova da promuovere. --expect-rev è la revisione corrente della campagna, non N. La promozione richiede l’accesso richiesto da campaign update.

campaign revisions#

Elenca le revisioni di una campagna, la più recente per prima.

campaign revisions <id> [--after CURSOR]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--after CURSORstringnola prima paginaContinua dal data.next_cursor della pagina precedente.
screenrig campaign revisions cmp_LUNCH
screenrig campaign revisions cmp_LUNCH --after CURSOR

data.items contiene al massimo 50 revisioni, ciascuna con revision, created_at, change, current, author quando noto e campaign, la campagna com’era dopo quella scrittura, con il suo stato di pausa. change è created, edited, restored o promoted (una copia della revisione precedente indicata da restored_from), oppure baseline, la revisione che la campagna aveva quando è iniziata la sua cronologia. Una campagna la cui cronologia non ha alcuna revisione non in pausa è una bozza. Finché data.next_cursor è una stringa, restano revisioni più vecchie: esegui di nuovo il comando con --after impostato su quel valore. Le revisioni restano finché esiste la campagna e vanno via con la sua eliminazione. Basta l’accesso in sola lettura.

campaign restore#

Rendere di nuovo corrente una revisione precedente copiandola in avanti.

campaign restore <id> --revision N [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID campagna cmp_.
--revision NintegersìnessunoLa revisione da copiare in avanti, come la numera campaign revisions.
--expect-rev REVISIONstringnola revisione appena lettaRichiedi questa revisione corrente della campagna. Senza, la CLI legge la campagna subito prima della scrittura e invia quella revisione; una modifica nel frattempo è revision_conflict (exit 6).
screenrig campaign restore cmp_LUNCH --revision 3
screenrig campaign restore cmp_LUNCH --revision 3 --expect-rev 5

Nome, playlist, pubblico, regole, regione, priorità e stato di pausa della revisione N diventano una nuova revisione il cui change è restored, controllata come lo è campaign update: la sua playlist deve ancora esistere ed essere approvata (playlist_not_approved, exit 5). Ogni schermo del vecchio e del nuovo pubblico si risolve di nuovo entro un minuto. Le revisioni precedenti restano com’erano, e ripristinare il contenuto corrente non cambia nulla. Il ripristino richiede l’accesso richiesto da campaign update.

Revisioni

Quando un progetto richiede revisione per modifiche dell’agente, o la sessione ha accesso Propose, le modifiche a playlist e schermo aspettano una persona invece di applicarsi. Il comando ha comunque successo: ok: true, esci 0, la risposta del server in data, e un avviso pending_review.

{
  "ok": true,
  "data": {
    "status": "pending_review",
    "review": {
      "id": "rvw_LOBBY",
      "kind": "playlist_change",
      "state": "pending",
      "url": "https://screenrig.ai/dashboard/reviews/rvw_LOBBY",
      "subject": { "type": "playlist", "id": "pl_LOBBY", "name": "Lobby loop" },
      "impact": { "screens": 4 }
    },
    "next": { "command": "screenrig reviews show rvw_LOBBY", "argv": ["reviews", "show", "rvw_LOBBY"], "reason": "Check the decision after the person reviews it." }
  },
  "warnings": [{ "code": "pending_review", "message": "Waiting for a person to approve: https://screenrig.ai/dashboard/reviews/rvw_LOBBY" }]
}

Creazione e aggiornamento playlist (inclusi playlist import e playlist replace-release --apply), screen publish, screen assign, screen schedule set, clear e restore, e screen takeover e takeover clear in attesa di revisione, per uno schermo o una flotta. Un cambiamento di flotta è una revisione: il suo tag si risolve quando una persona lo approva, e reviews show poi riporta il risultato di ogni schermo; una grande flotta termina l’applicazione in background, e screen_change.result.applying è true finché ogni schermo ha il suo esito. A parte i cambiamenti media sotto, ogni altro cambiamento risponde a 403 insufficient_access per una sessione Propose. --note TEXT su quei comandi invia una nota in testo semplice, al massimo 280 caratteri, che il revisore legge nel dashboard.

Una persona approva, richiede modifiche o rifiuta nella pagina Reviews del dashboard; gli agenti non possono approvare modifiche a playlist o schermi. Una modifica approvata si applica come se fosse stata fatta allora, e i suoi eventi nominano la persona che l’ha approvata e l’agente che l’ha proposta. Non fare polling, sleep o ripetere la scrittura mentre una revisione è in attesa: controlla più tardi con reviews show, o segui review.approved, review.rejected e review.changes_requested con events follow --type review..

Anche i cambiamenti dei media da una sessione Propose attendono. I selettori tag, cartella e all saltano un nuovo caricamento finché una persona non lo approva, e i media approvati che la sessione ritagga o sposta continuano a essere riprodotti con i loro tag e cartella approvati finché il cambiamento non è approvato. Il ritag risponde ok, esce 0, con avviso media_review_pending, e la revisione dell’elemento appare in reviews list entro pochi secondi; non fare polling, sleep o retry. Ogni elemento riceve una revisione, tipo playlist_change con operazione selector_refresh e un soggetto media: media_change mostra i suoi tag e cartella before e after (before è null per un nuovo caricamento), e media_playlists elenca ogni playlist approvata e ogni playlist proposta in attesa di revisione a cui il cambiamento lo aggiunge o rimuove (media_added, media_removed), con i loro schermi. L’approvazione applica il cambiamento a tutte; il rifiuto, la richiesta di modifiche o il ritiro riportano un elemento ritaggato o spostato come era approvato, e un nuovo caricamento resta non riprodotto. Un cambiamento che non altera nessuna playlist approvata né proposta si applica da solo, e una playlist che nomina l’elemento per id lo include nella sua revisione. Quando quelle playlist procedono prima che una persona decida, la revisione media va stale e una nuova la sostituisce entro secondi.

Stati della revisione:

StatoSignificatoPasso successivo
pendingIn attesa di una persona.Fornisci alla persona l’URL per la revisione; controlla di nuovo più tardi.
approvedApplicato alla playlist o agli schermi.Verifica sullo schermo con screen show e uno screenshot.
changes_requestedLa persona ha chiesto modifiche; decision_note dice quali.Revisiona e proponi di nuovo con --note.
rejectedLa persona ha rifiutato; decision_note dice perché.Non inviare di nuovo la stessa modifica; chiedi alla persona.
withdrawnIl proponente lo ha ritirato.Nessuno.
supersededUna proposta più recente per la stessa playlist o schermo l’ha sostituita; superseded_by la nomina.Segui la recensione più recente.
staleLa playlist live è cambiata dopo la proposta, o i suoi selettori tag, cartella o all ora riprodurrebbero contenuti multimediali non visti quando proposta, quindi non può essere applicata come revisionata. Una revisione media diventa stale quando cambiano le playlist che elenca.Rileggi la playlist e proponi sopra di essa. Una revisione multimediale obsoleta viene sostituita da una nuova in pochi secondi.

reviews list#

Elenca le recensioni, dalla più recente

reviews list [--state pending|decided|all] [--kind playlist_change|screen_change|ad_creative] [--limit N] [--cursor CURSOR]
ParametroTipoObbligatorioPredefinitoNote
--state STATEstringnopendingpending, decided o all.
--kind KINDstringnoogni tipoplaylist_change, screen_change o ad_creative.
--limit Nintegerno50Revisioni per pagina, da 1 a 100.
--cursor CURSORstringnola prima paginaIl next_cursor della pagina precedente.
screenrig reviews list --state all

Il risultato riporta pending_count. Una sessione vede i tipi che le sue capability leggono: playlists per i cambiamenti di playlist, screens per i cambiamenti di schermo e advertising per le creatività pubblicitarie.

reviews show#

Leggi una recensione.

reviews show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID della revisione dal risultato pending_review.
screenrig reviews show rvw_LOBBY

La revisione riporta il suo state, il proponente, il tuo note, il decision_note che una persona ha lasciato rifiutando o richiedendo modifiche, e impact.screens. Un cambiamento di playlist aggiunge il diff, un preview delle playlist live e proposte (nessuno per una revisione media), media_change per una revisione media, e media_playlists, le playlist la cui selezione il cambiamento altera. Per un cambiamento di schermo, blockers elenca le revisioni di playlist che una persona decide prima, con il loro stato attuale.

reviews withdraw#

Ritira la tua proposta in sospeso.

reviews withdraw <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoUna revisione in sospeso proposta in questa sessione.
screenrig reviews withdraw rvw_LOBBY

Niente raggiunge gli schermi, e una nuova playlist ritirata resta non approvata. Una revisione non più in sospeso risponde review_not_pending (uscita 5).

Salute e alimentazione dispositivo

Ogni Player associato segnala lo stato del dispositivo all’avvio sessione, ogni quindici minuti, e subito al cambio di connessione o alimentazione del display. Dichiara anche le capacità host supportate: reboot, clear_cache, restart_app e update dove ciascuna funziona su quel dispositivo, e i metodi di alimentazione display utilizzabili (display_power.serial, porta di controllo RS-232 del display; display_power.cec, display_power.ddc, display_power.backlight o display_power.scrim, oscuramento a schermo). screen show restituisce entrambi.

screen show restituisce la salute come data.health con il reported_at del server; stale diventa true dopo 35 minuti senza report, e l’ultimo report resta visibile. Con --human stampa un blocco Health: ora del report, uptime di dispositivo e Player, memoria in uso, carico CPU e core, temperatura, connessione e alimentazione del display, tipo di rete e segnale Wi-Fi, livello della batteria, ricarica e fonte di alimentazione su un dispositivo con batteria, e crash e riavvii del renderer nelle ultime 24 ore. screen list --human aggiunge una colonna HEALTH quando uno schermo elencato richiede attenzione: display disconnected, hot (80 °C o più), on battery, crashing (3 o più crash in 24 ore), o stale.

Le transizioni arrivano come eventi screen.health_changed, stampati da events list e events follow con un valore changes= compatto come display_disconnected,temperature_high temperature_c=82. I comandi di alimentazione aggiungono screen.reboot_requested e screen.display_changed. Una programmazione dei riavvii aggiunge screen.reboot_schedule_changed quando viene impostata o cancellata e screen.reboot_skipped con un reason quando una finestra passa senza riavvio; screen.reboot_requested riporta source, schedule quando l’ha emesso la programmazione. Come ogni evento screen.*, sono gratuiti sul flusso di ascolto e come consegne webhook. Una notifica ti invia un’e-mail, o esegue una POST di un webhook firmato, quando un display si disconnette, un dispositivo si surriscalda o funziona a batteria, o un Player continua ad andare in crash.

screen uptime, screen presence e screen health-history leggono cosa ha fatto uno schermo nel tempo: disponibilità giornaliera, transizioni online e offline, e lo stato di salute segnalato. project uptime e project health-trend leggono la flotta. Offline viene registrato dopo che uno schermo è stato irraggiungibile per 60 secondi, e la cronologia è conservata per la durata di conservazione eventi del piano.

Codice problemaEsciSignificato
reboot_unsupported5Il Player dello schermo non dichiara reboot. Non è stato inviato né memorizzato nulla; screen reload aggiorna i contenuti senza riavviare il dispositivo.
command_unsupported5Il Player dello schermo non dichiara clear_cache, restart_app o update, la capacità che il comando richiede. Non è stato inviato nulla; screen show elenca le capacità host e screen reload aggiorna i contenuti.
resource_conflict5Lo schermo sta ancora aspettando di essere associato e non ha ancora un Player da attivare. Si può comunque impostare una programmazione di visualizzazione.
invalid_request8Una programmazione display o dei riavvii punta a uno schermo senza fuso orario (next è screen set-timezone), o il file è malformato.
rate_limited7Riavvii, e cancella cache, riavvia app e aggiorna software insieme: 2 per schermo ogni 10 minuti e 600 per organizzazione al minuto. Scritture del monitor: 10 per schermo e 600 per organizzazione al minuto. Attendere retry_after_seconds.

Più ID o --tag eseguiti come una richiesta flotta con busta e regole di uscita flotta.

screen reboot#

Riavvia il dispositivo di uno schermo o i dispositivi di una flotta.

screen reboot (<id>... | --tag TAG) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--yesbooleanper diversi ID o --tagspentoConferma un riavvio della flotta. Il CLI non chiede mai conferma.
--expires-in DURATIONstringno24h, applicato dal serverQuanto a lungo la richiesta attende che uno schermo offline torni online: 90s, 30m, 2h o 1d, da 60s a 24h.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen reboot scr_LOBBY
screenrig screen reboot scr_LOBBY --expires-in 2h
screenrig screen reboot --tag Lobby --yes

Il Player riavvia il dispositivo, non solo se stesso. Uno schermo online riceve subito il riavvio (state sent); uno schermo offline lo tiene queued e lo riceve quando torna online prima di expires_at, 24 ore dopo la richiesta salvo diversa indicazione di --expires-in. Un riavvio più recente sostituisce uno ancora in coda. screen show elenca i commands dello schermo: un riavvio inviato diventa done quando il dispositivo riporta di essersi avviato, e screen command cancel ne annulla uno ancora in coda. In una flotta, il reboot di ogni risultato porta lo stesso state. Una richiesta rifiutata o fallita, e una ripetizione esatta della stessa richiesta, non contano per il limite per schermo. Dal momento in cui un riavvio viene inviato finché il dispositivo riporta di essersi avviato o passano dieci minuti, lo schermo non apre alert screen_offline o display_disconnected; un avviso per uno dei due in scadenza in quel lasso attende la fine del periodo più la sua attesa, e un avviso crashing viene saltato come planned_reboot. Una condizione che persiste dopo si apre normalmente.

screen clear-cache#

Svuota le cache del Player di uno schermo o dei Player di una flotta.

screen clear-cache (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id>, --tag o --foldernessunoUno o più ID schermo scr_. Diversi ID vengono eseguiti come una singola richiesta flotta.
--tag TAGstringuno tra <id>, --tag o --foldernessunoOgni schermo attivo con questo tag.
--folder IDstringuno tra <id>, --tag o --foldernessunoOgni schermo attivo in questa cartella schermi sfd_ e nelle cartelle al suo interno.
--yesbooleanper più id, --tag o --folderspentoConferma una richiesta per una flotta. La CLI non chiede mai conferma.
--expires-in DURATIONstringno24h, applicato dal serverQuanto a lungo la richiesta attende che uno schermo offline torni online: 90s, 30m, 2h o 1d, da 60s a 24h.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen clear-cache scr_LOBBY
screenrig screen clear-cache scr_LOBBY --expires-in 2h
screenrig screen clear-cache --tag Lobby --yes

Il Player elimina i media scaricati, i pacchetti applicativi e le cache dei dati, mantiene associazione, identità e impostazioni, poi recupera di nuovo il manifest e i contenuti; lo schermo può mostrare il suo stato di caricamento mentre i contenuti si ripopolano. Raggiunge solo un Player che dichiara clear_cache. Uno schermo online riceve subito la richiesta (state sent); uno schermo offline la mantiene queued e la riceve quando torna online prima di expires_at, 24 ore dopo la richiesta salvo diversa indicazione di --expires-in. La risposta contiene command_id, command, state e expires_at. Un Player che non dichiara la capacità risponde 409 command_unsupported e non viene inviato nulla; in una flotta quello schermo fallisce da solo. screen show elenca il comando sotto commands e, quando il Player riporta, lo contrassegna done o failed con una cause e un breve detail: cleared quando le cache sono svuotate e il recupero è iniziato, oppure clear_failed quando una cache non può essere svuotata. Un comando inviato senza report resta sent. Un comando più recente dello stesso tipo sostituisce uno ancora in coda, e screen command cancel ne annulla uno ancora in coda. In una flotta, il command di ogni risultato contiene lo stesso state. Una flotta (più id, --tag o --folder) necessita --yes. Una richiesta rifiutata o fallita, e una ripetizione esatta della stessa richiesta, non contano per il limite per schermo di 2 richieste insieme di clear-cache, restart-app e update-software ogni 10 minuti.

screen restart-app#

Riavvia l’applicazione del Player di uno schermo o dei Player di una flotta.

screen restart-app (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id>, --tag o --foldernessunoUno o più ID schermo scr_. Diversi ID vengono eseguiti come una singola richiesta flotta.
--tag TAGstringuno tra <id>, --tag o --foldernessunoOgni schermo attivo con questo tag.
--folder IDstringuno tra <id>, --tag o --foldernessunoOgni schermo attivo in questa cartella schermi sfd_ e nelle cartelle al suo interno.
--yesbooleanper più id, --tag o --folderspentoConferma una richiesta per una flotta. La CLI non chiede mai conferma.
--expires-in DURATIONstringno24h, applicato dal serverQuanto a lungo la richiesta attende che uno schermo offline torni online: 90s, 30m, 2h o 1d, da 60s a 24h.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen restart-app scr_LOBBY
screenrig screen restart-app scr_LOBBY --expires-in 2h
screenrig screen restart-app --tag Lobby --yes

Il Player riavvia la sua applicazione, non il dispositivo (un Player web ricarica la sua pagina) e riporta dal processo riavviato. Raggiunge solo un Player che dichiara restart_app; screen reboot riavvia il dispositivo. Uno schermo online riceve subito la richiesta (state sent); uno schermo offline la mantiene queued e la riceve quando torna online prima di expires_at, 24 ore dopo la richiesta salvo diversa indicazione di --expires-in. La risposta contiene command_id, command, state e expires_at. Un Player che non dichiara la capacità risponde 409 command_unsupported e non viene inviato nulla; in una flotta quello schermo fallisce da solo. screen show elenca il comando sotto commands e, quando il Player riporta, lo contrassegna done o failed con una cause e un breve detail: restarted, oppure restart_failed quando il riavvio non può partire. Un comando inviato senza report resta sent. Un comando più recente dello stesso tipo sostituisce uno ancora in coda, e screen command cancel ne annulla uno ancora in coda. In una flotta, il command di ogni risultato contiene lo stesso state. Una flotta (più id, --tag o --folder) necessita --yes. Una richiesta rifiutata o fallita, e una ripetizione esatta della stessa richiesta, non contano per il limite per schermo di 2 richieste insieme di clear-cache, restart-app e update-software ogni 10 minuti.

screen update-software#

Aggiorna il Player di uno schermo, o i Player di una flotta, all’ultima release.

screen update-software (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id>, --tag o --foldernessunoUno o più ID schermo scr_. Diversi ID vengono eseguiti come una singola richiesta flotta.
--tag TAGstringuno tra <id>, --tag o --foldernessunoOgni schermo attivo con questo tag.
--folder IDstringuno tra <id>, --tag o --foldernessunoOgni schermo attivo in questa cartella schermi sfd_ e nelle cartelle al suo interno.
--yesbooleanper più id, --tag o --folderspentoConferma una richiesta per una flotta. La CLI non chiede mai conferma.
--expires-in DURATIONstringno24h, applicato dal serverQuanto a lungo la richiesta attende che uno schermo offline torni online: 90s, 30m, 2h o 1d, da 60s a 24h.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen update-software scr_LOBBY
screenrig screen update-software scr_LOBBY --expires-in 2h
screenrig screen update-software --tag Lobby --yes

Il Player controlla subito l’ultima release del Player e la installa dove la sua piattaforma consente al Player di aggiornarsi da solo; un Player web aggiorna il suo service worker, poi si ricarica. Raggiunge solo un Player che dichiara update: un Player installato da uno store o gestito da un gestore di dispositivi si aggiorna tramite quel canale. Uno schermo online riceve subito la richiesta (state sent); uno schermo offline la mantiene queued e la riceve quando torna online prima di expires_at, 24 ore dopo la richiesta salvo diversa indicazione di --expires-in. La risposta contiene command_id, command, state e expires_at. Un Player che non dichiara la capacità risponde 409 command_unsupported e non viene inviato nulla; in una flotta quello schermo fallisce da solo. screen show elenca il comando sotto commands e, quando il Player riporta, lo contrassegna done o failed con una cause e un breve detail: up_to_date quando l’ultima release è già in esecuzione, updated una volta avviata la nuova versione oppure, in caso di errore, update_check_failed, download_failed, install_failed o no_update_channel. Un comando inviato senza report resta sent. Un comando più recente dello stesso tipo sostituisce uno ancora in coda, e screen command cancel ne annulla uno ancora in coda. In una flotta, il command di ogni risultato contiene lo stesso state. Una flotta (più id, --tag o --folder) necessita --yes. Una richiesta rifiutata o fallita, e una ripetizione esatta della stessa richiesta, non contano per il limite per schermo di 2 richieste insieme di clear-cache, restart-app e update-software ogni 10 minuti.

screen command cancel#

Annulla un comando ancora in coda per uno schermo offline.

screen command cancel <id> <command_id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
<command_id>stringsìnessunoUn ID da commands in screen show, oppure il reboot_id, reload_id o command_id restituito dalla richiesta.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen command cancel scr_01EXAMPLESCREEN00000000 rbt_01EXAMPLEREBOOT00000000

Solo un comando in coda può essere annullato. Un comando già inviato (sent o done) risponde 409 resource_conflict con "The command was already sent.", uno non più in coda (expired, cancelled o superseded) risponde 409 resource_conflict con "The command is no longer queued.", e un ID che lo schermo non elenca risponde 404 not_found. La risposta è lo schermo con il comando in stato cancelled, e la revisione dello schermo non cambia.

screen display#

Accendi o spegni ora il display di uno schermo o di una flotta, oppure annulla questa sovrascrittura.

screen display [set] (<id>... | --tag TAG) --power on|off [--until TIME | --for DURATION] [--expect-rev REVISION]
screen display clear (<id>... | --tag TAG) [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_. Un on o off finale dopo gli ID è uguale a --power.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--power on|offstringsì, per setnessunoLa potenza da applicare ora.
--until TIMEstringnoil prossimo confine della programmazione del monitorUn istante RFC 3339 rigoroso, rigorosamente futuro e al massimo 7 giorni avanti.
--for DURATIONstringnoil prossimo confine della programmazione del monitor30m, 2h o 3d, fino a 6d23h59m. Non con --until.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen display scr_LOBBY --power off --for 2h
screenrig screen display --tag Lobby --power on
screenrig screen display clear --tag Lobby

screen display è un override manuale del programma di visualizzazione. Senza --until o --for termina al prossimo confine del programma; un successivo cambio di programma o fuso orario sposta quella fine al nuovo confine. Senza confini nei prossimi otto giorni, per esempio senza programma abilitato, dura fino a screen display clear o a un sostituto. screen display clear termina l’override, quindi il programma di visualizzazione si applica di nuovo; senza uno, la visualizzazione è attiva. Il Player applica ogni modifica in una volta e riporta l’energia raggiunta.

screen display-schedule#

Mostra, imposta o cancella quando il display di uno schermo è acceso.

screen display-schedule show <id>
screen display-schedule set (<id>... | --tag TAG) --file FILE [--expect-rev REVISION]
screen display-schedule clear (<id>... | --tag TAG) [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_; show ne prende uno.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--file FILEpathsì, per setnessunoLa programmazione del monitor, o - per stdin.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen display-schedule set scr_LOBBY --file hours.json
screenrig screen display-schedule set --tag Cafe --file hours.json

Una programmazione display elenca da 1 a 16 finestre quando il display è acceso, nel fuso orario dello schermo; fuori da ogni finestra il display va in standby. Il Player la valuta sul dispositivo, quindi funziona anche offline. Una finestra il cui end è uguale o precedente a start attraversa la mezzanotte, e una finestra senza start e end copre l’intera giornata. enabled: false mantiene le finestre e lascia il display acceso. L’output salvato di display-schedule show può essere modificato e inviato con set --file.

{"enabled": true, "windows": [{"days": ["mon", "tue", "wed", "thu", "fri"], "start": "07:00", "end": "19:00"}, {"days": ["sat"]}]}

screen show --human stampa Display: con la potenza richiesta, la sua origine (override manuale, programmazione display o predefinita) e fino a quando nel fuso orario dello schermo, le finestre di programmazione e la potenza riportata dal Player, segnata come obsoleta dopo 35 minuti senza report.

screen display-idle#

Oscura il display di uno schermo dopo un periodo senza uso, oppure disattiva questa funzione.

screen display-idle <id> --after SECONDS --wake WAKE [--expect-rev REVISION]
screen display-idle <id> --off [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--after SECONDSintegeruno tra --after o --offnessunoOscura dopo questo numero di secondi senza uso, da 30 a 86400. Richiede --wake.
--wake WAKEstringcon --afternessunoCosa riaccende di nuovo il display: touch, presence o touch,presence. Con presence la fotocamera del dispositivo viene letta sul dispositivo stesso; nessuna immagine ne esce.
--offbooleanuno tra --after o --offspentoDisattiva l’oscuramento per inattività.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen display-idle scr_LOBBY --after 300 --wake touch
screenrig screen display-idle scr_LOBBY --after 600 --wake touch,presence --expect-rev 4
screenrig screen display-idle scr_LOBBY --off

Il display si oscura dopo --after secondi senza un tocco o un tasto o, quando --wake elenca presence, senza nessuno davanti allo schermo. Mentre è oscurato il Player sospende la riproduzione, senza riproduzioni né annunci, e segnala l’alimentazione del display come off; un evento di riattivazione riaccende il display subito e la riproduzione riprende, e il tocco che riattiva un display oscurato non viene passato alla pagina. Una programmazione del display o un override che tiene spento il pannello ha la precedenza, così come un’applicazione che tiene device.display mentre la sua pagina è sullo schermo. Cambia solo display.idle. Un Player lo applica quando screen show elenca display_power.idle tra le sue capacità dell’host; l’impostazione viene memorizzata in ogni caso, e screen show la elenca come Display idle. L’accesso Propose non può modificarla (insufficient_access), e uno schermo in una cartella protetta la rifiuta (protected_target).

screen brightness#

Imposta se la luminosità di uno schermo segue il sensore di luce del dispositivo.

screen brightness <id> --mode auto|fixed [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--mode auto|fixedstringsìnessunoauto imposta la luminosità in base al sensore di luce del dispositivo; fixed mantiene la luminosità dell’operatore, che è il valore predefinito.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen brightness scr_LOBBY --mode auto
screenrig screen brightness scr_LOBBY --mode fixed --expect-rev 4

Cambia solo display.brightness. Un Player applica auto quando screen show elenca brightness.auto tra le sue capacità dell’host, che un dispositivo dichiara solo con un sensore di luce; un’applicazione che imposta la luminosità del display ha la precedenza finché la sua pagina è mostrata. L’impostazione viene memorizzata in ogni caso, e screen show la elenca come Display brightness. Si applicano le regole di accesso di screen display-idle.

screen kiosk-lock#

Blocca il Player di uno schermo sullo schermo, oppure rilascialo.

screen kiosk-lock <id> (--on | --off) [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--on, --offbooleanuno dei duenessuno--on blocca il Player sullo schermo; --off lo rilascia.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig screen kiosk-lock scr_LOBBY --on
screenrig screen kiosk-lock scr_LOBBY --off --expect-rev 4

--on usa il blocco su schermo di Android: la persona presente allo schermo conferma la prima volta, e la barra di stato, home e recenti sono bloccate finché il Player resta bloccato sullo schermo. Il pannello delle impostazioni dell’operatore può uscire dal blocco finché il manifest successivo o un riavvio non lo applica di nuovo. Un Player lo applica quando screen show elenca kiosk_lock tra le sue capacità dell’host; l’impostazione viene memorizzata in ogni caso, e screen show elenca Kiosk lock finché il blocco è attivo. Si applicano le regole di accesso di screen display-idle.

screen reboot-schedule#

Mostra, imposta o cancella quando il backend riavvia il dispositivo di uno schermo.

screen reboot-schedule show <id>
screen reboot-schedule set (<id>... | --tag TAG) (--window SPEC... | --file FILE) [--enabled | --disabled] [--expect-rev REVISION]
screen reboot-schedule clear (<id>... | --tag TAG) [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>...stringuno tra <id> o --tagnessunoUno o più ID schermo scr_; show ne prende uno.
--tag TAGstringuno tra <id> o --tagnessunoOgni schermo attivo con questo tag.
--window SPECstringuno tra --window o --file, per setnessunoRiavvia all'inizio di questa finestra settimanale, DAYS HH:MM-HH:MM nel fuso orario dello schermo, ad esempio "Mon-Sun 04:00-04:30" (funziona anche DAYS@HH:MM-HH:MM). Ripeti fino a 16 volte; ogni finestra dura da 5 minuti a 24 ore.
--file FILEpathuno tra --window o --file, per setnessunoLa programmazione dei riavvii come JSON, o - per stdin, al posto di --window.
--enabled, --disabledbooleanno--enabled--disabled mantiene le finestre e non riavvia nulla. Non con --file.
--expect-rev REVISIONstringnonessunoSolo un ID schermo. Condizione di revisione opzionale.
screenrig screen reboot-schedule set scr_LOBBY --window "Mon-Sun 04:00-04:30"
screenrig screen reboot-schedule set --tag Cafe --window "Mon-Fri 04:00-04:30" --window "Sat,Sun 05:00-06:00"
screenrig screen reboot-schedule set scr_LOBBY --file reboots.json --expect-rev 4

All'inizio di ogni finestra, nel fuso orario dello schermo, screenRIG emette lo stesso riavvio di screen reboot, quindi "Mon-Sun 04:00-04:30" riavvia lo schermo alle 04:00 locali ogni giorno. commands in screen show lo elenca con source schedule, e screen show e reboot-schedule show stampano next_reboot_at. Una finestra che termina prima o alla stessa ora dell'inizio attraversa la mezzanotte, e una finestra senza orari copre l'intera giornata. L'output salvato di reboot-schedule show può essere modificato e rispedito con set --file:

{"enabled": true, "windows": [{"days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], "start": "04:00", "end": "04:30"}]}

Uno schermo online riceve subito il riavvio. Uno schermo offline lo tiene in coda solo fino alla fine della sua finestra, quindi un riavvio non cade mai fuori dalla finestra: uno schermo che torna dopo non ne riceve alcuno. Un inizio dentro un salto in avanti dell'ora legale scatta al primo minuto valido della finestra, e una ripetizione per il ritorno all'ora solare scatta una volta per finestra per data locale. Un riavvio programmato non sostituisce mai uno richiesto da una persona che attende ancora lo schermo; l'occorrenza viene saltata con screen.reboot_skipped (reboot_pending). Lo schermo richiede un fuso orario memorizzato e un Player che dichiara reboot; uno schermo che perde reboot in seguito salta ogni finestra e mantiene la sua programmazione. Cambiare il fuso orario sposta next_reboot_at nel nuovo fuso. Un riavvio inviato da una programmazione non genera alert di offline, come in screen reboot. screen.reboot_schedule_changed registra ogni impostazione o cancellazione. In una flotta, ogni risultato è quello del singolo schermo: reboot_unsupported per uno schermo il cui Player non può riavviare.

screen uptime#

Leggi la disponibilità giornaliera di uno schermo su giorni UTC.

screen uptime <id> [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--day-from YYYY-MM-DDstringno29 giorni prima di --day-toPrimo giorno UTC, incluso.
--day-to YYYY-MM-DDstringnooggiUltimo giorno UTC, incluso. Al massimo 366 giorni dopo --day-from.
screenrig screen uptime scr_01EXAMPLESCREEN00000000
screenrig screen uptime scr_01EXAMPLESCREEN00000000 --day-from 2026-09-01 --day-to 2026-09-30

data.items elenca una riga per ogni giorno UTC con uno stato registrato, dal più vecchio al più recente: online_s, offline_s, availability (online nel tempo registrato; null quando nulla è stato registrato), coverage (la quota del giorno con uno stato registrato), intervals e live per un giorno che include l’intervallo aperto fino ad ora. Il tempo senza stato registrato abbassa coverage e non è mai downtime. I giorni senza registrazioni non hanno riga.

screen presence#

Elenca le transizioni online e offline di uno schermo, dalla più recente

screen presence <id> [--since TIME] [--until TIME]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--since TIMEstringno30 giorni prima di --untilInizio inclusivo dell’ora di transizione: un istante RFC 3339 con secondi e offset (normalizzato a UTC), now, o un’età come 7d, 12h o 30m.
--until TIMEstringnooraFine esclusiva, nelle stesse forme. Al massimo 366 giorni dopo --since.
screenrig screen presence scr_01EXAMPLESCREEN00000000 --since 7d
screenrig screen presence scr_01EXAMPLESCREEN00000000 --since 2026-09-01T00:00:00Z --until 2026-09-08T00:00:00Z

data.items contiene at, state e detected_on_reconnect su un offline che il server ha notato solo quando lo schermo si è riconnesso (at è allora quando è terminato il lease di presenza). La CLI segue next_cursor fino alla fine e risponde a ogni transizione con next_cursor null, quindi restringi un intervallo lungo con --since.

screen health-history#

Elenca la salute segnalata da uno schermo nel tempo, ogni rapporto o un riepilogo per ora

screen health-history <id> [--from TIME] [--to TIME] [--resolution raw|hour]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID schermo scr_.
--from TIMEstringno24 ore prima di --toInizio inclusivo dell’ora del report: un istante RFC 3339 con secondi e offset (normalizzato a UTC), now, o un’età come 7d, 12h o 30m.
--to TIMEstringnooraFine esclusiva, nelle stesse forme. Al massimo 31 giorni dopo --from, 93 con --resolution hour.
--resolutionstringnorawraw elenca ogni report accettato; hour riassume ogni ora UTC.
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 6h
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 30d --resolution hour

raw risponde data.samples, ogni report accettato ha la forma di health di screen show senza stale. hour risponde data.hours, un riepilogo per ogni ora UTC: report, temperatura massima e media, carico massimo e rapporto memoria, segnale Wi-Fi più debole, display_disconnected, e conteggi massimi di crash e riavvio renderer. La CLI segue next_cursor fino alla fine, quindi restringi un intervallo raw lungo o usa --resolution hour. I report raw arrivano in pochi secondi e i riepiloghi orari in circa 5 minuti.

Commenti

Un commento è l’oggetto JSON proprio dell’agente allegato a uno schermo, una playlist o una pagina di playlist. La sua versione UTF-8 compatta è al massimo 1 KiB, e il valore deve essere un oggetto. screenRIG non lo legge mai, non lo invia mai ai Player e non lo tratta mai come autorizzazione. Non appare nel manifesto di runtime e non incrementa una revisione, quindi questi comandi non richiedono --expect-rev: vince l’ultima scrittura.

comment show#

Leggi l’oggetto commento su uno schermo, una playlist o una pagina di playlist.

comment show screen <id>
comment show playlist <id> [--page PAGE_ID]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID scr_ o pl_, corrispondente alla parola target.
--page PAGE_IDstringnola playlist stessaUn id pagina playlist: una lettera, poi fino a 63 lettere, cifre, underscore o trattini. Solo per destinazioni playlist.
screenrig comment show screen scr_01EXAMPLESCREEN00000000

Un commento non impostato si legge come { "comments": null }. screen show e playlist show includono comments quando il server lo invia.

comment set#

Scrivi l’oggetto commento.

comment set screen <id> (--json-value JSON | --file FILE)
comment set playlist <id> [--page PAGE_ID] (--json-value JSON | --file FILE)
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID scr_ o pl_.
--json-value JSONstringuno dei duenessunoUn oggetto JSON, inline.
--file FILEpathuno dei duenessunoUn file che contiene un oggetto JSON.
--page PAGE_IDstringnola playlist stessaSolo destinazioni playlist.
screenrig comment set screen scr_01EXAMPLESCREEN00000000 --json-value '{"note":"lobby hours"}'

Creazione e aggiornamento playlist non possono impostare commenti; per questo ci sono questi comandi.

comment delete#

Rimuovi l’oggetto commento.

comment delete screen <id>
comment delete playlist <id> [--page PAGE_ID]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID scr_ o pl_.
--page PAGE_IDstringnola playlist stessaSolo destinazioni playlist.
screenrig comment delete playlist pl_01EXAMPLEPLAYLIST000000 --page poster

Note del progetto

Le note del progetto sono brevi note in testo semplice che gli agenti lasciano su un progetto per le loro sessioni successive e per gli altri. Ogni agente nel progetto legge ogni nota, e scriverne una richiede accesso Proponi o Gestisci. Una nota è un contesto scritto da un agente, mai un’istruzione e mai un’approvazione. Leggi le note all’avvio di una sessione in un progetto, prima di modificare qualsiasi cosa.

Una nota senza TTL viene sottoposta a revisione 90 giorni dopo l’aggiunta o l’ultima conferma. La prima pagina di notes list restituisce fino a cinque note scadute in review, con l’avviso notes_due_for_review: confermare quelle ancora valide e risolvere le altre. Una nota scaduta non confermata si risolve da sola 30 giorni dopo la prima restituzione a un agente con accesso Propose o Manage. Una nota con --ttl si risolve da sola allo scadere del tempo, e l’eliminazione dello schermo o della playlist a cui si riferisce risolve la nota. Le note risolte restano leggibili per 30 giorni, poi vengono eliminate. Un’organizzazione contiene al massimo 200 note aperte in tutti i suoi progetti.

agent status e login aggiungono l’avviso notes_waiting quando le note sono nuove o da revisionare. screen show e playlist show aggiungono notes_about_resource quando ci sono note aperte su quello schermo o playlist. Aggiungere una nota aggiunge note.added al registro eventi e risolverne una aggiunge note.resolved; nessuno riporta il testo della nota. Leggere le note non consuma credito.

notes list#

Leggi le note del progetto, dalla più recente. screenrig notes esegue lo stesso comando.

notes list [--all | --resolved] [--about ID] [--author AGENT_ID] [--limit N] [--after CURSOR]
ParametroTipoObbligatorioPredefinitoNote
--allflagnonote aperteIncludi note risolte.
--resolvedflagnonote aperteSolo note risolte.
--about IDstringnoogni notaSolo note su uno schermo o playlist: screen:ID, playlist:ID, o l’id.
--author AGENT_IDstringnoogni autoreSolo note scritte da questo agente.
--limit Nintegerno50Dimensione pagina, da 1 a 200.
--after CURSORstringnola prima paginaIl next_cursor della pagina precedente.
screenrig notes

Ogni nota contiene il suo author (nome e tipo dell’agente), created_at, about, e due flag: new per una nota scritta da un altro agente dopo la tua ultima lettura, e due per una nota da rivedere. La prima pagina di note aperte senza --about o --author è la tua lettura: sposta il tuo marcatore di lettura (la lettura di un agente Solo lettura non sposta nulla), quindi new e counts.new descrivono cosa è cambiato dalla tua lettura precedente.

notes show#

Leggi una nota, aperta o risolta.

notes show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID nota nte_.
screenrig notes show nte_01EXAMPLENOTE000000000

notes add#

Scrivi una nota per gli agenti del progetto.

notes add <text> [--about ID] [--ttl DURATION] [--replaces ID]
notes add --file FILE [--about ID] [--ttl DURATION] [--replaces ID]
ParametroTipoObbligatorioPredefinitoNote
<text>stringuno dei duenessunoLa nota: da 1 a 2000 caratteri di testo semplice dopo la pulizia.
--file FILEpathuno dei duenessunoLeggi la nota da un file, o - per l’input standard.
--about IDstringnol’intero progettoCollega la nota a uno schermo o a una playlist: screen:ID, playlist:ID o l'id.
--ttl DURATIONstringnorevisione dopo 90 giorniRisolvi la nota automaticamente dopo questo intervallo, in ore o giorni da 1h a 365d, ad esempio 12h o 3d.
--replaces IDstringnonessunoUna nota aperta che questa sostituisce; è risolta come sostituita.
screenrig notes add "The lobby screen is mounted in portrait: design for 1080x1920." --about screen:scr_01EXAMPLESCREEN00000000

Scrivi fatti su cui un altro agente agirebbe, mai rapporti di progresso o chat. Una nota il cui testo (ignorando maiuscole e spazi) e soggetto ripetono una nota aperta conferma quella nota invece di aggiungerne una, con l’avviso note_matched_open. Testo a forma di credenziali è rifiutato con note_contains_credential, e testo che sembra un’istruzione a un modello con note_rejected; nulla è memorizzato. La 201ª nota aperta nei progetti dell’organizzazione è rifiutata con note_limit_reached, il cui dettaglio nomina le note da risolvere prima.

notes confirm#

Indica che una nota aperta è ancora valida. La sua prossima revisione è tra 90 giorni.

notes confirm <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID di una nota aperta nte_.
screenrig notes confirm nte_01EXAMPLENOTE000000000

notes resolve#

Risolvi una nota aperta che è errata o non più valida.

notes resolve <id> <reason>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID di una nota aperta nte_.
<reason>stringsìnessunoCosa è vero ora, da 1 a 500 caratteri.
screenrig notes resolve nte_01EXAMPLENOTE000000000 "The lobby screen was remounted in landscape."

Una nota risolta è rifiutata con note_not_open.

Operazioni

I caricamenti e le pubblicazioni vengono eseguiti come operazioni. media upload, media replace e app upload attendono la propria per impostazione predefinita; questi comandi servono a concludere un’operazione lasciata in esecuzione con --no-wait.

operations show#

Leggi lo stato corrente di un’operazione.

operations show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’id operazione dalla busta che l’ha avviata.
screenrig operations show op_01EXAMPLEOPERATION00000

operations wait#

Interroga un’operazione finché non termina.

operations wait <id> [--timeout MS] [--poll-ms MS]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’id operazione.
--timeout MSintegerno120000Scadenza per l’attesa. Limita anche ogni richiesta sottostante.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
screenrig operations wait op_01EXAMPLEOPERATION00000

operations cancel#

Chiedi al piano di controllo di annullare un’operazione.

operations cancel <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’id operazione.
screenrig operations cancel op_01EXAMPLEOPERATION00000

Eventi

Il registro eventi del progetto registra cosa ha fatto il progetto e cosa ha fatto la flotta. Un rilascio pubblicato aggiunge application.published; un’app che chiama screenrig.emit(code) aggiunge il proprio evento, che è la prova più diretta che è stata eseguita su uno schermo.

La presenza è anche nel log. screen.offline è scritto una volta che uno schermo è offline da 60 secondi, e screen.online quando torna online; una riconnessione entro quei 60 secondi non scrive nulla. screen.offline contiene details.offline_since e, quando lo schermo è stato online prima, details.last_online_at. screen.online contiene details.last_online_at, più details.offline_at quando lo schermo era offline prima di tornare. Come ogni evento screen.*, sono gratuiti sul flusso di ascolto, così un agente può mantenere events follow aperto per osservare una flotta.

events list#

Leggi una pagina finita di eventi progetto.

events list [--after CURSOR] [--limit N] [--type TYPE] [--screen-id ID] [--app-id ID]
ParametroTipoObbligatorioPredefinitoNote
--after CURSORstringnol’inizio della finestra paginaRiprendi dopo questo cursore.
--limit Nintegernola dimensione pagina del serverDimensione pagina richiesta.
--type TYPEstringnoogni tipoUn tipo di evento, o una famiglia identificata da un prefisso che termina con un punto, come note..
--screen-id IDstringnoogni schermoEventi la cui risorsa è questo schermo, inclusi quelli emessi dall’SDK.
--app-id IDstringnoogni applicazioneEventi della risorsa applicazione, delle release e delle voci K/V; esclude gli eventi emessi dall’SDK.
screenrig events list --limit 25
screenrig events list --type application.event --screen-id scr_SCREEN

I metodi SDK emit() ed emitConfirmed() aggiungono record application.event la cui risorsa è lo schermo. Leggili con --type application.event, aggiungendo facoltativamente --screen-id. I campi restituiti details.primitive_id e details.code identificano la primitiva emittente e l’azione denominata. --app-id seleziona gli eventi della risorsa applicazione, delle release e delle voci K/V, quindi esclude questi eventi dello schermo.

L’output predefinito è una busta JSON per pagina. Con --human, l’output è una linea logfmt per evento: at=, type=, severity= e dettagli scalari.

events follow#

Rimani sul flusso eventi e stampa gli eventi man mano che arrivano.

events follow [--after CURSOR] [--timeout MS] [--type TYPE]
ParametroTipoObbligatorioPredefinitoNote
--after CURSORstringnola coda liveRiprendi da questo cursore.
--timeout MSintegernonessuna scadenzaTermina tutto il follow, incluso il backoff di riconnessione.
--type TYPEstringnoogni tipoUn tipo di evento, o una famiglia identificata da un prefisso che termina con un punto, come note..
screenrig events follow

Una disconnessione o un errore transitorio si riconnettono con backoff e riprendono dall’ultimo id evento. La riproduzione dopo una riconnessione è gratuita. Problemi di autorizzazione e not-found fermano il comando invece di ritentarlo.

Con --type, lo stream trasmette comunque ogni evento e la CLI stampa solo quelli corrispondenti: screenrig events follow --type note. osserva le note del progetto.

L’output predefinito è NDJSON: una busta per evento su riga propria, anziché una singola busta. Usare --human per linee logfmt.

Notifiche

Una notifica avvisa una persona, o un altro sistema, quando uno schermo cambia stato. Una notifica e-mail invia un’e-mail a ogni destinatario, una notifica webhook invia un POST HTTPS firmato e una notifica Slack, Teams, PagerDuty o Telegram pubblica un messaggio in una chat o in un sistema di reperibilità. Un’organizzazione ne ha al massimo 50, tutti i canali e tutti i suoi progetti insieme, e ogni progetto parte con un’e-mail al proprietario quando uno schermo è offline da 10 minuti.

Una notifica monitora le condizioni che indichi:

CondizioneInizia quandoTermina quando
screen_offlineIl Player è offline da 60 secondi.Lo schermo è di nuovo online.
display_disconnectedIl Player segnala il display disconnesso.Il display si riconnette.
running_hotIl dispositivo segnala una temperatura pari o superiore alla soglia di surriscaldamento.La temperatura torna normale.
on_batteryUn dispositivo con batteria segnala che funziona a batteria, scollegato.Il dispositivo segnala un’altra fonte di alimentazione.
storage_fullLo spazio di archiviazione del Player non basta per i suoi contenuti.La carenza si risolve.
content_stuckL’aggiornamento dei contenuti dello schermo sta riprovando, è fallito, bloccato o parziale.L’aggiornamento raggiunge qualsiasi altro stato.
not_playingIl Player mostra un errore al posto dei suoi contenuti. Lo spazio di archiviazione pieno è storage_full.Lo stato del Player non è più un errore.
loop_stalledUno schermo online, in orario e con contenuti aggiornati non ha avviato alcuna immagine o video per più tempo di quanto consenta il suo ciclo.Un’immagine o un video riparte, oppure screenRIG smette di giudicare lo schermo.
glass_blankGli screenshot che screenRIG ha preso lungo una serie che copre l’intero ciclo erano tutti di un’unica tinta uniforme.Due screenshot di fila mostrano un’immagine, oppure screenRIG smette di giudicare lo schermo.
glass_frozenGli screenshot che screenRIG ha preso lungo una serie che copre l’intero ciclo mostravano tutti la stessa immagine.Due screenshot di fila mostrano un’immagine in movimento, oppure screenRIG smette di giudicare lo schermo.
crashingIl Player è andato in crash o ha riavviato il proprio renderer ripetutamente.Mai: ogni picco è un avviso a sé.
source_failedL'aggiornamento di una fonte di dati è fallito.Un aggiornamento riesce.
source_staleUna fonte di dati ha continuato a fallire finché i suoi dati non sono scaduti.Un aggiornamento riesce.
card_data_staleI dati di una scheda, scritti con una scadenza, l’hanno raggiunta mentre uno schermo mostra la scheda e nulla li ha rinnovati.Una scrittura nei dati della scheda va a buon fine.
reach_droppedUna campagna raggiunge meno schermi di quando è stata pubblicata l'ultima volta, perché gli schermi hanno lasciato i suoi tag o le sue cartelle, oppure sono stati archiviati o eliminati.La campagna raggiunge di nuovo altrettanti schermi, oppure viene pubblicata di nuovo.
group_emptyUn tag o una cartella nel pubblico di una campagna non corrisponde ad alcuno schermo.Il tag o la cartella corrisponde di nuovo a uno schermo, oppure una pubblicazione lo rimuove dal pubblico.

Una condizione invia un avviso quando dura da --hold minuti (predefinito 10), così una riconnessione rapida resta silenziosa. Se termina prima, non viene inviato nulla; se termina dopo l’invio di un avviso, segue un avviso di risoluzione. Per crashing l’avviso viene inviato subito. Un avviso viene saltato anche quando qualcuno riconosce o posticipa l’alert dello schermo durante il tempo di attesa, o quando un silenziamento copre lo schermo. --tag limita una notifica agli schermi con quel tag; senza, vengono considerati tutti gli schermi.

Ogni avviso ha una gravità. Un avviso aperto è error per screen_offline e warning per ogni altra condizione, e un avviso risolto o un test è info. --min-severity LEVEL (info, warning o error) non crea alcun avviso aperto sotto quel livello, e un avviso risolto segue quello aperto. --severity CONDITION=LEVEL, ripetibile, imposta il livello di una condizione per questa notifica, ad esempio --severity not_playing=error; conta per --min-severity ed è la gravità che Teams e PagerDuty mostrano. Il testo di e-mail, Slack e Telegram indica la gravità, e il corpo di un webhook porta severity.

--active-hours SPEC invia gli avvisi aperti solo all'interno di finestre settimanali, lette in --timezone ZONE, che è obbligatorio. SPEC è DAYS HH:MM-HH:MM, ad esempio "Mon-Fri 08:00-22:00"; ripetilo fino a 16 volte. Con --outside-hours hold, il valore predefinito, un avviso in scadenza fuori orario attende la finestra successiva e parte allora se la sua condizione persiste, quindi una condizione che rientra prima non invia nulla. Con drop l'avviso viene saltato come outside_hours, che notifications deliveries elenca. Un avviso di risoluzione per un avviso aperto che è stato inviato parte sempre, crashing segue gli orari come qualsiasi altra condizione, un posticipo viene controllato per primo, e notifications test ignora orari, gravità e pubblico.

--audience FILE (JSON inline, un file o - per stdin) sceglie gli schermi con le regole di un pubblico di campagna, ad esempio {"all":[{"tag":"level2"},{"tag":"overhead"}]} per gli schermi con entrambi i tag; --all-tags TAG e --any-tag TAG sono le scorciatoie per una regola all e una any di tag, e --tag indica uno qualsiasi dei tag. --tag, --any-tag, --all-tags e --audience si escludono a vicenda.

loop_stalled, glass_blank e glass_frozen sono verdetti che screenRIG trae dai report di riproduzione e dagli screenshot che riceve, e lasciano fuori ciò che non possono giudicare: uno schermo offline, con il display spento, sotto takeover o sospeso, che mostra una sola immagine fissa o un video wall, o il cui Player non invia numeri di riproduzione. Quando screenRIG smette di giudicare uno schermo che aveva trovato in uno di questi stati, l’alert si chiude, ma e-mail, Slack, Teams e Telegram non inviano alcun avviso di risoluzione, perché nulla ha mostrato lo schermo ripristinarsi; PagerDuty risolve comunque il suo incidente.

source_failed e source_stale controllano le fonti di dati del progetto, non i suoi schermi: un avviso nomina la fonte e collega la sua pagina, e --tag non corrisponde mai a una fonte.

card_data_stale osserva una scheda, non uno schermo. Scrivi i dati di una scheda con una scadenza commisurata alla pianificazione di chi li scrive (card data put --ttl 30m): quando il job o l’agente che li rinnova si ferma, i dati scadono, la scheda è vuota su ogni schermo che la mostra, e questa condizione te lo segnala. L’avviso nomina la scheda e quando i suoi dati sono scaduti, e collega l’editor di pagine su una pagina che la colloca. I documenti di un’origine dati non vengono mai annunciati qui (source_stale li copre), né una scheda che nessuno schermo mostra, dati scritti senza scadenza o dati eliminati. --tag non corrisponde mai a una scheda.

reach_dropped e group_empty controllano una campagna, non uno schermo. L'avviso nomina la campagna e gli schermi che raggiungeva prima e che raggiunge ora, oppure il tag o la cartella vuoti, e rimanda al calendario della campagna. Una campagna appartiene al progetto, quindi --tag, --any-tag, --all-tags e --audience non le limitano mai; --min-severity, --severity, --active-hours e --hold valgono come per qualsiasi condizione, ed entrambe sono warning per impostazione predefinita. --reach-drop-screens N e --reach-drop-percent P inviano un avviso reach_dropped solo per un calo di almeno N schermi e di almeno P percento degli schermi che la campagna raggiungeva quando è stata pubblicata; un calo deve soddisfare entrambi, e senza di essi qualsiasi calo notifica. Richiedono reach_dropped in --conditions. Ogni tag o cartella vuoti di una campagna sono un avviso a sé, e notifications deliveries lo mostra come audience_group (tag:Lobby o folder:sfd_…). Una pubblicazione che rimuove un gruppo vuoto dal pubblico chiude un incidente PagerDuty e un alert del webhook, ma non invia alcuna email o messaggio di chat di ripristino.

L’email arriva all’indirizzo verificato di ogni destinatario, un’email per destinatario per tutto ciò che va inviato entro circa due minuti, con un link a ogni schermo e alla notifica nella dashboard. I destinatari sono owner, chiunque possieda il progetto quando l’avviso viene inviato, e gli ID utente dei membri del progetto. Un destinatario senza indirizzo verificato, o che ha lasciato il progetto, viene saltato. Le email di notifica e gli avvisi di schermo sono gratuiti.

Ogni email contiene un link di annullamento dell’iscrizione per il suo destinatario: il pulsante di annullamento iscrizione delle app di posta e un link nel piè di pagina. Seguirlo interrompe le email di quella notifica per quella sola persona, senza accedere, e la pagina che si apre ha un pulsante Resubscribe. Gli altri destinatari non sono interessati e la persona resta tra i destinatari. notifications show elenca chi ha annullato l’iscrizione con unsubscribed, e notifications resubscribe le invia di nuovo le email. Un avviso senza nessuno a cui scrivere viene saltato come no_recipients.

Una notifica webhook invia ogni avviso come JSON via POST; lo verifichi come descritto in Verifica una consegna. Con --events invia anche gli eventi grezzi del progetto, via POST, man mano che accadono; quelle consegne sono conteggiate come descritto in Webhook.

Una notifica Slack, Teams, PagerDuty o Telegram pubblica un messaggio per interruzione e per schermo: lo schermo, cosa è cambiato, da quando, il progetto, un link allo schermo e, quando uno schermo offline torna, la causa probabile se è già nota. Un messaggio di ripristino segue una volta inviato il primo e, in PagerDuty, risolve l'incidente aperto dal primo. La credenziale si indica una sola volta (--slack accetta l'URL di un webhook in entrata, --teams l'URL di un webhook di Workflows, --pagerduty una chiave di instradamento dell'API Events v2, --telegram un token di bot con --telegram-chat); viene sigillata, non viene mai più mostrata e destination_hint ne mostra solo la fine mascherata. Un - la legge da una riga di stdin così non finisce nella cronologia della tua shell. Una pubblicazione fallita viene ritentata per 24 ore, e una notifica che fallisce per 72 ore viene disattivata.

Codice problemaEsciSignificato
webhook_url_rejected8L’URL non è https sulla porta 443 o 8443, o il suo host non risolve solo indirizzi pubblici Internet. error.detail riporta la ragione del server. Non è stato creato o modificato nulla.
notification_destination_rejected8La destinazione non è adatta al suo canale, oppure è l'URL di un connettore Office 365 ritirato. error.detail indica la forma adatta. Non è stato creato né modificato nulla.
notification_limit_reached5L’organizzazione ha già 50 notifiche. Eliminane prima una.
revision_conflict6La revisione --expect-rev era obsoleta. Esegui notifications show, poi riprova.
rate_limited7Più di 20 chiamate notifications test in un minuto per questa organizzazione.

notifications create#

Crea una notifica e-mail, webhook, Slack, Teams, PagerDuty o Telegram.

notifications create (--email RECIPIENTS | --webhook URL | --slack URL | --teams URL | --pagerduty KEY
                      | --telegram TOKEN --telegram-chat CHAT_ID) [--conditions LIST] [--events TYPES]
                     [--tag TAG... | --any-tag TAG... | --all-tags TAG... | --audience FILE] [--hold MINUTES]
                     [--min-severity LEVEL] [--severity CONDITION=LEVEL]... [--active-hours SPEC]...
                     [--timezone ZONE] [--outside-hours hold|drop] [--reach-drop-screens N] [--reach-drop-percent P]
                     [--description TEXT] [--disabled]
ParametroTipoObbligatorioPredefinitoNote
--email RECIPIENTSstringun flag di canalenessunoInvia email a questi destinatari separati da virgola: owner, o l’ID utente di un membro del progetto, al massimo 20.
--webhook URLstringun flag di canalenessunoUn URL https sulla porta 443 (predefinita) o 8443 il cui host risolve solo in indirizzi Internet pubblici. Il server lo verifica ad ogni scrittura e di nuovo prima di ogni consegna. Un URL che trasporta credenziali (user:pass@ o token@) o un frammento # è rifiutato localmente con uscita 2.
--conditions LISTstringsì, tranne per un webhooknessunoCondizioni separate da virgola, dalla tabella qui sopra. Un webhook richiede questo, --events o entrambi.
--slack URLstringun flag di canalenessunoPubblica in Slack con l'URL di un webhook in entrata su hooks.slack.com, oppure - per leggerlo da una riga di stdin.
--teams URLstringun flag di canalenessunoPubblica in Teams con l'URL di un webhook di Workflows (il trigger «Alla ricezione di una richiesta webhook di Teams»), oppure - per stdin. Gli URL dei connettori Office 365 sono ritirati e rifiutati.
--pagerduty KEYstringun flag di canalenessunoAttiva e risolve incidenti PagerDuty con una chiave di instradamento dell'API Events v2, oppure - per stdin.
--telegram TOKENstringun flag di canalenessunoPubblica in Telegram con un token di bot, oppure - per stdin. Richiede --telegram-chat.
--telegram-chat CHAT_IDstringcon --telegramnessunoLa chat in cui pubblicare: il suo id numerico, come -1001234567890, oppure @channelname.
--events TYPESstringnonessunoSolo webhook. Invia con POST anche questi eventi grezzi del progetto: da 1 a 32 tipi esatti separati da virgola, come screen.online, o prefissi che terminano con .*, come screen.*.
--tag TAGstringnoogni schermoSolo gli schermi con questo tag. Ripeti il flag o separa con virgole, fino a 16 tag.
--hold MINUTESintegerno10Quanto deve durare una condizione prima di inviare un avviso, da 0 a 1440. crashing non ha mai un tempo di attesa.
--all-tags TAGstringnonessunoSolo gli schermi con tutti i tag elencati. Ripeti il flag o separa con virgole.
--any-tag TAGstringnonessunoSolo gli schermi con almeno uno dei tag elencati, come --tag. Ripeti il flag o separa con virgole.
--audience FILEstringnoogni schermoGli schermi come regola di pubblico di campagna in JSON: inline, un file o - per stdin. Non insieme alle opzioni dei tag.
--min-severity LEVELstringnonessunoinfo, warning o error: gli avvisi aperti sotto questo livello non vengono inviati.
--severity CONDITION=LEVELstringnoi valori predefinitiImposta la gravità di una condizione per questa notifica. Ripeti il flag.
--active-hours SPECstringnosempreInvia gli avvisi aperti solo in questa finestra settimanale, DAYS HH:MM-HH:MM ad esempio "Mon-Fri 08:00-22:00". Ripeti fino a 16 volte. Richiede --timezone.
--timezone ZONEstringcon --active-hoursnessunoIl fuso IANA in cui vengono letti gli orari, ad esempio America/Los_Angeles.
--outside-hours MODEstringnoholdhold attende la finestra successiva; drop salta l'avviso.
--reach-drop-screens Nintegernoqualsiasi caloSolo con reach_dropped: invia un avviso solo quando la campagna ha perso almeno N schermi (1 o più).
--reach-drop-percent Pintegernoqualsiasi caloSolo con reach_dropped: richiede inoltre un calo di almeno P percento (da 1 a 100) degli schermi che la campagna raggiungeva quando è stata pubblicata.
--description TEXTstringnonessunoAl massimo 200 caratteri.
--stale-after DURATIONstringnosecondo il tipoPer quanto tempo la scheda conserva gli ultimi dati validi quando la fonte non riesce ad aggiornarsi, da 1m a 7d, almeno il doppio di --refresh; none li conserva fino al prossimo aggiornamento. Dopo, i dati scadono su ogni schermo. momentus è 30m per impostazione predefinita.
--disabledbooleannospentoCreala disabilitata. Non viene inviato nulla fino a notifications update --enable.
screenrig notifications create --email owner --conditions screen_offline,display_disconnected --tag Lobby
screenrig notifications create --webhook https://hooks.example.com/screenrig --conditions screen_offline,crashing
screenrig notifications create --slack - --conditions screen_offline,crashing < slack-url.txt

La busta è la notifica. Quella di un webhook contiene il suo segreto di firma in data.secret (whsec_…) con l’avvertenza webhook_secret_shown_once. Conserva subito il segreto nel deposito segreto del ricevitore. Solo notifications rotate-secret lo restituisce di nuovo, e la CLI non lo scrive mai nella configurazione, nel registro operativo o nello stato di recupero scrittura. Dopo una creazione interrotta o ambigua, riesegui lo stesso comando entro 24 ore: riutilizza la chiave di idempotenza salvata e il server restituisce la stessa risposta, segreto incluso. Gli avvisi partono dal primo evento successivo alla creazione della notifica.

notifications list#

Elenca le notifiche di questo progetto, mai i loro segreti.

notifications list
screenrig notifications list

Sotto l’accesso Gestisci, url di un webhook è vuoto e url_redacted è true.

notifications show#

Ispeziona una notifica e la sua salute di consegna.

notifications show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id di notifica ntf_ (qualsiasi canale tranne webhook) o whk_ (webhook).
screenrig notifications show ntf_01EXAMPLENOTICE00000

status è active, failing mentre nessuna consegna è riuscita da failing_since, o disabled. Dopo 72 ore di fallimenti continui la notifica viene disabilitata con disabled_reason: delivery_failures, e il registro eventi riporta notification.disabled. snoozed_until è presente mentre è impostato uno snooze. last_success_at e last_failure_at riportano gli ultimi risultati.

notifications update#

Modifica i destinatari, l'URL, la destinazione, le condizioni, gli schermi, l'attesa, la sospensione o lo stato di attivazione di una notifica.

notifications update <id> [--email RECIPIENTS | --url URL | --destination VALUE] [--telegram-chat CHAT_ID]
                          [--conditions LIST | --clear-conditions]
                          [--events TYPES | --clear-events] [--tag TAG... | --any-tag TAG... | --all-tags TAG... | --audience FILE | --all-screens]
                          [--hold MINUTES] [--min-severity LEVEL | --clear-min-severity]
                          [--severity CONDITION=LEVEL]... [--clear-severity]
                          [--active-hours SPEC]... [--timezone ZONE] [--outside-hours hold|drop] [--clear-active-hours]
                          [--reach-drop-screens N] [--reach-drop-percent P] [--clear-reach-drop]
                          [--description TEXT | --clear-description] [--enable | --disable]
                          [--snooze WHEN] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id di notifica ntf_ (qualsiasi canale tranne webhook) o whk_ (webhook).
--email RECIPIENTSstringalmeno una modificainvariatoNotifiche email: sostituisce i destinatari.
--url URLstringalmeno una modificainvariatoNotifiche webhook: sostituisce l’URL, controllato come create.
--destination VALUEstringalmeno una modificainvariatoNotifiche Slack, Teams, PagerDuty e Telegram: sostituisce la credenziale, verificata come in create. - la legge da una riga di stdin.
--telegram-chat CHAT_IDstringalmeno una modificainvariatoNotifiche Telegram: sostituisce la chat.
--conditions LISTstringalmeno una modificainvariatoSostituisce le condizioni.
--clear-conditionsbooleanalmeno una modificaspentoRimuovi ogni condizione. Un webhook richiede quindi --events.
--events TYPESstringalmeno una modificainvariatoNotifiche webhook: sostituisce gli eventi grezzi del progetto.
--clear-eventsbooleanalmeno una modificaspentoNotifiche webhook: interrompe l’invio POST degli eventi grezzi del progetto. Richiede quindi delle condizioni.
--tag TAGstringalmeno una modificainvariatoSostituisce i tag degli schermi.
--all-screensbooleanalmeno una modificaspentoRimuove i tag degli schermi e il pubblico; la notifica copre ogni schermo.
--hold MINUTESintegeralmeno una modificainvariatoDa 0 a 1440.
--all-tags TAGstringalmeno una modificainvariatoSostituisce gli schermi con quelli che hanno tutti i tag elencati.
--any-tag TAGstringalmeno una modificainvariatoSostituisce gli schermi con quelli che hanno almeno uno dei tag elencati, come --tag.
--audience FILEstringalmeno una modificainvariatoSostituisce gli schermi con una regola di pubblico di campagna in JSON: inline, un file o - per stdin.
--min-severity LEVELstringalmeno una modificainvariatoinfo, warning o error.
--clear-min-severitybooleanalmeno una modificaspentoRimuove il filtro di gravità.
--severity CONDITION=LEVELstringalmeno una modificainvariatoSostituisce gli override di gravità con questi. Ripeti il flag.
--clear-severitybooleanalmeno una modificaspentoRimuove ogni override di gravità.
--active-hours SPECstringalmeno una modificainvariatoSostituisce le finestre con queste. Ripeti fino a 16 volte. --timezone usa per impostazione predefinita il fuso che la notifica ha già.
--timezone ZONEstringalmeno una modificainvariatoIl fuso IANA in cui vengono letti gli orari. Da solo, mantiene le finestre attuali.
--outside-hours MODEstringalmeno una modificainvariatohold o drop. Da solo, mantiene le finestre attuali.
--clear-active-hoursbooleanalmeno una modificaspentoRimuove gli orari attivi. Gli avvisi trattenuti per essi vengono rigiudicati subito.
--reach-drop-screens Nintegeralmeno una modificainvariatoSostituisce il numero minimo di schermi che la campagna deve aver perso perché un avviso reach_dropped venga inviato.
--reach-drop-percent Pintegeralmeno una modificainvariatoSostituisce la percentuale minima della copertura pubblicata che la campagna deve aver perso.
--clear-reach-dropbooleanalmeno una modificaspentoRimuove la soglia, così qualsiasi calo notifica. Togli reach_dropped da --conditions solo insieme alla soglia.
--description TEXTstringalmeno una modificainvariatoAl massimo 200 caratteri.
--clear-descriptionbooleanalmeno una modificaspentoRimuovi la descrizione.
--enablebooleanalmeno una modificaspentoCancella lo stato di errore e riparte dall’evento che registra la modifica; non viene inviato nulla di ciò che è accaduto mentre era disabilitata.
--disablebooleanalmeno una modificaspentoInterrompe gli avvisi; gli avvisi in sospeso falliscono con webhook_disabled.
--snooze WHENstringalmeno una modificainvariatoNon inviare nulla fino ad allora: una durata come 30m, 1h o 2d (meno di 30 giorni), un istante RFC 3339 con secondi e offset, oppure off per terminare lo snooze. Gli avvisi da inviare nel frattempo vengono saltati, non inviati più tardi.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione.
screenrig notifications update ntf_01EXAMPLENOTICE00000 --snooze 2h

update modifica solo i campi passati. Il canale non cambia mai.

notifications delete#

Elimina una notifica. I suoi avvisi in sospeso falliscono con webhook_deleted.

notifications delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id di notifica ntf_ (qualsiasi canale tranne webhook) o whk_ (webhook).
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione.
screenrig notifications delete ntf_01EXAMPLENOTICE00000

notifications rotate-secret#

Sostituisce il segreto di firma di una notifica webhook e restituisce il nuovo una sola volta. Qualsiasi altro canale non ha un segreto.

notifications rotate-secret <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id di notifica ntf_ (qualsiasi canale tranne webhook) o whk_ (webhook).
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione.
screenrig notifications rotate-secret whk_01EXAMPLEWEBHOOK00000

La busta contiene il nuovo segreto in data.secret con l’avviso webhook_secret_shown_once; conservalo subito. Il segreto precedente smette di firmare, ma al massimo un tentativo già in corso può ancora arrivare firmato con esso, quindi accetta entrambi per un breve periodo. Dopo una rotazione interrotta o ambigua, riesegui lo stesso comando entro 24 ore per recuperare lo stesso segreto.

notifications test#

Invia un'e-mail di prova, un POST di prova firmato o un messaggio di chat solo a questa notifica.

notifications test <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id di notifica ntf_ (qualsiasi canale tranne webhook) o whk_ (webhook).
screenrig notifications test ntf_01EXAMPLENOTICE00000

La busta è la consegna in coda. Viene tentata una volta senza ritentativi, funziona su una notifica disabilitata o in snooze e non cambia mai lo stato di errore della notifica. Al massimo 20 consegne di test al minuto per organizzazione; di più è rate_limited (uscita 7). Leggi l’esito con notifications deliveries.

Un test PagerDuty attiva un evento informativo con chiave screenrig:test:DELIVERY_ID e lo risolve subito, così nessun incidente resta aperto.

notifications resubscribe#

Invia di nuovo le email di una notifica a una persona che ha annullato l’iscrizione.

notifications resubscribe <id> --user USER_ID
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID ntf_ di una notifica via email.
--user USER_IDstringsìnessunoL’ID utente della persona, come lo elenca notifications show sotto unsubscribed.
screenrig notifications resubscribe ntf_01EXAMPLENOTICE00000 --user usr_01EXAMPLEPERSON0000

La busta è la notifica. Una persona che non ha annullato l’iscrizione non cambia nulla. Reiscrivere una persona aumenta la revisione e aggiunge notification.updated. Una notifica di un altro canale o progetto è not_found (uscita 4).

notifications deliveries#

Leggi il registro di consegna di una notifica, dalla più recente.

notifications deliveries <id> [--before CURSOR] [--limit N]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL'id di notifica ntf_ (qualsiasi canale tranne webhook) o whk_ (webhook).
--before CURSORstringnol’evento più recenteIl next_cursor (whc1_…) della pagina precedente.
--limit Nintegerno50Righe per pagina, da 1 a 200.
screenrig notifications deliveries ntf_01EXAMPLENOTICE00000 --limit 20

Ogni riga è un evento, o un avviso per una condizione su uno schermo: event_type, state (pending, succeeded, failed o skipped), attempts, last_status e una classe last_error fissa come http_status, timeout, connection_failed, tls_failed, dns_failed, url_rejected, email_failed o email_rejected. Un avviso di schermo aggiunge condition, phase (opened o resolved), screen_id, screen_name e since, e un avviso email aggiunge emailed, il numero di persone raggiunte. Un avviso che non ha mai dovuto essere inviato è skipped, con il motivo in last_error: condition_cleared (lo schermo è uscito dallo stato prima della fine del tempo di attesa), not_opened (nessun avviso da risolvere era stato inviato), snoozed (la notifica è in snooze), acknowledged (qualcuno ha riconosciuto o posticipato l’alert dello schermo durante il tempo di attesa), muted (un silenziamento copre lo schermo), no_recipients (nessun destinatario è un membro del progetto con un indirizzo verificato che non si sia disiscritto), grouped (lo schermo è entrato nella condizione insieme ad altri, e un solo avviso su un’altra riga li indica tutti) o no_longer_judged (una condizione loop_stalled, glass_blank o glass_frozen è terminata perché screenRIG ha smesso di giudicare lo schermo, quindi non è stato annunciato alcun ripristino). L’avviso che ha comunicato un gruppo di schermi riporta group (id, attribute, value e count), e ogni altro schermo del gruppo riporta group_id; --human mostra entrambi in una colonna GROUP. Le righe non includono mai la risposta del ricevitore. next_cursor è null alla fine del registro. Un tentativo fallito viene ripetuto con backoff, da 30 secondi raddoppiando fino a un’ora, per 24 ore, poi la riga è failed.

Verifica una consegna

Il corpo di un avviso di schermo è JSON: type (alert.opened o alert.resolved), id (l’ID della consegna), notification_id, project_id, condition, screen (id e name), since (quando la condizione è iniziata), at (quando è durata abbastanza a lungo, o si è risolta) e event_id. Un evento grezzo da --events è lo stesso oggetto JSON che events list restituisce. Gli header sono ScreenRig-Webhook-Id (l’ID della notifica), ScreenRig-Event-Id (stabile tra i retry: l’ID della consegna per un avviso, il cursore dell’evento per un evento) e ScreenRig-Signature: t=<unix seconds>,v1=<hex>, dove v1 è HMAC-SHA256 su "<t>.<raw body>" con chiave la stringa segreta. Calcolalo sui byte grezzi prima di analizzare JSON, confronta in tempo costante, rifiuta un vecchio t e deduplica su ScreenRig-Event-Id, perché la consegna avviene almeno una volta e non in ordine. Rispondi 2xx entro 10 secondi; i redirect non vengono seguiti.

import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body bytes (Buffer) exactly as received.
function verify(rawBody, signatureHeader, secret, toleranceSeconds = 300) {
  if (typeof signatureHeader !== "string" || !signatureHeader) return false;
  const parts = Object.fromEntries(signatureHeader.split(",").map((part) => part.split("=", 2)));
  const t = Number(parts.t);
  if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return false;
  const expected = createHmac("sha256", secret).update(`${t}.`).update(rawBody).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}

Report

reports show KIND genera un report (fleet_health, uptime, publishing, alerts, alert_log o proof_of_play) e, con --format csv, xlsx o pdf e --output FILE, lo scrive in un file; reports subscriptions invia un report via email ai membri del progetto secondo una programmazione; project export DIR scrive i dati del progetto con l’esito di ogni sezione. Report ed esportazioni descrive ciascuno.

Registro di audit

audit list|show|head|verify|export legge il registro di audit del progetto: audit list cerca le modifiche di configurazione per attore, origine, risorsa, azione e campo, audit show mostra una voce con il prima e il dopo di ogni campo modificato, audit head mostra la testa della catena da conservare come ancora, audit verify ricalcola la catena (se si vuole rispetto a un’ancora) e termina con il codice 13 quando non risulta verificata, e audit export scrive il registro filtrato in un file CSV, XLSX o PDF. Registro di audit descrive ciascuno di essi.

Alert

Un alert è un problema su uno schermo finché dura. Si apre quando uno schermo entra in una condizione di notifica diversa da crashing, che una notifica la controlli o no, e si risolve quando la condizione termina. Uno schermo ha al massimo un alert aperto per condizione, e un picco di crash è un avviso, mai un alert. alerts list mostra ciò che è aperto adesso.

Un alert aperto richiede attenzione finché qualcuno non lo riconosce o lo posticipa, o finché un silenziamento non copre il suo schermo. Riconoscere significa che qualcuno se ne sta occupando: l’alert resta aperto, registra chi lo ha riconosciuto e quando, e non richiede attenzione fino alla risoluzione. Posticipare riconosce fino a un momento al massimo 30 giorni più avanti, e l’alert richiede di nuovo attenzione allora se è ancora aperto. Un riconoscimento o un posticipo successivo sostituisce il precedente. Finché un alert è riconosciuto o posticipato, l’avviso di una notifica che lo riguarda e che è ancora nel tempo di attesa viene saltato.

Un silenziamento serve per la manutenzione: indica schermi, tag o entrambi e termina in un momento al massimo 30 giorni più avanti. Copre uno schermo finché il suo ID è nell’elenco o ha un tag dell’elenco, quindi uno schermo taggato in seguito è coperto e uno che perde il tag non lo è più. Gli alert di uno schermo silenziato si aprono e si risolvono comunque, contrassegnati muted, ma non richiedono mai attenzione, e ogni notifica salta i loro avvisi. Un’organizzazione ha al massimo 50 silenziamenti attivi in tutti i suoi progetti.

counts.attention in alerts list è il numero che la dashboard mostra accanto ad Alert. Aprire, risolvere e riconoscere un alert aggiunge screen.alert_opened, screen.alert_resolved e screen.alert_acknowledged al registro eventi del progetto, e creare e terminare un silenziamento aggiunge alert_mute.created e alert_mute.deleted. Come ogni evento screen.*, sono gratuiti sul flusso di ascolto. Gli alert risolti restano elencati per la durata di conservazione eventi del piano. Leggere alert e silenziamenti richiede l’accesso Solo lettura; riconoscere, posticipare, silenziare e rimuovere un silenziamento richiedono l’accesso Gestire.

Codice problemaEsciSignificato
alert_not_open5L’alert è già risolto, quindi non c’è nulla da riconoscere o posticipare. Esegui alerts list e usa uno aperto.
alert_mute_limit_reached5L’organizzazione ha già 50 silenziamenti attivi. Terminane uno con alerts unmute, oppure copri più schermi con un solo silenziamento per tag.
invalid_request8L’istante --until è a più di 30 giorni nel futuro. Non è stato modificato nulla.
not_found4Nessun alert né silenziamento del progetto ha questo ID. Un alert risolto scompare dopo la durata di conservazione eventi del piano, un silenziamento una volta terminato.

alerts list#

Elenca gli alert di questo progetto, prima quelli aperti.

alerts list [--state open|resolved|all] [--screen-id ID] [--before CURSOR] [--limit N]
ParametroTipoObbligatorioPredefinitoNote
--state STATEstringnoopenopen, resolved o all.
--screen-id IDstringnoogni schermoSolo gli alert di questo schermo.
--before CURSORstringnola prima paginaIl next_cursor della pagina precedente.
--limit Nintegerno100Righe per pagina, da 1 a 200.
screenrig alerts list
screenrig alerts list --state all --screen-id scr_01EXAMPLESCREEN00000000

Ogni riga è un alert: id (alr_…), screen_id, screen_name, condition, state (open o resolved), since (quando è iniziata la condizione), resolved_at una volta risolto, acknowledged_at e acknowledged_by (kind, id e name della persona o dell’agente) una volta riconosciuto, snoozed_until mentre è posticipato, muted e attention. Gli alert aperti vengono per primi, dal più recente. counts contiene open e attention per l’intero progetto, qualunque siano la pagina e i filtri, e next_cursor è null alla fine.

alerts show#

Mostra un alert.

alerts show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID alert alr_.
screenrig alerts show alr_01EXAMPLEALERT000000

La busta è l’alert, nella forma di una riga di alerts list.

alerts ack#

Riconosci un alert aperto: qualcuno se ne sta occupando.

alerts ack <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID alert alr_.
screenrig alerts ack alr_01EXAMPLEALERT000000

L’alert resta aperto e non richiede attenzione fino alla risoluzione; acknowledged_by indica la persona o l’agente e acknowledged_at l’ora. L’avviso di una notifica ancora nel tempo di attesa viene saltato. Riconoscere di nuovo sostituisce il riconoscimento o il posticipo precedente. Un alert risolto restituisce alert_not_open (uscita 5). La busta è l’alert, e il registro eventi riporta screen.alert_acknowledged.

alerts snooze#

Riconosci un alert aperto fino a un momento, così richiede di nuovo attenzione allora.

alerts snooze <id> (--for DURATION | --until TIME)
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID alert alr_.
--for DURATIONduratauno tra --for, --untilnessunoPer quanto posticipare da adesso: una durata come 30m, 4h o 2d, al massimo 29d23h59m.
--until TIMEstringuno tra --for, --untilnessunoQuando termina il posticipo: un istante RFC 3339 con secondi e offset, come 2026-11-01T09:00:00-07:00, al massimo 30 giorni più avanti.
screenrig alerts snooze alr_01EXAMPLEALERT000000 --for 4h

snoozed_until è l’ora in cui termina il posticipo. Fino ad allora l’alert non richiede attenzione e l’avviso di una notifica ancora nel tempo di attesa viene saltato, come per alerts ack; se a quel momento l’alert è ancora aperto, richiede di nuovo attenzione. Un alert risolto restituisce alert_not_open (uscita 5).

alerts mute#

Silenzia gli schermi per la manutenzione.

alerts mute [--screen-id ID]... [--tag TAG]... (--for DURATION | --until TIME) [--note TEXT]
ParametroTipoObbligatorioPredefinitoNote
--screen-id IDstringalmeno uno tra --screen-id, --tagnessunoUn scr_ ID schermo. Ripetilo, o elenca gli ID separati da virgola; massimo 100.
--tag TAGstringalmeno uno tra --screen-id, --tagnessunoOgni schermo con questo tag. Ripetilo, o elenca i tag separati da virgola; massimo 16.
--for DURATIONduratauno tra --for, --untilnessunoQuanto dura il silenziamento da adesso: una durata come 30m, 4h o 2d, al massimo 29d23h59m.
--until TIMEstringuno tra --for, --untilnessunoQuando termina il silenziamento: un istante RFC 3339 con secondi e offset, come 2026-11-01T09:00:00-07:00, al massimo 30 giorni più avanti.
--note TEXTstringnonessunoPerché gli schermi sono silenziati, per le persone che vedono il silenziamento; al massimo 200 caratteri.
screenrig alerts mute --tag Lobby --for 2h --note "Rewiring the lobby displays"

La busta è il silenziamento: id (amt_…), screen_ids, tags, until, note, created_by e created_at. Gli alert di ogni schermo coperto indicano muted subito, compresi quelli già aperti. Un’organizzazione ha al massimo 50 silenziamenti attivi in tutti i suoi progetti; uno in più è alert_mute_limit_reached (uscita 5), e un silenziamento terminato non conta più. Dopo un silenziamento interrotto o ambiguo, leggi prima alerts mutes: ripetere lo stesso comando con --until entro 24 ore restituisce lo stesso silenziamento, mentre una ripetizione con --for conta da un nuovo momento e ne crea un altro.

alerts mutes#

Elenca i silenziamenti non ancora terminati, prima quello che termina prima.

alerts mutes
screenrig alerts mutes

Ogni riga è un silenziamento come lo stampa alerts mute.

alerts unmute#

Termina un silenziamento adesso.

alerts unmute <mute-id>
ParametroTipoObbligatorioPredefinitoNote
<mute-id>stringsìnessunoL’ID silenziamento amt_.
screenrig alerts unmute amt_01EXAMPLEMUTE0000000

Gli alert aperti di quegli schermi richiedono di nuovo attenzione, e gli avvisi successivi non vengono più saltati perché silenziati. Un silenziamento terminato restituisce not_found (uscita 4). Il registro eventi riporta alert_mute.deleted.

Webhook

Un webhook invia gli eventi di questo progetto a un endpoint HTTPS che gestisci come POST firmati, così un evento corrispondente può svegliare un agente, un bot o il tuo servizio. Ogni evento corrispondente arriva come lo stesso oggetto JSON che events list restituisce. Un webhook è una notifica nella sua forma originale: rientra nelle 50 notifiche dell’organizzazione e notifications list lo mostra. Per il nuovo lavoro usa notifications, che invia anche email e avvisi di schermo.

Ogni tentativo di consegna viene conteggiato come un evento listen-stream fatturato: 1 credito dopo la soglia mensile di 10.000 API e listen-stream. Gli stessi eventi gratuiti sul listen stream sono gratuiti anche qui: screen.*, runtime.*, application.event, playback.page_failed e agent.command. Un tentativo rifiutato prima dell’invio non viene addebitato.

webhooks create --url URL --event-types TYPES [--description TEXT] [--disabled]
webhooks list
webhooks show <id>
webhooks update <id> [--url URL] [--event-types TYPES] [--description TEXT | --clear-description]
                     [--enable | --disable] [--expect-rev REVISION]
webhooks delete <id> [--expect-rev REVISION]
webhooks rotate-secret <id> [--expect-rev REVISION]
webhooks test <id>
webhooks deliveries <id> [--before CURSOR] [--limit N]

webhooks create risponde con webhook_limit_reached (uscita 5) quando l’organizzazione ha già 50 notifiche, mentre notifications create risponde con notification_limit_reached. Un URL rifiutato è webhook_url_rejected (uscita 8) in entrambi i casi.

Trigger alert CAP

Un trigger permette a un sistema di notifiche di emergenza, come Everbridge, Rave, Alertus o un relay IPAWS, di prendere il controllo degli schermi con avvisi CAP 1.2. Ogni trigger ha il proprio URL, nome utente e password, che inserisci nel sistema mittente come destinazione CAP HTTP POST con autenticazione HTTP Basic. Un’organizzazione ha al massimo 20 trigger in tutti i suoi progetti.

I trigger sono di due tipi. Un trigger CAP, descritto qui, accetta gli avvisi di un sistema di emergenza. Un trigger di sovrapposizione mostra ciò che pubblica qualsiasi mittente, come Home Assistant, un hub di sensori o uno strumento di allerta, come fascia sopra ciò che viene riprodotto o come acquisizione; triggers create --kind overlay ne crea uno, e triggers update, triggers deliveries, triggers clear e triggers rotate-secret servono entrambi i tipi.

Un trigger mira a un tag, risolto all’arrivo di ogni avviso, o fino a 500 ID schermo. Ogni Alert diventa un takeover della playlist del trigger: una scheda a schermo intero nel colore della sua gravità, con evento, titolo, descrizione e istruzioni. Un Exercise aggiunge un banner EXERCISE. Il takeover dura fino a <expires> dell’avviso, altrimenti il default --for del trigger (da 1 minuto a 7 giorni, 1 ora se non impostato), e mai oltre 7 giorni. Un Update ridisegna la scheda, e un Cancel o AllClear restituisce ogni schermo a ciò che riproduceva prima. Un nuovo Alert sostituisce quello mostrato. Messaggi Test, System e Draft, Ack ed Error e avvisi scaduti sono ignorati, e un mittente e identificatore ripetuti sono duplicati. Uno schermo necessita di una playlist predefinita per essere preso in takeover; altri schermi sono saltati.

La password, srtg_…, è mostrata solo da triggers create e triggers rotate-secret, con l’avviso trigger_password_shown_once. Il CLI la tiene fuori dalla sua configurazione, log operativo e stato di recupero. L’URL e il nome utente non sono segreti.

Codice problemaEsciSignificato
trigger_limit_reached5L’organizzazione ha già 20 trigger. Non è stato creato nulla. Elimina prima uno.
resource_conflict5triggers test o triggers delete mentre un avviso è attivo. next è triggers clear.
not_found4Nessun trigger ha questo ID nel progetto.
revision_conflict6La revisione --expect-rev era obsoleta. Esegui triggers show, poi riprova.

triggers create#

Crea un trigger e ricevi il suo URL, nome utente e password.

triggers create --name NAME [--kind cap|overlay] (--tag TAG | --screen-id ID...) [--for DURATION] [--pull FILE]
    [--show bar|takeover] [--edge bottom|top] [--style FILE] [--map FILE] [--signing]
ParametroTipoObbligatorioPredefinitoNote
--name NAMEstringsìnessunoIl nome del trigger, da 1 a 80 caratteri senza caratteri di controllo.
--kind KINDcap o overlaynocapcap accetta gli avvisi CAP 1.2 di un sistema di emergenza. overlay accetta poche parole da qualsiasi mittente e richiede --show.
--tag TAGstringuno tra --tag o --screen-idnessunoOgni schermo attivo con questo tag quando arriva un’allerta.
--screen-id IDstringuno tra --tag o --screen-idnessunoUn scr_ ID schermo. Ripetilo, o elenca gli ID separati da virgola; massimo 500.
--for DURATIONduratano1h (sovrapposizione 10m)Per quanto tempo un avviso senza <expires>, o un invio di sovrapposizione senza duration, trattiene gli schermi, per esempio 30m, 2h o 1d; da 1 minuto a 7 giorni per un trigger CAP, da 10 secondi a 7 giorni per uno di sovrapposizione.
--pull FILEpathnonessunoUn oggetto JSON, da un file o - per stdin, che ha anche la piattaforma per leggere le fonti di allerta CAP per il trigger. I suoi membri sono i parametri della scheda cap-alert elencati sotto.
--show SHOWbar o takeovercon --kind overlaynessunobar disegna una fascia sopra ciò che viene riprodotto sugli schermi di destinazione. takeover riproduce l'avviso a schermo intero.
--edge EDGEbottom o topnobottomIl bordo che occupa una fascia. Solo con --show bar.
--style FILEpathnonessunoUn oggetto JSON, da un file o da - per l'input standard, con lo stile della scheda di testo: theme, accent, background, backgroundColor, textColor e align.
--map FILEpathnonessunoUn modello JSON, da un file o da - per l'input standard, che costruisce il messaggio di sovrapposizione dal corpo inviato dal mittente; vedere i trigger di sovrapposizione.
--signingflagnospentoRichiedere anche un'intestazione ScreenRig-Signature a ogni invio e mostrare il segreto di firma una sola volta.
screenrig triggers create --name "Campus alerts" --tag Campus
screenrig triggers create --name "Campus alerts" --tag Campus --pull pull.json
screenrig triggers create --name "Lobby sensors" --kind overlay --show bar --tag Lobby
screenrig triggers create --name "Doorbell" --kind overlay --show takeover --tag Lobby --for 30s

La busta è il trigger con data.url (https://api.screenrig.ai/api/triggers/<id>/cap, oppure .../overlay per un trigger di sovrapposizione), data.username (l'id del trigger) e data.password. Li inserisca ora nel sistema mittente; il mittente di un trigger di sovrapposizione ha bisogno dell'URL e della password (Authorization: Bearer). Con --signing, la busta contiene anche data.signing_secret, mostrato una sola volta, con l'avviso trigger_signing_secret_shown_once. Dopo una creazione interrotta o ambigua, esegua di nuovo lo stesso comando entro 24 ore: riutilizza la chiave di idempotenza salvata e il server restituisce lo stesso trigger e la stessa password invece di crearne un altro.

--pull aggiunge fonti che la piattaforma legge oltre all’URL pubblicato, che continua a funzionare. L’oggetto contiene sources (fino a 5 URL http o https di avvisi CAP 1.0 a 1.2 o indici ATOM/RSS), publicAlerts, location (name, latitude, longitude e geocodes come [{name, value}]), minSeverity, maxSeverity, minUrgency, minCertainty, events, excludeEvents, senders, statuses, scopes, languages e areaUnknown; feeds get cap usa gli stessi filtri di flag. location è obbligatorio a meno che non siano forniti sources, e senza sources si leggono i feed pubblici che coprono location. Ogni fonte viene interrogata una volta al minuto. L’avviso corrispondente più grave prende il controllo degli schermi come un avviso pubblicato, e quando le fonti non mostrano nulla un avviso estratto termina; una fonte obsoleta o fallita non termina mai un avviso. Per esempio {"location": {"latitude": 49.25, "longitude": -123}, "minSeverity": "moderate"}.

triggers list#

Elenca i trigger di questo progetto e i loro ultimi avvisi, dal più vecchio

triggers list
screenrig triggers list

--human stampa ID, KIND, LABEL, TARGET, ALERT e LAST_RECEIVED; per un trigger di sovrapposizione, ALERT dice che cosa disegna e quanti avvisi trattiene. Un elenco non contiene mai una password né un segreto di firma.

triggers show#

Ispeziona un trigger e il suo ultimo alert.

triggers show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID trigger trg_.
screenrig triggers show trg_01EXAMPLETRIGGER00

data.alert è l'ultimo avviso: i suoi campi CAP, state active o ended (con ended_reason cancelled, all_clear, cleared o expired), until e screens con targeted, taken_over, cleared, skipped, failed e pending. pending è vero finché si stanno ancora scrivendo schermi, e gli schermi falliti vengono ritentati. screen show riporta un avviso come un'acquisizione della playlist del trigger. Per un trigger di sovrapposizione, data.overlay contiene show, edge, enabled, signing, card_id, alerts (gli avvisi attivi, il più recente per primo; il primo viene mostrato), screens con targeted, holding, taken_over, removed, edge_taken, skipped e failed, e pending.

triggers test#

Mostra un avviso di esercizio di 60 secondi sugli schermi del trigger.

triggers test <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID trigger trg_.
screenrig triggers test trg_01EXAMPLETRIGGER00

La busta è la ricevuta: data.outcome shown e data.alert. La risposta arriva prima che tutti gli schermi siano scritti; triggers show riporta i conteggi. Un trigger di sovrapposizione mostra l'avviso screenrig-test (etichetta Test, titolo Test overlay) per 60 secondi, e la ricevuta è quella che riceve un invio (data.alert_id, data.until, data.active). Entrambi i tipi rifiutano un test finché viene mostrato un avviso.

triggers update#

Modificare un trigger senza cambiare il suo URL né il suo segreto.

triggers update <id> [--name NAME] [--tag TAG | --screen-id ID...] [--for DURATION] [--pull FILE | --no-pull]
    [--edge bottom|top] [--style FILE | --clear-style] [--map FILE | --clear-map] [--enable | --disable]
    [--signing | --no-signing] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID trigger trg_.
--name NAMEstringnonessunoRinominare il trigger.
--tag TAG, --screen-id IDstringnonessunoUna nuova destinazione, come in triggers create.
--for DURATIONduratanonessunoUna nuova durata per gli avvisi che non indicano una propria fine.
--pull FILE, --no-pullpercorso, flagnonessunoUn trigger CAP: sostituisce le sue fonti CAP o smette di leggerle.
--edge EDGEbottom o topnonessunoUna fascia di sovrapposizione: spostarla su questo bordo.
--style FILE, --clear-stylepercorso, flagnonessunoUn trigger di sovrapposizione: sostituisce l'intero stile o lo rimuove.
--map FILE, --clear-mappercorso, flagnonessunoUn trigger di sovrapposizione: sostituisce il modello o lo rimuove, così l'oggetto inviato è il messaggio.
--stale-after DURATIONstringnoinvariatoCome per source create; none rimuove il periodo.
--enable, --disableflagnonessunoUn trigger di sovrapposizione: un trigger disattivato risponde a ogni invio con il 404 di un segreto errato.
--signing, --no-signingflagnonessunoUn trigger di sovrapposizione: attiva il controllo della firma (il segreto di firma viene mostrato una sola volta) o lo disattiva.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione.
screenrig triggers update trg_01EXAMPLETRIGGER00 --tag Lobby
screenrig triggers update trg_01EXAMPLETRIGGER00 --edge top --style style.json
screenrig triggers update trg_01EXAMPLETRIGGER00 --map map.json --signing

Serve almeno un'opzione oltre a --expect-rev. Una fascia si riposiziona sui nuovi schermi di destinazione e sul nuovo bordo; la nuova destinazione di un trigger di acquisizione vale dal prossimo avviso che inizia. Un trigger che già firma mantiene il suo segreto di firma quando --signing viene ripetuto; triggers rotate-secret --signing lo sostituisce. Dopo un aggiornamento interrotto o ambiguo, esegua di nuovo lo stesso comando: riutilizza la chiave di idempotenza salvata.

triggers deliveries#

Leggere il registro degli invii di un trigger di sovrapposizione: perché ciascuno è stato mostrato, ignorato o rifiutato.

triggers deliveries <id> [--limit N]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID trigger trg_.
--limit Nintegerno100Quante consegne, le più recenti per prime; da 1 a 100.
screenrig triggers deliveries trg_01EXAMPLETRIGGER00 --limit 20

data.items contiene gli invii degli ultimi sette giorni: at, outcome (shown, updated, unchanged, ended, ignored, refused, invalid o handshake), reason per un invio rifiutato o non valido (credentials, signature, disabled, body, mapping, field, rate_limited o internal), detail (il membro o il percorso di mappatura sbagliato), status, bytes, alert_id e request_id. Il registro non conserva mai un corpo, un’intestazione o una credenziale. Un segreto sbagliato, una firma non valida e un trigger disattivato danno tutti al mittente lo stesso 404, quindi questo registro è dove si legge quale fosse. Un trigger CAP non ha consegne.

triggers clear#

Termina ora l’allerta del trigger.

triggers clear <id> [--alert-id ID]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID trigger trg_.
--alert-id IDstringnonessunoUn trigger di sovrapposizione: termina solo questo avviso. Senza questa opzione terminano tutti gli avvisi.
screenrig triggers clear trg_01EXAMPLETRIGGER00
screenrig triggers clear trg_01EXAMPLETRIGGER00 --alert-id front-door

L'avviso termina con ended_reason cleared e i suoi schermi tornano a ciò che riproducevano prima. Uno schermo la cui acquisizione è stata sostituita da qualcos'altro nel frattempo viene lasciato com'è. Senza avviso attivo non cambia nulla. Su un trigger di sovrapposizione, la chiusura di un avviso non attivo non cambia nulla, e quando termina l'ultimo avviso la fascia si abbassa o gli schermi dell'acquisizione vengono restituiti.

triggers rotate-secret#

Sostituisci la password di un trigger.

triggers rotate-secret <id> [--signing] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID trigger trg_.
--signingflagnospentoUn trigger di sovrapposizione che firma: sostituisce il segreto di firma invece della password.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione.
screenrig triggers rotate-secret trg_01EXAMPLETRIGGER00

La busta contiene la nuova password in data.password. La vecchia password smette subito di funzionare, quindi inserisca la nuova nel sistema mittente. Con --signing, la busta contiene invece il nuovo data.signing_secret, mostrato una sola volta; il vecchio smette subito di funzionare, e un trigger che non firma risponde invalid_request.

triggers delete#

Eliminare un trigger. Il suo URL smette subito di accettare avvisi e invii; le fasce di un trigger di sovrapposizione lasciano i suoi schermi e la sua scheda viene eliminata. Un trigger che mostra un avviso viene rifiutato con resource_conflict: eseguire prima triggers clear.

triggers delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID trigger trg_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione.
screenrig triggers delete trg_01EXAMPLETRIGGER00

Trigger di sovrapposizione

Un trigger di sovrapposizione mostra ciò che pubblica un sistema esterno. Home Assistant, un hub di sensori di porta o di movimento, un sistema di telecamere o uno strumento di allerta invia poche parole con un HTTP POST, e gli schermi del trigger le mostrano finché scadono o il mittente le termina. È un trigger come un trigger CAP: triggers create --kind overlay lo crea e rientra nello stesso limite di 20 per organizzazione.

--show bar disegna una fascia sopra ciò che viene riprodotto su ogni schermo di destinazione, sul bordo inferiore o, con --edge top, su quello superiore. La fascia entra quando inizia un avviso ed esce quando termina l'ultimo; la playlist, le sue pagine e i suoi tempi non cambiano. Uno schermo ha una fascia per bordo: un trigger di sovrapposizione il cui bordo è già occupato su uno schermo da un altro trigger non vi compare (triggers show conta questi schermi come edge_taken), e una pagina che ha una propria fascia con presenza su quel bordo la mantiene. Una scheda d'angolo o a pastiglia su quel bordo si sposta verso l'interno oltre l'altezza della fascia, che sia visibile o no. Nessuna fascia viene disegnata su una pagina di spazio pubblicitario né durante un'acquisizione. --show takeover riproduce l'avviso a schermo intero sugli schermi di destinazione che hanno una playlist predefinita, dal primo avviso alla fine dell'ultimo. Un trigger di acquisizione non sostituisce mai un'acquisizione già presente su uno schermo, come quella di un operatore o di un avviso di emergenza, e un avviso CAP lo sostituisce.

Una destinazione per tag viene risolta quando inizia un avviso; uno schermo etichettato dopo riceve la fascia con il prossimo avviso che inizia. Gli schermi senza playlist predefinita vengono saltati da un'acquisizione. Uno schermo offline si aggiorna quando si riconnette.

Il mittente invia JSON (o un modulo) a data.url con Authorization: Bearer SECRET, oppure con HTTP Basic usando l'id del trigger come nome utente e il segreto come password. Il segreto non va mai nell'URL. Un invio ha questi membri; un membro sconosciuto viene rifiutato e nominato.

MembroTipoNote
alert_idstringL'id dell'avviso scelto dal mittente, da 1 a 200 caratteri. Lo stesso id aggiorna quell'avviso invece di impilarne un altro. Senza id è un solo avviso chiamato default. In una chiusura, senza id terminano tutti gli avvisi.
labelstringUn'etichetta breve sopra il titolo: al massimo 40 caratteri.
titlestringAl massimo 120 caratteri.
messagestringIl testo principale: al massimo 400 caratteri.
notestringUna riga discreta a piè di scheda: al massimo 120 caratteri.
durationnumero o stringaPer quanto tempo questo invio trattiene il suo avviso, da adesso: da 10 a 604800 secondi, oppure 10s, 5m, 2h, 1d o until_cleared. Senza valore si usa --for del trigger (10 minuti se non impostato).
clearbooleano o stringatrue (o yes, y, 1, x) termina l'avviso; false (o no, n, 0, vuoto) lo attiva. Una chiusura ignora gli altri membri.
statestringUna parola di stato del mittente. off, closed, clear, cleared, resolved, ok, normal, inactive e ended, in qualsiasi caso, terminano l'avviso; qualsiasi altro stato lo attiva.

Un'attivazione richiede almeno uno tra label, title, message e note. Il testo più lungo del suo limite viene rifiutato, come duration fuori da 10 secondi - 7 giorni, entrambi con invalid_request che nomina il membro. Ogni attivazione o aggiornamento trattiene il suo avviso per duration da quell'invio; un sensore di movimento che invia ogni pochi secondi mantiene la fascia, e questa esce duration dopo l'ultimo invio. Un trigger mostra il suo avviso più recente; quando termina, riappare quello precedente. Trattiene dieci avvisi, e l'undicesimo sostituisce il più vecchio. Un avviso termina circa dieci secondi dopo la sua scadenza. Una chiusura inviata due volte termina l'avviso una sola volta, e la chiusura di un avviso non attivo non cambia nulla.

La risposta è una ricevuta: outcome (shown, updated, unchanged, ended o ignored), alert_id, until (nullo per un avviso trattenuto fino alla chiusura) e active, gli avvisi che il trigger trattiene dopo l'invio. Un'intestazione Idempotency-Key da 8 a 200 caratteri risponde al nuovo tentativo di un mittente con la prima ricevuta per 24 ore. Un trigger accetta 120 invii al minuto. Un'attivazione o un aggiornamento è una richiesta API fatturata, come un invio a un webhook chiave/valore in ingresso; una chiusura è gratuita e non viene mai rifiutata per il saldo, così un avviso si può sempre togliere dagli schermi.

curl -X POST https://api.screenrig.ai/api/triggers/trg_01EXAMPLETRIGGER00/overlay \
  -H "Authorization: Bearer srtg_YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"alert_id":"front-door","title":"Front door","message":"The front door is open","duration":"10m"}'

Un indirizzo errato, un segreto errato, un trigger disattivato, una firma mancante o errata e qualsiasi GET danno lo stesso 404 not_found, così un mittente o l'anteprima di un link non capisce quale fosse. triggers deliveries mostra al progetto il motivo, per gli ultimi sette giorni, senza il corpo dell'invio. --style FILE imposta theme, accent, background, backgroundColor, textColor e align della scheda di testo; usi un trigger per ogni aspetto.

--map FILE costruisce il messaggio dal corpo inviato da uno strumento di allerta, con il linguaggio di modelli dei webhook delle schede. Una stringa con {{body.title}} è testo, una stringa che è esattamente un segnaposto mantiene il suo tipo, {"$text": "{{body.message}}", "$max": 400} taglia il testo e un percorso inizia con body o query. Questo modello converte un avviso di uno strumento di monitoraggio e lo termina quando il suo stato è resolved:

{"alert_id": "{{body.groupKey}}", "title": "{{body.title}}", "message": {"$text": "{{body.message}}", "$max": 400}, "state": "{{body.status}}"}

--signing richiede inoltre ScreenRig-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">, firmato con data.signing_secret (whsec_…, mostrato una sola volta), dove t deve distare al massimo cinque minuti dall'orologio del server. Il mittente può inviare due valori v1 mentre ruota il segreto.

body='{"alert_id":"front-door","title":"Front door","message":"The front door is open"}'
t=$(date +%s)
sig=$(printf '%s.%s' "$t" "$body" | openssl dgst -sha256 -hmac "$SIGNING_SECRET" -hex | sed 's/^.* //')
curl -X POST "$URL" -H "Authorization: Bearer $SECRET" -H "ScreenRig-Signature: t=$t,v1=$sig" \
  -H "Content-Type: application/json" -d "$body"

Uno strumento di allerta o un fornitore che firma i propri invii può far verificare la sua firma al posto del segreto, e far rispondere al suo handshake di configurazione, come per i webhook delle schede: overlay.verify e overlay.handshake vanno su POST /api/triggers e PATCH /api/triggers/{id}, e null rimuove ciascuno. Le stesse regole valgono per la password srtg_ del trigger e per il suo registro delle consegne, e un handshake non cambia alcun allarme.

Un rest_command di Home Assistant invia al trigger. Tenga il segreto in secrets.yaml e dia a ogni automazione l'avviso che attiva o termina:

# secrets.yaml
screenrig_lobby_overlay: "Bearer srtg_YOUR_SECRET"

# configuration.yaml
rest_command:
  screenrig_lobby:
    url: "https://api.screenrig.ai/api/triggers/trg_01EXAMPLETRIGGER00/overlay"
    method: post
    headers:
      Authorization: !secret screenrig_lobby_overlay
    content_type: "application/json"
    payload: >-
      {{ {"alert_id": alert_id | default(""), "title": title | default(""),
          "message": message | default(""), "duration": duration | default("10m"),
          "clear": clear | default(false)} | tojson }}

# automations.yaml
- alias: Front door open on the lobby screens
  triggers:
    - trigger: state
      entity_id: binary_sensor.front_door
      to: "on"
  actions:
    - action: rest_command.screenrig_lobby
      data: {alert_id: front-door, title: Front door, message: The front door is open, duration: until_cleared}
- alias: Front door closed
  triggers:
    - trigger: state
      entity_id: binary_sensor.front_door
      to: "off"
  actions:
    - action: rest_command.screenrig_lobby
      data: {alert_id: front-door, clear: true}
- alias: Driveway motion
  triggers:
    - trigger: state
      entity_id: binary_sensor.driveway_motion
      to: "on"
  actions:
    - action: rest_command.screenrig_lobby
      data: {alert_id: driveway, title: Driveway, message: Motion at the driveway, duration: 2m}

Due fatti lo fanno funzionare. Ogni invio di movimento trattiene la fascia per 2 minuti da quell'invio, quindi resta finché il movimento continua ed esce 2 minuti dopo l'ultimo evento. E Home Assistant genera il modello {{ }} prima di inviare, così il trigger riceve JSON semplice; il modello --map del trigger è un passaggio separato che fa passare ogni invio attraverso di esso; quindi lascia --map fuori per un mittente che invia già i membri della sovrapposizione, come fa qui Home Assistant, oppure dagli un trigger tutto suo.

Riproduzione

Le prove di riproduzione hanno tre forme. playback plays legge una riga per ogni inizio visibile di immagine o video su uno schermo, dal più vecchio per received_at: prova di riproduzione per un report o un inserzionista. playback list legge totali giornalieri, una riga per schermo, oggetto media e giorno UTC. playback totals legge conteggi di riproduzione per giorno UTC, o classifica gli schermi o media più attivi. plays e list esportano in CSV, e il dashboard esporta gli stessi file.

Le riproduzioni sono conservate per il periodo di conservazione degli eventi previsto dal piano, e comunque per almeno 30 giorni.

Codice problemaEsciSignificato
invalid_request8Un intervallo di riproduzioni più lungo di 31 giorni, un intervallo giornaliero più lungo di 366 giorni, o un filtro malformato. La CLI rifiuta la maggior parte di questi prima di inviare (exit 2).
rate_limited7Il budget di esportazione riproduzione di 30 richieste al minuto per organizzazione è esaurito. Attendere retry_after_seconds.

Fatturazione: ogni pagina JSON è una richiesta API fatturata, quindi --all fattura una richiesta per pagina. Un’esportazione CSV è una richiesta fatturata per l’intervallo totale. Ogni richiesta plays e ogni esportazione CSV consumano anche il budget di esportazione riproduzione. playback totals è una richiesta API misurata e non consuma quel budget.

playback plays#

Leggi i record di riproduzione per ogni riproduzione, una riga per ogni inizio visibile.

playback plays [--from TIME] [--to TIME] [--screen-id ID] [--media-id ID] [--tag TAG] [--cursor CURSOR] [--limit N] [--all]
playback plays --format csv [--output FILE] [--from TIME] [--to TIME] [--screen-id ID] [--media-id ID] [--tag TAG]
ParametroTipoObbligatorioPredefinitoNote
--from TIMEstringno24 ore prima di --toLimite inclusivo su received_at: un istante RFC 3339 con secondi e offset, now, o un’età come 7d, 12h o 30m.
--to TIMEstringnooraVincolo esclusivo, nelle stesse forme. L’intervallo è al massimo di 31 giorni.
--screen-id IDstringnoogni schermoUno schermo scr_.
--media-id IDstringnoogni oggettoUn oggetto media med_.
--tag TAGstringnoogni schermoUn tag che lo schermo aveva quando la riproduzione è stata ricevuta.
--cursor CURSORstringnol’inizio dell’intervalloIl next_cursor della pagina precedente, con gli stessi filtri.
--limit Nintegerno200Righe per pagina JSON, massimo 1000. Non con --format csv.
--allbooleannospentoSegui il cursore fino alla fine dell’intervallo, 1000 righe per pagina salvo diversa indicazione in --limit; massimo 50 pagine.
--format csvstringnoJSONFlusso dell’intera gamma in CSV.
--output FILEpathno./playback-plays.csvDestinazione CSV, o - solo per stdout.
screenrig playback plays --from 7d --tag Lobby --all
screenrig playback plays --format csv --from 2026-09-01T00:00:00Z --to 2026-10-01T00:00:00Z --output september-plays.csv

Il CLI normalizza entrambi i limiti a UTC e li invia a ogni richiesta; data.from e data.to li ripetono. Gli ultimi 5 secondi più recenti sono trattenuti finché si stabilizzano, quindi una riproduzione appare circa 5 secondi dopo la ricezione, e data.to riporta tale fine effettiva. Il JSON restituisce una pagina in data.items con data.next_cursor, e data.next.argv è il comando esatto per la pagina successiva. --all si ferma prima, con data.next e un avviso, al limite di pagina (playback_plays_truncated) o quando il budget di esportazione è esaurito (playback_export_rate_limited), invece di sprecare richieste in un rifiuto.

Il CSV è conforme a RFC 4180 con la riga di intestazione fissa screen_id,playlist_id,page_id,primitive_id,media_id,primitive,started_at,received_at,manifest_revision,playlist_revision, orari in RFC 3339 UTC. primitive_id e started_at sono vuoti a meno che il lettore non li abbia segnalati. Una cella che inizia con =, +, -, @, tabulazione o ritorno a capo ha un ' iniziale per evitare che i fogli di calcolo la valutino. Il CLI scrive tramite un file temporaneo privato nella stessa cartella e sostituisce un file esistente solo dopo che il flusso termina correttamente. --timeout è il limite di inattività per il flusso, 60000 ms senza byte di default, non un limite sulla durata totale. L’intestazione riporta path, bytes, rows, sha256 e last_received_at; il CSV non entra mai nell’intestazione.

Se uno stream fallisce a metà, il comando esce con codice non zero e non scrive mai il file di destinazione. Le righe complete già ricevute restano in FILE.partial, e error.next esporta il resto dell’intervallo dall’ultimo received_at in un FILE-rest.csv non usato. Le righe ricevute in quell’istante esatto appaiono in entrambi, quindi scarta i duplicati durante l’unione.

playback list#

Leggi i totali di riproduzione giornalieri per questo progetto, giorni più recenti per primi.

playback list [--screen-id ID] [--media-id ID] [--day YYYY-MM-DD | --day-from YYYY-MM-DD --day-to YYYY-MM-DD] [--format csv] [--output FILE]
ParametroTipoObbligatorioPredefinitoNote
--screen-id IDstringnoogni schermoDeve iniziare con scr_.
--media-id IDstringnoogni oggettoDeve iniziare con med_.
--day YYYY-MM-DDstringnoogni giornoUn giorno solare UTC.
--day-from YYYY-MM-DDstringnonessunoInizio di un intervallo di giorni UTC inclusivo, con --day-to, massimo 366 giorni.
--day-to YYYY-MM-DDstringnonessunoFine di quell’intervallo.
--format csvstringnoJSONEsporta come CSV. Senza intervallo, 31 giorni fino a oggi.
--output FILEpathno./playback-aggregates.csvDestinazione CSV, o - solo per stdout.
screenrig playback list --screen-id scr_01EXAMPLESCREEN00000000 --day 2026-08-14
screenrig playback list --format csv --day-from 2026-09-01 --day-to 2026-09-30

Una riga per ogni schermo, oggetto media e giorno UTC. I filtri selezionano le righe proprie del chiamante. La riga header CSV è screen_id,media_id,filename,primitive,day,play_count,last_page_id,last_manifest_revision,first_started_at,last_started_at. Un’esportazione giornaliera fallita non conserva nulla; rieseguila.

playback totals#

Leggi i conteggi di riproduzione per giorno UTC o classifica gli schermi o i contenuti multimediali più attivi.

playback totals [--by day|screen|media|screen_day] [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
                [--screen-id ID | --media-id ID] [--top N]
ParametroTipoObbligatorioPredefinitoNote
--by GROUPINGstringnodayday risponde una riga per ogni giorno UTC. screen o media classificano i più occupati. screen_day risponde la serie giornaliera degli schermi principali.
--day-from YYYY-MM-DDstringno29 giorni prima di --day-toPrimo giorno UTC, incluso.
--day-to YYYY-MM-DDstringnooggiUltimo giorno UTC, incluso.
--screen-id IDstringnoogni schermoCon --by day, conta solo questo schermo. Non con --media-id.
--media-id IDstringnoogni oggettoCon --by day, conta solo questo contenuto multimediale. Non con --screen-id.
--top Nintegerno10Righe di un ranking, da 1 a 100; da 1 a 10 con --by screen_day. Richiede --by; non si applica a --by day.
screenrig playback totals
screenrig playback totals --day-from 2026-09-01 --day-to 2026-09-30 --screen-id scr_01EXAMPLESCREEN00000000
screenrig playback totals --by screen --top 5
screenrig playback totals --by media --day-from 2026-09-01 --day-to 2026-09-30
screenrig playback totals --by screen_day --top 3

I conteggi provengono dai riepiloghi giornalieri, che seguono l’ingestione con un ritardo fino a circa 21 minuti; playback plays mostra avvii più recenti. day risponde a data.days, screen e media rispondono a data.screens e data.media, e screen_day risponde a data.screen_days. Una serie giornaliera copre al massimo 366 giorni (92 con --screen-id o --media-id) e una classifica al massimo 92. data.truncated è true quando una classifica su una finestra troppo ampia per una lettura ha mantenuto solo le migliori chiavi di ogni fetta.

Feed

Un feed è un dato di terze parti che screenRIG recupera e memorizza nella cache, come meteo, allerte, tariffe e titoli. feeds get legge un documento feed, lo stesso documento che una scheda integrata con gli stessi parametri legge. Il comando non chiama mai un fornitore terzo.

feeds get#

Leggi un feed una volta. Un feed senza documento risponde pending e il suo tempo di ritentativo.

feeds get <family> [--lat DEGREES --lon DEGREES] [--radius-km KM] [--min-magnitude N] [--hours N]
                   [--basins LIST] [--base CODE] [--symbols IDS] [--currency CODE] [--url URL]...
                   [--public] [--geocode NAME:VALUE]... [--min-severity LEVEL] [--max-severity LEVEL]
                   [--min-urgency LEVEL] [--min-certainty LEVEL] [--event NAME]... [--exclude-event NAME]...
                   [--sender NAME]... [--status STATUS]... [--scope SCOPE]... [--language TAG]...
                   [--area-unknown hide|show]
ParametroTipoObbligatorioPredefinitoNote
<family>stringsìnessunoweather, airquality, alerts, rates, crypto, earthquakes, cyclones, headlines o cap.
--lat DEGREESnumberper famiglianessunoLatitudine, con --lon. Obbligatoria per weather, airquality, alerts e earthquakes; opzionale per cyclones e cap.
--lon DEGREESnumberper famiglianessunoLongitudine, con --lat.
--radius-km KMnumberno500 per earthquakesearthquakes raggio, o l’area cyclones, da 10 a 20000 km. Richiede --lat e --lon.
--min-magnitude MAGNITUDEnumberno2.5earthquakes: magnitudo minima, da 0 a 9.
--hours HOURSnumberno24earthquakes: finestra in ore, da 1 a 168.
--basins LISTstringnotutti i bacinicyclones: bacini separati da virgola at, ep, cp, wp.
--base CODEstringnoEURrates: valuta base.
--symbols IDSstringsì, per cryptonessunoID o ticker crypto separati da virgola, massimo 20.
--currency CODEstringnousdcrypto: valuta di riferimento.
--url URLstringsì, per headlinesnessunoheadlines: URL di feed RSS o Atom. cap: URL indice CAP alert o ATOM/RSS; ripetilo, massimo 5 volte.
--publicbooleannoacceso senza --urlcap: legge anche i feed pubblici di alert che coprono --lat e --lon. Richiede --lat e --lon.
--geocode NAME:VALUEstringnonessunocap: un codice area della posizione, come UGC:WAC033. Ripetibile. Richiede --lat e --lon.
--min-severity LEVELstringnonessunocap: solo alert a o sopra minor, moderate, severe o extreme.
--max-severity LEVELstringnonessunocap: solo alert a o sotto minor, moderate, severe o extreme.
--min-urgency LEVELstringnonessunocap: solo alert almeno così urgenti: past, future, expected o immediate.
--min-certainty LEVELstringnonessunocap: solo alert almeno così certi: unlikely, possible, likely o observed.
--event NAMEstringnoqualsiasi eventocap: solo questo evento; * corrisponde a qualsiasi sequenza di caratteri. Ripetibile.
--exclude-event NAMEstringnonessunocap: escludi questo evento. Ripetibile.
--sender NAMEstringnoqualsiasi mittentecap: solo alert da questo mittente. Ripetibile.
--status STATUSstringnoActualcap: stato alert da leggere: Actual, Exercise, Test o System. Ripetibile.
--scope SCOPEstringnoPubliccap: ambito alert da leggere: Public, Restricted o Private. Ripetibile.
--language TAGstringnonessunocap: preferenza lingua; vince la prima presente. Ripetibile.
--area-unknown MODEstringnohidecap: un alert segnalato solo da codici area che la posizione non ha: hide o show.
screenrig feeds get weather --lat 49.25 --lon -123
screenrig feeds get rates --base EUR
screenrig feeds get crypto --symbols btc,eth --currency usd
screenrig feeds get earthquakes --lat 49.25 --lon -123 --radius-km 500 --min-magnitude 4 --hours 72
screenrig feeds get cyclones --basins at,ep
screenrig feeds get headlines --url https://example.com/news.xml
screenrig feeds get cap --lat 49.25 --lon -123 --geocode UGC:WAC033 --min-severity moderate --event '*warning'
screenrig feeds get cap --url https://example.com/alerts.atom --url https://example.com/other.xml

weather, airquality, alerts e earthquakes necessitano di --lat e --lon, che vanno sempre insieme; earthquakes prende anche --radius-km, --min-magnitude e --hours. cyclones prende --basins, e con --lat, --lon e --radius-km insieme solo le tempeste vicino a quel luogo. rates prende --base, crypto necessita di --symbols e prende --currency, e headlines necessita di --url.

cap legge gli avvisi CAP che corrispondono a un luogo. Richiede --url (ripetibile, fino a 5 URL di avvisi CAP o indici ATOM/RSS) o --lat e --lon, che leggono i feed pubblici che coprono la posizione; --public aggiunge quei feed pubblici alle fonti --url. Le flag del filtro rispecchiano i membri di un oggetto triggers create --pull.

Un documento in cache risponde 200 con fetchedAt e attribution: mostra l’attribuzione ovunque i dati la mostrino. Senza documento l’involucro riporta stato pending, retry_after_seconds e retry_at con uscita 0; il CLI non ripete, quindi esegui di nuovo il comando dopo retry_at. Un’organizzazione registra al massimo 50 nuove chiavi feed al giorno, e rate_limited segue oltre. Le schede derivano le chiavi feed da parametri statici; non scrivere tu stesso chiavi feed o feed:.

Origini dati

Un’origine dati legge un indirizzo esterno secondo una pianificazione e scrive il risultato nei dati di una scheda, così la scheda resta aggiornata senza che nessuno ripubblichi e gli schermi recuperano di nuovo il documento quando cambia. I tipi sono ics, sheets, csv, json, microsoft365, google_calendar, square, shopify, toast e momentus. Un’origine scrive una scheda, e un’organizzazione ne ha fino a 200 in tutti i suoi progetti. Una sincronizzazione che fallisce non scrive mai: la scheda conserva il suo ultimo documento valido e lo stato dell’origine mostra l’errore. Le impostazioni di ogni tipo, i codici di stato e le regole di privacy sono in Origini dati.

Un preset è un’origine json già pronta e testata per un servizio, come un canale Slack, una bacheca di offerte di lavoro o una bacheca delle build: source presets li elenca, source presets NAME mostra i campi e i segreti di un preset e source create --preset NAME crea l’origine.

Dai ogni credenziale come --secret NAME=@FILE, o NAME=- per lo stdin, così resta fuori dalla cronologia della shell e dall’elenco dei processi. I segreti sono memorizzati sigillati e restituiti solo come indizio mascherato. I nomi dei segreti sono calendar_url.KEY per ics (uno per calendario), token per un indirizzo csv o json che ne richiede uno (password, client_secret, header.NAME e query.NAME servono agli altri modi di accedere, descritti in Richieste, accesso e pagine), client_secret per microsoft365 e toast, service_account_key per google_calendar, access_token per square e shopify, api_key e api_secret per momentus, e client_secret con l’impostazione client_id per un’app shopify installata nel negozio.

--settings accetta l’intero oggetto delle impostazioni dell’origine come JSON, @FILE o -. --set KEY=VALUE imposta un membro di primo livello e si può ripetere; il valore è JSON quando si può interpretare (days=14, calendars='[{"key":"lobby"}]') e testo altrimenti (time_zone=America/Vancouver). Con entrambi, i membri di --set sostituiscono gli stessi membri di --settings; source update con solo --set modifica quei membri delle impostazioni salvate. L’opzione --config della CLI indica il suo file di credenziali e non ha nulla a che fare con le origini.

source list#

Elenca le origini dati del progetto, le più recenti per prime, con il loro stato.

source list [--after CURSOR]
ParametroTipoObbligatorioPredefinitoNote
--after CURSORstringnoprima paginaIl data.next_cursor della pagina precedente.
screenrig source list

source show#

Ispeziona un’origine: le sue impostazioni, i segreti mascherati, l’ultima esecuzione e l’ultimo errore.

source show <source_id>
ParametroTipoObbligatorioPredefinitoNote
<source_id>stringsìnessunoL’origine (src_…).
screenrig source show src_01EXAMPLESOURCE000000

source presets#

Elenca i preset di origine già pronti, oppure mostrane uno con i suoi campi, i suoi segreti e come ottenerli.

source presets [<name>]
ParametroTipoObbligatorioPredefinitoNote
<name>stringnoogni presetIl nome di un preset: parole minuscole unite da trattini, come slack-channel.
screenrig source presets
screenrig source presets slack-channel

L’elenco mostra il titolo di ogni preset, i tipi di scheda che alimenta (il primo è quello per cui è stato creato) e la sua categoria. Un nome mostra i campi da impostare (--set NAME=VALUE: testo con il suo pattern e un esempio, una scelta, o un elenco che accetta un array JSON), i segreti da inserire (--secret NAME=@FILE) con dove il fornitore emette ciascuno, ogni quanto si aggiorna, per quanto tempo una scheda conserva gli ultimi dati, e i dati di chi legge e a quali condizioni. Non viene creato nulla.

source create#

Crea un’origine. Viene eseguita in pochi secondi e poi secondo la sua pianificazione. Crea prima la scheda e guarda l’anteprima con source test.

source create (--kind KIND | --preset NAME) --card CARD_ID --name NAME [--settings JSON|@FILE|-] [--set KEY=VALUE]...
               [--connection-id ID] [--secret NAME=VALUE]... [--refresh DURATION] [--stale-after DURATION|none] [--disabled]
ParametroTipoObbligatorioPredefinitoNote
--kind KINDstringsenza --presetnessunoics, sheets, csv, json, microsoft365, google_calendar, square, shopify, momentus o toast.
--preset NAMEstringsenza --kindnessunoCrea l’origine da un preset già pronto e testato (source presets li elenca): --set e --settings indicano allora i campi del preset e --secret le sue credenziali. Non con --kind.
--card CARD_IDstringsìnessunoLa scheda (crd_…) che l’origine scrive. Una scheda ha un’origine; source_target_taken risponde a una seconda.
--name NAMEstringsìnessunoDa 1 a 80 caratteri.
--settings SETTINGSstringno{}Un’impostazione di primo livello. Ripetibile. Con --preset, un campo del preset: il testo così com’è scritto, a meno che non sia un array o un oggetto JSON (gli elementi di un campo elenco).
--connection-id IDstringnonessunomicrosoft365 e google_calendar: leggono tramite una connessione del progetto (pcn_…, connection list) invece di un tenant, client_id e un segreto propri dell’origine. Definisce l’impostazione connection_id.
--set KEY=VALUEstringnonessunoUn’impostazione di primo livello. Ripetibile.
--secret NAME=VALUEstringnonessunoUna credenziale per nome: NAME=@FILE, NAME=- (al massimo un’opzione legge stdin) oppure NAME=VALUE. Ripetibile. Con --preset, le credenziali del preset.
--refresh DURATIONstringnosecondo il tipoOgni quanto sincronizzare, da 30s a 24h. Il tipo determina il valore predefinito e l’intervallo minimo: ics si sincronizza ogni 5 minuti, con un minimo di 1 minuto, microsoft365 e google_calendar ogni 2 minuti, momentus ogni minuto, con un minimo di 30 secondi. Un preset imposta il proprio.
--stale-after DURATIONstringnosecondo il tipoPer quanto tempo la scheda conserva gli ultimi dati validi quando la fonte non riesce ad aggiornarsi, da 1m a 7d, almeno il doppio di --refresh; none li conserva fino al prossimo aggiornamento. Dopo, i dati scadono su ogni schermo. momentus è 30m per impostazione predefinita.
--disabledbooleannospentoCrea l’origine ferma; non viene recuperato nulla finché non usi source update --enable.
screenrig source create --kind ics --card crd_01EXAMPLECARD000000000 --name "Lobby calendar" --set calendars='[{"key":"lobby"}]' --set time_zone=America/Vancouver --secret calendar_url.lobby=@lobby.url
screenrig source create --kind sheets --card crd_01EXAMPLEMENU0000000000 --name "Cafe menu" --settings @menu-sheet.json
screenrig source create --kind json --card crd_01EXAMPLEKPI00000000000 --name "Daily numbers" --settings @kpi-api.json --secret token=@api.token
screenrig source create --kind square --card crd_01EXAMPLEMENU0000000000 --name "Counter menu" --secret access_token=@square.token
screenrig source create --kind microsoft365 --card crd_01EXAMPLEROOMS0000000000 --name "Meeting rooms" --settings @rooms.json --connection-id pcn_01EXAMPLECONNECTION0000
screenrig source create --preset slack-channel --card crd_01EXAMPLEWALL00000000000 --name "Team wall" --set channel=C0123456789 --secret token=@slack.token

source update#

Modifica un’origine. Una modifica diversa dalla rinomina azzera il suo conteggio degli errori e la riesegue.

source update <source_id> [--name NAME] [--card CARD_ID] [--settings JSON|@FILE|-] [--set KEY=VALUE]...
                          [--connection-id ID] [--secret NAME=VALUE]... [--unset-secret NAME]... [--refresh DURATION]
                          [--stale-after DURATION|none] [--enable | --disable] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<source_id>stringsìnessunoL’origine (src_…).
--name NAMEstringnoinvariatoRinomina l’origine.
--card CARD_IDstringnoinvariatoScrivi un’altra scheda.
--settings SETTINGSstringnoinvariatoModifica un’impostazione di primo livello tra quelle salvate. Ripetibile. Per un’origine creata da un preset, un campo del preset; il valore null rimuove un campo facoltativo.
--connection-id IDstringnoinvariatoCome per source create. Per togliere a un’origine le proprie credenziali servono --settings senza tenant e client_id, e --unset-secret client_secret.
--set KEY=VALUEstringnonessunoModifica un’impostazione di primo livello di quelle salvate. Ripetibile.
--secret NAME=VALUEstringnonessunoImposta o sostituisce un segreto. Ripetibile. Un segreto che non invii conserva il suo valore, a meno che la modifica punti l’origine a qualcosa che quel segreto non copre (un’altra origine, negozio, ambiente o tenant): allora source_secret_required lo richiede di nuovo.
--unset-secret NAMEstringnonessunoRimuove un segreto. Ripetibile.
--refresh DURATIONstringnoinvariatoDa 30s a 24h; vale il minimo del tipo.
--stale-after DURATIONstringnoinvariatoCome per source create; none rimuove il periodo.
--enable, --disablebooleannoinvariatoRiprende la pianificazione, o la ferma; la scheda conserva il suo ultimo documento. Al massimo una delle due.
--expect-rev REVISIONintegernola revisione lettaRifiuta la modifica se l’origine non è a questa revisione. --set protegge la revisione letta, a meno che tu ne indichi un’altra.

È richiesta almeno una modifica.

screenrig source update src_01EXAMPLESOURCE000000 --set days=14
screenrig source update src_01EXAMPLESOURCE000000 --secret calendar_url.lobby=@new.url --refresh 10m
screenrig source update src_01EXAMPLESOURCE000000 --disable
screenrig source update src_01EXAMPLEPRESET0000000 --set channel=C0123456789 --secret token=@new.token

source test#

Mostra l’anteprima di un’origine senza salvare né scrivere nulla: recupera l’indirizzo, adatta la risposta per la scheda e verificala rispetto alla scheda. La busta contiene il documento, valid, il percorso e il motivo quando la scheda lo rifiuta, avvisi e conteggi. Passa un <source_id> salvato per testarlo con le altre opzioni come sostituzioni, oppure --kind (o --preset) e --card per testarne uno non salvato. Un errore di recupero o di adattamento è source_test_failed con il motivo. Al massimo 30 anteprime al minuto per organizzazione.

source test [<source_id>] [--kind KIND | --preset NAME] [--card CARD_ID] [--settings JSON|@FILE|-] [--set KEY=VALUE]...
            [--connection-id ID] [--secret NAME=VALUE]...
ParametroTipoObbligatorioPredefinitoNote
<source_id>stringnonessunoUn’origine salvata da testare.
--kind KINDstringsenza <source_id> o --presetnessunoCome per source create.
--preset NAMEstringnonessunoMostra l’anteprima di un’origine creata da questo preset, con --set e --settings come campi e --secret come credenziali, al posto di --kind.
--card CARD_IDstringsenza <source_id>nessunoLa scheda da riempire.
--settings SETTINGSstringnole impostazioni salvateLe impostazioni del tipo: JSON, @FILE o - per lo stdin.
--connection-id IDstringnonessunoCome per source create.
--set KEY=VALUEstringnonessunoUn’impostazione di primo livello. Ripetibile.
--secret NAME=VALUEstringnoi segreti salvatiUna credenziale da provare. Ripetibile.
screenrig source test --kind ics --card crd_01EXAMPLECARD000000000 --set calendars='[{"key":"lobby"}]' --secret calendar_url.lobby=@lobby.url
screenrig source test src_01EXAMPLESOURCE000000
screenrig source test --preset slack-channel --card crd_01EXAMPLEWALL00000000000 --set channel=C0123456789 --secret token=@slack.token

source refresh#

Sincronizza subito un’origine e mostra il risultato. Viene eseguita in linea fino a 60 secondi, azzera il conteggio degli errori e legge l’indirizzo per intero. Una sincronizzazione fallita non modifica mai la scheda. source_busy (codice di uscita 5) risponde mentre è in corso una sincronizzazione pianificata. Al massimo 6 al minuto per origine.

source refresh <source_id>
ParametroTipoObbligatorioPredefinitoNote
<source_id>stringsìnessunoL’origine (src_…).
screenrig source refresh src_01EXAMPLESOURCE000000

source rooms#

Verifica come gli schermi sono mappati sulle sale di una fonte di sistema di prenotazione (momentus). Legge le sale dell'ultimo aggiornamento riuscito della fonte e gli schermi del progetto, e non recupera nulla. Elenca le sale che nessuno schermo mostra e ogni schermo che ha un valore di sala o la cui playlist legge la chiave di sala della fonte, ciascuno mapped, missing (la playlist legge il campo e lo schermo non ne ha) o unknown (il valore non indica alcuna sala, con la sala che probabilmente si intendeva). Correggete uno schermo con screen update scr_ID --field room=ROOM_KEY.

source rooms <source_id>
ParametroTipoObbligatorioPredefinitoNote
<source_id>stringsìnessunoUna fonte (src_…) che legge le sale di un sistema di prenotazione.
screenrig source rooms src_01EXAMPLESOURCE000000

source delete#

Elimina un’origine. La scheda conserva l’ultimo documento scritto dall’origine.

source delete <source_id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<source_id>stringsìnessunoL’origine (src_…).
--expect-rev REVISIONintegernonessunoRifiuta l’eliminazione se l’origine non è a questa revisione.
screenrig source delete src_01EXAMPLESOURCE000000

Connessioni

Una connessione è l’accesso salvato del progetto a Microsoft o a Google per il lavoro che gira senza nessuno connesso. Un’origine dati microsoft365 o google_calendar (source create --connection-id), una connessione Power BI (bi connection create powerbi --connection-id) e un account di sincronizzazione dei media SharePoint (media sync account add microsoft365 --connection-id) leggono tramite una connessione invece di portare ognuno un tenant, un ID client e un segreto. Un ID connessione inizia con pcn_, e un’organizzazione ha fino a 50 connessioni su tutti i suoi progetti. Le modalità, gli stati e i passaggi di approvazione sono in Collega Microsoft e Google.

La modalità own_app usa la tua app: per Microsoft una registrazione di app Microsoft Entra (--tenant-id, --client-id e il valore di un segreto client), per Google la chiave JSON di un account di servizio. La modalità screenrig_app usa l’app propria di screenRIG e non richiede alcun segreto: create stampa un link di consenso monouso (data.consent_url, valido fino a data.consent_expires_at) per la persona che lo completa, un amministratore di Microsoft 365 che dà il consenso per il tenant, oppure il titolare di un account Google che concede l’accesso in sola lettura ai calendari. Invia il link solo a quella persona, poi leggi status e last_error con connection show. Una connessione Power BI accetta solo una connessione own_app.

Fornisci un segreto client con --secret-file FILE e una chiave Google con --service-account-key-file FILE, oppure - per stdin, mai come argomento. La lettura richiede l’accesso Read, e ogni modifica richiede l’accesso Manage.

connection list#

Elenca le connessioni di questo progetto con il loro stato.

connection list

Nessun parametro.

screenrig connection list

connection show#

Ispeziona una connessione: il suo stato, l’ultimo errore e l’ultimo test.

connection show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (pcn_…).
screenrig connection show pcn_01EXAMPLECONNECTION0000

connection create microsoft#

Aggiungi una connessione Microsoft 365: la tua app Entra, oppure l’app di screenRIG con un link di consenso.

connection create microsoft --mode own_app|screenrig_app [--name NAME]
    [--tenant-id ID --client-id ID --secret-file FILE]
ParametroTipoObbligatorioPredefinitoNote
--mode MODEstringsìnessunoown_app: la tua registrazione di app Microsoft Entra con un segreto client. screenrig_app: l’app di screenRIG, per cui un amministratore di Microsoft 365 dà il consenso tramite il link monouso che questo comando stampa.
--name NAMEstringnoMicrosoft 365Da 1 a 80 caratteri.
--tenant-id IDstringcon own_appnessunoIl tuo ID directory (tenant) Microsoft Entra, o il suo dominio principale come contoso.onmicrosoft.com. Insieme a --client-id e --secret-file.
--client-id IDstringcon own_appnessunoL’ID applicazione (client) della registrazione dell’app.
--secret-file FILEstringcon own_appnessunoLeggi il valore del segreto client da questo file, oppure - per stdin (mai un argomento); il file contiene solo il valore.
screenrig connection create microsoft --mode own_app --tenant-id contoso.onmicrosoft.com --client-id 0b1d2f3a-4c5e-4f60-8a7b-9c0d1e2f3a4b --secret-file secret.txt
screenrig connection create microsoft --mode screenrig_app --name "Contoso rooms"

La modalità screenrig_app non accetta --tenant-id, --client-id né --secret-file: stampa il link di consenso (data.consent_url) per l’amministratore di Microsoft 365, che dà il consenso all’app di screenRIG per il tenant. La registrazione dell’app elenca Calendars.Read per i calendari delle sale riunioni, Sites.Selected o Files.Read.All per la sincronizzazione dei media di SharePoint e, per Power BI, le impostazioni del tenant e l’appartenenza all’area di lavoro invece delle autorizzazioni Graph; connection test riporta quali autorizzazioni possiede il token. Un server senza l’app di screenRIG risponde connection_app_not_configured: la modalità own_app funziona comunque.

connection create google#

Aggiungi una connessione Google: la chiave del tuo account di servizio, oppure l’app di screenRIG con un link di accesso.

connection create google --mode own_app|screenrig_app [--name NAME]
    [--service-account-key-file FILE]
ParametroTipoObbligatorioPredefinitoNote
--mode MODEstringsìnessunoown_app: la chiave del tuo account di servizio. screenrig_app: l’app di screenRIG, a cui il titolare di un account Google accede e concede l’accesso in sola lettura ai calendari tramite il link monouso che questo comando stampa.
--name NAMEstringnoGoogle CalendarDa 1 a 80 caratteri.
--service-account-key-file FILEstringcon own_appnessunoLeggi il file di chiave JSON dell’account di servizio da questo file, oppure - per stdin (mai un argomento).
screenrig connection create google --mode own_app --service-account-key-file key.json
screenrig connection create google --mode screenrig_app --name "Venue calendars"

In modalità own_app, condividi ogni calendario di sala con l’indirizzo dell’account di servizio, oppure assegna all’origine un subject (delega a livello di dominio). La modalità screenrig_app non richiede alcuna chiave e stampa il link di accesso (data.consent_url) per il titolare dell’account Google: l’account deve vedere ogni calendario di sala che un’origine elenca, e una tale origine non può indicare un subject. Un server senza l’app di screenRIG risponde connection_app_not_configured: la modalità own_app funziona comunque.

connection update#

Rinomina una connessione oppure, in modalità own_app, modifica il suo tenant, l’app o il segreto.

connection update <id> [--name NAME] [--tenant-id ID] [--client-id ID]
    [--secret-file FILE] [--service-account-key-file FILE] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (pcn_…).
--name NAMEstringnoinvariatoRinomina la connessione.
--tenant-id IDstringnoinvariatoMicrosoft own_app: l’ID directory (tenant) o il dominio principale.
--client-id IDstringnoinvariatoMicrosoft own_app: l’ID applicazione (client).
--secret-file FILEstringnoinvariatoMicrosoft own_app: leggi il valore del segreto client da questo file, oppure - per stdin; sostituisce il segreto memorizzato.
--service-account-key-file FILEstringnoinvariatoGoogle own_app: leggi la chiave JSON dell’account di servizio da questo file, oppure - per stdin; sostituisce la chiave memorizzata.
--expect-rev REVISIONintegernonessunoRifiuta la modifica se la connessione non è a questa revisione (revision_conflict, uscita 6).
screenrig connection update pcn_01EXAMPLECONNECTION0000 --secret-file new-secret.txt
screenrig connection update pcn_01EXAMPLECONNECTION0000 --name "Contoso rooms" --expect-rev 2

È richiesta almeno una modifica. Una modifica alle credenziali riporta la connessione a ready, cancella il suo ultimo errore e l’ultimo test, e ritira ogni token emesso per le vecchie credenziali: testala di nuovo. Una connessione screenrig_app può solo essere rinominata: connection connect crea un nuovo link di consenso per cambiare chi ha dato il consenso. Un segreto omesso viene conservato.

connection test#

Accedi con una connessione e controlla cosa consentono le sue credenziali.

connection test <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (pcn_…).
screenrig connection test pcn_01EXAMPLECONNECTION0000

Per Microsoft riporta credentials (un token dell’app per il tenant) e permissions (quali tra Calendars.Read, Sites.Selected, Files.Read.All, Sites.Read.All e Place.Read.All il token possiede; se non ne ha nessuna, il controllo fallisce, e Sites.Selected da sola è un avviso perché ogni sito richiede una propria concessione). Per Google riporta credentials, indicando l’account a cui i calendari devono essere visibili. Un rifiuto porta la connessione a error con last_error; un esito positivo la riporta a ready. Il test non valuta la condivisione di un calendario, una politica di accesso alle cassette postali né una concessione su un sito. Al massimo 30 al minuto per organizzazione.

connection connect#

Crea un nuovo link di consenso monouso per una connessione screenrig_app.

connection connect <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (pcn_…).
screenrig connection connect pcn_01EXAMPLECONNECTION0000

data.consent_url è il link per la persona che completa il consenso: l’amministratore di Microsoft 365, o il titolare dell’account Google. Sostituisce qualsiasi link precedente. Una connessione funzionante resta com’è finché il nuovo consenso non è completato, quindi questo rinnova anche una connessione passata a error (consenso rimosso, accesso revocato) o la sposta su un altro tenant o account. Una connessione in modalità own_app non ha alcun passaggio di consenso. Al massimo 20 al minuto per organizzazione.

connection delete#

Elimina una connessione che nulla usa per leggere.

connection delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (pcn_…).
--expect-rev REVISIONintegernonessunoRifiuta l’eliminazione se la connessione non è a questa revisione (revision_conflict, uscita 6).
screenrig connection delete pcn_01EXAMPLECONNECTION0000
screenrig connection delete pcn_01EXAMPLECONNECTION0000 --expect-rev 2

Finché un’origine dati, una connessione Power BI o un account di sincronizzazione dei media legge tramite la connessione, la risposta è resource_conflict (uscita 5), che li nomina. L’eliminazione non chiude il lato del fornitore: un tenant Microsoft 365 conserva l’app di screenRIG finché il suo amministratore non la rimuove, e un account Google conserva la sua concessione finché il suo titolare non la revoca.

Connessioni BI

Una connessione BI è l’accesso del progetto a un sistema di sua proprietà che mostra dashboard: per Grafana il suo indirizzo e un token di account di servizio, per Power BI un’app Microsoft Entra (service principal) e il suo segreto client, per Tableau un’app collegata e un utente, e per una pagina web l’account di servizio di un sito che mostra una dashboard dietro un accesso, oppure i cookie di un browser connesso. Un ID connessione inizia con bic_. I segreti sono sigillati sul server e non vengono mai più mostrati: una lettura mostra secret {set, hint}. Le connessioni appartengono a un solo progetto. bi connection list, show e browse richiedono l’accesso Read, e ogni altro comando richiede l’accesso Manage.

Fornisci un segreto in un file: --token-file per Grafana, --secret-file per Power BI e Tableau, --password-file, --totp-file e --cookies-file per una pagina web. Ognuno accetta - per stdin, mai un argomento, e al massimo un’opzione di un comando legge stdin.

Una vista riproduce una dashboard, un report o una pagina di una connessione tramite una primitiva iframe che mostra il suo embed_url; bi view create --connection-id ID ne crea una. Mostrare una dashboard dietro un accesso illustra una connessione web, e il Riferimento API copre ogni tipo.

bi connection create grafana#

Aggiungi una connessione Grafana: il suo indirizzo e un token di account di servizio.

bi connection create grafana --url URL --token-file FILE [--name NAME] [--org-id N]
ParametroTipoObbligatorioPredefinitoNote
--url URLstringsìnessunoL’indirizzo di Grafana su un host pubblico, con un eventuale prefisso di percorso: https://grafana.example.com o https://example.com/grafana. Un indirizzo privato, di loopback o riservato è invalid_request (uscita 8), e Grafana deve rispondere senza reindirizzare.
--token-file FILEstringsìnessunoLeggi il token dell’account di servizio da questo file, oppure - per stdin (mai un argomento); il file contiene solo il token.
--name NAMEstringnoil nome hostDa 1 a 80 caratteri.
--org-id Nintegerno1L’organizzazione Grafana a cui appartiene il token: un numero intero a partire da 1.
screenrig bi connection create grafana --url https://grafana.example.com --token-file token.txt
screenrig bi connection create grafana --url https://example.com/grafana --token-file - --name "Ops Grafana" --org-id 2

In Grafana installa il plugin Grafana Image Renderer o il servizio di rendering remoto (disegna le dashboard come immagini; senza di esso non viene disegnato nulla), poi crea un account di servizio con il ruolo Viewer e aggiungi un token. Poi esegui bi connection test.

bi connection create tableau#

Aggiungi una connessione Tableau: un’app collegata (direct trust), l’utente con cui vengono mostrate le viste degli schermi e il valore del segreto dell’app.

bi connection create tableau --url URL --client-id ID --secret-id ID --username USER
    --secret-file FILE [--site SITE] [--name NAME]
ParametroTipoObbligatorioPredefinitoNote
--url URLstringsìnessunoL’indirizzo https di Tableau Server, o del tuo pod Tableau Cloud come https://10ay.online.tableau.com (il pod, non online.tableau.com).
--site SITEstringnoil sito predefinito di Tableau ServerL’URL del contenuto del sito, la parte dopo /site/ o /t/ nell’indirizzo di una vista.
--client-id IDstringsìnessunoL’ID client dell’app collegata.
--secret-id IDstringsìnessunoL’ID del segreto di un segreto generato per l’app collegata.
--username USERstringsìnessunoL’utente Tableau con cui vengono mostrate le viste degli schermi (un indirizzo email su Tableau Cloud).
--secret-file FILEstringsìnessunoLeggi il valore del segreto da questo file, oppure - per stdin (mai un argomento); il file contiene solo il valore del segreto, non l’ID del segreto.
--name NAMEstringnoil nome hostDa 1 a 80 caratteri.
screenrig bi connection create tableau --url https://10ay.online.tableau.com --site lobby --client-id 11111111-2222-3333-4444-555555555555 --secret-id 66666666-7777-8888-9999-000000000000 --username screens@example.com --secret-file secret.txt

Da configurare una sola volta in Tableau: in Impostazioni, App collegate, crea un’app collegata con direct trust, copia il suo ID client, genera un segreto e copia l’ID del segreto e il valore del segreto, poi abilita l’app e il segreto. Scegli o crea l’utente Tableau con cui gli schermi mostrano le viste e dagli accesso solo alle viste che gli schermi mostrano: chiunque abbia il ticket di uno schermo può incorporare qualsiasi vista che quell’utente possa vedere. Poi esegui bi connection show ID e inserisci l’host del suo embed_origin nell’elenco dei domini consentiti dell’app collegata. Richiede Tableau Cloud o Tableau Server 2023.3 o successivo; gli schermi devono raggiungere l’host Tableau, e il loro browser deve accettare i cookie di terze parti da esso. Poi esegui bi connection test, quindi bi connection browse per trovare una vista.

bi connection create powerbi#

Aggiungi una connessione Power BI: un’app Microsoft Entra (service principal) e il suo segreto client, oppure una connessione Microsoft di questo progetto.

bi connection create powerbi
    (--tenant-id ID --client-id ID --secret-file FILE | --connection-id ID) [--name NAME]
ParametroTipoObbligatorioPredefinitoNote
--tenant-id IDstringsenza --connection-idnessunoIl tuo ID directory (tenant) Microsoft Entra, o il suo dominio come contoso.onmicrosoft.com; non common, organizations o consumers. Insieme a --client-id e --secret-file.
--client-id IDstringsenza --connection-idnessunoL’ID applicazione (client) della registrazione dell’app.
--secret-file FILEstringsenza --connection-idnessunoLeggi il valore del segreto client da questo file, oppure - per stdin (mai un argomento); il file contiene solo il valore del segreto, non l’ID del segreto.
--connection-id IDstringsenza --tenant-idnessunoAccedi tramite una connessione Microsoft (pcn_…) di questo progetto in modalità own_app, al posto di --tenant-id, --client-id e --secret-file. Una connessione screenrig_app viene rifiutata. Non insieme a essi.
--name NAMEstringnoPower BIDa 1 a 80 caratteri.
screenrig bi connection create powerbi --tenant-id 11111111-2222-3333-4444-555555555555 --client-id aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --secret-file secret.txt
screenrig bi connection create powerbi --connection-id pcn_01EXAMPLECONNECTION0000 --name "Contoso Power BI"

Da configurare una sola volta. In Microsoft Entra crea una registrazione di app (tenant singolo, nessun URI di reindirizzamento, nessuna autorizzazione API) e un segreto client. Un amministratore di Power BI attiva, nel portale di amministrazione in Impostazioni del tenant, Impostazioni sviluppatore, Embed content in apps e Service principals can call Fabric public APIs, per l’intera organizzazione o per un gruppo di sicurezza che contiene l’app. Aggiungi l’app a ogni area di lavoro che mostri con il ruolo Membro o Amministratore; Membro è l’accesso minimo. Per l’incorporamento in produzione l’area di lavoro deve trovarsi su una capacità Fabric (F), Power BI Embedded (A) o Premium (P/EM). Solo cloud commerciale. Poi esegui bi connection test, quindi bi connection browse per trovare un’area di lavoro e un report.

bi connection create web#

Aggiungi una connessione web: un account di servizio di un sito che mostra una dashboard dietro un accesso, oppure i cookie di un browser connesso.

bi connection create web --login-mode auto|steps|none [--login-url URL] [--username USER]
    [--password-file FILE] [--totp-file FILE] [--steps FILE] [--cookies-file FILE] [--name NAME]
ParametroTipoObbligatorioPredefinitoNote
--login-mode MODEstringsìnessunoauto compila il modulo su --login-url con --username e la password. steps esegue lo script --steps. none non effettua alcun accesso, quindi le pagine vengono mostrate con il set di cookie --cookies-file e non accetta nessuno tra --login-url, --username, --password-file, --totp-file o --steps.
--login-url URLstringcon auto o stepsnessunoL’indirizzo https della pagina di accesso del sito, su un host pubblico. La password viene digitata solo lì e nei passaggi goto dello script, mai nell’indirizzo di una vista.
--username USERstringcon autonessunoIl nome utente dell’account di servizio.
--password-file FILEstringcon autonessunoLeggi la password dell’account di servizio da questo file, oppure - per stdin (mai un argomento): gli spazi sono consentiti, e un solo fine riga finale viene scartato.
--totp-file FILEstringnonessunoLeggi la chiave base32 che il sito mostra per l’app di autenticazione dell’account (da 16 a 128 caratteri), o il suo indirizzo otpauth://totp, da questo file o da -: il server calcola i codici.
--steps FILEstringcon stepsnessunoLo script di accesso, un array JSON di al massimo 30 passaggi, da un file o da -. Azioni: goto (url), fill (selector, value), click e wait_for (selector), press (value come Enter, selector facoltativo) e wait_ms (ms). Un valore può contenere {{username}}, {{password}} e {{otp}}, mai il segreto stesso. Non con auto.
--cookies-file FILEstringnonessunoUn set di cookie esportato da un browser connesso: un array JSON di cookie (l’esportazione di un’estensione per cookie) o un oggetto con un array cookies (lo storage state di Playwright), da un file o da -; al massimo 100. Vengono inviati solo name, value, domain, path, expires, httpOnly, secure e sameSite.
--name NAMEstringnol’host di accessoDa 1 a 80 caratteri.
screenrig bi connection create web --login-mode auto --login-url https://login.example.com/signin --username screens@example.com --password-file password.txt --name "Ops dashboard"
screenrig bi connection create web --login-mode steps --login-url https://login.example.com/signin --username screens@example.com --password-file password.txt --steps steps.json
screenrig bi connection create web --login-mode none --cookies-file cookies.json --name "Signed-in jar"

La password, la chiave e i cookie sono sigillati e non vengono mai più mostrati: data.secret e data.totp_secret indicano se sono impostati, e data.session dice a che punto è l’accesso (idle, active, login_needed, paused, stopped o expired). Usa un account di servizio di sola lettura. Un accesso rifiutato attende 5 minuti, poi 15, 60 e 120, e il quinto di fila ferma la connessione finché non cambiano le sue credenziali o le sue impostazioni di accesso. Un sito che approva gli accessi su un telefono, controlla i dispositivi o mostra un CAPTCHA non si può automatizzare: usa un set di cookie. Un server senza il renderer di pagine risponde bi_web_unavailable (uscita 5). Poi esegui bi connection test.

bi connection list#

Elenca le connessioni BI di questo progetto con il loro tipo, il segreto mascherato e l’ultimo test.

bi connection list

Nessun parametro.

screenrig bi connection list

data.items contiene ogni connessione del progetto; non viene restituito alcun segreto.

bi connection show#

Ispeziona una connessione e il suo ultimo test.

bi connection show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (bic_…).
screenrig bi connection show bic_01EXAMPLECONNECTION0000

La risposta contiene kind, config (url e org_id per Grafana; tenant_id e client_id per Power BI; url, site, client_id, secret_id e username per Tableau), secret {set, hint}, embed_origin (l’host di incorporamento del progetto, da indicare nell’elenco dei domini consentiti di un’app collegata) e last_test.

bi connection update#

Modifica il nome, l’indirizzo, l’organizzazione, il tenant, l’app, il sito, l’utente o il segreto di una connessione oppure, per una connessione web, il suo accesso e i suoi cookie.

bi connection update <id> [--name NAME] [--url URL] [--org-id N] [--tenant-id ID] [--client-id ID]
    [--site SITE | --default-site] [--secret-id ID] [--username USER]
    [--token-file FILE | --secret-file FILE | --password-file FILE | --clear-password]
    [--login-mode auto|steps|none] [--login-url URL] [--totp-file FILE | --clear-totp]
    [--steps FILE] [--cookies-file FILE | --clear-cookies] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (bic_…).
--name NAMEstringnoinvariatoRinomina la connessione.
--url URLstringnoinvariatoIl nuovo indirizzo di Grafana, oppure del server o pod Tableau.
--org-id NintegernoinvariatoL’organizzazione Grafana a cui appartiene il token.
--tenant-id IDstringnoinvariatoIl tenant Microsoft Entra della connessione Power BI.
--client-id IDstringnoinvariatoL’ID applicazione (client) della connessione Power BI, oppure l’ID client dell’app collegata di Tableau.
--site SITEstringnoinvariatoL’URL del contenuto del sito della connessione Tableau. Non con --default-site.
--default-sitebooleannospentoTableau Server: accedi al sito predefinito. Non con --site.
--secret-id IDstringnoinvariatoL’ID del segreto dell’app collegata di Tableau.
--username USERstringnoinvariatoL’utente Tableau con cui vengono mostrate le viste degli schermi, oppure l’account di servizio della connessione web.
--token-file FILEstringnoinvariatoGrafana: leggi il token dell’account di servizio da questo file, oppure - per stdin; sostituisce il token memorizzato. Al massimo uno tra --token-file, --secret-file, --password-file e --clear-password.
--secret-file FILEstringnoinvariatoPower BI o Tableau: leggi il valore del segreto da questo file, oppure - per stdin; sostituisce il segreto memorizzato.
--login-mode MODEstringnoinvariatoWeb: come accede, auto, steps o none.
--login-url URLstringnoinvariatoWeb: l’indirizzo https della pagina di accesso del sito. Una nuova origine richiede --password-file nello stesso comando, così la password memorizzata non viene mai inviata a una pagina diversa da quella che hai indicato.
--password-file FILEstringnoinvariatoWeb: leggi la password dell’account di servizio da questo file, oppure - per stdin; sostituisce la password memorizzata.
--clear-passwordbooleannospentoWeb: rimuovi la password memorizzata.
--totp-file FILEstringnoinvariatoWeb: leggi la chiave dell’autenticatore da questo file, oppure - per stdin; sostituisce la chiave memorizzata. Non con --clear-totp.
--clear-totpbooleannospentoWeb: rimuovi la chiave dell’autenticatore memorizzata. Non con --totp-file.
--steps FILEstringnoinvariatoWeb: sostituisci lo script di accesso, un array JSON di al massimo 30 passaggi, da un file o da -.
--cookies-file FILEstringnoinvariatoWeb: sostituisci il set di cookie con uno esportato da un browser connesso, da un file o da - (le forme accettate da bi connection create web). Non con --clear-cookies.
--clear-cookiesbooleannospentoWeb: rimuovi il set di cookie memorizzato. Non con --cookies-file.
--expect-rev REVISIONintegernonessunoRifiuta la modifica se la connessione non è a questa revisione (revision_conflict, uscita 6).
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --token-file new-token.txt
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --password-file new-password.txt
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --clear-totp --clear-cookies
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --url https://grafana.example.com --token-file new-token.txt --name "Ops Grafana" --expect-rev 2

È richiesta almeno una modifica, e un segreto omesso viene conservato. Un nuovo indirizzo su un altro host, schema o porta richiede --token-file (Grafana) o --secret-file (Tableau) nello stesso comando: il segreto memorizzato viene inviato solo all’indirizzo per cui è stato salvato. Un nuovo indirizzo, organizzazione, tenant, app, sito, utente o segreto cancella last_test e ritira ogni render in cache per le viste della connessione: testala di nuovo. Una modifica delle credenziali o delle impostazioni di accesso riattiva una sessione web fermata.

bi connection test#

Controlla le credenziali: il token e l’Image Renderer di Grafana, l’app di Power BI e le sue aree di lavoro, oppure l’accesso a Tableau.

bi connection test <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (bic_…).
screenrig bi connection test bic_01EXAMPLECONNECTION0000

Grafana: token (Grafana lo accetta) e image_renderer (il plugin è elencato; senza di esso Grafana dà solo un avviso, perché un servizio di rendering remoto non compare come plugin). Power BI: token (Microsoft Entra ne ha emesso uno per l’app) e workspaces (le aree di lavoro che l’app può vedere; se non ce n’è nessuna, il controllo fallisce, e un rifiuto indica le impostazioni sviluppatore del tenant e il ruolo Membro o Amministratore dell’app nell’area di lavoro). Tableau: signin come utente della connessione con un token di lettura dei contenuti, seguito da una disconnessione. Un rifiuto è un controllo non riuscito che riporta la risposta del fornitore stesso, e il risultato viene memorizzato come last_test. Il test non valuta l’elenco dei domini consentiti di Tableau, la capacità, la sicurezza a livello di riga né i permessi di una dashboard: bi view test controlla davvero una vista.

bi connection browse#

Elenca ciò che una connessione può mostrare: dashboard e pannelli Grafana, aree di lavoro e report Power BI, oppure viste Tableau.

bi connection browse <id> [--query TEXT] [--dashboard UID] [--workspace ID]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (bic_…).
--query TEXTstringnonessunoSolo dashboard, aree di lavoro, report o viste il cui nome corrisponde.
--dashboard UIDstringnonessunoGrafana: elenca invece i pannelli di questa dashboard.
--workspace IDstringnonessunoPower BI: elenca invece i report di questa area di lavoro.
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --query lobby
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --dashboard abc123
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --workspace f089354e-8366-4e18-aea3-4cb4a3a50b48 --query sales

data.items elenca, per Grafana, uid, title, folder e tags di ogni dashboard che il token può mostrare, oppure con --dashboard id, title e type dei suoi pannelli (le righe vengono appiattite, quindi viene elencato anche un pannello dentro una riga compressa); per Power BI id e name di ogni area di lavoro che l’app può vedere, oppure con --workspace id, name e embed_url dei suoi report; per Tableau il path, nella forma Workbook/View, e name di ogni vista che l’utente della connessione può vedere. Usa questi valori con bi view create.

bi connection delete#

Elimina una connessione che nessuna vista usa.

bi connection delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa connessione (bic_…).
--expect-rev REVISIONintegernonessunoRifiuta l’eliminazione se la connessione non è a questa revisione (revision_conflict, uscita 6).
screenrig bi connection delete bic_01EXAMPLECONNECTION0000

Finché delle viste la usano, la risposta è resource_conflict (uscita 5), che le nomina: elimina prima quelle viste.

Viste BI

Una vista è una dashboard o un pannello di una connessione Grafana, un report di un’area di lavoro Power BI, una vista di un sito Tableau, una pagina di una connessione web, oppure un link pubblico che non richiede alcuna connessione: una dashboard pubblica Grafana, un link Publish to web di Power BI o una visualizzazione Tableau Public. Un ID vista inizia con biv_, e una vista viene riprodotta solo sugli schermi del proprio progetto.

Inserisci il embed_url della vista in una primitiva iframe con content_fit fill e pubblica come al solito: la playlist non contiene alcuna credenziale. Le viste Grafana e web vengono disegnate sul server come immagine ogni --refresh e condivise da tutti gli schermi della stessa dimensione, quindi dieci schermi in una hall producono un solo render e lo schermo non comunica mai con il sistema; l’ultima immagine valida resta sullo schermo mentre un’acquisizione fallisce. Un report Power BI e una vista Tableau si incorporano con un token di sola visualizzazione che il server genera e rinnova, e lo schermo non possiede mai il segreto. Un’immagine viene disegnata solo mentre il manifest di uno schermo nomina la vista.

La lettura richiede l’accesso Read, e ogni modifica richiede l’accesso Manage. Ogni opzione di destinazione appartiene a un solo tipo di connessione, e bi connection browse ID elenca i valori da usare.

bi view create#

Aggiungi una vista di una dashboard, un pannello, un report o una vista Tableau di una connessione, oppure di un link pubblico.

bi view create (--connection-id ID (--url URL | --dashboard UID | --workspace ID --report ID | --view WORKBOOK/VIEW)
    | --public-url URL) [--name NAME] [--refresh DURATION] [--fit contain|cover|fill] [--rotate DURATION]
    [--panel ID] [--from TIME] [--to TIME] [--var NAME=VALUE]... [--theme dark|light] [--timezone ZONE]
    [--page NAME]... [--all-pages] [--rotate-sheets] [--wait-for CSS] [--wait-ms MS] [--clip CSS]
ParametroTipoObbligatorioPredefinitoNote
--connection-id IDstringsenza --public-urlnessunoLa connessione (bic_…) di cui mostrare qualcosa.
--url URLstringuna destinazionenessunoUn indirizzo di dashboard sull’host Grafana della connessione, un indirizzo di report Power BI, un indirizzo di vista Tableau oppure, per una connessione web, l’indirizzo https della pagina su un host pubblico. Il resto della destinazione viene letto da esso.
--dashboard UIDstringuna destinazionenessunoGrafana: l’uid della dashboard, la parte dopo /d/ nel suo indirizzo.
--workspace IDstringuna destinazionenessunoPower BI: l’ID dell’area di lavoro, con --report.
--report IDstringcon --workspacenessunoPower BI: l’ID del report, con --workspace.
--view WORKBOOK/VIEWstringuna destinazionenessunoTableau: la vista, i nomi dopo /views/ nel suo indirizzo (bi connection browse li elenca).
--public-url URLstringuna destinazionenessunoUn link di dashboard pubblica Grafana, un link Publish to web di Power BI o un indirizzo di visualizzazione Tableau Public. Non richiede alcuna connessione e viene riprodotto dal vivo dal suo host. Indicalo da solo, con --name, --refresh, --fit e --rotate-sheets.
--name NAMEstringnodalla destinazioneDa 1 a 80 caratteri.
--refresh DURATIONstringno5mGrafana: ogni quanto l’immagine viene ridisegnata, da 30s a 24h. Web: ogni quanto la pagina viene ridisegnata, da 60s a 24h. Power BI e Tableau: ogni quanto il report o la vista aggiorna i propri dati, da 60s a 24h, oppure 0 per nessuno.
--fit FITstringnocontainGrafana e web: come l’immagine riempie lo schermo, contain, cover o fill.
--rotate DURATIONstringnonessunoPower BI: per quanto tempo viene mostrata ogni pagina, da 10s a 1h; necessario con due o più --page o con --all-pages. Tableau: per quanto tempo viene mostrato ogni foglio; necessario con --rotate-sheets.
--page NAMEstringnonessunoPower BI: una pagina da mostrare, per nome o nome visualizzato. Ripetibile; le pagine vengono mostrate in quest’ordine.
--all-pagesbooleannospentoPower BI: ruota tra tutte le pagine visibili, con --rotate.
--rotate-sheetsbooleannospentoTableau: fai ruotare i fogli pubblicati della cartella di lavoro, con --rotate.
--panel IDstringnol’intera dashboardGrafana: mostra solo questo pannello invece dell’intera dashboard.
--from TIMEstringnonessunoGrafana: inizio dell’intervallo di tempo, come now-6h.
--to TIMEstringnonessunoGrafana: fine dell’intervallo di tempo, come now.
--var NAME=VALUEstringnonessunoGrafana: una variabile della dashboard. Ripetibile.
--theme THEMEstringnodarkTema di Grafana, dark o light.
--timezone ZONEstringnonessunoGrafana: fuso orario della dashboard, come Europe/Paris, utc o browser.
--wait-for CSSstringnonessunoWeb: un selettore CSS di un elemento che compare quando la pagina è pronta, e solo quando è connessa. L’acquisizione lo attende e fallisce con bi_web_timeout se non compare mai.
--wait-ms MSintegernonessunoWeb: millisecondi di attesa dopo che la pagina è pronta, per i grafici tardivi, da 0 a 10000.
--clip CSSstringnol’intera paginaWeb: un selettore CSS della parte della pagina da disegnare.
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --url 'https://grafana.example.com/d/abc123/lobby?orgId=1&viewPanel=4' --refresh 5m
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --dashboard abc123 --panel 4 --from now-6h --to now --var host=web1 --theme light --name "Web CPU"
screenrig bi view create --public-url https://grafana.example.com/public-dashboards/TOKEN --name "Public status"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --workspace f089354e-8366-4e18-aea3-4cb4a3a50b48 --report 5b218778-e7a5-4d73-8187-f10824047715 --page Overview --page Detail --rotate 30s --name "Sales rotation"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --view Sales/Overview --rotate-sheets --rotate 30s --refresh 0 --name "Sales sheets"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --url https://app.example.com/dashboards/42 --refresh 5m --wait-for '#dashboard.loaded' --wait-ms 1500 --clip '#chart-grid'

Indica esattamente una destinazione: --url, --dashboard, --workspace con --report, --view o --public-url. La risposta contiene data.embed_url. Poi esegui bi view test.

Grafana: --url legge orgId, viewPanel o panelId, from, to, var-* e theme dall’indirizzo. L’immagine viene disegnata tramite il servizio di rendering di Grafana e condivisa da tutti gli schermi della stessa dimensione, e uno schermo conserva l’ultima immagine, con l’ora del render in un angolo, mentre Grafana non è disponibile. Un link di dashboard pubblica viene riprodotto dal vivo da Grafana, che deve consentire l’incorporamento (allow_embedding = true nelle sue impostazioni): bi view test lo verifica.

Power BI: --url accetta l’indirizzo di un report copiato da Power BI, https://app.powerbi.com/groups/WORKSPACE/reports/REPORT, con una pagina facoltativa /ReportSection; oppure indica --workspace e --report. Due o più pagine richiedono --rotate, e --rotate richiede due o più pagine oppure --all-pages. --refresh 0 è adatto a un report DirectQuery o con aggiornamento automatico della pagina, che si aggiorna da solo. --fit non si applica. Un link Publish to web mostra il report a chiunque abbia il link e viene riprodotto come lo serve Power BI, ricaricato ogni --refresh, senza rotazione delle pagine.

Tableau: --url accetta l’indirizzo di una vista copiato da Tableau, https://HOST/t/SITE/views/WORKBOOK/VIEW, quello di Tableau Cloud, https://HOST/#/site/SITE/views/WORKBOOK/VIEW, oppure semplicemente WORKBOOK/VIEW; l’indirizzo deve trovarsi sull’host e sul sito della connessione. --rotate-sheets e --rotate richiedono l’uno l’altro. --fit non si applica. Gli schermi devono raggiungere l’host Tableau e accettarne i cookie di terze parti, e il embed_origin della vista deve essere nell’elenco dei domini consentiti dell’app collegata. Una visualizzazione Tableau Public (--public-url https://public.tableau.com/app/profile/USER/viz/WORKBOOK/VIEW, o il suo indirizzo /views/) non richiede né connessione né token, e anche lì funziona --rotate-sheets.

Web: --url è l’indirizzo della pagina, e --wait-for, --wait-ms e --clip si applicano solo a una vista web. L’ultima immagine valida resta sullo schermo quando un’acquisizione fallisce, e status.last_error ne indica il motivo: bi_web_login_failed, bi_web_otp_required, bi_web_session_expired, bi_web_login_paused, bi_web_timeout, bi_web_navigation_failed o bi_web_blocked.

bi view list#

Elenca le viste BI di questo progetto con la loro destinazione, cadenza e stato.

bi view list

Nessun parametro.

screenrig bi view list

data.items contiene ogni vista del progetto, ciascuna con il proprio embed_url.

bi view show#

Ispeziona una vista, il suo embed_url e come è andata l’ultima volta sullo schermo.

bi view show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa vista (biv_…).
screenrig bi view show biv_01EXAMPLEVIEW0000000000

La risposta contiene connection_id, target (view e rotate_sheets per Tableau), refresh_s, rotate_s, fit, status e embed_url. status contiene last_ok_at e last_error con un code e un detail: bi_upstream_refused quando Grafana ha rifiutato il token, bi_upstream_unavailable quando non è riuscito a disegnare.

bi view update#

Modifica il nome, la destinazione, la cadenza o l’adattamento di una vista.

bi view update <id> [--name NAME] [--refresh DURATION] [--fit contain|cover|fill] [--rotate DURATION]
    [--url URL | --dashboard UID | --workspace ID | --view WORKBOOK/VIEW | --public-url URL] [--report ID]
    [--page NAME]... [--all-pages] [--rotate-sheets] [--panel ID] [--from TIME] [--to TIME]
    [--var NAME=VALUE]... [--theme dark|light] [--timezone ZONE] [--wait-for CSS | --clear-wait-for]
    [--wait-ms MS] [--clip CSS | --clear-clip] [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa vista (biv_…).
--name NAMEstringnoinvariatoRinomina la vista.
--url URLstringnoinvariatoUn indirizzo di dashboard, di report o di vista Tableau, oppure l’indirizzo della pagina di una vista web; sostituisce l’intera destinazione. Non con le altre opzioni di destinazione.
--dashboard UIDstringnoinvariatoGrafana: mostra questa dashboard; sostituisce l’intera destinazione.
--workspace IDstringnoinvariatoPower BI: mostra un report di quest’area di lavoro, con --report; sostituisce l’intera destinazione.
--report IDstringnoinvariatoPower BI: mostra questo report, in --workspace o nell’area di lavoro attuale.
--view WORKBOOK/VIEWstringnoinvariatoTableau: mostra questa vista; sostituisce l’intera destinazione.
--public-url URLstringnoinvariatoUn link pubblico; sostituisce l’intera destinazione.
--rotate-sheetsbooleannospentoTableau: fai ruotare i fogli pubblicati della cartella di lavoro, con --rotate.
--page NAMEstringnoinvariatoPower BI: le pagine da mostrare, per nome o nome visualizzato. Ripetibile; sostituisce le pagine attuali.
--all-pagesbooleannospentoPower BI: ruota tra tutte le pagine visibili.
--rotate DURATIONstringnoinvariatoPower BI: per quanto tempo viene mostrata ogni pagina, da 10s a 1h, oppure 0 per una sola pagina. Tableau: per quanto tempo viene mostrato ogni foglio, oppure 0 per smettere di farli ruotare.
--panel IDstringnoinvariatoGrafana: mostra solo questo pannello.
--from TIMEstringnoinvariatoGrafana: inizio dell’intervallo di tempo.
--to TIMEstringnoinvariatoGrafana: fine dell’intervallo di tempo.
--var NAME=VALUEstringnoinvariatoGrafana: imposta una variabile della dashboard. Ripetibile; ne imposta una e conserva le altre.
--theme THEMEstringnoinvariatoTema di Grafana, dark o light.
--timezone ZONEstringnoinvariatoGrafana: fuso orario della dashboard.
--refresh DURATIONstringnoinvariatoOgni quanto l’immagine viene ridisegnata o il report si aggiorna: Grafana da 30s a 24h; web da 60s a 24h; Power BI e Tableau da 60s a 24h, oppure 0 per nessuno.
--fit FITstringnoinvariatoGrafana e web: come l’immagine riempie lo schermo, contain, cover o fill.
--wait-for CSSstringnoinvariatoWeb: l’elemento che compare quando la pagina è pronta e connessa. Non con --clear-wait-for.
--clear-wait-forbooleannospentoWeb: smetti di attendere un elemento. Non con --wait-for.
--wait-ms MSintegernoinvariatoWeb: millisecondi di attesa dopo che la pagina è pronta, da 0 a 10000; 0 elimina l’attesa.
--clip CSSstringnoinvariatoWeb: la parte della pagina da disegnare. Non con --clear-clip.
--clear-clipbooleannospentoWeb: ridisegna l’intera pagina. Non con --clip.
--expect-rev REVISIONintegernonessunoRifiuta la modifica se la vista non è a questa revisione (revision_conflict, uscita 6).
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --wait-for '#dashboard.loaded' --wait-ms 2000
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --clear-wait-for --clear-clip
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --theme light --var host=web2
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --dashboard def456 --panel 2 --expect-rev 3
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --page Overview --page Detail --rotate 45s
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --view Sales/Detail

È richiesta almeno una modifica. --url, --dashboard, --workspace e --public-url sostituiscono l’intera destinazione, mentre --panel, --from, --to, --var, --theme e --timezone modificano la destinazione Grafana attuale della vista, --report, --page e --all-pages quella Power BI, e --view e --rotate-sheets quella Tableau. --page sostituisce l’elenco delle pagine; per svuotarlo indica di nuovo --workspace e --report con --rotate 0. --rotate 0 da solo impedisce a una vista Tableau di far ruotare i suoi fogli. Una nuova destinazione cancella lo stato e ritira i render in cache, e gli schermi recepiscono la modifica al successivo aggiornamento senza ripubblicare. Una vista conserva la propria connessione e il proprio tipo.

bi view test#

Controlla davvero una vista: un render Grafana, un token di incorporamento Power BI, una ricerca Tableau, oppure un link pubblico.

bi view test <id> [--output FILE [--width PIXELS] [--height PIXELS]]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa vista (biv_…).
--output FILEstringnonessunoGrafana: salva qui il PNG generato invece di eseguire i controlli.
--width PIXELSintegerno1920Larghezza dell’immagine salvata, da 1 a 10000. Richiede --output.
--height PIXELSintegerno1080Altezza dell’immagine salvata, da 1 a 10000. Richiede --output.
screenrig bi view test biv_01EXAMPLEVIEW0000000000
screenrig bi view test biv_01EXAMPLEVIEW0000000000 --output lobby.png --width 1920 --height 1080

Grafana: una vista di connessione viene disegnata davvero, fuori dalla cache condivisa e senza toccare lo stato della vista. data.ok è false con il motivo di Grafana quando rifiuta il token, non ha un renderer o non conosce la dashboard; un test non riuscito è un dato, uscita 0. Apri il PNG salvato e controllalo prima di pubblicare. Per un link pubblico il test scarica la pagina e verifica che Grafana consenta alla pagina di incorporamento della vista di inquadrarla.

Tableau: una vista di connessione accede come utente della connessione e cerca la vista (signin, view); una vista che l’utente non può vedere, o un nome con maiuscole e minuscole errate, è un controllo view non riuscito che indica il percorso. Una vista Tableau Public chiede a Tableau Public se la cartella di lavoro esiste. Power BI: una vista di connessione legge il report (report) e genera un vero token di incorporamento di sola visualizzazione per esso (embed_token); quando lo rifiuta, viene mostrato il motivo di Power BI stesso, come un dataset con sicurezza a livello di riga, un 401 o 403 (impostazione del tenant o ruolo nell’area di lavoro) o un report che l’app non può vedere. Un link Publish to web viene scaricato e ne vengono letti gli header di framing.

Il test non valuta ciò che l’immagine mostra, le pagine che la vista nomina, la capacità né l’elenco dei domini consentiti di Tableau.

bi view delete#

Elimina una vista.

bi view delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoLa vista (biv_…).
--expect-rev REVISIONintegernonessunoRifiuta l’eliminazione se la vista non è a questa revisione (revision_conflict, uscita 6).
screenrig bi view delete biv_01EXAMPLEVIEW0000000000
screenrig bi view delete biv_01EXAMPLEVIEW0000000000 --expect-rev 3

Uno schermo che mostra ancora il embed_url della vista risponde not_found finché la sua playlist non cambia.

Conversazioni di assistenza

Ogni piano, incluso Standard, include l’assistenza AI tramite CLI e il pulsante giallo Supporto nel dashboard in basso a destra, e Premium, Education ed Enterprise possono chiedere una persona. Le conversazioni mantengono la cronologia. Il dashboard evidenzia le risposte staff non lette e rende Markdown, inclusi link cliccabili, elenchi e codice. Premi Invio per inviare o Maiusc+Invio per una nuova riga. Le risposte staff mostrano nome e avatar Slack se disponibili, con staff ScreenRIG e logo screenRIG come fallback; i clienti usano un avatar persona generico.

Usa la documentazione e il tuo agente operativo per diagnosticare e risolvere problemi. Usa feedback bug o feedback feature per inviare report.

support status
support submit (--body TEXT | --body-file FILE) [--conversation-id ID] [--human-requested]
support history [--before ID]
support history --conversation-id ID [--after SEQUENCE]
support follow [--conversation-id ID] [--after SEQUENCE] [--timeout MS]
support read --conversation-id ID --sequence SEQUENCE
support close --conversation-id ID

Inizia con support status, che segnala chat_allowed (questo progetto può avviare o continuare una conversazione), human_available (una persona può unirsi su richiesta), staffed (lo staff è nel suo orario in questo momento) e hours (gli orari del personale). support submit accetta un messaggio da 1 a 4000 caratteri. Ometti --conversation-id per iniziare una conversazione; usa il data.conversation.id restituito per i follow-up. Mantieni la stessa chiave di idempotenza quando ritenti un invio incerto.

Le pagine della cronologia contengono fino a 100 righe. Passa la data.next di una pagina di conversazione come --before per conversazioni più vecchie, o l’ultima sequenza di messaggi come --after per messaggi più recenti. support follow trasmette le risposte come SSE, riprende dall’ultima sequenza del progetto e sopprime la riproduzione. Un filtro di conversazione seleziona quali risposte stampare mentre avanza quel cursore di progetto. support read riconosce le risposte dello staff fino alla sequenza letta. Termina una conversazione risolta con support close o il pulsante Termina conversazione della dashboard. La chiusura conserva la cronologia; avvia una nuova conversazione per ulteriore assistenza.

screenrig support submit --body "How do I assign a playlist? Here are the checks I ran."
screenrig support follow --conversation-id sc_CONVERSATION --after 0 --timeout 60000
screenrig support submit --conversation-id sc_CONVERSATION --body "Please ask a human." --human-requested

Luna, l’assistente IA, risponde subito su ogni piano. Una persona si unisce a una conversazione su richiesta solo su Education, Premium ed Enterprise (human_available), e chiedere una persona mette in pausa l’IA in quella conversazione; su Standard e Plus la richiesta viene ignorata e Luna risponde. Gli orari del personale sono 09:00–17:00 lunedì–venerdì, ora di Vancouver, esclusi i giorni festivi della B.C., e determinano solo quando risponde una persona. Non inserire credenziali nei messaggi di assistenza.

Feedback

Segnalazioni di bug e richieste di funzionalità sono associate al progetto e immutabili. Il tipo deriva dal comando, mai da un campo del corpo, e una correzione è una nuova segnalazione, non una modifica.

feedback bug#

Segnala un bug di screenRIG.

feedback bug <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]
ParametroTipoObbligatorioPredefinitoNote
<title>stringsìnessunoAl massimo 120 caratteri.
--body TEXTstringuno dei duenessunoCorpo inline, massimo 4000 caratteri.
--body-file FILEpathuno dei duenessunoLeggi il corpo da un file, adatto a un rapporto multilinea.
--commandstringnonessunoIl comando a cui si riferisce il report, solo come percorso comando: fino a quattro parole minuscole come media upload. Non è mai preso dalla riga di comando eseguita.
--no-contextbooleannospentoOmetti l’involucro diagnostico, che altrimenti contiene la versione della CLI, il percorso comando opzionale e la piattaforma.
screenrig feedback bug "Playlist stalls after assignment" --body-file ./report.md --command "screen assign"

Il server rifiuta, anziché oscurare, testo che corrisponde a materiale di credenziali, e restituisce indicazioni a livello di campo per riscrivere e rinviare. Un retry esatto con la stessa chiave di idempotenza restituisce l’invio originale per ventiquattro ore.

feedback feature#

Richiedi una funzionalità.

feedback feature <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]
ParametroTipoObbligatorioPredefinitoNote
<title>stringsìnessunoAl massimo 120 caratteri.
--body TEXTstringuno dei duenessunoCorpo inline, massimo 4000 caratteri.
--body-file FILEpathuno dei duenessunoLeggi il corpo da un file.
--commandstringnonessunoIl comando a cui si riferisce la richiesta, solo come percorso comando.
--no-contextbooleannospentoOmetti l’involucro diagnostico.
screenrig feedback feature "Add a dry-run flag" --body "Preview a change first."

feedback list#

Elenca le proprie submission di questo progetto

feedback list [--kind bug|feature]
ParametroTipoObbligatorioPredefinitoNote
--kindstringnoentrambi i tipi, dal più recentebug o feature. Restringi l’elenco a un tipo.
screenrig feedback list --kind bug

Pubblicità

Acquista pubblicità in una rete che ti ha invitato, o vendi spazi pubblicitari su schermi di tua proprietà. Ogni comando legge prima screenrig project capabilities: comprare richiede la capacità advertiser, vendere richiede schermi di proprietà. Il denaro è riportato come stringhe decimali mcr (millicredit). Esegui screenrig ads COMMAND --help --json per ogni flag. Il flusso di lavoro di acquisto e vendita è in Inizio; tariffe e commissioni sono in Prezzi.

ads networks#

Acquirente: elenca le reti a cui questo progetto è stato invitato e ispeziona l’inventario e gli slot consentiti di una rete.

ads networks list
ads networks show <seller-project-id>
screenrig ads networks list

ads network#

Venditore: ispeziona o crea la rete di questo progetto e imposta la tariffa predefinita.

ads network show
ads network create --name NAME
ads network rate --rate-mcr-per-15s MCR --expect-rev REVISION
screenrig ads network rate --rate-mcr-per-15s 1000 --expect-rev 3

La tariffa è per ogni 15 secondi di riproduzione completata. Una tariffa effettiva modificata mette in pausa le campagne interessate finché ogni acquirente non accetta un nuovo preventivo.

ads inventory#

Venditore: includi o escludi uno schermo di proprietà dalla pubblicità e descrivilo agli acquirenti invitati.

ads inventory list
ads inventory update <screen-id> [--enabled | --disabled] [--site-name NAME]
    [--city CITY] [--region REGION] [--venue-type TYPE] [--audience-tags TOKENS]
    [--placement TEXT] [--public-description TEXT]
    [--rate-mcr-per-15s MCR | --clear-rate]
    [--impressions-per-hour N | --clear-impressions-per-hour] [--expect-rev REVISION]
screenrig ads inventory update scr_LOBBY --enabled --venue-type cafe

I flag omessi mantengono i valori correnti. Una nuova riga inventario necessita --enabled o --disabled. --impressions-per-hour registra la tua stima delle impression che lo schermo genera in un’ora: ogni riproduzione completata conta quindi quella stima per i secondi riprodotti diviso 3600 come estimated_impressions in ads reports spend, ads reports delivery e ads direct report.

ads slots#

Venditore: definisci slot pubblicitari riutilizzabili. Uno slot non cambia nulla sullo schermo finché la sua pagina adslot non viene inserita in una playlist.

ads slots list
ads slots create --name NAME --accepted-media image,video
    [--max-image-duration-ms MS] [--max-video-duration-ms MS]
    [--rate-mcr-per-15s MCR] [--enabled | --disabled] [--vast-tag-url URL]
ads slots update <slot-id> --expect-rev REVISION [same fields] [--clear-vast-tag-url]
screenrig ads slots create --name "Lobby break" --accepted-media image,video
screenrig ads slots create --name "Lobby video" --accepted-media video --vast-tag-url https://ads.example.com/vast.xml
screenrig ads slots update ads_LOBBY --clear-vast-tag-url --expect-rev 2

--vast-tag-url imposta il proprio tag pubblicitario VAST 2-4 del venditore, provato quando nessuna campagna invitata riempie lo slot sugli schermi propri; lo slot deve accettare video. L’URL è HTTPS sulla porta 443 o 8443 verso un host pubblico. Il backend lo recupera, segue fino a cinque Wrapper, acquisisce l’MP4 o WebM progressivo scelto nei contenuti del progetto, e attiva Impression, creativeView e start all’inizio accettato, complete alla fine accettata, e Error in caso di errore; non ci sono tracker quartili. Le macro [CACHEBUSTING], [TIMESTAMP], [SCREENRIG_SCREEN_ID], [SCREENRIG_SLOT_ID] e [SCREENRIG_PAGE_ID] sono espanse, e gli acquirenti non vedono mai il tag. Su update, --vast-tag-url sostituisce il tag e --clear-vast-tag-url lo rimuove; i due non si combinano, e omettere entrambi mantiene il tag memorizzato. ads slots list mostra vast_tag_url al venditore proprietario.

Advertising invitations#

Usa i comandi condivisi invitations sopra:

screenrig invitations create --kind ad-buyer --email owner@bakery.example --screen-id scr_LOBBY --policy review_required
screenrig invitations list --kind ad-buyer
screenrig invitations revoke ID

La persona invitata accetta nel dashboard. Una persona con accesso seleziona il progetto di acquisto e conferma con una nuova prova passkey. Una persona senza login ne crea uno e un progetto solo per inserzionisti durante l’accettazione.

ads memberships#

Venditore: modifica o revoca la politica di revisione e l’ambito dell’inventario di un acquirente ammesso.

ads memberships list
ads memberships update <membership-id> --expect-rev REVISION
    [--policy trusted|review_required] [--screen-id IDS] [--slot-id IDS]
ads memberships revoke <membership-id>
screenrig ads memberships list

La revoca interrompe nuove riproduzioni pubblicitarie e mantiene la storia finanziaria.

ads creatives#

Acquirente: associa media pronti di proprietà a una creatività immutabile con copia approvata.

ads creatives list
ads creatives create --media-id ID --copy TEXT
ads creatives show <creative-id>
screenrig ads creatives create --media-id med_123 --copy "Fresh bread daily"

ads campaigns#

Acquirente: crea una campagna, definisci il prezzo e attivala accettando il preventivo.

ads campaigns list | show <campaign-id>
ads campaigns create <file>
ads campaigns update <campaign-id> <file> --expect-rev REVISION
ads campaigns preview <campaign-id> [--expect-rev REVISION]
ads campaigns activate <campaign-id> --quote-id ID --expect-rev REVISION
ads campaigns pause | resume <campaign-id> --expect-rev REVISION
ads campaigns accept-rates <campaign-id> --quote-id ID --expect-rev REVISION
screenrig ads campaigns preview cmp_123

Una bozza non riserva nulla. preview restituisce un preventivo a tempo limitato e non spende nulla; activate richiede quel preventivo esatto. Dopo un cambio di tariffa venditore, solo accept-rates con un preventivo aggiornato riprende la campagna.

Una bozza di campagna accetta una category facoltativa dall'elenco delle categorie di inserzionisti. Due annunci della stessa categoria non vanno mai in onda nella stessa interruzione pubblicitaria su uno schermo.

ads direct#

Venditore: prenota i tuoi accordi con inserzionisti esterni a screenRIG sui tuoi schermi.

ads direct list | show <campaign-id>
ads direct create <file>
ads direct update <campaign-id> <file> --expect-rev REVISION
ads direct pause | resume | end <campaign-id> --expect-rev REVISION
ads direct availability <file>
ads direct report <campaign-id> [--from TIMESTAMP] [--to TIMESTAMP] [--format json|csv] [--output FILE|-]
screenrig ads direct create campaign.json

Una bozza indica name, advertiser, una category facoltativa, flight_start e flight_end, media_ids (le tue immagini o i tuoi video pronti), un goal_plays facoltativo, un price facoltativo (cpm per mille riproduzioni o flat, con un amount e una currency ISO 4217) e il targeting: screen_ids, slot_ids, venue_types, cities, tags e dayparts, dove un elenco vuoto indica ogni schermo o spazio abilitato. Una campagna diretta riempie un'interruzione pubblicitaria prima degli acquirenti invitati. Un obiettivo è distribuito uniformemente sul periodo di programmazione e va in onda per primo finché è in ritardo; una campagna senza obiettivo occupa ogni spazio idoneo durante il suo periodo. Non si spostano crediti: fatturi tu l'inserzionista e il prezzo dà valore al rapporto.

availability legge una query con lo stesso targeting e lo stesso periodo di programmazione e stima le riproduzioni che puoi ancora prenotare: le occorrenze recenti degli spazi pubblicitari degli schermi selezionati, meno le riproduzioni di cui hanno ancora bisogno gli altri tuoi obiettivi diretti. Un obiettivo superiore alla stima restituisce goal_overbooked, a meno che la bozza non imposti "overbook": true. report elenca le riproduzioni rispetto all'obiettivo, il ritmo, il valore, le riproduzioni non andate in onda e le righe per giorno UTC, schermo, spazio e media; end è definitivo.

ads reviews#

Venditore: approva, rifiuta o richiedi modifiche alle versioni creative esatte inviate dagli acquirenti su review_required.

ads reviews list
ads reviews show <review-id>
ads reviews approve <review-id>
ads reviews reject <review-id> --reason TEXT
ads reviews request-changes <review-id> --note TEXT
screenrig ads reviews request-changes arv_123 --note "Use the new logo"

request-changes invia la tua nota all’acquirente. Per inviare la revisione, associa il contenuto multimediale aggiornato a una nuova creatività, aggiungila a una nuova campagna ed esegui preview e activate con il nuovo preventivo. La campagna sostitutiva ha un budget e una cronologia delle revisioni propri. Metti in pausa la campagna originale prima di attivare quella sostitutiva per evitare pubblicazioni sovrapposte. Le persone decidono sulle creatività pubblicitarie nella pagina Revisioni della dashboard, insieme alle modifiche a playlist e schermi.

ads reports#

Leggi la spesa come acquirente o la consegna come venditore.

ads reports spend --campaign-id ID
ads reports delivery --from TIMESTAMP --to TIMESTAMP
ads reports fill [--from TIMESTAMP] [--to TIMESTAMP]
screenrig ads reports delivery --from 2026-09-01T00:00:00Z --to 2026-10-01T00:00:00Z

I rapporti di consegna mostrano lordo, commissioni di servizio e netto per il periodo. Un rapporto acquirente non mostra mai altri introiti del venditore. fill mostra, per un massimo di 35 giorni, quante occorrenze di spazi pubblicitari hanno richiesto i tuoi schermi, quante ne hanno riempite le campagne dirette, gli acquirenti invitati e il tuo tag VAST, e perché le restanti sono rimaste vuote: no_demand, ineligible, separated o capped.

Prepara, pubblica e modifica playlist

Per immagini e video pronti, prepara una playlist a schermo intero in ordine di riproduzione:

screenrig playlist init med_POSTER med_VIDEO --name "Lobby loop" --screen-id scr_LOBBY --output lobby.json
screenrig playlist validate lobby.json
screenrig screen publish scr_LOBBY lobby.json
screenrig screen screenshot scr_LOBBY

Convalida il documento, pubblicalo, poi guarda lo schermo reale con screen screenshot. playlist init accetta file immagine/video locali, ID med_ pronti, release applicative rel_ fissate e URL iframe HTTP o HTTPS in ordine di riproduzione, inclusi input misti:

screenrig playlist init ./poster.png med_VIDEO rel_APP https://example.com --name Lobby --screen-id scr_LOBBY --output lobby.json

Il caricamento di file locali avviene tramite il percorso media normale e attende la prontezza. Questo richiede ffmpeg e ffprobe a meno che non sia fornito --no-transcode. La preparazione scrive il documento locale e può caricare media; non crea né assegna playlist remote. I media esistenti devono essere pronti. Gli URL HTTP e HTTPS possono includere host della rete locale e credenziali incorporate e non vengono scaricati durante la preparazione. L’app web del Player richiede URL HTTPS senza nome utente o password.

Per la preparazione di file ritentabile, scegli --idempotency-key al primo tentativo e riusalo con file identici e ordine di input entro la finestra di replay del server. Ogni occorrenza di file ha le proprie chiavi di upload. Senza chiave esplicita, una nuova invocazione ottiene nuove chiavi. I media caricati sopravvivono a un fallimento di preparazione successivo; ispeziona media list e riusa quegli ID per riconciliare un risultato parziale.

Ogni input diventa una pagina a schermo intero con sfondo nero e dissolvenza incrociata di 200 ms. Immagini e video usano --fit contain|cover|fill (predefinito contain). I video sono senza audio, non si ripetono e avanzano al termine. Le altre pagine usano --duration-ms (predefinito 8000). Le applicazioni e gli iframe usano fill; le versioni delle applicazioni sono fissate con avanzamento temporizzato e senza privilegi di controllo. Modificare il documento per l’avanzamento controllato dall’applicazione. Verificare la prontezza della versione e la reale riproduzione tramite il server e il lettore previsto. La pubblicazione può esaminare le intestazioni di risposta delle pagine iframe HTTPS pubbliche idonee. Una pagina il cui X-Frame-Options o frame-ancestors rifiuta l’inquadramento non può essere mostrata dal Player web né dai Player macOS, Samsung Tizen o BrightSign. Quando la pubblicazione rileva un rifiuto, la scrittura riesce comunque: screen publish e playlist create|update|patch stampano un avviso iframe_framing_refused che indica la pagina e la primitiva, e events list mostra un avviso playlist.iframe_framing_refused.

Fornisci --screen-id per leggere le dimensioni target e la revisione. Il risultato include data.screen_id, data.screen_revision e data.publish.argv. Passa questo array di argomenti al launcher screenrig incluso senza suddivisione shell: preserva percorsi, configurazione e origine API. Aggiungi esplicitamente --expect-rev per proteggere da modifiche successive allo schermo. I metadati target restano fuori dal documento creato.

Per sovrascrivere la tela, fornisci sia --target-width che --target-height. Questi funzionano anche senza uno schermo, nel qual caso non vengono restituiti argomenti di pubblicazione. Superfici sconosciute o multiple richiedono dimensioni esplicite. I file di output sono esclusivi per default; usa --overwrite per sostituire un file di authoring esistente in modo atomico. Le directory genitore vengono create automaticamente. URL e input release-ID con dimensioni esplicite funzionano senza accesso.

screen publish <screen-id> <file> crea una nuova playlist, la assegna con una facoltativa guardia di revisione schermo, e legge indietro l’assegnazione. Non aggiorna una playlist esistente per nome. I nomi visualizzati possono ripetersi; usa l’ID playlist per un playlist update esplicito. Il suo risultato JSON riporta playlist_id, playlist_revision, screen_id, screen_revision, assignment_verified e playback_verified. La verifica dell’assegnazione non prova la riproduzione; richiedi e ispeziona uno screenshot e prove di riproduzione rilevanti separatamente.

Quando il progetto richiede la revisione per le modifiche dell’agente, o la sessione ha accesso Proponi, screen publish si ferma una volta proposta la playlist o la sua assegnazione: stage è pending_review, il risultato nomina entrambe le revisioni e la busta resta ok: true. Nulla viene riprodotto finché una persona non approva. Aggiungi --note TEXT per indicare al revisore cosa è cambiato; vedi Revisioni.

La pubblicazione salva automaticamente un diario locale privato. Dopo un errore ambiguo, ripeti lo stesso comando e input con la stessa configurazione per riprendere. Se la creazione della playlist è riuscita prima che l'assegnazione fallisse, l'errore identifica la playlist creata. Non eliminarla né avviare un'altra creazione per recuperare. Un conflitto di revisione richiede di ispezionare lo schermo e riconciliare l'assegnazione prevista; una playlist già creata può essere assegnata esplicitamente con screen assign. La pubblicazione non aggiorna mai silenziosamente la revisione prevista. Il recupero non completato si interrompe dopo la finestra di idempotenza del server di 24 ore; ispeziona e riconcilia prima di effettuare altre scritture.

Per modificare una playlist esistente:

screenrig playlist show pl_EXISTING --output lobby.json
screenrig playlist update pl_EXISTING lobby.json

playlist show --output scrive il documento {name, pages} modificabile e restituisce il suo percorso, playlist_id, e la fonte revision su stdout. Passa opzionalmente quella revisione con --expect-rev per proteggere l’aggiornamento. Preserva selettori dinamici, programmazioni, movimento e release di app fissate, rimuovendo media e campi temporali derivati dal server. I commenti restano separati. Un playlist show semplice è una risposta di ispezione; --editable senza --output restituisce data.document, data.playlist_id e data.revision. L’aggiornamento di una playlist interessa ogni schermo assegnato. In revisione, playlist update propone il nuovo documento, e playlist show continua a restituire la versione live finché una persona non la approva.

Scritture K/V e commento accettano --file - per stdin. Usa playlist show ID --editable --human per il documento modificabile su stdout. I nomi visualizzati di app e playlist possono ripetersi; usa ID risorsa per aggiornamenti.

Sostituisci una release di app

Dopo un app update riuscito, prendi data.application.release_id e identifica la playlist, la pagina e il primitivo dell’applicazione esatti da modificare. Anteprima della sostituzione:

screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW

Questa è una revisione di impatto in sola lettura. Controlla data.previous_release_id, data.release_id e data.affected_screens, incluse le assegnazioni archiviate. Applica direttamente con --apply. Per aderire a questo controllo di impatto, fornisci anche --expect-impact con il data.impact dell’anteprima:

screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW --apply

Altri primitivi e impostazioni sono preservati. L’aggiornamento interessa ogni schermo assegnato a questa playlist condivisa; gli schermi archiviati mantengono il nuovo pin per usi successivi. Quando viene fornito --expect-impact, una sostituzione modificata, revisione o impatto osservato sullo schermo richiede una nuova anteprima. L’applicazione diretta salta il sondaggio dello schermo; affected_screens è omesso. Un rilascio già pinnato ha successo senza scrittura. Le assegnazioni possono cambiare dopo l’istantanea: il server verifica la revisione della playlist in modo atomico solo quando viene fornito --expect-rev. Il server convalida la disponibilità e la proprietà del rilascio all’applicazione. I pin esistenti restano invariati fino all’applicazione; successivamente, verificare le revisioni del manifesto e la riproduzione sugli schermi interessati. In revisione, --apply propone il nuovo pin; aggiungi --note TEXT per il revisore.

I comandi playlist validate, create, update e screen publish accettano - come file di input per leggere da stdin. Le buste JSON non vengono mai scritte nei file creati. --expect-rev protegge una revisione. Omettere il flag per scrivere la risorsa corrente senza precondizione di revisione. Una revisione obsoleta fornita restituisce ancora revision_conflict.

La generazione accetta --prompt TEXT o --prompt-file FILE, incluso --prompt-file - per stdin. Il file è il prompt completo, senza troncamenti; si applica il limite esistente di 4000 caratteri. I prompt sono esclusi dalla diagnostica.

Mantieni il percorso breve

Il CLI incluso usa api.screenrig.ai; i Player usano play.screenrig.ai; il dashboard è su screenrig.ai/dashboard; i rilascio usano origini isolate sotto apps.screenrig.ai. I pacchetti Player nativi restano privati e mediati dal server. Il riferimento trasporto interno resta disponibile per gli strumenti di trasporto.

Filtri tag e batch di riproduzione

I media possono avere fino a 32 tag unici, ciascuno da 1 a 32 lettere o cifre. Sostituisci l’intero set con screenrig media update med_ID --tags Summer,Drinks. --tag Summer lo sostituisce con un solo tag; --clear-tag cancella ogni tag. media list --tag Summer corrisponde all’appartenenza ovunque nel set. I tag sono case-sensitive e non sono mai autorizzazioni.

Un selettore dinamico può usare un tag o un oggetto filtro tags:

{
  "by": "tag",
  "tags": { "all": ["Summer", "Drinks"], "any": ["Lobby", "Patio"], "none": ["Expired"] },
  "order": "random",
  "one_at_a_time": false,
  "batch_size": 3
}

all richiede ogni tag elencato, any ne richiede almeno uno, e none esclude qualsiasi tag elencato. I gruppi presenti si combinano con AND; i gruppi omessi non impongono condizioni. Fornisci almeno un gruppo non vuoto. Ogni gruppo accetta fino a 32 tag unici. tag e tags sono mutuamente esclusivi. Un filtro solo none seleziona tutti i media pronti di quel primitivo eccetto i tag esclusi. I selettori immagine selezionano immagini e i selettori video selezionano video.

Il pool di candidati contiene fino a 1.024 contenuti multimediali pronti per selettore, con 1.024 riferimenti multimediali nell’intero snapshot del ciclo. Un match più grande restituisce un errore; restringere i filtri. batch_size è un limite separato di 1–1.024 elementi per visita pagina. Su una pagina media_end, one_at_a_time: false riproduce il lotto successivo in sequenza; omettere batch_size riproduce il pass rimanente. one_at_a_time: true riproduce un elemento per apparizione e consente solo una dimensione lotto omessa o batch_size: 1. Durata, applicazione e pagine audio_end richiedono one_at_a_time: true. Le immagini su media_end richiedono anche dwell_ms; i video non possono loopare su quella pagina.

Il lettore risolve ogni primitiva multimediale dinamica in una richiesta all’avvio della playlist e a ogni ciclo. L’appartenenza è congelata durante il ciclo. Caricamenti, rimozioni, modifiche di tag e limiti di disponibilità non rigenerano il manifesto. Al prossimo aggiornamento, elementi rimossi o esclusi lasciano la coda in sospeso; nuove corrispondenze si uniscono quando il passaggio corrente termina. Un lotto finale può contenere meno elementi di quelli richiesti; non si ricarica dal passaggio successivo. L’ordine dei nomi file ordina per nome file, poi ID media. L’ordine casuale mescola una volta per passaggio completo, preservando l’ordine rimanente tra aggiornamenti ciclo. L’ordine ponderato segue i suoi pesi, più sotto. Il cursore è locale a schermo, playlist, pagina e primitiva, persiste al riavvio e si resetta se cambiano filtro, ordine o politica batch. La riproduzione offline usa l’ultimo snapshot riuscito. Corrispondenze vuote saltano la primitiva e eventuali pagine vuote risultanti.

Salva l’oggetto selettore sopra come selector.json, quindi ispeziona il suo catalogo candidato corrente prima di pubblicare:

screenrig media selector-preview selector.json --primitive video

L’anteprima restituisce matched_count, ordinata per nome file candidates con ID media e tag, e la policy selector normalizzata. Con ordine casuale mostra il pool e la policy di shuffle; non sceglie lo shuffle del lettore, non avanza un cursore, non crea un permesso di riproduzione né modifica un manifest. Con ordine ponderato restituisce per ogni candidato weight e share_percent, oltre a cycle. --rect WxH (API rect: {width, height}) è la dimensione dello slot ed è obbligatorio con fit: "aspect"; le corrispondenze escluse sono elencate in excluded con il motivo aspect_mismatch. I selettori di immagini passano --primitive image. L’API è POST /api/selectors/preview con { "primitive": "video", "selector": ... }. Usa il progetto autenticato e le stesse regole di corrispondenza della riproduzione. Le modifiche al catalogo dopo l’anteprima si risolvono al prossimo ciclo di riproduzione.

L’esportazione statica del bundle congela le corrispondenze dinamiche come ID esatti. Mantiene la riproduzione uno alla volta o completa; una sequenza runtime limitata con batch_size e one_at_a_time: false richiede di rimuovere quel campo o scegliere ID espliciti prima dell’esportazione. Questo evita di perdere silenziosamente un cursore batch runtime in un bundle statico.

Rotazione ponderata e adattamento alle proporzioni

order: "weighted" ruota i contenuti di uno slot in base al peso, così ogni sponsor mantiene la sua quota di riproduzioni. weights associa un ID media (med_...) o tag:NAME a un intero da 1 a 1.000, con al massimo 64 chiavi. Funziona con by uguale a all, tag o folder:

{
  "by": "all",
  "order": "weighted",
  "one_at_a_time": true,
  "weights": { "tag:Acme": 50, "tag:Globex": 30, "tag:Initech": 20 },
  "fit": "aspect"
}

Pesi di 50, 30 e 20 assegnano esattamente 5, 3 e 2 riproduzioni ogni 10, a ogni ciclo, e un riavvio riprende a metà ciclo. Il peso di un elemento è la sua chiave ID media, se presente; altrimenti la prima chiave tag:NAME, in ordine alfabetico, tra i tag che porta, divisa in parti uguali tra gli elementi della selezione che la portano, così la quota di uno sponsor resta la stessa qualunque sia il numero dei suoi contenuti; altrimenti l’elemento conta come un gruppo a sé con peso 1. Un ciclo è al massimo di 4.096 riproduzioni; le quote vengono arrotondate a esso solo quando il rapporto esatto richiede un ciclo più lungo.

L’ordine ponderato riproduce un elemento per visita, quindi imposta one_at_a_time: true o batch_size: 1. weights è obbligatorio con l’ordine ponderato e consentito solo con esso; altrimenti la scrittura restituisce invalid_request. I lettori web, Android, Apple, Windows e Linux implementano l’ordine ponderato dalle versioni che dichiarano la capacità host selector.weighted. Un lettore più vecchio riproduce il selettore in ordine casuale e la diagnostica del manifest riporta selector_order_downgraded.

fit: "aspect" su un selettore dinamico mantiene solo i file il cui rapporto larghezza/altezza è entro il 5% di quello del rettangolo dello slot, video wall o cornice di display inclusi, letto quando il selettore viene risolto. Uno slot verticale non riproduce mai un file orizzontale. Non serve alcuna modifica al lettore.

screenrig media selector-preview stampa la quota attesa di ogni selettore ponderato o adattato per proporzioni, e l’editor di pagine della dashboard mostra la stessa tabella nell’inspector. L’esportazione statica del bundle congela un selettore ponderato come ID esatti in ordine di nome file; i pesi non vengono mantenuti.

Token dello schermo nei selettori di tag

Il tag di un selettore di tag, e ogni voce del suo filtro tags, può essere {screen.field.NAME} o {screen.id}, l’identificatore dello schermo senza il prefisso scr_, che è un tag. Il server compila il token per ogni schermo quando costruisce il manifest e lo snapshot dei selettori di quello schermo, così una sola playlist riproduce i media propri di ciascuno schermo. Assegna ai media il tag Lobby o Garage, imposta il campo di ogni schermo con screenrig screen update scr_ID --field zone=Lobby e assegna allo slot questo selettore:

{ "by": "tag", "tag": "{screen.field.zone}", "one_at_a_time": true }

Il valore compilato segue le regole dei tag: da 1 a 32 lettere o cifre. Uno schermo senza il campo, o il cui valore non è un tag, non seleziona nulla: non riproduce alcun file da quello slot e la diagnostica del manifest riporta screen_fact_missing o screen_fact_invalid. Modificare un campo rigenera il manifest di quello schermo. Un selettore con token non può essere visualizzato in anteprima (media selector-preview richiede un tag concreto) né congelato da playlist export.

Token dello schermo negli indirizzi iframe e nei parametri dell'applicazione

src e fallback_src di un iframe possono contenere token dello schermo nel percorso, nella query o nel frammento di un indirizzo http o https, e lo stesso vale per il params facoltativo di una primitiva application: fino a 16 nomi di 1-32 lettere minuscole, cifre o trattini bassi (ticket e policy sono riservati) con valori fino a 512 caratteri. Il server li compila per ogni schermo:

TokenValore
{screen.id}L'identificatore dello schermo senza il prefisso scr_.
{screen.name}Il nome dello schermo.
{screen.timezone}Il fuso IANA memorizzato dello schermo.
{screen.field.NAME}Il campo NAME dello schermo, da 1 a 32 lettere minuscole, cifre o trattini bassi.
{screen.location.lat}, {screen.location.lon}La sua posizione in gradi decimali.
{screen.location.name}, {screen.location.address}Il nome del luogo e l'indirizzo.
{
  "primitive": "iframe",
  "src": "https://maps.example.com/directory?kiosk={screen.field.kiosk_id}&level={screen.field.level}",
  "title": "Directory"
}

La scrittura memorizza il modello così come è scritto, parentesi graffe comprese. Il manifest di ogni schermo porta il proprio indirizzo, con ogni valore in percent-encoding per la sua posizione nell'URL: un kiosk_id di B 2&3 diventa B%202%263. Un token nello schema, nelle credenziali, nell'host o nella porta, o in un link YouTube, un link a documenti Google o Microsoft o un indirizzo di vista BI, è invalid_request a src (o fallback_src). La pubblicazione salta il controllo di framing per un src con modello, e le anteprime mostrano il modello così come è scritto.

Uno schermo che non ha un valore (un campo non impostato, nessuna posizione), o i cui valori compongono un indirizzo di oltre 2048 caratteri o con un segmento di percorso . o .., non riceve tale iframe o applicazione, e le diagnostiche del suo manifest riportano screen_fact_missing o screen_fact_invalid; una pagina rimasta vuota viene eliminata. Ogni scrittura che raggiunge un tale schermo (una scrittura di playlist, screen assign, screen update, un'assegnazione di flotta, una revisione approvata) risponde con un'avvertenza screen_fact_missing che indica i token, i primi 20 id di schermo e quanti sono. Modificare un campo o la posizione rigenera il manifest degli schermi interessati.

Per un'applicazione, ogni parametro compilato viene aggiunto all'indirizzo di avvio dopo ticket, in percent-encoding, per al massimo 4096 caratteri in totale, così l'applicazione lo legge da location.search (SDK). I parametri di avvio raggiungono l'app web Player e i Player che la eseguono (Samsung Tizen, BrightSign, LG webOS e Vega); i Player Qt, Android, Apple e Windows caricano l'applicazione dal pacchetto locale e non ne inviano. Il campo url di un modello può essere un intero src di iframe, e il suo valore può contenere a sua volta token dello schermo, compilati alla costruzione del manifest. Un selettore di tag usa {screen.id} e {screen.field.NAME} allo stesso modo (sopra). Le schede mantengono i propri token {screen.…}.

Disponibilità dei media

screenrig media availability med_ID --file rule.json imposta quando i selettori dinamici (all, tag e folder) possono scegliere un file. --clear rimuove la regola e --expect-rev N protegge la revisione del media. L’API è PATCH /api/media/{id}/availability con If-Match e { "availability": {...} | null }. Impostare una regola richiede l’accesso Manage; una credenziale Propose riceve insufficient_access.

La regola usa la grammatica oraria della programmazione, letta nel fuso orario di ogni schermo, e contiene almeno un membro: from e until (civile YYYY-MM-DDTHH:MM, until esclusivo), windows (settimanale {days, start, end}), monthly ({day} o {nth, weekday}, ciascuno con start e end facoltativi), dates ({date, start, end}) e except (date che rimuovono un’occorrenza, comprese le code oltre la mezzanotte). Non ha né data né interaction. Il contenuto di uno sponsor per il lungo weekend, disponibile solo nelle sere dei giorni feriali all’interno dell’intervallo:

{
  "from": "2026-11-27T00:00",
  "until": "2026-11-30T23:59",
  "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "17:00", "end": "22:00" }]
}

Solo i selettori leggono la regola: un selettore esplicito con id o ids la ignora, così come i riferimenti media delle card, l’audio della colonna sonora e i contenuti pubblicitari. Un file esce dalla selezione e vi rientra al successivo ciclo della playlist di ogni schermo, entro circa un minuto dal limite. Nessuna revisione di playlist o manifest cambia e un lettore offline mantiene l’ultima selezione fino alla riconnessione. screenrig media selector-preview --timezone ZONE (UTC per impostazione predefinita) elenca in excluded i file fuori dalla loro regola in quel momento, con il motivo outside_window.