Médias
Un objet média est une image fixe, un clip ou une piste audio MP3, stocké sous la forme d’exactement un rendu. Il n’y a pas de solution de repli par appareil : ce que stocke media upload 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 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<file> | chemin | oui | aucun | L’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 TYPE | string | non | le type de l’extension du fichier | Déclarer le type de média de la source pour un fichier dont l’extension ne le nomme pas. Un type qui contredit les octets du fichier est refusé (usage_error, sortie 2) avant toute conversion. |
--tag TAG | string | non | aucun | De 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 ID | string | non | racine de la bibliothèque | Un dossier de médias mfd_ existant, vérifié avant le début de tout travail. Le fichier y arrive lorsqu’il est prêt, rien ne bouge ensuite, et data.folder_id le signale. Cela fonctionne avec --no-wait. Un téléverseur doit nommer l’un de ses dossiers ; voir Téléverseurs. |
--no-wait | boolean | non | désactivé | Retourner dès que la validation est acceptée. L’objet n’est pas encore prêt ; terminez avec operations wait. |
--poll-ms MS | integer | non | 1000 | Intervalle entre les sondages d’opération en attente. |
--timeout MS | integer | non | 120000 | Date limite d’attente. Elle limite aussi chaque requête sous-jacente. |
--no-transcode | boolean | non | désactivé | Téléversez les octets source sans modification. ffmpeg, ffprobe et cwebp ne sont pas exécutés. Le fichier doit déjà être un PNG, JPEG, WebP, GIF, MP4, WebM ou MP3, et le WebP sans perte est toujours rejeté. Incompatible avec --codec, --max-fps, --max-edge, --webp-quality, --preset ou --no-audio. |
--codec | string | non | h264 | h264 ou hevc. Utilisez hevc seulement quand chaque écran qui jouera le clip est un Player natif. |
--max-fps N | number | non | 30 | Fré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 PIXELS | integer | non | 3840 | Limite appliquée à chaque bord, de 16 à 3840. Le rapport d’aspect est conservé et une source plus petite n’est jamais agrandie. |
--webp-quality | integer | non | 90 | Qualité de l’image fixe pour l’encodage WebP, de 1 à 100. |
--preset | string | non | non défini | signage-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-audio | boolean | non | désactivé | Omettre la piste audio de la livraison vidéo. Vidéo seulement ; ne peut pas être combiné avec --no-transcode. |
--no-progress | boolean | non | dé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 LobbyLoopLa vidéo devient un MP4 : profil High H.264 au niveau 4.2, 5.1 ou 5.2, le plus bas adapté à la taille et à la cadence, ou profil Main H.265 au niveau 5.1 ou 5.2 avec --codec hevc, en yuv420p balisé Rec. 709, d’au plus 3840 par 2160 pixels par image. 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 média prêt avec les mêmes octets, le même nom de fichier et la même étiquette est renvoyé au lieu d’être téléversé à nouveau (data.reused vaut true), de sorte que relancer un téléversement interrompu renvoie son ID de média. data.timing indique les millisecondes par étape : prepare_ms (conversion et empreinte), declare_ms, transfer_ms, commit_ms et processing_ms (jusqu’à l’état prêt, aussi fin que --poll-ms ; absent avec --no-wait).
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-audioscreenrig media upload ./menu.png --folder mfd_01EXAMPLEFOLDER000000000media upload-batch --folder place de la même façon chaque élément téléversé dans le dossier.
Une image ou une vidéo peut mesurer jusqu’à 16383 pixels en largeur ou en hauteur et 67 108 864 pixels (8192 par 8192) dans une image ; une image plus grande est refusée avec invalid_request. La conversion par défaut ajuste chaque côté à 3840 pixels, donc téléversez un master ultra-large comme 9216 par 2160 ou 12000 par 540 avec --no-transcode. Un téléversement vidéo peut atteindre au plus la plus grande vidéo autorisée par le plan du projet, que project capabilities rapporte sous le nom media_video_bytes (voir Tarification) ; une vidéo plus grande est refusée avant d’être lue, donc raccourcissez d’abord le clip. La CLI encode la vidéo à une qualité fixe, donc une longue vidéo peut encore dépasser la limite après l’encodage et est alors refusée ; avec --no-transcode, le fichier lui-même doit respecter la limite.
Un transfert vers le stockage interrompu est tenté jusqu’à 4 fois tant que son URL de téléversement est valide. S’il échoue encore, l’erreur nomme l’operation_id du téléversement et le téléversement est annulé pour ne retenir aucun stockage ; avec --idempotency-key, il est conservé pour la reprise. Relancez la même commande.
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.
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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<manifest.json> | chemin | oui | aucun | { "items": [ { "path": "./a.png", "tag"?: "Lobby", "content_type"?: "image/png" } ] } avec 1 à 1000 éléments. Les chemins sont relatifs au fichier manifeste. |
--state FILE | chemin | non | fichier privé à côté de la configuration | Un fichier JSON 0600 indexé par le SHA-256 des octets locaux de chaque fichier source ; par défaut, un fichier par projet, adresse d’API et manifeste. 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 N | integer | non | 4 | Téléversements parallèles, de 1 à 8. |
--no-transcode | boolean | non | désactivé | Téléversez les octets source sans modification, comme le fait media upload. Incompatible avec --codec, --max-fps, --max-edge, --webp-quality, --preset ou --no-audio. |
--poll-ms MS | integer | non | 1000 | Intervalle entre les sondages d’opération en attente. |
--timeout MS | integer | non | 120000 | Date limite d’attente. Elle limite aussi chaque requête sous-jacente. |
--codec | string | non | h264 | h264 ou hevc. Utilisez hevc seulement quand chaque écran qui jouera le clip est un Player natif. |
--max-fps N | number | non | 30 | Fré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 PIXELS | integer | non | 3840 | Limite appliquée à chaque bord, de 16 à 3840. Le rapport d’aspect est conservé et une source plus petite n’est jamais agrandie. |
--webp-quality | integer | non | 90 | Qualité de l’image fixe pour l’encodage WebP, de 1 à 100. |
--preset | string | non | non défini | signage-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-audio | boolean | non | désactivé | Omettre la piste audio de la livraison vidéo. Vidéo seulement ; ne peut pas être combiné avec --no-transcode. |
--tag TAG | string | non | aucun | Appliqué lorsqu’un élément omet sa propre étiquette. |
--folder ID | string | non | racine de la bibliothèque | Un dossier de médias mfd_ existant, vérifié avant le début de tout travail. Chaque élément y arrive lorsqu’il est prêt, et data.folder_id le signale. Un téléverseur doit nommer l’un de ses dossiers. |
--no-progress | boolean | non | désactivé | Ne produire aucune sortie de progression. |
screenrig media upload-batch ./images.json --state ./upload-state.jsonL’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, chacun avec son path et son problem ; data.accepted, data.resumed, data.attempts, data.rate_limited, data.wait_ms et data.transfer_ms comptabilisent l’exécution. Un élément est tenté jusqu’à 8 fois, avec une attente entre les essais, tant que la réponse est une limite de débit ou une erreur de serveur.
En cas d’échecs, le code de sortie suit le dernier élément en échec : 7 pour une limite de débit, 9 pour une erreur de serveur, 2 pour une erreur d’usage, sinon 8. Relancez la même commande avec le même manifeste pour ne téléverser que ce qui n’a 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
<file> | chemin | oui | aucun | La 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 REVISION | string | non | aucun | Pré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 TEXT | string | non | aucun | Conservée avec la nouvelle version et montrée à la personne qui la révise. 280 caractères au plus. |
--content-type TYPE | string | non | détecté à partir des octets téléversés | Déclarez vous-même le type de média au lieu de laisser le CLI le détecter. |
--no-wait | boolean | non | désactivé | Retourner dès que le remplacement est accepté. Le nouveau fichier n’est pas encore en service ; terminez avec operations wait. |
--poll-ms MS | integer | non | 1000 | Intervalle entre les sondages d’opération en attente. |
--timeout MS | integer | non | 120000 | Date limite d’attente. Elle limite aussi chaque requête sous-jacente. |
--no-transcode | boolean | non | désactivé | Téléversez les octets source sans modification. ffmpeg, ffprobe et cwebp ne sont pas exécutés. Le fichier doit déjà être un PNG, JPEG, WebP, GIF, MP4, WebM ou MP3, et le WebP sans perte est toujours rejeté. Incompatible avec --codec, --max-fps, --max-edge, --webp-quality, --preset ou --no-audio. |
--codec | string | non | h264 | h264 ou hevc. Utilisez hevc seulement quand chaque écran qui jouera le clip est un Player natif. |
--max-fps N | number | non | 30 | Fré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 PIXELS | integer | non | 3840 | Limite appliquée à chaque bord, de 16 à 3840. Le rapport d’aspect est conservé et une source plus petite n’est jamais agrandie. |
--webp-quality | integer | non | 90 | Qualité de l’image fixe pour l’encodage WebP, de 1 à 100. |
--preset | string | non | non défini | signage-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-audio | boolean | non | désactivé | Omettre la piste audio de la livraison vidéo. Vidéo seulement ; ne peut pas être combiné avec --no-transcode. |
--no-progress | boolean | non | dé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, de sorte que chaque liste de lecture et chaque programmation qui le nomment jouent le nouveau fichier au prochain manifeste, et que les sélecteurs par étiquette, dossier et all le reprennent aussi. Rien n’est reprogrammé. La commande exécute les mêmes étapes que media upload (conversion, la limite d’octets vidéo du forfait, les limites de dimensions, la limite de stockage du forfait, le 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
--limit N | integer | non | chaque page | Lire une page de ce nombre de versions, de 1 à 100. |
--cursor CURSOR | string | non | aucun | Lire la page qui suit le data.next_cursor de la page précédente. |
screenrig media versions med_01EXAMPLEIMAGE0000000000data.items contient une entrée par fichier qu’a eu le média : number, current, filename, source_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), restored_from et created_at. 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
--number N | integer | oui | aucun | Le numéro de la version à remettre en service, tel que media versions le liste. |
--expect-rev REVISION | string | non | aucun | Précondition de révision facultative. Une valeur périmée fournie est revision_conflict : lisez media show ID et relancez la commande. |
--note TEXT | string | non | aucun | Conservé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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
--number N | integer | oui | aucun | Le numéro de la version à supprimer, tel que media versions le liste. |
screenrig media version delete med_01EXAMPLEIMAGE0000000000 --number 2L’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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
screenrig media show med_01EXAMPLEIMAGE0000000000media download#
Écrivez une version stockée sur disque pour inspection. N’imprimez jamais les octets.
media download <id> [--output FILE]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
--output FILE | chemin | non | ./<id>.<ext> dans le répertoire courant | Un 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.webpLa réponse indique media_id, path, bytes, sha256, content_type, primitive, filename, source_filename facultatif et width / height. Elle ne contient jamais de pixels. Utilisez-la pour vérifier une image avant qu’elle passe à l’écran.
media list#
Lister les objets médias, filtrés optionnellement par étiquette, type primitif et dossier.
media list [--tag TAG] [--primitive image|video|audio] [--folder ID|root] [--library]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
--tag TAG | string | non | aucun | Correspondance ^[A-Za-z0-9]{1,32}$. Les objets non étiquetés sont omis chaque fois que ce filtre est présent. |
--primitive | string | non | tout | image, video ou audio. Restreindre la liste aux images fixes, clips ou pistes sonores. |
--folder ID|root | string | non | chaque dossier | Seuls 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. |
--library | boolean | non | dé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 --libraryChaque ligne comporte folder_id, qui est absent à la racine de la bibliothèque.
media selector-preview#
Prévisualiser quels fichiers prêts un sélecteur de médias dynamique retient maintenant, sans publier de liste de lecture ni faire avancer un Player.
media selector-preview <selector.json> --primitive image|video [--rect WxH] [--timezone IANA]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<selector.json> | chemin | oui | aucun | Un fichier JSON contenant un sélecteur de médias all, tag ou folder, ou - pour l’entrée standard. Une étiquette avec un jeton d’écran ne peut pas être prévisualisée. |
--primitive | string | oui | aucun | image ou video : le type de fichier que le sélecteur retient. |
--rect WxH | string | avec fit: "aspect" | aucun | La taille du rectangle du primitif, comme 1080x1920, les deux nombres étant supérieurs à 0. |
--timezone IANA | string | non | UTC | Le fuseau horaire dans lequel les règles de disponibilité des fichiers sont lues, comme America/New_York. |
screenrig media selector-preview selector.json --primitive video
screenrig media selector-preview selector.json --primitive image --timezone America/New_YorkLes clés du sélecteur (order, batch_size, one_at_a_time, weights et fit) sont décrites sous Filtres d’étiquettes et lots de lecture et Rotation pondérée et ajustement au format.
La réponse contient matched_count, les candidates classés par nom de fichier (media_id, filename, tags, width, height), le selector normalisé et, dans excluded, les fichiers écartés avec leur reason : aspect_mismatch pour fit: "aspect", et outside_window pour un fichier dont la règle de disponibilité ne tient pas maintenant. Avec order: "weighted", chaque candidat porte weight et share_percent, et cycle est le nombre de lectures après lequel chaque élément a joué exactement son poids. Plus de 1024 correspondances donne invalid_request. L’accès en lecture suffit. La prévisualisation lit le projet authentifié, ne fait jamais avancer un curseur ni ne modifie un manifeste, et un changement du catalogue après elle est pris en compte à la prochaine limite de boucle de chaque Player.
media update#
Remplacer ou effacer les étiquettes d’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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
--tag TAG | string | l’un des trois | aucun | L’étiquette de remplacement, de une à 32 lettres ou chiffres. Elle devient l’unique étiquette de l’objet. |
--tags TAG1,TAG2 | string | l’un des trois | aucun | L’ensemble d’étiquettes de remplacement : de 1 à 32 étiquettes uniques séparées par des virgules, chacune de une à 32 lettres ou chiffres. |
--clear-tag | boolean | l’un des trois | désactivé | Supprimer toutes les étiquettes et laisser l’objet non étiqueté. |
--expect-rev REVISION | string | non | aucun | Pré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
screenrig media update med_01EXAMPLEIMAGE0000000000 --tags Summer,DrinksAvec 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
--file FILE | chemin | l’un des deux | aucun | Une règle de disponibilité JSON, ou - pour l’entrée standard. |
--clear | boolean | l’un des deux | désactivé | Supprime la règle ; le fichier est toujours disponible. |
--expect-rev REVISION | string | non | révision actuelle | Précondition optionnelle de révision. Omise, la commande lit d’abord la révision actuelle du média. Une valeur périmée fournie est revision_conflict : relire, réappliquer, réessayer. |
screenrig media availability med_01EXAMPLEIMAGE0000000000 --file rule.jsonLes membres et le comportement de la règle figurent sous Disponibilité des médias. Un fichier en attente de révision par une personne est refusé avec media_pending_review : décidez d’abord de sa révision.
media delete#
Supprimer un objet média.
media delete <id> [--expect-rev REVISION]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant med_ de l’objet. |
--expect-rev REVISION | string | non | aucun | Pré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_01EXAMPLEIMAGE0000000000media 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id>... | string | oui | aucun | Un ou plusieurs ID de fichier med_ et ID de dossier mfd_, au maximum 1000 au total. |
--folder ID | string | l’un des deux | aucun | Le dossier de destination mfd_. |
--root | boolean | l’un des deux | désactivé | Déplacer à la racine de la bibliothèque. |
screenrig media move med_01EXAMPLEIMAGE0000000000 med_01EXAMPLEVIDEO0000000000 --folder mfd_01EXAMPLEFOLDER000000000
screenrig media move mfd_01EXAMPLEFOLDER000000000 --rootLe 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
--library | boolean | non | dé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 --libraryRetourne 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant de dossier mfd_. |
screenrig media folder show mfd_01EXAMPLEFOLDER000000000L’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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
--name NAME | string | oui | aucun | 1 à 100 caractères, sans espaces inutiles. Les noms peuvent se répéter. |
--parent ID | string | non | racine de la bibliothèque | Le dossier mfd_ dans lequel le créer. |
screenrig media folder create --name Menus
screenrig media folder create --name Lunch --parent mfd_01EXAMPLEFOLDER000000000Une 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant de dossier mfd_. |
--name NAME | string | au moins un de --name, --parent, --root | inchangé | Le nouveau nom, de 1 à 100 caractères. |
--parent ID | string | au moins un de --name, --parent, --root | inchangé | Déplacez le dossier, avec tout ce qu’il contient, dans ce dossier mfd_. Pas avec --root. |
--root | boolean | au moins un de --name, --parent, --root | désactivé | Déplacez le dossier à la racine de la bibliothèque. Pas avec --parent. |
--expect-rev REVISION | string | non | aucun | Pré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 --rootUn 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ètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant de dossier mfd_. |
--expect-rev REVISION | string | non | aucun | Pré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_01EXAMPLEFOLDER000000000Supprime 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.
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.
Un sélecteur folder, { "by": "folder", "folder_id": "mfd_…" }, lit les fichiers prêts situés directement dans un dossier média et aucun de ses sous-dossiers ; media folder list affiche les identifiants. Il accepte les mêmes order, one_at_a_time et batch_size que all et tag, et supprimer un dossier remonte ses fichiers d’un niveau et laisse le sélecteur vide.
L’ensemble de candidats contient jusqu’à 1 024 médias prêts par sélecteur, avec 1 024 références de médias dans l’instantané complet de la boucle. Une écriture compte chaque sélecteur all, tag ou folder pour 32 de ces références et un sélecteur ids pour sa longueur. Une correspondance plus grande renvoie une erreur ; restreignez 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 en séquence ; omettre batch_size joue le passage restant. one_at_a_time: true joue un élément par apparition et n’autorise qu’une taille de lot omise ou batch_size: 1. Sur les pages à durée, d’application et audio_end, chaque sélecteur all, tag, folder et ids à plusieurs ID exige one_at_a_time: true, et dwell_ms est refusé. Les images sur media_end exigent 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 et mélange une fois un sélecteur random. 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. La rotation pondérée est une fonctionnalité Plus : sans elle, une écriture qui fixe un poids qu’un élément n’a pas déjà reçoit feature_not_in_plan, tandis que la rotation égale, la conservation des poids enregistrés et leur retrait restent possibles. Tous les Players lisent l’ordre pondéré. Un Player qui ne déclare pas la capacité d’hôte selector.weighted reçoit random, 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 fichier d’un sélecteur pondéré et, avec fit: aspect, liste les fichiers qu’il laisse de côté ; 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. Un jeton peut figurer à côté de lettres et de chiffres dans un modèle de 128 caractères au plus. 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 :
| Jeton | Valeur |
|---|---|
{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 effectif de l’écran : sa substitution, sinon le fuseau que son Player rapporte, sinon UTC. |
{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, les params remplis, au plus 4096 caractères au total une fois encodés en pourcentage, lui parviennent dans context.params sur chaque Player (SDK). L’application Web du Player et les Players qui l’exécutent (Samsung Tizen, BrightSign, LG webOS et Vega) ajoutent aussi chacun d’eux à l’adresse de lancement après ticket, encodé en pourcentage, de sorte que l’application peut lire location.search. 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.…}.
Les primitives d’application d’une même liste de lecture qui épinglent la même version portent les mêmes params.
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. Sans --expect-rev, la commande lit d’abord la révision actuelle du média. Un fichier en attente de révision par une personne est refusé avec media_pending_review.
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), avec au plus 16 windows, 16 entrées monthly, 100 dates et 100 dates except. 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. media selector-preview avec --timezone ZONE (UTC par défaut) lit les règles dans ce fuseau et liste dans excluded les fichiers hors de leur règle à cet instant, avec le motif outside_window.