diff --git a/homeassistant/components/bluesound/media_player.py b/homeassistant/components/bluesound/media_player.py index 833050ba089..f21276abbbe 100644 --- a/homeassistant/components/bluesound/media_player.py +++ b/homeassistant/components/bluesound/media_player.py @@ -775,7 +775,7 @@ class BluesoundPlayer(MediaPlayerEntity): return None @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag of media commands that are supported.""" if self._status is None: return 0 diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index edd8e0331d9..786a530e36c 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -899,7 +899,7 @@ class CastMediaPlayerEntity(CastDevice, MediaPlayerEntity): return self._chromecast.app_display_name if self._chromecast else None @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" support = ( MediaPlayerEntityFeature.PLAY_MEDIA diff --git a/homeassistant/components/denon/media_player.py b/homeassistant/components/denon/media_player.py index 8c71dd46c3e..c1f864c8c2f 100644 --- a/homeassistant/components/denon/media_player.py +++ b/homeassistant/components/denon/media_player.py @@ -245,7 +245,7 @@ class DenonDevice(MediaPlayerEntity): return self._mediainfo @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" if self._mediasource in MEDIA_MODES.values(): return SUPPORT_DENON | SUPPORT_MEDIA_MODES diff --git a/homeassistant/components/denonavr/media_player.py b/homeassistant/components/denonavr/media_player.py index cc0e0c06656..32f233d5413 100644 --- a/homeassistant/components/denonavr/media_player.py +++ b/homeassistant/components/denonavr/media_player.py @@ -277,7 +277,7 @@ class DenonDevice(MediaPlayerEntity): return self._receiver.sound_mode @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" if self._receiver.input_func in self._receiver.netaudio_func_list: return self._supported_features_base | SUPPORT_MEDIA_MODES diff --git a/homeassistant/components/directv/media_player.py b/homeassistant/components/directv/media_player.py index bc838757854..21b25962fce 100644 --- a/homeassistant/components/directv/media_player.py +++ b/homeassistant/components/directv/media_player.py @@ -237,7 +237,7 @@ class DIRECTVMediaPlayer(DIRECTVEntity, MediaPlayerEntity): return self._program.channel @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" return SUPPORT_DTV_CLIENT if self._is_client else SUPPORT_DTV diff --git a/homeassistant/components/dlna_dmr/media_player.py b/homeassistant/components/dlna_dmr/media_player.py index ff09f018639..00444cd8f1c 100644 --- a/homeassistant/components/dlna_dmr/media_player.py +++ b/homeassistant/components/dlna_dmr/media_player.py @@ -478,7 +478,7 @@ class DlnaDmrEntity(MediaPlayerEntity): return MediaPlayerState.IDLE @property - def supported_features(self) -> int: + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported at this moment. Supported features may change as the device enters different states. diff --git a/homeassistant/components/dunehd/media_player.py b/homeassistant/components/dunehd/media_player.py index 4770492876d..a184b91c05e 100644 --- a/homeassistant/components/dunehd/media_player.py +++ b/homeassistant/components/dunehd/media_player.py @@ -19,7 +19,7 @@ from .const import ATTR_MANUFACTURER, DEFAULT_NAME, DOMAIN CONF_SOURCES: Final = "sources" -DUNEHD_PLAYER_SUPPORT: Final[int] = ( +DUNEHD_PLAYER_SUPPORT: Final[MediaPlayerEntityFeature] = ( MediaPlayerEntityFeature.PAUSE | MediaPlayerEntityFeature.TURN_ON | MediaPlayerEntityFeature.TURN_OFF @@ -105,7 +105,7 @@ class DuneHDPlayerEntity(MediaPlayerEntity): return int(self._state.get("playback_mute", 0)) == 1 @property - def supported_features(self) -> int: + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" return DUNEHD_PLAYER_SUPPORT diff --git a/homeassistant/components/emby/media_player.py b/homeassistant/components/emby/media_player.py index b573aef65ea..c03ae088a83 100644 --- a/homeassistant/components/emby/media_player.py +++ b/homeassistant/components/emby/media_player.py @@ -284,7 +284,7 @@ class EmbyDevice(MediaPlayerEntity): return self.device.media_album_artist @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported.""" if self.supports_remote_control: return SUPPORT_EMBY diff --git a/homeassistant/components/esphome/media_player.py b/homeassistant/components/esphome/media_player.py index d7a70737690..7f90f4e27d8 100644 --- a/homeassistant/components/esphome/media_player.py +++ b/homeassistant/components/esphome/media_player.py @@ -83,7 +83,7 @@ class EsphomeMediaPlayer( return self._state.volume @property - def supported_features(self) -> int: + def supported_features(self) -> MediaPlayerEntityFeature: """Flag supported features.""" flags = ( MediaPlayerEntityFeature.PLAY_MEDIA diff --git a/homeassistant/components/forked_daapd/media_player.py b/homeassistant/components/forked_daapd/media_player.py index 9da1c1a1168..1562a68b696 100644 --- a/homeassistant/components/forked_daapd/media_player.py +++ b/homeassistant/components/forked_daapd/media_player.py @@ -17,6 +17,7 @@ from homeassistant.components.media_player import ( BrowseMedia, MediaPlayerEnqueue, MediaPlayerEntity, + MediaPlayerEntityFeature, MediaPlayerState, MediaType, async_process_play_media_url, @@ -236,7 +237,7 @@ class ForkedDaapdZone(MediaPlayerEntity): await self._api.set_volume(volume=volume * 100, output_id=self._output_id) @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" return SUPPORTED_FEATURES_ZONE @@ -558,7 +559,7 @@ class ForkedDaapdMaster(MediaPlayerEntity): return self._player["shuffle"] @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" return SUPPORTED_FEATURES diff --git a/homeassistant/components/hdmi_cec/media_player.py b/homeassistant/components/hdmi_cec/media_player.py index cfe73ff7c40..25019ec6933 100644 --- a/homeassistant/components/hdmi_cec/media_player.py +++ b/homeassistant/components/hdmi_cec/media_player.py @@ -163,7 +163,7 @@ class CecPlayerEntity(CecEntity, MediaPlayerEntity): _LOGGER.warning("Unknown state: %s", device.status) @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" if self.type_id == TYPE_RECORDER or self.type == TYPE_PLAYBACK: return ( diff --git a/homeassistant/components/homekit_controller/media_player.py b/homeassistant/components/homekit_controller/media_player.py index 4efa7dbce1c..04fad045cb5 100644 --- a/homeassistant/components/homekit_controller/media_player.py +++ b/homeassistant/components/homekit_controller/media_player.py @@ -80,7 +80,7 @@ class HomeKitTelevision(HomeKitEntity, MediaPlayerEntity): ] @property - def supported_features(self) -> int: + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported.""" features = 0 diff --git a/homeassistant/components/jellyfin/media_player.py b/homeassistant/components/jellyfin/media_player.py index 36fb65916d2..a05aada2152 100644 --- a/homeassistant/components/jellyfin/media_player.py +++ b/homeassistant/components/jellyfin/media_player.py @@ -198,7 +198,7 @@ class JellyfinMediaPlayer(JellyfinEntity, MediaPlayerEntity): return get_artwork_url(self.coordinator.api_client, self.now_playing, 150) @property - def supported_features(self) -> int: + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported.""" commands: list[str] = self.capabilities.get("SupportedCommands", []) controllable = self.capabilities.get("SupportsMediaControl", False) diff --git a/homeassistant/components/lg_netcast/media_player.py b/homeassistant/components/lg_netcast/media_player.py index 6f3508e22eb..47cbebf939b 100644 --- a/homeassistant/components/lg_netcast/media_player.py +++ b/homeassistant/components/lg_netcast/media_player.py @@ -197,7 +197,7 @@ class LgTVDevice(MediaPlayerEntity): return self._program_name @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" if self._on_action_script: return SUPPORT_LGTV | MediaPlayerEntityFeature.TURN_ON diff --git a/homeassistant/components/lookin/media_player.py b/homeassistant/components/lookin/media_player.py index f0e9c7e5928..9e925836e11 100644 --- a/homeassistant/components/lookin/media_player.py +++ b/homeassistant/components/lookin/media_player.py @@ -82,7 +82,6 @@ class LookinMedia(LookinPowerPushRemoteEntity, MediaPlayerEntity): ) -> None: """Init the lookin media player.""" self._attr_device_class = device_class - self._attr_supported_features: int = 0 super().__init__(coordinator, uuid, device, lookin_data) for function_name, feature in _FUNCTION_NAME_TO_FEATURE.items(): if function_name in self._function_names: diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index c43c9980c19..0e17d5c5339 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -492,7 +492,7 @@ class MediaPlayerEntity(Entity): _attr_source_list: list[str] | None = None _attr_source: str | None = None _attr_state: MediaPlayerState | str | None = None - _attr_supported_features: int = 0 + _attr_supported_features: MediaPlayerEntityFeature | int = 0 _attr_volume_level: float | None = None # Implement these for your media player @@ -692,7 +692,7 @@ class MediaPlayerEntity(Entity): return self._attr_group_members @property - def supported_features(self) -> int: + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported.""" return self._attr_supported_features diff --git a/homeassistant/components/mpd/media_player.py b/homeassistant/components/mpd/media_player.py index 44d94bc649f..d54b9702686 100644 --- a/homeassistant/components/mpd/media_player.py +++ b/homeassistant/components/mpd/media_player.py @@ -338,7 +338,7 @@ class MpdDevice(MediaPlayerEntity): return None @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported.""" if self._status is None: return 0 diff --git a/homeassistant/components/onkyo/media_player.py b/homeassistant/components/onkyo/media_player.py index c1d242c840c..11af0ea4013 100644 --- a/homeassistant/components/onkyo/media_player.py +++ b/homeassistant/components/onkyo/media_player.py @@ -553,7 +553,7 @@ class OnkyoDeviceZone(OnkyoDevice): ) @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Return media player features that are supported.""" if self._supports_volume: return SUPPORT_ONKYO diff --git a/homeassistant/components/philips_js/media_player.py b/homeassistant/components/philips_js/media_player.py index 116833d8a97..e1ceddd4bda 100644 --- a/homeassistant/components/philips_js/media_player.py +++ b/homeassistant/components/philips_js/media_player.py @@ -104,7 +104,7 @@ class PhilipsTVMediaPlayer( await self.coordinator.async_request_refresh() @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" supports = self._supports if self.coordinator.turn_on or ( diff --git a/homeassistant/components/plex/media_player.py b/homeassistant/components/plex/media_player.py index 84e0f084210..b43c4dc0e21 100644 --- a/homeassistant/components/plex/media_player.py +++ b/homeassistant/components/plex/media_player.py @@ -389,7 +389,7 @@ class PlexMediaPlayer(MediaPlayerEntity): return self.session.media_episode @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" if self.device and "playback" in self._device_protocol_capabilities: return ( diff --git a/homeassistant/components/universal/media_player.py b/homeassistant/components/universal/media_player.py index d26b062de40..450a0f6f3bf 100644 --- a/homeassistant/components/universal/media_player.py +++ b/homeassistant/components/universal/media_player.py @@ -453,9 +453,11 @@ class UniversalMediaPlayer(MediaPlayerEntity): return self._override_or_child_attr(ATTR_MEDIA_SHUFFLE) @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported.""" - flags = self._child_attr(ATTR_SUPPORTED_FEATURES) or 0 + flags: MediaPlayerEntityFeature | int = ( + self._child_attr(ATTR_SUPPORTED_FEATURES) or 0 + ) if SERVICE_TURN_ON in self._cmds: flags |= MediaPlayerEntityFeature.TURN_ON diff --git a/homeassistant/components/webostv/media_player.py b/homeassistant/components/webostv/media_player.py index 10fed607ee8..41432d65489 100644 --- a/homeassistant/components/webostv/media_player.py +++ b/homeassistant/components/webostv/media_player.py @@ -137,7 +137,7 @@ class LgWebOSMediaPlayerEntity(RestoreEntity, MediaPlayerEntity): self._current_source = None self._source_list: dict = {} - self._supported_features: int = 0 + self._supported_features: MediaPlayerEntityFeature | int = 0 self._update_states() async def async_added_to_hass(self) -> None: @@ -314,7 +314,7 @@ class LgWebOSMediaPlayerEntity(RestoreEntity, MediaPlayerEntity): await self._client.connect() @property - def supported_features(self) -> int: + def supported_features(self) -> MediaPlayerEntityFeature | int: """Flag media player features that are supported.""" if self._wrapper.turn_on: return self._supported_features | MediaPlayerEntityFeature.TURN_ON diff --git a/homeassistant/components/xbox/media_player.py b/homeassistant/components/xbox/media_player.py index 5b9dcd77f2b..71ec382f04a 100644 --- a/homeassistant/components/xbox/media_player.py +++ b/homeassistant/components/xbox/media_player.py @@ -107,7 +107,7 @@ class XboxMediaPlayer(CoordinatorEntity[XboxUpdateCoordinator], MediaPlayerEntit return XBOX_STATE_MAP[status.power_state] @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" if self.state not in [MediaPlayerState.PLAYING, MediaPlayerState.PAUSED]: return ( diff --git a/homeassistant/components/yamaha/media_player.py b/homeassistant/components/yamaha/media_player.py index 7d98ae5d62a..3f0b331c648 100644 --- a/homeassistant/components/yamaha/media_player.py +++ b/homeassistant/components/yamaha/media_player.py @@ -311,7 +311,7 @@ class YamahaDevice(MediaPlayerEntity): return f"{self.receiver.ctrl_url}:{self._zone}" @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" supported_features = SUPPORT_YAMAHA diff --git a/homeassistant/components/yamaha_musiccast/media_player.py b/homeassistant/components/yamaha_musiccast/media_player.py index 504c56d73ec..9eb1be3c0fe 100644 --- a/homeassistant/components/yamaha_musiccast/media_player.py +++ b/homeassistant/components/yamaha_musiccast/media_player.py @@ -424,7 +424,7 @@ class MusicCastMediaPlayer(MusicCastDeviceEntity, MediaPlayerEntity): ) @property - def supported_features(self): + def supported_features(self) -> MediaPlayerEntityFeature: """Flag media player features that are supported.""" supported_features = MUSIC_PLAYER_BASE_SUPPORT zone = self.coordinator.data.zones[self._zone_id] diff --git a/pylint/plugins/hass_enforce_type_hints.py b/pylint/plugins/hass_enforce_type_hints.py index 52d14562dec..e5cbcca09b2 100644 --- a/pylint/plugins/hass_enforce_type_hints.py +++ b/pylint/plugins/hass_enforce_type_hints.py @@ -1788,6 +1788,10 @@ _INHERITANCE_MATCH: dict[str, list[ClassTypeHintMatch]] = { function_name="group_members", return_type=["list[str]", None], ), + TypeHintMatch( + function_name="supported_features", + return_type=["MediaPlayerEntityFeature", "int"], + ), TypeHintMatch( function_name="turn_on", return_type=None,