From 538ac1d485a4157c63712cf6efc4225b67c9fec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Thu, 27 Jun 2024 23:20:43 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=8E=B7=E5=8F=96=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E6=97=B6=E9=95=BF=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/config.py | 13 ------------- xiaomusic/const.py | 11 +++++++++++ xiaomusic/utils.py | 16 ++++++++++++++++ xiaomusic/xiaomusic.py | 34 ++++++++++++++++++++++++++++------ 4 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 xiaomusic/const.py diff --git a/xiaomusic/config.py b/xiaomusic/config.py index 74c9f6978..367694dac 100644 --- a/xiaomusic/config.py +++ b/xiaomusic/config.py @@ -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 @@ "播放列表", ] -SUPPORT_MUSIC_TYPE = [ - ".mp3", - ".flac", - ".wav", - ".ape", -] - - @dataclass class Config: hardware: str = os.getenv("MI_HARDWARE", "L07A") diff --git a/xiaomusic/const.py b/xiaomusic/const.py new file mode 100644 index 000000000..6b9ebc67a --- /dev/null +++ b/xiaomusic/const.py @@ -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}" + + diff --git a/xiaomusic/utils.py b/xiaomusic/utils.py index bed0bcce7..5c423034b 100644 --- a/xiaomusic/utils.py +++ b/xiaomusic/utils.py @@ -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): @@ -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: diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py index 33029a2f3..f4976de25 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -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 @@ -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] @@ -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 @@ -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)