Documentation

Référence des commandes CLI

Le CLI screenRIG publie médias, listes de lecture et applications sur des téléviseurs et des kiosques depuis un terminal ou un agent. Trouvez les commandes, paramètres, sortie JSON et règles de révision pour publier du contenu et exploiter les écrans.

Chaque commande s’exécute de la même façon

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

Drapeaux globaux

SignalerTypePar défautNotes
--jsonbooleanJSON pour les opérationsSortie JSON explicite, conservée pour compatibilité. Sélectionne aussi l’aide structurée. Ne peut pas être combiné avec --human.
--humanbooleandésactivéSélectionnez une sortie opérationnelle lisible par l’humain. Ne peut pas être combiné avec --json.
--project-id IDstringdernier projet utiliséCorriger cette invocation vers un projet mis en cache sans changer la sélection. Chaque commande conserve sa cible et son état de récupération pendant toute son exécution.
--api-url URLstringhttps://api.screenrig.aiOrigine du plan de contrôle. SCREENRIG_API_URL définit la même chose.
--config PATHcheminle fichier de configuration utilisateurUtilisez un fichier de configuration spécifique. SCREENRIG_CONFIG fait la même chose.
--request-id IDstringgénéré par exécutionVotre propre identifiant de demande, renvoyé comme request_id. Gardez-le dans les rapports.
--idempotency-key KEYstringdérivé par écritureRéutiliser la même clé pour réessayer une écriture ambiguë. Le serveur retourne le résultat original pendant vingt-quatre heures ; un corps différent sous la même clé est idempotency_mismatch.
--timeout MSinteger30 000 par requêteLimite chaque requête HTTP. Sur une commande qui attend une opération, c’est la date limite d’attente à la place, et la valeur par défaut est 120000.
--beta-key KEYstringnon définiEnvoyé uniquement lorsque le plan de contrôle en demande un. SCREENRIG_BETA_KEY définit la même chose.
--help, -hbooleandésactivéImprime l’aide ciblée pour la commande ou le groupe et quitte. Ajoutez --json pour une aide structurée.
--version, -VbooleandésactivéImprime la version CLI intégrée et quitte. Identique à la commande version.

Environnement

VariableEffet
SCREENRIG_API_URLOrigine du plan de contrôle, remplaçant la configuration stockée.
SCREENRIG_CONFIGChemin vers le fichier de configuration.
XDG_CONFIG_HOMEBase du répertoire de configuration. Sinon %APPDATA%\screenrig sous Windows, ou ~/.config/screenrig.
SCREENRIG_BETA_KEYClé bêta, lorsque le plan de contrôle en demande une.
SCREENRIG_FFMPEGChemin absolu vers ffmpeg, lorsque media upload ne doit pas le prendre depuis PATH.
SCREENRIG_FFPROBEChemin absolu vers ffprobe.
SCREENRIG_CWEBPChemin absolu vers cwebp, l’encodeur de secours.
SCREENRIG_CLIENT_IDExécutez en tant que client de service (scl_…), avec exactement l’un des deux suivants.
SCREENRIG_CLIENT_KEY_FILELe fichier de clé privée du client de service, un JWK ou PEM, signé dans une assertion private_key_jwt.
SCREENRIG_CLIENT_SECRETLe secret du client de service, envoyé avec HTTP Basic.

Il n’y a pas de drapeau de jeton ni de variable d’environnement de jeton. Le CLI lit la session que le plugin a stockée pour cette installation, dans un fichier privé utilisateur qui survit à une mise à jour du plugin, et la renouvelle de lui-même. Avec SCREENRIG_CLIENT_ID défini, il se connecte comme ce client de service à la place, garde le jeton en mémoire, et ne lit ni n’écrit jamais la configuration stockée.

Sortie

Les commandes opérationnelles écrivent du JSON sur stdout par défaut, y compris les erreurs. Un seul résultat porte une enveloppe : ok, puis data, request_id, operation_id et warnings[] en cas de succès, ou error en cas d’échec. La progression, les URL sécurisées et les notes humaines vont sur stderr. events follow émet du NDJSON : une enveloppe JSON par événement, sur sa propre ligne. La redirection de stdout ne change pas le format.

Utilisez --human pour une inspection manuelle. Les commandes d’événement impriment alors une ligne logfmt par événement. L’aide et les groupes de commandes nus restent du texte lisible par défaut ; utilisez screenrig --json playlist --help pour une découverte structurée. --json et --human ne peuvent pas être combinés.

Les anciens bundles de plugins peuvent nécessiter explicitement --json pour les résultats opérationnels. Vérifiez l’aide du CLI installé lors de l’utilisation d’un ancien bundle. Les fichiers de création de listes de lecture restent des documents JSON ; une enveloppe de résultat de commande n’est pas un document de liste de lecture modifiable.

Une enveloppe d’erreur porte error.status, un error.code stable, et souvent error.next.command nommant exactement quoi exécuter ensuite. Branchez-vous sur ceux-ci plutôt que sur le texte.

Un changement qui attend la révision d’une personne est un succès, pas une erreur : ok: true, sortie 0, data.status: pending_review avec le review, un avertissement pending_review nommant l’URL de révision, et data.next pointant vers reviews show ID. Un retag de médias approuvés sous révision est ok, sortie 0, avec l’avertissement media_review_pending à la place : sa révision apparaît dans reviews list en quelques secondes. Voir Révisions.

Codes de sortie

CodeSens
0Succès.
1Échec inattendu.
2Erreur d’utilisation. Rien n’a été envoyé.
3Problème de justificatif. Cette installation ne peut pas s’authentifier.
4Non trouvé.
5Conflit.
6Précondition échouée, incluant revision_conflict : la révision --expect-rev était périmée.
7Limite de débit. Respectez Retry-After, affiché comme retry_after_seconds.
8Autre rejet côté client.
9Erreur serveur.
10Échec réseau.
11Délai d’attente dépassé.
12Erreur de configuration.
13L’opération elle-même a échoué.

Codes de problème courants dans l’enveloppe :

CodeSensÉtape suivante
not_enrolledCette installation ne détient pas encore d’identité de projet.Créer un projet avec screenrig agent enroll --email ADDRESS --organization NAME, ou connecter cette installation à un projet auquel vous appartenez avec screenrig login.
session_endedLa connexion a été révoquée, expirée ou terminée.screenrig login, approuvé par une personne dans le tableau de bord.
insufficient_accessLe niveau d’accès de la session ne peut pas faire cela : Lecture seule ne change rien, et Proposer ne peut pas supprimer, contrôler les écrans ou dépenser.screenrig agent status affiche effective_access. Lorsque access_limited_by nomme project ou person, le propriétaire du projet modifie le paramètre de revue ; sinon screenrig login --access manage, approuvé par une personne.
approver_requiredSeul le propriétaire du projet ou un membre pouvant approuver peut faire cela, comme donner à un agent l’accès Gérer.Demander au propriétaire du projet d’activer Peut approuver, ou de choisir Lecture seule ou Proposer.
playlist_not_approvedLa liste de lecture n’a pas encore de version approuvée, donc aucun écran ne peut l’afficher.Attendre son examen (screenrig reviews show ID), ou choisir une liste de lecture approuvée.
review_not_pendingL’examen a déjà été décidé, retiré ou remplacé.screenrig reviews show ID pour son état.
login_denied, login_expiredLa personne a refusé la connexion, ou son code de 24 heures a expiré.Exécutez screenrig login à nouveau.
client_auth_failedLa clé, le secret ou l’identifiant d’un client de service a été refusé.Comparez le fichier de clé ou de secret avec lequel la configuration se connecte (login --client-id ID --client-key-file FILE ou --client-secret-file FILE) à screenrig service-client show ID.
capability_requiredLe projet n’a pas la capacité nécessaire pour cette commande, comme screens ou advertiser.screenrig project capabilities, puis choisissez le --intent correspondant pour un nouveau projet ou changer l’objectif du projet.
rate_limitedTrop de requêtes dans la fenêtre actuelle.Attendre retry_after_seconds, puis réessayer.
free_organization_limitLa personne détient déjà son organisation Standard gratuite, donc project create ne peut pas en démarrer une autre.Ajoutez le projet à l’organisation indiquée dans les détails : screenrig project create NAME --organization-id ID. Une autre organisation nécessite Plus, Premium ou Enterprise, via le formulaire de contact à https://screenrig.ai/contact#message.
organization_plan_requiredL’organisation n’admet aucun nouvel écran tant qu’un forfait ne le paie pas.Le propriétaire déplace le projet avec screenrig project moves et screenrig project move --organization-id ID, ou l’organisation souscrit Plus, Premium ou Enterprise via le formulaire de contact à https://screenrig.ai/contact#message.

Révisions et réessais

Les gardes de révision sont optionnels. Omettez --expect-rev pour écrire la ressource actuelle sans lecture de révision préalable. Fournissez-la avec un revision connu pour rejeter les écritures périmées. Sur revision_conflict, refaites la requête, réappliquez la modification et réessayez avec la révision retournée. En cas d’échec de transport ambigu, réessayez avec le même --idempotency-key ; le plan de contrôle retourne le résultat original au lieu d’écrire deux fois.

Crédits

Le plan de contrôle décompte un crédit par commande authentifiée facturée et un par événement de flux de projet facturé. Ces commandes du plan de contrôle ne le débitent pas et continuent de fonctionner à zéro : project show, agent status, notes list, notes show, screen reload, screen toast et screen screenshot. L’ouverture de events follow coûte un crédit comme l’abonnement, et la relecture après reconnexion est gratuite. Une commande de flotte, screen assign, screen reload, screen toast ou screen tag avec plusieurs identifiants d’écran ou --tag, est une action facturée sans plafond de nombre d’écrans, incluant toutes les suites, donc un rechargement ou un toast de flotte est facturé même si un seul est gratuit. screen screenshot --tag suit toutes les pages de liste, chacune facturée, pour résoudre les écrans étiquetés ; les captures elles-mêmes sont gratuites. Les courriels de notification et les avis d’écran sont gratuits. Chaque tentative de livraison de webhook d’un événement de projet est mesurée comme un événement de flux d’écoute facturé. Chaque page JSON de playback plays ou playback list est une requête facturée, et une exportation CSV de lecture est une requête facturée pour toute sa plage.

Surface CLI intégrée

Les commandes sont regroupées comme dans le CLI. L’installation et le premier usage sont couverts dans Démarrer ; le choix entre téléversement, génération, cartes et sélecteurs est couvert dans Composer.

Noms de commandes et découverte

Utilisez show pour inspecter une ressource, list pour les collections, et kv get / kv set pour les valeurs. Utilisez --name pour les noms d’affichage, --screen-id, --app-id, --playlist-id et --release-id pour les sélecteurs de ressources, --expect-rev pour les gardes de révision, et --after pour les curseurs d’événements. Le groupe est app ; « application » est le nom de la ressource. Les commentaires conservent comment ACTION screen|playlist ID.

Utilisez screenrig help --all pour l’inventaire complet ou screenrig playlist init --help pour une aide ciblée. Ajoutez --json pour les métadonnées d’arguments, choix, valeurs par défaut, exemples, alias et relations d’options. Les groupes exactlyOne, atLeastOne et together sont vérifiés avant la configuration ou l’accès réseau ; requires signifie que la première option requiert toutes les options restantes. Lisez stdin uniquement lorsque l’aide de commande supporte explicitement -.

Créer un nouveau projet

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

agent enroll crée une identité, une organisation, un projet Screens et une adhésion, et stocke les identifiants d’identité et de projet en privé. Réutilisez le nom d’organisation déjà fourni, ou utilisez Screens sans invite de choix. --organization est requis ; --name nomme séparément l’agent. Utilisez le courriel de contact réel de la personne. L’inscription envoie un courriel d’invitation au membre du projet ; elle ne divulgue pas si cette adresse a déjà une connexion. La personne ouvre l’invitation et crée une connexion avec une clé d’accès, ou se connecte pour ajouter le projet à sa connexion existante. L’acceptation déplace le projet dans l’organisation détenant le domaine de courriel vérifié de la personne, sinon dans l’organisation Standard gratuite qu’elle détient déjà, renommée en cas de conflit de nom.

Ajouter --intent advertising pour un projet qui achète des annonces plutôt que de jumeler des écrans. --force remplace l’état d’inscription ou de connexion en attente de cette installation lors de la création intentionnelle d’un autre projet.

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

Se connecter avec AgentID

Un agent avec un AgentID se connecte à https://api.screenrig.ai/agentid/start, reçoit un code de réclamation, installe le plugin officiel, et exécute screenrig agent enroll --agentid-claim CODE --organization NAME. Le courriel vérifié du propriétaire reçoit l’invitation au tableau de bord.

Se connecter à un compte existant

screenrig login

login connecte cette installation à un compte existant. Il affiche une adresse de tableau de bord et un code, puis attend jusqu’à 24 heures. Une personne ouvre l’adresse, qui porte le code, vérifie qu’il correspond, ajuste le projet, Lecture seule, Proposer ou Gérer, ou les zones de capacité si elle le souhaite, puis appuie sur Connecter une fois ; une connexion au tableau de bord datant de la dernière heure fait office de preuve, donc il n’y a pas de deuxième invite de passkey. Le CLI stocke la session, sélectionne le projet approuvé et retourne status: signed_in avec le projet, l’organisation et access.

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

--access demande un niveau ; la valeur par défaut est manage, et la personne décide. --project suggère le projet. --no-wait renvoie status: pending avec le verification_uri_complete, le user_code et une poignée login_ qui ne contient aucun secret ; login --resume ID attend l’approbation ultérieure. Exécutez login à nouveau sur une installation connectée pour ajouter un autre projet ou pour élever un projet en lecture seule ou proposition à gérer.

Chaque session comporte des domaines de capacité : screens, content, playlists, advertising, reports et project. Une session n’appelle que les commandes de ses domaines ; reports lit aussi tous les domaines. Une commande hors de ces domaines retourne 403 forbidden avec le détail This agent credential lacks the <name> capability.. Les sessions en lecture seule listent et lisent seulement. Les sessions de proposition peuvent aussi téléverser des médias, écrire des notes et proposer des modifications de médias, de listes de lecture et d’écrans, qui attendent la révision d’une personne. Une modification dépassant le niveau de la session retourne 403 insufficient_access.

logout révoque la connexion sur le serveur et supprime les jetons stockés. Un échec qui pourrait ne pas avoir atteint le serveur les conserve, donc relancer logout est sans risque. doctor indique quand la session se termine : 90 jours après sa dernière utilisation, et au plus un an après la connexion. Voir Authentification.

Cycle de vie du projet et de l’organisation

Le projet actuel est le dernier utilisé. Chaque enveloppe JSON inclut le contexte d’organisation et de projet ; la sortie humaine nomme les deux. Les identifiants d’identité sont limités par l’adhésion au projet sélectionné. L’état de réessai reste séparé par projet.

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 vérifie les adhésions accessibles. project use en sélectionne une. La création exige un nom unique dans son organisation et par défaut l’organisation du projet actuel, puis celle que vous administrez ; lorsqu’aucune n’est nommée, l’organisation détenant le domaine de courriel vérifié du propriétaire est prioritaire. La personne responsable devient propriétaire. Chaque forfait limite le nombre de projets d'une organisation ; chaque personne a une organisation Standard gratuite, et une deuxième nécessite Plus, Premium ou Enterprise. Sans projet actuel ni organisation nommée, le serveur place le projet de la même manière. --organization NAME démarre une nouvelle organisation uniquement pour une personne qui n’en possède aucune gratuite ; sinon la création est refusée avec free_organization_limit, dont le détail nomme l’organisation à utiliser. L’inscription est régie par des limites de débit.

Le propriétaire peut déplacer vers une destination retournée par project moves, ou transférer la propriété à un membre vérifié existant. Un déplacement transporte les écrans, et une organisation de destination qui détient déjà autant de projets que son forfait le permet le refuse avec project_limit_reached. La suppression utilise le nom actuel exact et la révision positive de son aperçu. Elle exige zéro écran non archivé, aucun forfait propre, aucune obligation de portefeuille et aucune publicité active. Elle envoie un courriel aux membres et conserve une pierre tombale.

Les noms d’organisation peuvent se répéter ; utilisez des ID explicites lors du renommage d’une organisation que vous administrez. Une organisation a des administrateurs désignés et des membres dont elle est l’organisation d’appartenance ; les administrateurs invitent d’autres administrateurs et des membres par courriel depuis le tableau de bord. organization list marque les organisations free et plan_required et rapporte new_organization_allowed. Sa liste de projets ne donne pas accès au contenu des projets. L’organisation paie : son argent et ses allocations sont partagés par ses projets ; l’utilisation reste attribuée aux projets et les charges historiques conservent leur payeur d’origine.

login --project ID demande ce projet avec la même identité. Seule l’approbation explicite de cette demande accorde une adhésion. agent disconnect --yes révoque une adhésion ; agent revoke-identity --yes révoque séparément l’identité et toutes les adhésions. Une réponse ambiguë conserve les identifiants locaux et l’état de nouvelle tentative pour la réconciliation.

Les rapports publicitaires conservent les faits de règlement au-delà de la rétention des événements. Consultez leurs métadonnées de couverture : les lectures historiques manquantes ou la durée approuvée inconnue sont inconnues, jamais zéro. Un rapport peut avoir des totaux financiers complets et un historique des résultats incomplet.

Projets, invitations et diagnostics

Les commandes de projet listent les adhésions, sélectionnent un projet, créent des projets et gèrent leurs noms, propriétaires, déplacements et suppressions. Les invitations font entrer des personnes dans des projets ou des réseaux publicitaires.

project show#

Lire l’enregistrement du projet et son crédit restant.

project show

Aucun paramètre.

screenrig project show

data.credit_remaining est un nombre entier de crédits. En dessous de 1000, l’enveloppe peut porter un avertissement credits_low. Jusqu’au 1er janvier 2027, l’utilisation est gratuite dans une certaine mesure, donc le crédit restant est un compteur entier qu’un agent peut lire, pas une instruction d’arrêt.

project rename#

Définir le nom que les gens voient dans le sélecteur de projet du tableau de bord.

project rename NAME

project capabilities#

Lire le forfait du projet, les indicateurs de fonctionnalités indépendants screens et advertiser et l’ensemble des capacités effectives. Un refus de route l’emporte sur une lecture périmée des capacités.

project capabilities

project uptime#

Lire la disponibilité quotidienne des écrans du projet sur des jours UTC.

project uptime [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
ParamètreTypeRequisPar défautNotes
--day-from YYYY-MM-DDstringnon29 jours avant --day-toPremier jour UTC, inclus.
--day-to YYYY-MM-DDstringnonaujourd’huiDernier jour UTC, inclusivement. Au maximum 366 jours après --day-from.
screenrig project uptime
screenrig project uptime --day-from 2026-09-01 --day-to 2026-09-30

La plage et les valeurs par défaut sont celles de screen uptime. data.items liste une ligne par jour UTC, du plus ancien au plus récent : online_s et offline_s cumulés sur les écrans avec un état enregistré ce jour-là, availability, coverage (la part de la journée de ces écrans avec un état enregistré), et screens (combien avaient un état enregistré). La ligne d’aujourd’hui couvre les intervalles terminés jusqu’à présent ; screen list montre qui est en ligne maintenant.

project health-trend#

Lire la santé de la flotte par heure UTC : écrans rapportant, chauds, afficheur déconnecté, plantage.

project health-trend [--from TIME] [--to TIME]
ParamètreTypeRequisPar défautNotes
--from TIMEstringnon24 heures avant --toDébut inclusif de l’heure : un instant RFC 3339 avec secondes et décalage (normalisé en UTC), now, ou un âge tel que 7d, 12h ou 30m.
--to TIMEstringnonmaintenantFin exclusive, dans les mêmes formes. Au maximum 93 jours après --from.
screenrig project health-trend
screenrig project health-trend --from 7d

data.items liste la santé de la flotte par heure UTC : hour, screens_reporting, hot (température maximale à 80 °C ou plus), display_disconnected, et crashing (3 crashs ou plus en 24 heures). Le CLI suit next_cursor jusqu’à la fin et répond chaque heure avec next_cursor null. Les heures suivent les rapports avec un délai d’environ 5 minutes.

invitations#

Créer, lister ou révoquer des invitations de membres de projet et d’acheteurs de publicité.

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 utilise member par défaut. La livraison par courriel est la valeur par défaut et expire après sept jours. --email accepte des destinataires séparés par des virgules, jusqu’à cinquante par demande. --link est réservé aux membres, nécessite exactement un destinataire prévu, et renvoie une URL d’invitation de vingt-quatre heures une fois pour un transfert direct. Ne mettez jamais cette URL dans des journaux, notes ou une transcription partagée. Les listes ne la renvoient jamais.

Les acheteurs d’annonces utilisent uniquement le courriel et ont besoin d’un écran ou d’un périmètre de créneau possédé (ou les deux). --screen-id et --slot-id acceptent des ID séparés par des virgules ; --policy sélectionne trusted ou review_required. Les filtres de statut sont queued, sent, issued, accepted, revoked, expired et 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

Les agents n’acceptent pas les invitations. La personne invitée ouvre le courriel, se connecte ou crée une clé d’accès, et accepte dans le tableau de bord. L’inscription par lien vérifie d’abord leur courriel. Révoquer une invitation acceptée ne supprime pas une adhésion; utilisez les contrôles d’adhésion acheteur pour révoquer l’accès publicitaire.

agent status#

Signaler si cette installation détient une crédentiale utilisable.

agent status

Aucun paramètre.

screenrig agent status

Lecture seule. Ne modifie jamais l’état local ou serveur, et ne coûte rien. Le résultat porte le access de session, son effective_access et, quand le paramètre de revue du projet ou un membre sans droit d’approbation le maintient plus bas, access_limited_by (project ou person).

login#

Connectez cette installation à un compte existant, avec l’approbation d’une personne dans le tableau de bord.

login [--project ID] [--access read|propose|manage] [--name NAME] [--no-wait] [--resume ID]
ParamètreTypeRequisPar défautNotes
--project IDstringnonaucunSuggérer le projet que la personne approuve.
--access LEVELstringnongérerread, propose ou manage. La personne fait le choix final.
--name NAMEstringnonaucunNommez cette installation, au maximum 80 caractères.
--no-waitbooleannondésactivéRetourner status: pending avec l’adresse, le code et une poignée login_.
--resume IDstringnonaucunAttendre la connexion en attente que --no-wait a lancée.
screenrig login --access read

Imprime l’adresse du tableau de bord et un code de huit lettres sur stderr, puis attend jusqu’à 24 heures. La personne vérifie que le code correspond et appuie une fois sur Connecter, sans deuxième invite de clé d’accès après une connexion au tableau de bord dans l’heure précédente. L’enveloppe rapporte status: signed_in, le projet, l’organisation et access. L’exécuter à nouveau sur une installation connectée ajoute un projet ou élève un projet en lecture seule ou à proposer en gestion. Le refus est login_denied et l’expiration est login_expired.

logout#

Terminer la connexion de cette installation et supprimer ses jetons.

logout

Aucun paramètre.

screenrig logout

Révoque la connexion sur le serveur, puis supprime les jetons stockés et rapporte status: signed_out. Un échec qui n’a peut-être pas atteint le serveur les conserve, donc relancer est sans risque. Exécutez screenrig login pour vous reconnecter.

dashboard#

Ouvrez l’URL ordinaire du tableau de bord. Cette commande ne crée pas de lien de connexion, ne crée pas de session et ne nécessite pas d’identifiant d’agent.

dashboard [open]
screenrig dashboard

Le tableau de bord affiche les projets de la personne après connexion. La sélection de projet dans le navigateur ne change pas le projet lié à un agent.

dashboard reset-sign-in#

Demander un courriel de réinitialisation de connexion sans justificatif d’agent.

dashboard reset-sign-in --email ADDRESS

L’accusé de réception ne révèle pas si le courriel a une connexion. Le réinitialisation envoyée par courriel expire après une heure ; la personne crée une nouvelle clé d’accès. La complétion remplace ses identifiants de connexion et révoque les autres sessions.

doctor#

Vérifiez cette installation et signalez chaque vérification par nom.

doctor [--repair-config]
Paramètre Type Requis Par défaut Notes
--repair-config boolean non désactivé Restreindre les permissions d’un fichier de configuration existant lisible par le groupe ou les autres.
screenrig doctor

data.checks nomme chaque vérification et son statut : le runtime Node, le chemin de configuration résolu et ses permissions, l’origine du plan de contrôle et ses routes de service, la capacité feedback annoncée, et la chaîne d’outils multimédias optionnelle (ffmpeg, ffprobe, encoder_libx264, encoder_libx265, encoder_libwebp, cwebp, filter_hdr_tonemap).

Toute vérification échouée fait sortir doctor avec un code non nul, donc lisez les noms individuels avant de déclarer l’installation non saine. Une chaîne d’outils média manquante affecte seulement media upload.

version#

Imprime la version CLI intégrée et son adaptateur de protocole.

version

Aucun paramètre.

screenrig version

Exécutez ceci en premier dans une session. Une enveloppe réussie prouve que le lanceur a résolu le CLI intégré. --version et -V font la même chose depuis n’importe où dans la ligne de commande.

Clients de service

Un client de service est un serveur, un script ou une tâche CI appartenant au projet, qui se connecte avec sa propre clé ou son propre secret plutôt qu’avec l’approbation d’une personne. Pour créer ou modifier un client, l’agent a besoin de l’accès Gestion pour son identité avec la portée identity, de sa propre autorisation Gestion avec la capacité project sur le projet ciblé, et d’une personne responsable vérifiée qui administre l’organisation de ce projet. Un client de service ne gère jamais d’autres clients. Pour exécuter des commandes en tant que client, définissez SCREENRIG_CLIENT_ID avec SCREENRIG_CLIENT_KEY_FILE ou SCREENRIG_CLIENT_SECRET. Voir Clients de service.

service-client list#

Lister les clients de service de ce projet, actifs et révoqués, avec leurs clés, identifiants secrets et usages.

service-client list

Aucun paramètre.

screenrig service-client list

Ne jamais renvoyer un secret.

service-client show#

Afficher un client du service.

service-client show ID
ParamètreTypeRequisPar défautNotes
IDstringouiaucunL’identifiant client, scl_….
screenrig service-client show scl_ID

Liste l’kid de chaque clé et l’css_ de chaque secret pour la rotation.

service-client create#

Créer un client de service appartenant à ce projet.

service-client create --name NAME [--capability NAME]... [--access read|propose|manage] [--key-file PATH] [--secret-file PATH]
ParamètreTypeRequisPar défautNotes
--name NAMEstringouiaucunAu maximum 80 caractères.
--capability NAMEstringnontous les sixRépétable : screens, content, playlists, advertising, reports, project, chacun dans le vôtre.
--access LEVELstringnonlireread, propose ou manage. propose envoie les changements de liste de lecture et d’écran à la revue d’une personne.
--key-file PATHcheminl’un de ceux-ciaucunUne JWK ou PEM : Ed25519, EC P-256 ou RSA d’au moins 2048 bits. Seule la moitié publique est envoyée.
--secret-file PATHcheminl’un de ceux-ciaucunGénérer un secret et l’écrire dans ce nouveau fichier 0600. Il est affiché une seule fois.
screenrig service-client create --name "Nightly report" --access read --capability reports --key-file screenrig-client.pem

Nécessite les autorisations d’identité, de projet et d’administration de l’organisation décrites ci-dessus. Au maximum 50 clients actifs par organisation, tous projets confondus. Une clé sans son propre kid est identifiée par son empreinte RFC 7638.

service-client add-key#

Enregistrer une seconde clé publique pour une rotation sans interruption.

service-client add-key ID --key-file PATH
ParamètreTypeRequisPar défautNotes
IDstringouiaucunL’identifiant client.
--key-file PATHcheminouiaucunLa nouvelle clé publique, un JWK ou PEM.
screenrig service-client add-key scl_ID --key-file new.pem

Un client détient au maximum deux clés.

service-client add-secret#

Générer un second secret pour une rotation sans interruption.

service-client add-secret ID --secret-file PATH
ParamètreTypeRequisPar défautNotes
IDstringouiaucunL’identifiant client.
--secret-file PATHcheminouiaucunUn nouveau fichier 0600 qui reçoit le secret.
screenrig service-client add-secret scl_ID --secret-file new-secret

Un client détient au maximum deux secrets. Le secret actuel continue de fonctionner jusqu’à ce que vous le supprimiez.

service-client remove-key#

Supprimer une clé ; les jetons émis avec celle-ci cessent de fonctionner en quelques secondes.

service-client remove-key ID --kid KID
ParamètreTypeRequisPar défautNotes
IDstringouiaucunL’identifiant client.
--kid KIDstringouiaucunL’identifiant de la clé depuis service-client show.
screenrig service-client remove-key scl_ID --kid KID

Un client conserve au moins une clé ou un secret.

service-client remove-secret#

Supprimer un secret ; les jetons émis avec celui-ci cessent de fonctionner en quelques secondes.

service-client remove-secret ID --secret-id css_ID
ParamètreTypeRequisPar défautNotes
IDstringouiaucunL’identifiant client.
--secret-id IDstringouiaucunL’identifiant secret css_ de service-client show.
screenrig service-client remove-secret scl_ID --secret-id css_ID

service-client revoke#

Révoquer un client de service de façon permanente.

service-client revoke ID --yes
ParamètreTypeRequisPar défautNotes
IDstringouiaucunL’identifiant client.
--yesbooleanouidésactivéConfirmer la révocation permanente.
screenrig service-client revoke scl_ID --yes

Supprime ses clés et secrets ; ses jetons cessent de fonctionner en quelques secondes. L’enregistrement reste pour audit.

Médias

Un objet média est une image fixe, un clip ou une piste audio MP3, stocké comme une seule version exacte. Il n’y a pas de repli par appareil, donc ce que media upload ou media generate stocke est ce que chaque écran doit décoder.

Les dossiers médias organisent la bibliothèque. Un ID de dossier commence par mfd_ et un ID de fichier par med_. Un téléversement arrive à la racine de la bibliothèque sauf si --folder nomme un dossier, media move et media folder update réarrangent l’arborescence, et un sélecteur de playlist by:folder joue les fichiers directement dans un dossier, pas ceux de ses sous-dossiers. Une organisation contient au maximum 1000 dossiers, tous projets confondus, imbriqués jusqu’à 10 niveaux, avec des noms de 1 à 100 caractères.

Un média garde son id quand son fichier change : media replace remplace le fichier sur place, si bien que chaque playlist et chaque programmation qui l’utilise lit le nouveau, et media versions liste tous les fichiers qu’a eus l’élément.

media generate#

Générer une image fixe pleine page présentable dans la boutique de médias du projet.

media generate --prompt TEXT [--aspect-ratio RATIO] [--quality low|medium|high] [--tag TAG]
               [--no-progress]
ParamètreTypeRequisPar défautNotes
--prompt TEXTstringouiaucun1 à 4000 caractères. Inclure tous les faits et tout le texte dans l’invite pour que le modèle d’image le compose.
--aspect-ratio RATIOstringnon16:91:1, 16:9, 9:16, 4:3, 3:4, 3:2 ou 2:3.
--qualitystringnonmediumlow, medium, ou high. Change le niveau de détail de l’image fixe.
--tag TAGstringnonaucunMême étiquette de 1 à 32 lettres ou chiffres que pour le téléversement.
--no-progressbooleannondésactivéSupprimer la ligne de démarrage 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

La commande stocke un WebP avec perte dans le magasin de médias du projet et renvoie data.media_id (med_…). Ne téléversez pas à nouveau les octets. N’imprimez jamais les pixels ni l’invite. L’arbre d’auteur et le contrat d’invite vivent sur Compose.

media upload#

Convertir un fichier local en octets de livraison, le téléverser et attendre que l’objet soit prêt.

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]
ParamètreTypeRequisPar défautNotes
<file>cheminouiaucunL’image fixe source, clip ou piste audio. Le nom de fichier devient le nom humain dans les listes, listes de lecture et rapports de lecture, alors nommez-le selon ce qu’il montre.
--content-type TYPEstringnondétecté à partir des octets téléversésDéclarez vous-même le type de média au lieu de laisser le CLI le détecter.
--tag TAGstringnonaucunDe un à 32 lettres ou chiffres, correspondant à ^[A-Za-z0-9]{1,32}$. Les traits d’union sont refusés. Une balise est ce qui rend media list --tag TAG une correspondance fiable nom de fichier-vers-id.
--folder IDstringnonracine de la bibliothèqueUn dossier de médias mfd_ existant, vérifié avant le début de tout travail. Le téléversement prêt y est déplacé et data.folder_id le signale. Refusé avec --no-wait (usage_error, sortie 2), car l’ID média n’existe pas encore : exécutez media move une fois l’objet prêt.
--no-waitbooleannondésactivéRetourner dès que la validation est acceptée. L’objet n’est pas encore prêt ; terminez avec operations wait.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
--timeout MSintegernon120000Date limite d’attente. Elle limite aussi chaque requête sous-jacente.
--no-transcodebooleannondésactivéTéléversez les octets source sans modification. ffmpeg, ffprobe et cwebp ne sont pas exécutés. Le WebP sans perte est toujours rejeté.
--codecstringnonh264h264 ou hevc ; avc et h265 sont acceptés comme alias. Utilisez hevc seulement quand chaque écran qui jouera le clip est un Player natif.
--max-fps Nnumbernon30Fréquence d’images de sortie constante. Chaque vidéo est encodée exactement à ce taux quelle que soit sa fréquence source, donc les clips consécutifs ne changent jamais de fréquence. Supérieure à 0 et au maximum 240.
--max-edge PIXELSintegernon3840Limite appliquée à chaque bord, de 16 à 3840. Le rapport d’aspect est conservé et une source plus petite n’est jamais agrandie.
--webp-qualityintegernon90Qualité de l’image fixe pour l’encodage WebP, de 1 à 100.
--presetstringnonnon définisignage-1080p30 ou signage-4k30. Taille vidéo adaptée à l’orientation et 30 ips constant. --max-edge et --max-fps peuvent resserrer un préréglage mais ne peuvent pas l’agrandir. Vidéo uniquement ; ne peut pas être combiné avec --no-transcode.
--no-audiobooleannondésactivéOmettre la piste audio de la livraison vidéo. Vidéo seulement ; ne peut pas être combiné avec --no-transcode.
--no-progressbooleannondésactivéNe produire aucune sortie de progression. La progression est toujours envoyée à stderr ; stdout reste réservé à l’enveloppe du résultat.
screenrig media upload ./lobby-welcome-loop.mp4 --tag LobbyLoop

La vidéo devient un MP4 : profil élevé H.264 niveau 4.2 par défaut, ou H.265 avec --codec hevc, en yuv420p balisé Rec. 709. Une source HDR est mappée en tonalité vers Rec. 709. L’audio, lorsque la source en a, est AAC à 192 kbit/s, 48 kHz, stéréo.

Les images fixes deviennent WebP avec perte à la qualité 90, conservant l’alpha si la source en a. Une source animée boucle indéfiniment. Un WebP déjà conforme à la limite de taille est transmis sans réencodage.

L’audio devient un MP3 pour une bande sonore de liste de lecture. Une source MP3 se téléverse inchangée ; les sources WAV, AAC, M4A, OGG et FLAC sont converties en MP3 128 kb/s, ce qui nécessite une build ffmpeg avec libmp3lame. Une piste dure de 1 seconde à 3 heures. playlist init transforme les entrées audio en pistes de bande sonore plutôt qu’en pages. L’objet prêt est un objet média audio avec une durée. Il ne peut pas être placé sur une page ; nommez-le dans la liste de lecture audio bande sonore à la place.

L’identifiant de l’objet prêt est data.media_id. La même valeur est data.id et data.operation.result.media_id. Cet identifiant est ce qu’un sélecteur de liste de lecture prend.

Un nom de fichier peu informatif tel que video.mp4 ajoute un avertissement consultatif generic_filename à l’enveloppe. Le téléversement réussit quand même et la CLI ne renomme jamais le fichier ; choisissez le nom avant d’exécuter la commande.

Les conversions exécutent ffmpeg et ffprobe depuis PATH, ou depuis les chemins absolus dans SCREENRIG_FFMPEG et SCREENRIG_FFPROBE. Les images fixes préfèrent l’encodeur ffmpeg libwebp et retombent sur cwebp sur PATH ou SCREENRIG_CWEBP. Exécutez doctor avant le premier téléversement d’une session.

--preset signage-1080p30 limite le grand côté à 1920, le petit côté à 1080, et le taux à 30 ips constant. signage-4k30 limite le grand côté à 3840, le petit côté à 2160, et le taux à 30 ips constant. Les deux fonctionnent avec du contenu paysage, portrait et carré. --no-audio omet l’encodage audio pour les clips silencieux. Ces options s’appliquent uniquement à la vidéo.

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

Le téléversement arrive à la racine de la bibliothèque et est déplacé dans le dossier une fois prêt. media upload-batch --folder déplace chaque élément téléversé de la même manière.

Avec un accès Proposer, ou lorsque le projet exige une révision pour les modifications d’agent, un nouveau téléversement attend la révision d’une personne avant qu’une étiquette, un dossier ou un sélecteur all ne le diffuse ; voir Révisions.

media upload-batch#

Téléversez plusieurs fichiers locaux à partir d’un manifeste, en reprenant depuis un fichier d’état requis.

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]
ParamètreTypeRequisPar défautNotes
<manifest.json>cheminouiaucun{ "items": [ { "path": "./a.png", "tag"?: "Lobby", "content_type"?: "image/png" } ] } avec 1 à 1000 éléments. Les chemins sont relatifs au fichier manifeste.
--state FILEcheminnonfichier privé à côté de la configurationUn fichier JSON 0600 indexé par le SHA-256 des octets locaux de chaque fichier source. Les éléments déjà présents avec un media_id sont signalés comme resumed. Ne pas partager un fichier d’état entre projets.
--concurrency Nintegernonle CLI par défautTéléversements parallèles.
--no-transcodebooleannondésactivéTéléversez les octets source sans modification, comme le fait media upload.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
--timeout MSintegernon120000Date limite d’attente. Elle limite aussi chaque requête sous-jacente.
--codecstringnonh264h264 ou hevc ; avc et h265 sont acceptés comme alias. Utilisez hevc seulement quand chaque écran qui jouera le clip est un Player natif.
--max-fps Nnumbernon30Fréquence d’images de sortie constante. Chaque vidéo est encodée exactement à ce taux quelle que soit sa fréquence source, donc les clips consécutifs ne changent jamais de fréquence. Supérieure à 0 et au maximum 240.
--max-edge PIXELSintegernon3840Limite appliquée à chaque bord, de 16 à 3840. Le rapport d’aspect est conservé et une source plus petite n’est jamais agrandie.
--webp-qualityintegernon90Qualité de l’image fixe pour l’encodage WebP, de 1 à 100.
--presetstringnonnon définisignage-1080p30 ou signage-4k30. Taille vidéo adaptée à l’orientation et 30 ips constant. --max-edge et --max-fps peuvent resserrer un préréglage mais ne peuvent pas l’agrandir. Vidéo uniquement ; ne peut pas être combiné avec --no-transcode.
--no-audiobooleannondésactivéOmettre la piste audio de la livraison vidéo. Vidéo seulement ; ne peut pas être combiné avec --no-transcode.
--tag TAGstringnonaucunAppliqué lorsqu’un élément omet sa propre étiquette.
--folder IDstringnonracine de la bibliothèqueUn dossier de médias mfd_ existant. Chaque élément téléversé y est déplacé après le téléversement, et data.folder_id le signale.
--no-progressbooleannondésactivéNe produire aucune sortie de progression.
screenrig media upload-batch ./images.json --state ./upload-state.json

L’enveloppe transporte data.items[] dans l’ordre du manifeste, chacun avec path, source_filename, sha256, outcome (accepted ou resumed), et media_id. data.failed[] transporte les éléments qui n’ont pas abouti.

media replace#

Remplacer le fichier d’un média sur place. Son id, ses playlists et ses programmations continuent de fonctionner.

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]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
<file>cheminouiaucunLa nouvelle image, le nouveau clip ou la nouvelle piste audio. Elle doit être du même type que le média : image pour image, vidéo pour vidéo, audio pour audio. Vérifié avant le début de tout travail (usage_error, code de sortie 2).
--expect-rev REVISIONstringnonaucunPrécondition de révision facultative. Une valeur périmée fournie est revision_conflict et le téléversement déclaré est annulé : lisez media show ID et relancez la commande.
--note TEXTstringnonaucunConservée avec la nouvelle version et montrée à la personne qui la révise. 280 caractères au plus.
--content-type TYPEstringnondétecté à partir des octets téléversésDéclarez vous-même le type de média au lieu de laisser le CLI le détecter.
--no-waitbooleannondésactivéRetourner dès que le remplacement est accepté. Le nouveau fichier n’est pas encore en service ; terminez avec operations wait.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
--timeout MSintegernon120000Date limite d’attente. Elle limite aussi chaque requête sous-jacente.
--no-transcodebooleannondésactivéTéléversez les octets source sans modification. ffmpeg, ffprobe et cwebp ne sont pas exécutés. Le WebP sans perte est toujours rejeté.
--codecstringnonh264h264 ou hevc ; avc et h265 sont acceptés comme alias. Utilisez hevc seulement quand chaque écran qui jouera le clip est un Player natif.
--max-fps Nnumbernon30Fréquence d’images de sortie constante. Chaque vidéo est encodée exactement à ce taux quelle que soit sa fréquence source, donc les clips consécutifs ne changent jamais de fréquence. Supérieure à 0 et au maximum 240.
--max-edge PIXELSintegernon3840Limite appliquée à chaque bord, de 16 à 3840. Le rapport d’aspect est conservé et une source plus petite n’est jamais agrandie.
--webp-qualityintegernon90Qualité de l’image fixe pour l’encodage WebP, de 1 à 100.
--presetstringnonnon définisignage-1080p30 ou signage-4k30. Taille vidéo adaptée à l’orientation et 30 ips constant. --max-edge et --max-fps peuvent resserrer un préréglage mais ne peuvent pas l’agrandir. Vidéo uniquement ; ne peut pas être combiné avec --no-transcode.
--no-audiobooleannondésactivéOmettre la piste audio de la livraison vidéo. Vidéo seulement ; ne peut pas être combiné avec --no-transcode.
--no-progressbooleannondésactivéNe produire aucune sortie de progression. La progression est toujours envoyée à stderr ; stdout reste réservé à l’enveloppe du résultat.
screenrig media replace med_01EXAMPLEIMAGE0000000000 ./menu-v2.png
screenrig media replace med_01EXAMPLEVIDEO0000000000 ./intro.mp4 --expect-rev 3 --note "Spring cut"

Le média garde son id, ses étiquettes et son dossier, si bien que chaque playlist et chaque programmation qui le nomme joue le nouveau fichier au prochain manifeste, et que les sélecteurs d’étiquette, de dossier et all le prennent aussi en compte. Rien n’est reprogrammé. La commande exécute les mêmes étapes que media upload (conversion, limite d’octets vidéo du plan, limites de dimensions, quota de stockage, transfert signé) puis remplace au lieu d’ajouter un nouveau média. Elle n’accepte ni --tag ni --folder.

Par défaut la commande attend la fin du traitement. data.media_id et data.id sont l’id du média, data.version est le numéro du nouveau fichier dans media versions, et data.revision est la nouvelle révision du média. data.warnings, data.operation, data.upload, data.transcode et la durée sont rapportés comme pour media upload, et l’id d’opération figure sur l’enveloppe. Avec --no-wait, data.operation est l’opération acceptée, et data.version et data.warnings sont absents.

Un changement de rapport d’aspect est permis. L’enveloppe porte un avertissement aspect_ratio_changed, et data.warnings[].playlists nomme les playlists qui utilisent le média ; vérifiez donc leur rendu. Un fichier aux mêmes octets que l’actuel est refusé avec resource_conflict (code de sortie 13).

Chaque fichier antérieur reste dans l’historique du média et compte dans les octets stockés jusqu’à la suppression de sa version ; voir media versions.

Avec l’accès Propose, ou quand le projet exige une révision pour les modifications d’agent, le remplacement attend une personne et la commande réussit (code de sortie 0) : data.status est pending_review, data.review_id nomme la révision, l’avertissement pending_review donne son URL et data.next est screenrig reviews show ID. Le média continue de jouer son fichier actuel jusqu’à l’approbation d’une personne ; dites-lui donc qu’il attend et ne répétez pas l’écriture. Un remplacement plus récent du même média remplace celui qui attend. Voir Révisions.

media versions#

Lister les fichiers qu’a eus un média, le fichier en service en premier.

media versions <id> [--limit N] [--cursor CURSOR]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
--limit Nintegernonchaque pageLire une page de ce nombre de versions, de 1 à 100.
--cursor CURSORstringnonaucunLire la page qui suit le data.next_cursor de la page précédente.
screenrig media versions med_01EXAMPLEIMAGE0000000000

data.items contient une entrée par fichier qu’a eu le média : number, current, filename, content_type, sha256, bytes, width, height, duration_ms, codecs, source (upload, replace, sync ou restore), note, by (type person, agent, client ou sync, avec identifiant et nom) et restored_from. Le fichier en service vient en premier (current: true), puis les autres du plus récent au plus ancien. La version 1 est le premier téléversement ; chaque remplacement, restauration ou changement de synchronisation de médias ajoute le numéro suivant.

Sans --limit ni --cursor, toutes les pages sont lues et data.next_cursor vaut null. Avec l’un des deux, une seule page est lue : tant que data.next_cursor est une chaîne, relancez la commande avec --cursor défini sur cette valeur. L’accès Lecture seule suffit. Les octets d’une version passée restent stockés et comptent dans les octets stockés du projet jusqu’à ce que media version delete les supprime ; le nombre de versions conservées n’est pas limité, et les octets stockés au-delà du stockage gratuit du plan sont facturés comme tout autre stockage.

media restore#

Remettre une version passée en service comme nouvelle version.

media restore <id> --number N [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
--number NintegerouiaucunLe numéro de la version à remettre en service, tel que media versions le liste.
--expect-rev REVISIONstringnonaucunPrécondition de révision facultative. Une valeur périmée fournie est revision_conflict : lisez media show ID et relancez la commande.
--note TEXTstringnonaucunConservée avec la nouvelle version et montrée à la personne qui la révise. 280 caractères au plus.
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2 --expect-rev 5 --note "Back to the winter menu"

Le média garde son id et passe à une nouvelle révision, et chaque playlist et chaque programmation qui le nomme rejoue ce fichier. La version qu’elle copie reste dans l’historique et partage ses octets ; la nouvelle version compte dans les octets stockés comme n’importe quelle autre. data.media est le média et data.warnings porte aspect_ratio_changed, qui nomme les playlists utilisant le média, quand le fichier restauré a un autre rapport d’aspect.

La version en service ne peut pas être restaurée (resource_conflict, code de sortie 5), et une version inconnue est not_found (code de sortie 4). Avec l’accès Propose, ou quand le projet exige une révision pour les modifications d’agent, la restauration attend une personne et la commande réussit (code de sortie 0) : data.status est pending_review avec data.review, l’avertissement pending_review donne son URL et data.next est screenrig reviews show ID. Le média continue de jouer son fichier actuel jusqu’à l’approbation d’une personne ; ne répétez donc pas l’écriture.

media version delete#

Supprimer une version passée et ses octets stockés.

media version delete <id> --number N
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
--number NintegerouiaucunLe numéro de la version à supprimer, tel que media versions le liste.
screenrig media version delete med_01EXAMPLEIMAGE0000000000 --number 2

L’enregistrement de la version disparaît et ses octets quittent aussitôt les octets stockés du projet. L’objet stocké est retiré au bout de 24 heures, sauf si une autre version ou le fichier en service détient le même fichier. Une version supprimée ne peut pas être restaurée. La version en service ne peut pas être supprimée, et aucune version ne peut l’être tant qu’un remplacement du média attend une révision ; les deux cas sont resource_conflict (code de sortie 5), et media versions ID montre quelle version est en service. Une version inconnue est not_found (code de sortie 4). La suppression exige l’accès Manage : un identifiant Propose est refusé avec insufficient_access, et la suppression n’est jamais proposée à révision.

media show#

Lire un objet média, y compris sa révision actuelle.

media show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
screenrig media show med_01EXAMPLEIMAGE0000000000

media download#

Écrivez une version stockée sur disque pour inspection. N’imprimez jamais les octets.

media download <id> [--output FILE]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
--output FILEcheminnon./<id>.<ext> dans le répertoire courantUn chemin de fichier, pas un répertoire. Un fichier existant est écrasé. L’extension suit le type de contenu.
screenrig media download med_01EXAMPLEIMAGE0000000000 --output ./lobby.webp

L’enveloppe rapporte media_id, path, bytes, sha256, content_type, primitive, filename, optionnel source_filename, et width / height. Elle ne transporte jamais de pixels. Utilisez ceci pour valider une image générée avant qu’elle ne soit affichée.

media list#

Lister les objets médias, filtrés optionnellement par étiquette et type primitif.

media list [--tag TAG] [--primitive image|video|audio] [--folder ID|root] [--library]
ParamètreTypeRequisPar défautNotes
--tag TAGstringnonaucunCorrespondance ^[A-Za-z0-9]{1,32}$. Les objets non étiquetés sont omis chaque fois que ce filtre est présent.
--primitivestringnontoutimage, video ou audio. Restreindre la liste aux images fixes, clips ou pistes sonores.
--folder ID|rootstringnonchaque dossierSeuls les fichiers directement dans ce dossier mfd_, pas ses sous-dossiers, ou avec root seuls les fichiers à la racine de la bibliothèque. L’API applique le filtre.
--librarybooleannondésactivéListe plutôt les médias de la Bibliothèque de l’organisation, en lecture seule : les lignes portent library: true. Utilisez leurs ID dans les pages de liste de lecture ; modifiez-les seulement dans le projet Bibliothèque.
screenrig media list --tag LobbyLoop --primitive video
screenrig media list --folder mfd_01EXAMPLEFOLDER000000000
screenrig media list --library

Chaque ligne comporte folder_id, qui est absent à la racine de la bibliothèque.

media update#

Modifier ou effacer la balise sur un objet. Sa règle de disponibilité se définit avec media availability.

media update <id> (--tag TAG | --tags TAG1,TAG2 | --clear-tag) [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
--tag TAGstringl’un des deuxaucunL’étiquette de remplacement, de une à 32 lettres ou chiffres.
--clear-tagbooleanl’un des deuxdésactivéEnvoyez null et laissez l’objet non étiqueté.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig media update med_01EXAMPLEIMAGE0000000000 --tag LobbyLoop

Avec un accès Proposer, ou lorsque le projet exige une révision pour les modifications d’agent, le retagging des médias approuvés répond à ok avec l’avertissement media_review_pending : les écrans continuent de le diffuser avec ses étiquettes approuvées jusqu’à ce qu’une personne approuve le changement, et un rejet remet les étiquettes en place. Sa révision apparaît dans reviews list en quelques secondes ; un retag qui ne change aucune playlist approuvée ni playlist en attente de révision s’applique seul. Voir Révisions.

media availability#

Définit ou efface le moment où les sélecteurs dynamiques peuvent choisir un fichier.

media availability <id> (--file FILE | --clear) [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
--file FILEstringl’un des deuxaucunUne règle de disponibilité JSON.
--clearbooleanl’un des deuxdésactivéSupprime la règle ; le fichier est toujours disponible.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig media availability med_01EXAMPLEIMAGE0000000000 --file rule.json

Les membres et le comportement de la règle figurent sous Disponibilité des médias.

media delete#

Supprimer un objet média.

media delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant med_ de l’objet.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig media delete med_01EXAMPLEIMAGE0000000000

media move#

Déplacez les fichiers médias et les dossiers dans un dossier, ou retour à la racine de la bibliothèque.

media move <id>... (--folder ID | --root)
ParamètreTypeRequisPar défautNotes
<id>...stringouiaucunUn ou plusieurs ID de fichier med_ et ID de dossier mfd_, au maximum 1000 au total.
--folder IDstringl’un des deuxaucunLe dossier de destination mfd_.
--rootbooleanl’un des deuxdésactivéDéplacer à la racine de la bibliothèque.
screenrig media move med_01EXAMPLEIMAGE0000000000 med_01EXAMPLEVIDEO0000000000 --folder mfd_01EXAMPLEFOLDER000000000
screenrig media move mfd_01EXAMPLEFOLDER000000000 --root

Le déplacement est une requête tout ou rien. Un dossier ne peut pas se déplacer dans lui-même ni dans un dossier qu’il contient, et les dossiers s’imbriquent au maximum sur 10 niveaux. Les éléments déjà dans la destination restent tels quels. data.media et data.folders comptent ce qui a été déplacé.

Le déplacement de fichiers modifie ce que les sélecteurs by:folder de leurs anciens et nouveaux dossiers jouent, à partir de la résolution du sélecteur suivant de chaque écran ; déplacer un dossier ne change pas les fichiers propres à un dossier. Sous Propose access, ou lorsque le projet exige une révision pour les modifications d’agent, chaque fichier déplacé attend la révision d’une personne (reviews list) et les listes de lecture approuvées continuent de le jouer par le dossier avec lequel il a été approuvé ; voir Révisions.

media folder list#

Lister les dossiers médias du projet.

media folder list [--library]
ParamètreTypeRequisPar défautNotes
--librarybooleannondésactivéListe plutôt les dossiers de la Bibliothèque de l’organisation, en lecture seule : les lignes portent library: true, et un sélecteur by:folder peut en nommer un pour lire ses fichiers.
screenrig media folder list
screenrig media folder list --library

Retourne chaque dossier du projet, au maximum 1000, ordonnés par nom : data.items avec id, name, parent_id (null à la racine de la bibliothèque) et revision. Construisez l’arborescence à partir de parent_id. Le dossier d’un fichier est folder_id sur media list et media show ; il est absent à la racine de la bibliothèque.

media folder show#

Lire un dossier de médias.

media folder show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de dossier mfd_.
screenrig media folder show mfd_01EXAMPLEFOLDER000000000

L’enveloppe transporte le name, parent_id et revision du dossier.

media folder create#

Créer un dossier de médias à la racine de la bibliothèque ou dans un autre dossier.

media folder create --name NAME [--parent ID]
ParamètreTypeRequisPar défautNotes
--name NAMEstringouiaucun1 à 100 caractères, sans espaces inutiles. Les noms peuvent se répéter.
--parent IDstringnonracine de la bibliothèqueLe dossier mfd_ dans lequel le créer.
screenrig media folder create --name Menus
screenrig media folder create --name Lunch --parent mfd_01EXAMPLEFOLDER000000000

Une organisation contient au maximum 1000 dossiers, tous projets confondus, imbriqués jusqu’à 10 niveaux. Une liste de lecture joue les fichiers d’un dossier avec un sélecteur by:folder.

media folder update#

Renommez un dossier de médias, ou déplacez-le avec tout son contenu dans un autre dossier.

media folder update <id> [--name NAME] [--parent ID | --root] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de dossier mfd_.
--name NAMEstringau moins un de --name, --parent, --rootinchangéLe nouveau nom, de 1 à 100 caractères.
--parent IDstringau moins un de --name, --parent, --rootinchangéDéplacez le dossier, avec tout ce qu’il contient, dans ce dossier mfd_. Pas avec --root.
--rootbooleanau moins un de --name, --parent, --rootdésactivéDéplacez le dossier à la racine de la bibliothèque. Pas avec --parent.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --name Archive
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --root

Un dossier ne peut pas être déplacé dans lui-même ou dans un dossier qu’il contient, et un déplacement doit garder chaque dossier dans une profondeur maximale de 10 niveaux. Envoyer les valeurs actuelles est une opération sans effet.

media folder delete#

Supprimer un dossier média. Ses fichiers et dossiers sont déplacés d’un niveau vers le haut.

media folder delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de dossier mfd_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig media folder delete mfd_01EXAMPLEFOLDER000000000

Supprime uniquement le dossier. Ses fichiers et dossiers montent dans son parent, ou dans la racine de la bibliothèque s’il n’en a pas. Un sélecteur by:folder qui le nomme ne correspond plus à rien, donc redirigez d’abord ces listes de lecture.

Synchronisation de médias

Une synchronisation de médias garde un dossier de médias à jour avec un dossier SharePoint, OneDrive Entreprise, Dropbox ou Google Drive. Chaque exécution importe les images (png, jpeg, webp, gif), les vidéos (mp4, webm) et l’audio (mp3) situés directement dans le dossier source ; les sous-dossiers sont ignorés. Un fichier modifié remplace ses octets sous le même ID média, de sorte que chaque liste de lecture qui le joue se met à jour, et un fichier supprimé ou déplacé hors de la source cesse d’être lu : son média est supprimé ou, tant qu’un écran l’affiche encore, déplacé dans un sous-dossier Removed puis supprimé quand plus rien ne l’utilise. Les autres fichiers sont listés comme ignorés avec la raison : affichez un fichier Office ou un PDF avec un lien de document dans une liste de lecture, et exportez les MOV et semblables en MP4 H.264. Une liste de lecture joue le dossier avec un sélecteur by:folder.

Chaque synchronisation lit par un compte du projet. Un ID de compte commence par msa_ et un ID de synchronisation par msy_. media sync account add microsoft365 stocke votre propre application Microsoft Entra, ou désigne une connexion Microsoft du projet ; media sync account add dropbox affiche un lien à usage unique pour la personne titulaire du compte Dropbox ; media sync account add google-drive lit les dossiers partagés avec l’adresse d’un compte de service, celle de screenRIG ou la vôtre. Testez le compte, puis créez une synchronisation à partir de l’adresse d’un dossier : elle est à exécuter immédiatement.

Donnez un secret client avec --secret-file FILE et une clé Google Drive avec --key-file FILE, ou - pour l’entrée standard, jamais comme argument. Les secrets sont scellés sur le serveur et renvoyés uniquement sous la forme data.secret {set, hint}. La lecture exige l’accès Read, et tout changement exige l’accès Manage.

media sync account add microsoft365#

Ajoutez votre propre application Microsoft Entra, ou une connexion Microsoft du projet, pour qu’une synchronisation puisse lire un dossier SharePoint ou OneDrive Entreprise.

media sync account add microsoft365 --name NAME
    (--tenant-id TENANT --client-id ID --secret-file FILE | --connection-id ID)
ParamètreTypeRequisPar défautNotes
--name NAMEstringouiaucun1 à 80 caractères.
--tenant-id TENANTstringsans --connection-idaucunL’ID de répertoire (locataire) de votre organisation, ou son domaine principal, comme contoso.onmicrosoft.com ; jamais common, organizations ni consumers. En même temps que --client-id et --secret-file.
--client-id IDstringsans --connection-idaucunL’ID d’application (client) de l’inscription d’application, un GUID.
--secret-file FILEstringsans --connection-idaucunLit la Value du secret client depuis ce fichier, ou - pour l’entrée standard (jamais un argument) ; le fichier ne contient que la Value.
--connection-id IDstringsans --tenant-idaucunSe connecte par une connexion Microsoft (pcn_…) du projet, dans l’un ou l’autre mode, à la place de --tenant-id, --client-id et --secret-file. Pas avec eux.
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

Dans le Microsoft Entra admin center, inscrivez une application à locataire unique sans URI de redirection, ajoutez un secret client (copiez sa Value, pas son Secret ID), ajoutez l’autorisation d’application Microsoft Graph Sites.Selected (puis accordez à l’application l’accès en lecture à chaque site) ou Files.Read.All, et accordez le consentement de l’administrateur. L’application appartient à ce projet. Exécutez ensuite media sync account test.

media sync account add dropbox#

Ajoutez un compte Dropbox et affichez le lien à usage unique que son titulaire ouvre, connecté à Dropbox, pour le connecter.

media sync account add dropbox --name NAME [--app-key KEY]
ParamètreTypeRequisPar défautNotes
--name NAMEstringouiaucun1 à 80 caractères.
--app-key KEYstringnonl’application Dropbox de screenRIGLa clé d’application de votre propre application Dropbox : de 1 à 64 lettres et chiffres, jamais son secret d’application.
screenrig media sync account add dropbox --name "Marketing Dropbox"
screenrig media sync account add dropbox --name "Marketing Dropbox" --app-key YOURAPPKEY

data.authorize_url est le lien et data.authorize_expires_at son expiration. Le CLI n’ouvre jamais de navigateur : envoyez le lien à la personne titulaire du compte Dropbox, qui autorise un accès en lecture seule (files.metadata.read, files.content.read, account_info.read). Exécutez media sync account show jusqu’à ce que data.state soit ready (il vaut d’abord pending_consent), puis media sync create dropbox. Votre propre application Dropbox doit avoir ces autorisations activées et l’URI de redirection qu’affiche la sortie.

media sync account add google-drive#

Ajoutez un compte Google Drive, prêt immédiatement, et affichez l’adresse du compte de service avec laquelle les dossiers sont partagés.

media sync account add google-drive --name NAME [--key-file FILE]
ParamètreTypeRequisPar défautNotes
--name NAMEstringouiaucun1 à 80 caractères.
--key-file FILEstringnonle compte de service de screenRIGLit la clé JSON de votre propre compte de service Google Cloud depuis ce fichier, ou - pour l’entrée standard (jamais un argument).
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 est l’adresse avec laquelle partager chaque dossier ; le rôle Lecteur suffit. Avec le compte de service de screenRIG, un dossier ne se synchronise que si un membre de ce projet dont le courriel est vérifié l’a partagé ou en est propriétaire (sinon media_sync_sharer_not_member). Avec votre propre clé, tout dossier partagé avec le compte de service se synchronise.

media sync account list#

Liste les comptes de synchronisation de médias de ce projet avec leur type, leur état et leur dernier test ; aucun secret n’est renvoyé.

media sync account list

Aucun paramètre.

screenrig media sync account list

media sync account show#

Consultez un compte : son locataire et son ID client, son état, son secret masqué et son dernier test.

media sync account show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLe compte (msa_…).
screenrig media sync account show msa_01EXAMPLEACCOUNT0000000

Un compte Dropbox affiche aussi qui l’a connecté et son app_key ; un compte Google Drive affiche son service_account_email.

media sync account update#

Renommez un compte, modifiez le locataire, l’ID d’application ou le secret client d’une application Microsoft, ou remplacez la clé propre d’un compte Google Drive.

media sync account update <id> [--name NAME] [--tenant-id TENANT] [--client-id ID]
    [--secret-file FILE | --key-file FILE] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLe compte (msa_…).
--name NAMEstringnoninchangéRenomme le compte.
--tenant-id TENANTstringnoninchangéL’ID de répertoire du locataire, ou son domaine principal.
--client-id IDstringnoninchangéL’ID d’application (client) de l’inscription d’application.
--secret-file FILEstringnoninchangéLit la Value du nouveau secret client depuis ce fichier, ou - pour l’entrée standard ; elle remplace le secret stocké. Un secret omis est conservé.
--key-file FILEstringnoninchangéLit la clé JSON propre d’un compte Google Drive depuis ce fichier, ou - pour l’entrée standard ; elle doit appartenir au même compte de service. Pas avec --secret-file.
--expect-rev REVISIONintegernonaucunRefuse le changement sauf si le compte est à cette révision (revision_conflict, sortie 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

Au moins un changement est requis. Un changement d’identifiants efface last_test : testez de nouveau le compte. Les secrets client Entra expirent : remplacez donc le secret ici avant son expiration.

media sync account connect#

Créez un nouveau lien à usage unique pour connecter, ou reconnecter, un compte Dropbox.

media sync account connect <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLe compte (msa_…).
screenrig media sync account connect msa_01EXAMPLEACCOUNT0000000

data.authorize_url et data.authorize_expires_at portent le lien, qui remplace le précédent. Envoyez-le à la personne titulaire du compte Dropbox. Utilisez-le quand la personne n’a pas terminé ou que le compte est reconnect_required (Dropbox n’honore plus la connexion). Un compte connecté reste connecté jusqu’à ce que le nouveau consentement soit terminé, et un autre compte Dropbox qui se connecte reprend la connexion.

media sync account test#

Vérifiez un compte : l’ouverture de session et les autorisations Graph d’une application Microsoft, ou la connexion ou la clé d’un compte Dropbox ou Google Drive.

media sync account test <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLe compte (msa_…).
screenrig media sync account test msa_01EXAMPLEACCOUNT0000000

La réponse est stockée sous last_test. Pour une application Microsoft, le test rapporte credentials (Microsoft a émis un jeton ; un refus porte son code AADSTS, comme AADSTS7000215 pour un secret qui est l’ID plutôt que la Value) et permissions (les autorisations d’application Graph que le jeton porte). Sites.Selected seule est un avertissement : chaque site a encore besoin de son autorisation, et un lien de partage exige Files.Read.All. Le test ne juge ni l’autorisation d’un site ni un dossier : media sync create lit le dossier que vous nommez. Une vérification échouée donne data.ok à false avec la sortie 0.

media sync account delete#

Supprimez un compte qu’aucune synchronisation n’utilise.

media sync account delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLe compte (msa_…).
--expect-rev REVISIONintegernonaucunRefuse la suppression sauf si le compte est à cette révision (revision_conflict, sortie 6).
screenrig media sync account delete msa_01EXAMPLEACCOUNT0000000

Tant que des synchronisations utilisent le compte, la réponse est resource_conflict (sortie 5), en les nommant : supprimez-les d’abord.

media sync create sharepoint#

Synchronisez un dossier SharePoint ou OneDrive Entreprise dans un dossier de médias.

media sync create sharepoint --account-id ID --url URL [--folder-id ID] [--every DURATION] [--name NAME]
ParamètreTypeRequisPar défautNotes
--account-id IDstringouiaucunLe compte par lequel lire (msa_…).
--url URLstringouiaucunL’adresse SharePoint du dossier, comme https://contoso.sharepoint.com/sites/Marketing/Shared%20Documents/Lobby%20Signs, qui fonctionne avec Sites.Selected une fois le site autorisé, ou son lien de partage (Share, Copy link), qui exige Files.Read.All. Le OneDrive personnel (onedrive.live.com, 1drv.ms) ne peut pas être lu avec une application d’organisation.
--folder-id IDstringnonun nouveau dossier de médias nommé d’après le dossier sourceLe dossier de médias (mfd_…) où les fichiers sont placés.
--every DURATIONstringnon15mFréquence de recherche des changements, de 5 minutes à 24 heures : 15m, 1h, 6h, ou de simples secondes (de 300 à 86400).
--name NAMEstringnonle nom du dossier source1 à 80 caractères.
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"

Un dossier que Microsoft refuse donne media_sync_source_refused (sortie 5), avec l’autorisation à accorder ; rien n’est stocké.

media sync create dropbox#

Synchronisez un dossier Dropbox dans un dossier de médias.

media sync create dropbox --account-id ID --url URL|PATH [--folder-id ID] [--every DURATION] [--name NAME]
ParamètreTypeRequisPar défautNotes
--account-id IDstringouiaucunLe compte Dropbox connecté par lequel lire (msa_…).
--url URLstringouiaucunL’adresse Dropbox du dossier (https://www.dropbox.com/home/...), un lien de dossier partagé que le compte a ajouté à son Dropbox, ou un chemin qui commence par /. Un dossier d’espace d’équipe est lu à partir de la racine de l’équipe.
--folder-id IDstringnonun nouveau dossier de médias nommé d’après le dossier sourceLe dossier de médias (mfd_…) où les fichiers sont placés.
--every DURATIONstringnon15mFréquence de recherche des changements, de 5 minutes à 24 heures : 15m, 1h, 6h, ou de simples secondes (de 300 à 86400).
--name NAMEstringnonle nom du dossier source1 à 80 caractères.
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"

Chaque exécution reprend à partir de la position enregistrée par Dropbox dans le dossier et ne lit que ce qui a changé. Un dossier que le compte ne peut pas ouvrir donne media_sync_source_refused, et une connexion que Dropbox n’honore plus donne dropbox_reconnect_required (media sync account connect) : les deux donnent la sortie 5, rien n’est stocké.

media sync create google-drive#

Synchronisez un dossier Google Drive, partagé avec le compte de service d’un compte, dans un dossier de médias.

media sync create google-drive --account-id ID --url URL|ID [--folder-id ID] [--every DURATION] [--name NAME]
ParamètreTypeRequisPar défautNotes
--account-id IDstringouiaucunLe compte Google Drive par lequel lire (msa_…).
--url URLstringouiaucunL’adresse du dossier (https://drive.google.com/drive/folders/ID), ou son ID. Partagez d’abord le dossier avec le service_account_email du compte ; le rôle Lecteur suffit.
--folder-id IDstringnonun nouveau dossier de médias nommé d’après le dossier sourceLe dossier de médias (mfd_…) où les fichiers sont placés.
--every DURATIONstringnon15mFréquence de recherche des changements, de 5 minutes à 24 heures : 15m, 1h, 6h, ou de simples secondes (de 300 à 86400).
--name NAMEstringnonle nom du dossier source1 à 80 caractères.
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

Avec le compte de service de screenRIG, le dossier ne se synchronise que si un membre de ce projet dont le courriel est vérifié l’a partagé ou en est propriétaire (media_sync_sharer_not_member, sortie 3, rien n’est stocké). Chaque exécution le vérifie de nouveau, et un dossier qui perd une telle personne arrête la synchronisation à l’état error, ses médias étant conservés : partagez-le de nouveau depuis le compte Google d’un membre, puis exécutez media sync update ID --resume. Les fichiers Google Docs, Sheets et Slides sont ignorés comme unsupported_type. Un dossier que l’adresse ne peut pas ouvrir donne media_sync_source_refused (sortie 5) : partagez-le avec le compte de service.

media sync list#

Liste les synchronisations de médias de ce projet avec leur dossier de médias, leur cadence, leur état et le statut de leur dernière exécution.

media sync list

Aucun paramètre.

screenrig media sync list

media sync show#

Consultez une synchronisation et le résumé de sa dernière exécution.

media sync show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa synchronisation (msy_…).
screenrig media sync show msy_01EXAMPLESYNC000000000

data.last_run porte status (ok, partial ou error), added, updated, removed, pending_delete (fichiers supprimés qu’un écran garde encore, en attente dans le dossier Removed) et skipped avec la raison de chaque fichier (unsupported_type, too_large, storage, subfolder, download_failed, unreadable, in_use) ; une exécution échouée porte error avec un code et un detail qui indiquent la correction. data.source ajoute path pour Dropbox et shared_by pour Google Drive.

Une synchronisation à l’état error a besoin d’une réparation. Son dossier de médias a été supprimé : pointez-la vers un autre avec media sync update --folder-id. Son dossier source a été supprimé ou déplacé : supprimez la synchronisation et créez-en une. Pour Google Drive par le compte de service de screenRIG, le dossier a perdu la personne vérifiée qui le partageait (sharer_not_member) : partagez-le de nouveau depuis le compte Google d’un membre du projet, puis media sync update ID --resume. Une exécution Dropbox échoue avec reconnect_required quand Dropbox cesse d’honorer la connexion (media sync account connect).

media sync update#

Modifiez le nom, la cadence ou le dossier de médias d’une synchronisation, ou mettez-la en pause et reprenez-la.

media sync update <id> [--name NAME] [--every DURATION] [--folder-id ID]
    [--pause | --resume] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa synchronisation (msy_…).
--name NAMEstringnoninchangéRenomme la synchronisation.
--every DURATIONstringnoninchangéFréquence de recherche des changements, de 5 minutes à 24 heures.
--folder-id IDstringnoninchangéRemplit ce dossier de médias (mfd_…) à la place. La prochaine exécution relit toute la source et y place chaque fichier synchronisé.
--pausebooleannondésactivéArrête l’exécution jusqu’à la reprise. Pas avec --resume.
--resumebooleannondésactivéReprend l’exécution ; relance aussi une synchronisation qu’une erreur a arrêtée. Pas avec --pause.
--expect-rev REVISIONintegernonaucunRefuse le changement sauf si la synchronisation est à cette révision (revision_conflict, sortie 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

Au moins un changement est requis.

media sync run#

Exécutez une synchronisation maintenant plutôt qu’à sa prochaine heure.

media sync run <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa synchronisation (msy_…).
screenrig media sync run msy_01EXAMPLESYNC000000000

La synchronisation s’exécute en 30 secondes environ, et media sync show affiche alors sa dernière exécution. Une synchronisation en pause doit d’abord être reprise.

media sync delete#

Arrêtez une synchronisation ; ses médias et son dossier restent.

media sync delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa synchronisation (msy_…).
--expect-rev REVISIONintegernonaucunRefuse la suppression sauf si la synchronisation est à cette révision (revision_conflict, sortie 6).
screenrig media sync delete msy_01EXAMPLESYNC000000000

La synchronisation oublie quel fichier source est devenu quel média. Les médias importés et le dossier de médias restent, et rien n’est supprimé.

Applications

Une application est un répertoire statique déjà construit avec une racine index.html. Le packer injecte le SDK navigateur à _screenrig/runtime.js et ajoute sa balise script, donc l’app atteint window.screenrig sans étape de construction ni ajout à ses dépendances. Rien dans le répertoire n’est jamais construit ni exécuté pendant le packing.

app pack#

Emballez un répertoire statique dans une archive déterministe sans la téléverser.

app pack <directory> [--output FILE]
ParamètreTypeRequisPar défautNotes
<directory>cheminouiaucunLe répertoire statique construit. Il nécessite une racine index.html.
--output FILEcheminnonrien n’est écritÉcrit aussi l’archive à ce chemin. Sans cela, la commande rapporte l’archive et la conserve en mémoire.
screenrig app pack ./lobby-board --output ./lobby-board.tgz

L’enveloppe rapporte sha256, compressed_bytes, expanded_bytes, file_count, la liste des entrées, et si le runtime SDK a été injecté. app upload emballe le répertoire lui-même, donc utilisez cette commande seulement si vous voulez inspecter d’abord l’archive.

Les applications s’exécutent sous une politique de sécurité de contenu qui bloque le code en ligne. L’empaquetage déplace les blocs de style et script en ligne dans des fichiers sous _screenrig/inline/ et les lie. Les gestionnaires d’événements en ligne tels que onclick= et javascript: URLs ne peuvent pas être déplacés ; l’empaquetage les refuse et nomme le fichier et la ligne.

app upload#

Emballez un répertoire, publiez-le comme nouvelle version d’application, et attendez que la publication réussisse.

app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]
ParamètreTypeRequisPar défautNotes
<directory>cheminouiaucunLe répertoire statique construit.
--name NAMEstringnonaucunNom de l’application, au maximum 120 caractères.
--no-waitbooleannondésactivéRetourner avant que l’opération de publication ne se termine. Exécutez operations wait avant d’épingler la version dans une liste de lecture.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
--timeout MSintegernon120000Date limite d’attente. Elle limite aussi chaque requête sous-jacente.
screenrig app upload ./lobby-board --name "Lobby board"

Lire trois champs : data.operation.state est succeeded, data.application.release_id est l’ID rel_ un application primitif pins, et data.application.id est l’ID app_ que les commandes kv utilisent. Une opération réussie, pas un ID de version seul, signifie que la version est utilisable.

Chaque app upload crée une nouvelle application et une première version immuable. Pour publier une version ultérieure de la même application, utilisez app update. Une playlist continue de servir la version qu’elle épingle déjà jusqu’à ce que vous modifiiez ce primitif.

app update#

Publier une nouvelle version d’une application existante, en conservant l’identité, le nom et les K/V de l’application.

app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’application app_.
<directory>cheminouiaucunLe répertoire statique construit.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
--no-waitbooleannondésactivéRetourner avant que l’opération de publication ne se termine. Exécutez operations wait avant d’épingler la version dans une liste de lecture.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board

Attendre data.operation.state: "succeeded", puis utiliser playlist replace-release pour examiner la page exacte, le primitif, la nouvelle version et les écrans affectés. Appliquer avec le jeton d’impact retourné et une garde de révision optionnelle comme décrit dans le flux de travail de la liste de lecture. Les épingles existantes de la liste de lecture restent inchangées jusqu’à l’application. En cas de conflit de révision, relire l’application avant de décider de réessayer ; ne pas créer une application de remplacement juste pour contourner le conflit.

app list#

Lister les applications du projet.

app list

Aucun paramètre.

screenrig app list

app show#

Lire une application.

app show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’application app_.
screenrig app show app_01EXAMPLEAPP00000000000

latest_ready_release est absent jusqu’à ce qu’une première publication soit prête. L’état de publication vit sur l’opération et la version, pas sur l’application.

app delete#

Supprimer une application et chacune de ses versions.

app delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’application app_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig app delete app_01EXAMPLEAPP00000000000

Il n’y a pas de suppression par version. Tant qu’un écran affiche une des versions de l’application, la suppression répond application_in_use : donnez d’abord un autre contenu à ces écrans. La suppression ne vérifie pas les playlists qui épinglent une version sans l’afficher, donc mettez à jour ou supprimez aussi ces playlists.

Clé/valeur d’application

Le stockage clé/valeur appartient à une application et est binaire-sûr. Chaque commande prend --app-id avec l’identifiant app_ de app upload, jamais un identifiant de version. Utiliser exactement un mode valeur par écriture.

kv list#

Lister les clés stockées pour une application.

kv list --app-id ID
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
screenrig kv list --app-id app_01EXAMPLEAPP00000000000

kv get#

Lire une clé.

kv get --app-id ID <key>
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
<key>stringouiaucunLa clé à lire.
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menu

kv set#

Écrivez une clé depuis JSON, un fichier ou des octets 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]
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
<key>stringouiaucunLa clé à écrire.
--json-value JSONstringun modeaucunUne valeur JSON, canoniquement formatée avant envoi, toujours stockée comme application/json. Un type de contenu application/json explicite est aussi accepté.
--file FILEcheminun modeaucunLire les octets de valeur depuis un fichier, ou stdin avec -. Par défaut application/octet-stream.
--value-base64 BASE64stringun modeaucunBase64 standard canonique rembourrée sans espaces, au maximum 1 398 104 caractères. Par défaut à application/octet-stream.
--content-type TYPEstringnonapplication/octet-stream pour les octetsDe un à 127 caractères.
--expect-rev REVISIONstringnonaucunÉcrivez seulement si l’entrée stockée est toujours à cette révision.
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'

kv delete#

Supprimer une clé.

kv delete --app-id ID <key> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
<key>stringouiaucunLa clé à supprimer.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu

Webhooks clé/valeur

Un webhook clé/valeur est une URL qui écrit une clé d’une application, donc tout système externe, comme un point de vente, un script de feuille de calcul ou un cron, pousse des données vers les écrans avec un POST HTTP. Une application qui s’abonne avec kv.onChange met à jour en quelques secondes chaque écran qui l’exécute. Une application peut avoir au maximum 20 webhooks.

L’expéditeur s’authentifie avec le secret du webhook, srkw_…, en tant que Authorization: Bearer <secret>, ou avec HTTP Basic utilisant l’identifiant du webhook comme nom d’utilisateur et le secret comme mot de passe ; un secret dans l’URL ou la chaîne de requête n’est jamais accepté. Le corps brut, au plus 1 Mio, devient la valeur de la clé et Content-Type son type de contenu. Chaque publication est une requête API facturée, mesurée et comptée vers le stockage comme kv set, augmente la révision, et répond avec les nouveaux métadonnées de la clé, jamais sa valeur. Un en-tête optionnel Idempotency-Key déduplique les nouvelles tentatives d’un expéditeur pendant 24 heures. Un webhook accepte au plus 120 publications par minute, et un secret manquant ou erroné ou un webhook inconnu répond 401. Envoyer des données d’un autre système a curl exemples.

Le secret est montré uniquement par kv webhook create et kv webhook rotate-secret. L’URL n’est pas secrète. La création, la rotation et la suppression d’un webhook ajoutent kv_webhook.created, kv_webhook.secret_rotated et kv_webhook.deleted au journal d’événements du projet, et chaque publication ajoute kv.updated comme toute écriture.

Code de problèmeSortieSens
kv_webhook_limit_reached5L’application a déjà 20 webhooks. Rien n’a été créé. Supprimez-en un d’abord.
not_found4L’application n’est pas dans ce projet, ou aucun webhook n’a cet identifiant.

kv webhook create#

Créer un webhook qui écrit une clé, et recevoir son URL et secret une seule fois.

kv webhook create <key> --app-id ID [--description TEXT]
ParamètreTypeRequisPar défautNotes
<key>stringouiaucunLa clé que chaque publication écrit, de 1 à 256 caractères : une lettre ou un chiffre en premier, puis des lettres, chiffres, ., _, :, / ou -. La clé n’a pas besoin d’exister encore.
--app-id IDstringouiaucunL’identifiant d’application app_.
--description TEXTstringnonaucunCe qui est envoyé, au maximum 200 caractères. Il ne doit pas contenir de justificatif.
screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"

L’enveloppe est le webhook : data.id (kvw_…), data.key, data.url (https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write) et data.secret (srkw_…). Saisissez l’URL et le secret dans le système d’envoi maintenant. Aucune commande ultérieure ne montre ce secret à nouveau.

kv webhook list#

Lister les webhooks d’une application, les plus anciennes d’abord.

kv webhook list --app-id ID
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000

Chaque élément possède id, key, description, url, created_at et, une fois écrit, last_used_at. Une liste ne contient jamais de secret.

kv webhook delete#

Supprimer un webhook. Son URL cesse de fonctionner immédiatement, et la clé conserve sa valeur.

kv webhook delete <webhook_id> --app-id ID
ParamètreTypeRequisPar défautNotes
<webhook_id>stringouiaucunL’identifiant de webhook kvw_.
--app-id IDstringouiaucunL’identifiant d’application app_.
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000

kv webhook rotate-secret#

Remplacer le secret d’un webhook et recevoir le nouveau une fois.

kv webhook rotate-secret <webhook_id> --app-id ID
ParamètreTypeRequisPar défautNotes
<webhook_id>stringouiaucunL’identifiant de webhook kvw_.
--app-id IDstringouiaucunL’identifiant d’application app_.
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000

L’enveloppe transporte le nouveau secret dans data.secret. L’ancien secret cesse de fonctionner immédiatement, donc saisissez le nouveau dans le système d’envoi.

Webhooks de carte

Un webhook de carte est une URL qui écrit le document de données d'une carte, de sorte qu'un système externe comme un CMS, un point de vente ou un script envoie des données à une carte avec un seul POST HTTP. kv webhook create, list, rotate-secret et delete acceptent --card CARD_ID à la place de --app-id; update et deliveries ci-dessous ne fonctionnent que sur les cartes. Une carte peut avoir au maximum 20 webhooks.

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 création d'un webhook de carte ne prend aucune clé. --map FILE (ou - pour stdin) est le mappage et --signing active la signature. La réponse contient data.secret et, si le webhook signe, data.signing_secret, chacun affiché une seule fois.

L'expéditeur s'authentifie comme pour un webhook d'application : Authorization: Bearer <secret> avec le secret srkw_…, ou HTTP Basic avec l'identifiant du webhook comme nom d'utilisateur, de sorte que https://kvw_ID:srkw_…@api.screenrig.ai/… convient à un expéditeur qui n'accepte qu'une URL. Le corps, d'au plus 1 Mio, est du JSON ou application/x-www-form-urlencoded ; un nom de formulaire répété devient un tableau. Sans mappage, l'objet envoyé est le document de données de la carte.

Un mappage est un modèle JSON qui construit le document à partir du corps. Une chaîne contenant des espaces réservés comme {{body.alert.title}} ou {{body.items[0].name}} est du texte, et une chaîne qui est exactement un espace réservé conserve le type de la valeur. Un chemin commence par body ou query (les paramètres de requête de l'URL), et un chemin qui ne contient rien est vide dans le texte et omet une valeur isolée. $each mappe un tableau avec item et index dans la portée, $group avec $by regroupe dans l'ordre de première apparition, $number lit 1,234.50, $3.50, 3,50 € ou 12% (ajoutez "$decimal": "," pour une virgule décimale), $bool lit true, yes, y, 1 et x, et $text avec $max tronque le texte. Le modèle est vérifié à l'enregistrement : invalid_request nomme l'endroit en cause.

{
  "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"}]}'

Chaque envoi est vérifié comme les données de la carte elle-même : card_data_invalid nomme le chemin et rien n'est écrit. Un document identique à celui de la carte répond unchanged et n'écrit rien, de sorte qu'aucun écran n'est réveillé. Un envoi accepté est une requête d'API facturée, un webhook accepte au maximum 120 envois par minute, et un en-tête Idempotency-Key déduplique les nouvelles tentatives d'un expéditeur pendant 24 heures.

Une mauvaise adresse, un secret erroné ou absent, un webhook désactivé, une signature absente ou erronée et chaque GET reçoivent la même réponse 404, de sorte qu'un aperçu de lien ou une supposition n'apprend rien. kv webhook deliveries en donne la raison.

Avec --signing, chaque envoi doit aussi porter ScreenRig-Signature: t=<unix seconds>,v1=<hex>, où v1 est le HMAC-SHA256 de t, d'un point et du corps brut sous le secret de signature whsec_…, et t doit être à moins de cinq minutes de l'horloge du serveur. C'est le format des signatures de webhook de screenRIG.

Signatures et poignées de main des fournisseurs

Les fournisseurs signent leurs envois à leur façon, et certains ne peuvent pas envoyer votre secret du tout. Un webhook de carte peut vérifier la signature du fournisseur à la place du secret et répondre à la poignée de main de configuration du fournisseur : GitHub, Stripe, Shopify, Slack, Linear, Vercel, Asana, Microsoft Graph, monday.com, Trello et Azure Event Grid y envoient donc directement, sans relais. Tout autre expéditeur qui signe avec HMAC fonctionne aussi. Définissez verify et handshake par l’API quand vous créez ou modifiez le webhook (POST /api/cards/{id}/kv-webhooks, puis PATCH /api/cards/{id}/kv-webhooks/{webhook_id}).

  • verify est {vendor, secret}, plus, pour generic_hmac, le header, l’encoding (hex ou base64), un timestamp_header et tolerance_seconds (300 par défaut). Un envoi qui porte la signature valide du fournisseur est accepté sans le secret srkw_ propre au webhook, qui continue de fonctionner à côté. Le secret du fournisseur est stocké chiffré et affiché seulement sous la forme set et ses quatre derniers caractères. Une modification qui envoie verify sans secret garde le secret stocké tant que le fournisseur reste le même, et verify: null supprime la vérification. verify et --signing s’excluent mutuellement.
  • handshake est microsoft_graph, monday, trello ou azure_event_grid, et null le supprime. Slack et Asana répondent à leurs propres poignées de main par verify.vendor.
verify.vendorEn-têteCe qui est signéHorodatage
githubX-Hub-Signature-256HMAC-SHA256 du corpsAucun
stripeStripe-SignatureHMAC-SHA256 de l’horodatage, d’un point et du corps ; n’importe quel v1 peut correspondre5 minutes
shopifyX-Shopify-Hmac-Sha256HMAC-SHA256 du corps, en base64Aucun
slackX-Slack-SignatureHMAC-SHA256 de v0:, de l’horodatage, de deux-points et du corpsX-Slack-Request-Timestamp, 5 minutes
linearLinear-SignatureHMAC-SHA256 du corpswebhookTimestamp dans le corps, 1 minute
vercelx-vercel-signatureHMAC-SHA1 du corpsAucun
asanaX-Hook-SignatureHMAC-SHA256 du corps, avec pour clé le X-Hook-Secret de la poignée de mainAucun
generic_hmacLe header que vous nommezHMAC-SHA256 du corps ou, avec un timestamp_header, de l’horodatage, d’un point et du corpstolerance_seconds

La clé de chaque HMAC est le texte du secret tel que le fournisseur l’affiche (celui de Stripe comprend whsec_). Une signature est vérifiée sur le corps exactement tel qu’il est arrivé, en temps constant, avant que l’envoi ne consomme du budget d’écriture, et elle est jugée avant son horodatage : timestamp_stale signifie toujours que le secret était le bon. Un corps peut être du JSON, un formulaire ou multipart/form-data, où un champ de texte est body.FIELD et où les fichiers sont comptés, non lus.

FournisseurscreenRIG répondEnvois suivants
Slack (verify.vendor slack)Le url_verification signé avec son challenge ; une personne qui teste avec curl peut envoyer le secret du webhook à la placeSignés avec le secret de signature
Asana (asana)Le X-Hook-Secret de la poignée de main, qu’il garde chiffré comme clé de chaque X-Hook-Signature. Le même secret de nouveau est une relance ; un secret différent est refusé avec handshake_invalidX-Hook-Signature
Microsoft Graph (microsoft_graph)Le ?validationToken= décodé comme text/plainPortent le secret du webhook
monday.com (monday)Le challenge qu’il envoie, renvoyé en JSONPortent le secret du webhook
Trello (trello)Une vérification HEAD répond 200 sans corps, pour ce webhook seulementPortent le secret du webhook
Azure Event Grid (azure_event_grid){"validationResponse": "CODE"}Portent le secret du webhook

Une poignée de main n’est traitée que pour un webhook configuré pour ce fournisseur, avant qu’aucun identifiant ne soit demandé, pour une requête qui est cette poignée de main, et jamais par un webhook désactivé. Elle n’écrit rien, n’est jamais facturée et ne consomme aucun budget de débit. Microsoft Graph, monday.com, Trello et Azure Event Grid n’envoient aucun en-tête que screenRIG vérifie : leurs envois ne sont donc acceptés qu’avec le secret du webhook. Azure Event Grid le transmet comme un en-tête de livraison statique, Authorization: Bearer srkw_…, marqué secret, et ses événements arrivent sous forme de tableau : un mappage lit donc body[0].

FournisseurDans les paramètres du fournisseur
GitHubSettings, Webhooks, Add webhook : l’URL de charge utile est le url du webhook, le type de contenu est application/json, et le même secret. Le ping de GitHub est signé et accepté
StripeWorkbench, Webhooks : ajoutez le url et affichez son secret de signature. Pendant que Stripe fait pivoter un secret, il envoie un v1 pour chacun et l’un ou l’autre est accepté ; remplacez ensuite le secret stocké par un PATCH
ShopifyAbonnez-vous avec le url au format JSON. Le secret est le secret client de l’application
SlackL’URL de requête de l’API Events est le url, et le secret est le secret de signature de l’application. Une commande à barre oblique envoie un formulaire : {{body.text}}, {{body.user_name}}
LinearDans les paramètres de l’API, créez un webhook avec le url et copiez son secret de signature. Le webhookTimestamp du corps doit se situer à une minute de l’horloge du serveur
VercelTeam settings, Webhooks : créez-en un avec le url. Vercel affiche le secret une seule fois
AsanaCréez le webhook avec {"verify": {"vendor": "asana"}} : il n’a pas encore de secret et refuse les événements avec secret_pending. Créez ensuite le webhook Asana avec target réglé sur le url, et la poignée de main définit le secret. Pour prendre un nouveau secret, PATCH avec verify à null, puis de nouveau avec le fournisseur
Microsoft GraphCréez l’abonnement avec notificationUrl réglé sur le url
monday.comExécutez create_webhook avec le url
TrelloPOST /1/webhooks avec callbackURL réglé sur le url
Azure Event GridCréez l’abonnement aux événements avec le url comme point de terminaison du webhook, et ajoutez l’en-tête de livraison ci-dessus
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 expéditeur qui signe avec son propre HMAC nomme l’en-tête, l’encodage et, s’il signe un horodatage, l’en-tête d’horodatage :

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"

Chaque échec donne le même 404 que tout autre refus. kv webhook deliveries montre la raison, et une poignée de main apparaît avec le résultat handshake :

RaisonSens
signature_missingverify est défini et l’envoi ne portait ni le secret ni l’en-tête du fournisseur
signature_invalidL’en-tête est mal formé ou ne correspond pas au corps
timestamp_missingLa signature exige un horodatage que l’envoi ne portait pas
timestamp_staleLa signature est valide et son horodatage est hors de la fenêtre
secret_pendingUne vérification Asana attend encore sa poignée de main
handshake_invalidLa requête est la poignée de main d’un fournisseur et ne peut pas recevoir de réponse

kv webhook update#

Modifier un webhook de carte : sa description, son mappage, son état activé ou sa signature.

kv webhook update <webhook_id> --card CARD_ID [--description TEXT] [--map FILE|-] [--clear-map]
                   [--enable|--disable] [--signing|--no-signing]
ParamètreTypeRequisPar défautNotes
<webhook_id>stringouiaucunL’identifiant de webhook kvw_.
--card CARD_IDstringouiaucunL'identifiant de carte crd_.
--description TEXTstringnonaucunCe qui est envoyé, au maximum 200 caractères. Il ne doit pas contenir de justificatif.
--map FILEcheminnonaucunRemplacer le mappage par un objet JSON lu depuis un fichier, ou - pour stdin.
--clear-mapbooleannondésactivéSupprimer le mappage : l'objet envoyé devient le document.
--enable / --disablebooleannondésactivé--disable répond à chaque envoi comme à un mauvais secret jusqu'à --enable.
--signing / --no-signingbooleannondésactivé--signing exige l'en-tête de signature et affiche le secret de signature une fois; --no-signing cesse de l'exiger.
screenrig kv webhook update kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --map alert-map.json

L'enveloppe est le webhook. data.signing_secret n'apparaît qu'une fois, dans la réponse qui a activé la signature.

kv webhook deliveries#

Lire le journal de livraison d'un webhook de carte, du plus récent au plus ancien, pour les sept derniers jours.

kv webhook deliveries <webhook_id> --card CARD_ID [--limit N]
ParamètreTypeRequisPar défautNotes
<webhook_id>stringouiaucunL’identifiant de webhook kvw_.
--card CARD_IDstringouiaucunL'identifiant de carte crd_.
--limit Nnumbernon100Nombre de livraisons à retourner, de 1 à 100.
screenrig kv webhook deliveries kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

Chaque élément a at, outcome (written, unchanged, refused, invalid ou handshake), reason (par exemple credentials, signature, disabled, body, mapping, card_data_invalid ou rate_limited), detail, status, bytes, revision et request_id. Aucun corps, en-tête ni identifiant n’est stocké, et un envoi à une mauvaise adresse ne laisse aucune ligne.

Listes de lecture

Une liste de lecture est un document JSON de pages. playlist init prépare un document plein écran à partir d’entrées ordonnées. playlist create et playlist update lisent ce document depuis un fichier ; la forme est résumée sous les commandes.

playlist init#

Préparer une liste de lecture plein écran modifiable à partir de fichiers médias locaux, d’ID médias prêts, d’ID de version d’application ou d’URL HTTP ou 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]
ParamètreTypeRequisPar défautNotes
<inputs...>fichiers, identifiants med_, identifiants rel_ ou URL HTTP ou HTTPSouiaucunOrdre de lecture. Les fichiers image/vidéo locaux sont téléversés et attendent la disponibilité sauf --no-transcode. Les médias existants doivent déjà être prêts. Les URL HTTP et HTTPS peuvent inclure des hôtes du réseau local et des identifiants intégrés et ne sont pas récupérées. L’application web du Player exige des URL HTTPS sans nom d’utilisateur ni mot de passe.
--name NAMEstringouiaucunNom d’affichage de la liste de lecture.
--output FILEcheminouiaucunÉcrivez le document {name, pages} modifiable. Les dossiers parents sont créés. Exclusif par défaut.
--overwritebooleannondésactivéRemplacer un fichier de sortie existant de manière atomique.
--screen-id IDstringnonaucunLire les dimensions et la révision de l’écran cible.
--target-width PX / --target-height PXintegerensemblenon définiRemplacer la taille du canevas. Les deux ou aucun. Obligatoire lorsqu’aucun écran n’est fourni ou que l’écran signale une surface inconnue ou multiple.
--duration-ms MSintegernon8000Durée pour les pages non vidéo.
--fitstringnoncontaincontain, cover ou fill pour les pages d’images et de vidéos. Les applications et iframes utilisent fill.
--no-transcodebooleannondésactivéOctets du fichier téléversé acceptés inchangés.
--no-progressbooleannondésactivéSupprimer la progression du téléversement sur stderr.
--poll-ms MSintegernon1000Intervalle de sondage de téléversement.
screenrig playlist init med_POSTER med_VIDEO --name "Lobby loop" --screen-id scr_LOBBY --output lobby.json

La préparation écrit le document local et peut téléverser des médias ; elle ne crée pas de liste de lecture distante et n’affecte aucun écran. Inspectez le document, puis screen publish. Voir Préparer, publier et modifier des listes de lecture.

playlist validate#

Validez un document de liste de lecture localement avant création ou mise à jour. Pas de réseau.

playlist validate <file>
ParamètreTypeRequisPar défautNotes
<file>cheminouiaucunLe document de la liste de lecture.
screenrig playlist validate ./lobby-loop.json

Les erreurs nomment des chemins JSON exacts. Une réussite signifie que la forme locale et la sémantique inter-champs sont valides ; l’autorisation, la disponibilité des médias, le nombre de sélecteurs dynamiques, les durées et la disponibilité distante nécessitent encore des vérifications serveur. Créer et mettre à jour effectuent cette vérification avant leur écriture. Le résultat porte aussi des constats de géométrie lint qui ne font pas échouer la vérification : motion_overuse, collision, safe_margin et adjacent_repeat. Pour voir à quoi ressemble une page, publiez-la et exécutez screen screenshot.

playlist create#

Créer une liste de lecture à partir d'un document JSON, d'un modèle ou du modèle intégré Avis urgent.

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]
ParamètreTypeRequisPar défautNotes
[file]cheminnonaucunLe document de la liste de lecture. Indiquez-le, ou --from-template, ou --starter.
--from-template IDstringnonaucunCréer la liste de lecture à partir de ce modèle (un id pl_) : ses pages actuelles avec les valeurs de --set, vérifiée comme toute liste de lecture.
--name NAMEstringavec --from-templateaucunLe nom de la nouvelle liste de lecture.
--set NAME=VALUEstringnonaucunAvec --from-template : la valeur d'un champ, l'id d'une image ou d'une vidéo prête pour un champ média. Répétable.
--dry-runbooleannondésactivéAvec --from-template : vérifier les valeurs et indiquer le nombre de pages sans rien créer.
--starter KEYstringnonaucunAjouter un modèle intégré : urgent-notice, un titre et un message pour les annonces rapides.
--format-region REGIONstringnonaucunheader, footer ou side : fait de la liste de lecture un bandeau tracé sur la page le long de ce bord, et remplace un format du fichier. Indiquez-le avec --format-orientation. Voir bandeaux.
--format-orientation ORIENTATIONstringavec --format-regionaucunlandscape ou portrait : l’orientation de l’afficheur pour lequel le bandeau est conçu, telle que la voit le spectateur.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig playlist create ./lobby-loop.json
screenrig playlist create --from-template pl_01EXAMPLETEMPLATE00000 --name "Monday notice" --set headline="Open late"

data.id de l'enveloppe est l'id pl_ que prend screen assign. Quand le changement attend une révision, data vaut {status: pending_review, review, playlist} : la liste de lecture existe avec approved_revision: 0, et aucun écran ne peut l'afficher tant qu'une personne n'a pas approuvé (playlist_not_approved). Un modèle est une liste de lecture qui déclare fields ; il n'est jamais affiché sur un écran (playlist_is_template), et une liste créée à partir de lui est une liste ordinaire, qu'on peut affecter, planifier et réviser.

playlist update#

Remplacer un document de liste de lecture.

playlist update <id> <file> [--format-region REGION --format-orientation ORIENTATION] [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de playlist pl_.
<file>cheminouiaucunLe document de remplacement.
--format-region REGIONstringnonaucunheader, footer ou side : fait de la liste de lecture un bandeau tracé sur la page le long de ce bord, et remplace un format du fichier. Indiquez-le avec --format-orientation. Voir bandeaux.
--format-orientation ORIENTATIONstringavec --format-regionaucunlandscape ou portrait : l’orientation de l’afficheur pour lequel le bandeau est conçu, telle que la voit le spectateur.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig playlist update pl_01EXAMPLEPLAYLIST000000 ./lobby-loop.json

Lorsque la modification attend une révision, la liste de lecture en direct continue de jouer sans changement jusqu'à ce qu'une personne approuve la proposition.

playlist show#

Lire une liste de lecture, y compris sa révision actuelle.

playlist show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de playlist pl_.
screenrig playlist show pl_01EXAMPLEPLAYLIST000000

Il retourne la version en direct. approved_revision est 0 pour une playlist qu'aucune personne n'a encore approuvée, et approval nomme la revue ouverte pendant qu'un changement attend ; reviews show ID retourne la proposition.

playlist list#

Lister les listes de lecture du projet.

playlist list [--templates] [--library]
ParamètreTypeRequisPar défautNotes
--templatesbooleannondésactivéSeulement les modèles : les listes de lecture qui déclarent des champs.
--librarybooleannondésactivéListe plutôt les listes de lecture de la Bibliothèque de l’organisation, en lecture seule : assignez-les à des écrans, des horaires et des piles, ou copiez-en une avec playlist create --from-template ; modifiez-les seulement dans le projet Bibliothèque.
screenrig playlist list --templates
screenrig playlist list --library

playlist fields#

Afficher les champs d'un modèle ou les valeurs d'une copie, ou modifier les valeurs et mettre la copie à jour.

playlist fields <id> [--set NAME=VALUE...] [--clear NAME...] [--refresh] [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'id pl_ d'un modèle ou d'une liste de lecture créée à partir d'un modèle.
--set NAME=VALUEstringnonaucunDéfinir la valeur d'un champ. Répétable.
--clear NAMEstringnonaucunEffacer la valeur d'un champ facultatif. Répétable.
--refreshbooleannondésactivéRecréer les pages à partir de la révision actuelle du modèle, quelles que soient les valeurs.
--expect-rev REVISIONstringnonaucunExiger facultativement cette révision de la ressource.
--note TEXTstringnonaucunUne note pour la personne qui examine le changement.
screenrig playlist fields pl_01EXAMPLECOPY00000000 --set headline="Closed today"

Sans option, il affiche les champs d'un modèle et le nombre de listes de lecture créées à partir de lui, ou les valeurs d'une copie, la révision du modèle dont elle est issue et si le modèle en a une plus récente. Chaque changement, et --refresh seul, recrée les pages de la copie à partir de la révision actuelle du modèle, ce qui permet à un changement de marque fait sur le modèle d'atteindre les copies existantes ; rien n'y est poussé automatiquement. Les valeurs sont vérifiées comme à la création. Avec l'accès Propose, un changement devient une révision.

playlist instances#

Lister les listes de lecture créées à partir d'un modèle et la révision du modèle dont chacune est issue.

playlist instances <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'id pl_ du modèle.
screenrig playlist instances pl_01EXAMPLETEMPLATE00000

outdated signale une liste de lecture créée à partir d'une révision plus ancienne du modèle ; playlist fields ID --refresh la remet à jour.

playlist revisions#

Lister les révisions d'une liste de lecture, la plus récente en premier.

playlist revisions <id> [--after CURSOR]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de playlist pl_.
--after CURSORstringnonaucunLe next_cursor de la page précédente.
screenrig playlist revisions pl_01EXAMPLEPLAYLIST000000

Chaque révision indique ce qui l'a créée (created, edited, promoted avec la révision copiée, ou baseline, la révision que la liste de lecture avait au début de son historique), qui l'a faite, quand, combien de pages elle contient et si elle est actuelle. Une page contient 50 révisions; next_cursor lit la suivante.

playlist revision show#

Lire une révision et la liste de lecture telle qu'elle était à ce moment.

playlist revision show <id> --revision N
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de playlist pl_.
--revision NintegerouiaucunLa révision à lire.
screenrig playlist revision show pl_01EXAMPLEPLAYLIST000000 --revision 3

playlist promote#

Rendre de nouveau actuelle une révision antérieure en la copiant comme nouvelle révision.

playlist promote <id> --revision N --expect-rev CURRENT
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de playlist pl_.
--revision NintegerouiaucunLa révision à copier.
--expect-rev CURRENTstringouiaucunLa révision actuelle de la liste de lecture (playlist show). Une valeur périmée est revision_conflict : relisez la liste de lecture et réessayez.
screenrig playlist promote pl_01EXAMPLEPLAYLIST000000 --revision 3 --expect-rev 9

Les pages, la bande sonore et le format de la révision deviennent la révision suivante. Le nom reste le même, les révisions précédentes restent dans la liste et chaque écran qui affiche la liste de lecture se met à jour. La promotion exige un identifiant qui publie en direct; un identifiant dont les changements attendent une révision obtient forbidden. Une révision dont le contenu est déjà actuel ne change rien.

playlist delete#

Supprimer une liste de lecture.

playlist delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de playlist pl_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig playlist delete pl_01EXAMPLEPLAYLIST000000

playlist export#

Exportez les fichiers image et vidéo, l’audio de la bande sonore et les URL d’iframe dans un paquet de liste de lecture portable.

playlist export <id> --output DIRECTORY [--skip-applications]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de playlist pl_.
--output DIRECTORYcheminouiaucunRépertoire de destination. Il ne doit pas déjà exister ; le paquet est écrit via un frère temporaire et renommé en place.
--skip-applicationsdrapeaunondésactivéSupprimez les primitives d’application et les pages vides ou contrôlées par une application. Au moins une page doit rester. Le résultat indique les identifiants des primitives et des pages ignorées.
screenrig playlist export pl_01EXAMPLEPLAYLIST000000 --output ./lobby-bundle

Le paquet contient un manifeste, le document de liste de lecture et des fichiers image, vidéo et audio de bande sonore adressés par leur contenu. Les sélecteurs dynamiques all, tag et folder sont figés sur des identifiants exacts, les URL d’iframe sont conservées et les commentaires sont exclus.

Les cartes, les flux et les pages adslot arrêtent l’exportation avant le téléchargement des médias. Les applications l’arrêtent aussi par défaut; --skip-applications supprime les primitives d’application ainsi que les pages vides ou contrôlées par une application, et indique les identifiants des primitives et des pages ignorées. Au moins une page doit rester. Les cartes, les flux et les pages adslot arrêtent toujours l’exportation avec cette option.

Pour obtenir un document modifiable qui conserve les références aux cartes et aux applications, utilisez screenrig playlist show pl_01EXAMPLEPLAYLIST000000 --output playlist.json. Le document utilise les ressources existantes du même projet.

playlist import#

Créer une liste de lecture à partir d’un répertoire bundle, ou en mettre à jour une existante à partir de celui-ci.

playlist import <directory> [--name NAME] [--update ID [--expect-rev REVISION] [--note TEXT]]
ParamètreTypeRequisPar défautNotes
<directory>cheminouiaucunUn répertoire de bundle écrit par playlist export.
--name NAMEstringnonle nom de la playlist du bundle1 à 120 caractères. Importer le paquet comme une nouvelle liste de lecture sous ce nom.
--update IDstringnonune nouvelle liste de lecture est crééeMettre à jour cette pl_ liste de lecture au lieu d’en créer une nouvelle. Accepte --expect-rev optionnel.
--expect-rev REVISIONstringnonaucunLa révision actuelle de la liste de lecture de destination.
--note TEXTstringnonaucunAvec --update : une note pour la personne qui révise la modification, au maximum 280 caractères.
screenrig playlist import ./lobby-bundle
screenrig playlist import ./lobby-bundle --name "Lobby loop (copy)"

Les noms d’affichage des listes de lecture peuvent se répéter. L’import crée une liste de lecture distincte même si son nom correspond ; utilisez --update avec un ID pour remplacer une liste de lecture existante.

L’importation valide localement l’ensemble du paquet avant qu’il ne touche le projet : manifeste, document, chemins, types de médias, longueurs et hachages. Les médias existants sont réutilisés si le nom de fichier, le type de média, la longueur en octets, le hachage et la balise correspondent exactement ; les autres sont téléversés sans conversion, et la liste de lecture est écrite seulement après que chaque objet est prêt.

L’importation ne supprime ni n’élague jamais les médias distants. Si une étape ultérieure échoue après le début d’un téléversement, l’erreur liste les objets confirmés prêts et indique si l’écriture de la liste de lecture a commencé. Réessayer le même paquet réutilise ces objets.

Le document de la liste de lecture

Une liste de lecture est name plus pages, avec une bande sonore audio optionnelle. Chaque page porte id, canvas, transition, advance, visibility optionnel, audio_cue optionnel, et primitives.

Un modèle ajoute fields au document, [{name, label, type, required, max_length?}] avec type valant text, media ou url, et peut marquer toute primitive locked: true. Une page lit un champ sous la forme {field.NAME} dans les params d'une carte (champs texte et adresse), comme selector.media_id d'une image ou d'une vidéo (un champ média) ou comme src entier d'un iframe (un champ adresse). Chaque jeton doit nommer un champ déclaré du bon type, chaque champ doit être lu, et une primitive verrouillée n'en lit aucun ; playlist validate le vérifie hors ligne. Seul le propriétaire ou un membre qui peut approuver modifie une primitive verrouillée (primitive_locked).

Les six primitives sont image, video téléversé, stream en direct, iframe et application web, et card. Le texte et l’habillage ne sont pas des types du protocole : placez une carte (card) pour du texte en direct, ou téléversez une image fixe terminée (media generate en produit une) et placez-la comme image.

Un flux prend une ou deux sources ordonnées avec des protocoles uniques et une image prête du même projet comme fallback_media_id. Utilisez au plus un flux par page et avance basée sur la durée. HLS utilise une URL HTTPS publique; les Players Android et Qt se connectent directement aux flux RTSP des caméras, identifiants compris. Consultez les détails des transports de caméra pour les formats d’URL ouverts par chaque Player; le multicast direct UDP/MPEG-TS en option sur Android et Qt utilise un groupe IPv4 dans 239/8 et un port. Une source peut ne donner que son url et laisser le schéma nommer le protocole. Les autres Players sélectionnent l’alternative HLS ou affichent le fallback. Les octets du flux ne sont pas mis en cache pour la relecture. L’audio est muet par défaut. L’importation et l’exportation de paquet de liste de lecture ne supportent pas les flux.

{
  "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"
}

Utilisez ce primitif sur une page avec advance: {"mode":"duration","after_ms":30000}. Remplacez le flux d’exemple et l’ID de secours. Exigences du lecteur et configuration du transport.

Chaque primitif est plat : id, primitive, les champs propres à ce primitif, puis rect, layer, content_fit et optionnellement enter. Il n’y a pas d’objet contenu imbriqué.

Les primitives image et vidéo exigent un selector. selector.by est id avec un media_id prêt et one_at_a_time false, ids avec 1 à 1 024 media_ids prêts uniques, all pour chaque objet prêt de cette primitive, tag correspondant à ^[A-Za-z0-9]{1,32}$, ou folder avec le folder_id d’un dossier multimédia mfd_ existant, qui lit directement les fichiers prêts qu’il contient et aucun de ses sous-dossiers. Ne mettez pas media_id sur la primitive elle-même et n’envoyez pas d’éléments résolus par le serveur. Une primitive application épingle un release_id et une primitive iframe prend un src et un titre, donc aucune des deux n’accepte de sélecteur. src est n’importe quelle page http ou https que l’écran peut atteindre, y compris une page de réseau local ou derrière une connexion ; un lien YouTube est stocké sous forme de son intégration à lecture automatique. src, et le fallback_src facultatif d’un iframe, peuvent porter des jetons d’écran comme {screen.field.kiosk_id}, et une primitive application peut porter params avec les mêmes jetons, de sorte qu’une seule liste de lecture donne à chaque écran sa propre page. Les Players Android, Amazon Signage Stick, Linux, Raspberry Pi et Windows ouvrent la page elle-même. L’application Web du Player et les Players macOS, Samsung Tizen, LG webOS et BrightSign l’encadrent, donc une page qui envoie X-Frame-Options (DENY, SAMEORIGIN ou l’obsolète ALLOW-FROM), ou une liste Content-Security-Policy frame-ancestors sans l’origine du Player, y affiche un cadre bloqué, et l’application Web du Player n’affiche que des pages https sans connexion dans l’adresse. Lorsque la publication détecte une page HTTPS publique qui refuse l’encadrement, l’écriture réussit quand même et la CLI affiche l’entrée warnings du serveur : le code iframe_framing_refused, le page_id, primitive_id et src, l’en-tête qui a refusé, et la prochaine étape (utilisez une page qui autorise l’encadrement depuis l’origine du Player, ou demandez à son propriétaire d’autoriser cette origine). Le serveur ajoute aussi un avertissement playlist.iframe_framing_refused au journal des événements, un par page qui refuse, que events list affiche avec primitive_id. Une page de réseau local, une page http et une page que le serveur ne peut pas joindre en quelques secondes ne sont pas vérifiées. Un Player signale une liste de lecture comme en cours de lecture dès que son manifeste est à l’écran, donc une publication vérifiée ne prouve pas qu’une page iframe s’est affichée : agissez sur l’avertissement, ou regardez l’écran. Les deux primitives Web exigent content_fit de fill, parce qu’aucune n’a de taille intrinsèque.

advance.mode est duration avec after_ms, qui sur une page contenant exactement une vidéo YouTube (ni liste de lecture ni direct) peut aussi porter until réglé sur video_end pour que la page dure jusqu’à la fin de la vidéo et que after_ms soit le temps d’affichage quand l’écran ne peut pas lire la durée de la vidéo, media_end sur une page avec exactement une primitive image ou vidéo, audio_end sur une page dont le audio_cue nomme une piste sonore, ou application avec max_ms lorsque l’application termine son propre tour en appelant window.screenrig.nextPage(). Une page application nécessite exactement une primitive marquée controller ; tout autre mode l’interdit.

transition.type est l’un de 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 ou stinger. duration_ms est requis, de 0 à 60000. La page par défaut est un fondu enchaîné de 200 ms. Balayer déplace les deux pages ensemble comme un carrousel. Glisser fait glisser la page entrante sur la page sortante, qui dérive d’un quart de la distance. Essuyer découvre la page entrante derrière un bord dur en mouvement. Plonger fait fondre la page sortante vers une couleur unie puis vers la page entrante ; color est un #RRGGBB optionnel, par défaut #000000, et n’est valide que sur dip. Les noms de direction indiquent la direction du mouvement : wipe-left est un bord se déplaçant vers la gauche. ease est optionnel : linear, in, out ou in-out ; la valeur par défaut est linear pour crossfade et swipe-* et in-out pour dip, wipe-* et slide-* ; il n’est pas permis sur stinger. La page entrante possède sa transition. La première page d’une liste de lecture ne joue aucune transition.

Un stinger est un graphique thématique plein cadre qui couvre la page sortante, échange la page entrante pendant que l’écran est couvert, puis la découvre. Utilisez-le pour nommer une section d’une liste de lecture : placez-le sur la première page de la section. L’objet stinger est requis pour type: "stinger" et interdit sur les autres types. Tous ses membres sont optionnels. theme est l’un de neomustard (par défaut), cyanotype, propaganda, signal, avant-garde, bloom ou primetime, et correspond aux thèmes de carte. title fait jusqu’à 40 caractères et subtitle jusqu’à 60, définis dans le type d’affichage du thème. logo est media: plus l’identifiant d’une image prête dans le projet, par exemple media:med_01EXAMPLE. accent est un #RRGGBB optionnel qui remplace l’accent du thème. duration_ms pour un stinger est entre 2000 et 6000 et couvre tout le bumper ; les durées typiques vont de 2700 à 4000. Le titre reste entièrement affiché pendant hang_ms, de 0 à 6000, par défaut 1000 (une seconde), et hang_ms est au maximum 60 % de duration_ms ; un maintien plus long nécessite un duration_ms plus long. Un Player incapable d’afficher un stinger joue un fondu enchaîné de même durée. Consultez la page en direct Carte Stinger pour voir la transition.

L’exemple suivant montre une transition de page stinger :

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

Un objet enter optionnel sur un primitif ajoute une animation d’objet : fade-up, fade-down, fade-left, fade-right, fade-in, zoom-in ou zoom-out.

Un objet page visibility optionnel limite quand la page joue : un booléen enabled requis, des limites civiles optionnelles from et until, et jusqu’à 16 windows récurrents de jours et heures civiles. Chaque liste de lecture garde au moins une page sans champ visibility du tout, et un écran exécutant une liste de lecture programmée a besoin d’un fuseau horaire. Définissez d’abord ce fuseau horaire ; screen assign et playlist update refusent localement sans celui-ci et nomment la commande qui le corrige.

Une condition visibility.data de page, {key, path?, equals?}, n’affiche la page que tant qu’un document de données de carte correspond : key est une clé de données de carte ou un ID de carte, path un pointeur RFC 6901 dans le document, et equals une chaîne, un nombre, un booléen ou null (omettez-le pour tester que la valeur existe). La clé {screen.weather} lit la météo à l’emplacement propre de chaque écran, que screen update ID --location LAT,LON définit : {"enabled":true,"data":{"key":"{screen.weather}","path":"/condition","equals":"rain"}} n’affiche la page que lorsqu’il pleut là où se trouve cet écran. Le document météo contient condition (clear, cloud, fog, rain, snow, storm ou wind), band (freezing sous 0 °C, cold de 0 à 9, mild de 10 à 17, warm de 18 à 24, hot à partir de 25), temperatureC en degrés entiers et isDay. C’est la météo actuelle de la cellule de 0,25 degré de l’écran, actualisée environ toutes les heures, et non une prévision. Un écran sans emplacement n’affiche jamais la page, et la publication refuse un path ou un equals que le document ne peut pas contenir, comme cloudy pour cloud. Gardez une page ordinaire sans visibility comme page de repli.

Un objet audio optionnel de premier niveau ajoute une bande sonore qui joue continuellement pendant que les pages changent. tracks liste de 1 à 128 entrées dans l’ordre de lecture, chacune avec un id unique (le motif d’ID de page) et le media_id d’un objet média audio prêt. loop par défaut est true et redémarre à la première piste après la dernière ; volume par défaut est 1 et varie de 0 à 1, multiplié par le volume du Player ; cued par défaut est false, et true arrête la bande sonore après chaque piste pour qu’une piste joue seulement quand une page audio_cue la démarre. Une page ordinaire peut porter audio_cue avec un ID track de cette liste et un booléen restart optionnel (par défaut false) : quand la page apparaît, le Player passe à cette piste depuis son début, la redémarrant seulement si elle joue déjà et que restart est true. Les repères sont des indices, les pages d’emplacement publicitaire ne peuvent pas les porter, et un repère sans bande sonore est rejeté. Une page avec advance {"mode":"audio_end"} se termine quand la piste nommée par son audio_cue se termine, donc elle requiert ce repère et une bande sonore, ne prend pas de after_ms, et suit les règles duration pour les primitifs image et vidéo ; un primitif stream a toujours besoin d’une page duration, et une application sur la page n’est jamais son contrôleur ; max_ms est un indice optionnel que le serveur remplace. playlist update remplace tout le document, donc omettre audio supprime la bande sonore. Création de bande sonore.

Cartes

Découvrez les types de cartes, créez une instance et mettez à jour ses données en direct. Une liste de lecture place l’identifiant de carte retourné.

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

Écrans

Un écran est un lecteur. Ces commandes le lisent, le pointent vers une liste de lecture et gèrent sa vie. Les préconditions de révision sont optionnelles sur les écritures.

Les étiquettes regroupent les écrans en flottes. Chaque écran porte de 0 à 16 étiquettes uniques de 1 à 32 lettres ou chiffres, définies avec screen tag. screen assign, screen reload, screen toast, screen tag et screen screenshot prennent un identifiant d’écran, plusieurs identifiants ou --tag TAG, et une réponse de flotte rapporte chaque écran : voir Résultats de flotte.

Les dossiers d’écrans regroupent les écrans par lieu, un dossier par écran. Une commande de flotte accepte aussi --folder ID : voir Dossiers d’écrans.

screen pair#

Associez un Player avec le code affiché sur son écran.

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

screen list#

Lister les écrans. Les écrans archivés sont omis sauf demande contraire.

screen list [--state archived] [--tag TAG] [--folder ID|root]
ParamètreTypeRequisPar défautNotes
--statestringnonécrans actifsLa seule valeur acceptée est archived, qui liste uniquement les écrans archivés.
--tag TAGstringnonchaque écranListe uniquement les écrans portant cette étiquette exacte.
--folder ID|rootstringnonchaque écranListe uniquement les écrans directement dans ce dossier d’écrans sfd_, pas ceux de ses sous-dossiers, ou avec root uniquement les écrans hors de tout dossier.
screenrig screen list --tag Lobby
screenrig screen list --folder sfd_01EXAMPLEFOLDER000000000

Chaque ligne comporte le tags de l’écran. Avec --human, le tableau ajoute une colonne TAGS lorsque un écran listé possède des étiquettes.

screen show#

Lire un écran, y compris révision, affectation et état de vie.

screen show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
screenrig screen show scr_01EXAMPLESCREEN00000000

tags liste les étiquettes de flotte de l’écran. effective_playlist, takeover et playlist_schedule rapportent ce que l’écran joue et pourquoi ; voir Horaires et prise de contrôle. health et les capacités hôtes du Player sont dans Santé et alimentation de l’appareil. online est vrai tant qu’un Player est connecté, incluant une courte fenêtre de reconnexion. Les last_online_at et last_ip optionnels apparaissent après la première connexion. observation optionnel rapporte les surfaces qu’un Player a peintes : id, width, height, pixel_ratio et presentation. Tous ces éléments sont en lecture seule ; screen update ne peut pas les envoyer, et un écran archivé retourne toujours sa ligne.

commands liste les 10 derniers redémarrages, rechargements, vidages de cache, redémarrages d’application et mises à jour de l’écran, du plus ancien au plus récent, chacun avec son type, son state (queued, sent, done, failed, expired, cancelled ou superseded), son source (schedule pour un redémarrage émis par un horaire de redémarrage; absent pour un redémarrage demandé par une personne), son expires_at, et le moment où il a été envoyé ou effectué. reboot_schedule et next_reboot_at indiquent l’horaire de redémarrage de l’écran et le début de sa prochaine fenêtre de redémarrage. Un vidage de cache, un redémarrage d’application ou une mise à jour que le Player a terminé porte aussi son cause et un court detail, que --human affiche dans une colonne CAUSE et une ligne sous le tableau. suspension porte le message et le since d’un écran suspendu. Un écran archivé par screen replace indique replaced_by, l’écran vers lequel son appareil a été déplacé. Avec --human, screen show affiche chacun d’eux.

last_outage indique la dernière panne de l’écran : offline_since, back_at et duration_s, et, une fois qu’un rapport de santé la détermine, une likely_cause parmi device_restart, app_crash, app_restart, network ou platform ; elle est absente lorsque screenRIG ne peut pas la déterminer. Un redémarrage est établi dès le retour de l’écran, tandis qu’une cause réseau ou screenRIG attend le prochain rapport de santé du Player, qui peut prendre jusqu’à quinze minutes. glass porte les verdicts que screenRIG a tirés des rapports de lecture et des captures d’écran. Avec --human, screen show affiche Last outage et Likely cause, ainsi que Playlist stalled, Blank screen ou Frozen picture pour un verdict qui a trouvé un problème ; Notifications précise ce que les verdicts laissent de côté.

screen update#

Modifiez le nom, l’affectation de la liste de lecture ou le fuseau horaire d’un écran en un seul appel.

screen update <id> [--name NAME] [--playlist-id ID] [--timezone ZONE] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--name NAMEstringnoninchangéNom d’écran pour l’écran.
--playlist-id IDstringnoninchangéLa playlist pl_ que cet écran doit exécuter.
--timezone ZONEstringnoninchangéUn identifiant de zone IANA tel que America/Los_Angeles. Validé contre la base de données de zones du serveur. Un patch ne supprime jamais une zone.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen update scr_01EXAMPLESCREEN00000000 --name "Lobby"

En révision, un changement de --playlist-id seul est proposé comme screen assign ; une session Proposer ne peut pas modifier les autres champs.

screen publish#

Créer une nouvelle liste de lecture à partir d’un fichier préparé et l’assigner à un écran.

screen publish <id> <file> [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
<file>cheminouiaucunLe document de liste de lecture préparé, ou - pour stdin.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision de l’écran. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig screen publish scr_LOBBY lobby.json

Cela crée une nouvelle liste de lecture et l’assigne. Cela ne met pas à jour une liste de lecture existante par nom. Inspectez d’abord le document préparé. Répétez la même entrée pour reprendre un échec ambigu. La relecture de l’assignation ne prouve pas la lecture ; demandez une capture d’écran séparément. En cours d’examen, il retourne stage: pending_review avec les deux examens. Voir Préparer, publier et modifier des listes de lecture.

screen assign#

Dirigez un écran, ou une flotte d’écrans, vers une liste de lecture.

screen assign (<id>... | --tag TAG) --playlist-id ID [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_. Plusieurs IDs s’exécutent comme une seule requête de flotte.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--playlist-id IDstringouiaucunLa playlist pl_ à exécuter.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle. Omettez pour écrire la ressource courante. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig screen assign scr_01EXAMPLESCREEN00000000 --playlist-id pl_01EXAMPLEPLAYLIST000000
screenrig screen assign --tag Lobby --playlist-id pl_01EXAMPLEPLAYLIST000000

Si la liste de lecture programme une page et que l’écran n’a pas de fuseau horaire, le CLI refuse avant d’envoyer quoi que ce soit et nomme la commande screen set-timezone à exécuter. Aucune révision n’est consommée par ce refus. Dans une flotte, chaque écran applique cette règle indépendamment : un écran sans fuseau horaire échoue dans son résultat et les autres sont assignés.

Pour publier sur une flotte, créez la liste de lecture une fois avec playlist create, puis exécutez screen assign --tag TAG --playlist-id ID. screen publish cible un écran.

screen set-timezone#

Définir le fuseau horaire civil dans lequel une liste de lecture programmée est lue.

screen set-timezone <id> --timezone ZONE [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--timezone ZONEstringouiaucunUn identifiant de zone IANA tel que Europe/Berlin.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen set-timezone scr_01EXAMPLESCREEN00000000 --timezone America/Los_Angeles

Les horaires de page sont des heures civiles, donc sans zone ils sont sans signification. Changer la zone recrée la révision du manifeste.

screen archive#

Masquer un écran et assombrir sa vitre.

screen archive <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen archive scr_01EXAMPLESCREEN00000000

L’archivage masque l’écran de la liste par défaut et assombrit la vitre. Il ne désassocie pas le lecteur.

screen unarchive#

Restaurer un écran archivé dans la liste par défaut.

screen unarchive <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen unarchive scr_01EXAMPLESCREEN00000000

Un Lecteur peut aussi archiver son propre écran : une réinitialisation confirmée sur un Lecteur qui détient une clé, ou le déjumelage d’un Lecteur navigateur jumelé par cookie. screen show rapporte alors archive_reason comme device_reset ou device_unpair (project pour une archive que vous demandez), avec archived_at. L’écran conserve son lien d’appareil pour toutes les raisons, donc un Lecteur qui détient encore cette clé ou ce cookie d’appareil reste sombre et reprend à la désarchivation sans nouveau jumelage. Le Lecteur réinitialisé ou déjumelé perd sa clé ou son cookie et se jumelle à nouveau comme un nouvel écran. Une clé remplacée par une récupération d’écran confirmée reste retirée.

Un écran archivé comme replaced par screen replace ne conserve aucun lien d’appareil, donc la désarchivation le refuse et screen delete le supprime.

screen suspend#

Afficher un avis sur un écran à la place de son contenu, jusqu’à sa reprise.

screen suspend <id> --message TEXT [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--message TEXTstringouiaucunL’avis que l’écran affiche : de 1 à 280 caractères après suppression des espaces. Le saut de ligne est le seul caractère de contrôle, et le Player renvoie le texte à la ligne et conserve ses sauts de ligne.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen suspend scr_01EXAMPLESCREEN00000000 --message "Closed for stocktake. Back at 9am."

Un écran suspendu affiche le message à la place de son contenu. Rien d’autre ne change : sa liste de lecture, son horaire, sa prise de contrôle et le contrôle de l’afficheur restent en place et continuent d’évoluer, et screen resume montre ce que l’écran afficherait en ce moment. screen show rapporte suspension avec le message et le since ; suspendre un écran déjà suspendu remplace le message et conserve since. La suspension augmente la révision de l’écran, et le Player récupère ses données à nouveau immédiatement. Un écran archivé répond screen_archived.

screen resume#

Mettre fin à la suspension d’un écran pour qu’il affiche de nouveau son propre contenu.

screen resume <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen resume scr_01EXAMPLESCREEN00000000

La reprise affiche de nouveau le contenu propre de l’écran, à partir de ce que l’écran afficherait en ce moment, et le Player récupère ses données à nouveau immédiatement. Un écran qui n’est pas suspendu répond inchangé, sans changement de révision. Un écran archivé répond screen_archived.

screen delete#

Supprimer un écran.

screen delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen delete scr_01EXAMPLESCREEN00000000

Supprimer enlève un écran uniquement tant qu’aucune clé de Player n’y est liée, et screen show rapporte deletable: true pour cet écran. Un Player qui se jumelle par code, Player natif ou Player navigateur, détient une clé, et cette clé reste liée à son écran : supprimer cet écran répond 409 screen_archive_required (code de sortie 5) ; archivez-le plutôt. Seul un Player navigateur jumelé par cookie ne détient aucune clé, et son écran se supprime qu’il soit jumelé ou encore en attente.

screen replace#

Déplacer l’appareil jumelé en tant qu’autre écran vers cet écran, en conservant les paramètres et l’historique de cet écran.

screen replace <id> --with ID [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’écran scr_ à conserver.
--with IDstringouiaucunL’écran scr_ dont l’appareil jumelé prend le relais. Ce doit être un autre écran du projet.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision de l’écran à conserver. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen replace scr_01EXAMPLESCREEN00000000 --with scr_01EXAMPLENEWSCREEN000000

Jumelez d’abord le nouveau matériel comme un écran distinct, puis remplacez. La clé de l’appareil, ou l’identifiant d’un Player navigateur, ouvre désormais <id>, qui conserve son nom, ses étiquettes, son fuseau horaire, sa liste de lecture, ses horaires, sa prise de contrôle, son horaire d’affichage et sa substitution, son mur vidéo, ses commentaires, ses champs, son emplacement et son historique, et reprend l’hôte et le Player de l’écran de remplacement. Sa santé, son statut, son stockage et ses commandes en file d’attente repartent de zéro. L’écran nommé par --with est archivé avec archive_reason replaced et replaced_by nommant <id>. Il ne conserve aucun lien d’appareil, donc screen unarchive ne peut pas le restaurer et screen delete le supprime. La clé que <id> détenait est retirée après une période de grâce de quinze minutes, puis son ancien appareil est refusé. Les deux écrans doivent être actifs avec un Player jumelé : un écran toujours en attente de jumelage répond resource_conflict, un écran archivé répond screen_archived, et un mur vidéo nécessite un Player de remplacement qui déclare display.wall (wall_unsupported). La requête porte toujours une clé d’idempotence, et une nouvelle tentative exacte renvoie la réponse originale.

screen rotate-public-id#

Émettre un nouvel ID public pour un écran.

screen rotate-public-id <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen rotate-public-id scr_01EXAMPLESCREEN00000000

screen reload#

Demander au lecteur d’un écran, ou à tous les lecteurs d’une flotte, de recharger une fois.

screen reload (<id>... | --tag TAG) [--expires-in DURATION] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_. Plusieurs IDs s’exécutent comme une seule requête de flotte.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--expires-in DURATIONstringnon24h, appliqué par le serveurDurée pendant laquelle la requête attend qu’un écran hors ligne revienne en ligne : 90s, 30m, 2h ou 1d, de 60s à 24h.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen reload scr_01EXAMPLESCREEN00000000
screenrig screen reload scr_01EXAMPLESCREEN00000000 --expires-in 2h
screenrig screen reload --tag Lobby

La réponse porte un reload_id, un state et un expires_at. Un écran en ligne reçoit le rechargement immédiatement (state sent) ; un écran hors ligne le conserve queued et le reçoit lorsqu’il revient en ligne avant expires_at, soit 24 heures après la requête sauf indication contraire de --expires-in. Un rechargement plus récent remplace celui qui est toujours en file d’attente ; screen show liste les commands de l’écran, et screen command cancel annule celui qui est toujours en file d’attente. Dans une flotte, le reload de chaque résultat porte le même state. Un lecteur web recharge à sa prochaine limite de page ; un lecteur natif se reconnecte, récupère son manifeste et vérifie une mise à jour. Un lecteur ignore un rechargement dans les dix minutes suivant le dernier traité. Le rechargement fonctionne sur écrans actifs et archivés et ne change pas la révision de l’écran.

screen toast#

Publiez un message transitoire comme chrome de scène sur un écran en direct ou une flotte.

screen toast (<id>... | --tag TAG) --text TEXT [--level info] [--duration-ms MS]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_. Plusieurs IDs s’exécutent comme une seule requête de flotte.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--text TEXTstringouiaucunDe un à 120 caractères, saut de ligne comme seule coupure, au plus trois lignes.
--level LEVELstringnoninfoinfo, alert ou error. Le Player hébergé affiche des notifications d’erreur. Info et alerte sont des niveaux de diagnostic qui peuvent être supprimés ; le succès d’une commande n’établit pas la visibilité.
--duration-ms MSintegernon10 000, appliqué par le serveurEntre 2000 et 60000 si fourni.
screenrig screen toast scr_01EXAMPLESCREEN00000000 --text "Lobby closed"
screenrig screen toast --tag Lobby --text "Closing in ten minutes"

Un toast n’est pas un primitif : il n’occupe aucun emplacement de canevas, n’a pas de couche, et ne participe pas à la préparation ou au fondu. Le dernier l’emporte, il n’y a pas de file d’attente ni d’annulation, et l’enveloppe acceptée est { expires_at } seulement. Ne mettez jamais d’identifiants ou autre matériel secret dans le texte.

screen identify#

Afficher le nom d’un écran par-dessus son contenu pendant un moment, pour le repérer sur place.

screen identify <id> [--duration DURATION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--duration DURATIONstringnon60s, appliqué par le serveurDurée pendant laquelle la superposition reste affichée, comptée à partir du moment où le Player reçoit la requête : 30s, 2m ou 1m30s, de 2s à 10m.
screenrig screen identify scr_01EXAMPLESCREEN00000000
screenrig screen identify scr_01EXAMPLESCREEN00000000 --duration 2m

Le Player dessine une superposition plein écran au-dessus de son contenu, avec le nom de l’écran en très grand et son ID en petit au-dessous. La lecture se poursuit par-dessous, et une identification plus récente remplace la superposition. L’enveloppe acceptée porte identify_id, duration_ms et un expires_at à 60 secondes après la requête, de sorte qu’un écran hors ligne ne l’affiche jamais plus tard. Seul un Player qui déclare la capacité identify affiche la superposition : tout autre écran répond 409 identify_unsupported (code de sortie 5) et rien n’est envoyé, donc mettez à jour le Player ou affichez le nom avec screen toast. Un écran archivé répond screen_archived et un écran toujours en attente de jumelage répond resource_conflict. L’identification ne change pas la révision de l’écran.

screen screenshot#

Capturez une image fixe d’un écran actif, ou de chaque écran d’une flotte, et enregistrez-la sur disque.

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]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette, sans limite de nombre d’écrans.
--output FILEcheminnon./<id>.webpPour un écran, un chemin de fichier ; un fichier existant est écrasé sans invite. Pour plusieurs identifiants ou --tag, un répertoire, créé s’il manque, qui reçoit un <screen_id>.webp par écran.
--concurrency Nintegernon4Captures en cours simultanées pour plusieurs identifiants ou --tag, de 1 à 8.
--timeout MSintegernon35000Durée d’attente pour la capture.
--poll-ms MSintegernon500Intervalle entre les sondages de statut de capture.
screenrig screen screenshot scr_01EXAMPLESCREEN00000000 --output ./lobby.webp
screenrig screen screenshot --tag Lobby --output ./lobby-shots

La commande bloque jusqu’à ce que le WebP soit sur disque ; il n’y a pas de --no-wait. L’enveloppe rapporte screen_id, capture_id, path, bytes, sha256, width et height, et jamais les octets d’image. Le plus récent l’emporte : une requête ultérieure remplace une capture en cours. Une capture d’écran du Player web dessine chaque page iframe comme une tuile gris foncé intitulée « Embedded web page » et chaque application telle qu’elle s’affiche elle-même ; l’image ne porte aucun repère pour la tuile, elle ne prouve donc pas qu’une page iframe s’est affichée.

Pour plusieurs identifiants ou --tag, la réponse est un résultat de flotte avec action: "screenshot", le selector, et le répertoire output ; chaque résultat ok porte path, bytes, sha256, width et height. Avec --tag, la CLI liste d’abord les écrans étiquetés, suivant chaque page de liste ; chaque page de liste est facturée et les captures elles-mêmes sont gratuites, et plusieurs identifiants n’ont pas besoin de liste. --idempotency-key est refusé sous cette forme, car chaque capture utilise sa propre clé. Si une capture échoue de façon inattendue, le résultat de cet écran est unexpected_error, aucune nouvelle capture ne démarre, les écrans encore en attente rapportent not_attempted, et le code de sortie est 1.

screen tag#

Définir, ajouter, supprimer ou effacer les étiquettes sur un écran ou une flotte.

screen tag (<id>... | --tag TAG) (--set TAGS | --add TAGS | --remove TAGS | --clear) [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_. Plusieurs IDs s’exécutent comme une seule requête de flotte.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--set TAGSstringexactement une actionaucunRemplacer l’ensemble complet par ces balises séparées par des virgules, telles que Lobby,Floor2.
--add TAGSstringexactement une actionaucunAjouter ces balises séparées par des virgules.
--remove TAGSstringexactement une actionaucunSupprimer ces étiquettes séparées par des virgules.
--clearbooleanexactement une actiondésactivéSupprimer toutes les étiquettes.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen tag scr_01EXAMPLESCREEN00000000 --set Lobby,Floor2
screenrig screen tag scr_01EXAMPLESCREEN00000000 --add Spring
screenrig screen tag --tag Lobby --add Spring

Une étiquette fait de 1 à 32 lettres ou chiffres, et un écran porte au plus 16 étiquettes uniques. Les étiquettes sélectionnent des flottes ; elles ne sont jamais une autorisation et n’atteignent jamais le Player. Changer les étiquettes augmente la révision de l’écran, pas celle du manifeste. Pour un écran, l’enveloppe est l’écran mis à jour. --add et --remove lisent d’abord l’écran et écrivent le nouvel ensemble protégé par --expect-rev ou la révision juste lue, donc un changement concurrent renvoie revision_conflict (sortie 6) au lieu d’être écrasé ; relancez la commande. Dans une flotte, --add et --remove s’appliquent atomiquement à l’ensemble stocké de chaque écran, et un écran qui dépasserait 16 étiquettes échoue dans son propre résultat avec invalid_request.

Chaque fois que des étiquettes changent (screen tag, une mise à jour d’écran par l’API, l’éditeur d’étiquettes du tableau de bord), levels dans la réponse liste, sous gained et lost, les campagnes dont l’audience d’étiquettes l’écran a rejointe ou quittée, chacune avec son source (campaign), son id, le nombre de screens et, quand la campagne a une portée, reach_before et reach_after. Un screen tag de flotte les additionne sur la flotte. Lisez levels.lost avant de juger une modification d’étiquette inoffensive : retirer la dernière étiquette correspondante des écrans d’une campagne vide ce groupe et déclenche les notifications reach_dropped et group_empty.

Résultats de la flotte

Avec plusieurs identifiants d’écran ou --tag, screen assign, screen reload, screen toast et screen tag exécutent une action mesurée sans limite du nombre d’écrans. Le CLI suit automatiquement les pages de résultats bornées, attend lorsque les budgets de contrôle sont épuisés, et conserve la même clé et la flotte sélectionnée tout au long. --tag sélectionne uniquement les écrans actifs ; les identifiants peuvent désigner n’importe quel écran. Un identifiant d’écran conserve la réponse à écran unique. Les commandes de flotte ne prennent pas de --expect-rev, car les protections de révision sont par écran. Chaque commande de flotte porte une clé d’idémpotence. Après une requête interrompue, comme une connexion perdue, relancez la même commande pour rejouer les écrans terminés sans répéter leurs effets secondaires. Après une réponse définitive avec échecs, réessayez uniquement les identifiants ayant échoué : relancer la commande entière agit à nouveau sur chaque écran. Réutiliser le même --idempotency-key explicite dans les 24 heures retourne la réponse enregistrée à la place.

L’enveloppe conserve ok: true. Le succès partiel est une réponse normale, pas une erreur de transport :

{
  "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 résultat ok porte le résultat d’un seul écran : revision pour assign, revision et tags pour les changements d’étiquette, reload pour recharger, et toast pour toast. Un résultat failed porte le problème que la propre requête de cet écran aurait retourné. Les limites par écran s’appliquent toujours dans une action de flotte, donc un rechargement ou toast de flotte peut rapporter rate_limited pour un écran qui vient d’être rechargé ou toasté ; réessayez cet identifiant d’écran plus tard. Les limites par écran sont 6 rechargements et 20 toasts par minute. Les rechargements et toasts de flotte puisent aussi dans un budget d’organisation de 600 écrans par minute : le serveur fait une pause quand le budget restant est épuisé, et le CLI respecte Retry-After avant de continuer automatiquement.

RésultatCode de sortieAvertissement
Chaque écran apparié a réussi0aucun
Certaines ou toutes les écrans ont échouéLe code du premier écran échoué, tel que 4 pour not_found ou 6 pour revision_conflictfleet_partial_failure
Aucun écran correspondant0fleet_no_match
Sélecteur ou action mal formé2 ou le code propre à la requête ; aucun changement d’écranaucun

Dossiers d’écrans

Un dossier d’écrans organise les écrans par lieu. Un identifiant de dossier commence par sfd_, et un écran se trouve dans au plus un dossier, indiqué par folder_id dans screen show et screen list et absent à la racine du projet. Une organisation contient au maximum 1000 dossiers, tous projets confondus, imbriqués jusqu’à 10 niveaux, avec des noms de 1 à 100 caractères uniques parmi leurs frères. Les étiquettes restent pour les groupes qui traversent les lieux.

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 retourne chaque dossier dans data.items avec id, name, parent_id (null à la racine du projet), default_playlist_id lorsqu’il est défini, screens (les écrans actifs directement à l’intérieur) et revision. screen move accepte des identifiants d’écrans et de dossiers en toute combinaison, 1000 au maximum en une seule requête tout ou rien ; un dossier se déplace avec tout son contenu et ne peut pas être déplacé dans lui-même ni dans un dossier qu’il contient. screen list --folder ID liste uniquement les écrans directement dans un dossier.

Sur chaque commande de flotte qui accepte --tag TAG, --folder ID sélectionne chaque écran actif de ce dossier et de chaque dossier qu’il contient. Une campagne accepte la même chose : --folder ID sur campaign create et campaign update, ou une règle {"folder":"sfd_…"} dans --audience, qui se combine avec des règles d’étiquette comme dans {"all":[{"folder":"sfd_BUILDING"},{"tag":"overhead"}]}.

La liste de lecture par défaut d’un dossier est ce que ses écrans affichent lorsqu’ils n’ont pas de liste de lecture propre. Le dossier le plus proche au-dessus d’un écran qui en définit une l’emporte, et effective_playlist indique source folder avec l’identifiant du dossier comme entry_id. Une prise de contrôle, une campagne, une programmation et la liste de lecture assignée à l’écran lui-même ont toutes priorité sur elle ; voir Programmations et prise de contrôle. La liste de lecture doit être approuvée (playlist_not_approved, sortie 5).

Déplacer des écrans ou un dossier, ou changer la liste de lecture par défaut d’un dossier, réévalue les écrans concernés en environ 15 secondes. Dans la réponse, levels liste, sous gained et lost, les campagnes dont l’audience de dossier ces écrans ont rejointe ou quittée et les listes de lecture par défaut de dossier qu’ils ont commencé ou cessé d’afficher, chacune avec son source (campaign ou folder), son id et son nombre de screens. Supprimer un dossier ne supprime rien à l’intérieur : ses écrans et ses dossiers remontent dans son parent, et resource_conflict (sortie 5) refuse la suppression tant qu’une audience de campagne nomme le dossier. La suppression répond 200 avec levels, comme un déplacement.

Les écritures nécessitent l’accès Gérer et n’attendent jamais de révision : une session Propose répond 403 insufficient_access. Chaque écriture ajoute screen.folder_created, screen.folder_updated, screen.folder_deleted ou screen.moved aux événements du projet.

Programmations et prise de contrôle

Les campagnes d’un écran et les entrées d’horaire de sa liste de lecture sont les niveaux d’une même pile. Le serveur décide de ce que chaque écran diffuse en partant du haut : sa prise de contrôle, les campagnes qui l’atteignent (--priority d’abord, puis la plus récente), les entrées d’horaire propres à l’écran dans l’ordre, la liste de lecture affectée avec screen assign, puis la liste de lecture par défaut du dossier d’écrans le plus proche qui en définit une. Le premier niveau en vigueur est diffusé. Les changements se font à environ une minute d’une limite, et les Players n’ont besoin d’aucune mise à jour. Une feuille de lignes d’horaire pour plusieurs écrans s’importe en une seule étape : voir Importation d’horaires.

Un niveau est en vigueur tant que toutes ses règles le sont : from et until, windows hebdomadaires, règles monthly, dates, dates except, une condition data et une condition interaction. Une règle monthly est un day du mois (de 1 à 31 ; un mois sans ce jour l’ignore) ou le jour de semaine de rang nth (de 1 à 4, ou -1 pour le dernier) avec un weekday ; un élément dates est une seule date ; les deux acceptent des heures start et end facultatives et couvrent sinon la journée entière. Une date except retire toute occurrence qui commence ce jour-là, y compris les prolongements de nuit, et une occurrence de nuit appartient à la date où elle commence. data est {key, path?, equals?} et est en vigueur tant que ces données de carte existent ou égalent la valeur scalaire. interaction est {idle_s} (de 5 à 3600, 60 par défaut) : le niveau joue tant que quelqu’un utilise l’écran par toucher ou par clic et revient en arrière après idle_s secondes sans saisie, comme une page interactive au-dessus d’une boucle d’attraction. displays liste les sorties du mur vidéo (de 1 à 12) sur lesquelles le niveau joue. start est next_item (par défaut), qui attend la fin de l’élément en cours, ou on_time, qui l’interrompt à l’instant exact. Un lecteur qui résout sa propre pile joue les niveaux interaction, data et displays ; campaign explain rapporte le niveau pour tout autre lecteur comme off avec la raison stack_only (nécessite un lecteur qui résout sa propre pile).

screen show, screen list, et chaque commande ci-dessous retourne effective_playlist ({id, source, entry_id?, until?}, où source est takeover, campaign, schedule, default ou folder), takeover et playlist_schedule. entry_id est l’identifiant de campagne pour campaign, l’identifiant d’entrée pour schedule et l’identifiant de dossier pour folder. until est le prochain moment où le choix est connu pour changer. screen show --human l’imprime dans le fuseau horaire de l’écran, comme dans Assigned: pl_LUNCH (schedule entry lunch until 2026-08-14 15:00 America/Los_Angeles) ou Assigned: pl_LUNCH (campaign cmp_LUNCH until 2026-08-14 15:00 America/Los_Angeles) (UTC, étiqueté, quand l’écran n’a pas de zone) ; la sortie JSON conserve les instants RFC 3339. Les tableaux horaires humains sont étiquetés avec le fuseau horaire de l’écran, et screen list --human ajoute une colonne ASSIGNED quand un écran listé joue autre chose que sa liste de lecture par défaut.

Code de problèmeSortieSens
invalid_request8L’écran n’a pas de liste de lecture par défaut assignée (next est screen assign), un horaire cible un écran sans fuseau horaire (next est screen set-timezone), ou une liste de lecture nommée ne peut pas être assignée.
screen_archived5Un écran archivé refuse les horaires et prises de contrôle. next est screen unarchive.
revision_conflict6La révision --expect-rev était périmée.
rate_limited7La programmation et les prises de contrôle partagent les limites d’écriture par minute : 600 par organisation, 20 par écran et 60 par IP. Attendez retry_after_seconds.

Avec un identifiant d’écran, ces commandes retournent l’écran mis à jour et --expect-rev protège sa révision. Plusieurs identifiants ou --tag s’exécutent comme une seule requête de flotte avec l’enveloppe et les règles de sortie de la flotte ; chaque écran échoue seul, et le CLI fait automatiquement pause et reprise lorsque le budget du projet est épuisé.

screen schedule show#

Afficher l’horaire de la liste de lecture d’un écran et la liste qu’il sélectionne actuellement.

screen schedule show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
screenrig screen schedule show scr_CAFE

La sortie JSON peut être renvoyée directement à screen schedule set --file.

screen schedule set#

Remplacer la programmation de la liste de lecture sur un écran ou une flotte.

screen schedule set (<id>... | --tag TAG) --file FILE [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--file FILEcheminouiaucunLe document d’horaire, ou - pour stdin.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig screen schedule set scr_CAFE --file dayparts.json
screenrig screen schedule set --tag Cafe --file dayparts.json

Chaque liste de lecture nommée dans un horaire est validée comme une affectation, et l’écran a besoin d’un fuseau horaire et d’une liste de lecture par défaut assignée. Quand aucune entrée n’est en vigueur, la liste de lecture assignée est jouée. Si une liste de lecture programmée ne peut plus être affichée, ses entrées sont ignorées et screen.playlist_unavailable est enregistré.

screen schedule clear#

Supprimer la programmation de la liste de lecture d’un écran ou d’une flotte.

screen schedule clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig screen schedule clear --tag Cafe

screen schedule preview#

Montrer ce que changerait le remplacement de l’horaire de listes de lecture d’un écran, sans le faire.

screen schedule preview <id> --file FILE [--calendar-from INSTANT] [--calendar-to INSTANT]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--file FILEcheminouiaucunLe document d’horaire tel que screen schedule set le prend, ou - pour stdin. Le JSON de screen schedule show est accepté en retour.
--calendar-from INSTANTstringnonmaintenantCommencer les calendriers à cet instant avec fuseau, tel que 2026-12-01T00:00:00Z.
--calendar-to INSTANTstringnonune semaine après le débutTerminer les calendriers à cet instant avec fuseau, au plus 93 jours après le début.
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

Rien n’est écrit. Les entrées sont vérifiées comme les vérifie screen schedule set, donc un aperçu refuse ce que refuse le set. data.gained et data.lost disent si l’écran gagnerait ou perdrait des niveaux de son horaire ; une entrée avec "paused": true n’est sur aucun écran, donc la publier la gagne. data.calendar.before et data.calendar.after sont le calendrier de l’écran tel qu’il est et tel qu’il serait de --calendar-from à --calendar-to.

screen schedule revisions#

Lister les révisions de l’horaire de listes de lecture d’un écran, la plus récente d’abord.

screen schedule revisions <id> [--after CURSOR]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--after CURSORstringnonla première pageReprendre à partir du data.next_cursor de la page précédente.
screenrig screen schedule revisions scr_LOBBY
screenrig screen schedule revisions scr_LOBBY --after CURSOR

data.items contient au plus 50 révisions, chacune avec revision (la révision de l’écran à l’écriture, d’où des trous dans les numéros là où l’écran a changé autrement), created_at, change, current, author lorsqu’il est connu et entries, l’horaire complet après cette écriture (none signifie que l’écran n’avait pas d’horaire). change est edited (un set, un clear ou une importation d’horaire), restored (une copie de la révision antérieure que nomme restored_from) ou baseline. Tant que data.next_cursor est une chaîne, des révisions plus anciennes restent : relancez la commande avec --after réglé à cette valeur. Les révisions partent avec la purge de l’écran. L’accès en lecture seule suffit.

screen schedule restore#

Remettre sur un écran l’horaire d’une révision antérieure en le copiant vers l’avant.

screen schedule restore <id> --revision N [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--revision NintegerouiaucunLa révision à copier vers l’avant, telle que screen schedule revisions la numérote.
--expect-rev REVISIONstringnonla révision qui vient d’être lueExiger cette révision courante de l’écran, et non N. Sans elle, le CLI lit l’écran juste avant l’écriture et envoie cette révision ; un changement entre-temps donne revision_conflict (sortie 6).
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig screen schedule restore scr_LOBBY --revision 4
screenrig screen schedule restore scr_LOBBY --revision 4 --expect-rev 9

Les entrées de la révision N deviennent l’horaire de l’écran, la même écriture que screen schedule set avec ces entrées (ou screen schedule clear si cette révision n’en avait aucune), vérifiées comme elles le sont maintenant : une liste de lecture supprimée depuis la refuse. Avec l’accès Propose, ou dans un projet qui exige une révision des changements des agents, la restauration attend une personne comme le set, et rien ne change à l’écran avant qu’elle l’approuve. Les révisions antérieures restent telles quelles.

screen takeover#

Afficher une liste de lecture sur un écran ou une flotte avant les campagnes, l’horaire et l’affectation.

screen takeover [set] (<id>... | --tag TAG) --playlist-id ID [--until TIME | --for DURATION] [--reason TEXT] [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--playlist-id IDstringouiaucunLa playlist pl_ à afficher.
--until TIMEstringnonretenu jusqu’à libérationUn instant RFC 3339 strict avec secondes et décalage, sous la forme YYYY-MM-DDTHH:MM:SSZ ou YYYY-MM-DDTHH:MM:SS-07:00, envoyé normalisé en UTC ; strictement dans le futur et au plus 7 jours à l’avance. Ou none pour tenir jusqu’à screen takeover clear.
--for DURATIONstringnonretenu jusqu’à libération30m, 2h, ou 3d, jusqu’à 6d23h59m, converti en until depuis l’horloge de cet ordinateur. 7d est refusé localement ; utilisez --until pour une durée complète de 7 jours. Pas avec --until.
--reason TEXTstringnonaucunUne note d’opérateur sur la prise de contrôle et ses événements. Raccourcie, au maximum 120 caractères, sans caractères de contrôle.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
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 est l’abréviation de screen takeover set ID. Une nouvelle prise de contrôle remplace la précédente. Lorsqu’elle se termine, l’écran revient automatiquement à une campagne en vigueur, à son horaire ou à sa liste de lecture assignée. Une prise de contrôle dont la liste de lecture ne peut être affichée se termine. Une relance --for après un échec ambigu calcule une nouvelle fin et est envoyée comme une nouvelle requête.

screen takeover clear#

Terminer la prise de contrôle sur un écran ou une flotte.

screen takeover clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
--note TEXTstringnonaucunUne note pour la personne qui révise la modification : texte brut, au maximum 280 caractères. Ignorée lorsque la modification s’applique immédiatement.
screenrig screen takeover clear --tag Lobby

Le fichier d’horaire

Un horaire liste de 1 à 32 entrées par ordre de priorité ; la première entrée en vigueur l’emporte. Une entrée définit au moins une règle d’un niveau : windows, monthly, dates, except, data, interaction, from ou until, et facultativement displays, start et paused. windows compte de 1 à 16 éléments dans le fuseau horaire de l’écran : days utilise mon à sun, et start et end sont HH:MM ; omettre les deux pour toute la journée. Un end à ou avant start traverse minuit et appartient au jour de début. from (inclusif) et until (exclusif) sont optionnels, minutes civiles telles que 2026-12-24T18:00, sans décalage. Un id omis devient entry_N. Une entrée avec "paused": true est un brouillon : elle n’est dans la pile d’aucun écran, screen schedule show la marque et le calendrier la dessine en pointillés. Renvoyez l’horaire sans paused pour la publier. Le CLI vérifie cette forme avant d’envoyer quoi que ce soit. Tranches horaires petit-déjeuner, déjeuner et dîner :

{
  "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 qui joue tant que quelqu’un utilise l’écran, au-dessus d’un brunch du premier dimanche qui saute une date :

{
  "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"] }
  ]
}

Une programmation de liste de lecture choisit entre des listes de lecture ; la page visibility à l’intérieur d’une liste choisit encore entre ses pages.

Événements de programmation et de prise de contrôle

events list et events follow impriment screen.playlist_switched (playlist_id, previous_playlist_id, source, entry_id, until), screen.takeover_started (playlist_id, until, où none signifie retenu jusqu’à effacement, et reason), screen.takeover_ended (reason expired, cleared, replaced, playlist_deleted, ou playlist_unavailable), et l’avertissement screen.playlist_unavailable (playlist_id, entry_ids, et code playlist_deleted ou playlist_unavailable).

La suppression d’une liste de lecture que n’importe quel écran, y compris les archivés, peut encore afficher échoue avec resource_conflict (sortie 5) : assignée, nommée par une entrée d’horaire, détenue par une prise en charge, affichée par une campagne ou effective. next pointe vers screen list.

Campagnes

Une campagne fait basculer chaque écran d’une audience vers une seule liste de lecture tant que ses règles sont en vigueur, puis le ramène quand elles cessent. Une seule campagne diffuse les menus du midi dans chaque magasin north, et un écran étiqueté north par la suite l’obtient aussi. Sans aucune règle définie, elle est toujours en vigueur.

Par écran, le serveur choisit sa prise de contrôle, sinon la première campagne en vigueur (--priority de 0 à 100, la plus élevée d’abord, puis la plus récente), sinon l’horaire de liste de lecture, sinon la liste de lecture assignée ; voir Horaires et prise de contrôle pour la pile et les règles. Une campagne atteint un écran qui a une liste de lecture par défaut (screen assign). Une campagne avec une règle de date ou d’heure nécessite aussi le fuseau horaire de l’écran (screen set-timezone), car ce sont des heures civiles lues dans le fuseau horaire propre à chaque écran. Les écrans basculent dans environ une minute, et les lecteurs n’ont pas besoin de mise à jour.

Une campagne en pause est un brouillon : elle n’est sur aucun écran tant que campaign publish ne la publie pas, d’abord si l’on veut pour un dossier de test ou quelques écrans de test, puis campaign promote lui donne son audience. campaign preview montre un changement avant qu’il soit fait, et campaign revisions et campaign restore conservent et rétablissent les versions antérieures. Les mêmes brouillons, aperçus et historique existent pour les entrées d’horaire plus bas ; voir brouillons, test et promotion, historique.

Les commandes de campagne utilisent la capacité screens. Les écritures nécessitent l’accès Gérer et n’attendent jamais de révision : une session Propose répond 403 insufficient_access. Une organisation a au maximum 100 campagnes, tous projets confondus (campaign_limit_reached, sortie 5), et la liste de lecture doit être approuvée (playlist_not_approved, sortie 5). Chaque écriture ajoute campaign.created, campaign.updated ou campaign.deleted aux événements du projet, et un écran qu’une campagne fait basculer enregistre screen.playlist_switched avec source campaign et l’identifiant de la campagne comme entry_id. ads campaigns achètent du temps publicitaire sur d’autres écrans et sont une ressource différente.

campaign list#

Lister les campagnes du projet dans l’ordre où les écrans les lisent.

campaign list

Aucun paramètre.

screenrig campaign list

data.items contient au maximum 100 campagnes, les priorités les plus élevées d’abord et les plus récentes d’abord au sein d’une même priorité. Une campagne en pause est listée et ne s’applique nulle part.

campaign show#

Lire une campagne.

campaign show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
screenrig campaign show cmp_LUNCH

Retourne name, playlist_id, audience (la règle exacte), priority, paused, les from, until, windows, monthly, dates, except, interaction, displays et start qui sont définis, et revision, la valeur pour --expect-rev lors d’une écriture ultérieure. reach indique combien d’écrans l’audience couvre : published à la dernière publication de la campagne (créée, ou mise à jour avec une nouvelle audience, liste de lecture ou état de pause), current et at pour le dernier compte, et empty_groups, les feuilles tag:NAME et folder:ID de l’audience qui ne correspondent à aucun écran. Une étiquette, un dossier, un archivage ou une suppression qui change le compte est recompté en environ 15 secondes ; campaign list porte aussi reach, et les notifications reach_dropped et group_empty le surveillent. Un identifiant de ads campaigns list répond not_found (sortie 4) ici.

campaign create#

Faire basculer les écrans d’une audience vers une liste de lecture, en tout temps ou tant que ses règles sont en vigueur.

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]
ParamètreTypeRequisPar défautNotes
--name NAMEstringouiaucunUn nom de 1 à 120 caractères.
--playlist-id IDstringouiaucunLa liste de lecture pl_ que l’audience affiche tant que la campagne est en vigueur. Elle doit être approuvée.
--tag TAGstringune option d’audienceaucunÉcrans qui portent cette étiquette. Répétez ou séparez par des virgules pour exiger chaque étiquette listée.
--any-tag TAGstringune option d’audienceaucunÉcrans qui portent au moins une de ces étiquettes. Répétez ou séparez par des virgules.
--screen-id IDstringune option d’audienceaucunCes écrans. Répétez ou séparez par des virgules.
--folder IDstringune option d’audienceaucunLes écrans de ce dossier d’écrans sfd_ et de chaque dossier qu’il contient. Pour combiner un dossier avec des étiquettes, utilisez --audience.
--all-screensbooleanune option d’audiencedésactivéChaque écran du projet.
--audience RULEstringune option d’audienceaucunUne règle en JSON, @FILE pour la lire depuis un fichier, ou - pour stdin.
--from TIMEstringnonpas de débutCommencer à cette heure civile dans le fuseau horaire de chaque écran, YYYY-MM-DDTHH:MM sans décalage.
--until TIMEstringnonpas de finSe terminer avant cette heure civile dans le fuseau horaire de chaque écran, sous la même forme et plus tard que --from.
--window SPECstringnonaucunÊtre en vigueur seulement dans cette fenêtre hebdomadaire, DAYS ou DAYS@HH:MM-HH:MM, par exemple mon-fri@09:00-17:00 ou sat,sun. Répétez jusqu’à 16 fois ; la campagne est en vigueur dans n’importe laquelle.
--monthly SPECstringnonaucunÊtre en vigueur seulement à cette occurrence mensuelle : un jour du mois (15 ou day15 ; un mois sans ce jour l’ignore) ou le n-ième jour de semaine (1st-mon, 2nd-tue, 3rd-wed, 4th-thu, last-sun), chacun avec un @HH:MM-HH:MM facultatif. Répétez jusqu’à 16 fois.
--date SPECstringnonaucunÊtre en vigueur seulement ce jour-là, YYYY-MM-DD ou YYYY-MM-DD@HH:MM-HH:MM. Répétez jusqu’à 100 fois.
--except DATEstringnonaucunIgnorer ces dates, YYYY-MM-DD, répétées ou séparées par des virgules, jusqu’à 100. Une exception retire toute occurrence qui commence à cette date, y compris les prolongements de nuit.
--on-touch [IDLE_S]integernondésactivéÊtre en vigueur seulement tant que quelqu’un utilise l’écran par toucher ou par clic, jusqu’à ce que IDLE_S secondes, de 5 à 3600 (60 par défaut), s’écoulent sans saisie.
--displays N[,N]stringnontoutes les sortiesJouer seulement sur ces sorties du mur vidéo, de 1 à 12, séparées par des virgules.
--start WHENstringnonnext-itemon-time change à l’instant exact et interrompt l’élément en cours ; next-item attend sa fin.
--covers WHEREstringnonfullOù la liste de lecture joue : full (la page), main ou header, footer ou side, un bandeau tracé sur la page qui exige une liste de lecture conçue pour cette région. Voir bandeaux.
--priority Nintegernon0De 0 à 100. Le nombre le plus élevé l’emporte quand deux campagnes sont en vigueur sur un même écran.
--pausedbooleannondésactivéCréer en pause : un brouillon qui n’est sur aucun écran avant campaign publish ou 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

Les étiquettes comptent de 1 à 32 lettres ou chiffres. DAYS est daily, un jour (mon), une plage (mon-fri ; fri-mon traverse la fin de la semaine) ou une liste séparée par des virgules (sat,sun). Sans heure, la fenêtre couvre toute la journée, et une fin à ou avant le début traverse minuit et appartient au jour de début. Dans une règle --audience, chaque membre a exactement l’un de all, any, tag, screen_id ou folder, les groupes s’imbriquent sur 3 niveaux au plus, une audience a au plus 500 règles, et {"all":[]} désigne chaque écran.

Après une création interrompue ou ambiguë, relancez la même commande dans les 24 heures : elle réutilise la clé d’idempotence enregistrée, et le serveur renvoie la même campagne au lieu d’en créer une autre.

campaign update#

Modifier une campagne ; les écrans de son ancienne et de sa nouvelle audience résolvent à nouveau dans la minute.

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]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--name NAMEstringnoninchangéRenommer la campagne.
--playlist-id IDstringnoninchangéAfficher cette liste de lecture à la place. Elle doit être approuvée.
--tag, --any-tag, --screen-id, --folder, --all-screens, --audiencestringnoninchangéAu plus un, écrit comme dans campaign create. Il remplace toute l’audience.
--from TIME, --until TIMEstringnoninchangéUne heure civile comme dans campaign create. --from doit rester antérieur à --until, sinon invalid_request (sortie 8).
--clear-from, --clear-untilbooleannondésactivéSupprimer le début ou la fin.
--window SPECstringnoninchangéRemplace chaque fenêtre par celles-ci. Répétez jusqu’à 16 fois.
--clear-windowsbooleannondésactivéSupprimer toutes les fenêtres.
--monthly SPEC, --date SPEC, --except DATEstringnoninchangéComme pour campaign create ; chacune remplace toutes les règles de son type.
--on-touch [IDLE_S], --displays N[,N], --start WHENstringnoninchangéComme pour campaign create ; --on-touch sans valeur vaut 60 secondes.
--clear-monthly, --clear-dates, --clear-except, --clear-on-touch, --clear-displaysbooleannondésactivéLes supprime. Une campagne sans aucune règle est toujours en vigueur.
--covers WHEREstringnoninchangéfull, main, header, footer ou side, comme dans campaign create.
--priority NintegernoninchangéDe 0 à 100.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, 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

Passez au moins un changement ; seuls les champs que vous passez changent. Un nouveau --playlist-id est vérifié comme à la création. Après une requête interrompue ou ambiguë, relancez la même commande : elle réutilise la clé d’idempotence enregistrée, et le serveur renvoie la mise à jour qui a déjà eu lieu au lieu de l’appliquer à nouveau.

campaign pause#

Arrêter une campagne sur chaque écran sans la supprimer.

campaign pause <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig campaign pause cmp_LUNCH

Les écrans qui l’affichaient reviennent, dans la minute, à ce qu’ils afficheraient sans elle. campaign resume la redémarre.

campaign resume#

Redémarrer une campagne en pause.

campaign resume <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig campaign resume cmp_LUNCH

Chaque écran de l’audience auquel la campagne peut s’appliquer bascule vers la liste de lecture de la campagne dans la minute tant que celle-ci est en vigueur.

campaign delete#

Supprimer une campagne.

campaign delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig campaign delete cmp_LUNCH

La campagne ne revient pas. Chaque écran qui l’affiche revient, dans la minute, à ce qu’il afficherait sans elle ; les listes de lecture, les écrans et les étiquettes restent. campaign pause arrête une campagne et la conserve.

campaign screens#

Afficher les écrans qu’une campagne atteint et l’état de chacun.

campaign screens <id> [--limit N] [--cursor CURSOR]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--limit Nintegernon100Écrans par page, de 1 à 500.
--cursor CURSORstringnonla première pageLe data.next_cursor de la page précédente.
screenrig campaign screens cmp_LUNCH

data.counts couvre chaque écran actif de l’audience : audience, puis un compte par état présent. data.items est une page de ces écrans dans l’ordre des identifiants d’écran, chacun avec le status de la campagne. data.next_cursor est absent de la dernière page. Sur un écran dont le lecteur résout sa propre pile, l’état est celui que cette pile donne à la campagne : une campagne en bandeau ou main joue dans sa région, et une campagne --displays sur ses afficheurs.

StatutSens
playingL’écran affiche la liste de lecture de la campagne.
pendingElle devrait s’afficher, et le changement a lieu dans la minute.
waitingHors de --from, --until et des fenêtres en ce moment ; next_start quand elle démarre dans les huit jours.
ended--until est dépassé.
outrankedElle est en vigueur, mais une prise de contrôle d’écran (reason takeover) ou une autre campagne (reason campaign, avec by) l’emporte.
conditionalElle est en vigueur selon l’horaire et joue tant que quelqu’un utilise l’écran (reason interaction) ou tant que sa condition de données est remplie (reason data). Seul le lecteur voit ses entrées et ses données de cartes.
pausedLa campagne est en pause.
blockedElle ne peut pas s’afficher ici. reason est no_default_playlist (screen assign), no_timezone (screen set-timezone), playlist_unavailable (la liste de lecture est manquante, non approuvée ou ne convient pas à l’écran), region_not_laid_out (elle ne tient sur aucun afficheur de l’écran : son bandeau ne tient sur aucun, ou son --displays n’en nomme aucun, et la campagne est exclue de sa pile) ou stack_only (le lecteur de l’écran ne résout pas sa propre pile, et seul un lecteur qui le fait respecte une région, un verrou d’afficheurs, --on-touch ou une condition de données).

campaign explain#

Afficher pourquoi chaque campagne joue ou non sur un écran, maintenant ou à un moment choisi.

campaign explain <screen-id> [--at TIME] [--to TIME]
ParamètreTypeRequisPar défautNotes
<screen-id>stringouiaucunL’identifiant d’écran scr_.
--at TIMEstringnonmaintenantExpliquer ce moment plutôt que maintenant : un instant avec fuseau (2026-12-24T10:00:00-08:00) ou une heure à l’horloge propre de l’écran (2026-12-24T18:00). Une heure d’horloge que l’heure d’été saute ou répète est refusée.
--to TIMEstringnonaucunListe aussi les changements de liste de lecture de --at (par défaut maintenant) jusqu’à ce moment, sous les mêmes formes. Il n’y a aucune limite de distance ; une réponse énumère au plus 500 périodes.
screenrig campaign explain scr_LOBBY
screenrig campaign explain scr_LOBBY --at 2026-12-24T18:00 --to 2026-12-26T00:00

data.items liste chaque campagne du projet dans l’ordre où l’écran les lit, chacune avec un état issu de campaign screens ou not_in_audience ; une ligne blocked nomme la correction. data.effective_playlist est la liste de lecture que l’écran joue maintenant (id, source, et pour campaign l’identifiant de la campagne comme entry_id), ou null quand l’écran n’affiche aucune liste de lecture. Rien n’est modifié.

Avec --at, data.at contient la réponse pour ce moment : effective_playlist (son until est le prochain changement) et une ligne verdicts pour la prise de contrôle, chaque campagne et chaque entrée de la programmation, dans l’ordre où l’écran les lit.

Un verdict est won (la liste de lecture affichée), outranked (elle est en vigueur, et by nomme le gagnant), not_started (avant son début), ended (après sa fin), outside_hours (dans ses dates, hors de ses fenêtres, de ses règles mensuelles ou de ses dates, ou à une date d’exception), conditional (elle est en vigueur selon l’horaire et joue tant que quelqu’un utilise l’écran, reason interaction, ou tant que sa condition de données est remplie, reason data) ou off (elle ne s’applique pas, et reason dit pourquoi, par exemple stack_only). Sur un écran dont le lecteur résout sa propre pile, les verdicts lisent cette pile : un niveau en bandeau ou main l’emporte ou est devancé dans sa région, et un verrou d’afficheurs sur ses afficheurs. effective_playlist et la chronologie restent la page de l’afficheur 1, et data.at.not_judged liste player_stack.

--to ajoute data.at.timeline, les périodes pendant lesquelles la liste de lecture ne change pas, et timeline_truncated signale une réponse arrêtée avant --to. data.at.not_judged dit ce qui n’est pas jugé : la prise de contrôle, la programmation et les campagnes sont lues telles qu’elles sont maintenant, et data.items reste l’état actuel.

campaign preview#

Montrer ce que ferait la création ou la modification d’une campagne avant de la faire.

campaign preview [<id>] [campaign create or update flags] [--paused | --publish] [--calendar-from INSTANT] [--calendar-to INSTANT]
ParamètreTypeRequisPar défautNotes
<id>stringnonune nouvelle campagneLa campagne cmp_ dont on prévisualise un changement. Omettez-la pour prévisualiser une nouvelle campagne à partir des flags de campaign create.
--name, --playlist-id, une option d’audience, les flags de règlestringnonaucunLes flags de campaign create pour une nouvelle campagne (--name, --playlist-id et une option d’audience sont requis), ou de campaign update pour un changement. Ils sont vérifiés comme les vérifie l’écriture, donc un aperçu refuse ce que refuse l’écriture.
--pausedbooleannondésactivéPrévisualiser comme brouillon : en pause, sur aucun écran.
--publishbooleannondésactivéPrévisualiser la sortie de pause de la campagne. Avec une option d’audience, prévisualise sa publication pour cette audience.
--calendar-from INSTANTstringnonmaintenantCommencer les calendriers à cet instant avec fuseau, tel que 2026-12-01T00:00:00Z.
--calendar-to INSTANTstringnonune semaine après le débutTerminer les calendriers à cet instant avec fuseau, au plus 93 jours après le début.
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

Rien n’est écrit. data.gained et data.lost sont {count, screen_ids} (les 500 premiers par identifiant) : les écrans qui porteraient la campagne et ne la portent pas maintenant, et ceux qui ne la porteraient plus. Une campagne en pause n’est sur aucun écran, donc la publier gagne son audience ; une modification qui garde la campagne sur un écran ne se voit que dans les calendriers. data.calendar.before et data.calendar.after sont les calendriers d’horaires de --calendar-from à --calendar-to pour les écrans de l’ancienne et de la nouvelle audience, avec les brouillons dessinés comme niveaux en pause. --human affiche les plages du premier affichage et les brouillons qui s’appliqueraient, et indique quand le calendrier ne change pas.

campaign publish#

Sortir une campagne brouillon de la pause, si l’on veut seulement pour un dossier de test ou quelques écrans de test.

campaign publish <id> [--test-folder ID | --test-screen ID] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--test-folder IDstringnonl’audience de la campagnePublier seulement sur les écrans de ce dossier d’écrans sfd_ et de chaque dossier qu’il contient.
--test-screen IDstringnonl’audience de la campagnePublier seulement sur ces écrans. Répétez ou séparez par des virgules.
--expect-rev REVISIONstringnonla révision qui vient d’être lueExiger cette révision courante de la campagne. Sans elle, le CLI lit la campagne juste avant l’écriture et envoie cette révision ; un changement entre-temps donne revision_conflict (sortie 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

Un brouillon est une campagne en pause : elle n’est sur aucun écran tant qu’elle n’est pas publiée. Sans option de test, la campagne atteint sa propre audience en moins d’une minute. Une option de test remplace l’audience dans la même écriture, de sorte que seuls les écrans de test changent. Le déroulement habituel : campaign create --paused avec l’audience réelle, campaign publish ID --test-folder FOLDER, regarder les écrans de test, puis campaign promote ID --revision N. campaign preview ID --publish montre d’abord l’effet.

campaign promote#

Appliquer à la campagne l’audience d’un brouillon après son test.

campaign promote <id> --revision N [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--revision NintegerouiaucunLa révision en pause du brouillon, telle que campaign revisions la numérote. La campagne prend l’audience de cette révision.
--expect-rev REVISIONstringnonla révision qui vient d’être lueExiger cette révision courante de la campagne. Sans elle, le CLI lit la campagne juste avant l’écriture et envoie cette révision ; un changement entre-temps donne revision_conflict (sortie 6).
screenrig campaign promote cmp_LUNCH --revision 1
screenrig campaign promote cmp_LUNCH --revision 1 --expect-rev 2

L’audience de la révision N devient celle de la campagne en une écriture, une nouvelle révision dont change est promoted, et chaque écran de l’ancienne et de la nouvelle audience est réévalué en moins d’une minute. La révision N doit être une révision en pause (invalid_request la nomme sinon), et la campagne doit être active : une campagne en pause maintenant n’a aucun test à promouvoir. --expect-rev est la révision courante de la campagne, et non N. La promotion exige l’accès qu’exige campaign update.

campaign revisions#

Lister les révisions d’une campagne, la plus récente d’abord.

campaign revisions <id> [--after CURSOR]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--after CURSORstringnonla première pageReprendre à partir du data.next_cursor de la page précédente.
screenrig campaign revisions cmp_LUNCH
screenrig campaign revisions cmp_LUNCH --after CURSOR

data.items contient au plus 50 révisions, chacune avec revision, created_at, change, current, author lorsqu’il est connu et campaign, la campagne telle qu’elle était après cette écriture, avec son état de pause. change est created, edited, restored ou promoted (une copie de la révision antérieure que nomme restored_from), ou baseline, la révision que la campagne avait quand son historique a commencé. Une campagne dont l’historique n’a aucune révision hors pause est un brouillon. Tant que data.next_cursor est une chaîne, des révisions plus anciennes restent : relancez la commande avec --after réglé à cette valeur. Les révisions sont conservées aussi longtemps que la campagne et partent avec sa suppression. L’accès en lecture seule suffit.

campaign restore#

Rendre de nouveau courante une révision antérieure en la copiant vers l’avant.

campaign restore <id> --revision N [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de campagne cmp_.
--revision NintegerouiaucunLa révision à copier vers l’avant, telle que campaign revisions la numérote.
--expect-rev REVISIONstringnonla révision qui vient d’être lueExiger cette révision courante de la campagne. Sans elle, le CLI lit la campagne juste avant l’écriture et envoie cette révision ; un changement entre-temps donne revision_conflict (sortie 6).
screenrig campaign restore cmp_LUNCH --revision 3
screenrig campaign restore cmp_LUNCH --revision 3 --expect-rev 5

Le nom, la liste de lecture, l’audience, les règles, le région, la priorité et l’état de pause de la révision N deviennent une nouvelle révision dont change est restored, vérifiée comme l’est campaign update : sa liste de lecture doit toujours exister et être approuvée (playlist_not_approved, sortie 5). Chaque écran de l’ancienne et de la nouvelle audience est réévalué en moins d’une minute. Les révisions antérieures restent telles quelles, et restaurer le contenu actuel ne change rien. La restauration exige l’accès qu’exige campaign update.

Révisions

Quand un projet nécessite une révision pour les changements d’agent, ou que la session a un accès Propose, les changements de liste de lecture et d’écran attendent une personne au lieu d’être appliqués. La commande réussit toujours : ok: true, sortie 0, la réponse du serveur dans data, et un avertissement 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" }]
}

Création et mise à jour de liste de lecture (y compris playlist import et playlist replace-release --apply), screen publish, screen assign, screen schedule set, clear et restore, ainsi que screen takeover et takeover clear en attente de révision, pour un écran ou une flotte. Un changement de flotte est une révision : son étiquette est résolue lorsqu’une personne l’approuve, et reviews show rapporte ensuite le résultat de chaque écran ; une grande flotte termine l’application en arrière-plan, et screen_change.result.applying est true jusqu’à ce que chaque écran ait son résultat. Hormis les changements de médias ci-dessous, chaque autre changement répond à 403 insufficient_access pour une session Propose. --note TEXT sur ces commandes envoie une note en texte clair, au maximum 280 caractères, que le réviseur lit dans le tableau de bord.

Une personne approuve, demande des modifications ou rejette dans la page Révisions du tableau de bord ; les agents ne peuvent pas approuver les modifications de liste de lecture ou d’écran. Une modification approuvée s’applique comme si elle avait été faite à ce moment, et ses événements nomment la personne qui l’a approuvée et l’agent qui l’a proposée. Ne pas interroger, dormir ou répéter l’écriture pendant qu’une révision attend : vérifiez plus tard avec reviews show, ou suivez review.approved, review.rejected et review.changes_requested avec events follow --type review..

Les modifications des médias issues d’une session Propose attendent aussi. Les sélecteurs d’étiquette, de dossier et all ignorent un nouveau téléversement jusqu’à ce qu’une personne l’approuve, et les médias approuvés que la session retague ou déplace continuent de jouer avec leurs étiquettes et dossier approuvés jusqu’à ce que le changement soit approuvé. Le retag répond ok, sortie 0, avec avertissement media_review_pending, et la révision de l’élément apparaît dans reviews list en quelques secondes ; ne pas sonder, dormir ou réessayer. Chaque élément reçoit une révision, type playlist_change avec opération selector_refresh et un sujet media : media_change montre ses étiquettes et dossier before et after (before est null pour un nouveau téléversement), et media_playlists liste chaque playlist approuvée, et chaque playlist proposée en attente de révision, à laquelle le changement l’ajoute ou le retire (media_added, media_removed), avec leurs écrans. L’approbation applique le changement à toutes ; le rejet, la demande de modifications ou le retrait remettent un élément retagué ou déplacé tel qu’approuvé, et un nouveau téléversement reste non lu. Un changement qui n’altère aucune playlist approuvée ni proposition s’applique seul, et une playlist qui nomme l’élément par id le porte dans sa propre révision. Quand ces playlists avancent avant qu’une personne décide, la révision média devient stale et une nouvelle la remplace en quelques secondes.

États de révision :

ÉtatSensÉtape suivante
pendingEn attente d’une personne.Donnez à la personne l’URL de révision ; vérifiez à nouveau plus tard.
approvedAppliqué à la playlist ou aux écrans.Vérifiez à l’écran avec screen show et une capture d’écran.
changes_requestedLa personne a demandé des changements ; decision_note indique lesquels.Réviser et proposer de nouveau avec --note.
rejectedLa personne a refusé ; decision_note indique pourquoi.Ne pas renvoyer la même modification; demandez à la personne.
withdrawnLe proposant l’a retiré.Aucun.
supersededUne proposition plus récente pour la même liste de lecture ou écran l’a remplacée ; superseded_by la nomme.Suivez la revue la plus récente.
staleLa liste de lecture en direct a changé après la proposition, ou son étiquette, dossier ou sélecteurs all joueraient maintenant des médias qu’elle n’a pas vus lors de la proposition, donc elle ne peut pas s’appliquer comme révisée. Une révision média devient périmée lorsque les listes de lecture qu’elle liste changent.Relire la liste de lecture et proposer par-dessus. Une revue de média périmée est remplacée par une nouvelle en quelques secondes.

reviews list#

Lister les avis, les plus récents d’abord.

reviews list [--state pending|decided|all] [--kind playlist_change|screen_change|ad_creative] [--limit N] [--cursor CURSOR]
ParamètreTypeRequisPar défautNotes
--state STATEstringnonpendingpending, decided ou all.
--kind KINDstringnonchaque typeplaylist_change, screen_change ou ad_creative.
--limit Nintegernon50Révisions par page, de 1 à 100.
--cursor CURSORstringnonla première pageLe next_cursor de la page précédente.
screenrig reviews list --state all

Le résultat porte pending_count. Une session voit les types que ses capacités lisent : playlists pour les changements de liste de lecture, screens pour les changements d’écran, et advertising pour les créations publicitaires.

reviews show#

Lire une critique.

reviews show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’examen du résultat pending_review.
screenrig reviews show rvw_LOBBY

L’examen rapporte son state, le proposant, votre note, le decision_note qu’une personne a laissé en rejetant ou demandant des modifications, et impact.screens. Un changement de liste de lecture ajoute le diff, un preview des listes de lecture en direct et proposées (aucun pour un examen média), media_change pour un examen média, et media_playlists, les listes de lecture dont la sélection est modifiée par le changement. Pour un changement d’écran, blockers liste les examens de liste de lecture qu’une personne décide d’abord, avec leur état actuel.

reviews withdraw#

Retirez votre propre proposition en attente.

reviews withdraw <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunUne révision en attente proposée cette session.
screenrig reviews withdraw rvw_LOBBY

Rien n’atteint les écrans, et une nouvelle liste de lecture retirée reste non approuvée. Une révision qui n’est plus en attente répond review_not_pending (sortie 5).

Santé et puissance de l’appareil

Chaque Player jumelé rapporte la santé de l’appareil au démarrage de la session, toutes les quinze minutes, et immédiatement lorsque sa connexion d’afficheur ou son alimentation change. Il déclare aussi les capacités hôtes qu’il supporte : reboot, clear_cache, restart_app et update là où chacune fonctionne sur cet appareil, et les méthodes d’alimentation d’afficheur qu’il peut utiliser (display_power.serial, le port de contrôle RS-232 de l’afficheur ; display_power.cec, display_power.ddc, display_power.backlight ou display_power.scrim, un noir d’écran). screen show retourne les deux.

screen show retourne la santé comme data.health avec le reported_at du serveur ; stale devient vrai après 35 minutes sans rapport, et le dernier rapport reste visible. Avec --human, il affiche un bloc Health : heure du rapport, temps de fonctionnement de l’appareil et du Player, mémoire utilisée, charge CPU et cœurs, température, connexion et alimentation de l’afficheur, type de réseau et signal Wi-Fi, niveau de batterie, charge en cours et source d’alimentation sur un appareil muni d’une batterie, et plantages et redémarrages du moteur de rendu dans les dernières 24 heures. screen list --human ajoute une colonne HEALTH quand un écran listé nécessite une attention : display disconnected, hot (80 °C ou plus), on battery, crashing (3 plantages ou plus en 24 heures), ou stale.

Les transitions arrivent comme des événements screen.health_changed, affichés par events list et events follow avec une valeur changes= compacte comme display_disconnected,temperature_high temperature_c=82. Les commandes d’alimentation ajoutent screen.reboot_requested et screen.display_changed. Un horaire de redémarrage ajoute screen.reboot_schedule_changed lorsqu’il est défini ou effacé et screen.reboot_skipped avec un reason lorsqu’une fenêtre passe sans redémarrage ; screen.reboot_requested porte source, schedule quand l’horaire l’a émis. Comme tout événement screen.*, ils sont gratuits sur le flux d’écoute et en livraisons webhook. Une notification vous envoie un courriel, ou fait un POST d’un webhook signé, quand un afficheur se déconnecte, qu’un appareil surchauffe ou fonctionne sur sa batterie, ou qu’un Player plante sans cesse.

screen uptime, screen presence et screen health-history lisent ce qu’un écran a fait au fil du temps : disponibilité quotidienne, transitions en ligne et hors ligne, et l’état de santé qu’il a rapporté. project uptime et project health-trend lisent la flotte. Hors ligne est enregistré après qu’un écran est inaccessible pendant 60 secondes, et l’historique est conservé selon la rétention d’événements du forfait.

Code de problèmeSortieSens
reboot_unsupported5Le Player de l’écran ne déclare pas reboot. Rien n’a été envoyé ni stocké ; screen reload rafraîchit le contenu sans redémarrer l’appareil.
command_unsupported5Le Player de l’écran ne déclare pas clear_cache, restart_app ni update, la capacité dont la commande a besoin. Rien n’a été envoyé ; screen show liste les capacités hôtes et screen reload actualise le contenu.
resource_conflict5L’écran attend encore de se jumeler et n’a pas encore de Player pour basculer. Un horaire d’affichage peut encore être défini.
invalid_request8Un horaire d’affichage ou de redémarrage cible un écran sans fuseau horaire (next est screen set-timezone), ou le fichier est mal formé.
rate_limited7Redémarrages, et effacement du cache, redémarrage de l’application et mise à jour du logiciel ensemble : 2 par écran par 10 minutes et 600 par organisation par minute. Écritures d’affichage : 10 par écran et 600 par organisation par minute. Attendez retry_after_seconds.

Plusieurs identifiants ou --tag s’exécutent comme une seule requête de flotte avec l’enveloppe et les règles de sortie de la flotte.

screen reboot#

Redémarrer l’appareil d’un écran, ou les appareils d’une flotte.

screen reboot (<id>... | --tag TAG) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--yesbooleanpour plusieurs identifiants ou --tagdésactivéConfirme un redémarrage de flotte. Le CLI ne demande jamais.
--expires-in DURATIONstringnon24h, appliqué par le serveurDurée pendant laquelle la requête attend qu’un écran hors ligne revienne en ligne : 90s, 30m, 2h ou 1d, de 60s à 24h.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen reboot scr_LOBBY
screenrig screen reboot scr_LOBBY --expires-in 2h
screenrig screen reboot --tag Lobby --yes

Le Player redémarre l’appareil, pas seulement lui-même. Un écran en ligne reçoit le redémarrage tout de suite (state sent) ; un écran hors ligne le garde queued et le reçoit quand il revient en ligne avant expires_at, 24 heures après la demande sauf si --expires-in dit autrement. Un redémarrage plus récent remplace un redémarrage encore en file. screen show liste les commands de l’écran : un redémarrage envoyé devient done dès que l’appareil signale avoir démarré, et screen command cancel en annule un encore en file. Dans une flotte, le reboot de chaque résultat porte le même state. Une requête refusée ou en échec, et une répétition exacte de la même requête, ne comptent pas dans la limite par écran. Du moment où un redémarrage est envoyé jusqu’à ce que l’appareil signale avoir démarré ou que dix minutes s’écoulent, l’écran n’ouvre aucune alerte screen_offline ou display_disconnected ; un avis pour l’une ou l’autre qui arrive à échéance à ce moment attend la fin de cette période plus son délai d’attente, et un avis crashing est ignoré comme planned_reboot. Une condition qui tient toujours ensuite s’ouvre normalement.

screen clear-cache#

Vider les caches du Player d’un écran, ou des Players d’une flotte.

screen clear-cache (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id>, --tag ou --folderaucunUn ou plusieurs ID d’écran scr_. Plusieurs IDs s’exécutent comme une seule requête de flotte.
--tag TAGstringl’un de <id>, --tag ou --folderaucunChaque écran actif portant cette étiquette.
--folder IDstringl’un de <id>, --tag ou --folderaucunChaque écran actif de ce dossier d’écrans sfd_ et des dossiers qu’il contient.
--yesbooleanpour plusieurs identifiants, --tag ou --folderdésactivéConfirme une requête de flotte. Le CLI ne demande jamais.
--expires-in DURATIONstringnon24h, appliqué par le serveurDurée pendant laquelle la requête attend qu’un écran hors ligne revienne en ligne : 90s, 30m, 2h ou 1d, de 60s à 24h.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen clear-cache scr_LOBBY
screenrig screen clear-cache scr_LOBBY --expires-in 2h
screenrig screen clear-cache --tag Lobby --yes

Le Player supprime ses médias téléchargés, ses paquets d’application et ses caches de données, conserve son jumelage, son identité et ses paramètres, puis récupère de nouveau le manifeste et le contenu ; l’écran peut afficher son état de chargement pendant que le contenu se remplit. Cela n’atteint qu’un Player qui déclare clear_cache. Un écran en ligne reçoit la requête aussitôt (state sent) ; un écran hors ligne la conserve queued et la reçoit quand il revient en ligne avant expires_at, 24 heures après la requête sauf indication contraire de --expires-in. La réponse porte command_id, command, state et expires_at. Un Player qui ne déclare pas la capacité répond 409 command_unsupported et rien n’est envoyé ; dans une flotte, cet écran échoue seul. screen show liste la commande sous commands et, une fois que le Player rapporte, la marque done ou failed avec un cause et un court detail : cleared quand les caches sont vidés et que la récupération a commencé, ou clear_failed quand un cache ne peut pas être vidé. Une commande envoyée sans rapport reste sent. Une commande plus récente du même type remplace une commande encore en file d’attente, et screen command cancel annule une commande encore en file d’attente. Dans une flotte, le command de chaque résultat porte le même state. Une flotte (plusieurs identifiants, --tag ou --folder) nécessite --yes. Une requête refusée ou échouée, et une relecture exacte de la même requête, ne comptent pas dans la limite de 2 requêtes par écran toutes les 10 minutes pour clear-cache, restart-app et update-software réunis.

screen restart-app#

Redémarrer l’application du Player d’un écran, ou des Players d’une flotte.

screen restart-app (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id>, --tag ou --folderaucunUn ou plusieurs ID d’écran scr_. Plusieurs IDs s’exécutent comme une seule requête de flotte.
--tag TAGstringl’un de <id>, --tag ou --folderaucunChaque écran actif portant cette étiquette.
--folder IDstringl’un de <id>, --tag ou --folderaucunChaque écran actif de ce dossier d’écrans sfd_ et des dossiers qu’il contient.
--yesbooleanpour plusieurs identifiants, --tag ou --folderdésactivéConfirme une requête de flotte. Le CLI ne demande jamais.
--expires-in DURATIONstringnon24h, appliqué par le serveurDurée pendant laquelle la requête attend qu’un écran hors ligne revienne en ligne : 90s, 30m, 2h ou 1d, de 60s à 24h.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen restart-app scr_LOBBY
screenrig screen restart-app scr_LOBBY --expires-in 2h
screenrig screen restart-app --tag Lobby --yes

Le Player redémarre son application, pas l’appareil (un Player web recharge sa page) et rapporte depuis le processus redémarré. Cela n’atteint qu’un Player qui déclare restart_app ; screen reboot redémarre l’appareil. Un écran en ligne reçoit la requête aussitôt (state sent) ; un écran hors ligne la conserve queued et la reçoit quand il revient en ligne avant expires_at, 24 heures après la requête sauf indication contraire de --expires-in. La réponse porte command_id, command, state et expires_at. Un Player qui ne déclare pas la capacité répond 409 command_unsupported et rien n’est envoyé ; dans une flotte, cet écran échoue seul. screen show liste la commande sous commands et, une fois que le Player rapporte, la marque done ou failed avec un cause et un court detail : restarted, ou restart_failed quand le redémarrage ne peut pas démarrer. Une commande envoyée sans rapport reste sent. Une commande plus récente du même type remplace une commande encore en file d’attente, et screen command cancel annule une commande encore en file d’attente. Dans une flotte, le command de chaque résultat porte le même state. Une flotte (plusieurs identifiants, --tag ou --folder) nécessite --yes. Une requête refusée ou échouée, et une relecture exacte de la même requête, ne comptent pas dans la limite de 2 requêtes par écran toutes les 10 minutes pour clear-cache, restart-app et update-software réunis.

screen update-software#

Mettre à jour le Player d’un écran vers la plus récente version, ou les Players d’une flotte.

screen update-software (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id>, --tag ou --folderaucunUn ou plusieurs ID d’écran scr_. Plusieurs IDs s’exécutent comme une seule requête de flotte.
--tag TAGstringl’un de <id>, --tag ou --folderaucunChaque écran actif portant cette étiquette.
--folder IDstringl’un de <id>, --tag ou --folderaucunChaque écran actif de ce dossier d’écrans sfd_ et des dossiers qu’il contient.
--yesbooleanpour plusieurs identifiants, --tag ou --folderdésactivéConfirme une requête de flotte. Le CLI ne demande jamais.
--expires-in DURATIONstringnon24h, appliqué par le serveurDurée pendant laquelle la requête attend qu’un écran hors ligne revienne en ligne : 90s, 30m, 2h ou 1d, de 60s à 24h.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen update-software scr_LOBBY
screenrig screen update-software scr_LOBBY --expires-in 2h
screenrig screen update-software --tag Lobby --yes

Le Player vérifie maintenant la plus récente version du Player et l’installe là où sa plateforme lui permet de se mettre à jour lui-même ; un Player web met à jour son service worker, puis se recharge. Cela n’atteint qu’un Player qui déclare update : un Player installé depuis un magasin ou géré par un gestionnaire d’appareils se met à jour par ce canal. Un écran en ligne reçoit la requête aussitôt (state sent) ; un écran hors ligne la conserve queued et la reçoit quand il revient en ligne avant expires_at, 24 heures après la requête sauf indication contraire de --expires-in. La réponse porte command_id, command, state et expires_at. Un Player qui ne déclare pas la capacité répond 409 command_unsupported et rien n’est envoyé ; dans une flotte, cet écran échoue seul. screen show liste la commande sous commands et, une fois que le Player rapporte, la marque done ou failed avec un cause et un court detail : up_to_date quand la plus récente version s’exécute déjà, updated une fois la nouvelle version démarrée, ou, en cas d’échec, update_check_failed, download_failed, install_failed ou no_update_channel. Une commande envoyée sans rapport reste sent. Une commande plus récente du même type remplace une commande encore en file d’attente, et screen command cancel annule une commande encore en file d’attente. Dans une flotte, le command de chaque résultat porte le même state. Une flotte (plusieurs identifiants, --tag ou --folder) nécessite --yes. Une requête refusée ou échouée, et une relecture exacte de la même requête, ne comptent pas dans la limite de 2 requêtes par écran toutes les 10 minutes pour clear-cache, restart-app et update-software réunis.

screen command cancel#

Annuler une commande encore en file d’attente pour un écran hors ligne.

screen command cancel <id> <command_id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
<command_id>stringouiaucunUn ID issu de commands dans screen show, ou le reboot_id, le reload_id ou le command_id que la requête a renvoyé.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen command cancel scr_01EXAMPLESCREEN00000000 rbt_01EXAMPLEREBOOT00000000

Seule une commande en file d’attente peut être annulée. Une commande déjà envoyée (sent ou done) répond 409 resource_conflict avec "The command was already sent.", une commande qui n’est plus en file d’attente (expired, cancelled ou superseded) répond 409 resource_conflict avec "The command is no longer queued.", et un ID que l’écran ne répertorie pas répond 404 not_found. La réponse est l’écran avec la commande cancelled, et la révision de l’écran ne change pas.

screen display#

Allumez ou éteignez l’afficheur d’un écran, ou ceux d’une flotte, maintenant, ou effacez cette substitution.

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]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_. Un on ou off final après les IDs équivaut à --power.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--power on|offstringoui, pour setaucunLa puissance à appliquer maintenant.
--until TIMEstringnonla prochaine limite de l’horaire de l’afficheurUn instant RFC 3339 strict, strictement dans le futur et au plus 7 jours à l’avance.
--for DURATIONstringnonla prochaine limite de l’horaire de l’afficheur30m, 2h ou 3d, jusqu’à 6d23h59m. Pas avec --until.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen display scr_LOBBY --power off --for 2h
screenrig screen display --tag Lobby --power on
screenrig screen display clear --tag Lobby

screen display est une substitution manuelle de l’horaire d’affichage. Sans --until ni --for, elle se termine à la prochaine limite de l’horaire ; un changement ultérieur d’horaire d’affichage ou de fuseau horaire déplace cette fin à la nouvelle limite. Sans limite dans les huit prochains jours, par exemple sans horaire activé, elle tient jusqu’à screen display clear ou un remplacement. screen display clear termine la substitution, donc l’horaire d’affichage s’applique à nouveau ; sans cela, l’affichage est activé. Le Player applique chaque changement en une fois et rapporte la puissance atteinte.

screen display-schedule#

Afficher, définir ou effacer quand l’afficheur d’un écran est allumé.

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]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_ ; show en prend un.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--file FILEcheminoui, pour setaucunL’horaire d’affichage, ou - pour stdin.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
screenrig screen display-schedule set scr_LOBBY --file hours.json
screenrig screen display-schedule set --tag Cafe --file hours.json

Une programmation d’afficheur liste de 1 à 16 fenêtres lorsque l’afficheur est allumé, dans le fuseau horaire de l’écran ; en dehors de chaque fenêtre, l’afficheur passe en veille. Le Lecteur l’évalue sur l’appareil, donc cela continue de fonctionner hors ligne. Une fenêtre dont end est à ou avant son start traverse minuit, et une fenêtre sans start ni end couvre toute la journée. enabled: false conserve les fenêtres et laisse l’afficheur allumé. La sortie sauvegardée de display-schedule show peut être modifiée et renvoyée avec set --file.

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

screen show --human affiche Display: avec la puissance demandée, sa source (surcharge manuelle, horaire d’affichage ou défaut) et jusqu’à quand dans le fuseau horaire de l’écran, les fenêtres d’horaire, et la puissance rapportée par le Player, marquée périmée après 35 minutes sans rapport.

screen display-idle#

Assombrir un écran après un temps sans utilisation, ou désactiver cette option.

screen display-idle <id> --after SECONDS --wake WAKE [--expect-rev REVISION]
screen display-idle <id> --off [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--after SECONDSintegerl’un de --after ou --offaucunS’assombrir après ce nombre de secondes sans utilisation, de 30 à 86400. Nécessite --wake.
--wake WAKEstringavec --afteraucunCe qui rallume l’écran : touch, presence ou touch,presence. La présence lit la caméra de l’appareil sur l’appareil ; aucune image ne le quitte.
--offbooleanl’un de --after ou --offdésactivéDésactiver l’assombrissement à l’inactivité.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, 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

L’écran s’assombrit après --after secondes sans toucher ni touche ou, lorsque --wake liste presence, sans personne devant l’écran. Tant qu’il est sombre, le Player met la lecture en pause, sans diffusion ni publicité, et signale l’alimentation de l’afficheur éteinte ; un événement de réveil rallume l’écran aussitôt et la lecture reprend, et le toucher qui réveille un écran sombre n’est pas transmis à la page. Un horaire d’affichage ou une substitution qui garde le panneau éteint l’emporte, tout comme une application qui détient device.display tant que sa page est à l’écran. Seul display.idle change. Un Player l’applique lorsque screen show liste display_power.idle dans ses capacités d’hôte ; le paramètre est enregistré dans les deux cas, et screen show le liste comme Display idle. L’accès Propose ne peut pas le modifier (insufficient_access), et un écran dans un dossier protégé le refuse (protected_target).

screen brightness#

Définir si la luminosité d’un écran suit le capteur de lumière de l’appareil.

screen brightness <id> --mode auto|fixed [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--mode auto|fixedstringouiaucunauto règle la luminosité d’après le capteur de lumière de l’appareil ; fixed conserve la luminosité de l’opérateur, valeur par défaut.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen brightness scr_LOBBY --mode auto
screenrig screen brightness scr_LOBBY --mode fixed --expect-rev 4

Seul display.brightness change. Un Player applique auto lorsque screen show liste brightness.auto dans ses capacités d’hôte, qu’un appareil déclare seulement avec un capteur de lumière ; une application qui règle la luminosité de l’afficheur l’emporte tant que sa page est affichée. Le paramètre est enregistré dans les deux cas, et screen show le liste comme Display brightness. Les règles d’accès de screen display-idle s’appliquent.

screen kiosk-lock#

Épingler le Player d’un écran à l’écran, ou le libérer.

screen kiosk-lock <id> (--on | --off) [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--on, --offbooleanl’un des deuxaucun--on épingle le Player à l’écran ; --off le libère.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig screen kiosk-lock scr_LOBBY --on
screenrig screen kiosk-lock scr_LOBBY --off --expect-rev 4

--on utilise l’épinglage d’écran Android : la personne devant l’écran confirme la première fois, et la barre d’état, l’accueil et les applications récentes sont bloqués tant que le Player est épinglé. Le panneau de paramètres de l’opérateur peut quitter le verrouillage jusqu’à ce que le prochain manifeste ou redémarrage l’applique de nouveau. Un Player l’applique lorsque screen show liste kiosk_lock dans ses capacités d’hôte ; le paramètre est enregistré dans les deux cas, et screen show liste Kiosk lock tant qu’il est activé. Les règles d’accès de screen display-idle s’appliquent.

screen reboot-schedule#

Afficher, définir ou effacer le moment où le backend redémarre l’appareil d’un écran.

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]
ParamètreTypeRequisPar défautNotes
<id>...stringl’un de <id> ou --tagaucunUn ou plusieurs ID d’écran scr_ ; show en prend un.
--tag TAGstringl’un de <id> ou --tagaucunChaque écran actif portant cette étiquette.
--window SPECstringl’un de --window ou --file, pour setaucunRedémarrer au début de cette fenêtre hebdomadaire, DAYS HH:MM-HH:MM dans le fuseau horaire de l’écran, comme "Mon-Sun 04:00-04:30" (DAYS@HH:MM-HH:MM fonctionne aussi). Répétez jusqu’à 16 fois ; chaque fenêtre dure de 5 minutes à 24 heures.
--file FILEcheminl’un de --window ou --file, pour setaucunL’horaire de redémarrage en JSON, ou - pour l’entrée standard, au lieu de --window.
--enabled, --disabledbooleannon--enabled--disabled conserve les fenêtres et ne redémarre rien. Pas avec --file.
--expect-rev REVISIONstringnonaucunUn seul ID d’écran. Condition de révision optionnelle.
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

Au début de chaque fenêtre, dans le fuseau horaire de l’écran, screenRIG émet le même redémarrage que screen reboot, de sorte que "Mon-Sun 04:00-04:30" redémarre l’écran à 04:00 heure locale chaque jour. commands dans screen show le liste avec source schedule, et screen show et reboot-schedule show affichent next_reboot_at. Une fenêtre dont la fin est égale ou antérieure au début passe minuit, et une fenêtre sans heures couvre toute la journée. La sortie enregistrée de reboot-schedule show peut être modifiée et renvoyée avec set --file :

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

Un écran en ligne reçoit le redémarrage tout de suite. Un écran hors ligne ne le garde en file que jusqu’à la fin de sa fenêtre, de sorte qu’un redémarrage ne tombe jamais en dehors de la fenêtre : un écran qui revient après celle-ci n’en reçoit aucun. Un début situé dans le saut de l’heure d’été part à la première minute valide de la fenêtre, et une répétition du retour à l’heure normale part une fois par fenêtre et par date locale. Un redémarrage planifié ne remplace jamais un redémarrage demandé par une personne qui attend encore l’écran ; l’occurrence est ignorée avec screen.reboot_skipped (reboot_pending). L’écran a besoin d’un fuseau horaire enregistré et d’un Player qui déclare reboot ; un écran qui perd reboot par la suite ignore chaque fenêtre et conserve son horaire. Modifier le fuseau horaire déplace next_reboot_at vers le nouveau fuseau. Un redémarrage envoyé par un horaire ne déclenche aucune alerte hors ligne, comme sous screen reboot. screen.reboot_schedule_changed consigne chaque définition ou effacement. Dans une flotte, chaque résultat est propre à l’écran : reboot_unsupported pour un écran dont le Player ne peut pas redémarrer.

screen uptime#

Lire la disponibilité quotidienne d’un écran sur des jours UTC.

screen uptime <id> [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--day-from YYYY-MM-DDstringnon29 jours avant --day-toPremier jour UTC, inclus.
--day-to YYYY-MM-DDstringnonaujourd’huiDernier jour UTC, inclusivement. Au maximum 366 jours après --day-from.
screenrig screen uptime scr_01EXAMPLESCREEN00000000
screenrig screen uptime scr_01EXAMPLESCREEN00000000 --day-from 2026-09-01 --day-to 2026-09-30

data.items liste une ligne par jour UTC avec un état enregistré, du plus ancien au plus récent : online_s, offline_s, availability (en ligne pendant la période enregistrée ; null quand rien n’a été enregistré), coverage (la part de la journée avec un état enregistré), intervals, et live pour un jour incluant l’intervalle ouvert jusqu’à maintenant. Le temps sans état enregistré réduit coverage et n’est jamais un temps d’arrêt. Les jours sans enregistrement n’ont pas de ligne.

screen presence#

Lister les transitions en ligne et hors ligne d’un écran, les plus récentes d’abord.

screen presence <id> [--since TIME] [--until TIME]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--since TIMEstringnon30 jours avant --untilDébut inclusif de l’heure de transition : un instant RFC 3339 avec secondes et décalage (normalisé en UTC), now, ou un âge tel que 7d, 12h ou 30m.
--until TIMEstringnonmaintenantFin exclusive, dans les mêmes formes. Au maximum 366 jours après --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 porte at, state et detected_on_reconnect sur un hors ligne que le serveur a remarqué seulement quand l’écran s’est reconnecté (at est alors la fin de son bail de présence). La CLI suit next_cursor jusqu’à la fin et répond à chaque transition avec next_cursor null, donc restreignez une longue plage avec --since.

screen health-history#

Lister la santé rapportée par un écran au fil du temps, chaque rapport ou un résumé par heure.

screen health-history <id> [--from TIME] [--to TIME] [--resolution raw|hour]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’écran scr_.
--from TIMEstringnon24 heures avant --toDébut inclusif de l’heure du rapport : un instant RFC 3339 avec secondes et décalage (normalisé en UTC), now, ou un âge tel que 7d, 12h ou 30m.
--to TIMEstringnonmaintenantFin exclusive, dans les mêmes formes. Au maximum 31 jours après --from, 93 avec --resolution hour.
--resolutionstringnonrawraw liste chaque rapport accepté ; hour résume chaque heure UTC.
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 6h
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 30d --resolution hour

raw répond data.samples, chaque rapport accepté ayant la forme de health de screen show sans stale. hour répond data.hours, un résumé par heure UTC : rapports, température maximale et moyenne, charge maximale et ratio mémoire, signal Wi-Fi le plus faible, display_disconnected, et nombre maximal de plantages et de redémarrages du moteur de rendu. La CLI suit next_cursor jusqu’à la fin, donc restreignez une longue plage brute ou utilisez --resolution hour. Les rapports bruts arrivent en quelques secondes et les résumés horaires en environ 5 minutes.

Commentaires

Un commentaire est l’objet JSON propre à l’agent attaché à un écran, une liste de lecture ou une page de liste de lecture. L’UTF-8 compact de cet objet fait au maximum 1 KiB, et la valeur doit être un objet. screenRIG ne le lit jamais, ne l’envoie jamais aux Lecteurs, et ne le traite jamais comme une autorisation. Il n’apparaît pas dans le manifeste d’exécution et ne fait pas avancer une révision, donc ces commandes ne prennent pas de --expect-rev : la dernière écriture l’emporte.

comment show#

Lire l’objet commentaire sur un écran, une liste de lecture ou une page de liste de lecture.

comment show screen <id>
comment show playlist <id> [--page PAGE_ID]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant scr_ ou pl_, correspondant au mot cible.
--page PAGE_IDstringnonla liste de lecture elle-mêmeUn ID de page de liste de lecture : une lettre, puis jusqu’à 63 lettres, chiffres, traits de soulignement ou traits d’union. Cible uniquement les listes de lecture.
screenrig comment show screen scr_01EXAMPLESCREEN00000000

Un commentaire non défini se lit comme { "comments": null }. screen show et playlist show incluent comments quand le serveur l’envoie.

comment set#

Écrivez l’objet commentaire.

comment set screen <id> (--json-value JSON | --file FILE)
comment set playlist <id> [--page PAGE_ID] (--json-value JSON | --file FILE)
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant scr_ ou pl_.
--json-value JSONstringl’un des deuxaucunUn objet JSON, en ligne.
--file FILEcheminl’un des deuxaucunUn fichier contenant un objet JSON.
--page PAGE_IDstringnonla liste de lecture elle-mêmeCibles de la liste de lecture uniquement.
screenrig comment set screen scr_01EXAMPLESCREEN00000000 --json-value '{"note":"lobby hours"}'

La création et la mise à jour de liste de lecture ne peuvent pas définir de commentaires ; c’est ce à quoi servent ces commandes.

comment delete#

Supprimer l’objet commentaire.

comment delete screen <id>
comment delete playlist <id> [--page PAGE_ID]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant scr_ ou pl_.
--page PAGE_IDstringnonla liste de lecture elle-mêmeCibles de la liste de lecture uniquement.
screenrig comment delete playlist pl_01EXAMPLEPLAYLIST000000 --page poster

Notes du projet

Les notes de projet sont de courtes notes en texte brut que les agents laissent sur un projet pour leurs sessions ultérieures et pour les autres. Chaque agent du projet lit chaque note, et en écrire une nécessite un accès Proposer ou Gérer. Une note est un contexte écrit par un agent, jamais une instruction ni une approbation. Lisez les notes au début d’une session dans un projet, avant de modifier quoi que ce soit.

Une note sans TTL revient en révision 90 jours après son ajout ou sa dernière confirmation. La première page de notes list renvoie jusqu’à cinq notes dues dans review, avec l’avertissement notes_due_for_review : confirmez celles qui tiennent encore et résolvez les autres. Une note due que personne ne confirme se résout d’elle-même 30 jours après avoir été renvoyée à un agent avec accès Proposer ou Gérer. Une note avec --ttl se résout d’elle-même à l’expiration de son délai, et la suppression de l’écran ou de la liste de lecture concernée résout la note. Les notes résolues restent lisibles 30 jours, puis sont supprimées. Une organisation contient au maximum 200 notes ouvertes, tous projets confondus.

agent status et login ajoutent l’avertissement notes_waiting lorsque les notes sont nouvelles ou à revoir. screen show et playlist show ajoutent notes_about_resource lorsque des notes ouvertes concernent cet écran ou cette liste de lecture. Ajouter une note ajoute note.added au journal des événements et en résoudre une ajoute note.resolved ; aucune ne contient le texte de la note. Lire les notes ne débite pas le compteur.

notes list#

Lire les notes du projet, les plus récentes d’abord. screenrig notes exécute la même commande.

notes list [--all | --resolved] [--about ID] [--author AGENT_ID] [--limit N] [--after CURSOR]
ParamètreTypeRequisPar défautNotes
--alldrapeaunonnotes ouvertesInclure les notes résolues.
--resolveddrapeaunonnotes ouvertesSeules les notes résolues.
--about IDstringnonchaque noteSeules les notes concernant un écran ou une liste de lecture : screen:ID, playlist:ID, ou l’id.
--author AGENT_IDstringnonchaque auteurSeules les notes écrites par cet agent.
--limit Nintegernon50Taille de la page, de 1 à 200.
--after CURSORstringnonla première pageLe next_cursor de la page précédente.
screenrig notes

Chaque note contient son author (le nom et le type de l’agent), created_at, about, et deux indicateurs : new pour une note qu’un autre agent a écrite depuis votre dernière lecture, et due pour une note à réviser. La première page de notes ouvertes sans --about ni --author correspond à votre lecture : elle déplace votre marqueur de lecture (la lecture d’un agent Lecture seule ne déplace rien), donc new et counts.new décrivent ce qui a changé depuis votre lecture précédente.

notes show#

Lire une note, ouverte ou résolue.

notes show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant nte_ de la note.
screenrig notes show nte_01EXAMPLENOTE000000000

notes add#

Écrivez une note pour les agents du projet.

notes add <text> [--about ID] [--ttl DURATION] [--replaces ID]
notes add --file FILE [--about ID] [--ttl DURATION] [--replaces ID]
ParamètreTypeRequisPar défautNotes
<text>stringl’un des deuxaucunLa note : de 1 à 2 000 caractères de texte brut après suppression des espaces inutiles.
--file FILEcheminl’un des deuxaucunLire la note depuis un fichier, ou - pour l’entrée standard.
--about IDstringnonle projet entierLier la note à un écran ou une liste de lecture : screen:ID, playlist:ID ou l’identifiant.
--ttl DURATIONstringnonrévision après 90 joursRésoudre automatiquement la note après cette durée, en heures ou jours de 1h à 365d, par exemple 12h ou 3d.
--replaces IDstringnonaucunUne note ouverte que celle-ci remplace ; elle est résolue comme remplacée.
screenrig notes add "The lobby screen is mounted in portrait: design for 1080x1920." --about screen:scr_01EXAMPLESCREEN00000000

Écrivez des faits sur lesquels un autre agent agirait, jamais des rapports d’avancement ou du clavardage. Une note dont le texte (ignorant la casse et l’espacement) et le sujet répètent une note ouverte confirme cette note au lieu d’en ajouter une, avec l’avertissement note_matched_open. Le texte en forme d’identifiants est refusé avec note_contains_credential, et le texte qui ressemble à une instruction à un modèle avec note_rejected ; rien n’est stocké. La 201e note ouverte dans les projets de l’organisation est refusée avec note_limit_reached, dont le détail nomme les notes à résoudre d’abord.

notes confirm#

Indique qu’une note ouverte est toujours en cours. Sa prochaine révision est dans 90 jours.

notes confirm <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant nte_ d’une note ouverte.
screenrig notes confirm nte_01EXAMPLENOTE000000000

notes resolve#

Résoudre une note ouverte qui est erronée ou n’est plus vraie.

notes resolve <id> <reason>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant nte_ d’une note ouverte.
<reason>stringouiaucunCe qui est vrai maintenant, 1 à 500 caractères.
screenrig notes resolve nte_01EXAMPLENOTE000000000 "The lobby screen was remounted in landscape."

Une note résolue est refusée avec note_not_open.

Opérations

Les téléversements et les publications s’exécutent comme des opérations. media upload, media replace et app upload attendent la leur par défaut ; ces commandes servent à terminer une opération laissée en cours avec --no-wait.

operations show#

Lire l’état actuel d’une opération.

operations show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de l’opération depuis l’enveloppe qui l’a démarrée.
screenrig operations show op_01EXAMPLEOPERATION00000

operations wait#

Interrogez une opération jusqu’à sa fin.

operations wait <id> [--timeout MS] [--poll-ms MS]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de l’opération.
--timeout MSintegernon120000Date limite d’attente. Elle limite aussi chaque requête sous-jacente.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
screenrig operations wait op_01EXAMPLEOPERATION00000

operations cancel#

Demander au plan de contrôle d’annuler une opération.

operations cancel <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de l’opération.
screenrig operations cancel op_01EXAMPLEOPERATION00000

Événements

Le journal d’événements du projet enregistre ce que le projet a fait et ce que la flotte a fait. Une version publiée ajoute application.published ; une application qui appelle screenrig.emit(code) ajoute son propre événement, qui est la preuve la plus directe qu’elle a été exécutée sur un écran.

La présence est aussi dans le journal. screen.offline est écrit une fois qu’un écran est hors ligne depuis 60 secondes, et screen.online quand il revient ; une reconnexion dans ces 60 secondes n’écrit ni l’un ni l’autre. screen.offline porte details.offline_since et, quand l’écran a déjà été en ligne, details.last_online_at. screen.online porte details.last_online_at, plus details.offline_at quand l’écran était hors ligne avant de revenir. Comme chaque événement screen.*, ils sont gratuits sur le flux d’écoute, donc un agent peut garder events follow ouvert pour surveiller une flotte.

events list#

Lire une page finie d’événements de projet.

events list [--after CURSOR] [--limit N] [--type TYPE] [--screen-id ID] [--app-id ID]
ParamètreTypeRequisPar défautNotes
--after CURSORstringnonle début de la fenêtre de pageReprendre après ce curseur.
--limit Nintegernonla taille de page du serveurTaille de page demandée.
--type TYPEstringnonchaque typeUn type d’événement, ou une famille par un préfixe se terminant par un point, comme note..
--screen-id IDstringnonchaque écranÉvénements dont la ressource est cet écran, y compris ceux émis par le SDK.
--app-id IDstringnontoutes les applicationsÉvénements de la ressource d’application, de ses versions et de ses entrées clé/valeur; exclut les événements émis par le SDK.
screenrig events list --limit 25
screenrig events list --type application.event --screen-id scr_SCREEN

Les méthodes emit() et emitConfirmed() du SDK ajoutent des enregistrements application.event dont la ressource est l’écran. Lisez-les avec --type application.event et, au besoin, --screen-id. Les champs details.primitive_id et details.code renvoyés identifient la primitive émettrice et l’action nommée. --app-id sélectionne les événements de la ressource d’application, de ses versions et de ses entrées clé/valeur, et exclut donc ces événements d’écran.

La sortie par défaut est une enveloppe JSON pour la page. Avec --human, la sortie est une ligne logfmt par événement : at=, type=, severity= et détails scalaires.

events follow#

Restez sur le flux d’événements et affichez les événements à leur arrivée.

events follow [--after CURSOR] [--timeout MS] [--type TYPE]
ParamètreTypeRequisPar défautNotes
--after CURSORstringnonla queue en directReprendre à partir de ce curseur.
--timeout MSintegernonpas de délaiMet fin à tout le suivi, y compris la temporisation de reconnexion.
--type TYPEstringnonchaque typeUn type d’événement, ou une famille par un préfixe se terminant par un point, comme note..
screenrig events follow

Une déconnexion ou une panne transitoire se reconnecte avec temporisation progressive et reprend depuis le dernier id d’événement. La relecture après reconnexion est gratuite. Les problèmes d’autorisation et de non-trouvé arrêtent la commande plutôt que de la réessayer.

Avec --type, le flux contient toujours tous les événements et le CLI n’affiche que ceux qui correspondent : screenrig events follow --type note. surveille les notes du projet.

La sortie par défaut est NDJSON : une enveloppe par événement sur sa propre ligne, plutôt qu’une seule enveloppe. Utilisez --human pour des lignes logfmt.

Notifications

Une notification avertit une personne, ou un autre système, lorsqu’un écran change d’état. Une notification par courriel envoie un courriel à chaque destinataire, une notification webhook envoie un POST HTTPS signé, et une notification Slack, Teams, PagerDuty ou Telegram publie un message dans une messagerie ou un outil d’alerte. Une organisation en compte au plus 50, tous canaux confondus et tous projets confondus, et chaque projet démarre avec un courriel à son propriétaire lorsqu’un écran est hors ligne depuis 10 minutes.

Une notification surveille les conditions que vous nommez :

ConditionCommence quandSe termine quand
screen_offlineLe Player est hors ligne depuis 60 secondes.L’écran est revenu en ligne.
display_disconnectedLe Player signale que son afficheur est déconnecté.L’afficheur se reconnecte.
running_hotL’appareil signale une température égale ou supérieure au seuil de surchauffe.La température revient à la normale.
on_batteryUn appareil muni d’une batterie signale qu’il fonctionne sur batterie, débranché.L’appareil signale une autre source d’alimentation.
storage_fullLe stockage du Player ne suffit pas pour son contenu.Le manque est comblé.
content_stuckLa mise à jour du contenu de l’écran est en nouvelle tentative, échouée, bloquée ou partielle.La mise à jour atteint un autre état.
not_playingLe Player affiche une erreur au lieu de son contenu. Un stockage plein est storage_full.Le statut du Player n’est plus une erreur.
loop_stalledUn écran en ligne, conforme à son horaire et dont le contenu est à jour n’a démarré aucune image ni vidéo depuis plus longtemps que ne le permet sa boucle.Une image ou une vidéo redémarre, ou screenRIG cesse de juger l’écran.
glass_blankLes captures d’écran prises par screenRIG sur une série couvrant toute la boucle étaient toutes d’une seule teinte uniforme.Deux captures d’écran de suite montrent une image, ou screenRIG cesse de juger l’écran.
glass_frozenLes captures d’écran prises par screenRIG sur une série couvrant toute la boucle montraient toutes la même image.Deux captures d’écran de suite montrent une image en mouvement, ou screenRIG cesse de juger l’écran.
crashingLe Player a planté ou redémarré son moteur de rendu à répétition.Jamais : chaque pic est un avis à part.
source_failedL'actualisation d'une source de données a échoué.Une actualisation réussit.
source_staleUne source de données a continué d'échouer jusqu'à l'expiration de ses données.Une actualisation réussit.
card_data_staleLes données d’une carte, écrites avec une expiration, l’ont atteinte alors qu’un écran affiche la carte et que rien ne les a renouvelées.Une écriture dans les données de la carte aboutit.
reach_droppedUne campagne atteint moins d’écrans qu’à sa dernière publication, parce que des écrans ont quitté ses étiquettes ou ses dossiers, ou ont été archivés ou supprimés.La campagne atteint de nouveau autant d’écrans, ou elle est publiée de nouveau.
group_emptyUne étiquette ou un dossier de l’audience d’une campagne ne correspond à aucun écran.L’étiquette ou le dossier correspond de nouveau à un écran, ou une publication le retire de l’audience.

Une condition déclenche un avis une fois qu’elle a duré --hold minutes (10 par défaut), donc une reconnexion rapide reste silencieuse. Si elle prend fin avant, rien n’est envoyé ; si elle prend fin après l’envoi d’un avis, un avis de résolution suit. crashing est envoyé immédiatement. Un avis est aussi ignoré lorsque quelqu’un acquitte ou reporte l’alerte de l’écran pendant le délai d’attente, ou lorsqu’une mise en sourdine couvre l’écran. --tag limite une notification aux écrans portant cette étiquette ; sans étiquette, tous les écrans comptent.

Chaque avis a une gravité. Un avis ouvert est error pour screen_offline et warning pour toute autre condition, et un avis résolu ou un test est info. --min-severity LEVEL (info, warning ou error) ne crée aucun avis ouvert sous ce niveau, et un avis résolu suit son avis ouvert. --severity CONDITION=LEVEL, répétable, définit le niveau d’une condition pour cette notification, comme --severity not_playing=error ; il compte pour --min-severity et est la gravité que Teams et PagerDuty affichent. Le texte des courriels, de Slack et de Telegram nomme la gravité, et le corps d’un webhook porte severity.

--active-hours SPEC envoie les avis ouverts seulement à l’intérieur de fenêtres hebdomadaires, lues dans --timezone ZONE, qu’il exige. SPEC est DAYS HH:MM-HH:MM, comme "Mon-Fri 08:00-22:00" ; répétez-le jusqu’à 16 fois. Avec --outside-hours hold, la valeur par défaut, un avis qui arrive à échéance en dehors des heures attend la prochaine fenêtre et part alors si sa condition tient toujours, de sorte qu’une condition qui disparaît d’abord n’envoie rien. Avec drop, l’avis est ignoré comme outside_hours, que notifications deliveries liste. Un avis résolu pour un avis ouvert qui a été envoyé part toujours, crashing suit les heures comme n’importe quelle autre condition, un report est vérifié en premier, et notifications test ignore les heures, la gravité et l’audience.

--audience FILE (JSON en ligne, un fichier ou - pour l’entrée standard) choisit les écrans selon les règles d’une audience de campagne, comme {"all":[{"tag":"level2"},{"tag":"overhead"}]} pour les écrans portant les deux étiquettes ; --all-tags TAG et --any-tag TAG sont les raccourcis pour une règle all et une règle any d’étiquettes, et --tag signifie n’importe laquelle des étiquettes. --tag, --any-tag, --all-tags et --audience s’excluent mutuellement.

loop_stalled, glass_blank et glass_frozen sont des verdicts que screenRIG tire des rapports de lecture et des captures d’écran qu’il reçoit, et ils laissent de côté ce qu’ils ne peuvent pas juger : un écran hors ligne, dont l’affichage est éteint, sous prise de contrôle ou suspendu, qui montre une seule image fixe ou un mur vidéo, ou dont le Player n’envoie pas de numéros de lecture. Lorsque screenRIG cesse de juger un écran qu’il avait trouvé dans l’un de ces états, l’alerte se ferme, mais le courriel, Slack, Teams et Telegram n’envoient aucun avis de résolution, car rien n’a montré que l’écran se rétablissait ; PagerDuty résout tout de même son incident.

source_failed et source_stale surveillent les sources de données du projet, pas ses écrans : un avis nomme la source et renvoie à sa page, et --tag ne correspond jamais à une source.

card_data_stale surveille une carte, pas un écran. Écrivez les données d’une carte avec une expiration adaptée au calendrier de son rédacteur (card data put --ttl 30m) : quand la tâche ou l’agent qui les renouvelle s’arrête, les données expirent, la carte est vide sur chaque écran qui l’affiche, et cette condition vous en informe. L’avis nomme la carte et le moment où ses données ont expiré, et renvoie à l’éditeur de pages sur une page qui la place. Les documents d’une source de données ne sont jamais annoncés ici (source_stale s’en charge), pas plus qu’une carte qu’aucun écran n’affiche, des données écrites sans expiration ou des données supprimées. --tag ne correspond jamais à une carte.

reach_dropped et group_empty surveillent une campagne, pas un écran. L’avis nomme la campagne et les écrans qu’elle atteignait avant et atteint maintenant, ou l’étiquette ou le dossier vide, et renvoie au calendrier de la campagne. Une campagne appartient au projet, donc --tag, --any-tag, --all-tags et --audience ne les limitent jamais ; --min-severity, --severity, --active-hours et --hold s’appliquent comme pour toute condition, et les deux sont warning par défaut. --reach-drop-screens N et --reach-drop-percent P n’envoient un avis reach_dropped que pour une baisse d’au moins N écrans et d’au moins P pour cent des écrans que la campagne atteignait lors de sa publication ; une baisse doit remplir les deux seuils, et sans eux toute baisse déclenche un avis. Ils exigent reach_dropped dans --conditions. Chaque étiquette ou dossier vide d’une campagne donne son propre avis, et notifications deliveries l’affiche comme audience_group (tag:Lobby ou folder:sfd_…). Une publication qui retire un groupe vide de l’audience ferme un incident PagerDuty et l’alerte d’un webhook, mais n’envoie aucun courriel ni message de rétablissement dans une messagerie.

Le courriel est envoyé à l’adresse vérifiée de chaque destinataire, un courriel par destinataire pour tout ce qui arrive à échéance en l’espace d’environ deux minutes, avec un lien vers chaque écran et vers la notification dans le tableau de bord. Les destinataires sont owner (la personne qui possède le projet au moment de l’envoi de l’avis) et les identifiants d’utilisateur des membres du projet. Un destinataire sans adresse vérifiée, ou qui a quitté le projet, est ignoré. Les courriels de notification et les avis d’écran sont gratuits.

Chaque courriel contient un lien de désabonnement pour son propre destinataire : le bouton de désabonnement des applications de courriel et un lien dans le pied de page. Le suivre arrête les courriels de cette notification pour cette seule personne, sans connexion, et la page qui s’ouvre contient un bouton Resubscribe. Les autres destinataires ne sont pas touchés, et la personne reste parmi les destinataires. notifications show indique qui s’est désabonné avec unsubscribed, et notifications resubscribe lui renvoie des courriels. Un avis sans personne à qui écrire est ignoré avec no_recipients.

Une notification par webhook envoie chaque avis par POST en JSON, et vous le vérifiez comme décrit dans Vérifier une livraison. Avec --events, elle envoie aussi par POST les événements bruts du projet au fur et à mesure ; ces livraisons sont mesurées comme décrit dans Webhooks.

Une notification Slack, Teams, PagerDuty ou Telegram publie un message par panne et par écran : l'écran, ce qui a changé, depuis quand, le projet, un lien vers l'écran et, lorsqu'un écran hors ligne revient, sa cause probable si elle est connue à ce moment-là. Un message de rétablissement suit une fois le premier envoyé et, dans PagerDuty, il résout l'incident ouvert par le premier. Vous donnez le justificatif une seule fois (--slack prend l'URL d'un webhook entrant, --teams l'URL d'un webhook Workflows, --pagerduty une clé d'acheminement de l'API Events v2, --telegram un jeton de bot avec --telegram-chat); il est scellé, jamais affiché de nouveau, et destination_hint n'en montre que la fin masquée. Un - le lit depuis une ligne de stdin pour qu'il reste hors de l'historique de votre shell. Une publication échouée est retentée pendant 24 heures, et une notification qui échoue pendant 72 heures est désactivée.

Code de problèmeSortieSens
webhook_url_rejected8L’URL n’est pas https sur le port 443 ou 8443, ou son hôte ne résout pas uniquement en adresses Internet publiques. error.detail indique la raison du serveur. Rien n’a été créé ni modifié.
notification_destination_rejected8La destination ne convient pas à son canal, ou c'est l'URL d'un connecteur Office 365 retiré. error.detail indique la forme attendue. Rien n'a été créé ni modifié.
notification_limit_reached5L’organisation a déjà 50 notifications. Supprimez-en une d’abord.
revision_conflict6La révision --expect-rev était périmée. Exécutez notifications show, puis réessayez.
rate_limited7Plus de 20 appels notifications test en une minute pour cette organisation.

notifications create#

Créer une notification par courriel, webhook, Slack, Teams, PagerDuty ou 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]
ParamètreTypeRequisPar défautNotes
--email RECIPIENTSstringun indicateur de canalaucunEnvoyer un courriel à ces destinataires séparés par des virgules : owner, ou l’identifiant d’utilisateur d’un membre du projet, au maximum 20.
--webhook URLstringun indicateur de canalaucunUne URL https sur le port 443 (par défaut) ou 8443 dont l’hôte ne résout qu’en adresses Internet publiques. Le serveur la vérifie à chaque écriture et de nouveau avant chaque livraison. Une URL portant des identifiants (user:pass@ ou token@) ou un fragment # est refusée localement avec la sortie 2.
--conditions LISTstringoui, sauf pour un webhookaucunConditions séparées par des virgules, tirées du tableau ci-dessus. Un webhook nécessite ce paramètre, --events, ou les deux.
--slack URLstringun indicateur de canalaucunPublier dans Slack avec l'URL d'un webhook entrant sur hooks.slack.com, ou - pour la lire depuis une ligne de stdin.
--teams URLstringun indicateur de canalaucunPublier dans Teams avec l'URL d'un webhook Workflows (le déclencheur « Lorsqu'une requête webhook Teams est reçue »), ou - pour stdin. Les URL de connecteurs Office 365 sont retirées et refusées.
--pagerduty KEYstringun indicateur de canalaucunDéclencher et résoudre des incidents PagerDuty avec une clé d'acheminement de l'API Events v2, ou - pour stdin.
--telegram TOKENstringun indicateur de canalaucunPublier dans Telegram avec un jeton de bot, ou - pour stdin. Nécessite --telegram-chat.
--telegram-chat CHAT_IDstringavec --telegramaucunLa conversation où publier : son identifiant numérique, par exemple -1001234567890, ou @channelname.
--events TYPESstringnonaucunWebhook seulement. Envoyer aussi par POST ces événements bruts du projet : 1 à 32 types exacts séparés par des virgules, comme screen.online, ou des préfixes finissant par .*, comme screen.*.
--tag TAGstringnonchaque écranSeulement les écrans portant cette étiquette. Répétez l’indicateur ou séparez par des virgules, jusqu’à 16 étiquettes.
--hold MINUTESintegernon10Combien de temps une condition doit durer avant de déclencher un avis, de 0 à 1440. Aucun délai d’attente ne s’applique à crashing.
--all-tags TAGstringnonaucunSeulement les écrans portant toutes les étiquettes listées. Répétez l’indicateur ou séparez par des virgules.
--any-tag TAGstringnonaucunSeulement les écrans portant au moins une des étiquettes listées, comme --tag. Répétez l’indicateur ou séparez par des virgules.
--audience FILEstringnonchaque écranLes écrans sous forme de règle d’audience de campagne en JSON : en ligne, un fichier, ou - pour l’entrée standard. Pas avec les options d’étiquettes.
--min-severity LEVELstringnonaucuninfo, warning ou error : les avis ouverts en dessous de ce niveau ne sont pas envoyés.
--severity CONDITION=LEVELstringnonles valeurs par défautDéfinit la gravité d’une condition pour cette notification. Répétez l’indicateur.
--active-hours SPECstringnontoujoursN’envoyer les avis ouverts qu’à l’intérieur de cette fenêtre hebdomadaire, DAYS HH:MM-HH:MM comme "Mon-Fri 08:00-22:00". Répétez jusqu’à 16 fois. Exige --timezone.
--timezone ZONEstringavec --active-hoursaucunLe fuseau IANA dans lequel les heures sont lues, comme America/Los_Angeles.
--outside-hours MODEstringnonholdhold attend la prochaine fenêtre ; drop ignore l’avis.
--reach-drop-screens Nintegernontoute baisseSeulement avec reach_dropped : n’envoie un avis que si la campagne a perdu au moins N écrans (1 ou plus).
--reach-drop-percent Pintegernontoute baisseSeulement avec reach_dropped : exige aussi une perte d’au moins P pour cent (1 à 100) des écrans que la campagne atteignait lors de sa publication.
--description TEXTstringnonaucunAu maximum 200 caractères.
--stale-after DURATIONstringnonselon le typeDurée pendant laquelle la carte garde les dernières bonnes données quand la source ne peut pas s'actualiser, de 1m à 7d, au moins le double de --refresh ; none les garde jusqu'à la prochaine actualisation. Ensuite, les données expirent sur chaque écran. momentus vaut 30m par défaut.
--disabledbooleannondésactivéCréer désactivée. Rien n’est envoyé avant 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

L’enveloppe est la notification. Celle d’un webhook contient son secret de signature dans data.secret (whsec_…) avec l’avertissement webhook_secret_shown_once. Stockez le secret dans le magasin de secrets du récepteur immédiatement. Seul notifications rotate-secret le renvoie à nouveau, et le CLI ne l’écrit jamais dans sa configuration, son journal d’opération ou son état de récupération d’écriture. Après une création interrompue ou ambiguë, relancez la même commande dans les 24 heures : elle réutilise la clé d’idempotence enregistrée, et le serveur renvoie la même réponse, secret inclus. Les avis commencent au premier événement qui suit la création de la notification.

notifications list#

Lister les notifications de ce projet, jamais leurs secrets.

notifications list
screenrig notifications list

En dessous de l’accès Gérer, le url d’un webhook est vide et url_redacted est vrai.

notifications show#

Inspecter une notification et sa santé de livraison.

notifications show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'identifiant de notification ntf_ (tout canal sauf webhook) ou whk_ (webhook).
screenrig notifications show ntf_01EXAMPLENOTICE00000

status est active, failing tant qu’aucune livraison n’a réussi depuis failing_since, ou disabled. Après 72 heures d’échec continu, la notification est désactivée avec disabled_reason: delivery_failures, et le journal des événements enregistre notification.disabled. snoozed_until est présent tant qu’une mise en sourdine est définie. last_success_at et last_failure_at rapportent les derniers résultats.

notifications update#

Modifier les destinataires, l'URL, la destination, les conditions, les écrans, le délai, la mise en veille ou l'état d'activation d'une notification.

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]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'identifiant de notification ntf_ (tout canal sauf webhook) ou whk_ (webhook).
--email RECIPIENTSstringau moins un changementinchangéNotifications par courriel : remplace les destinataires.
--url URLstringau moins un changementinchangéNotifications par webhook : remplace l’URL, vérifiée comme create.
--destination VALUEstringau moins un changementinchangéNotifications Slack, Teams, PagerDuty et Telegram : remplace le justificatif, vérifié comme avec create. - le lit depuis une ligne de stdin.
--telegram-chat CHAT_IDstringau moins un changementinchangéNotifications Telegram : remplace la conversation.
--conditions LISTstringau moins un changementinchangéRemplace les conditions.
--clear-conditionsbooleanau moins un changementdésactivéSupprimer toutes les conditions. Un webhook nécessite alors --events.
--events TYPESstringau moins un changementinchangéNotifications par webhook : remplace les événements bruts du projet.
--clear-eventsbooleanau moins un changementdésactivéNotifications par webhook : arrêter d’envoyer par POST les événements bruts du projet. La notification nécessite alors des conditions.
--tag TAGstringau moins un changementinchangéRemplace les étiquettes d’écran.
--all-screensbooleanau moins un changementdésactivéSupprimer les étiquettes d’écran et l’audience ; la notification couvre chaque écran.
--hold MINUTESintegerau moins un changementinchangé0 à 1440.
--all-tags TAGstringau moins un changementinchangéRemplace les écrans par ceux portant toutes les étiquettes listées.
--any-tag TAGstringau moins un changementinchangéRemplace les écrans par ceux portant au moins une des étiquettes listées, comme --tag.
--audience FILEstringau moins un changementinchangéRemplace les écrans par une règle d’audience de campagne en JSON : en ligne, un fichier, ou - pour l’entrée standard.
--min-severity LEVELstringau moins un changementinchangéinfo, warning ou error.
--clear-min-severitybooleanau moins un changementdésactivéSupprimer le filtre de gravité.
--severity CONDITION=LEVELstringau moins un changementinchangéRemplace les substitutions de gravité par celles-ci. Répétez l’indicateur.
--clear-severitybooleanau moins un changementdésactivéSupprimer chaque substitution de gravité.
--active-hours SPECstringau moins un changementinchangéRemplace les fenêtres par celles-ci. Répétez jusqu’à 16 fois. --timezone prend par défaut le fuseau que la notification a déjà.
--timezone ZONEstringau moins un changementinchangéLe fuseau IANA dans lequel les heures sont lues. Seul, il conserve les fenêtres actuelles.
--outside-hours MODEstringau moins un changementinchangéhold ou drop. Seul, il conserve les fenêtres actuelles.
--clear-active-hoursbooleanau moins un changementdésactivéSupprimer les heures actives. Les avis qui étaient en attente pour elles sont jugés de nouveau aussitôt.
--reach-drop-screens Nintegerau moins un changementinchangéRemplace le nombre minimal d’écrans que la campagne doit avoir perdus pour qu’un avis reach_dropped soit envoyé.
--reach-drop-percent Pintegerau moins un changementinchangéRemplace le pourcentage minimal de sa portée publiée que la campagne doit avoir perdu.
--clear-reach-dropbooleanau moins un changementdésactivéSupprimer le seuil, de sorte que toute baisse déclenche un avis. Retirez reach_dropped de --conditions seulement avec lui.
--description TEXTstringau moins un changementinchangéAu maximum 200 caractères.
--clear-descriptionbooleanau moins un changementdésactivéSupprimer la description.
--enablebooleanau moins un changementdésactivéEfface l’état d’échec et démarre à l’événement qui enregistre le changement ; rien de ce qui s’est produit pendant sa désactivation n’est envoyé.
--disablebooleanau moins un changementdésactivéArrête les avis ; les avis en attente échouent avec webhook_disabled.
--snooze WHENstringau moins un changementinchangéNe rien envoyer jusque-là : une durée comme 30m, 1h ou 2d (moins de 30 jours), un instant RFC 3339 avec secondes et décalage, ou off pour mettre fin à la mise en sourdine. Les avis qui arrivent à échéance entre-temps sont ignorés, pas envoyés plus tard.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision.
screenrig notifications update ntf_01EXAMPLENOTICE00000 --snooze 2h

update modifie uniquement les champs que vous passez. Le canal ne change jamais.

notifications delete#

Supprimer une notification. Ses avis en attente échouent avec webhook_deleted.

notifications delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'identifiant de notification ntf_ (tout canal sauf webhook) ou whk_ (webhook).
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision.
screenrig notifications delete ntf_01EXAMPLENOTICE00000

notifications rotate-secret#

Remplacer le secret de signature d'une notification webhook et recevoir le nouveau une seule fois. Tout autre canal n'a pas de secret.

notifications rotate-secret <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'identifiant de notification ntf_ (tout canal sauf webhook) ou whk_ (webhook).
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision.
screenrig notifications rotate-secret whk_01EXAMPLEWEBHOOK00000

L’enveloppe transporte le nouveau secret dans data.secret avec l’avertissement webhook_secret_shown_once ; stockez-le immédiatement. Le secret précédent cesse de signer, mais au plus une tentative déjà en cours peut encore arriver signée avec lui, donc acceptez les deux pendant un court moment. Après une rotation interrompue ou ambiguë, relancez la même commande dans les 24 heures pour récupérer le même secret.

notifications test#

Envoyer un courriel de test, un POST de test signé ou un message de messagerie à cette notification seulement.

notifications test <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'identifiant de notification ntf_ (tout canal sauf webhook) ou whk_ (webhook).
screenrig notifications test ntf_01EXAMPLENOTICE00000

L’enveloppe est la livraison en file d’attente. Elle est tentée une fois sans nouvelle tentative, fonctionne sur une notification désactivée ou en sourdine, et ne change jamais l’état d’échec de la notification. Au plus 20 livraisons de test par minute et par organisation ; au-delà, la réponse est rate_limited (sortie 7). Lisez le résultat avec notifications deliveries.

Un test PagerDuty déclenche un événement d'information de clé screenrig:test:DELIVERY_ID et le résout aussitôt, de sorte qu'aucun incident ne reste ouvert.

notifications resubscribe#

Envoyer de nouveau les courriels d’une notification à une personne qui s’est désabonnée.

notifications resubscribe <id> --user USER_ID
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant ntf_ d’une notification par courriel.
--user USER_IDstringouiaucunL’identifiant d’utilisateur de la personne, tel que notifications show l’indique sous unsubscribed.
screenrig notifications resubscribe ntf_01EXAMPLENOTICE00000 --user usr_01EXAMPLEPERSON0000

L’enveloppe est la notification. Une personne qui n’est pas désabonnée ne change rien. Réabonner une personne augmente la révision et ajoute notification.updated. Une notification d’un autre canal ou d’un autre projet est not_found (sortie 4).

notifications deliveries#

Lire le journal de livraison d’une notification, du plus récent au plus ancien.

notifications deliveries <id> [--before CURSOR] [--limit N]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL'identifiant de notification ntf_ (tout canal sauf webhook) ou whk_ (webhook).
--before CURSORstringnonl’événement le plus récentLe next_cursor (whc1_…) de la page précédente.
--limit Nintegernon50Lignes par page, de 1 à 200.
screenrig notifications deliveries ntf_01EXAMPLENOTICE00000 --limit 20

Chaque ligne correspond à un événement, ou à un avis pour une condition sur un écran : event_type, state (pending, succeeded, failed ou skipped), attempts, last_status et une classe fixe last_error telle que http_status, timeout, connection_failed, tls_failed, dns_failed, url_rejected, email_failed ou email_rejected. Un avis d’écran ajoute condition, phase (opened ou resolved), screen_id, screen_name et since, et un avis par courriel ajoute emailed, le nombre de personnes jointes. Un avis qui n’a jamais eu besoin d’être envoyé est skipped, avec sa raison dans last_error : condition_cleared (l’écran a quitté l’état avant la fin du délai d’attente), not_opened (aucun avis envoyé à résoudre), snoozed (la notification est en sourdine), acknowledged (quelqu’un a acquitté ou reporté l’alerte de l’écran pendant le délai d’attente), muted (une mise en sourdine couvre l’écran), no_recipients (aucun destinataire n’est un membre du projet avec une adresse vérifiée qui ne s’est pas désabonné), grouped (l’écran est passé dans la condition avec d’autres, et un seul avis sur une autre ligne les annonce tous) ou no_longer_judged (une condition loop_stalled, glass_blank ou glass_frozen s’est terminée parce que screenRIG a cessé de juger l’écran, donc aucun rétablissement n’a été annoncé). L’avis qui a annoncé un groupe d’écrans porte group (id, attribute, value et count), et chaque autre écran du groupe porte group_id ; --human affiche les deux dans une colonne GROUP. Les lignes n’incluent jamais la réponse du récepteur. next_cursor est null à la fin du journal. Une tentative échouée est réessayée avec un délai progressif, 30 secondes doublant jusqu’à une heure, pendant 24 heures, puis la ligne est failed.

Vérifier une livraison

Le corps d’un avis d’écran est du JSON : type (alert.opened ou alert.resolved), id (l’identifiant de livraison), notification_id, project_id, condition, screen (id et name), since (quand la condition a commencé), at (quand elle a duré assez longtemps, ou quand elle a pris fin) et event_id. Un événement brut issu de --events est le même objet JSON que events list renvoie. Les en-têtes sont ScreenRig-Webhook-Id (l’identifiant de la notification), ScreenRig-Event-Id (stable entre tentatives : l’identifiant de livraison pour un avis, le curseur d’événement pour un événement), et ScreenRig-Signature: t=<unix seconds>,v1=<hex>, où v1 est un HMAC-SHA256 sur "<t>.<raw body>" avec la chaîne secrète. Calculez-le sur les octets bruts avant d’analyser le JSON, comparez en temps constant, rejetez un ancien t, et dédupliquez sur ScreenRig-Event-Id, car la livraison est au moins une fois et non ordonnée. Répondez 2xx dans les 10 secondes ; les redirections ne sont pas suivies.

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);
}

Rapports

reports show KIND génère un rapport (fleet_health, uptime, publishing, alerts, alert_log ou proof_of_play) et, avec --format csv, xlsx ou pdf et --output FILE, l'écrit dans un fichier; reports subscriptions envoie un rapport par courriel aux membres du projet selon un horaire; project export DIR écrit les données du projet avec le résultat de chaque section. Rapports et exportations décrit chacun d'eux.

Journal d’audit

audit list|show|head|verify|export lit le journal d’audit du projet : audit list recherche les modifications de configuration par acteur, source, ressource, action et champ, audit show affiche une entrée avec l’avant et l’après de chaque champ modifié, audit head affiche la tête de chaîne à conserver comme ancre, audit verify recalcule la chaîne (au besoin par rapport à une ancre) et se termine avec le code 13 lorsqu’elle n’est pas vérifiée, et audit export écrit le journal filtré dans un fichier CSV, XLSX ou PDF. Journal d’audit décrit chacune de ces commandes.

Alertes

Une alerte est un problème sur un écran, tant qu’il dure. Elle s’ouvre lorsqu’un écran entre dans une condition de notification autre que crashing, qu’une notification la surveille ou non, et se résout lorsque la condition prend fin. Un écran a au plus une alerte ouverte par condition, et un pic de plantages est un avis, jamais une alerte. alerts list montre ce qui est ouvert maintenant.

Une alerte ouverte demande de l’attention jusqu’à ce que quelqu’un l’acquitte ou la reporte, ou qu’une mise en sourdine couvre son écran. Acquitter signifie que quelqu’un s’en occupe : l’alerte reste ouverte, enregistre qui l’a acquittée et quand, et ne demande plus d’attention jusqu’à sa résolution. Reporter acquitte jusqu’à un moment au plus 30 jours plus tard, et l’alerte demande de nouveau de l’attention à ce moment si elle est encore ouverte. Un acquittement ou un report ultérieur remplace le précédent. Tant qu’une alerte est acquittée ou reportée, l’avis d’une notification à son sujet qui est encore en délai d’attente est ignoré.

Une mise en sourdine sert à la maintenance : elle nomme des écrans, des étiquettes ou les deux, et prend fin à un moment au plus 30 jours plus tard. Elle couvre un écran tant que son identifiant est listé ou qu’il porte une étiquette listée ; un écran étiqueté plus tard est donc couvert, et un écran qui perd l’étiquette ne l’est plus. Les alertes d’un écran en sourdine s’ouvrent et se résolvent toujours, marquées muted, mais n’exigent jamais d’attention, et chaque notification ignore leurs avis. Une organisation compte au plus 50 mises en sourdine en cours, tous projets confondus.

counts.attention dans alerts list est le nombre que le tableau de bord affiche à côté d’Alertes. L’ouverture, la résolution et l’acquittement d’une alerte ajoutent screen.alert_opened, screen.alert_resolved et screen.alert_acknowledged au journal des événements du projet, et la création et la fin d’une mise en sourdine ajoutent alert_mute.created et alert_mute.deleted. Comme tout événement screen.*, ils sont gratuits sur le flux d’écoute. Les alertes résolues restent listées pendant la rétention d’événements du forfait. La lecture des alertes et des mises en sourdine demande l’accès Lecture seule ; acquitter, reporter, mettre en sourdine et lever une mise en sourdine demandent l’accès Gérer.

Code de problèmeSortieSens
alert_not_open5L’alerte est déjà résolue, il n’y a donc rien à acquitter ni à reporter. Exécutez alerts list et utilisez une alerte ouverte.
alert_mute_limit_reached5L’organisation compte déjà 50 mises en sourdine en cours. Terminez-en une avec alerts unmute, ou couvrez plus d’écrans avec une seule mise en sourdine par étiquette.
invalid_request8L’instant --until est à plus de 30 jours dans le futur. Rien n’a été modifié.
not_found4Aucune alerte ni mise en sourdine du projet n’a cet identifiant. Une alerte résolue disparaît après la rétention d’événements du forfait, et une mise en sourdine dès qu’elle est terminée.

alerts list#

Lister les alertes de ce projet, les ouvertes d’abord.

alerts list [--state open|resolved|all] [--screen-id ID] [--before CURSOR] [--limit N]
ParamètreTypeRequisPar défautNotes
--state STATEstringnonopenopen, resolved ou all.
--screen-id IDstringnonchaque écranSeulement les alertes de cet écran.
--before CURSORstringnonla première pageLe next_cursor de la page précédente.
--limit Nintegernon100Lignes par page, de 1 à 200.
screenrig alerts list
screenrig alerts list --state all --screen-id scr_01EXAMPLESCREEN00000000

Chaque ligne est une alerte : id (alr_…), screen_id, screen_name, condition, state (open ou resolved), since (quand la condition a commencé), resolved_at une fois résolue, acknowledged_at et acknowledged_by (kind, id et name de la personne ou de l’agent) une fois acquittée, snoozed_until pendant un report, muted et attention. Les alertes ouvertes viennent en premier, les plus récentes d’abord. counts contient open et attention pour tout le projet, quels que soient la page et les filtres, et next_cursor est null à la fin.

alerts show#

Afficher une alerte.

alerts show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’alerte alr_.
screenrig alerts show alr_01EXAMPLEALERT000000

L’enveloppe est l’alerte, sous la forme d’une ligne alerts list.

alerts ack#

Acquitter une alerte ouverte : quelqu’un s’en occupe.

alerts ack <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’alerte alr_.
screenrig alerts ack alr_01EXAMPLEALERT000000

L’alerte reste ouverte et ne demande plus d’attention jusqu’à sa résolution ; acknowledged_by nomme la personne ou l’agent et acknowledged_at l’heure. L’avis d’une notification encore en délai d’attente est ignoré. Acquitter de nouveau remplace l’acquittement ou le report précédent. Une alerte résolue donne alert_not_open (sortie 5). L’enveloppe est l’alerte, et le journal des événements enregistre screen.alert_acknowledged.

alerts snooze#

Acquitter une alerte ouverte jusqu’à un moment donné, afin qu’elle demande de nouveau de l’attention à ce moment.

alerts snooze <id> (--for DURATION | --until TIME)
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’alerte alr_.
--for DURATIONduréel’un de --for ou --untilaucunDurée du report à partir de maintenant : une durée comme 30m, 4h ou 2d, au plus 29d23h59m.
--until TIMEstringl’un de --for ou --untilaucunFin du report : un instant RFC 3339 avec secondes et décalage, comme 2026-11-01T09:00:00-07:00, au plus 30 jours plus tard.
screenrig alerts snooze alr_01EXAMPLEALERT000000 --for 4h

snoozed_until est l’heure de fin du report. D’ici là, l’alerte ne demande aucune attention et l’avis d’une notification encore en délai d’attente est ignoré, comme pour alerts ack ; si l’alerte est encore ouverte à ce moment, elle demande de nouveau de l’attention. Une alerte résolue donne alert_not_open (sortie 5).

alerts mute#

Mettre des écrans en sourdine pour la maintenance.

alerts mute [--screen-id ID]... [--tag TAG]... (--for DURATION | --until TIME) [--note TEXT]
ParamètreTypeRequisPar défautNotes
--screen-id IDstringau moins l’un de --screen-id ou --tagaucunUn identifiant d’écran scr_. Répétez-le, ou listez les identifiants séparés par des virgules ; au maximum 100.
--tag TAGstringau moins l’un de --screen-id ou --tagaucunChaque écran portant cette étiquette. Répétez-le, ou listez les étiquettes séparées par des virgules ; au plus 16.
--for DURATIONduréel’un de --for ou --untilaucunDurée de la mise en sourdine à partir de maintenant : une durée comme 30m, 4h ou 2d, au plus 29d23h59m.
--until TIMEstringl’un de --for ou --untilaucunFin de la mise en sourdine : un instant RFC 3339 avec secondes et décalage, comme 2026-11-01T09:00:00-07:00, au plus 30 jours plus tard.
--note TEXTstringnonaucunPourquoi les écrans sont en sourdine, pour les personnes qui voient la mise en sourdine ; au plus 200 caractères.
screenrig alerts mute --tag Lobby --for 2h --note "Rewiring the lobby displays"

L’enveloppe est la mise en sourdine : id (amt_…), screen_ids, tags, until, note, created_by et created_at. Les alertes de chaque écran couvert indiquent muted aussitôt, y compris celles déjà ouvertes. Une organisation compte au plus 50 mises en sourdine en cours, tous projets confondus ; une de plus donne alert_mute_limit_reached (sortie 5), et une mise en sourdine terminée ne compte plus. Après une mise en sourdine interrompue ou ambiguë, lisez d’abord alerts mutes : relancer la même commande avec --until dans les 24 heures renvoie la même mise en sourdine, alors qu’une relance avec --for compte à partir d’un nouveau moment et en crée une autre.

alerts mutes#

Lister les mises en sourdine qui ne sont pas terminées, celles qui finissent le plus tôt d’abord.

alerts mutes
screenrig alerts mutes

Chaque ligne est une mise en sourdine telle que alerts mute l’affiche.

alerts unmute#

Mettre fin à une mise en sourdine maintenant.

alerts unmute <mute-id>
ParamètreTypeRequisPar défautNotes
<mute-id>stringouiaucunL’identifiant de mise en sourdine amt_.
screenrig alerts unmute amt_01EXAMPLEMUTE0000000

Les alertes ouvertes de ces écrans demandent de nouveau de l’attention, et les avis ultérieurs ne sont plus ignorés comme étant en sourdine. Une mise en sourdine terminée donne not_found (sortie 4). Le journal des événements enregistre alert_mute.deleted.

Webhooks

Un webhook envoie les événements propres à ce projet, sous forme de POST signés, vers un point de terminaison HTTPS que vous exécutez, ainsi un événement correspondant peut réveiller un agent, un bot ou votre propre service. Chaque événement correspondant arrive comme le même objet JSON que events list renvoie. Un webhook est une notification sous sa forme d’origine : il compte parmi les 50 notifications de l’organisation, et notifications list l’affiche. Tout nouveau travail utilise notifications, qui envoie aussi des courriels et des avis d’écran.

Chaque tentative de livraison est comptabilisée comme un événement d’écoute facturé : 1 crédit après l’allocation mensuelle de 10 000 API et écoute en continu. Les mêmes événements gratuits sur le flux d’écoute le sont aussi ici : screen.*, runtime.*, application.event, playback.page_failed et agent.command. Une tentative refusée avant tout envoi n’est pas facturée.

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 répond webhook_limit_reached (sortie 5) lorsque l’organisation compte déjà 50 notifications, alors que notifications create répond notification_limit_reached. Une URL refusée donne webhook_url_rejected (sortie 8) dans les deux cas.

Déclencheurs d’alerte CAP

Un déclencheur permet à un système de notification d’urgence, tel Everbridge, Rave, Alertus ou un relais IPAWS, de prendre le contrôle des écrans avec des alertes CAP 1.2. Chaque déclencheur a sa propre URL, nom d’utilisateur et mot de passe, que vous saisissez dans le système d’envoi comme destination HTTP POST CAP avec authentification HTTP Basic. Une organisation a au plus 20 déclencheurs, tous projets confondus.

Les déclencheurs sont de deux types. Un déclencheur CAP, décrit ici, reçoit les alertes d’un système d’urgence. Un déclencheur de superposition montre ce que n’importe quel expéditeur publie, comme Home Assistant, un concentrateur de détecteurs ou un outil d’alertes, en bande par-dessus ce qui est diffusé ou en prise de contrôle ; triggers create --kind overlay en crée un, et triggers update, triggers deliveries, triggers clear et triggers rotate-secret servent les deux types.

Un déclencheur cible une étiquette, résolue à l’arrivée de chaque alerte, ou jusqu’à 500 identifiants d’écran. Chaque alerte devient une prise de contrôle de la playlist propre au déclencheur : une carte plein écran de la couleur de sa gravité, avec l’événement, le titre, la description et l’instruction. Un exercice ajoute une bannière EXERCISE. La prise de contrôle dure jusqu’à <expires> de l’alerte, sinon la valeur par défaut --for du déclencheur (1 minute à 7 jours, 1 heure sauf réglage), et jamais plus de 7 jours. Une mise à jour redessine la carte, et un annuler ou tout clair rend chaque écran à ce qu’il jouait avant. Une nouvelle alerte remplace celle affichée. Les messages Test, Système et Brouillon, les messages Ack et Erreur et les alertes expirées sont ignorés, et un expéditeur et identifiant répétés sont des doublons. Un écran a besoin d’une playlist par défaut pour être pris en charge ; les autres écrans sont ignorés.

Le mot de passe, srtg_…, est montré uniquement par triggers create et triggers rotate-secret, avec l’avertissement trigger_password_shown_once. Le CLI le garde hors de sa configuration, du journal d’opération et de l’état de récupération. L’URL et le nom d’utilisateur ne sont pas secrets.

Code de problèmeSortieSens
trigger_limit_reached5L’organisation a déjà 20 déclencheurs. Rien n’a été créé. Supprimez-en un d’abord.
resource_conflict5triggers test ou triggers delete pendant qu’une alerte est active. next est triggers clear.
not_found4Aucun déclencheur n’a cet ID dans le projet.
revision_conflict6La révision --expect-rev était périmée. Exécutez triggers show, puis réessayez.

triggers create#

Créer un déclencheur et recevoir son URL, nom d’utilisateur et mot de passe.

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]
ParamètreTypeRequisPar défautNotes
--name NAMEstringouiaucunLe nom du déclencheur, de 1 à 80 caractères sans caractères de contrôle.
--kind KINDcap ou overlaynoncapcap reçoit les alertes CAP 1.2 d’un système d’urgence. overlay reçoit quelques mots de n’importe quel expéditeur et exige --show.
--tag TAGstringl’un de --tag ou --screen-idaucunChaque écran actif avec cette étiquette à l’arrivée d’une alerte.
--screen-id IDstringl’un de --tag ou --screen-idaucunUn identifiant d’écran scr_. Répétez-le, ou listez les identifiants séparés par des virgules ; au maximum 500.
--for DURATIONduréenon1h (superposition 10m)Durée pendant laquelle une alerte sans <expires>, ou un envoi de superposition sans duration, retient les écrans, par exemple 30m, 2h ou 1d ; de 1 minute à 7 jours pour un déclencheur CAP, de 10 secondes à 7 jours pour un déclencheur de superposition.
--pull FILEcheminnonaucunUn objet JSON, depuis un fichier ou - pour stdin, qui a aussi la plateforme lisant les sources d’alerte CAP pour le déclencheur. Ses membres sont les paramètres de la carte cap-alert, listés ci-dessous.
--show SHOWbar ou takeoveravec --kind overlayaucunbar affiche une bande par-dessus ce qui est diffusé sur les écrans ciblés. takeover diffuse l’alerte en plein écran.
--edge EDGEbottom ou topnonbottomLe bord qu’occupe une bande. Seulement avec --show bar.
--style FILEcheminnonaucunUn objet JSON, tiré d’un fichier ou de - pour l’entrée standard, qui décrit le style de la carte de texte : theme, accent, background, backgroundColor, textColor et align.
--map FILEcheminnonaucunUn gabarit JSON, tiré d’un fichier ou de - pour l’entrée standard, qui construit la publication de superposition à partir du corps qu’envoie l’expéditeur ; voir déclencheurs de superposition.
--signingdrapeaunondésactivéExiger aussi un en-tête ScreenRig-Signature sur chaque envoi, et afficher une seule fois le secret de signature.
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

L’enveloppe est le déclencheur avec data.url (https://api.screenrig.ai/api/triggers/<id>/cap, ou .../overlay pour un déclencheur de superposition), data.username (l’identifiant du déclencheur) et data.password. Saisissez-les maintenant dans le système expéditeur ; l’expéditeur d’un déclencheur de superposition a besoin de l’URL et du mot de passe (Authorization: Bearer). Avec --signing, l’enveloppe contient aussi data.signing_secret, affiché une seule fois, avec l’avertissement trigger_signing_secret_shown_once. Après une création interrompue ou ambiguë, relancez la même commande dans les 24 heures : elle réutilise la clé d’idempotence enregistrée, et le serveur renvoie le même déclencheur et le même mot de passe au lieu d’en créer un autre.

--pull ajoute des sources que la plateforme lit en plus de l’URL publiée, qui continue de fonctionner. L’objet contient sources (jusqu’à 5 URL http ou https d’alertes CAP 1.0 à 1.2 ou d’index ATOM/RSS), publicAlerts, location (name, latitude, longitude, et geocodes comme [{name, value}]), minSeverity, maxSeverity, minUrgency, minCertainty, events, excludeEvents, senders, statuses, scopes, languages et areaUnknown ; feeds get cap utilise les mêmes filtres que les drapeaux. location est requis sauf si sources sont fournis, et sans sources les flux publics couvrant location sont lus. Chaque source est récupérée une fois par minute. L’alerte la plus grave correspondante prend les écrans comme une alerte publiée, et quand les sources n’en montrent aucune, une alerte tirée se termine ; une source périmée ou défaillante ne termine jamais une alerte. Par exemple {"location": {"latitude": 49.25, "longitude": -123}, "minSeverity": "moderate"}.

triggers list#

Lister les déclencheurs de ce projet et leurs dernières alertes, les plus anciens d’abord.

triggers list
screenrig triggers list

--human affiche ID, KIND, LABEL, TARGET, ALERT et LAST_RECEIVED ; pour un déclencheur de superposition, ALERT indique ce qu’il affiche et combien d’alertes il retient. Une liste ne contient jamais de mot de passe ni de secret de signature.

triggers show#

Inspecter un déclencheur et sa dernière alerte.

triggers show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de déclencheur trg_.
screenrig triggers show trg_01EXAMPLETRIGGER00

data.alert est la dernière alerte : ses champs CAP, state active ou ended (avec ended_reason cancelled, all_clear, cleared ou expired), until, et screens avec targeted, taken_over, cleared, skipped, failed et pending. pending est vrai tant que des écrans sont en cours d’écriture, et les écrans en échec sont réessayés. screen show signale une alerte comme une prise de contrôle de la liste de lecture du déclencheur. Pour un déclencheur de superposition, data.overlay contient show, edge, enabled, signing, card_id, alerts (les alertes actives, la plus récente en premier ; la première s’affiche), screens avec targeted, holding, taken_over, removed, edge_taken, skipped et failed, et pending.

triggers test#

Afficher une alerte d’exercice de 60 secondes sur les écrans du déclencheur.

triggers test <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de déclencheur trg_.
screenrig triggers test trg_01EXAMPLETRIGGER00

L’enveloppe est le reçu : data.outcome shown et data.alert. La réponse arrive avant que tous les écrans soient écrits ; triggers show indique les totaux. Un déclencheur de superposition affiche l’alerte screenrig-test (étiquette Test, titre Test overlay) pendant 60 secondes, et le reçu est celui d’un envoi (data.alert_id, data.until, data.active). Les deux types refusent un essai tant qu’une alerte est affichée.

triggers update#

Modifier un déclencheur sans changer son URL ni son secret.

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]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de déclencheur trg_.
--name NAMEstringnonaucunRenommer le déclencheur.
--tag TAG, --screen-id IDstringnonaucunUne nouvelle cible, comme dans triggers create.
--for DURATIONduréenonaucunUne nouvelle durée pour les alertes sans fin propre.
--pull FILE, --no-pullchemin, optionnonaucunUn déclencheur CAP : remplacer ses sources CAP ou cesser de les lire.
--edge EDGEbottom ou topnonaucunUne bande de superposition : la déplacer vers ce bord.
--style FILE, --clear-stylechemin, optionnonaucunUn déclencheur de superposition : remplacer tout le style ou le retirer.
--map FILE, --clear-mapchemin, optionnonaucunUn déclencheur de superposition : remplacer le gabarit ou le retirer pour que l’objet envoyé soit la publication.
--stale-after DURATIONstringnoninchangéComme pour source create ; none supprime la période.
--enable, --disabledrapeaunonaucunUn déclencheur de superposition : un déclencheur désactivé répond à chaque envoi par le 404 d’un mauvais secret.
--signing, --no-signingdrapeaunonaucunUn déclencheur de superposition : activer la vérification de signature (le secret de signature s’affiche une seule fois) ou la désactiver.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision.
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

Au moins une option autre que --expect-rev est requise. Une bande se replace sur les nouveaux écrans cibles et le nouveau bord ; la nouvelle cible d’un déclencheur de prise de contrôle s’applique dès la prochaine alerte qui commence. Un déclencheur qui signe déjà garde son secret de signature quand --signing est répété ; triggers rotate-secret --signing le remplace. Après une mise à jour interrompue ou ambiguë, relancez la même commande : elle réutilise la clé d’idempotence enregistrée.

triggers deliveries#

Lire le journal des envois d’un déclencheur de superposition : pourquoi chacun a été affiché, ignoré ou refusé.

triggers deliveries <id> [--limit N]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de déclencheur trg_.
--limit Nintegernon100Nombre de livraisons, les plus récentes d’abord ; de 1 à 100.
screenrig triggers deliveries trg_01EXAMPLETRIGGER00 --limit 20

data.items contient les envois des sept derniers jours : at, outcome (shown, updated, unchanged, ended, ignored, refused, invalid ou handshake), reason pour un envoi refusé ou invalide (credentials, signature, disabled, body, mapping, field, rate_limited ou internal), detail (le membre ou le chemin de mappage fautif), status, bytes, alert_id et request_id. Le journal ne conserve jamais de corps, d’en-tête ni d’identifiant. Un mauvais secret, une mauvaise signature et un déclencheur désactivé donnent tous à l’expéditeur le même 404 : ce journal indique donc lequel c’était. Un déclencheur CAP n’a pas de livraisons.

triggers clear#

Terminer maintenant l’alerte du déclencheur.

triggers clear <id> [--alert-id ID]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de déclencheur trg_.
--alert-id IDstringnonaucunUn déclencheur de superposition : mettre fin à cette alerte seulement. Sans cette option, toutes les alertes prennent fin.
screenrig triggers clear trg_01EXAMPLETRIGGER00
screenrig triggers clear trg_01EXAMPLETRIGGER00 --alert-id front-door

L’alerte prend fin avec ended_reason cleared, et ses écrans retrouvent ce qu’ils diffusaient auparavant. Un écran dont une autre prise de contrôle a pris la place depuis est laissé tel quel. Sans alerte active, rien ne change. Sur un déclencheur de superposition, l’arrêt d’une alerte qui n’est pas active ne change rien, et la fin de la dernière alerte abaisse la bande ou rend leurs écrans à la prise de contrôle.

triggers rotate-secret#

Remplacer le mot de passe d’un déclencheur.

triggers rotate-secret <id> [--signing] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de déclencheur trg_.
--signingdrapeaunondésactivéUn déclencheur de superposition qui signe : remplacer le secret de signature plutôt que le mot de passe.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision.
screenrig triggers rotate-secret trg_01EXAMPLETRIGGER00

L’enveloppe contient le nouveau mot de passe dans data.password. L’ancien mot de passe cesse aussitôt de fonctionner : saisissez le nouveau dans le système expéditeur. Avec --signing, l’enveloppe contient plutôt le nouveau data.signing_secret, affiché une seule fois ; l’ancien cesse aussitôt de fonctionner, et un déclencheur qui ne signe pas répond invalid_request.

triggers delete#

Supprimer un déclencheur. Son URL cesse aussitôt d’accepter alertes et envois ; les bandes d’un déclencheur de superposition quittent ses écrans et sa carte est supprimée. Un déclencheur qui affiche une alerte est refusé avec resource_conflict : lancez d’abord triggers clear.

triggers delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant de déclencheur trg_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision.
screenrig triggers delete trg_01EXAMPLETRIGGER00

Déclencheurs de superposition

Un déclencheur de superposition montre ce qu’un système externe publie. Home Assistant, un concentrateur de détecteurs de porte ou de mouvement, un système de caméras ou un outil d’alertes envoie quelques mots par une requête HTTP POST, et les écrans du déclencheur les affichent jusqu’à leur échéance ou jusqu’à ce que l’expéditeur y mette fin. C’est un déclencheur comme un déclencheur CAP : triggers create --kind overlay le crée, et il compte dans la même limite de 20 par organisation.

--show bar affiche une bande par-dessus ce qui est diffusé sur chaque écran ciblé, sur le bord inférieur ou, avec --edge top, sur le bord supérieur. La bande glisse à l’écran quand une alerte commence et en sort quand la dernière se termine ; la liste de lecture, ses pages et son rythme restent intacts. Un écran porte une bande par bord : une superposition dont le bord est déjà occupé sur un écran par une autre superposition n’y apparaît pas (triggers show compte ces écrans sous edge_taken), et une page qui a sa propre bande avec présence sur ce bord la conserve. Une carte de coin ou de pastille sur ce bord se déplace au-delà de la hauteur de la bande, qu’elle soit affichée ou non. Aucune bande n’est dessinée sur une page d’espace publicitaire ni pendant une prise de contrôle. --show takeover diffuse l’alerte en plein écran sur les écrans ciblés qui ont une liste de lecture par défaut, de la première alerte jusqu’à la fin de la dernière. Un déclencheur de prise de contrôle ne remplace jamais une prise de contrôle déjà en cours sur un écran, comme celle d’un opérateur ou d’une alerte d’urgence, et une alerte CAP la remplace.

Une cible par étiquette est résolue quand une alerte commence ; un écran étiqueté plus tard reçoit la bande à la prochaine alerte qui commence. Les écrans sans liste de lecture par défaut sont ignorés par une prise de contrôle. Un écran hors ligne se met à jour à sa reconnexion.

L’expéditeur publie du JSON (ou un formulaire) à data.url avec Authorization: Bearer SECRET, ou en HTTP Basic avec l’identifiant du déclencheur comme nom d’utilisateur et le secret comme mot de passe. Le secret ne figure jamais dans l’URL. Un envoi comporte les membres suivants ; un membre inconnu est refusé et nommé.

MembreTypeNotes
alert_idstringL’identifiant de l’alerte choisi par l’expéditeur, de 1 à 200 caractères. Le même identifiant met à jour cette alerte au lieu d’en empiler une autre. Sans identifiant, c’est une seule alerte nommée default. Pour un arrêt, sans identifiant, toutes les alertes prennent fin.
labelstringUne courte étiquette au-dessus du titre : au plus 40 caractères.
titlestringAu maximum 120 caractères.
messagestringLe texte principal : au plus 400 caractères.
notestringUne ligne discrète au bas : au plus 120 caractères.
durationnombre ou chaîneDurée pendant laquelle cet envoi retient son alerte, à partir de maintenant : de 10 à 604800 secondes, ou 10s, 5m, 2h, 1d, ou until_cleared. Sans valeur, c’est --for du déclencheur (10 minutes par défaut).
clearbooléen ou chaînetrue (ou yes, y, 1, x) met fin à l’alerte ; false (ou no, n, 0, vide) la déclenche. Un arrêt ignore les autres membres.
statestringUn mot d’état de l’expéditeur. off, closed, clear, cleared, resolved, ok, normal, inactive et ended, quelle que soit la casse, mettent fin à l’alerte ; tout autre état la déclenche.

Un déclenchement exige au moins un de label, title, message et note. Un texte plus long que sa limite est refusé, tout comme duration hors de 10 secondes à 7 jours, les deux avec invalid_request qui nomme le membre. Chaque déclenchement ou mise à jour retient son alerte pendant duration à partir de cet envoi : un détecteur de mouvement qui envoie toutes les quelques secondes garde la bande affichée, et elle disparaît duration après le dernier envoi. Un déclencheur affiche son alerte la plus récente ; quand elle prend fin, la précédente reparaît. Il retient dix alertes, et la onzième remplace la plus ancienne. Une alerte prend fin dans les dix secondes environ suivant son échéance. Un arrêt envoyé deux fois met fin à l’alerte une seule fois, et l’arrêt d’une alerte qui n’est pas active ne change rien.

La réponse est un reçu : outcome (shown, updated, unchanged, ended ou ignored), alert_id, until (nul pour une alerte retenue jusqu’à son arrêt) et active, les alertes que retient le déclencheur après l’envoi. Un en-tête Idempotency-Key de 8 à 200 caractères répond à la nouvelle tentative d’un expéditeur par le premier reçu pendant 24 heures. Un déclencheur accepte 120 envois par minute. Un déclenchement ou une mise à jour compte pour une requête d’API facturée, comme un envoi à un webhook clé/valeur entrant ; un arrêt est gratuit et n’est jamais refusé faute de solde, de sorte qu’une alerte peut toujours être retirée des écrans.

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"}'

Une mauvaise adresse, un mauvais secret, un déclencheur désactivé, une signature absente ou mauvaise et tout GET donnent le même 404 not_found : l’expéditeur ou l’aperçu d’un lien n’apprend rien sur la cause. triggers deliveries montre au projet pourquoi, pour les sept derniers jours, sans corps d’envoi. --style FILE règle theme, accent, background, backgroundColor, textColor et align de la carte de texte ; utilisez un déclencheur par apparence.

--map FILE construit la publication à partir du corps qu’envoie un outil d’alertes, avec le langage de gabarits des webhooks de cartes. Une chaîne avec {{body.title}} est du texte, une chaîne qui est exactement un espace réservé garde son type, {"$text": "{{body.message}}", "$max": 400} coupe le texte, et un chemin commence par body ou query. Ce gabarit transforme une alerte d’un outil de surveillance et l’arrête lorsque son statut est resolved :

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

--signing exige aussi ScreenRig-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">, avec la clé data.signing_secret (whsec_…, affichée une seule fois), où t se situe à moins de cinq minutes de l’horloge du serveur. L’expéditeur peut envoyer deux valeurs v1 pendant qu’il fait la rotation du secret.

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"

Un outil d’alerte ou un fournisseur qui signe ses propres envois peut faire vérifier sa signature à la place du secret, et sa poignée de main de configuration peut recevoir une réponse, comme pour les webhooks de carte : overlay.verify et overlay.handshake se placent sur POST /api/triggers et PATCH /api/triggers/{id}, et null supprime chacun. Les mêmes règles s’appliquent au mot de passe srtg_ du déclencheur et à son journal de livraison, et une poignée de main ne change aucune alerte.

Une commande rest_command de Home Assistant envoie au déclencheur. Gardez le secret dans secrets.yaml et donnez à chaque automatisation l’alerte qu’elle déclenche ou arrête :

# 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}

Deux faits expliquent le fonctionnement. Chaque envoi de mouvement retient la bande pendant 2 minutes à partir de cet envoi : elle reste tant que le mouvement continue et disparaît 2 minutes après le dernier événement. Et Home Assistant produit le gabarit {{ }} avant d’envoyer, de sorte que le déclencheur reçoit du JSON ordinaire ; le gabarit --map du déclencheur est une étape distincte qui fait passer chaque envoi par ce gabarit ; omettez donc --map pour un expéditeur qui envoie déjà les membres de la superposition, comme Home Assistant ici, ou donnez-lui son propre déclencheur.

Lecture

Les preuves de lecture se présentent sous trois formes. playback plays lit une ligne par début visible d’une image ou vidéo sur un écran, du plus ancien au plus récent selon received_at : preuve de lecture pour un rapport ou un annonceur. playback list lit les totaux quotidiens, une ligne par écran, objet média et jour UTC. playback totals lit les comptes de lecture par jour UTC, ou classe les écrans ou médias les plus actifs. plays et list exportent en CSV, et le tableau de bord exporte les mêmes fichiers.

Les lectures sont conservées pour la rétention des événements du forfait, au moins 30 jours.

Code de problèmeSortieSens
invalid_request8Une plage de lectures de plus de 31 jours, une plage quotidienne de plus de 366 jours, ou un filtre mal formé. Le CLI refuse la plupart avant d’envoyer quoi que ce soit (sortie 2).
rate_limited7Le budget d’exportation de lecture de 30 requêtes par minute et par organisation est épuisé. Attendez retry_after_seconds.

Facturation : chaque page JSON est une requête API facturée, donc --all facture une requête par page. Une exportation CSV est une requête facturée pour toute sa plage. Chaque requête plays et chaque export CSV dépensent aussi le budget d’exportation de lecture. playback totals est une requête API mesurée et ne dépense rien de ce budget.

playback plays#

Lire les enregistrements de lecture par lecture, une ligne par démarrage visible.

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]
ParamètreTypeRequisPar défautNotes
--from TIMEstringnon24 heures avant --toLimite inclusive sur received_at : un instant RFC 3339 avec secondes et décalage, now, ou un âge tel que 7d, 12h ou 30m.
--to TIMEstringnonmaintenantLimite exclusive, dans les mêmes formes. La plage est au maximum de 31 jours.
--screen-id IDstringnonchaque écranUn écran scr_.
--media-id IDstringnonchaque objetUn objet média med_.
--tag TAGstringnonchaque écranUne étiquette que l’écran portait quand la lecture a été reçue.
--cursor CURSORstringnonle début de la plageLe next_cursor de la page précédente, avec les mêmes filtres.
--limit Nintegernon200Lignes par page JSON, au maximum 1000. Pas avec --format csv.
--allbooleannondésactivéSuivez le curseur jusqu’à la fin de la plage, 1000 lignes par page sauf indication contraire de --limit, pour un maximum de 50 pages.
--format csvstringnonJSONDiffusez toute la plage en CSV.
--output FILEcheminnon./playback-plays.csvCible CSV, ou - pour la sortie standard seulement.
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

Le CLI normalise les deux bornes en UTC et les envoie à chaque requête ; data.from et data.to les renvoient. Les 5 dernières secondes les plus récentes sont retenues jusqu’à stabilisation, donc une lecture apparaît environ 5 secondes après réception, et data.to rapporte cette fin effective. Le JSON retourne une page dans data.items avec data.next_cursor, et data.next.argv est la commande exacte pour la page suivante. --all s’arrête tôt, avec data.next et un avertissement, au plafond de pages (playback_plays_truncated) ou quand le budget d’export est épuisé (playback_export_rate_limited), plutôt que de dépenser des requêtes en refus.

Le CSV suit la RFC 4180 avec la ligne d’en-tête fixe screen_id,playlist_id,page_id,primitive_id,media_id,primitive,started_at,received_at,manifest_revision,playlist_revision, les heures en UTC RFC 3339. primitive_id et started_at sont vides sauf si le lecteur les a rapportés. Une cellule commençant par =, +, -, @, tabulation ou retour chariot porte un ' initial pour empêcher l’évaluation par les tableurs. Le CLI écrit via un fichier temporaire privé dans le même dossier et remplace un fichier existant seulement après la fin propre du flux. --timeout est la limite sans progression pour le flux, 60 000 ms sans octet par défaut, pas une limite de durée totale. L’enveloppe rapporte path, bytes, rows, sha256 et last_received_at ; le CSV n’entre jamais dans l’enveloppe.

Si un flux échoue en cours de route, la commande se termine avec un code non nul et n’écrit jamais le fichier cible. Les lignes complètes déjà reçues restent dans FILE.partial, et error.next exporte le reste de la plage depuis le dernier received_at dans un FILE-rest.csv inutilisé. Les lignes reçues à cet instant précis apparaissent dans les deux, donc ignorez les doublons lors de leur jonction.

playback list#

Lire les totaux quotidiens de lecture pour ce projet, jours les plus récents en premier.

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]
ParamètreTypeRequisPar défautNotes
--screen-id IDstringnonchaque écranDoit commencer par scr_.
--media-id IDstringnonchaque objetDoit commencer par med_.
--day YYYY-MM-DDstringnonchaque jourUne journée calendaire UTC.
--day-from YYYY-MM-DDstringnonaucunDébut d’une plage inclusive de jours UTC, avec --day-to, au maximum 366 jours.
--day-to YYYY-MM-DDstringnonaucunFin de cette plage.
--format csvstringnonJSONExporter en CSV. Sans plage, les 31 jours jusqu’à aujourd’hui.
--output FILEcheminnon./playback-aggregates.csvCible CSV, ou - pour la sortie standard seulement.
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

Une ligne par écran, objet média et jour UTC. Les filtres sélectionnent les lignes propres à l’appelant. La ligne d’en-tête CSV est screen_id,media_id,filename,primitive,day,play_count,last_page_id,last_manifest_revision,first_started_at,last_started_at. Une exportation quotidienne échouée ne conserve rien ; relancez-la.

playback totals#

Lire les comptes de lecture par jour UTC, ou classer les écrans ou médias les plus actifs.

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]
ParamètreTypeRequisPar défautNotes
--by GROUPINGstringnondayday répond une ligne par jour UTC. screen ou media classe les plus occupés. screen_day répond la série journalière des écrans principaux.
--day-from YYYY-MM-DDstringnon29 jours avant --day-toPremier jour UTC, inclus.
--day-to YYYY-MM-DDstringnonaujourd’huiDernier jour UTC, inclusivement.
--screen-id IDstringnonchaque écranAvec --by day, comptez uniquement cet écran. Pas avec --media-id.
--media-id IDstringnonchaque objetAvec --by day, comptez uniquement cet objet média. Pas avec --screen-id.
--top Nintegernon10Lignes d’un classement, de 1 à 100 ; de 1 à 10 avec --by screen_day. Nécessite --by ; ne s’applique pas à --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

Les comptes proviennent des agrégats quotidiens, qui suivent l’ingestion avec un délai d’environ 21 minutes ; playback plays montre les démarrages plus récents. day répond à data.days, screen et media répondent à data.screens et data.media, et screen_day répond à data.screen_days. Une série journalière couvre au maximum 366 jours (92 avec --screen-id ou --media-id) et un classement au maximum 92. data.truncated est true lorsqu’un classement sur une fenêtre trop grande pour une lecture ne conserve que les meilleures clés de chaque tranche.

Flux

Un flux est des données tierces que screenRIG récupère et met en cache, comme la météo, les alertes, les taux et les titres. feeds get lit un document de flux, le même document qu’une carte intégrée avec les mêmes paramètres lit. La commande n’appelle jamais un fournisseur tiers.

feeds get#

Lire un flux une fois. Un flux sans document répond pending et son temps de nouvelle tentative.

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]
ParamètreTypeRequisPar défautNotes
<family>stringouiaucunweather, airquality, alerts, rates, crypto, earthquakes, cyclones, headlines ou cap.
--lat DEGREESnumberpar familleaucunLatitude, avec --lon. Obligatoire pour weather, airquality, alerts et earthquakes ; optionnel pour cyclones et cap.
--lon DEGREESnumberpar familleaucunLongitude, avec --lat.
--radius-km KMnumbernon500 pour earthquakesearthquakes rayon, ou la zone cyclones, de 10 à 20 000 km. Nécessite --lat et --lon.
--min-magnitude MAGNITUDEnumbernon2.5earthquakes : magnitude minimale, de 0 à 9.
--hours HOURSnumbernon24earthquakes : fenêtre en heures, de 1 à 168.
--basins LISTstringnontous les bassinscyclones : bassins séparés par des virgules at, ep, cp, wp.
--base CODEstringnonEURrates : devise de base.
--symbols IDSstringoui, pour cryptoaucunIdentifiants ou symboles cryptos séparés par des virgules, au maximum 20.
--currency CODEstringnonusdcrypto : devise de cotation.
--url URLstringoui, pour headlinesaucunheadlines : URL d’un flux RSS ou Atom. cap : URL d’une alerte CAP ou index ATOM/RSS ; répétez-la, au maximum 5 fois.
--publicbooleannonactivé sans --urlcap : lire aussi les flux d’alerte publics qui couvrent --lat et --lon. Nécessite --lat et --lon.
--geocode NAME:VALUEstringnonaucuncap : un code régional du lieu, tel que UGC:WAC033. Répétable. Nécessite --lat et --lon.
--min-severity LEVELstringnonaucuncap : uniquement les alertes au niveau ou au-dessus de minor, moderate, severe ou extreme.
--max-severity LEVELstringnonaucuncap : uniquement les alertes au niveau ou en dessous de minor, moderate, severe ou extreme.
--min-urgency LEVELstringnonaucuncap : uniquement les alertes au moins aussi urgentes : past, future, expected ou immediate.
--min-certainty LEVELstringnonaucuncap : uniquement les alertes au moins aussi certaines : unlikely, possible, likely ou observed.
--event NAMEstringnonn’importe quel événementcap : uniquement cet événement ; * correspond à n’importe quelle suite de caractères. Répétable.
--exclude-event NAMEstringnonaucuncap : exclure cet événement. Répétable.
--sender NAMEstringnonn’importe quel expéditeurcap : uniquement les alertes de cet expéditeur. Répétable.
--status STATUSstringnonActualcap : statut d’alerte à lire : Actual, Exercise, Test ou System. Répétable.
--scope SCOPEstringnonPubliccap : scope d’alerte à lire : Public, Restricted ou Private. Répétable.
--language TAGstringnonaucuncap : préférence de langue ; la première présente est retenue. Répétable.
--area-unknown MODEstringnonhidecap : une alerte communiquée uniquement par les codes régionaux que le lieu ne possède pas : hide ou 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 et earthquakes nécessitent --lat et --lon, qui vont toujours ensemble ; earthquakes prend aussi --radius-km, --min-magnitude et --hours. cyclones prend --basins, et avec --lat, --lon et --radius-km ensemble seulement les tempêtes près de cet endroit. rates prend --base, crypto nécessite --symbols et prend --currency, et headlines nécessite --url.

cap lit les alertes CAP correspondant à un lieu. Il nécessite --url (répétable, jusqu’à 5 URL d’index d’alertes CAP ou ATOM/RSS) ou --lat et --lon, qui lisent les flux publics couvrant l’emplacement ; --public ajoute ces flux publics aux sources --url. Les indicateurs de filtre reflètent les membres d’un objet triggers create --pull.

Un document mis en cache répond 200 avec fetchedAt et attribution : afficher l’attribution partout où les données apparaissent. Sans document encore, l’enveloppe rapporte l’état pending, retry_after_seconds et retry_at avec sortie 0 ; le CLI ne boucle pas, donc exécutez la commande à nouveau après retry_at. Une organisation enregistre au maximum 50 nouvelles clés de flux par jour, et rate_limited suit au-delà. Les cartes dérivent les clés de flux des paramètres statiques ; n’écrivez pas vous-même les clés feed ou feed:.

Sources de données

Une source de données lit une adresse extérieure selon un horaire et écrit le résultat dans les données d’une carte, de sorte que la carte reste à jour sans que personne ne republie et que les écrans récupèrent de nouveau le document quand il change. Les types sont ics, sheets, csv, json, microsoft365, google_calendar, square, shopify, toast et momentus. Une source alimente une carte, et une organisation en compte jusqu’à 200, tous projets confondus. Une synchronisation qui échoue n’écrit jamais : la carte garde son dernier bon document et le statut de la source affiche l’erreur. Les paramètres de chaque type, les codes de statut et les règles de confidentialité figurent dans Sources de données.

Un préréglage est une source json toute prête et testée pour un service, comme un canal Slack, un tableau d’offres d’emploi ou un tableau de construction : source presets les liste, source presets NAME montre les champs et les secrets d’un préréglage, et source create --preset NAME crée la source.

Donnez chaque identifiant sous la forme --secret NAME=@FILE, ou NAME=- pour l’entrée standard, afin qu’il reste hors de l’historique de votre shell et de la liste des processus. Les secrets sont stockés chiffrés et ne sont renvoyés que sous forme d’indice masqué. Les noms de secrets sont calendar_url.KEY pour ics (un par calendrier), token pour une adresse csv ou json qui en exige un (password, client_secret, header.NAME et query.NAME servent aux autres façons de se connecter, décrites sous Requêtes, connexion et pages), client_secret pour microsoft365 et toast, service_account_key pour google_calendar, access_token pour square et shopify, api_key et api_secret pour momentus, et client_secret avec le paramètre client_id pour une application shopify installée sur la boutique.

--settings prend l’objet complet des paramètres de la source en JSON, en @FILE ou en -. --set KEY=VALUE définit un membre de premier niveau et peut être répété; la valeur est du JSON lorsqu’elle s’analyse (days=14, calendars='[{"key":"lobby"}]') et du texte sinon (time_zone=America/Vancouver). Avec les deux, les membres de --set remplacent les mêmes membres de --settings; source update avec seulement --set modifie ces membres des paramètres enregistrés. L’option --config de la CLI nomme son fichier d’identifiants et n’a rien à voir avec les sources.

source list#

Liste les sources de données du projet, les plus récentes d’abord, avec leur statut.

source list [--after CURSOR]
ParamètreTypeRequisPar défautNotes
--after CURSORstringnonpremière pageLe data.next_cursor de la page précédente.
screenrig source list

source show#

Consultez une source : ses paramètres, ses secrets masqués, sa dernière exécution et sa dernière erreur.

source show <source_id>
ParamètreTypeRequisPar défautNotes
<source_id>stringouiaucunLa source (src_…).
screenrig source show src_01EXAMPLESOURCE000000

source presets#

Liste les préréglages de source prêts à l’emploi, ou en affiche un avec ses champs, ses secrets et la façon de les obtenir.

source presets [<name>]
ParamètreTypeRequisPar défautNotes
<name>stringnonchaque préréglageLe nom d’un préréglage : des mots en minuscules reliés par des traits d’union, comme slack-channel.
screenrig source presets
screenrig source presets slack-channel

La liste montre le titre de chaque préréglage, les types de cartes qu’il alimente (le premier est celui pour lequel il est conçu) et sa catégorie. Un nom montre les champs à définir (--set NAME=VALUE : du texte avec son motif et un exemple, un choix, ou une liste qui prend un tableau JSON), les secrets à saisir (--secret NAME=@FILE) avec l’endroit où le fournisseur délivre chacun, la fréquence d’actualisation, la durée pendant laquelle une carte garde ses dernières données, et les données de qui il lit, selon quelles conditions. Rien n’est créé.

source create#

Créez une source. Elle s’exécute en quelques secondes, puis selon son horaire. Créez d’abord la carte et faites un aperçu avec 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]
ParamètreTypeRequisPar défautNotes
--kind KINDstringsans --presetaucunics, sheets, csv, json, microsoft365, google_calendar, square, shopify, momentus ou toast.
--preset NAMEstringsans --kindaucunCrée la source à partir d’un préréglage prêt à l’emploi et testé (source presets les liste) : --set et --settings donnent alors les champs du préréglage et --secret ses identifiants. Pas avec --kind.
--card CARD_IDstringouiaucunLa carte (crd_…) que la source écrit. Une carte a une source; source_target_taken répond à une deuxième.
--name NAMEstringouiaucun1 à 80 caractères.
--settings SETTINGSstringnon{}Un paramètre de premier niveau. Répétable. Avec --preset, un champ du préréglage : le texte tel qu’écrit, sauf s’il s’agit d’un tableau ou d’un objet JSON (les éléments d’un champ de liste).
--connection-id IDstringnonaucunmicrosoft365 et google_calendar : lisent par une connexion de projet (pcn_…, connection list) au lieu d’un locataire, de client_id et d’un secret propres à la source. Cela définit le paramètre connection_id.
--set KEY=VALUEstringnonaucunUn paramètre de premier niveau. Répétable.
--secret NAME=VALUEstringnonaucunUn identifiant par nom : NAME=@FILE, NAME=- (au plus une option lit l’entrée standard) ou NAME=VALUE. Répétable. Avec --preset, les identifiants du préréglage.
--refresh DURATIONstringnonselon le typeFréquence de synchronisation, de 30s à 24h. Le type fixe l’intervalle par défaut et le plus court : ics se synchronise toutes les 5 minutes et au moins chaque minute, microsoft365 et google_calendar toutes les 2 minutes, momentus chaque minute et au moins toutes les 30 secondes. Un préréglage fixe le sien.
--stale-after DURATIONstringnonselon le typeDurée pendant laquelle la carte garde les dernières bonnes données quand la source ne peut pas s'actualiser, de 1m à 7d, au moins le double de --refresh ; none les garde jusqu'à la prochaine actualisation. Ensuite, les données expirent sur chaque écran. momentus vaut 30m par défaut.
--disabledbooleannondésactivéCrée la source à l’arrêt; rien n’est récupéré avant 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#

Modifiez une source. Un changement autre qu’un renommage remet son compteur d’échecs à zéro et la relance.

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]
ParamètreTypeRequisPar défautNotes
<source_id>stringouiaucunLa source (src_…).
--name NAMEstringnoninchangéRenomme la source.
--card CARD_IDstringnoninchangéÉcrire une autre carte.
--settings SETTINGSstringnoninchangéModifie un paramètre de premier niveau parmi ceux enregistrés. Répétable. Pour une source créée à partir d’un préréglage, un champ du préréglage ; la valeur null retire un champ facultatif.
--connection-id IDstringnoninchangéComme pour source create. Détacher une source de ses propres identifiants exige --settings sans tenant ni client_id, et --unset-secret client_secret.
--set KEY=VALUEstringnonaucunModifie un paramètre de premier niveau de ceux qui sont enregistrés. Répétable.
--secret NAME=VALUEstringnonaucunDéfinit ou remplace un secret. Répétable. Un secret que vous n’envoyez pas garde sa valeur, sauf si le changement pointe la source vers un endroit que ce secret ne couvre pas (autre origine, boutique, environnement ou locataire) : source_secret_required le redemande alors.
--unset-secret NAMEstringnonaucunRetire un secret. Répétable.
--refresh DURATIONstringnoninchangéDe 30s à 24h ; le minimum du type s’applique.
--stale-after DURATIONstringnoninchangéComme pour source create ; none supprime la période.
--enable, --disablebooleannoninchangéReprend l’horaire, ou l’arrête; la carte garde son dernier document. Au plus une des deux.
--expect-rev REVISIONintegernonla révision lueRefuse le changement sauf si la source est à cette révision. --set protège la révision lue, sauf si vous en nommez une autre.

Au moins un changement est requis.

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#

Prévisualisez une source sans rien enregistrer ni écrire : récupérer l’adresse, mettre la réponse en forme pour la carte et la vérifier auprès de la carte. L’enveloppe porte le document, valid, le chemin et la raison quand la carte le refuse, les avertissements et les compteurs. Passez un <source_id> enregistré pour le tester, les autres options remplaçant ses valeurs, ou --kind (ou --preset) et --card pour en tester un qui n’est pas enregistré. Un échec de récupération ou de mise en forme donne source_test_failed avec la raison. Au plus 30 aperçus par minute et par organisation.

source test [<source_id>] [--kind KIND | --preset NAME] [--card CARD_ID] [--settings JSON|@FILE|-] [--set KEY=VALUE]...
            [--connection-id ID] [--secret NAME=VALUE]...
ParamètreTypeRequisPar défautNotes
<source_id>stringnonaucunUne source enregistrée à tester.
--kind KINDstringsans <source_id> ni --presetaucunComme pour source create.
--preset NAMEstringnonaucunPrévisualise une source créée à partir de ce préréglage, avec --set et --settings comme champs et --secret comme identifiants, au lieu de --kind.
--card CARD_IDstringsans <source_id>aucunLa carte à alimenter.
--settings SETTINGSstringnonles paramètres enregistrésLes paramètres du type : JSON, @FILE ou - pour l’entrée standard.
--connection-id IDstringnonaucunComme pour source create.
--set KEY=VALUEstringnonaucunUn paramètre de premier niveau. Répétable.
--secret NAME=VALUEstringnonles secrets enregistrésUn identifiant à essayer. Répétable.
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#

Synchronisez une source maintenant et affichez le résultat. Elle s’exécute en ligne jusqu’à 60 secondes, remet le compteur d’échecs à zéro et lit l’adresse en entier. Une synchronisation échouée ne modifie jamais la carte. source_busy (code de sortie 5) répond pendant qu’une synchronisation planifiée est en cours. Au plus 6 par minute et par source.

source refresh <source_id>
ParamètreTypeRequisPar défautNotes
<source_id>stringouiaucunLa source (src_…).
screenrig source refresh src_01EXAMPLESOURCE000000

source rooms#

Vérifie comment les écrans correspondent aux salles d'une source de système de réservation (momentus). Elle lit les salles de la dernière bonne actualisation de la source et les écrans du projet, et ne récupère rien. Elle liste les salles qu'aucun écran n'affiche et chaque écran qui a une valeur de salle ou dont la liste de lecture lit la clé de salle de la source, chacun mapped, missing (la liste de lecture lit le champ et l'écran n'en a pas) ou unknown (la valeur ne désigne aucune salle, avec la salle probablement visée). Corrigez un écran avec screen update scr_ID --field room=ROOM_KEY.

source rooms <source_id>
ParamètreTypeRequisPar défautNotes
<source_id>stringouiaucunUne source (src_…) qui lit les salles d'un système de réservation.
screenrig source rooms src_01EXAMPLESOURCE000000

source delete#

Supprimez une source. La carte garde le dernier document que la source a écrit.

source delete <source_id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<source_id>stringouiaucunLa source (src_…).
--expect-rev REVISIONintegernonaucunRefuse la suppression sauf si la source est à cette révision.
screenrig source delete src_01EXAMPLESOURCE000000

Connexions

Une connexion est l’accès enregistré du projet à Microsoft ou à Google, pour le travail qui s’exécute sans personne de connecté. Une source de données microsoft365 ou google_calendar (source create --connection-id), une connexion Power BI (bi connection create powerbi --connection-id) et un compte de synchronisation de médias SharePoint (media sync account add microsoft365 --connection-id) lisent par une connexion au lieu de porter chacun un locataire, un ID client et un secret. Un ID de connexion commence par pcn_, et une organisation compte jusqu’à 50 connexions pour l’ensemble de ses projets. Les modes, les statuts et les étapes d’approbation sont sur Connectez Microsoft et Google.

Le mode own_app détient votre propre application : pour Microsoft, une inscription d’application Microsoft Entra (--tenant-id, --client-id et la Value d’un secret client), pour Google, la clé JSON d’un compte de service. Le mode screenrig_app utilise l’application propre de screenRIG et n’a besoin d’aucun secret : create affiche un lien de consentement à usage unique (data.consent_url, qui expire à data.consent_expires_at) pour la personne qui le mène à terme, un administrateur Microsoft 365 qui donne son consentement pour le locataire, ou le titulaire d’un compte Google qui accorde un accès en lecture seule aux calendriers. Envoyez le lien à cette personne seulement, puis lisez status et last_error avec connection show. Une connexion Power BI n’accepte qu’une connexion own_app.

Donnez un secret client avec --secret-file FILE et une clé Google avec --service-account-key-file FILE, ou - pour l’entrée standard, jamais comme argument. La lecture exige l’accès Read, et tout changement exige l’accès Manage.

connection list#

Liste les connexions de ce projet avec leur statut.

connection list

Aucun paramètre.

screenrig connection list

connection show#

Consultez une connexion : son statut, sa dernière erreur et son dernier test.

connection show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (pcn_…).
screenrig connection show pcn_01EXAMPLECONNECTION0000

connection create microsoft#

Ajoutez une connexion Microsoft 365 : votre propre application Entra, ou l’application de screenRIG avec un lien de consentement.

connection create microsoft --mode own_app|screenrig_app [--name NAME]
    [--tenant-id ID --client-id ID --secret-file FILE]
ParamètreTypeRequisPar défautNotes
--mode MODEstringouiaucunown_app : votre propre inscription d’application Microsoft Entra avec un secret client. screenrig_app : l’application de screenRIG, à laquelle un administrateur Microsoft 365 donne son consentement par le lien à usage unique qu’affiche cette commande.
--name NAMEstringnonMicrosoft 3651 à 80 caractères.
--tenant-id IDstringavec own_appaucunVotre Directory (tenant) ID Microsoft Entra, ou son domaine principal, comme contoso.onmicrosoft.com. En même temps que --client-id et --secret-file.
--client-id IDstringavec own_appaucunL’Application (client) ID de l’inscription d’application.
--secret-file FILEstringavec own_appaucunLit la Value du secret client depuis ce fichier, ou - pour l’entrée standard (jamais un argument) ; le fichier ne contient que la Value.
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"

Le mode screenrig_app n’accepte aucun de --tenant-id, --client-id ni --secret-file : il affiche le lien de consentement (data.consent_url) pour l’administrateur Microsoft 365, qui donne son consentement à l’application de screenRIG pour le locataire. L’inscription de l’application liste Calendars.Read pour les calendriers de salles de réunion, Sites.Selected ou Files.Read.All pour la synchronisation de médias SharePoint et, pour Power BI, les paramètres du locataire et l’appartenance à l’espace de travail au lieu des autorisations Graph ; connection test rapporte quelles autorisations le jeton porte. Un serveur sans l’application de screenRIG répond connection_app_not_configured : le mode own_app fonctionne toujours.

connection create google#

Ajoutez une connexion Google : votre propre clé de compte de service, ou l’application de screenRIG avec un lien de connexion.

connection create google --mode own_app|screenrig_app [--name NAME]
    [--service-account-key-file FILE]
ParamètreTypeRequisPar défautNotes
--mode MODEstringouiaucunown_app : votre propre clé de compte de service. screenrig_app : l’application de screenRIG, à laquelle le titulaire d’un compte Google se connecte et accorde un accès en lecture seule aux calendriers par le lien à usage unique qu’affiche cette commande.
--name NAMEstringnonGoogle Calendar1 à 80 caractères.
--service-account-key-file FILEstringavec own_appaucunLit la clé JSON du compte de service depuis ce fichier, ou - pour l’entrée standard (jamais un argument).
screenrig connection create google --mode own_app --service-account-key-file key.json
screenrig connection create google --mode screenrig_app --name "Venue calendars"

En mode own_app, partagez chaque calendrier de salle avec l’adresse du compte de service, ou donnez à la source un sujet (délégation à l’échelle du domaine). Le mode screenrig_app n’accepte aucune clé et affiche le lien de connexion (data.consent_url) pour le titulaire du compte Google : le compte doit voir chaque calendrier de salle qu’une source liste, et une telle source ne peut pas nommer de sujet. Un serveur sans l’application de screenRIG répond connection_app_not_configured : le mode own_app fonctionne toujours.

connection update#

Renommez une connexion ou, en mode own_app, modifiez son locataire, son application ou son secret.

connection update <id> [--name NAME] [--tenant-id ID] [--client-id ID]
    [--secret-file FILE] [--service-account-key-file FILE] [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (pcn_…).
--name NAMEstringnoninchangéRenomme la connexion.
--tenant-id IDstringnoninchangéMicrosoft own_app : le Directory (tenant) ID ou le domaine principal.
--client-id IDstringnoninchangéMicrosoft own_app : l’Application (client) ID.
--secret-file FILEstringnoninchangéMicrosoft own_app : lit la Value du secret client depuis ce fichier, ou - pour l’entrée standard ; elle remplace le secret stocké.
--service-account-key-file FILEstringnoninchangéGoogle own_app : lit la clé JSON du compte de service depuis ce fichier, ou - pour l’entrée standard ; elle remplace la clé stockée.
--expect-rev REVISIONintegernonaucunRefuse le changement sauf si la connexion est à cette révision (revision_conflict, sortie 6).
screenrig connection update pcn_01EXAMPLECONNECTION0000 --secret-file new-secret.txt
screenrig connection update pcn_01EXAMPLECONNECTION0000 --name "Contoso rooms" --expect-rev 2

Au moins un changement est requis. Un changement d’identifiants ramène la connexion à ready, efface sa dernière erreur et son dernier test, et retire tous les jetons émis pour les anciens : testez-la de nouveau. Une connexion screenrig_app ne peut qu’être renommée : connection connect crée un nouveau lien de consentement pour changer la personne qui a donné son consentement. Un secret omis est conservé.

connection test#

Ouvrez une session avec une connexion et vérifiez ce que ses identifiants permettent.

connection test <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (pcn_…).
screenrig connection test pcn_01EXAMPLECONNECTION0000

Pour Microsoft, le test rapporte credentials (un jeton d’application pour le locataire) et permissions (lesquelles de Calendars.Read, Sites.Selected, Files.Read.All, Sites.Read.All et Place.Read.All le jeton porte ; aucune fait échouer le test, et Sites.Selected seule est un avertissement, car chaque site a besoin de sa propre autorisation). Pour Google, il rapporte credentials, en nommant le compte auquel les calendriers doivent être visibles. Un refus fait passer la connexion à error avec last_error ; un succès la ramène à ready. Le test ne juge ni le partage d’un calendrier, ni une politique d’accès à une boîte aux lettres, ni l’autorisation d’un site. Au plus 30 par minute et par organisation.

connection connect#

Créez un nouveau lien de consentement à usage unique pour une connexion screenrig_app.

connection connect <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (pcn_…).
screenrig connection connect pcn_01EXAMPLECONNECTION0000

data.consent_url est le lien destiné à la personne qui effectue le consentement : l’administrateur Microsoft 365, ou le titulaire du compte Google. Il remplace tout lien précédent. Une connexion qui fonctionne reste telle quelle jusqu’à ce que le nouveau consentement soit terminé ; cela permet donc aussi de renouveler une connexion passée à error (consentement retiré, accès révoqué) ou de la déplacer vers un autre locataire ou compte. Une connexion en mode own_app n’a pas d’étape de consentement. Au plus 20 par minute et par organisation.

connection delete#

Supprimez une connexion par laquelle rien n’est lu.

connection delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (pcn_…).
--expect-rev REVISIONintegernonaucunRefuse la suppression sauf si la connexion est à cette révision (revision_conflict, sortie 6).
screenrig connection delete pcn_01EXAMPLECONNECTION0000
screenrig connection delete pcn_01EXAMPLECONNECTION0000 --expect-rev 2

Tant qu’une source de données, une connexion Power BI ou un compte de synchronisation de médias lit par la connexion, la réponse est resource_conflict (sortie 5), en les nommant. La suppression ne met pas fin à l’accès côté fournisseur : un locataire Microsoft 365 garde l’application de screenRIG jusqu’à ce que son administrateur la retire, et un compte Google garde son autorisation jusqu’à ce que son titulaire la révoque.

Connexions BI

Une connexion BI est l’accès du projet à un système qu’il possède et qui affiche des tableaux de bord : pour Grafana, son adresse et un jeton de compte de service ; pour Power BI, une application Microsoft Entra (principal de service) et son secret client ; pour Tableau, une application connectée et un utilisateur ; et pour une page web, le compte de service d’un site qui affiche un tableau de bord derrière une connexion, ou les cookies d’un navigateur connecté. Un ID de connexion commence par bic_. Les secrets sont scellés sur le serveur et jamais affichés de nouveau : une lecture affiche secret {set, hint}. Les connexions appartiennent à un seul projet. bi connection list, show et browse exigent l’accès Read, et toute autre commande exige l’accès Manage.

Donnez un secret dans un fichier : --token-file pour Grafana, --secret-file pour Power BI et Tableau, --password-file, --totp-file et --cookies-file pour une page web. Chacun accepte - pour l’entrée standard, jamais un argument, et au plus une option d’une commande lit l’entrée standard.

Une vue joue un tableau de bord, un rapport ou une page d’une connexion par une primitive iframe qui affiche son embed_url ; bi view create --connection-id ID en crée une. Afficher un tableau de bord derrière une connexion présente pas à pas une connexion web, et la référence de l’API couvre chaque type.

bi connection create grafana#

Ajoutez une connexion Grafana : son adresse et un jeton de compte de service.

bi connection create grafana --url URL --token-file FILE [--name NAME] [--org-id N]
ParamètreTypeRequisPar défautNotes
--url URLstringouiaucunL’adresse de Grafana sur un hôte public, avec un préfixe de chemin facultatif : https://grafana.example.com ou https://example.com/grafana. Une adresse privée, de bouclage ou réservée donne invalid_request (sortie 8), et Grafana doit répondre sans rediriger.
--token-file FILEstringouiaucunLit le jeton de compte de service depuis ce fichier, ou - pour l’entrée standard (jamais un argument) ; le fichier ne contient que le jeton.
--name NAMEstringnonle nom d’hôte1 à 80 caractères.
--org-id Nintegernon1L’organisation Grafana à laquelle appartient le jeton : un nombre entier à partir de 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

Dans Grafana, installez le plugin Grafana Image Renderer ou le service de rendu distant (il dessine les tableaux de bord sous forme d’images ; sans lui, rien n’est dessiné), puis créez un compte de service avec le rôle Viewer et ajoutez un jeton. Exécutez ensuite bi connection test.

bi connection create tableau#

Ajoutez une connexion Tableau : une application connectée (direct trust), l’utilisateur sous lequel les vues des écrans sont affichées, et la valeur du secret de l’application.

bi connection create tableau --url URL --client-id ID --secret-id ID --username USER
    --secret-file FILE [--site SITE] [--name NAME]
ParamètreTypeRequisPar défautNotes
--url URLstringouiaucunL’adresse https de Tableau Server, ou de votre pod Tableau Cloud, comme https://10ay.online.tableau.com (le pod, pas online.tableau.com).
--site SITEstringnonle site par défaut de Tableau ServerL’URL de contenu du site, la partie après /site/ ou /t/ dans l’adresse d’une vue.
--client-id IDstringouiaucunLe Client ID de l’application connectée.
--secret-id IDstringouiaucunLe Secret ID d’un secret généré pour l’application connectée.
--username USERstringouiaucunL’utilisateur Tableau sous lequel les vues des écrans sont affichées (une adresse courriel sur Tableau Cloud).
--secret-file FILEstringouiaucunLit la valeur du secret depuis ce fichier, ou - pour l’entrée standard (jamais un argument) ; le fichier ne contient que la valeur du secret, pas le Secret ID.
--name NAMEstringnonle nom d’hôte1 à 80 caractères.
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

À configurer une seule fois dans Tableau : sous Settings, Connected Apps, créez une application connectée Direct trust, copiez son Client ID, générez un secret et copiez le Secret ID et la valeur du secret, puis activez l’application et le secret. Choisissez ou créez l’utilisateur Tableau sous lequel les écrans affichent leurs vues et donnez-lui l’accès uniquement aux vues que les écrans affichent : quiconque détient le ticket d’un écran peut intégrer toute vue que cet utilisateur peut voir. Puis exécutez bi connection show ID et entrez l’hôte de son embed_origin dans la liste d’autorisation des domaines de l’application connectée. Il faut Tableau Cloud ou Tableau Server 2023.3 ou version ultérieure ; les écrans doivent atteindre l’hôte Tableau, et leur navigateur doit accepter les cookies tiers de cet hôte. Exécutez ensuite bi connection test, puis bi connection browse pour trouver une vue.

bi connection create powerbi#

Ajoutez une connexion Power BI : une application Microsoft Entra (principal de service) et son secret client, ou une connexion Microsoft de ce projet.

bi connection create powerbi
    (--tenant-id ID --client-id ID --secret-file FILE | --connection-id ID) [--name NAME]
ParamètreTypeRequisPar défautNotes
--tenant-id IDstringsans --connection-idaucunVotre Directory (tenant) ID Microsoft Entra, ou son domaine, comme contoso.onmicrosoft.com ; pas common, organizations ni consumers. En même temps que --client-id et --secret-file.
--client-id IDstringsans --connection-idaucunL’Application (client) ID de l’inscription d’application.
--secret-file FILEstringsans --connection-idaucunLit la Value du secret client depuis ce fichier, ou - pour l’entrée standard (jamais un argument) ; le fichier ne contient que la valeur du secret, pas l’ID du secret.
--connection-id IDstringsans --tenant-idaucunSe connecte par une connexion Microsoft (pcn_…) de ce projet en mode own_app, à la place de --tenant-id, --client-id et --secret-file. Une connexion screenrig_app est refusée. Pas avec eux.
--name NAMEstringnonPower BI1 à 80 caractères.
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"

À configurer une seule fois. Dans Microsoft Entra, créez une inscription d’application (locataire unique, sans URI de redirection, sans autorisations d’API) et un secret client. Un administrateur Power BI active, dans le portail d’administration, sous Tenant settings, Developer settings, les options Embed content in apps et Service principals can call Fabric public APIs, pour toute l’organisation ou pour un groupe de sécurité qui contient l’application. Ajoutez l’application à chaque espace de travail que vous affichez avec le rôle Membre ou Administrateur ; Membre est l’accès minimal. Pour une intégration en production, l’espace de travail doit se trouver sur une capacité Fabric (F), Power BI Embedded (A) ou Premium (P/EM). Cloud commercial seulement. Exécutez ensuite bi connection test, puis bi connection browse pour trouver un espace de travail et un rapport.

bi connection create web#

Ajoutez une connexion web : un compte de service d’un site qui affiche un tableau de bord derrière une connexion, ou les cookies d’un navigateur connecté.

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]
ParamètreTypeRequisPar défautNotes
--login-mode MODEstringouiaucunauto remplit le formulaire de --login-url avec --username et le mot de passe. steps exécute le script --steps. none n’ouvre aucune session : les pages s’affichent avec le fichier de cookies --cookies-file et n’acceptent aucun de --login-url, --username, --password-file, --totp-file ni --steps.
--login-url URLstringavec auto ou stepsaucunL’adresse https de la page de connexion du site, sur un hôte public. Le mot de passe n’est saisi que là et dans les étapes goto du script, jamais dans l’adresse d’une vue.
--username USERstringavec autoaucunLe nom d’utilisateur du compte de service.
--password-file FILEstringavec autoaucunLit le mot de passe du compte de service depuis ce fichier, ou - pour l’entrée standard (jamais un argument) : les espaces sont permis, et une fin de ligne finale est retirée.
--totp-file FILEstringnonaucunLit la clé base32 que le site affiche pour l’application d’authentification du compte (de 16 à 128 caractères), ou son adresse otpauth://totp, depuis ce fichier ou - : le serveur calcule les codes.
--steps FILEstringavec stepsaucunLe script de connexion, un tableau JSON d’au plus 30 étapes, depuis un fichier ou -. Actions : goto (url), fill (selector, value), click et wait_for (selector), press (value comme Enter, selector facultatif) et wait_ms (ms). Une valeur peut contenir {{username}}, {{password}} et {{otp}}, jamais le secret lui-même. Pas avec auto.
--cookies-file FILEstringnonaucunUn fichier de cookies exporté d’un navigateur connecté : un tableau JSON de cookies (l’export d’une extension de cookies) ou un objet avec un tableau cookies (l’état de stockage de Playwright), depuis un fichier ou - ; 100 au plus. Seuls name, value, domain, path, expires, httpOnly, secure et sameSite sont envoyés.
--name NAMEstringnonl’hôte de connexion1 à 80 caractères.
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"

Le mot de passe, la clé et les cookies sont scellés et jamais affichés de nouveau : data.secret et data.totp_secret indiquent s’ils sont définis, et data.session indique où en est l’ouverture de session (idle, active, login_needed, paused, stopped ou expired). Utilisez un compte de service en lecture seule. Une ouverture de session refusée attend 5 minutes, puis 15, 60 et 120, et la cinquième de suite arrête la connexion jusqu’à ce que ses identifiants ou ses paramètres de connexion changent. Un site qui approuve les ouvertures de session sur un téléphone, vérifie les appareils ou affiche un CAPTCHA ne peut pas être scripté : utilisez un fichier de cookies. Un serveur sans le moteur de rendu de pages répond bi_web_unavailable (sortie 5). Exécutez ensuite bi connection test.

bi connection list#

Liste les connexions BI de ce projet avec leur type, leur secret masqué et leur dernier test.

bi connection list

Aucun paramètre.

screenrig bi connection list

data.items contient toutes les connexions du projet ; aucun secret n’est renvoyé.

bi connection show#

Consultez une connexion et son dernier test.

bi connection show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (bic_…).
screenrig bi connection show bic_01EXAMPLECONNECTION0000

La réponse porte kind, config (url et org_id pour Grafana ; tenant_id et client_id pour Power BI ; url, site, client_id, secret_id et username pour Tableau), secret {set, hint}, embed_origin (l’hôte d’intégration du projet, que nomme la liste d’autorisation des domaines d’une application connectée) et last_test.

bi connection update#

Modifiez le nom, l’adresse, l’organisation, le locataire, l’application, le site, l’utilisateur ou le secret d’une connexion ou, pour une connexion web, son ouverture de session et ses cookies.

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]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (bic_…).
--name NAMEstringnoninchangéRenomme la connexion.
--url URLstringnoninchangéLa nouvelle adresse de Grafana, ou du serveur ou du pod Tableau.
--org-id NintegernoninchangéL’organisation Grafana à laquelle appartient le jeton.
--tenant-id IDstringnoninchangéLe locataire Microsoft Entra de la connexion Power BI.
--client-id IDstringnoninchangéL’Application (client) ID de la connexion Power BI, ou le Client ID de l’application connectée Tableau.
--site SITEstringnoninchangéL’URL de contenu du site de la connexion Tableau. Pas avec --default-site.
--default-sitebooleannondésactivéTableau Server : se connecte au site par défaut. Pas avec --site.
--secret-id IDstringnoninchangéLe Secret ID de l’application connectée Tableau.
--username USERstringnoninchangéL’utilisateur Tableau sous lequel les vues des écrans sont affichées, ou le compte de service de la connexion web.
--token-file FILEstringnoninchangéGrafana : lit le jeton de compte de service depuis ce fichier, ou - pour l’entrée standard ; il remplace le jeton stocké. Au plus un parmi --token-file, --secret-file, --password-file et --clear-password.
--secret-file FILEstringnoninchangéPower BI ou Tableau : lit la valeur du secret depuis ce fichier, ou - pour l’entrée standard ; elle remplace le secret stocké.
--login-mode MODEstringnoninchangéWeb : comment elle ouvre une session, auto, steps ou none.
--login-url URLstringnoninchangéWeb : l’adresse https de la page de connexion du site. Une nouvelle origine exige --password-file dans la même commande, de sorte que le mot de passe stocké n’est jamais envoyé à une page que vous n’avez pas indiquée.
--password-file FILEstringnoninchangéWeb : lit le mot de passe du compte de service depuis ce fichier, ou - pour l’entrée standard ; il remplace le mot de passe stocké.
--clear-passwordbooleannondésactivéWeb : retire le mot de passe stocké.
--totp-file FILEstringnoninchangéWeb : lit la clé d’authentification depuis ce fichier, ou - pour l’entrée standard ; elle remplace la clé stockée. Pas avec --clear-totp.
--clear-totpbooleannondésactivéWeb : retire la clé d’authentification stockée. Pas avec --totp-file.
--steps FILEstringnoninchangéWeb : remplace le script de connexion, un tableau JSON d’au plus 30 étapes, depuis un fichier ou -.
--cookies-file FILEstringnoninchangéWeb : remplace le fichier de cookies par un fichier exporté d’un navigateur connecté, depuis un fichier ou - (les formes qu’accepte bi connection create web). Pas avec --clear-cookies.
--clear-cookiesbooleannondésactivéWeb : retire le fichier de cookies stocké. Pas avec --cookies-file.
--expect-rev REVISIONintegernonaucunRefuse le changement sauf si la connexion est à cette révision (revision_conflict, sortie 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

Au moins un changement est requis, et un secret omis est conservé. Une nouvelle adresse sur un autre hôte, schéma ou port exige --token-file (Grafana) ou --secret-file (Tableau) dans la même commande : le secret stocké n’est envoyé qu’à l’adresse pour laquelle il a été enregistré. Un changement d’adresse, d’organisation, de locataire, d’application, de site, d’utilisateur ou de secret efface last_test et retire tous les rendus mis en cache pour les vues de la connexion : testez-la de nouveau. Un changement d’identifiants ou de paramètres d’ouverture de session rétablit une session web arrêtée.

bi connection test#

Vérifiez les identifiants : le jeton et l’Image Renderer de Grafana, l’application de Power BI et ses espaces de travail, ou l’ouverture de session de Tableau.

bi connection test <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (bic_…).
screenrig bi connection test bic_01EXAMPLECONNECTION0000

Grafana : token (Grafana l’accepte) et image_renderer (le plugin est listé ; Grafana sans lui avertit seulement, car un service de rendu distant ne s’affiche pas comme un plugin). Power BI : token (Microsoft Entra en a émis un pour l’application) et workspaces (les espaces de travail que l’application peut voir ; aucun fait échouer le test, et un refus nomme les paramètres de développeur du locataire et le rôle Membre ou Administrateur de l’application dans l’espace de travail). Tableau : signin comme l’utilisateur de la connexion avec un jeton de lecture de contenu, suivi d’une déconnexion. Un refus est une vérification échouée qui porte la réponse propre du fournisseur, et le résultat est stocké sous last_test. Le test ne juge ni la liste d’autorisation des domaines de Tableau, ni la capacité, ni la sécurité au niveau des lignes, ni les autorisations d’un tableau de bord : bi view test vérifie réellement une vue.

bi connection browse#

Liste ce qu’une connexion peut afficher : les tableaux de bord et panneaux Grafana, les espaces de travail et rapports Power BI, ou les vues Tableau.

bi connection browse <id> [--query TEXT] [--dashboard UID] [--workspace ID]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (bic_…).
--query TEXTstringnonaucunSeulement les tableaux de bord, espaces de travail, rapports ou vues dont le nom correspond.
--dashboard UIDstringnonaucunGrafana : liste les panneaux de ce tableau de bord à la place.
--workspace IDstringnonaucunPower BI : liste les rapports de cet espace de travail à la place.
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 liste, pour Grafana, les uid, title, folder et tags de chaque tableau de bord que le jeton peut afficher, ou, avec --dashboard, les id, title et type de ses panneaux (les lignes sont aplaties, de sorte qu’un panneau dans une ligne repliée est listé) ; pour Power BI, les id et name de chaque espace de travail que l’application peut voir, ou, avec --workspace, les id, name et embed_url de ses rapports ; pour Tableau, le path, sous la forme Workbook/View, et le name de chaque vue que l’utilisateur de la connexion peut voir. Utilisez ces valeurs avec bi view create.

bi connection delete#

Supprimez une connexion qu’aucune vue n’utilise.

bi connection delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa connexion (bic_…).
--expect-rev REVISIONintegernonaucunRefuse la suppression sauf si la connexion est à cette révision (revision_conflict, sortie 6).
screenrig bi connection delete bic_01EXAMPLECONNECTION0000

Tant que des vues l’utilisent, la réponse est resource_conflict (sortie 5), en les nommant : supprimez d’abord ces vues.

Vues BI

Une vue est un tableau de bord ou un panneau d’une connexion Grafana, un rapport d’un espace de travail Power BI, une vue d’un site Tableau, une page d’une connexion web, ou un lien public qui n’exige aucune connexion : un tableau de bord public Grafana, un lien Power BI Publish to web ou une viz Tableau Public. Un ID de vue commence par biv_, et une vue ne joue que sur les écrans de son propre projet.

Mettez le embed_url de la vue dans une primitive iframe avec content_fit fill et publiez comme d’habitude : la liste de lecture ne contient aucun identifiant. Les vues Grafana et web sont dessinées sur le serveur sous forme d’image à la fréquence --refresh et partagées par tous les écrans de même taille : dix écrans de hall font donc un seul rendu et l’écran ne parle jamais au système ; la dernière bonne image reste à l’écran tant qu’une capture échoue. Un rapport Power BI et une vue Tableau s’intègrent avec un jeton en lecture seule que le serveur génère et renouvelle, et l’écran ne détient jamais le secret. Une image n’est dessinée que tant que le manifeste d’un écran nomme la vue.

La lecture exige l’accès Read, et tout changement exige l’accès Manage. Chaque flag de cible appartient à un seul type de connexion, et bi connection browse ID liste les valeurs à utiliser.

bi view create#

Ajoutez une vue d’un tableau de bord, d’un panneau, d’un rapport ou d’une vue Tableau d’une connexion, ou d’un lien public.

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]
ParamètreTypeRequisPar défautNotes
--connection-id IDstringsans --public-urlaucunLa connexion (bic_…) dont afficher un élément.
--url URLstringune cibleaucunUne adresse de tableau de bord sur l’hôte Grafana de la connexion, une adresse de rapport Power BI, une adresse de vue Tableau ou, pour une connexion web, l’adresse https de la page sur un hôte public. Le reste de la cible est lu à partir de celle-ci.
--dashboard UIDstringune cibleaucunGrafana : l’uid du tableau de bord, la partie après /d/ dans son adresse.
--workspace IDstringune cibleaucunPower BI : l’ID de l’espace de travail, avec --report.
--report IDstringavec --workspaceaucunPower BI : l’ID du rapport, avec --workspace.
--view WORKBOOK/VIEWstringune cibleaucunTableau : la vue, les noms après /views/ dans son adresse (bi connection browse les liste).
--public-url URLstringune cibleaucunUn lien de tableau de bord public Grafana, un lien Power BI Publish to web ou l’adresse d’une viz Tableau Public. Il n’a besoin d’aucune connexion et se joue en direct depuis son hôte. Donnez-le seul, avec --name, --refresh, --fit et --rotate-sheets.
--name NAMEstringnonde la cible1 à 80 caractères.
--refresh DURATIONstringnon5mGrafana : fréquence à laquelle l’image est dessinée de nouveau, de 30s à 24h. Web : fréquence à laquelle la page est dessinée de nouveau, de 60s à 24h. Power BI et Tableau : fréquence à laquelle le rapport ou la vue actualise ses données, de 60s à 24h, ou 0 pour aucune.
--fit FITstringnoncontainGrafana et web : comment l’image remplit l’écran, contain, cover ou fill.
--rotate DURATIONstringnonaucunPower BI : durée d’affichage de chaque page, de 10s à 1h ; requise avec deux --page ou plus ou avec --all-pages. Tableau : durée d’affichage de chaque feuille ; requise avec --rotate-sheets.
--page NAMEstringnonaucunPower BI : une page à afficher, par nom ou par nom d’affichage. Répétable ; les pages s’affichent dans cet ordre.
--all-pagesbooleannondésactivéPower BI : fait défiler toutes les pages visibles, avec --rotate.
--rotate-sheetsbooleannondésactivéTableau : fait défiler les feuilles publiées du classeur, avec --rotate.
--panel IDstringnonle tableau de bord entierGrafana : affiche ce seul panneau au lieu du tableau de bord entier.
--from TIMEstringnonaucunGrafana : début de la plage de temps, comme now-6h.
--to TIMEstringnonaucunGrafana : fin de la plage de temps, comme now.
--var NAME=VALUEstringnonaucunGrafana : une variable de tableau de bord. Répétable.
--theme THEMEstringnondarkThème Grafana, dark ou light.
--timezone ZONEstringnonaucunGrafana : fuseau horaire du tableau de bord, comme Europe/Paris, utc ou browser.
--wait-for CSSstringnonaucunWeb : un sélecteur CSS d’un élément qui s’affiche quand la page est prête, et seulement une fois la session ouverte. La capture l’attend et échoue avec bi_web_timeout s’il ne s’affiche jamais.
--wait-ms MSintegernonaucunWeb : millisecondes à attendre après que la page est prête, pour les graphiques qui s’affichent tard, de 0 à 10000.
--clip CSSstringnonla page entièreWeb : un sélecteur CSS de la partie de la page à dessiner.
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'

Donnez exactement une cible : --url, --dashboard, --workspace avec --report, --view ou --public-url. La réponse porte data.embed_url. Exécutez ensuite bi view test.

Grafana : --url lit orgId, viewPanel ou panelId, from, to, var-* et theme dans l’adresse. L’image est dessinée par le service de rendu de Grafana et partagée par tous les écrans de même taille, et un écran garde la dernière image, avec l’heure du rendu dans un coin, tant que Grafana est indisponible. Un lien de tableau de bord public se joue en direct depuis Grafana, qui doit autoriser l’intégration (allow_embedding = true dans ses paramètres) : bi view test le vérifie.

Power BI : --url prend l’adresse d’un rapport copiée depuis Power BI, https://app.powerbi.com/groups/WORKSPACE/reports/REPORT, avec une page /ReportSection facultative ; ou donnez --workspace et --report. Deux pages ou plus exigent --rotate, et --rotate exige deux pages ou plus ou --all-pages. --refresh 0 convient à un rapport DirectQuery ou à actualisation automatique des pages qui se met à jour lui-même. --fit ne s’applique pas. Un lien Publish to web montre le rapport à toute personne qui a le lien et se joue tel que Power BI le sert, rechargé selon --refresh, sans rotation des pages.

Tableau : --url prend l’adresse d’une vue copiée depuis Tableau, https://HOST/t/SITE/views/WORKBOOK/VIEW, la forme https://HOST/#/site/SITE/views/WORKBOOK/VIEW de Tableau Cloud, ou simplement WORKBOOK/VIEW ; l’adresse doit se trouver sur l’hôte et le site de la connexion. --rotate-sheets et --rotate exigent chacun l’autre. --fit ne s’applique pas. Les écrans doivent atteindre l’hôte Tableau et accepter ses cookies tiers, et le embed_origin de la vue doit figurer dans la liste d’autorisation des domaines de l’application connectée. Une viz Tableau Public (--public-url https://public.tableau.com/app/profile/USER/viz/WORKBOOK/VIEW, ou son adresse /views/) n’a besoin d’aucune connexion ni d’aucun jeton, et --rotate-sheets y fonctionne aussi.

Web : --url est l’adresse de la page, et --wait-for, --wait-ms et --clip ne s’appliquent qu’à une vue web. La dernière bonne image reste à l’écran quand une capture échoue, et status.last_error en indique la raison : bi_web_login_failed, bi_web_otp_required, bi_web_session_expired, bi_web_login_paused, bi_web_timeout, bi_web_navigation_failed ou bi_web_blocked.

bi view list#

Liste les vues BI de ce projet avec leur cible, leur cadence et leur statut.

bi view list

Aucun paramètre.

screenrig bi view list

data.items contient toutes les vues du projet, chacune avec son embed_url.

bi view show#

Consultez une vue, son embed_url et son comportement le plus récent à l’écran.

bi view show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa vue (biv_…).
screenrig bi view show biv_01EXAMPLEVIEW0000000000

La réponse porte connection_id, target (view et rotate_sheets pour Tableau), refresh_s, rotate_s, fit, status et embed_url. status contient last_ok_at et last_error avec un code et un detail : bi_upstream_refused quand Grafana a refusé le jeton, bi_upstream_unavailable quand il n’a pas pu dessiner.

bi view update#

Modifiez le nom, la cible, la cadence ou l’ajustement d’une vue.

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]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa vue (biv_…).
--name NAMEstringnoninchangéRenomme la vue.
--url URLstringnoninchangéUne adresse de tableau de bord, de rapport ou de vue Tableau, ou l’adresse de la page d’une vue web ; remplace la cible entière. Pas avec les autres flags de cible.
--dashboard UIDstringnoninchangéGrafana : affiche ce tableau de bord ; remplace la cible entière.
--workspace IDstringnoninchangéPower BI : affiche un rapport de cet espace de travail, avec --report ; remplace la cible entière.
--report IDstringnoninchangéPower BI : affiche ce rapport, dans --workspace ou dans l’espace de travail actuel.
--view WORKBOOK/VIEWstringnoninchangéTableau : affiche cette vue ; remplace la cible entière.
--public-url URLstringnoninchangéUn lien public ; remplace la cible entière.
--rotate-sheetsbooleannondésactivéTableau : fait défiler les feuilles publiées du classeur, avec --rotate.
--page NAMEstringnoninchangéPower BI : les pages à afficher, par nom ou par nom d’affichage. Répétable ; elle remplace les pages actuelles.
--all-pagesbooleannondésactivéPower BI : fait défiler toutes les pages visibles.
--rotate DURATIONstringnoninchangéPower BI : durée d’affichage de chaque page, de 10s à 1h, ou 0 pour une seule page. Tableau : durée d’affichage de chaque feuille, ou 0 pour arrêter de les faire défiler.
--panel IDstringnoninchangéGrafana : affiche ce seul panneau.
--from TIMEstringnoninchangéGrafana : début de la plage de temps.
--to TIMEstringnoninchangéGrafana : fin de la plage de temps.
--var NAME=VALUEstringnoninchangéGrafana : définit une variable de tableau de bord. Répétable ; elle définit une variable et garde les autres.
--theme THEMEstringnoninchangéThème Grafana, dark ou light.
--timezone ZONEstringnoninchangéGrafana : fuseau horaire du tableau de bord.
--refresh DURATIONstringnoninchangéFréquence à laquelle l’image est dessinée de nouveau ou le rapport s’actualise : Grafana de 30s à 24h ; web de 60s à 24h ; Power BI et Tableau de 60s à 24h, ou 0 pour aucune.
--fit FITstringnoninchangéGrafana et web : comment l’image remplit l’écran, contain, cover ou fill.
--wait-for CSSstringnoninchangéWeb : l’élément qui s’affiche quand la page est prête et la session ouverte. Pas avec --clear-wait-for.
--clear-wait-forbooleannondésactivéWeb : cesse d’attendre un élément. Pas avec --wait-for.
--wait-ms MSintegernoninchangéWeb : millisecondes à attendre après que la page est prête, de 0 à 10000 ; 0 supprime l’attente.
--clip CSSstringnoninchangéWeb : la partie de la page à dessiner. Pas avec --clear-clip.
--clear-clipbooleannondésactivéWeb : dessine de nouveau toute la page. Pas avec --clip.
--expect-rev REVISIONintegernonaucunRefuse le changement sauf si la vue est à cette révision (revision_conflict, sortie 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

Au moins un changement est requis. --url, --dashboard, --workspace et --public-url remplacent la cible entière, tandis que --panel, --from, --to, --var, --theme et --timezone modifient la cible Grafana actuelle de la vue, --report, --page et --all-pages celle de Power BI, et --view et --rotate-sheets celle de Tableau. --page remplace la liste de pages ; pour l’effacer, donnez de nouveau --workspace et --report avec --rotate 0. --rotate 0 seul empêche une vue Tableau de faire défiler ses feuilles. Une nouvelle cible efface le statut et retire ses rendus mis en cache, et les écrans prennent le changement en compte à leur prochaine actualisation, sans republication. Une vue garde sa connexion et son type.

bi view test#

Vérifiez réellement une vue : un rendu Grafana, un jeton d’intégration Power BI, une recherche Tableau, ou un lien public.

bi view test <id> [--output FILE [--width PIXELS] [--height PIXELS]]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa vue (biv_…).
--output FILEstringnonaucunGrafana : enregistre ici le PNG dessiné au lieu d’exécuter les vérifications.
--width PIXELSintegernon1920Largeur de l’image enregistrée, de 1 à 10000. Exige --output.
--height PIXELSintegernon1080Hauteur de l’image enregistrée, de 1 à 10000. Exige --output.
screenrig bi view test biv_01EXAMPLEVIEW0000000000
screenrig bi view test biv_01EXAMPLEVIEW0000000000 --output lobby.png --width 1920 --height 1080

Grafana : une vue de connexion est réellement dessinée, hors du cache partagé et sans toucher au statut de la vue. data.ok est à false, avec la raison de Grafana, quand il refuse le jeton, n’a pas de moteur de rendu ou ne connaît pas le tableau de bord ; un test échoué est une donnée, sortie 0. Ouvrez le PNG enregistré et regardez-le avant de publier. Pour un lien public, le test récupère la page et vérifie que Grafana permet à la page d’intégration de la vue de l’encadrer.

Tableau : une vue de connexion se connecte comme l’utilisateur de la connexion et recherche la vue (signin, view) ; une vue que l’utilisateur ne peut pas voir, ou un nom dont la casse est incorrecte, donne une vérification view échouée qui nomme le chemin. Une vue Tableau Public demande à Tableau Public si le classeur existe. Power BI : une vue de connexion lit le rapport (report) et génère pour lui un vrai jeton d’intégration en lecture seule (embed_token) ; la raison propre de Power BI est affichée quand il refuse, comme un jeu de données avec sécurité au niveau des lignes, un 401 ou un 403 (paramètre du locataire ou rôle dans l’espace de travail) ou un rapport que l’application ne peut pas voir. Un lien Publish to web est récupéré et ses en-têtes d’encadrement sont lus.

Le test ne juge ni ce que l’image affiche, ni les pages que la vue nomme, ni la capacité, ni la liste d’autorisation des domaines de Tableau.

bi view delete#

Supprimez une vue.

bi view delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunLa vue (biv_…).
--expect-rev REVISIONintegernonaucunRefuse la suppression sauf si la vue est à cette révision (revision_conflict, sortie 6).
screenrig bi view delete biv_01EXAMPLEVIEW0000000000
screenrig bi view delete biv_01EXAMPLEVIEW0000000000 --expect-rev 3

Un écran qui affiche encore le embed_url de la vue répond not_found jusqu’à ce que sa liste de lecture change.

Conversations d’assistance

Chaque forfait, y compris Standard, inclut l’assistance par IA via le CLI et le bouton moutarde Support du tableau de bord en bas à droite, et Premium, Education et Enterprise peuvent demander une personne. Les conversations conservent leur historique. Le tableau de bord met en évidence les réponses du personnel non lues et affiche le Markdown, y compris les liens cliquables, listes et code. Appuyez sur Entrée pour envoyer ou Maj+Entrée pour une nouvelle ligne. Les réponses du personnel affichent leur prénom et avatar Slack quand disponibles, avec le personnel ScreenRIG et le logo screenRIG en secours ; les clients utilisent un avatar générique de personne.

Utilisez la documentation et votre agent opérant pour diagnostiquer et résoudre les problèmes. Utilisez feedback bug ou feedback feature pour envoyer des rapports.

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

Commencez avec support status, qui rapporte chat_allowed (ce projet peut démarrer ou poursuivre une conversation), human_available (une personne peut se joindre sur demande), staffed (le personnel est dans ses heures en ce moment) et hours (les heures de présence). support submit accepte un message de 1 à 4000 caractères. Omettez --conversation-id pour démarrer une conversation ; utilisez le data.conversation.id retourné pour les suivis. Gardez la même clé d’idempotence lors de la réessai d’une soumission incertaine.

Les pages d’historique contiennent jusqu’à 100 lignes. Passez la data.next d’une page de conversation en --before pour les conversations plus anciennes, ou la dernière séquence de message en --after pour les messages plus récents. support follow diffuse les réponses en SSE, reprend depuis la dernière séquence du projet et supprime la relecture. Un filtre de conversation sélectionne les réponses qu’il imprime tout en avançant ce curseur de projet. support read accuse réception des réponses du personnel jusqu’à la séquence que vous avez lue. Terminez une conversation résolue avec support close ou le bouton Terminer la conversation du tableau de bord. La fermeture conserve son historique ; commencez une nouvelle conversation pour plus d’aide.

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’assistant IA, répond tout de suite sur tous les forfaits. Une personne ne se joint à une conversation sur demande que sur Education, Premium et Enterprise (human_available), et demander une personne suspend l’IA dans cette conversation ; sur Standard et Plus, la demande est ignorée et Luna répond. Les heures du personnel sont de 09 h 00 à 17 h 00 du lundi au vendredi, heure de Vancouver, sauf les jours fériés légaux de la B.C., et ne déterminent que le moment où une personne répond. Gardez les identifiants hors des messages de soutien.

Commentaires

Les rapports de bogues et demandes de fonctionnalités sont liés au projet et immuables. Le type vient de la commande, jamais d’un champ du corps, et une correction est une nouvelle soumission plutôt qu’une modification.

feedback bug#

Signaler un bogue à screenRIG.

feedback bug <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]
ParamètreTypeRequisPar défautNotes
<title>stringouiaucunAu maximum 120 caractères.
--body TEXTstringl’un des deuxaucunCorps en ligne, au maximum 4 000 caractères.
--body-file FILEcheminl’un des deuxaucunLire le corps depuis un fichier, adapté à un rapport multi-lignes.
--commandstringnonaucunLa commande dont le rapport parle, sous forme de chemin de commande seulement : jusqu’à quatre mots minuscules tels que media upload. Elle n’est jamais prise de la ligne de commande que vous avez lancée.
--no-contextbooleannondésactivéOmettre l’enveloppe de diagnostic, qui contient sinon la version du CLI, le chemin de commande optionnel et la plateforme.
screenrig feedback bug "Playlist stalls after assignment" --body-file ./report.md --command "screen assign"

Le serveur rejette, plutôt que caviarde, le texte correspondant à du matériel d’identification, et retourne des conseils au niveau du champ pour que vous puissiez réécrire et renvoyer. Une nouvelle tentative exacte sous la même clé d’idempotence retourne la soumission originale pendant vingt-quatre heures.

feedback feature#

Faire une demande de fonctionnalité.

feedback feature <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]
ParamètreTypeRequisPar défautNotes
<title>stringouiaucunAu maximum 120 caractères.
--body TEXTstringl’un des deuxaucunCorps en ligne, au maximum 4 000 caractères.
--body-file FILEcheminl’un des deuxaucunLire le corps depuis un fichier.
--commandstringnonaucunLa commande dont la requête parle, sous forme de chemin de commande seulement.
--no-contextbooleannondésactivéOmettre l’enveloppe de diagnostic.
screenrig feedback feature "Add a dry-run flag" --body "Preview a change first."

feedback list#

Lister les soumissions propres à ce projet.

feedback list [--kind bug|feature]
ParamètreTypeRequisPar défautNotes
--kindstringnonles deux types, les plus récents d’abordbug ou feature. Restreindre la liste à un type.
screenrig feedback list --kind bug

Publicité

Achetez de la publicité dans un réseau qui vous a invité, ou vendez des plages publicitaires sur des écrans que vous possédez. Chaque commande lit d’abord screenrig project capabilities : l’achat nécessite la capacité advertiser, la vente nécessite des écrans possédés. L’argent est indiqué en chaînes décimales mcr (millicredit). Exécutez screenrig ads COMMAND --help --json pour chaque indicateur. Le flux d’achat et de vente est dans Démarrer ; tarifs et frais sont dans Tarification.

ads networks#

Acheteur : lister les réseaux dans lesquels ce projet a été invité, et inspecter l’inventaire et les emplacements autorisés d’un réseau.

ads networks list
ads networks show <seller-project-id>
screenrig ads networks list

ads network#

Vendeur : inspecter ou créer le réseau propre à ce projet et définir son tarif par défaut.

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

Le tarif est par tranche de 15 secondes de lecture complétée. Un tarif effectif modifié met en pause les campagnes affectées jusqu’à ce que chaque acheteur accepte un nouveau devis.

ads inventory#

Vendeur : inclure ou exclure un écran détenu de la publicité et le décrire aux acheteurs invités.

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

Les indicateurs omis gardent leurs valeurs actuelles. Une nouvelle ligne d’inventaire nécessite --enabled ou --disabled. --impressions-per-hour enregistre votre estimation des impressions que l’écran diffuse en une heure : chaque diffusion terminée compte alors cette estimation multipliée par les secondes diffusées et divisée par 3600 comme estimated_impressions dans ads reports spend, ads reports delivery et ads direct report.

ads slots#

Vendeur : définir des emplacements publicitaires réutilisables. Un emplacement ne change rien sur l’écran tant que sa page d’emplacement publicitaire n’est pas placée dans une liste de lecture.

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 définit la balise publicitaire VAST 2-4 propre au vendeur, essayée lorsqu’aucune campagne invitée ne remplit l’emplacement sur vos propres écrans ; l’emplacement doit accepter la vidéo. L’URL est HTTPS sur le port 443 ou 8443 vers un hôte public. Le backend la récupère, suit jusqu’à cinq Wrappers, ingère le MP4 ou WebM progressif choisi dans les médias du projet, et déclenche Impression, creativeView et start sur un début accepté, complete sur une fin acceptée, et Error sur échec ; il n’y a pas de traceurs de quartiles. Les macros [CACHEBUSTING], [TIMESTAMP], [SCREENRIG_SCREEN_ID], [SCREENRIG_SLOT_ID] et [SCREENRIG_PAGE_ID] sont développées, et les acheteurs ne voient jamais la balise. Sur update, --vast-tag-url remplace la balise et --clear-vast-tag-url la supprime ; les deux ne se combinent pas, et omettre les deux conserve la balise stockée. ads slots list affiche vast_tag_url au vendeur propriétaire.

Advertising invitations#

Utilisez les commandes partagées invitations ci-dessus :

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 personne invitée accepte dans le tableau de bord. Une personne connectée sélectionne son projet d’achat et confirme avec une preuve de passkey récente. Une personne sans compte en crée un ainsi qu’un projet réservé aux annonceurs lors de l’acceptation.

ads memberships#

Vendeur : modifier ou révoquer la politique d’avis et la portée d’inventaire d’un acheteur admis.

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 révocation arrête les nouvelles diffusions publicitaires et conserve l’historique financier.

ads creatives#

Acheteur : lier les médias possédés prêts à une création immuable avec copie approuvée.

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#

Acheteur : rédiger une campagne, la tarifer et l’activer en acceptant le devis.

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

Un brouillon ne réserve rien. preview renvoie un devis limité dans le temps et ne dépense rien ; activate exige ce devis exact. Après un changement de tarif vendeur, seule accept-rates avec un devis frais reprend la campagne.

Un brouillon de campagne accepte un category facultatif tiré de la liste des catégories d’annonceurs. Deux annonces d’une même catégorie ne jouent jamais dans la même pause publicitaire sur un écran.

ads direct#

Vendeur : réservez vos propres ententes pour des annonceurs extérieurs à screenRIG sur vos propres écrans.

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

Un brouillon indique name, advertiser, un category facultatif, flight_start et flight_end, media_ids (vos propres images ou vidéos prêtes), un goal_plays facultatif, un price facultatif (cpm par mille diffusions ou flat, avec un amount et un currency ISO 4217) et le ciblage : screen_ids, slot_ids, venue_types, cities, tags et dayparts, où une liste vide désigne chaque écran ou emplacement inscrit. Une campagne directe remplit une pause publicitaire avant les acheteurs invités. Un objectif est réparti uniformément sur la période de diffusion et joue en premier tant qu’il est en retard; une campagne sans objectif prend chaque emplacement admissible pendant sa période de diffusion. Aucun crédit n’est déplacé : vous facturez l’annonceur, et le prix sert à valoriser le rapport.

availability lit une requête avec le même ciblage et la même période de diffusion et estime les diffusions que vous pouvez encore réserver : les occurrences récentes d’emplacements publicitaires des écrans ciblés, moins les diffusions dont vos autres objectifs directs ont encore besoin. Un objectif supérieur à l’estimation renvoie goal_overbooked, sauf si le brouillon définit "overbook": true. report liste les diffusions par rapport à l’objectif, le rythme, la valeur, les diffusions qui n’ont pas joué et des lignes par jour UTC, écran, emplacement et média; end est définitif.

ads reviews#

Vendeur : approuver, rejeter ou demander des modifications aux versions exactes des créations soumises par les acheteurs sur 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 envoie votre note à l’acheteur. Pour soumettre la révision, associez les médias révisés à une nouvelle création publicitaire, ajoutez-la à une nouvelle campagne, puis exécutez preview et activate avec le nouveau devis. La campagne de remplacement a son propre budget et son propre historique d’examen. Mettez la campagne d’origine en pause avant d’activer sa remplaçante pour éviter que leurs diffusions se chevauchent. Les décisions concernant les créations publicitaires se prennent dans la page Examens du tableau de bord, aux côtés des modifications de listes de lecture et d’écrans.

ads reports#

Lire les dépenses en tant qu’acheteur ou les livraisons en tant que vendeur.

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

Les rapports de livraison indiquent le brut, les frais de service et le net pour la période. Un rapport d’acheteur ne montre jamais les autres revenus d’un vendeur. fill montre, sur un maximum de 35 jours, combien d’occurrences d’emplacements publicitaires vos écrans ont demandées, combien ont été remplies par des campagnes directes, des acheteurs invités et votre balise VAST, et pourquoi les autres sont restées vides : no_demand, ineligible, separated ou capped.

Préparer, publier et modifier des listes de lecture

Pour les images et vidéos prêtes, préparez une liste de lecture plein écran dans l’ordre de lecture :

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

Validez le document, publiez-le, puis regardez l’écran réel avec screen screenshot. playlist init accepte les fichiers image/vidéo locaux, les ID med_ prêts, les versions d’application rel_ épinglées, et les URL iframe HTTP ou HTTPS dans l’ordre de lecture, y compris les entrées mixtes :

screenrig playlist init ./poster.png med_VIDEO rel_APP https://example.com --name Lobby --screen-id scr_LOBBY --output lobby.json

Le téléversement de fichiers locaux se fait par le chemin média normal et attend la disponibilité. Cela nécessite ffmpeg et ffprobe sauf si --no-transcode est fourni. La préparation écrit le document local et peut téléverser des médias ; elle ne crée ni liste de lecture distante ni n’assigne d’écran. Les médias existants doivent être prêts. Les URL HTTP et HTTPS peuvent inclure des hôtes du réseau local et des identifiants intégrés et ne sont pas récupérées pendant la préparation. L’application web du Player exige des URL HTTPS sans nom d’utilisateur ni mot de passe.

Pour la préparation de fichiers réessayable, choisissez --idempotency-key à la première tentative et réutilisez-le avec des fichiers identiques et dans le même ordre d’entrée dans la fenêtre de relecture du serveur. Chaque occurrence de fichier obtient ses propres clés de téléversement. Sans clé explicite, une nouvelle invocation obtient de nouvelles clés. Les médias téléversés survivent à un échec de préparation ultérieur ; inspectez media list et réutilisez ces ID lors de la réconciliation d’un résultat partiel.

Chaque entrée devient une page plein écran avec un fond noir et une transition croisée de 200 ms. Les images et vidéos utilisent --fit contain|cover|fill (par défaut contain). Les vidéos sont muettes, ne bouclent pas et passent à la suivante à la fin. Les autres pages utilisent --duration-ms (par défaut 8 000). Les applications et iframes utilisent fill ; les versions d’application sont épinglées avec une progression minutée et sans privilèges de contrôle. Modifiez le document pour une progression contrôlée par l’application. Vérifiez la préparation de la version et la lecture réelle via le serveur et le Player visé. La publication peut examiner les en-têtes de réponse des pages iframe HTTPS publiques admissibles. Une page dont X-Frame-Options ou frame-ancestors refuse l’encadrement ne peut pas être affichée par le Player web ni par les Players macOS, Samsung Tizen ou BrightSign. Lorsque la publication détecte un refus, l’écriture réussit quand même : screen publish et playlist create|update|patch affichent un avertissement iframe_framing_refused qui nomme la page et la primitive, et events list montre un avertissement playlist.iframe_framing_refused.

Fournissez --screen-id pour lire les dimensions cibles et la révision. Le résultat inclut data.screen_id, data.screen_revision et data.publish.argv. Passez ce tableau d’arguments au lanceur groupé screenrig sans division de shell : il conserve les chemins, la configuration et l’origine de l’API. Ajoutez explicitement --expect-rev pour vous prémunir contre des modifications ultérieures de l’écran. Les métadonnées cibles restent en dehors du document créé.

Pour remplacer la toile, fournissez à la fois --target-width et --target-height. Ceux-ci fonctionnent aussi sans écran, auquel cas aucun argument de publication n’est retourné. Les surfaces inconnues ou multiples signalées nécessitent des dimensions explicites. Les fichiers de sortie sont exclusifs par défaut ; utilisez --overwrite pour remplacer un fichier d’auteur existant de manière atomique. Les répertoires parents sont créés automatiquement. Les entrées URL et release-ID avec dimensions explicites fonctionnent sans connexion.

screen publish <screen-id> <file> crée une nouvelle liste de lecture, l’assigne avec une garde de révision écran optionnelle, et lit l’assignation. Il ne met pas à jour une liste de lecture existante par nom. Les noms d’affichage peuvent se répéter ; utilisez l’ID de la liste de lecture pour un playlist update explicite. Son résultat JSON rapporte playlist_id, playlist_revision, screen_id, screen_revision, assignment_verified et playback_verified. La vérification de l’assignation ne prouve pas la lecture ; demandez et inspectez une capture d’écran et des preuves de lecture pertinentes séparément.

Lorsque le projet exige une révision pour les modifications d'agent, ou que la session a un accès Propose, screen publish s'arrête dès que la liste de lecture ou son affectation est proposée : stage est pending_review, le résultat nomme les deux révisions, et l'enveloppe reste ok: true. Rien ne joue tant qu'une personne n'a pas approuvé. Ajoutez --note TEXT pour indiquer au réviseur ce qui a changé ; voir Révisions.

La publication enregistre automatiquement un journal local privé. Après un échec ambigu, répétez la même commande et entrée avec la même configuration pour reprendre. Si la création de la liste de lecture a réussi avant l’échec de l’assignation, l’erreur identifie la liste créée. Ne la supprimez pas et ne lancez pas une autre création pour récupérer. Un conflit de révision nécessite d’inspecter l’écran et de concilier l’assignation prévue ; une liste déjà créée peut être assignée explicitement avec screen assign. La publication ne rafraîchit jamais silencieusement la révision attendue. La récupération inachevée s’arrête après la fenêtre d’idempotence serveur de 24 heures ; inspectez et conciliez avant de faire plus d’écritures.

Pour modifier une liste de lecture existante :

screenrig playlist show pl_EXISTING --output lobby.json
screenrig playlist update pl_EXISTING lobby.json

playlist show --output écrit le document {name, pages} éditable et retourne son chemin, playlist_id, et la source revision sur stdout. Passez éventuellement cette révision avec --expect-rev pour protéger la mise à jour. Il préserve les sélecteurs dynamiques, les horaires, le mouvement et les versions d’application épinglées, supprimant les médias et champs de synchronisation dérivés du serveur. Les commentaires restent séparés. Un playlist show simple est une réponse d’inspection ; --editable sans --output retourne data.document, data.playlist_id et data.revision. La mise à jour d’une liste de lecture affecte chaque écran qui lui est assigné. En cours d’examen, playlist update propose le nouveau document, et playlist show continue de retourner la version en direct jusqu’à ce qu’une personne l’approuve.

Les écritures K/V et commentaire acceptent --file - pour stdin. Utilisez playlist show ID --editable --human pour le document éditable sur stdout. Les noms d'affichage d'application et de liste de lecture peuvent se répéter ; utilisez les ID de ressource pour les mises à jour.

Remplacer une version d’application

Après un app update réussi, prenez data.application.release_id et identifiez la liste de lecture, la page et le primitif d’application exacts à modifier. Prévisualisez le remplacement :

screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW

Ceci est un examen d’impact en lecture seule. Inspectez data.previous_release_id, data.release_id et data.affected_screens, y compris les assignations archivées. Appliquez directement avec --apply. Pour opter pour ce contrôle d’impact, fournissez aussi --expect-impact avec le data.impact de l’aperçu :

screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW --apply

Les autres primitives et paramètres sont conservés. La mise à jour affecte chaque écran assigné à cette liste de lecture partagée ; les écrans archivés conservent la nouvelle épingle pour usage ultérieur. Lorsqu’un --expect-impact est fourni, un remplacement modifié, une révision ou un impact d’écran observé nécessite un nouvel aperçu. L’application directe saute l’enquête d’écran ; affected_screens est omis. Une publication déjà épinglée réussit sans écriture. Les assignations peuvent changer après l’instantané : le serveur vérifie la révision de la liste de lecture de façon atomique uniquement lorsque --expect-rev est fourni. Le serveur valide la disponibilité et la propriété de la publication lors de l’application. Les épingles existantes restent inchangées jusqu’à l’application ; ensuite, vérifiez les révisions du manifeste et la lecture sur les écrans affectés. En cours d’examen, --apply propose la nouvelle épingle ; ajoutez --note TEXT pour le réviseur.

Les commandes playlist validate, create, update et screen publish acceptent - comme fichier d’entrée pour lire stdin. Les enveloppes JSON ne sont jamais écrites dans les fichiers créés. --expect-rev protège une révision. Omettez le drapeau pour écrire la ressource actuelle sans condition de révision. Une révision périmée fournie renvoie toujours revision_conflict.

La génération accepte soit --prompt TEXT soit --prompt-file FILE, y compris --prompt-file - pour stdin. Le fichier est l’invite complète, sans découpage; la limite existante de 4000 caractères s’applique. Les invites sont exclues des diagnostics.

Conserver le chemin court

Le CLI intégré utilise api.screenrig.ai ; les lecteurs utilisent play.screenrig.ai ; le tableau de bord se trouve à screenrig.ai/dashboard ; les versions utilisent des origines isolées sous apps.screenrig.ai. Les paquets natifs restent privés et médiés par serveur. La référence de transport interne reste disponible pour les outils de transport.

Filtres d’étiquettes et lots de lecture

Les médias portent jusqu’à 32 étiquettes uniques, chacune de 1 à 32 lettres ou chiffres. Remplacez l’ensemble complet par screenrig media update med_ID --tags Summer,Drinks. --tag Summer le remplace par une étiquette ; --clear-tag efface toutes les étiquettes. media list --tag Summer correspond à l’appartenance n’importe où dans l’ensemble. Les étiquettes sont sensibles à la casse et ne sont jamais une autorisation.

Un sélecteur dynamique peut utiliser un tag ou un objet filtre tags :

{
  "by": "tag",
  "tags": { "all": ["Summer", "Drinks"], "any": ["Lobby", "Patio"], "none": ["Expired"] },
  "order": "random",
  "one_at_a_time": false,
  "batch_size": 3
}

all exige toutes les étiquettes listées, any en exige au moins une, et none exclut toute étiquette listée. Les groupes présents se combinent avec ET ; les groupes omis n’imposent aucune condition. Fournissez au moins un groupe non vide. Chaque groupe accepte jusqu’à 32 étiquettes uniques. tag et tags sont mutuellement exclusifs. Un filtre uniquement none sélectionne tous les médias prêts de ce primitif sauf les étiquettes exclues. Les sélecteurs d’image sélectionnent des images et les sélecteurs vidéo sélectionnent des vidéos.

Le bassin de candidats contient jusqu’à 1 024 médias prêts par sélecteur, avec 1 024 références médias dans l’instantané complet de la boucle. Un appariement plus grand renvoie une erreur ; affinez les filtres. batch_size est une limite distincte de 1 à 1 024 éléments par visite de page. Sur une page media_end, one_at_a_time: false joue le lot suivant dans la séquence ; omettre batch_size joue le reste du passage. one_at_a_time: true joue un élément par apparition et permet seulement une taille de lot omise ou batch_size: 1. La durée, l’application et les pages audio_end nécessitent one_at_a_time: true. Les images sur media_end nécessitent aussi dwell_ms ; les vidéos ne peuvent pas boucler sur cette page.

Le lecteur résout chaque primitive média dynamique en une seule requête au démarrage de la liste de lecture et à chaque limite de boucle. L’appartenance est figée pendant la boucle. Les téléversements, suppressions, changements d’étiquetage et bornes de disponibilité ne régénèrent pas le manifeste. Au prochain rafraîchissement, les éléments supprimés ou nouvellement exclus quittent la file d’attente en attente ; les nouvelles correspondances rejoignent à la fin du passage actuel. Un lot final peut contenir moins que le nombre demandé ; il ne se remplit pas au passage suivant. L’ordre des noms de fichiers trie par nom, puis par ID média. L’ordre aléatoire mélange une fois par passage complet, en conservant l’ordre restant aux rafraîchissements de boucle. L’ordre pondéré suit ses poids, plus bas. Le curseur est local à l’écran, la liste de lecture, la page et la primitive, persiste au redémarrage, et se réinitialise quand le filtre, l’ordre ou la politique de lot change. La lecture hors ligne utilise le dernier instantané réussi. Les correspondances vides sautent la primitive et toute page vide résultante.

Enregistrez l’objet sélecteur ci-dessus sous selector.json, puis inspectez son catalogue de candidats actuel avant publication :

screenrig media selector-preview selector.json --primitive video

L’aperçu renvoie matched_count, ordonné par nom de fichier candidates avec les ID médias et les balises, ainsi que la politique selector normalisée. En ordre aléatoire, il affiche la piscine et la politique de mélange ; il ne choisit pas le mélange du lecteur, n’avance pas un curseur, ne crée pas de droit de lecture ni ne modifie un manifeste. En ordre pondéré, il renvoie pour chaque candidat weight et share_percent, ainsi que cycle. --rect WxH (API rect: {width, height}) est la taille de l’emplacement et est obligatoire avec fit: "aspect" ; les correspondances écartées sont listées dans excluded avec la raison aspect_mismatch. Les sélecteurs d’images passent --primitive image. L’API est POST /api/selectors/preview avec { "primitive": "video", "selector": ... }. Elle utilise le projet authentifié et les mêmes règles de correspondance que la lecture. Les modifications du catalogue après l’aperçu sont résolues à la prochaine limite de boucle de la lecture.

L’exportation de paquet statique fige les correspondances dynamiques en identifiants exacts. Elle préserve la lecture un à la fois ou en passage complet ; une séquence d’exécution bornée utilisant batch_size avec one_at_a_time: false nécessite de retirer ce champ ou de choisir des identifiants explicites avant l’exportation. Cela évite de perdre silencieusement un curseur de lot d’exécution dans un paquet statique.

Rotation pondérée et ajustement au format

order: "weighted" fait tourner les créations d’un emplacement selon leur poids, de sorte que chaque commanditaire conserve sa part de lectures. weights associe un ID média (med_...) ou tag:NAME à un entier de 1 à 1 000, avec au plus 64 clés. Il fonctionne avec by valant all, tag ou folder :

{
  "by": "all",
  "order": "weighted",
  "one_at_a_time": true,
  "weights": { "tag:Acme": 50, "tag:Globex": 30, "tag:Initech": 20 },
  "fit": "aspect"
}

Des poids de 50, 30 et 20 livrent exactement 5, 3 et 2 lectures sur 10, à chaque cycle, et un redémarrage reprend en milieu de cycle. Le poids d’un élément est sa clé d’ID média lorsqu’elle est présente ; sinon la première clé tag:NAME, par ordre alphabétique, parmi les balises qu’il porte, répartie également entre les éléments de la sélection qui la portent, de sorte que la part d’un commanditaire reste la même quel que soit son nombre de créations ; sinon l’élément forme son propre groupe avec un poids de 1. Un cycle compte au plus 4 096 lectures ; les parts sont arrondies à ce nombre seulement lorsque le ratio exact exige un cycle plus long.

L’ordre pondéré lit un élément par visite : définissez one_at_a_time: true ou batch_size: 1. weights est obligatoire avec l’ordre pondéré et n’est permis qu’avec lui ; sinon l’écriture renvoie invalid_request. Les lecteurs Web, Android, Apple, Windows et Linux prennent en charge l’ordre pondéré à partir des versions qui déclarent la capacité d’hôte selector.weighted. Un lecteur plus ancien lit le sélecteur en ordre aléatoire, et les diagnostics du manifeste portent selector_order_downgraded.

fit: "aspect" sur un sélecteur dynamique ne garde que les fichiers dont le rapport largeur/hauteur est à moins de 5 % de celui du rectangle de l’emplacement, mur vidéo ou cadre d’affichage compris, lu au moment où le sélecteur se résout. Un emplacement en portrait ne lit jamais un fichier en paysage. Aucun changement de lecteur n’est nécessaire.

screenrig media selector-preview affiche la part attendue de chaque sélecteur pondéré ou ajusté au format, et l’éditeur de pages du tableau de bord montre le même tableau dans l’inspecteur. L’exportation de paquet statique fige un sélecteur pondéré en identifiants exacts dans l’ordre des noms de fichiers ; les poids ne sont pas conservés.

Jetons d’écran dans les sélecteurs de balises

Le tag d’un sélecteur de balise, et chaque entrée de son filtre tags, peut être {screen.field.NAME} ou {screen.id}, l’identifiant de l’écran sans son préfixe scr_, qui est une balise. Le serveur renseigne le jeton pour chaque écran lorsqu’il construit le manifeste et l’instantané de sélecteur de cet écran : une seule liste de lecture lit donc les médias propres à chaque écran. Étiquetez les médias Lobby ou Garage, définissez le champ de chaque écran avec screenrig screen update scr_ID --field zone=Lobby, puis donnez ce sélecteur à l’emplacement :

{ "by": "tag", "tag": "{screen.field.zone}", "one_at_a_time": true }

La valeur renseignée suit les règles des balises : 1 à 32 lettres ou chiffres. Un écran sans le champ, ou dont la valeur n’est pas une balise, ne sélectionne rien : il ne lit aucun fichier de cet emplacement, et les diagnostics du manifeste portent screen_fact_missing ou screen_fact_invalid. Modifier un champ régénère le manifeste de cet écran. Un sélecteur avec jeton ne peut pas être prévisualisé (media selector-preview attend une balise concrète) ni figé par playlist export.

Jetons d’écran dans les adresses d’iframe et les params d’application

Le src et le fallback_src d’un iframe peuvent porter des jetons d’écran dans le chemin, la requête ou le fragment d’une adresse http ou https, tout comme le params facultatif d’une primitive application : jusqu’à 16 noms de 1 à 32 lettres minuscules, chiffres ou traits de soulignement (ticket et policy sont réservés) avec des valeurs d’au plus 512 caractères. Le serveur les remplit pour chaque écran :

JetonValeur
{screen.id}L’identifiant de l’écran sans son préfixe scr_.
{screen.name}Le nom de l’écran.
{screen.timezone}Le fuseau horaire IANA enregistré de l’écran.
{screen.field.NAME}Le champ NAME de l’écran, de 1 à 32 lettres minuscules, chiffres ou traits de soulignement.
{screen.location.lat}, {screen.location.lon}Son emplacement en degrés décimaux.
{screen.location.name}, {screen.location.address}Son nom de lieu et son adresse civique.
{
  "primitive": "iframe",
  "src": "https://maps.example.com/directory?kiosk={screen.field.kiosk_id}&level={screen.field.level}",
  "title": "Directory"
}

L’écriture stocke le modèle tel qu’écrit, accolades comprises. Le manifeste de chaque écran porte sa propre adresse, chaque valeur encodée en pourcentage pour son emplacement dans l’URL : un kiosk_id de B 2&3 devient B%202%263. Un jeton dans le schéma, les identifiants, l’hôte ou le port, ou dans un lien YouTube, un lien de document Google ou Microsoft ou une adresse de vue BI, est invalid_request à src (ou fallback_src). La publication omet la vérification d’encadrement pour un src modélisé, et les aperçus affichent le modèle tel qu’écrit.

Un écran auquel il manque une valeur (un champ non défini, aucun emplacement), ou dont les valeurs forment une adresse de plus de 2048 caractères ou comportant un segment de chemin . ou .., ne reçoit pas cet iframe ou cette application, et les diagnostics de son manifeste portent screen_fact_missing ou screen_fact_invalid ; une page laissée vide est retirée. Chaque écriture qui atteint un tel écran (une écriture de liste de lecture, screen assign, screen update, une assignation de flotte, une revue approuvée) répond avec un avertissement screen_fact_missing qui nomme les jetons, les 20 premiers identifiants d’écran et leur nombre. Modifier un champ ou l’emplacement régénère le manifeste des écrans touchés.

Pour une application, chaque param rempli est ajouté à l’adresse de lancement après ticket, encodé en pourcentage, au plus 4096 caractères au total, de sorte que l’application le lit depuis location.search (SDK). Les params de lancement parviennent à l’application Web du Player et aux Players qui l’exécutent (Samsung Tizen, BrightSign, LG webOS et Vega) ; les Players Qt, Android, Apple et Windows chargent l’application depuis leur paquet local et n’en envoient aucun. Le champ url d’un modèle peut être un src d’iframe entier, et sa valeur peut elle-même porter des jetons d’écran, remplis à la construction du manifeste. Un sélecteur d’étiquettes utilise {screen.id} et {screen.field.NAME} de la même façon (ci-dessus). Les cartes gardent leurs propres jetons {screen.…}.

Disponibilité des médias

screenrig media availability med_ID --file rule.json définit quand les sélecteurs dynamiques (all, tag et folder) peuvent choisir un fichier. --clear supprime la règle et --expect-rev N protège la révision du média. L’API est PATCH /api/media/{id}/availability avec If-Match et { "availability": {...} | null }. Définir une règle exige l’accès Manage ; un identifiant Propose reçoit insufficient_access.

La règle reprend la grammaire horaire du calendrier, lue dans le fuseau horaire de chaque écran, et comporte au moins un membre : from et until (civil YYYY-MM-DDTHH:MM, until exclusif), windows (hebdomadaire {days, start, end}), monthly ({day} ou {nth, weekday}, chacun avec start et end facultatifs), dates ({date, start, end}) et except (dates qui retirent une occurrence, y compris les prolongements après minuit). Elle n’a ni data ni interaction. La création d’un commanditaire pour le long week-end, disponible uniquement les soirs de semaine dans cette période :

{
  "from": "2026-11-27T00:00",
  "until": "2026-11-30T23:59",
  "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "17:00", "end": "22:00" }]
}

Seuls les sélecteurs lisent la règle : un sélecteur explicite id ou ids l’ignore, tout comme les références média des cartes, l’audio de la bande-son et les créations publicitaires. Un fichier quitte la sélection et y revient à la prochaine boucle de liste de lecture de chaque écran, dans la minute environ qui suit la limite. Aucune révision de liste de lecture ni de manifeste ne change, et un lecteur hors ligne garde sa dernière sélection jusqu’à sa reconnexion. screenrig media selector-preview --timezone ZONE (UTC par défaut) liste dans excluded les fichiers hors de leur règle à cet instant, avec le motif outside_window.