优化获取播放时长的逻辑

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
import argparse
import json
import os
from dataclasses import dataclass
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 = {
"播放歌曲": "play",
@ -46,14 +41,6 @@ DEFAULT_KEY_MATCH_ORDER = [
"播放列表",
]
SUPPORT_MUSIC_TYPE = [
".mp3",
".flac",
".wav",
".ape",
]
@dataclass
class Config:
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
from requests.utils import cookiejar_from_dict
from xiaomusic.const import SUPPORT_MUSIC_TYPE
### HELP FUNCTION ###
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):
duration = 0
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秒
timeout = aiohttp.ClientTimeout(total=3)
async with aiohttp.ClientSession(timeout=timeout) as session:

View File

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