本帖最后由 bingood 于 2025-1-31 11:42 编辑
测试音箱:小爱音箱pro
接入方式:Xiaomi Miot Auto生成的media_player实体
实现方式:修改\config\custom_components\ha_cloud_music下的media_player.py文件
1. 定时器时间改为1
# 定时器时间
TIME_BETWEEN_UPDATES = datetime.timedelta(seconds=1)
UNSUB_INTERVAL = None
2. __init__函数下添加相关属性
# 添加用于跟踪播放进度的属性
self._last_update_time = None
self._last_position = 0
self._estimated_position = 0
3. 修改interval函数
def interval(self, now):
# 暂停时不更新
if self._attr_state == STATE_PAUSED:
return
media_player = self.media_player
if media_player is not None:
attrs = media_player.attributes
current_position = attrs.get('media_position', 0)
current_duration = attrs.get('media_duration', 0)
current_state = media_player.state
# 如果播放器报告了新的位置,更新我们的估算基准点
if current_position != self._last_position:
self._last_position = current_position
self._last_update_time = now
self._estimated_position = current_position
# 如果正在播放,计算估算的当前位置
if self._attr_state == STATE_PLAYING and self._last_update_time:
time_diff = (now - self._last_update_time).total_seconds()
self._estimated_position = self._last_position + time_diff
# 使用估算的位置更新媒体位置
self._attr_media_position = min(self._estimated_position, current_duration)
self._attr_media_duration = current_duration
self._attr_media_position_updated_at = now
# 检查是否接近结束
if current_duration > 0 and self._estimated_position >= current_duration - 2:
_LOGGER.debug("Estimated end of track")
self.hass.create_task(self.async_media_next_track())
# 重置估算器
self._last_update_time = None
self._last_position = 0
self._estimated_position = 0
return
# 检查播放器状态变化
if self.current_state == STATE_PLAYING and current_state == STATE_IDLE:
_LOGGER.debug("State change detected: PLAYING -> IDLE")
self.hass.create_task(self.async_media_next_track())
# 重置估算器
self._last_update_time = None
self._last_position = 0
self._estimated_position = 0
return
self.current_state = current_state
if hasattr(self, 'playlist'):
music_info = self.playlist[self.playindex]
self._attr_app_name = music_info.singer
self._attr_media_image_url = music_info.thumbnail
self._attr_media_album_name = music_info.album
self._attr_media_title = music_info.song
self._attr_media_artist = music_info.singer
|