Liens de flotte
Un lien de flotte est une URL Player que vous mettez dans un gestionnaire d’appareils, comme une application kiosque dans la console Google Admin. Chaque appareil qui l’ouvre devient son propre écran dans ce projet, sans code de jumelage. Une organisation peut avoir au maximum 50 liens de flotte, tous projets confondus.
Chaque nouvel écran reçoit les étiquettes, les champs et la liste de lecture du lien, ainsi qu’une étiquette provenant de l’appareil : son identifiant d’actif administrateur, puis son emplacement, sinon la prochaine étiquette par défaut. Un appareil conserve son écran unique lors des rechargements et des relances. Après une réinitialisation complète ou une réinstallation, un appareil qui signale le numéro de série ou le DUID d’un écran créé par un lien de flotte de ce projet récupère cet écran au lieu d’en créer un autre, une fois que son ancienne clé est silencieuse depuis dix minutes. screen show retourne fleet_link_id pour un écran créé par un lien de flotte, et --human affiche Created by fleet link: flk_…. L’identifiant demeure après la suppression du lien.
Un lien peut prendre fin à l’heure que vous choisissez : --expires-at l’empêche de créer et de récupérer des écrans à partir de ce moment, comme le fait un lien désactivé, et un appareil qui l’ouvre affiche son code de jumelage. Les écrans qu’il a créés continuent de jouer. fleet-links show --android-provisioning affiche la charge qui configure un appareil Android réinitialisé comme propriétaire de l’appareil ; voir Propriétaire de l’appareil Android par code QR.
L’URL, https://play.screenrig.ai/player/#fleet=srfl_…, est un identifiant qui crée des écrans. Ne la donnez qu’au gestionnaire d’appareils. Le secret voyage dans le fragment d’URL, que les navigateurs n’envoient jamais au serveur. Un identifiant en lecture seule reçoit data.url vide avec url_redacted: true, et la sortie humaine dit alors URL: withheld from a Read only credential. Sinon, la sortie humaine affiche l’URL sous une étiquette Sensitive fleet link URL, et fleet-links list --human ne l’affiche jamais. Le CLI vérifie une URL retournée avant de l’afficher : HTTPS, le chemin /player/ et le secret uniquement dans #fleet=. Il retient une URL qui échoue à la vérification, avec l’avertissement fleet_link_url_withheld, et il exclut les réponses de lien de flotte de son journal d’opération.
| Code de problème | Sortie | Sens |
|---|---|---|
fleet_link_limit_reached | 5 | L’organisation a déjà 50 liens de flotte. Rien n’a été créé. Supprimez-en un d’abord. |
invalid_request | 8 | Un champ a été refusé, tel qu’un --playlist-id qui ne nomme aucune playlist dans ce projet. error.next est playlist list pour une playlist inconnue. |
not_found | 4 | Aucun lien de flotte n’a cet ID dans le projet. |
revision_conflict | 6 | La révision --expect-rev était périmée. Exécutez fleet-links show, puis réessayez. |
fleet_link_secret_unavailable | 3 | fleet-links show --android-provisioning n’a reçu aucune URL utilisable, comme pour un identifiant en lecture seule. Une connexion Manage la reçoit. |
fleet-links create#
Créer un lien de flotte et recevoir son URL de Player.
fleet-links create --name NAME [--tag TAG]... [--field NAME=VALUE]... [--playlist-id ID] [--max-screens N]
[--expires-at TIME] [--disabled]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
--name NAME | string | oui | aucun | Le nom du lien, de 1 à 80 caractères sans caractères de contrôle. |
--tag TAG | string | non | pas d’étiquettes | Une étiquette pour chaque nouvel écran, de 1 à 32 lettres ou chiffres. Répétez-la, ou listez les étiquettes séparées par des virgules ; au plus 16. |
--field NAME=VALUE | string | non | aucun champ | Un champ pour chaque nouvel écran, que les cartes lisent sous la forme {screen.field.NAME}. NAME comporte de 1 à 32 lettres minuscules, chiffres ou traits de soulignement, et VALUE de 1 à 200 caractères. Répétez-le ; 32 au plus. |
--playlist-id ID | string | non | aucun | La playlist pl_ assignée à chaque nouvel écran. |
--max-screens N | integer | non | pas de plafond | Le nombre maximal d’écrans que le lien crée, de 1 à 10 000. |
--expires-at TIME | string | non | jamais | Quand le lien cesse de créer et de récupérer des écrans : une heure RFC 3339 avec secondes et fuseau, comme 2026-12-31T23:59:59Z. Une heure déjà passée fait expirer le lien aussitôt. |
--disabled | boolean | non | désactivé | Créer désactivé. Aucun écran n’est créé avant fleet-links update --enable. |
screenrig fleet-links create --name "Lobby displays" --tag Lobby --tag Floor2 --playlist-id pl_01EXAMPLEPLAYLIST000000screenrig fleet-links create --name "Trade show" --field booth=A12 --expires-at 2026-12-31T23:59:59ZL’enveloppe est le lien de flotte avec son URL Player dans data.url. Mettez cette URL dans le gestionnaire d’appareils. 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 lien au lieu d’en créer un autre.
fleet-links list#
Lister les liens de flotte de ce projet, les plus anciens d’abord.
fleet-links listscreenrig fleet-links listUn identifiant en lecture seule reçoit chaque data.items[].url vide avec url_redacted: true. --human imprime ID, LABEL, ENABLED, SCREENS, TAGS et LAST_USED, ajoute EXPIRES tant qu’un lien listé a une expiration et marque (expired) celui qui l’a dépassée, et n’imprime jamais l’URL. SCREENS est le nombre d’écrans créés par le lien, ou créé/max avec --max-screens ; les récupérations ne sont pas comptées.
fleet-links show#
Inspecter un lien de flotte et recevoir son URL de lecteur.
fleet-links show <id> [--android-provisioning]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant de lien de flotte flk_. |
--android-provisioning | boolean | non | désactivé | Affiche le JSON d’approvisionnement propriétaire d’appareil Android de ce lien à la place de ses détails, à encoder en code QR pour un appareil réinitialisé. Il contient le secret du lien, donc il exige une connexion Manage. |
screenrig fleet-links show flk_01EXAMPLELINK0000screenrig fleet-links show flk_01EXAMPLELINK0000 --android-provisioningscreens_created compte les écrans créés par le lien, et last_used_at est la dernière fois qu’il en a créé ou récupéré un. expires_at est présent quand le lien a une expiration, et la sortie lisible le marque (expired) une fois celle-ci passée.
Avec --android-provisioning, data.id et data.provisioning remplacent les détails du lien. Le JSON contient le secret du lien : ne montrez son code QR qu’à la personne présente à l’appareil. Un identifiant en lecture seule ne reçoit aucune URL à partir de laquelle le construire et obtient fleet_link_secret_unavailable (sortie 3). Propriétaire de l’appareil Android par code QR liste la charge.
fleet-links update#
Modifier ce que donne un lien de flotte aux écrans qu’il crée désormais.
fleet-links update <id> [--name NAME] [--enable | --disable] [--tag TAG]... [--clear-tags]
[--field NAME=VALUE]... [--clear-fields]
[--playlist-id ID | --clear-playlist] [--max-screens N | --clear-max-screens]
[--expires-at TIME | --clear-expires-at] [--expect-rev REVISION]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant de lien de flotte flk_. |
--name NAME | string | au moins un changement | inchangé | 1 à 80 caractères. |
--enable | boolean | au moins un changement | désactivé | Le lien crée et récupère à nouveau des écrans. |
--disable | boolean | au moins un changement | désactivé | Le lien ne crée ni ne récupère d’écrans ; un appareil qui l’ouvre montre son code de jumelage à la place. |
--tag TAG | string | au moins un changement | inchangé | Remplace tout l’ensemble de balises. Répétez-le, ou listez les balises séparées par des virgules ; au plus 16. |
--clear-tags | boolean | au moins un changement | désactivé | Les nouveaux écrans n’ont pas d’étiquettes. |
--field NAME=VALUE | string | au moins un changement | inchangé | Remplace tout l’ensemble de champs, comme dans fleet-links create. Répétez-le ; 32 au plus. |
--clear-fields | boolean | au moins un changement | désactivé | Les nouveaux écrans n’ont pas de champs. |
--playlist-id ID | string | au moins un changement | inchangé | La playlist pl_ pour les nouveaux écrans. |
--clear-playlist | boolean | au moins un changement | désactivé | Les nouveaux écrans n’ont pas de liste de lecture. |
--max-screens N | integer | au moins un changement | inchangé | Le nombre maximal d’écrans que le lien crée au total, de 1 à 10 000. |
--clear-max-screens | boolean | au moins un changement | désactivé | Supprimer le plafond. |
--expires-at TIME | string | au moins un changement | inchangé | Définit ou déplace l’expiration : une heure RFC 3339 avec secondes et fuseau. Une heure déjà passée fait expirer le lien aussitôt. |
--clear-expires-at | boolean | au moins un changement | désactivé | Supprime l’expiration ; le lien n’expire jamais. |
--expect-rev REVISION | string | non | aucun | Précondition optionnelle de révision. |
screenrig fleet-links update flk_01EXAMPLELINK0000 --playlist-id pl_01EXAMPLEPLAYLIST000000update modifie uniquement les champs que vous passez, et seulement pour les écrans que le lien crée à partir de maintenant. Les écrans déjà créés conservent leurs balises, liste de lecture et étiquette. Un lien expiré se comporte comme un lien désactivé tant que son expiration n’est pas déplacée ou supprimée. L’URL reste inchangée ; utilisez rotate pour la remplacer.
fleet-links rotate#
Remplacer l’URL d’un lien de flotte et recevoir la nouvelle.
fleet-links rotate <id> [--expect-rev REVISION]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant de lien de flotte flk_. |
--expect-rev REVISION | string | non | aucun | Précondition optionnelle de révision. |
screenrig fleet-links rotate flk_01EXAMPLELINK0000L’enveloppe transporte la nouvelle URL dans data.url. L’ancienne URL cesse de fonctionner immédiatement : un appareil qui l’ouvre affiche son code de jumelage. Les écrans ayant déjà créé le lien continuent la lecture, car un Player jumelé ne présente jamais à nouveau le lien. Mettez la nouvelle URL dans le gestionnaire d’appareils. Après une rotation interrompue ou ambiguë, relancez la même commande : elle réutilise la clé d’idempotence enregistrée, et le serveur renvoie la rotation déjà effectuée au lieu d’en refaire une.
fleet-links delete#
Supprimer un lien de flotte. Son URL cesse de fonctionner immédiatement, et les écrans qu’il a créés restent.
fleet-links delete <id> [--expect-rev REVISION]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<id> | string | oui | aucun | L’identifiant de lien de flotte flk_. |
--expect-rev REVISION | string | non | aucun | Précondition optionnelle de révision. |
screenrig fleet-links delete flk_01EXAMPLELINK0000Les écrans dont le lien a été créé conservent leurs listes de lecture et leurs étiquettes.
Migrate
migrate déplace dans le projet les médias, listes de lecture, dispositions, horaires et écrans de votre ancienne plateforme d’affichage. L’exécution a lieu dans le CLI sur votre machine : la clé de la plateforme est lue dans un --credentials FILE composé de lignes NAME=VALUE, n’est envoyée qu’à cette plateforme, et n’est jamais stockée, affichée, journalisée ni envoyée à screenRIG, qui voit des écritures ordinaires de médias, de listes de lecture, de liens de flotte, de campagnes et d’écrans. migrate vendors liste les plateformes lues, et le repli files lit un dossier ou un .zip de médias provenant de n’importe quelle autre plateforme.
Exécutez les étapes dans l’ordre : migrate vendors (ce qu’une plateforme accepte), migrate scan (lire le compte et indiquer ce qui peut et ne peut pas être transféré ; aucune connexion à screenRIG n’est requise), migrate apply --dry-run (le plan), migrate apply (exige l’accès Manage), puis migrate pair pour chaque afficheur.
--dir DIR est le répertoire de migration, ./screenrig-migration-VENDOR par défaut, créé avec le mode 0700. Il contient scan.json (le scan et son rapport), map.json (l’objet qu’est devenu chaque ancien élément, lié à cette URL d’API, à ce projet, à ce fournisseur et à ce compte source) et staging/ (téléchargements en cours). apply et pair utilisent l’unique répertoire screenrig-migration-* du répertoire de travail, ou acceptent --dir ; une seule de ces commandes s’exécute à la fois dans un répertoire.
| Code de problème | Sortie | Sens |
|---|---|---|
migration_dir_mismatch | 2 | Le répertoire a été créé pour un autre projet, une autre URL d’API, un autre fournisseur ou un autre compte source. Utilisez un autre --dir. |
vendor_refused | 3 | La plateforme a refusé la clé. Créez une clé en lecture seule (migrate vendors VENDOR montre comment), corrigez le fichier --credentials et exécutez de nouveau la même commande. |
vendor_not_found | 4 | La plateforme a répondu 404. --url est généralement erroné. |
vendor_rate_limited | 7 | La plateforme limite le débit de la clé. Exécutez de nouveau la commande plus tard. |
vendor_file_gone | 8 | L’adresse d’un fichier de médias a expiré ou est protégée. Exécuter migrate scan à nouveau l’actualise, et --files fournit un fichier qui échoue encore. |
vendor_file_stalled | 8 | Un téléchargement de médias est devenu silencieux. Exécutez apply à nouveau. |
vendor_bad_response | 9 | La plateforme a envoyé une réponse que le CLI ne peut pas utiliser. |
vendor_unavailable | 9 ou 10 | La plateforme n’a pas pu être jointe ou a continué d’échouer. |
migrate vendors#
Lister les plateformes que lit migrate, ce que chacune accepte et comment créer sa clé en lecture seule.
migrate vendors [VENDOR]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
VENDOR | string | non | chaque plateforme | L’identifiant d’une plateforme. Un identifiant absent de la liste donne usage_error (sortie 2), qui nomme les identifiants existants. |
screenrig migrate vendors
screenrig migrate vendors filesFonctionne hors ligne et n’exige aucune connexion. data.vendors contient, pour chaque plateforme, son id et son name ; inputs, avec les flags qu’elle accepte (chacun avec flag et required, et values pour une région) et les lignes credentials que contient son fichier de clé (name, secret, required et help) ; connect, les étapes pour créer une clé en lecture seule ; maps, ce qui est transféré ; skips, ce qui ne l’est pas ; docs ; et example, une commande migrate scan fonctionnelle. Les plateformes sont triées par identifiant, avec files en dernier. files accepte un dossier ou .zip et un fuseau horaire facultatif, et n’exige aucune clé.
migrate scan#
Lire un compte d’affichage et indiquer ce qui peut et ne peut pas être transféré. Écrit scan.json et n’envoie rien à screenRIG.
migrate scan --from VENDOR [--url ADDRESS] [--region REGION] [--timezone ZONE] [--files PATH]
[--credentials FILE] [--dir DIR]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
--from VENDOR | string | oui | aucun | La plateforme à lire : un identifiant de migrate vendors, ou files. |
--url ADDRESS | string | par plateforme | aucun | L’adresse d’une plateforme auto-hébergée. |
--region REGION | string | par plateforme | aucun | La région d’un compte hébergé, pour une plateforme qui a des régions. |
--timezone ZONE | string | non | aucun | Un nom de fuseau horaire IANA comme America/Toronto, à définir sur chaque écran dont l’ancienne plateforme n’en nomme aucun. Sans lui, un écran suit le fuseau que son Player rapporte. |
--files PATH | chemin | par plateforme | aucun | Un dossier ou .zip. Avec --from files, il contient les médias ; avec une autre plateforme, il contient les originaux que l’API de cette plateforme ne peut pas fournir, associés à ses médias par nom de fichier. |
--credentials FILE | chemin | par plateforme | aucun | Le fichier de clé : lignes NAME=VALUE avec les noms que liste migrate vendors VENDOR. Les lignes vides et les commentaires # sont ignorés, et une valeur peut être placée entre une paire de guillemets. Un nom obligatoire absent du fichier donne usage_error (sortie 2), qui le nomme. |
--dir DIR | chemin | non | ./screenrig-migration-VENDOR | Le répertoire de migration. |
screenrig migrate scan --from files --files ./signage-media
screenrig migrate scan --from files --files ./signage-media.zip --dir ./old-signage --timezone America/TorontoUn flag que la plateforme n’accepte pas, ou qu’elle exige et qui manque, donne usage_error (sortie 2), qui nomme ce que la plateforme accepte. Aucun flag ne reçoit la clé elle-même. Un nouveau scan remplace scan.json et conserve map.json, et se termine avec 0 quand il est terminé, même si certains éléments ne peuvent pas être transférés.
data est le rapport : vendor, label, scanned_at, found et importable (comptes de media, playlists, layouts, schedules, groups et screens), not_imported (chacun avec kind, source_id, name, un reason et généralement une étape next), lossy (chacun avec kind, source_id, name et le change qui se produit en chemin), notes, dir et scan_file. Un fichier que la plateforme fournit se télécharge lors de apply. Un fichier qu’elle ne fournit pas, ou qu’elle ne fournit que sous forme de copie réencodée, est associé par nom dans --files ; sans correspondance, ou avec plusieurs, il figure dans not_imported ou lossy avec l’étape qui le règle.
--from files n’exige aucune clé et lit chaque fichier image, vidéo et audio d’après son contenu, et non son extension. Un playlists.csv facultatif à la racine a les colonnes playlist, file (un chemin ou un nom de fichier unique), duration (secondes) et order ; sans lui, chaque dossier qui contient des médias devient une liste de lecture dans l’ordre naturel des noms de fichiers, et les fichiers à la racine en forment une nommée d’après le dossier ou le zip. Un screens.csv facultatif a name, group (plusieurs séparés par ;), playlist et timezone, et chaque ligne devient un écran en attente avec ses groupes comme étiquettes. Les autres fichiers et les entrées zip chiffrées figurent dans not_imported. Un scan files n’a aucun horaire : créez-les avec campaign create une fois les listes de lecture créées.
migrate apply#
Importer ce que le scan a trouvé : médias, listes de lecture et dispositions, écrans en attente et campagnes. Sans risque à relancer.
migrate apply [--dir DIR] [--dry-run] [--only KINDS] [--folder ID] [--canvas WIDTHxHEIGHT]
[--credentials FILE] [--concurrency N] [--no-transcode]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
--dir DIR | chemin | non | l’unique répertoire ./screenrig-migration-* | Le répertoire de migration qui contient scan.json. |
--dry-run | boolean | non | désactivé | Lire le projet et afficher le plan. N’écrit rien et n’exige aucune clé. |
--only KINDS | string | non | les quatre | Séparés par des virgules, chacun au plus une fois : media, playlists, screens, schedules. |
--folder ID | string | non | un nouveau dossier nommé Imported from et le nom de la plateforme | Un dossier de médias existant (mfd_…) pour les médias importés. |
--canvas WIDTHxHEIGHT | string | non | 1920x1080 | La toile des listes de lecture ordinaires, chaque côté d’au moins 16 pixels. Une disposition garde sa propre taille. |
--credentials FILE | chemin | non | aucun | Le fichier de clé, lu seulement quand un fichier de médias est téléchargé depuis la plateforme. |
--concurrency N | integer | non | 4 | Nombre de médias importés simultanément, de 1 à 8. |
--no-transcode | boolean | non | désactivé | Téléversez les octets source sans modification, comme le fait media upload. |
screenrig migrate apply --dry-run
screenrig migrate apply --dir ./screenrig-migration-files
screenrig migrate apply --only media,playlists --concurrency 2apply importe dans l’ordre : les médias dans un seul dossier, les listes de lecture et les dispositions, un écran en attente par ancien écran, et une campagne par horaire que les campagnes peuvent exprimer. La plateforme n’est relue que pour télécharger les fichiers de médias. Une liste de lecture a une page par élément : les images et les vidéos remplissent la toile, une adresse web devient une page iframe, l’audio devient la bande sonore et une liste de lecture imbriquée est intégrée. Une disposition devient une liste de lecture sur sa propre toile, avec une page par élément de sa zone principale. Un horaire qui se répète par mois, par année, par heure ou par minute, ou un jour de semaine numéroté du mois, ne peut pas devenir une campagne : scan le liste dans not_imported.
--dry-run ne lit que le projet et répond data.plan (pour media, playlists, layouts, screens et schedules : les comptes create, reuse, recreate, waiting et fail), data.items, data.bytes à télécharger, les comptes data.placeholders et data.project, les liens de flotte et les campagnes utilisés par rapport à leurs maximums de 50 et 100. La progression va vers stderr sous forme de lignes JSON (migrate_progress avec phase, done et total), ou sous forme de texte avec --human. Une réexécution réutilise ce qui existe encore, refait tout ce que vous avez supprimé et ne modifie jamais ce qu’elle a créé. Une exécution réelle répond data.applied (les mêmes comptes), data.waiting (éléments qui attendent un média ou une liste de lecture non importée, chacun avec un reason), data.failed, data.placeholders (une entrée par ancien écran avec ses source_id, name et state : linked, unlinked, paired, finished ou waiting), data.tags et data.folder_id.
Un groupe devient une étiquette composée de lettres et de chiffres, numérotée lorsqu’elle entre en collision avec une étiquette qu’un autre écran porte. Une campagne cible les étiquettes des groupes et des écrans que nomme son horaire, avec ses dates, jours, heures et sa priorité. Une campagne lit ses dates et ses heures dans le fuseau horaire propre à chaque écran et exige une liste de lecture par défaut (no_default_playlist) : scan signale les écrans qui en sont dépourvus, et screen assign la définit après le jumelage.
Un écran en attente est un lien de flotte d’un seul écran qui porte l’ancien nom, les groupes comme étiquettes et la liste de lecture. Une organisation compte au plus 50 liens de flotte dans l’ensemble de ses projets ; les autres sont unlinked dans data.placeholders et attendent un code de Player (migrate pair). Un Player qui ouvre un lien devient un écran, et exécuter apply à nouveau lui donne l’ancien nom et le fuseau horaire et supprime le lien. apply n’affiche jamais l’URL d’un lien de flotte : fleet-links show le fait.
Un élément en échec conserve ok true avec data.failed (chacun avec key, name, code, status et detail) et l’avertissement migration_items_failed ; les éléments qui en dépendent attendent, et le code de sortie suit le statut du dernier échec. Un fichier de médias qui échoue seul (une adresse expirée, une réponse qui n’est pas un fichier, un téléchargement qui devient silencieux) n’échoue que pour ce média ; pour une adresse expirée, exécutez migrate scan à nouveau. Un refus qui se répéterait pour chaque élément (quota_exceeded, campaign_limit_reached, insufficient_access, pending_review, la plateforme qui refuse la clé, une connexion perdue) met fin à l’exécution avec data.stopped (code, detail et next) et le code de sortie de ce problème. Corrigez la cause et exécutez de nouveau la même commande : elle reprend là où elle s’est arrêtée.
migrate pair#
Jumeler un code de Player à un écran en attente, sous son ancien nom, avec sa liste de lecture, son fuseau horaire et ses étiquettes.
migrate pair <CODE...> --screen ID_OR_NAME [--dir DIR]| Paramètre | Type | Requis | Par défaut | Notes |
|---|---|---|---|---|
<CODE...> | string | oui | aucun | Le code qu’affiche le Player, comme ABC 234 : six caractères parmi 23456789ABCDEFGHJKMNPQRSTUVWXYZ, en majuscules ou en minuscules. Les espaces et les tirets entre eux sont ignorés, donc aucun guillemet n’est nécessaire. |
--screen ID_OR_NAME | string | oui | aucun | L’écran en attente : son identifiant source ou son ancien nom exact. Un nom que deux écrans partagent liste leurs identifiants. |
--dir DIR | chemin | non | l’unique répertoire ./screenrig-migration-* | Le répertoire de migration. |
screenrig migrate pair ABC 234 --screen "Front desk"
screenrig migrate pair ABC234 --screen 3 --dir ./old-signageExécutez d’abord migrate apply : le jumelage a besoin de la correspondance et de la liste de lecture créées par cette commande. pair réclame le code pour l’écran sous son ancien nom, définit sa liste de lecture, son fuseau horaire et son champ migrated_from, définit ses étiquettes, supprime le lien de l’écran en attente et enregistre le résultat. data contient source_id, name, screen_id, steps (paired, updated, tagged, link deleted, recorded), next et, quand cette exécution a réclamé le code, public_url. Chaque étape est enregistrée au fur et à mesure, de sorte qu’une réexécution termine ce qu’un jumelage interrompu a laissé. Un écran déjà jumelé donne resource_conflict (sortie 5), qui le nomme. Le Player termine le jumelage la prochaine fois qu’il contacte le service ; screen show rapporte alors state active.