admin
fix qmusic & kuwo
a3f92d6
raw
history blame
4.68 kB
import os
import re
import requests
import gradio as gr
from utils import download_file, TIMEOUT, API_KUWO, TMP_DIR, EN_US
ZH2EN = {
"请输入酷我音乐 ID 或 URL 链接": "Please enter Kuwo music ID or URL Link",
"含元信息音频下载": "Audio with metadata",
"歌名": "Title",
"作者": "Artist",
"专辑": "Album",
"歌词": "Lyrics",
"歌曲图片": "Cover",
"歌曲 ID": "Song ID",
"音质": "Quality",
"大小": "Size",
"酷我音乐无损解析": "Kuwo Music URL Parser without Loss",
"状态栏": "Status",
}
def _L(zh_txt: str):
return ZH2EN[zh_txt] if EN_US else zh_txt
def parse_id(url: str):
if not url:
return None
if url.isdigit():
return int(url)
match = re.search(r"/(\d+)", url)
if match:
return match.group(0)[1:]
else:
return None
def get_file_size(file_path):
size_in_bytes = os.path.getsize(file_path)
units = ["B", "KB", "MB", "GB"]
unit_index = 0 # 初始单位为字节
# 根据文件大小选择合适的单位
if size_in_bytes >= 1024**3: # 大于等于 1 GB
unit_index = 3
size = size_in_bytes / (1024**3)
elif size_in_bytes >= 1024**2: # 大于等于 1 MB
unit_index = 2
size = size_in_bytes / (1024**2)
elif size_in_bytes >= 1024: # 大于等于 1 KB
unit_index = 1
size = size_in_bytes / 1024
else:
size = size_in_bytes
# 格式化输出,保留两位小数
if unit_index == 0:
return f"{size}{units[unit_index]}"
else:
return f"{size:.2f}{units[unit_index]}"
# outer func requires try except
def infer(url: str):
status = "Success"
song = title = cover = artist = album = quality = size = lyric = None
try:
song_id = parse_id(url)
if not song_id:
raise ValueError("请输入有效的网址或ID!")
response = requests.get(
API_KUWO,
params={"id": song_id},
timeout=TIMEOUT,
verify=False,
)
if response.status_code == 200:
if response.json()["code"] != 200:
raise ConnectionError(response.json()["msg"])
data = response.json()["data"]
title = data["title"]
artist = data["singer"]
album = data["album"]
lyric = data["lrc"]
if "获取歌词失败,请检查歌曲信息是否正确!" in lyric:
lyric = "[00:00:00]此歌曲为没有填词的纯音乐,请您欣赏"
cover = data["cover"]
quality = data["quality"]
size: str = data["size"]
song = download_file(
song_id,
data["url"],
title,
artist,
album,
lyric,
cover,
f"{TMP_DIR}/kuwo",
)
size = size.upper() if size else get_file_size(song)
else:
raise ConnectionError(f"HTTP {response.status_code}")
except Exception as e:
status = f"{e}"
return status, song, title, artist, album, lyric, cover, song_id, quality, size
def kuwo_parser():
return gr.Interface(
fn=infer,
inputs=[
gr.Textbox(
label=_L("请输入酷我音乐 ID 或 URL 链接"),
placeholder="https://kuwo.cn/play_detail/*",
)
],
outputs=[
gr.Textbox(label=_L("状态栏"), show_copy_button=True),
gr.Audio(
label=_L("含元信息音频下载"),
show_download_button=True,
show_share_button=False,
),
gr.Textbox(label=_L("歌名"), show_copy_button=True),
gr.Textbox(label=_L("作者"), show_copy_button=True),
gr.Textbox(label=_L("专辑"), show_copy_button=True),
gr.TextArea(label=_L("歌词"), show_copy_button=True),
gr.Image(label=_L("歌曲图片"), show_share_button=False),
gr.Textbox(label=_L("歌曲 ID"), show_copy_button=True),
gr.Textbox(label=_L("音质"), show_copy_button=True),
gr.Textbox(label=_L("大小"), show_copy_button=True),
],
title=_L("酷我音乐无损解析"),
flagging_mode="never",
examples=[
"237668532",
"https://kuwo.cn/play_detail/237668532",
"https://m.kuwo.cn/newh5app/play_detail/237668532",
"https://m.kuwo.cn/yinyue/237668532?f=ip&t=usercopy&prod_from=kwplayersimple",
],
cache_examples=False,
)