fix: 修复开启继续播放时歌曲播放不完整问题 (#177)

This commit is contained in:
hui 2024-09-18 20:14:55 +08:00 committed by GitHub
parent 2e53f20d80
commit dcbf4330be
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 27 additions and 3 deletions

View File

@ -142,7 +142,7 @@ var vConsole = new window.VConsole();
<option value="false" selected>false</option> <option value="false" selected>false</option>
</select> </select>
<label for="continue_play">启用继续播放(可能导致兼容性问题及歌曲无法完整播放):</label> <label for="continue_play">启用继续播放(可能导致兼容性问题):</label>
<select id="continue_play"> <select id="continue_play">
<option value="true">true</option> <option value="true">true</option>
<option value="false" selected>false</option> <option value="false" selected>false</option>

View File

@ -536,6 +536,11 @@ class XiaoMusic:
query = new_record.get("query", "").strip() query = new_record.get("query", "").strip()
did = new_record.get("did", "").strip() did = new_record.get("did", "").strip()
await self.do_check_cmd(did, query, False) await self.do_check_cmd(did, query, False)
answers = new_record.get("answers", [{}])
if answers:
answer = answers[0].get("tts", {}).get("text", "").strip()
await self.reset_timer_when_answer(len(answer), did)
self.log.debug(f"query:{query} did:{did} answer:{answer}")
# 匹配命令 # 匹配命令
async def do_check_cmd(self, did="", query="", ctrl_panel=True, **kwargs): async def do_check_cmd(self, did="", query="", ctrl_panel=True, **kwargs):
@ -552,6 +557,10 @@ class XiaoMusic:
except Exception as e: except Exception as e:
self.log.exception(f"Execption {e}") self.log.exception(f"Execption {e}")
# 重置计时器
async def reset_timer_when_answer(self, answer_length, did):
await self.devices[did].reset_timer_when_answer(answer_length)
def append_running_task(self, task): def append_running_task(self, task):
self.running_task.append(task) self.running_task.append(task)
@ -938,6 +947,7 @@ class XiaoMusicDevice:
# 播放进度 # 播放进度
self._start_time = 0 self._start_time = 0
self._duration = 0 self._duration = 0
self._paused_time = 0
# 关机定时器 # 关机定时器
self._stop_timer = None self._stop_timer = None
@ -948,9 +958,9 @@ class XiaoMusicDevice:
return self.device.cur_music return self.device.cur_music
def get_offset_duration(self): def get_offset_duration(self):
if not self._playing: if not self.isplaying():
return -1, -1 return -1, -1
offset = time.time() - self._start_time offset = time.time() - self._start_time - self._paused_time
duration = self._duration duration = self._duration
return offset, duration return offset, duration
@ -1084,6 +1094,7 @@ class XiaoMusicDevice:
sec = sec + self.config.delay_sec sec = sec + self.config.delay_sec
self._start_time = time.time() self._start_time = time.time()
self._duration = sec self._duration = sec
self._paused_time = 0
await self.set_next_music_timeout(sec) await self.set_next_music_timeout(sec)
self.xiaomusic.save_cur_config() self.xiaomusic.save_cur_config()
@ -1335,6 +1346,19 @@ class XiaoMusicDevice:
self.log.error(f"_get_audio_id {e}") self.log.error(f"_get_audio_id {e}")
return str(audio_id) return str(audio_id)
# 重置计时器
async def reset_timer_when_answer(self, answer_length):
if not (self.isplaying() and self.config.continue_play):
return
pause_time = answer_length / 5 + 1
offset, duration = self.get_offset_duration()
self._paused_time += pause_time
new_time = duration - offset + pause_time
await self.set_next_music_timeout(new_time)
self.log.info(
f"reset_timer 延长定时器. answer_length:{answer_length} pause_time:{pause_time}"
)
# 设置下一首歌曲的播放定时器 # 设置下一首歌曲的播放定时器
async def set_next_music_timeout(self, sec): async def set_next_music_timeout(self, sec):
self.cancel_next_timer() self.cancel_next_timer()