Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions custom_components/hacs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
from .data_client import HacsDataClient
from .enums import HacsDisabledReason, HacsStage, LovelaceMode
from .frontend import async_register_frontend
from .icon_view import HacsRepositoryIconView
from .utils.repository_icon import async_initialize_repository_icon_cache
from .utils.data import HacsData
from .utils.queue_manager import QueueManager
from .utils.version import version_left_higher_or_equal_then_right
Expand Down Expand Up @@ -136,9 +138,15 @@ async def async_startup():
hacs.disable_hacs(HacsDisabledReason.RESTORE)
return False

await async_initialize_repository_icon_cache(hacs)

hacs.set_active_categories()

async_register_websocket_commands(hass)
registered_views = hass.data.setdefault(f"{DOMAIN}_registered_views", set())
if HacsRepositoryIconView.name not in registered_views:
hass.http.register_view(HacsRepositoryIconView(hass))
registered_views.add(HacsRepositoryIconView.name)
await async_register_frontend(hass, hacs)

await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
Expand Down
1 change: 1 addition & 0 deletions custom_components/hacs/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ class HacsCommon:
archived_repositories: set[str] = field(default_factory=set)
ignored_repositories: set[str] = field(default_factory=set)
skip: set[str] = field(default_factory=set)
repository_uploaded_icons: dict[str, dict[str, Any]] = field(default_factory=dict)


@dataclass
Expand Down
43 changes: 43 additions & 0 deletions custom_components/hacs/icon_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"""HTTP view for resolving repository icons."""

from __future__ import annotations

from aiohttp import web
from homeassistant.components.http import HomeAssistantView
from homeassistant.core import HomeAssistant

from .const import DOMAIN
from .enums import HacsCategory
from .utils.repository_icon import async_resolve_repository_icon_url


class HacsRepositoryIconView(HomeAssistantView):
"""Resolve repository icons for the dashboard."""

url = "/api/hacs/icon/{repository_id}"
name = "api:hacs:repository_icon"
requires_auth = False

def __init__(self, hass: HomeAssistant) -> None:
"""Initialize the view."""
self.hass = hass

async def get(self, request: web.Request, repository_id: str) -> web.Response:
"""Handle icon requests."""
hacs = self.hass.data.get(DOMAIN)
if hacs is None:
raise web.HTTPServiceUnavailable()

repository = hacs.repositories.get_by_id(repository_id)
if repository is None or repository.data.category != HacsCategory.INTEGRATION:
raise web.HTTPNotFound()

icon_url = await async_resolve_repository_icon_url(
repository,
hacs.session,
dark=request.query.get("dark") == "1",
)
if icon_url is None:
raise web.HTTPNotFound()

raise web.HTTPFound(location=icon_url)
1 change: 1 addition & 0 deletions custom_components/hacs/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"http",
"websocket_api",
"frontend",
"image_upload",
"persistent_notification",
"lovelace",
"repairs"
Expand Down
2 changes: 1 addition & 1 deletion custom_components/hacs/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ def entity_picture(self) -> str | None:
):
return None

return f"https://brands.home-assistant.io/_/{self.repository.data.domain}/icon.png"
return f"/api/brands/integration/{self.repository.data.domain}/brand/icon.png"

async def async_install(self, version: str | None, backup: bool, **kwargs: Any) -> None:
"""Install an update."""
Expand Down
Loading