Source code for gamesheet_sdk.admin.games.broadcasters
# Copyright (c) 2026 bdperkin
# SPDX-License-Identifier: MIT
"""Broadcaster operations for games."""
from __future__ import annotations
from typing import Any
from gamesheet_sdk.admin.games.models import Broadcaster
from gamesheet_sdk.common.constants import BFF_API_BASE_URL, BFF_BROADCASTERS
from gamesheet_sdk.common.exceptions import GameSheetError
from gamesheet_sdk.common.session import Session
from gamesheet_sdk.common.shared import check_bff_response_status, handle_response
[docs]
def list_broadcasters(session: Session) -> list[Broadcaster]:
"""Return the list of valid broadcasters.
Fetches the current list of broadcaster services from the BFF API. The returned broadcaster keys can be
used when creating or updating scheduled games.
:param session: An authenticated :class:`Session`.
:type session: Session
:returns: A list of :class:`Broadcaster` objects.
:rtype: list[Broadcaster]
:raises AuthenticationError: If the server returns 401 or 403.
:raises GameSheetError: For any other non-2xx response.
"""
url = f"{BFF_API_BASE_URL}{BFF_BROADCASTERS}"
response = session.get(url)
handle_response(response, url, "GET broadcasters")
body: dict[str, Any] = response.json()
check_bff_response_status(body, url)
broadcasters_data = body.get("data", [])
return [Broadcaster(**b) for b in broadcasters_data]
[docs]
def validate_broadcaster_key(session: Session, broadcaster: str) -> str:
"""Validate a broadcaster key and return the correctly-cased version.
Fetches the list of valid broadcasters and performs a case-insensitive match. Returns the broadcaster key
with the correct casing as stored in the API.
:param session: An authenticated :class:`Session`.
:type session: Session
:param broadcaster: The broadcaster key to validate (case-insensitive).
:type broadcaster: str
:returns: The correctly-cased broadcaster key.
:rtype: str
:raises GameSheetError: If the broadcaster key is not valid.
"""
if not broadcaster:
return broadcaster
broadcasters = list_broadcasters(session)
broadcaster_lower = broadcaster.lower()
for b in broadcasters:
if b.key.lower() == broadcaster_lower:
return b.key
valid_keys = [b.key for b in broadcasters]
joined_valid_keys = ", ".join(valid_keys)
msg = f"Invalid broadcaster '{broadcaster}'. Valid options (case-insensitive): {joined_valid_keys}"
raise GameSheetError(msg)