from simbals_apis_public_clients.clients.services import SimbalsAPIClient import time import json import os import gradio as gr import yt_dlp YT_embed_html1 = '' SIMBALS_GLOBAL_DB = 1 SIMBALS_MAIN_DATABASE = 2 embed_html1 = '' def download_audio_(link): with yt_dlp.YoutubeDL({'extract_audio': True, 'format': 'bestaudio', 'outtmpl': '%(title)s.mp3'}) as video: info_dict = video.extract_info(link, download = True) video_title = info_dict['title'] video.download(link) return video_title def download_audio(id_video): id = id_video.split("?v=")[-1][:11] audio_file = download_audio_(id_video) audio_file = audio_file+'.mp3' embed_html_all = YT_embed_html1 + id + YT_embed_html2 return audio_file, audio_file, embed_html_all def process_url(input_path): audio_file, audio_file, embed_html_all = download_audio(input_path) return process(audio_file, embed_html_all) def process_file(input_path): return process(input_path, '') def process(input_path, embed_html_all): # setup the client client = SimbalsAPIClient(os.environ['TOKEN'], debug=True) # init the base parameters with your audio id and an audio url (or a local audio file) parameters = client.prepare_request("31415", audio_file=input_path) # add scanmatch service with full_matches option activated, against a chosen and available database #parameters = client.add_scanmatch_full_matches(parameters, SIMBALS_GLOBAL_DB) # add scanmatch service with partial_matches option activated, against a chosen and available database #parameters = client.add_scanmatch_partial_matches(parameters, SIMBALS_GLOBAL_DB) parameters = client.add_scanmatch_partial_fast_matches(parameters, SIMBALS_GLOBAL_DB) # launch the request and test for ok/code values ok, code, job_id = client.launch_request(parameters) # try to get the results with obtained job_id. If code is 4, job is not finished. In all other cases, job is finished for i in range(1000): results=client.get_results(job_id) if results[0] != 4: print(json.dumps(results[1], indent=1)) #return json.dumps(results[1], indent=1) output = json.dumps(results[1], indent=1) try : trackname = results[1]["response"]["scanmatch"]['1']['partial_fast_matches'][0]['track']['title'] artistname = results[1]["response"]["scanmatch"]['1']['partial_fast_matches'][0]['artists'][0]['name'] isrc = results[1]["response"]["scanmatch"]['1']['partial_fast_matches'][0]['track']['isrc'] id_spotify = -1 for x in results[1]["response"]["scanmatch"]['1']['partial_fast_matches'][0]['track']['other_ids'] : if x['id_type_name'] == "spotify": id_spotify = x['id'] if id_spotify == -1: id_spotify = "No Spotify ID found." output_text = trackname+" by "+artistname + " - ISRC : " + isrc #+ " - spotify ID : " + id_spotify output_html = embed_html1 + id_spotify + embed_html2 return output_text, output_html, embed_html_all except (IndexError, TypeError): return "Not found. Please try again.","","" time.sleep(1) ''' demo = gr.Interface(fn=process, inputs=gr.Audio(type="filepath"), outputs=[gr.outputs.Textbox(label="Identification"),"html"] #examples=example_list, #cache_examples=False ) ''' with gr.Blocks() as demo: with gr.Row(): with gr.Column(): with gr.Row(): #gr.HTML(embed_html) html = gr.HTML() with gr.Row(): with gr.Column(): audio_url_input = gr.Textbox(placeholder='YouTube video URL', label='YouTube video URL') analyze_url_btn = gr.Button('Search from URL') with gr.Row(): with gr.Column(): audio_input_file = gr.Audio(type="filepath", label='Audio Input') analyze_file_btn = gr.Button('Search from file') with gr.Row(): with gr.Column(): id = gr.outputs.Textbox(label="Identification") id_html = gr.HTML() analyze_url_btn.click(process_url, inputs=[audio_url_input], outputs=[id, id_html, html]) analyze_file_btn.click(process_file, inputs=[audio_input_file], outputs=[id, id_html]) demo.queue(concurrency_count=2) demo.launch(debug=True)