优化获取播放时长的问题

This commit is contained in:
涵曦 2024-06-28 02:33:12 +00:00
parent 049e1a2c38
commit bad13f01f4
4 changed files with 29 additions and 47 deletions

View File

@ -43,6 +43,7 @@ DEFAULT_KEY_MATCH_ORDER = [
"播放列表", "播放列表",
] ]
@dataclass @dataclass
class Config: class Config:
hardware: str = os.getenv("MI_HARDWARE", "L07A") hardware: str = os.getenv("MI_HARDWARE", "L07A")

View File

@ -7,5 +7,3 @@ SUPPORT_MUSIC_TYPE = [
LATEST_ASK_API = "https://userprofile.mina.mi.com/device_profile/v2/conversation?source=dialogu&hardware={hardware}&timestamp={timestamp}&limit=2" LATEST_ASK_API = "https://userprofile.mina.mi.com/device_profile/v2/conversation?source=dialogu&hardware={hardware}&timestamp={timestamp}&limit=2"
COOKIE_TEMPLATE = "deviceId={device_id}; serviceToken={service_token}; userId={user_id}" COOKIE_TEMPLATE = "deviceId={device_id}; serviceToken={service_token}; userId={user_id}"

View File

@ -208,7 +208,7 @@ async def get_web_music_duration(url, start=0, end=500):
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
}, },
) as response: ) as response:
url = response.url url = str(response.url)
# 设置总超时时间为3秒 # 设置总超时时间为3秒
timeout = aiohttp.ClientTimeout(total=3) timeout = aiohttp.ClientTimeout(total=3)
async with aiohttp.ClientSession(timeout=timeout) as session: async with aiohttp.ClientSession(timeout=timeout) as session:
@ -219,7 +219,7 @@ async def get_web_music_duration(url, start=0, end=500):
) )
except Exception: except Exception:
pass pass
return duration return duration, url
# 获取文件播放时长 # 获取文件播放时长

View File

@ -361,11 +361,27 @@ class XiaoMusic:
url = self._all_music[name] url = self._all_music[name]
return url.startswith(("http://", "https://")) return url.startswith(("http://", "https://"))
# 获取歌曲播放地址和播放时长 # 获取歌曲播放时长,播放地址
def get_music_url_duration(self, name): async def get_music_sec_url(self, name):
sec = 0
url = self.get_music_url(name) url = self.get_music_url(name)
duration = self.get_music_duration(name) if self.is_web_radio_music(name):
return url, duration self.log.info("电台不会有播放时长")
return 0, url
if self.is_web_music(name):
origin_url = url
duration, url = await get_web_music_duration(url)
sec = int(duration)
self.log.info(f"网络歌曲 {name} : {origin_url} {url} 的时长 {sec}")
else:
filename = self.get_filename(name)
sec = int(get_local_music_duration(filename))
self.log.info(f"本地歌曲 {name} : {filename} {url} 的时长 {sec}")
if sec <= 0:
self.log.warning(f"获取歌曲时长失败 {name} {url}")
return sec, url
def get_music_url(self, name): def get_music_url(self, name):
if self.is_web_music(name): if self.is_web_music(name):
@ -502,48 +518,15 @@ class XiaoMusic:
return self.get_next_music() return self.get_next_music()
return name return name
# 获取歌曲播放时长
async def get_music_duration(self, name):
if self.is_web_radio_music(name):
self.log.info("电台不会有播放时长")
return 0
if self.is_web_music(name):
url = self._all_music[name]
duration = await get_web_music_duration(url)
sec = int(duration)
self.log.info(f"网络歌曲 {name}下一首的定时器 的时长 {sec}")
else:
filename = self.get_filename(name)
sec = int(get_local_music_duration(filename))
self.log.info(f"本地歌曲 {name} : {filename} 的时长 {sec}")
# 设置下一首歌曲的播放定时器 # 设置下一首歌曲的播放定时器
async def set_next_music_timeout(self): async def set_next_music_timeout(self, sec):
name = self.cur_music if sec <= 0:
if self.is_web_radio_music(name):
self.log.info("电台不会有下一首的定时器")
return return
if self.is_web_music(name):
url = self._all_music[name]
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: if self._next_timer:
self._next_timer.cancel() self._next_timer.cancel()
self.log.info("定时器已取消") self.log.info("定时器已取消")
if sec <= 0:
self.log.warning("获取歌曲时长失败,不会开启下一首歌曲的定时器")
return
self._timeout = sec self._timeout = sec
async def _do_next(): async def _do_next():
@ -554,7 +537,7 @@ class XiaoMusic:
self.log.warning(f"执行出错 {str(e)}\n{traceback.format_exc()}") self.log.warning(f"执行出错 {str(e)}\n{traceback.format_exc()}")
self._next_timer = asyncio.ensure_future(_do_next()) self._next_timer = asyncio.ensure_future(_do_next())
self.log.info(f"{sec}秒后将会播放下一首") self.log.info(f"{sec}秒后将会播放下一首歌曲")
async def run_forever(self): async def run_forever(self):
StartHTTPServer(self.port, self.music_path, self) StartHTTPServer(self.port, self.music_path, self)
@ -650,7 +633,7 @@ class XiaoMusic:
async def _play_by_music_url(self, device_id, url): async def _play_by_music_url(self, device_id, url):
audio_id = get_random(30) audio_id = get_random(30)
audio_type = "" audio_type = ""
if self.config.hardware in ['LX04', 'X10A', 'X08A']: if self.config.hardware in ["LX04", "X10A", "X08A"]:
audio_type = "MUSIC" audio_type = "MUSIC"
music = { music = {
"payload": { "payload": {
@ -701,13 +684,13 @@ class XiaoMusic:
self._playing = True self._playing = True
self.cur_music = name self.cur_music = name
self.log.info(f"cur_music {self.cur_music}") self.log.info(f"cur_music {self.cur_music}")
url, duration = self.get_music_url_duration(name) sec, url = await self.get_music_sec_url(name)
self.log.info(f"播放 {url}") self.log.info(f"播放 {url}")
await self.force_stop_xiaoai() await self.force_stop_xiaoai()
await self.play_url(url) await self.play_url(url)
self.log.info("已经开始播放了") self.log.info("已经开始播放了")
# 设置下一首歌曲的播放定时器 # 设置下一首歌曲的播放定时器
await self.set_next_music_timeout() await self.set_next_music_timeout(sec)
# 播放歌曲 # 播放歌曲
async def play(self, **kwargs): async def play(self, **kwargs):