优化获取播放时长的问题
This commit is contained in:
parent
049e1a2c38
commit
bad13f01f4
@ -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")
|
||||||
|
@ -7,5 +7,3 @@ SUPPORT_MUSIC_TYPE = [
|
|||||||
|
|
||||||
LATEST_ASK_API = "https://userprofile.mina.mi.com/device_profile/v2/conversation?source=dialogu&hardware={hardware}×tamp={timestamp}&limit=2"
|
LATEST_ASK_API = "https://userprofile.mina.mi.com/device_profile/v2/conversation?source=dialogu&hardware={hardware}×tamp={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}"
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
# 获取文件播放时长
|
# 获取文件播放时长
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user