custom_components/bahmcloud_store/core.py aktualisiert

This commit is contained in:
2026-01-15 07:18:13 +00:00
parent b4b6b2b987
commit 013b0baa83

View File

@@ -1,8 +1,10 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
import json
import logging import logging
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path
from typing import Any from typing import Any
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@@ -55,6 +57,21 @@ class BCSCore:
self.repos: dict[str, RepoItem] = {} self.repos: dict[str, RepoItem] = {}
self._listeners: list[callable] = [] self._listeners: list[callable] = []
self.version: str = self._read_manifest_version()
def _read_manifest_version(self) -> str:
"""
Read the integration version from manifest.json to avoid version mismatches
between backend and frontend strings.
"""
try:
manifest_path = Path(__file__).resolve().parent / "manifest.json"
data = json.loads(manifest_path.read_text(encoding="utf-8"))
v = data.get("version")
return str(v) if v else "unknown"
except Exception:
return "unknown"
def add_listener(self, cb) -> None: def add_listener(self, cb) -> None:
self._listeners.append(cb) self._listeners.append(cb)
@@ -88,7 +105,7 @@ class BCSCore:
for c in custom_repos: for c in custom_repos:
merged[c.id] = RepoItem( merged[c.id] = RepoItem(
id=c.id, id=c.id,
name=c.name or c.url, name=c.name or c.url, # Will be replaced by provider repo_name if name missing
url=c.url, url=c.url,
source="custom", source="custom",
) )
@@ -97,7 +114,7 @@ class BCSCore:
for r in merged.values(): for r in merged.values():
r.provider = detect_provider(r.url) r.provider = detect_provider(r.url)
# Enrich owner/description (best-effort; never break the store) # Enrich owner/description/name (best-effort; never break the store)
await self._enrich_repos(merged) await self._enrich_repos(merged)
self.repos = merged self.repos = merged
@@ -112,12 +129,19 @@ class BCSCore:
async def enrich_one(r: RepoItem) -> None: async def enrich_one(r: RepoItem) -> None:
async with sem: async with sem:
info = await fetch_repo_info(self.hass, r.url) info = await fetch_repo_info(self.hass, r.url)
r.provider = info.provider or r.provider r.provider = info.provider or r.provider
if info.owner: if info.owner:
r.owner = info.owner r.owner = info.owner
if info.description: if info.description:
r.description = info.description r.description = info.description
# If the custom repo had no name provided, use repo_name from provider
if r.source == "custom":
if (not r.name) or (r.name == r.url) or (r.name.startswith("http")):
if info.repo_name:
r.name = info.repo_name
await asyncio.gather(*(enrich_one(r) for r in merged.values()), return_exceptions=True) await asyncio.gather(*(enrich_one(r) for r in merged.values()), return_exceptions=True)
async def _load_index_repos(self) -> tuple[list[RepoItem], int]: async def _load_index_repos(self) -> tuple[list[RepoItem], int]: