parser163 / app.py
admin
upl codes
aa4a3cc
raw
history blame
3.09 kB
import os
import re
import json
import shutil
import requests
import gradio as gr
def get_first_integer(input_string):
match = re.search(r"\d+", input_string)
if match:
return str(int(match.group()))
else:
return ""
def clean_dir(dirpath="./flagged"):
if os.path.exists(dirpath):
shutil.rmtree(dirpath)
if not os.path.exists(dirpath):
os.makedirs(dirpath)
def download_mp3(url: str, local_filename: str):
try:
response = requests.get(url)
if response.status_code == 200:
with open(local_filename, "wb") as f:
f.write(response.content)
print(f"Successfully downloaded: {local_filename}")
return True
else:
print(f"Error: {response.status_code}, {response.text}")
return False
except Exception as e:
print(f"Error: {e}")
return False
def song_info(id: str):
detail_api = "https://music.163.com/api/v3/song/detail"
parm_dict = {"id": id, "c": str([{"id": id}]), "csrf_token": ""}
free = False
song_name = "Failed to get song"
response = requests.get(detail_api, params=parm_dict)
# 检查请求是否成功
if response.status_code == 200:
# 处理成功响应
data = json.loads(response.text)
if data and "songs" in data and data["songs"]:
fee = int(data["songs"][0]["fee"])
free = fee == 0 or fee == 8
song_name = str(data["songs"][0]["name"])
else:
song_name = "The song doesn't exist."
else:
# 处理错误
print(f"Error: {response.status_code}, {response.text}")
return song_name, free
def inference(song: str):
api = "https://music.163.com/song/media/outer/url?id="
fail_voice = "./examples/fail.mp3"
vip_voice = "./examples/vip.mp3"
if not song:
return fail_voice, "Please enter the song ID or link", ""
song_id = song
if "music.163.com" in song_id and not ".mp3" in song_id:
song_id = get_first_integer(song_id.split("?id=")[1])
if not song_id.isdigit():
return fail_voice, "Invalid song ID or link", ""
song_name, free = song_info(song_id)
if song_name == "The song doesn't exist.":
return fail_voice, song_name, ""
clean_dir()
if free:
dld_url = f"{api}{song_id}.mp3"
outpath = f"./flagged/{song_id}.mp3"
if download_mp3(dld_url, outpath):
return outpath, song_name, dld_url
else:
return vip_voice, song_name, ""
if __name__ == "__main__":
iface = gr.Interface(
fn=inference, # 使用 text_to_speech 函数
inputs=gr.Textbox(
label="Enter the song ID or play page url"
), # 输入框用于输入文本
outputs=[
gr.Audio(label="Download mp3", type="filepath"),
gr.Textbox(label="Song title", show_copy_button=True),
gr.Textbox(label="MP3 Direct URL", show_copy_button=True),
],
flagging_mode="never",
)
iface.launch()