diff --git a/custom_components/bahmcloud_store/providers.py b/custom_components/bahmcloud_store/providers.py index ccb005f..0a5a5c3 100644 --- a/custom_components/bahmcloud_store/providers.py +++ b/custom_components/bahmcloud_store/providers.py @@ -16,6 +16,17 @@ _LOGGER = logging.getLogger(__name__) UA = "BahmcloudStore (Home Assistant)" +def _github_headers(github_token: str | None = None) -> dict[str, str]: + headers = { + "Accept": "application/vnd.github+json", + "User-Agent": UA, + } + token = (github_token or "").strip() + if token: + headers["Authorization"] = f"Bearer {token}" + return headers + + @dataclass class RepoInfo: owner: str | None = None @@ -189,9 +200,11 @@ async def _github_latest_version_redirect(hass: HomeAssistant, owner: str, repo: return None, None -async def _github_latest_version_api(hass: HomeAssistant, owner: str, repo: str) -> tuple[str | None, str | None]: +async def _github_latest_version_api( + hass: HomeAssistant, owner: str, repo: str, *, github_token: str | None = None +) -> tuple[str | None, str | None]: session = async_get_clientsession(hass) - headers = {"Accept": "application/vnd.github+json", "User-Agent": UA} + headers = _github_headers(github_token) data, status = await _safe_json(session, f"https://api.github.com/repos/{owner}/{repo}/releases/latest", headers=headers) if isinstance(data, dict) and data.get("tag_name"): @@ -217,12 +230,14 @@ async def _github_latest_version_api(hass: HomeAssistant, owner: str, repo: str) return None, None -async def _github_latest_version(hass: HomeAssistant, owner: str, repo: str) -> tuple[str | None, str | None]: +async def _github_latest_version( + hass: HomeAssistant, owner: str, repo: str, *, github_token: str | None = None +) -> tuple[str | None, str | None]: tag, src = await _github_latest_version_redirect(hass, owner, repo) if tag: return tag, src - tag, src = await _github_latest_version_api(hass, owner, repo) + tag, src = await _github_latest_version_api(hass, owner, repo, github_token=github_token) if tag: return tag, src @@ -316,7 +331,7 @@ async def _gitlab_latest_version( return None, None -async def fetch_repo_info(hass: HomeAssistant, repo_url: str) -> RepoInfo: +async def fetch_repo_info(hass: HomeAssistant, repo_url: str, *, github_token: str | None = None) -> RepoInfo: provider = detect_provider(repo_url) owner, repo = _split_owner_repo(repo_url) @@ -337,7 +352,7 @@ async def fetch_repo_info(hass: HomeAssistant, repo_url: str) -> RepoInfo: try: if provider == "github": - headers = {"Accept": "application/vnd.github+json", "User-Agent": UA} + headers = _github_headers(github_token) data, status = await _safe_json(session, f"https://api.github.com/repos/{owner}/{repo}", headers=headers) if isinstance(data, dict): @@ -356,7 +371,7 @@ async def fetch_repo_info(hass: HomeAssistant, repo_url: str) -> RepoInfo: if desc: info.description = desc - ver, src = await _github_latest_version(hass, owner, repo) + ver, src = await _github_latest_version(hass, owner, repo, github_token=github_token) info.latest_version = ver info.latest_version_source = src return info @@ -514,6 +529,7 @@ async def fetch_repo_versions( provider: str | None = None, default_branch: str | None = None, limit: int = 20, + github_token: str | None = None, ) -> list[dict[str, str]]: """List available versions/refs for a repository. @@ -560,7 +576,7 @@ async def fetch_repo_versions( try: if prov == "github": # Releases - gh_headers = {"Accept": "application/vnd.github+json", "User-Agent": UA} + gh_headers = _github_headers(github_token) data, _ = await _safe_json( session, f"https://api.github.com/repos/{owner}/{repo}/releases?per_page={int(limit)}",