Skip to content

Commit

Permalink
优化获取播放时长的逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
hanxi committed Jun 27, 2024
1 parent 88fbc50 commit 538ac1d
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 19 deletions.
13 changes: 0 additions & 13 deletions xiaomusic/config.py
Original file line number Diff line number Diff line change
@@ -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",
Expand Down Expand Up @@ -46,14 +41,6 @@
"播放列表",
]

SUPPORT_MUSIC_TYPE = [
".mp3",
".flac",
".wav",
".ape",
]


@dataclass
class Config:
hardware: str = os.getenv("MI_HARDWARE", "L07A")
Expand Down
11 changes: 11 additions & 0 deletions xiaomusic/const.py
Original file line number Diff line number Diff line change
@@ -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}"


16 changes: 16 additions & 0 deletions xiaomusic/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import requests
from requests.utils import cookiejar_from_dict

from xiaomusic.const import SUPPORT_MUSIC_TYPE


### HELP FUNCTION ###
def parse_cookie_string(cookie_string):
Expand Down Expand Up @@ -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:
Expand Down
34 changes: 28 additions & 6 deletions xiaomusic/xiaomusic.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@
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
Expand Down Expand Up @@ -359,7 +359,12 @@ def is_web_music(self, name):
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]
Expand Down Expand Up @@ -495,6 +500,23 @@ def get_next_music(self):
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
Expand Down Expand Up @@ -673,7 +695,7 @@ async def _playmusic(self, name):
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)
Expand Down

0 comments on commit 538ac1d

Please sign in to comment.