From bae4d0b84f63fde0cb94eeda37db41f178771d1d Mon Sep 17 00:00:00 2001 From: bahmcloud Date: Thu, 15 Jan 2026 09:46:16 +0000 Subject: [PATCH] custom_components/bahmcloud_store/core.py aktualisiert --- custom_components/bahmcloud_store/core.py | 32 ++++++++++++----------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/custom_components/bahmcloud_store/core.py b/custom_components/bahmcloud_store/core.py index 982cbb7..3da7574 100644 --- a/custom_components/bahmcloud_store/core.py +++ b/custom_components/bahmcloud_store/core.py @@ -46,6 +46,10 @@ class RepoItem: provider_description: str | None = None default_branch: str | None = None + # Latest version best-effort + latest_version: str | None = None + latest_version_source: str | None = None # "release" | "tag" | None + # Metadata resolver meta_source: str | None = None meta_name: str | None = None @@ -126,15 +130,17 @@ class BCSCore: async def process_one(r: RepoItem) -> None: async with sem: - # 1) Provider info info: RepoInfo = await fetch_repo_info(self.hass, r.url) + r.provider = info.provider or r.provider r.owner = info.owner or r.owner r.provider_repo_name = info.repo_name r.provider_description = info.description r.default_branch = info.default_branch or r.default_branch - # 2) Metadata resolver (bcs.yaml -> hacs.yaml -> hacs.json) + r.latest_version = info.latest_version + r.latest_version_source = info.latest_version_source + md: RepoMetadata = await fetch_repo_metadata(self.hass, r.url, r.default_branch) r.meta_source = md.source r.meta_name = md.name @@ -143,12 +149,15 @@ class BCSCore: r.meta_author = md.author r.meta_maintainer = md.maintainer - # 3) Resolve final display name (priority) + # Display name priority: + # 1) metadata name + # 2) store/user provided name + # 3) provider repo name (fallback) + # 4) url has_user_or_index_name = bool(r.name) and (r.name != r.url) and (not str(r.name).startswith("http")) if r.meta_name: r.name = r.meta_name elif not has_user_or_index_name and r.provider_repo_name: - # Only use provider repo name if no metadata AND no user/index name. r.name = r.provider_repo_name elif not r.name: r.name = r.url @@ -184,10 +193,9 @@ class BCSCore: continue name = str(r.get("name") or url).strip() - rid = f"index:{i}" items.append( RepoItem( - id=rid, + id=f"index:{i}", name=name, url=url, source="index", @@ -216,7 +224,6 @@ class BCSCore: out: list[dict[str, Any]] = [] for r in self.repos.values(): resolved_description = r.meta_description or r.provider_description - out.append( { "id": r.id, @@ -236,9 +243,11 @@ class BCSCore: "provider_repo_name": r.provider_repo_name, "provider_description": r.provider_description, - # UI convenience: "description": resolved_description, "category": r.meta_category, + + "latest_version": r.latest_version, + "latest_version_source": r.latest_version_source, } ) return out @@ -272,10 +281,6 @@ class BCSCore: return None async def fetch_readme_markdown(self, repo_id: str) -> str | None: - """ - Try to fetch README.md from repository root (best-effort). - Supports GitHub and Gitea raw URLs. - """ repo = self.get_repo(repo_id) if not repo: return None @@ -285,7 +290,6 @@ class BCSCore: return None branch = repo.default_branch or "main" - filenames = ["README.md", "readme.md", "README.MD"] candidates: list[str] = [] @@ -293,7 +297,6 @@ class BCSCore: if self._is_github(repo.url): base = f"https://raw.githubusercontent.com/{owner}/{name}/{branch}" candidates.extend([f"{base}/{fn}" for fn in filenames]) - elif self._is_gitea(repo.url): u = urlparse(repo.url.rstrip("/")) root = f"{u.scheme}://{u.netloc}/{owner}/{name}" @@ -303,7 +306,6 @@ class BCSCore: ] for b in bases: candidates.extend([f"{b}/{fn}" for fn in filenames]) - else: return None