import gradio as gr import os,secrets,requests from basic_pitch.inference import predict_and_save from urllib.parse import quote import traceback from deta import Deta # Import Deta # Initialize deta = Deta() # This how to connect to or create a database. last= deta.Base("last") records=deta.Base("records") files=deta.Drive('music') os.system('chmod +x ./pget') def addrecord(video_id,orig,pitmp3,mid,gname,ghint): if not gname or not ghint: return 'E/缺少name或hint.' names=list(set(gname.split('\n'))) lastkey=last.get('last') if not lastkey: thiskey=0 else: thiskey=lastkey['next'] if records.fetch({'vid':video_id}).count>0: return 'Already In' #upload file src print(files.put(name=orig,path=orig)) print(files.put(name=pitmp3,path=pitmp3)) print(files.put(name=mid,path=mid)) print(records.put({"vid":video_id,"name":names,"hint":ghint,"orig":orig,"pitmp3":pitmp3,"mid":mid},str(thiskey))) print(last.put({'next':thiskey+1},'last')) return 'OK' def downloadaud(video_id,gname,ghint): try: filename=secrets.token_hex() # Step 1: Search for videos with the given query if not video_id: return None # Step 3: Get the formats for the video and find the URL for the best audio-only format formats_url = f"https://draw-8fj.begin.app/api/info/{video_id}" formats = requests.get(formats_url) if formats.ok!=True: formats_url = f"https://draw-8fj-staging.begin.app/api/info/{video_id}" formats = requests.get(formats_url) formats_response=formats.json() #print(formats_response["formats"]) best_audio_format = None for fmt in formats_response.get("formats", []): if fmt.get("hasVideo") is False and fmt.get("hasAudio") is True and fmt.get("container") == "mp4": if not best_audio_format or fmt.get("audioBitrate") > best_audio_format.get("audioBitrate"): best_audio_format = fmt print(best_audio_format) # If no suitable audio format was found, return None if not best_audio_format: return None aurl=best_audio_format["url"] print(aurl) command = f'./pget -o {filename}.mp4 -p 4 "{aurl}" ' os.system(command) os.system(f'ffmpeg -i {filename}.mp4 -q:a 0 -map a {filename}.mp3') os.system(f'mv {filename}.mp3 /tmp/{filename}.mp3') o,m,i= predict(f'/tmp/{filename}.mp3') res=addrecord(video_id,o,m,i,gname,ghint) return o,m,i,res except Exception as e: print(traceback.print_exc(e)) def predict(ina): fn=ina predict_and_save( [ina], '/'.join(ina.split('/')[:-1]), True, True, False, False, ) ina='.'.join(ina.split('.')[:-1]) ina=ina+'_basic_pitch' os.system(f'ffmpeg -i "{ina}.wav" -f mp3 -acodec libmp3lame -y "{ina}.mp3"') return f'{fn}',f'{ina}.mp3',f'{ina}.mid' aud=gr.Textbox(label="视频ID,最长三分半(YouTube视频地址栏的?v=xxxx&...的xxxx)") g_name=gr.TextArea(label="游戏名称(谜底),回车分名称,一行一个") g_hint=gr.TextArea(label="开发厂商、发售日期(提示)") oar=gr.Audio(label="下载的音频") oa=gr.Audio(label="预览midi") pf=gr.File(label="下载midi") res=gr.Textbox(label="结果") demo = gr.Interface(fn=downloadaud, inputs=[aud,g_name,g_hint], outputs=[oar,oa,pf,res]) demo.launch()