优化获取播放时长的逻辑

This commit is contained in:
涵曦 2024-06-27 23:20:43 +00:00
parent 88fbc503e7
commit 538ac1d485
4 changed files with 55 additions and 19 deletions

View File

@ -1,15 +1,10 @@
from __future__ import annotations from __future__ import annotations
import argparse import argparse
import json import json
import os import os
from dataclasses import dataclass from dataclasses import dataclass
from xiaomusic.utils import validate_proxy from xiaomusic.utils import validate_proxy
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}"
# 默认口令 # 默认口令
DEFAULT_KEY_WORD_DICT = { DEFAULT_KEY_WORD_DICT = {
"播放歌曲": "play", "播放歌曲": "play",
@ -46,14 +41,6 @@ DEFAULT_KEY_MATCH_ORDER = [
"播放列表", "播放列表",
] ]
SUPPORT_MUSIC_TYPE = [
".mp3",
".flac",
".wav",
".ape",
]
@dataclass @dataclass
class Config: class Config:
hardware: str = os.getenv("MI_HARDWARE", "L07A") hardware: str = os.getenv("MI_HARDWARE", "L07A")

11
xiaomusic/const.py Normal file
View File

@ -0,0 +1,11 @@
SUPPORT_MUSIC_TYPE = [
".mp3",
".flac",
".wav",
".ape",
]
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}"

View File

@ -16,6 +16,8 @@ import mutagen
import requests import requests
from requests.utils import cookiejar_from_dict from requests.utils import cookiejar_from_dict
from xiaomusic.const import SUPPORT_MUSIC_TYPE
### HELP FUNCTION ### ### HELP FUNCTION ###
def parse_cookie_string(cookie_string): def parse_cookie_string(cookie_string):
@ -193,6 +195,20 @@ async def _get_web_music_duration(session, url, start=0, end=500):
async def get_web_music_duration(url, start=0, end=500): async def get_web_music_duration(url, start=0, end=500):
duration = 0 duration = 0
try: try:
parsed_url = urlparse(url)
file_path = parsed_url.path
_, extension = os.path.splitext(file_path)
if extension.lower() not in SUPPORT_MUSIC_TYPE:
cleaned_url = parsed_url.geturl()
async with aiohttp.ClientSession() as session:
async with session.get(
cleaned_url,
allow_redirects=True,
headers={
"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:
url = 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:

View File

@ -10,18 +10,18 @@ import time
import traceback import traceback
import urllib.parse import urllib.parse
from pathlib import Path from pathlib import Path
from aiohttp import ClientSession, ClientTimeout from aiohttp import ClientSession, ClientTimeout
from miservice import MiAccount, MiIOService, MiNAService from miservice import MiAccount, MiIOService, MiNAService
from xiaomusic import ( from xiaomusic import (
__version__, __version__,
) )
from xiaomusic.config import ( from xiaomusic.const import (
COOKIE_TEMPLATE, COOKIE_TEMPLATE,
KEY_WORD_ARG_BEFORE_DICT,
LATEST_ASK_API, LATEST_ASK_API,
SUPPORT_MUSIC_TYPE, SUPPORT_MUSIC_TYPE,
)
from xiaomusic.config import (
KEY_WORD_ARG_BEFORE_DICT,
Config, Config,
) )
from xiaomusic.httpserver import StartHTTPServer from xiaomusic.httpserver import StartHTTPServer
@ -359,7 +359,12 @@ 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):
url = self.get_music_url(name)
duration = self.get_music_duration(name)
return url, duration
def get_music_url(self, name): def get_music_url(self, name):
if self.is_web_music(name): if self.is_web_music(name):
url = self._all_music[name] url = self._all_music[name]
@ -495,6 +500,23 @@ 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):
name = self.cur_music name = self.cur_music
@ -673,7 +695,7 @@ 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 = self.get_music_url(name) url, duration = self.get_music_url_duration(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)