From 3eefd447acb133f2cdc603b1cfe7610767bb797a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Bachmann?= Date: Thu, 15 Jan 2026 15:29:39 +0000 Subject: [PATCH] custom_components/bahmcloud_store/core.py aktualisiert --- custom_components/bahmcloud_store/core.py | 94 ++--------------------- 1 file changed, 7 insertions(+), 87 deletions(-) diff --git a/custom_components/bahmcloud_store/core.py b/custom_components/bahmcloud_store/core.py index e24290b..d0e18f4 100644 --- a/custom_components/bahmcloud_store/core.py +++ b/custom_components/bahmcloud_store/core.py @@ -15,7 +15,7 @@ from homeassistant.util import yaml as ha_yaml from .storage import BCSStorage, CustomRepo from .views import StaticAssetsView, BCSApiView, BCSReadmeView from .custom_repo_view import BCSCustomRepoView -from .providers import fetch_repo_info, detect_provider, RepoInfo +from .providers import fetch_repo_info, detect_provider, RepoInfo, fetch_readme_markdown from .metadata import fetch_repo_metadata, RepoMetadata _LOGGER = logging.getLogger(__name__) @@ -269,93 +269,13 @@ class BCSCore: return None async def fetch_readme_markdown(self, repo_id: str) -> str | None: - """Fetch README markdown from GitHub, Gitea or GitLab. - - Defensive behavior: - - tries multiple common filenames - - tries multiple branches (default, main, master) - - uses public raw endpoints (no tokens required for public repositories) - """ repo = self.get_repo(repo_id) if not repo: return None - repo_url = (repo.url or "").strip() - if not repo_url: - return None - - # Branch fallbacks - branch_candidates: list[str] = [] - if repo.default_branch and str(repo.default_branch).strip(): - branch_candidates.append(str(repo.default_branch).strip()) - for b in ("main", "master"): - if b not in branch_candidates: - branch_candidates.append(b) - - # Filename fallbacks - filenames = ["README.md", "readme.md", "README.MD", "README.rst", "README"] - - provider = (repo.provider or "").strip().lower() - if not provider: - provider = detect_provider(repo_url) or "" - - u = urlparse(repo_url.rstrip("/")) - host = (u.netloc or "").lower() - - candidates: list[str] = [] - - if self._is_github(repo_url): - owner, name = self._split_owner_repo(repo_url) - if not owner or not name: - return None - for branch in branch_candidates: - base = f"https://raw.githubusercontent.com/{owner}/{name}/{branch}" - candidates.extend([f"{base}/{fn}" for fn in filenames]) - - elif provider == "gitlab" or "gitlab" in host: - # GitLab can have nested groups: /group/subgroup/repo - parts = [p for p in u.path.strip("/").split("/") if p] - if len(parts) < 2: - return None - - repo_name = parts[-1].strip() - if repo_name.endswith(".git"): - repo_name = repo_name[:-4] - group_path = "/".join(parts[:-1]).strip("/") - if not group_path or not repo_name: - return None - - root = f"{u.scheme}://{u.netloc}/{group_path}/{repo_name}" - for branch in branch_candidates: - bases = [ - f"{root}/-/raw/{branch}", - # Some instances may expose /raw/ as well - f"{root}/raw/{branch}", - ] - for b in bases: - candidates.extend([f"{b}/{fn}" for fn in filenames]) - - elif self._is_gitea(repo_url): - owner, name = self._split_owner_repo(repo_url) - if not owner or not name: - return None - - root = f"{u.scheme}://{u.netloc}/{owner}/{name}" - - for branch in branch_candidates: - bases = [ - f"{root}/raw/branch/{branch}", - f"{root}/raw/{branch}", - ] - for b in bases: - candidates.extend([f"{b}/{fn}" for fn in filenames]) - - else: - return None - - for url in candidates: - txt = await self._fetch_text(url) - if txt and txt.strip(): - return txt - - return None + return await fetch_readme_markdown( + self.hass, + repo.url, + provider=repo.provider, + default_branch=repo.default_branch, + )