liuq 5 månader sedan
förälder
incheckning
17822ce7bb
1 ändrade filer med 48 tillägg och 3 borttagningar
  1. 48 3
      hardware/kodi_module.py

+ 48 - 3
hardware/kodi_module.py

@@ -82,10 +82,55 @@ class KodiClient:
 
     def play_video(self, video_path, loop=False):
         """播放指定路径的视频文件(异步派发),loop为是否循环播放"""
-        params = {"item": {"file": video_path, "loop": loop}}
-        self._send_request_async("Player.Open", params)
+        params = {"item": {"file": video_path}}
+        
+        def _play_video_worker():
+            """异步工作线程:播放视频并根据loop参数设置循环"""
+            try:
+                response = self._send_request("Player.Open", params)
+                logger.info(f"[async] Player.Open(video) 响应: {response}")
+                
+                if loop:
+                    # 如果需要循环播放,等待视频加载后设置循环
+                    if response and response.get('result') == 'OK':
+                        logger.info("[async] Player.Open 调用成功,等待视频加载后设置循环...")
+                        # 等待视频加载 (根据观察到的 5 秒加载时间设置)
+                        wait_time = 5.5
+                        logger.info(f"[async] 等待 {wait_time} 秒让视频加载...")
+                        time.sleep(wait_time)
+                        # 尝试直接使用 playerid: 1,并验证其类型
+                        player_id_to_try = 1
+                        try:
+                            properties_to_get = ["speed", "type"]
+                            get_props_params = {"playerid": player_id_to_try, "properties": properties_to_get}
+                            props_response = self._send_request("Player.GetProperties", get_props_params)
+                            logger.info(f"[async] Player.GetProperties (ID: {player_id_to_try}) 响应: {props_response}")
+
+                            if props_response and props_response.get('result') and props_response['result'].get('type') == 'video':
+                                logger.info(f"[async] 播放器 {player_id_to_try} 确认为视频播放器。尝试设置循环...")
+                                repeat_params = {"playerid": player_id_to_try, "repeat": "all"}
+                                repeat_response = self._send_request("Player.SetRepeat", repeat_params)
+                                logger.info(f"[async] Player.SetRepeat 响应: {repeat_response}")
+                                if repeat_response and repeat_response.get('result') == 'OK':
+                                    logger.info("[async] 循环播放设置成功。")
+                                else:
+                                    logger.warning(f"[async] 设置循环播放失败: {repeat_response}")
+                            elif props_response and props_response.get('error'):
+                                logger.warning(f"[async] 获取播放器 {player_id_to_try} 属性时出错: {props_response['error']} - 可能播放器尚未就绪或 ID 不正确")
+                                logger.warning("[async] 无法确认播放器状态,不设置循环。")
+                            else:
+                                logger.warning(f"[async] 播放器 {player_id_to_try} 不是预期的视频播放器或未找到。类型: {props_response.get('result', {}).get('type')},不设置循环。")
+                        except Exception as e:
+                            logger.error(f"[async] 在尝试获取属性或设置循环时发生错误: {str(e)}")
+                else:
+                    logger.info(f"[async] Player.Open(video) 已派发,不设置循环: {video_path}")
+            except Exception as e:
+                logger.warning(f"[async] Player.Open(video) 调用异常: {e}")
+        
+        t = threading.Thread(target=_play_video_worker, daemon=True)
+        t.start()
         logger.info(f"[async] Player.Open(video) 已派发: {video_path}, 循环: {loop}")
-        return {"queued": True, "file": video_path}
+        return {"queued": True, "file": video_path, "loop": loop}
 
     def play_playlist_looped(self, video_paths):
         """清空播放列表,添加多个视频,并循环播放(整体异步派发)。"""