SimbalsAPI_ID / app.py
PierreHanna's picture
Update app.py
8e37fc1
from simbals_apis_public_clients.clients.services import SimbalsAPIClient
import time
import json
import os
import gradio as gr
from pytube import YouTube
YT_embed_html1 = '<iframe width="560" height="315" src="https://www.youtube.com/embed/'
YT_embed_html2 = '" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>'
SIMBALS_GLOBAL_DB = 1
SIMBALS_MAIN_DATABASE = 2
embed_html1 = '<iframe src="https://open.spotify.com/embed/track/'
embed_html2 = '" width="300" height="380" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>'
def download_audio(id_video):
video = YouTube(id_video,use_oauth=True, allow_oauth_cache=True)
id = id_video.split("?v=")[-1][:11]
print("ID youtube ", id)
audio_streams = video.streams.filter(only_audio=True)
audio_stream = audio_streams[0]
audio_file = audio_stream.download()
audio_parts = audio_file.split('/')[-1]
audio_title = '.'.join(audio_parts.split('.')[:-1])
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):
# 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
except IndexError:
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():
top1 = gr.Audio(label="top1", show_label=True)
id = gr.outputs.Textbox(label="Identification", show_label=True)
id_html = html = gr.HTML()
analyze_url_btn.click(process_url, inputs=[audio_url_input],
outputs=[id, id_html])
analyze_file_btn.click(process_file, inputs=[audio_input_file],
outputs=[id, id_html])
demo.queue(concurrency_count=2)
demo.launch(debug=True)