import json import os import pathlib import threading import time from pathlib import Path from shutil import rmtree import anvil.server import anvil.media import gradio as gr import requests import asyncio import httpx from download import download_generator @anvil.server.callable() def call_gradio_self_api(api_name='test_api', data=[]): gradio_url = f"http://127.0.0.1:8111/api/{api_name}" payload = json.dumps({"data": data}) headers = { 'accept': 'application/json', 'Content-Type': 'application/json' } print(f"Calling {gradio_url} with {payload}") resp = requests.request("POST", gradio_url, headers=headers, data=payload) print(resp.text) return resp.text def remote_download(url): print(f"remote_download: Downloading {url}") final_response = '' subbed_video_media = None for response in download_generator(url): final_response = response['message'] print(final_response) if 'sub_video' in response: subbed_video_media = anvil.media.from_file(response['sub_video']) return final_response, subbed_video_media def test_api(url=''): print(f'Request from Anvil with URL {url}, faking a long ass request that takes 15 seconds') time.sleep(15) # fake a long ass request that takes 15 seconds # TODO: add a video output here to test how events are done # TODO: add an anvil server pingback to show we completed the queue operation return f"I've slept for 15 seconds and now I'm done. " def render_api_elements(url_input): with gr.Group() as api_buttons: # This is a hack to get APIs registered with the blocks interface gr.Button("API", visible=False)\ .click(api_name='cleanup_output_dir', fn=cleanup_output_dir, queue=True, inputs=[], outputs=[]) gr.Button("API", visible=False)\ .click(api_name='test_api', queue=True, fn=test_api, inputs=[url_input], outputs=[]) gr.Button("remote_download", visible=False)\ .click(api_name='remote_download', queue=True, fn=remote_download, inputs=[url_input], outputs=[]) return api_buttons @anvil.server.callable def cleanup_output_dir(): #make sure we're in the main directory os.chdir(pathlib.Path(__file__).parent.parent.absolute()) #delete the output directory contents for path in Path("output").glob("**/*"): if path.is_file(): path.unlink() elif path.is_dir(): rmtree(path)