Démarrage rapide en Python

Un programme Python qui rafraîchit un token, liste vos écrans et place une playlist sur un écran. Les blocs de cette page forment un seul fichier.

1 Obtenez un token

Ouvrez le CMS dans Paramètres, Applications connectées et cliquez sur Générer un token. Un membre sans droits d’administrateur ne voit pas cet onglet.

Choisissez ensuite l’organisation, qui détermine les écrans que le programme voit, et cliquez sur Autoriser. La page suivante affiche l’identifiant client et le token de rafraîchissement, une seule fois. Copiez les deux.

Dans votre terminal, définissez l’identifiant client et le chemin du fichier de token, puis écrivez le token de rafraîchissement dans ce fichier. read -rs attend sans rien afficher : collez le token de rafraîchissement et appuyez sur Entrée, il reste ainsi hors de l’historique du shell :

export GIBEON_CLIENT_ID=CLIENT_ID
export GIBEON_REFRESH_TOKEN_FILE=./gibeon-refresh-token
touch "$GIBEON_REFRESH_TOKEN_FILE"
chmod 600 "$GIBEON_REFRESH_TOKEN_FILE"
read -rs GIBEON_REFRESH_TOKEN && printf '%s' "$GIBEON_REFRESH_TOKEN" > "$GIBEON_REFRESH_TOKEN_FILE"

Installez l’unique dépendance dans un venv, car le Python de Homebrew et Debian 12 ou plus récent refusent un pip install en dehors :

python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install requests

Placez les blocs ci-dessous dans l’ordre dans gibeon.py et lancez python3 gibeon.py.

2 Rafraîchissez le token

Un token d’accès est valable 60 minutes. Chaque rafraîchissement renvoie aussi un nouveau token de rafraîchissement : une valeur dans l’environnement est donc périmée après une exécution.

Le programme écrit le nouveau token dans un fichier temporaire du même répertoire, applique chmod 600 et le renomme par-dessus le fichier de GIBEON_REFRESH_TOKEN_FILE. Il n’utilise le token d’accès qu’ensuite. Un processus qui s’arrête pendant cette utilisation conserve ainsi un token de rafraîchissement valide.

Chaque requête vérifie le statut : en cas d’erreur, raise_for_status arrête le programme avec un code de sortie non nul.

import os
import tempfile

import requests

token_file = os.environ["GIBEON_REFRESH_TOKEN_FILE"]

with open(token_file) as f:
    refresh_token = f.read().strip()

response = requests.post(
    "https://id.gibeon.io/auth/v1/oauth/token",
    data={
        "grant_type": "refresh_token",
        "client_id": os.environ["GIBEON_CLIENT_ID"],
        "refresh_token": refresh_token,
    },
    timeout=30,
)
response.raise_for_status()
tokens = response.json()

# Store the new refresh token before anything uses the access token.
fd, tmp_path = tempfile.mkstemp(dir=os.path.dirname(token_file) or ".")
with os.fdopen(fd, "w") as f:
    f.write(tokens["refresh_token"])
os.chmod(tmp_path, 0o600)
os.replace(tmp_path, token_file)

headers = {"Authorization": f"Bearer {tokens['access_token']}"}

3 Listez vos écrans

Cet appel renvoie tous les écrans de votre tenant. Le programme affiche l’id, le name et le status de chaque écran, et jamais un token.

response = requests.get("https://www.gibeon.io/v1/players", headers=headers, timeout=30)
response.raise_for_status()

for player in response.json()["data"]:
    print(player["id"], player["name"], player["status"])

4 Assignez une playlist et publiez

Cette étape ne s’exécute que si GIBEON_PLAYER_ID et GIBEON_PLAYLIST_ID sont définis. L’id de l’écran figure dans la liste de l’étape précédente. L’id de la playlist figure dans la barre d’adresse du CMS quand vous ouvrez une playlist : /playlists/PLAYLIST_ID/content. Exportez les deux et relancez le programme.

Un écran avec des zones joue celles-ci ; sinon sa séquence ; sinon son planning ; sinon sa propre playlist. Le corps de la requête vide la séquence et le planning : la playlist joue donc, sauf si l’écran a des zones.

Le PATCH seul ne change rien à l’écran : tant que vous ne publiez pas, il continue d’afficher l’ancienne affectation. La publication construit un nouveau snapshot et prévient l’écran immédiatement.

player_id = os.environ.get("GIBEON_PLAYER_ID")
playlist_id = os.environ.get("GIBEON_PLAYLIST_ID")

if player_id and playlist_id:
    response = requests.patch(
        f"https://www.gibeon.io/v1/players/{player_id}",
        headers=headers,
        json={"playlist_id": playlist_id, "sequence_id": None, "planning_id": None},
        timeout=30,
    )
    response.raise_for_status()
    player = response.json()["data"]

    response = requests.post(
        f"https://www.gibeon.io/v1/players/{player_id}/publish",
        headers=headers,
        timeout=30,
    )
    response.raise_for_status()
    print(player["id"], player["name"], player["status"])

Et ensuite