refactor: ffmpeg_location 从配置里读取
This commit is contained in:
parent
5bf62c4b1a
commit
d3895f2632
@ -136,7 +136,7 @@ def main():
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
filename = config.getsettingfile()
|
filename = config.getsettingfile()
|
||||||
with open(filename,encoding="utf-8") as f:
|
with open(filename, encoding="utf-8") as f:
|
||||||
data = json.loads(f.read())
|
data = json.loads(f.read())
|
||||||
config.update_config(data)
|
config.update_config(data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -194,7 +194,7 @@ def is_m4a(url):
|
|||||||
return url.endswith(".m4a")
|
return url.endswith(".m4a")
|
||||||
|
|
||||||
|
|
||||||
async def _get_web_music_duration(session, url, start=0, end=500):
|
async def _get_web_music_duration(session, url, ffmpeg_location, start=0, end=500):
|
||||||
duration = 0
|
duration = 0
|
||||||
headers = {"Range": f"bytes={start}-{end}"}
|
headers = {"Range": f"bytes={start}-{end}"}
|
||||||
async with session.get(url, headers=headers) as response:
|
async with session.get(url, headers=headers) as response:
|
||||||
@ -205,7 +205,7 @@ async def _get_web_music_duration(session, url, start=0, end=500):
|
|||||||
if is_mp3(url):
|
if is_mp3(url):
|
||||||
m = mutagen.mp3.MP3(tmp)
|
m = mutagen.mp3.MP3(tmp)
|
||||||
elif is_m4a(url):
|
elif is_m4a(url):
|
||||||
return get_duration_by_ffprobe(tmp)
|
return get_duration_by_ffprobe(tmp, ffmpeg_location)
|
||||||
else:
|
else:
|
||||||
m = mutagen.File(tmp)
|
m = mutagen.File(tmp)
|
||||||
duration = m.info.length
|
duration = m.info.length
|
||||||
@ -214,7 +214,7 @@ async def _get_web_music_duration(session, url, start=0, end=500):
|
|||||||
return duration
|
return duration
|
||||||
|
|
||||||
|
|
||||||
async def get_web_music_duration(url):
|
async def get_web_music_duration(url, ffmpeg_location="./ffmpeg/bin"):
|
||||||
duration = 0
|
duration = 0
|
||||||
try:
|
try:
|
||||||
parsed_url = urlparse(url)
|
parsed_url = urlparse(url)
|
||||||
@ -234,10 +234,12 @@ async def get_web_music_duration(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:
|
||||||
duration = await _get_web_music_duration(session, url, start=0, end=500)
|
duration = await _get_web_music_duration(
|
||||||
|
session, url, ffmpeg_location, start=0, end=500
|
||||||
|
)
|
||||||
if duration <= 0:
|
if duration <= 0:
|
||||||
duration = await _get_web_music_duration(
|
duration = await _get_web_music_duration(
|
||||||
session, url, start=0, end=3000
|
session, url, ffmpeg_location, start=0, end=3000
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error get_web_music_duration: {e}")
|
logging.error(f"Error get_web_music_duration: {e}")
|
||||||
@ -245,14 +247,14 @@ async def get_web_music_duration(url):
|
|||||||
|
|
||||||
|
|
||||||
# 获取文件播放时长
|
# 获取文件播放时长
|
||||||
async def get_local_music_duration(filename):
|
async def get_local_music_duration(filename, ffmpeg_location="./ffmpeg/bin"):
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
duration = 0
|
duration = 0
|
||||||
try:
|
try:
|
||||||
if is_mp3(filename):
|
if is_mp3(filename):
|
||||||
m = await loop.run_in_executor(None, mutagen.mp3.MP3, filename)
|
m = await loop.run_in_executor(None, mutagen.mp3.MP3, filename)
|
||||||
elif is_m4a(filename):
|
elif is_m4a(filename):
|
||||||
duration = get_duration_by_ffprobe(filename)
|
duration = get_duration_by_ffprobe(filename, ffmpeg_location)
|
||||||
return duration
|
return duration
|
||||||
else:
|
else:
|
||||||
m = await loop.run_in_executor(None, mutagen.File, filename)
|
m = await loop.run_in_executor(None, mutagen.File, filename)
|
||||||
@ -262,27 +264,33 @@ async def get_local_music_duration(filename):
|
|||||||
return duration
|
return duration
|
||||||
|
|
||||||
|
|
||||||
def get_duration_by_ffprobe(file_path):
|
def get_duration_by_ffprobe(file_path, ffmpeg_location):
|
||||||
# 使用 ffprobe 获取文件的元数据,并以 JSON 格式输出
|
# 使用 ffprobe 获取文件的元数据,并以 JSON 格式输出
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
[ os.path.join(os.getenv("XIAOMUSIC_FFMPEG_LOCATION", "./ffmpeg/bin"),"ffprobe"),
|
[
|
||||||
"-v", "error", # 只输出错误信息,避免混杂在其他输出中
|
os.path.join(ffmpeg_location, "ffprobe"),
|
||||||
"-show_entries", "format=duration", # 仅显示时长
|
"-v",
|
||||||
"-of", "json", # 以 JSON 格式输出
|
"error", # 只输出错误信息,避免混杂在其他输出中
|
||||||
file_path
|
"-show_entries",
|
||||||
|
"format=duration", # 仅显示时长
|
||||||
|
"-of",
|
||||||
|
"json", # 以 JSON 格式输出
|
||||||
|
file_path,
|
||||||
],
|
],
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
universal_newlines=True
|
text=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
# 解析 JSON 输出
|
# 解析 JSON 输出
|
||||||
ffprobe_output = json.loads(result.stdout)
|
ffprobe_output = json.loads(result.stdout)
|
||||||
|
|
||||||
# 获取时长
|
# 获取时长
|
||||||
duration = float(ffprobe_output['format']['duration'])
|
duration = float(ffprobe_output["format"]["duration"])
|
||||||
|
|
||||||
return duration
|
return duration
|
||||||
|
|
||||||
|
|
||||||
def get_random(length):
|
def get_random(length):
|
||||||
return "".join(random.sample(string.ascii_letters + string.digits, length))
|
return "".join(random.sample(string.ascii_letters + string.digits, length))
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ class XiaoMusic:
|
|||||||
self.log.error(f"{self.mi_token_home} file not exist")
|
self.log.error(f"{self.mi_token_home} file not exist")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
with open(self.mi_token_home,encoding="utf-8") as f:
|
with open(self.mi_token_home, encoding="utf-8") as f:
|
||||||
user_data = json.loads(f.read())
|
user_data = json.loads(f.read())
|
||||||
user_id = user_data.get("userId")
|
user_id = user_data.get("userId")
|
||||||
service_token = user_data.get("micoapi")[1]
|
service_token = user_data.get("micoapi")[1]
|
||||||
@ -353,13 +353,17 @@ class XiaoMusic:
|
|||||||
|
|
||||||
if self.is_web_music(name):
|
if self.is_web_music(name):
|
||||||
origin_url = url
|
origin_url = url
|
||||||
duration, url = await get_web_music_duration(url)
|
duration, url = await get_web_music_duration(
|
||||||
|
url, self.config.ffmpeg_location
|
||||||
|
)
|
||||||
sec = math.ceil(duration)
|
sec = math.ceil(duration)
|
||||||
self.log.info(f"网络歌曲 {name} : {origin_url} {url} 的时长 {sec} 秒")
|
self.log.info(f"网络歌曲 {name} : {origin_url} {url} 的时长 {sec} 秒")
|
||||||
else:
|
else:
|
||||||
filename = self.get_filename(name)
|
filename = self.get_filename(name)
|
||||||
self.log.info(f"get_music_sec_url. name:{name} filename:{filename}")
|
self.log.info(f"get_music_sec_url. name:{name} filename:{filename}")
|
||||||
duration = await get_local_music_duration(filename)
|
duration = await get_local_music_duration(
|
||||||
|
filename, self.config.ffmpeg_location
|
||||||
|
)
|
||||||
sec = math.ceil(duration)
|
sec = math.ceil(duration)
|
||||||
self.log.info(f"本地歌曲 {name} : {filename} {url} 的时长 {sec} 秒")
|
self.log.info(f"本地歌曲 {name} : {filename} {url} 的时长 {sec} 秒")
|
||||||
|
|
||||||
@ -752,7 +756,7 @@ class XiaoMusic:
|
|||||||
def try_init_setting(self):
|
def try_init_setting(self):
|
||||||
try:
|
try:
|
||||||
filename = self.config.getsettingfile()
|
filename = self.config.getsettingfile()
|
||||||
with open(filename,encoding="utf-8") as f:
|
with open(filename, encoding="utf-8") as f:
|
||||||
data = json.loads(f.read())
|
data = json.loads(f.read())
|
||||||
self.update_config_from_setting(data)
|
self.update_config_from_setting(data)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
|
Loading…
Reference in New Issue
Block a user