优化获取播放时长的逻辑
This commit is contained in:
parent
88fbc503e7
commit
538ac1d485
@ -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}×tamp={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
11
xiaomusic/const.py
Normal 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}×tamp={timestamp}&limit=2"
|
||||
COOKIE_TEMPLATE = "deviceId={device_id}; serviceToken={service_token}; userId={user_id}"
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user