home-assistant/core · warning · BrowseError

Media not found: {media_content_type} / {media_content_id}

Error message

Media not found: {media_content_type} / {media_content_id}

What it means

BrowseError raised in arcam_fmj async_browse_media when the websocket media browser is asked for anything other than the root node. The integration only exposes a flat root listing of tuner presets, so any non-root media_content_id is 'not found'.

Source

Thrown at homeassistant/components/arcam_fmj/media_player.py:164

        else:
            _LOGGER.debug("Firing event to turn on device")
            self.hass.bus.async_fire(EVENT_TURN_ON, {ATTR_ENTITY_ID: self.entity_id})

    @convert_exception
    @override
    async def async_turn_off(self) -> None:
        """Turn the media player off."""
        await self._state.set_power(False)

    @override
    async def async_browse_media(
        self,
        media_content_type: MediaType | str | None = None,
        media_content_id: str | None = None,
    ) -> BrowseMedia:
        """Implement the websocket media browsing helper."""
        if media_content_id not in (None, "root"):
            raise BrowseError(
                f"Media not found: {media_content_type} / {media_content_id}"
            )

        presets = self._state.get_preset_details()

        radio = [
            BrowseMedia(
                title=preset.name,
                media_class=MediaClass.MUSIC,
                media_content_id=f"preset:{preset.index}",
                media_content_type=MediaType.MUSIC,
                can_play=True,
                can_expand=False,
            )
            for preset in presets.values()
        ]

        return BrowseMedia(

View on GitHub (pinned to 58a3fdb3ea)

Solutions

  1. Browse only the root node; presets are playable leaf items (media_content_id 'preset:N'), not browsable folders.
  2. Clear the media browser cache / reload the dashboard if it resubmits stale ids.
  3. If you need hierarchy, handle it client-side rather than asking the integration to browse non-root ids.
Defensive patterns

Strategy: validation

Validate before calling

def is_browsable(media_content_id: str | None) -> bool:
    return media_content_id in (None, "root")

Try / catch

Catch BrowseError in media browser clients and fall back to browsing the root node ('root'/None), since presets are leaves.

Prevention

When it happens

Trigger: A media browser request arrives with media_content_id not in (None, 'root') - e.g. a client drilling into a preset or passing a stale 'preset:N' id as a browse target instead of a play target.

Common situations: Frontend or custom Lovelace media-browser card that tries to expand children; cached browse state referencing an id after integration reload changed preset indices.

Related errors


AI-assisted analysis of home-assistant/core@58a3fdb3ea (2026-08-14). Data as JSON: /api/errors/4c8041f6a82a4c7d. Report an issue: GitHub.