|
|
@@ -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):
|
|
|
"""清空播放列表,添加多个视频,并循环播放(整体异步派发)。"""
|