kodi_free_time_thread.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import threading
  2. import time
  3. from utils.logger_config import logger
  4. from application.kodi_thread import _kodi_thread
  5. class KodiFreeTimeThreadSingleton:
  6. """Kodi空闲时间播放线程单例类,每5分钟循环播放视频ID 0"""
  7. _instance = None
  8. _lock = threading.Lock()
  9. def __new__(cls):
  10. if cls._instance is None:
  11. with cls._lock:
  12. if cls._instance is None:
  13. cls._instance = super(KodiFreeTimeThreadSingleton, cls).__new__(cls)
  14. return cls._instance
  15. def __init__(self):
  16. # 避免重复初始化
  17. if hasattr(self, '_initialized'):
  18. return
  19. self._initialized = True
  20. self.thread = None
  21. self.is_running = False
  22. self._should_stop = False
  23. # 配置参数
  24. self.video_id = 0
  25. self.interval_seconds = 5 * 60 # 5分钟 = 300秒
  26. # 启动工作线程
  27. self._start_worker_thread()
  28. def _start_worker_thread(self):
  29. """启动工作线程"""
  30. if self.thread is None or not self.thread.is_alive():
  31. self.is_running = True
  32. self._should_stop = False
  33. self.thread = threading.Thread(target=self._worker_loop, daemon=True)
  34. self.thread.start()
  35. logger.info("Kodi空闲时间播放线程已启动")
  36. def _worker_loop(self):
  37. """工作线程主循环"""
  38. logger.info("Kodi空闲时间播放线程开始运行,每5分钟播放视频ID 0(循环模式)")
  39. try:
  40. # 确保Kodi线程的manager已初始化
  41. _kodi_thread._initialize_manager()
  42. while self.is_running and not self._should_stop:
  43. try:
  44. # 调用播放方法,循环播放视频ID 0
  45. logger.info(f"触发空闲时间播放:视频ID={self.video_id},循环模式=True")
  46. success = _kodi_thread._play_sync_by_video_id(self.video_id, loop=True)
  47. if success:
  48. logger.info(f"空闲时间播放启动成功:视频ID={self.video_id}")
  49. else:
  50. logger.warning(f"空闲时间播放启动失败:视频ID={self.video_id}")
  51. # 等待5分钟后再次触发
  52. logger.info(f"等待 {self.interval_seconds} 秒后再次触发播放")
  53. # 分段等待,以便能够响应停止信号
  54. waited = 0
  55. while waited < self.interval_seconds and not self._should_stop:
  56. sleep_interval = min(1.0, self.interval_seconds - waited) # 每秒检查一次
  57. time.sleep(sleep_interval)
  58. waited += sleep_interval
  59. if self._should_stop:
  60. logger.info("收到停止信号,退出循环")
  61. break
  62. except Exception as e:
  63. logger.error(f"工作线程循环异常: {e}")
  64. time.sleep(1)
  65. except Exception as e:
  66. logger.error(f"工作线程异常: {e}")
  67. finally:
  68. self.is_running = False
  69. logger.info("Kodi空闲时间播放线程结束")
  70. def stop(self):
  71. """停止线程"""
  72. self._should_stop = True
  73. self.is_running = False
  74. logger.info("停止Kodi空闲时间播放线程")
  75. # 全局单例实例
  76. _kodi_free_time_thread = KodiFreeTimeThreadSingleton()
  77. def start_kodi_free_time_play() -> bool:
  78. """
  79. 启动Kodi空闲时间播放
  80. 启动后,线程会每5分钟自动循环播放视频ID 0
  81. Returns:
  82. bool: 启动是否成功
  83. """
  84. if not _kodi_free_time_thread.is_running:
  85. _kodi_free_time_thread._start_worker_thread()
  86. return _kodi_free_time_thread.is_running
  87. def stop_kodi_free_time_play() -> bool:
  88. """
  89. 停止Kodi空闲时间播放
  90. Returns:
  91. bool: 停止是否成功
  92. """
  93. _kodi_free_time_thread.stop()
  94. return True
  95. def is_free_time_play_running() -> bool:
  96. """
  97. 检查空闲时间播放线程是否正在运行
  98. Returns:
  99. bool: 线程是否正在运行
  100. """
  101. return _kodi_free_time_thread.is_running