{"record":{"id":"4c8041f6a82a4c7d","repo":"home-assistant/core","slug":"media-not-found-media-content-type-media-con","errorCode":null,"errorMessage":"Media not found: {media_content_type} / {media_content_id}","messagePattern":"Media not found: (.+?) / (.+?)","errorType":"exception","errorClass":"BrowseError","httpStatus":null,"severity":"warning","filePath":"homeassistant/components/arcam_fmj/media_player.py","lineNumber":164,"sourceCode":"        else:\n            _LOGGER.debug(\"Firing event to turn on device\")\n            self.hass.bus.async_fire(EVENT_TURN_ON, {ATTR_ENTITY_ID: self.entity_id})\n\n    @convert_exception\n    @override\n    async def async_turn_off(self) -> None:\n        \"\"\"Turn the media player off.\"\"\"\n        await self._state.set_power(False)\n\n    @override\n    async def async_browse_media(\n        self,\n        media_content_type: MediaType | str | None = None,\n        media_content_id: str | None = None,\n    ) -> BrowseMedia:\n        \"\"\"Implement the websocket media browsing helper.\"\"\"\n        if media_content_id not in (None, \"root\"):\n            raise BrowseError(\n                f\"Media not found: {media_content_type} / {media_content_id}\"\n            )\n\n        presets = self._state.get_preset_details()\n\n        radio = [\n            BrowseMedia(\n                title=preset.name,\n                media_class=MediaClass.MUSIC,\n                media_content_id=f\"preset:{preset.index}\",\n                media_content_type=MediaType.MUSIC,\n                can_play=True,\n                can_expand=False,\n            )\n            for preset in presets.values()\n        ]\n\n        return BrowseMedia(","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/arcam_fmj/media_player.py#L146-L182","documentation":"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'.","triggerScenarios":"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.","commonSituations":"Frontend or custom Lovelace media-browser card that tries to expand children; cached browse state referencing an id after integration reload changed preset indices.","solutions":["Browse only the root node; presets are playable leaf items (media_content_id 'preset:N'), not browsable folders.","Clear the media browser cache / reload the dashboard if it resubmits stale ids.","If you need hierarchy, handle it client-side rather than asking the integration to browse non-root ids."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"def is_browsable(media_content_id: str | None) -> bool:\n    return media_content_id in (None, \"root\")","typeGuard":null,"tryCatchPattern":"Catch BrowseError in media browser clients and fall back to browsing the root node ('root'/None), since presets are leaves.","preventionTips":["Treat this integration's browse tree as flat: only root is browsable.","Use browse results only to populate play actions, never re-browse leaf ids.","Clear stale media browser caches after integration reloads."],"tags":["home-assistant","arcam-fmj","media-player","browse-media"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}