refactor: ffmpeg_location 从配置里读取

This commit is contained in:
涵曦 2024-09-03 14:33:20 +00:00
parent 5bf62c4b1a
commit d3895f2632
3 changed files with 32 additions and 20 deletions

View File

@ -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:

View File

@ -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))

View File

@ -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: