Quickstart in Python

Een Python-programma dat een token vernieuwt, je schermen oplijst en een playlist op een scherm zet. De blokken op deze pagina vormen samen één bestand.

1 Haal een token op

Open de CMS op Instellingen, Verbonden apps en klik op Genereer token. Een lid zonder beheerdersrechten ziet dit tabblad niet.

Kies daarna de organisatie, die bepaalt welke schermen het programma ziet, en klik op Toestaan. De volgende pagina toont de client ID en het refresh token, één keer. Kopieer ze allebei.

Zet in je terminal de client ID en het pad naar het tokenbestand, en schrijf het refresh token naar dat bestand. read -rs wacht zonder iets te tonen: plak het refresh token en druk op Enter, zo blijft het uit de shell-history:

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"

Installeer de ene dependency in een venv, want Homebrew-Python en Debian 12 of nieuwer weigeren een pip install daarbuiten:

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

Zet de blokken hieronder in volgorde in gibeon.py en draai python3 gibeon.py.

2 Vernieuw het token

Een access token is 60 minuten geldig. Elke vernieuwing geeft ook een nieuw refresh token, dus een waarde in de omgeving is na één run verouderd.

Het programma schrijft het nieuwe token naar een tijdelijk bestand in dezelfde map, zet chmod 600 en hernoemt het over het bestand in GIBEON_REFRESH_TOKEN_FILE. Daarna pas gebruikt het programma het access token. Een proces dat daarbij stopt, houdt zo een werkend refresh token over.

Elke aanvraag controleert de status: bij een fout stopt raise_for_status het programma met een exitcode die niet nul is.

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 Lijst je schermen op

Dit geeft alle schermen in je tenant. Het programma print van elk scherm de id, name en status, en nooit een 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 Wijs een playlist toe en publiceer

Deze stap draait alleen als GIBEON_PLAYER_ID en GIBEON_PLAYLIST_ID gezet zijn. De id van het scherm staat in de lijst uit de vorige stap. De id van de playlist staat in de adresbalk van de CMS als je de playlist opent: /playlists/PLAYLIST_ID/content. Exporteer ze allebei en draai het programma opnieuw.

Een scherm met zones speelt die; anders zijn sequentie; anders zijn planning; anders zijn eigen playlist. De body maakt de sequentie en de planning leeg, dus de playlist speelt tenzij het scherm zones heeft.

De PATCH alleen verandert niets op het scherm: tot je publiceert, blijft het de oude toewijzing tonen. Publiceren bouwt een nieuwe snapshot en geeft het scherm meteen een seintje.

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"])

Wat nu