Spaces:
Sleeping
Sleeping
import gradio as gr | |
import subprocess | |
import os | |
import shutil | |
# Function to install Rust and Cargo, clone and build avif-decode | |
def setup_avif_decode(): | |
# Install Rust and Cargo | |
if not os.path.exists(os.path.expanduser("~/.cargo/bin/cargo")): | |
subprocess.run("curl https://sh.rustup.rs -sSf | sh -s -- -y", shell=True, check=True) | |
os.environ['PATH'] += os.pathsep + os.path.expanduser("~/.cargo/bin") | |
# Clone avif-decode if it doesn't exist | |
if not os.path.exists("avif-decode"): | |
subprocess.run("git clone https://github.com/kornelski/avif-decode.git", shell=True, check=True) | |
# Build avif-decode | |
subprocess.run("cd avif-decode && cargo build --release", shell=True, check=True) | |
# Call setup function to ensure everything is installed and built | |
setup_avif_decode() | |
# Define the function to convert AVIF to PNG | |
def convert_avif_to_png(avif_file): | |
avif_path = avif_file.name | |
png_path = avif_path.rsplit('.', 1)[0] + '.png' | |
# Run the avif-decode command | |
result = subprocess.run(["avif-decode/target/release/avif_decode", "-f", avif_path, png_path], capture_output=True, text=True) | |
if result.returncode == 0: | |
return png_path | |
else: | |
return f"Error converting {avif_file.name}: {result.stderr}" | |
css = """ | |
#col-container { | |
margin: 0 auto; | |
max-width: 520px; | |
} | |
""" | |
with gr.Blocks(css=css) as demo: | |
with gr.Column(elem_id="col-container"): | |
gr.Markdown(""" | |
# AVIF to PNG Converter | |
Upload your AVIF files and get them converted to PNG. | |
""") | |
with gr.Row(): | |
avif_file = gr.File( | |
label="Upload AVIF File", | |
file_types=[".avif"], | |
file_count="multiple" | |
) | |
run_button = gr.Button("Convert", scale=0) | |
result = gr.Gallery(label="Result") | |
run_button.click( | |
fn=convert_avif_to_png, | |
inputs=[avif_file], | |
outputs=[result] | |
) | |
demo.queue().launch() | |