『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 127|回复: 1

[基础教程] 小爱音箱播放云音乐单曲循环的一种解决办法

[复制链接]

3

主题

41

帖子

359

积分

中级会员

Rank: 3Rank: 3

积分
359
金钱
318
HASS币
0
发表于 前天 11:43 | 显示全部楼层 |阅读模式
本帖最后由 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




回复

使用道具 举报

0

主题

1

帖子

42

积分

新手上路

Rank: 1

积分
42
金钱
41
HASS币
0
发表于 前天 17:16 | 显示全部楼层
哥,我tts也是一直循环,有办法操作吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2025-2-2 12:59 , Processed in 0.047036 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表