From 60c46aa12117633b218e9abb93bae3b5ce1dae86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Bachmann?= Date: Thu, 15 Jan 2026 14:38:23 +0000 Subject: [PATCH] revert 1837ed4a13eecca77f4ad0f559cb0ae1dc93c53c revert custom_components/bahmcloud_store/metadata.py aktualisiert --- custom_components/bahmcloud_store/metadata.py | 68 +++++++++++++------ 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/custom_components/bahmcloud_store/metadata.py b/custom_components/bahmcloud_store/metadata.py index ba932da..7fe0f9b 100644 --- a/custom_components/bahmcloud_store/metadata.py +++ b/custom_components/bahmcloud_store/metadata.py @@ -22,28 +22,36 @@ class RepoMetadata: maintainer: str | None = None +def _normalize_repo_name(name: str | None) -> str | None: + if not name: + return None + n = name.strip() + if n.endswith(".git"): + n = n[:-4] + return n or None + + def _split_owner_repo(repo_url: str) -> tuple[str | None, str | None]: u = urlparse(repo_url.rstrip("/")) - parts = [p for p in u.path.split("/") if p] + parts = [p for p in u.path.strip("/").split("/") if p] if len(parts) < 2: return None, None - owner = parts[0] - repo = parts[1] - repo = repo[:-4] if repo.endswith(".git") else repo + owner = parts[0].strip() or None + repo = _normalize_repo_name(parts[1]) return owner, repo -def _is_github(url: str) -> bool: - return "github.com" in (urlparse(url).netloc or "").lower() +def _is_github(repo_url: str) -> bool: + return "github.com" in urlparse(repo_url).netloc.lower() -def _is_gitlab(url: str) -> bool: - return "gitlab.com" in (urlparse(url).netloc or "").lower() +def _is_gitlab(repo_url: str) -> bool: + return "gitlab" in urlparse(repo_url).netloc.lower() -def _is_gitea(url: str) -> bool: - host = (urlparse(url).netloc or "").lower() - return bool(host) and not _is_github(url) and not _is_gitlab(url) +def _is_gitea(repo_url: str) -> bool: + host = urlparse(repo_url).netloc.lower() + return host and ("github.com" not in host) and ("gitlab" not in host) async def _fetch_text(hass: HomeAssistant, url: str) -> str | None: @@ -59,9 +67,10 @@ async def _fetch_text(hass: HomeAssistant, url: str) -> str | None: def _parse_meta_yaml(raw: str, source: str) -> RepoMetadata: try: - data = ha_yaml.load(raw) or {} + data = ha_yaml.parse_yaml(raw) if not isinstance(data, dict): return RepoMetadata(source=source) + return RepoMetadata( source=source, name=data.get("name"), @@ -79,14 +88,20 @@ def _parse_meta_hacs_json(raw: str) -> RepoMetadata: data = json.loads(raw) if not isinstance(data, dict): return RepoMetadata(source="hacs.json") - # common keys + + name = data.get("name") + description = data.get("description") + author = data.get("author") + maintainer = data.get("maintainer") + category = data.get("category") or data.get("type") + return RepoMetadata( source="hacs.json", - name=data.get("name"), - description=data.get("description"), - category=data.get("category"), - author=data.get("author"), - maintainer=data.get("maintainer"), + name=name if isinstance(name, str) else None, + description=description if isinstance(description, str) else None, + category=category if isinstance(category, str) else None, + author=author if isinstance(author, str) else None, + maintainer=maintainer if isinstance(maintainer, str) else None, ) except Exception: return RepoMetadata(source="hacs.json") @@ -98,7 +113,13 @@ async def fetch_repo_metadata(hass: HomeAssistant, repo_url: str, default_branch return RepoMetadata() branch = default_branch or "main" + + # Priority: + # 1) bcs.yaml + # 2) hacs.yaml + # 3) hacs.json filenames = ["bcs.yaml", "hacs.yaml", "hacs.json"] + candidates: list[tuple[str, str]] = [] if _is_github(repo_url): @@ -109,16 +130,23 @@ async def fetch_repo_metadata(hass: HomeAssistant, repo_url: str, default_branch elif _is_gitlab(repo_url): u = urlparse(repo_url.rstrip("/")) root = f"{u.scheme}://{u.netloc}/{owner}/{repo}" + # GitLab raw format + # https://gitlab.com///-/raw// for fn in filenames: candidates.append((fn, f"{root}/-/raw/{branch}/{fn}")) elif _is_gitea(repo_url): u = urlparse(repo_url.rstrip("/")) root = f"{u.scheme}://{u.netloc}/{owner}/{repo}" - bases = [f"{root}/raw/branch/{branch}", f"{root}/raw/{branch}"] + + bases = [ + f"{root}/raw/branch/{branch}", + f"{root}/raw/{branch}", + ] for fn in filenames: for b in bases: candidates.append((fn, f"{b}/{fn}")) + else: return RepoMetadata() @@ -137,4 +165,4 @@ async def fetch_repo_metadata(hass: HomeAssistant, repo_url: str, default_branch if meta.source: return meta - return RepoMetadata() + return RepoMetadata() \ No newline at end of file