diff --git a/xiaomusic/utils.py b/xiaomusic/utils.py index b1610d4..6734398 100644 --- a/xiaomusic/utils.py +++ b/xiaomusic/utils.py @@ -166,29 +166,44 @@ def downloadfile(url): return ("Unknow Error", "") -async def get_web_music_duration(url, start=0, end=500): +async def _get_web_music_duration(session, url, start=0, end=500): + duration = 0 headers = {"Range": f"bytes={start}-{end}"} - async with aiohttp.ClientSession() as session: - async with session.get(url, headers=headers) as response: - array_buffer = await response.read() - with tempfile.NamedTemporaryFile() as tmp: + async with session.get(url, headers=headers) as response: + array_buffer = await response.read() + with tempfile.NamedTemporaryFile(delete=False) as tmp: tmp.write(array_buffer) - try: - m = mutagen.File(tmp) - except Exception: - headers = {"Range": f"bytes={0}-{1000}"} - async with session.get(url, headers=headers) as response: - array_buffer = await response.read() - with tempfile.NamedTemporaryFile() as tmp2: - tmp2.write(array_buffer) - m = mutagen.File(tmp2) - return m.info.length + name = tmp.name + + try: + m = mutagen.File(name) + duration = m.info.length + except Exception: + pass + os.remove(name) + return duration + + +async def get_web_music_duration(url, start=0, end=500): + duration = 0 + try: + # 设置总超时时间为3秒 + timeout = aiohttp.ClientTimeout(total=3) + async with aiohttp.ClientSession(timeout=timeout) as session: + duration = await _get_web_music_duration(session, url, start=0, end=500) + if duration <= 0: + duration = await _get_web_music_duration(session, url, start=0, end=1000) + except Exception: + pass + return duration # 获取文件播放时长 def get_local_music_duration(filename): - # 获取音频文件对象 - audio = mutagen.File(filename) - # 获取播放时长 - duration = audio.info.length + duration = 0 + try: + m = mutagen.File(filename) + duration = m.info.length + except Exception: + pass return duration diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py index 9491162..59fc1fb 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -498,20 +498,27 @@ class XiaoMusic: async def set_next_music_timeout(self): name = self.cur_music if self.is_web_radio_music(name): - self.log.info("歌曲电台不会有下一首的定时器") + self.log.info("电台不会有下一首的定时器") return if self.is_web_music(name): url = self._all_music[name] - sec = int(await get_web_music_duration(url)) + duration = await get_web_music_duration(url) + sec = int(duration) self.log.info(f"网络歌曲 {name} : {url} 的时长 {sec} 秒") else: filename = self.get_filename(name) sec = int(get_local_music_duration(filename)) self.log.info(f"本地歌曲 {name} : {filename} 的时长 {sec} 秒") + if self._next_timer: self._next_timer.cancel() self.log.info("定时器已取消") + + if sec <= 0: + self.log.warning("获取歌曲时长失败,不会开启下一首歌曲的定时器") + return + self._timeout = sec async def _do_next():