dikdimon's picture
Upload extensions using SD-Hub extension
c336648 verified
import os
import gradio as gr
import ui.common.console as uicon
from scripts import util
from scripts.service import image_process, video_process, net_process
@uicon.capture_wrap
def img_process_interface(
src_dir, des_dir,
resize,
resize_fill_color, resize_fill_alpha,
resize_remove_color, resize_remove_alpha, resize_remove_threshold,
rembg_model,
rembg_color, rembg_alpha,
dir_depth
):
# Convert string resize '512x512' into two integers
resize_width, resize_height = map(int, resize.split('x'))
# Check if directories exist, if not create
if not os.path.exists(des_dir):
os.makedirs(des_dir)
if resize_fill_alpha < 0:
resize_fill_color = ''
else:
resize_fill_color = resize_fill_color + hex(resize_fill_alpha)[2:].zfill(2)
if resize_remove_alpha < 0:
resize_remove_color = ''
elif resize_remove_alpha == 0:
resize_remove_color = 'auto'
else:
resize_remove_color = resize_remove_color + hex(resize_remove_alpha)[2:].zfill(2)
if rembg_alpha <= 0:
rembg_color = ''
else:
rembg_color = rembg_color + hex(rembg_alpha)[2:].zfill(2)
image_process.process(
src_dir=src_dir,
des_dir=des_dir,
resize_width=resize_width,
resize_height=resize_height,
resize_fill_color=resize_fill_color,
resize_remove_color=resize_remove_color,
resize_remove_threshold=resize_remove_threshold,
rembg_model=rembg_model,
rembg_color=rembg_color,
recursive_depth=dir_depth,
)
return f"Processed images are saved in {des_dir}"
@uicon.capture_wrap
def media_to_wav_interface(src_file, des_file):
video_process.convert_mp4_to_wav(src_file, des_file)
return f"Converted WAV file is saved as {des_file}"
@uicon.capture_wrap
def media_split_interface(src_dir, des_dir, divider, file_ext):
video_process.duration_split(src_dir, des_dir, divider, file_ext)
return f"Videos split successfully into {des_dir}"
@uicon.capture_wrap
def media_duration_sum_interface(directory):
total_sec = video_process.duration_sum(directory)
t = util.format_time(total_sec)
return f"Total Duration: {t}"
@uicon.capture_wrap
def media_fetch_interface(
src, des, t_start, t_end,
):
output_path, ret = net_process.fetch_by_yt_dlp(
src, des,
t_start, t_end,
)
if output_path is None:
return ret, None
return output_path.resolve(), output_path
def tab_image_process():
with gr.Row():
src_dir = gr.Textbox(label="Source Directory")
with gr.Row():
des_dir = gr.Textbox(label="Destination Directory")
with gr.Row():
resize = gr.Textbox(value="512x512", label="Resize (e.g., 512x512)")
resize_fill_color = gr.ColorPicker(label="Resize Fill Color", value='#000000')
resize_fill_alpha = gr.Slider(label="Resize Fill Alpha", value=-1, minimum=-1, maximum=255)
with gr.Row():
resize_remove_color = gr.ColorPicker(label="Resize Remove Color", value='#000000')
resize_remove_alpha = gr.Slider(label="Resize Remove Alpha", value=-1, minimum=-1, maximum=255)
resize_remove_threshold = gr.Number(label="Resize Remove Threshold", value=100)
with gr.Row():
rembg_model = gr.Dropdown(
label="Remove Background Model "
"| 'none' for no removing "
"| first time executing takes a while ",
value="isnet-anime",
choices=[
"none",
"u2net",
"u2netp",
"u2net_human_seg",
"u2net_cloth_seg",
"silueta",
"isnet-general-use",
"isnet-anime",
"sam"
]
)
rembg_color = gr.ColorPicker(label="Remove Background Color")
rembg_alpha = gr.Slider(label="Remove Background Alpha", value=-1, minimum=-1, maximum=255)
with gr.Row():
dir_depth = gr.Number(label="Directory Depth", value=0)
run_img = gr.Button("Run Image Processing")
with gr.Row():
result = gr.TextArea(label="Result")
run_img.click(
img_process_interface,
inputs=[src_dir, des_dir,
resize,
resize_fill_color, resize_fill_alpha,
resize_remove_color, resize_remove_alpha, resize_remove_threshold,
rembg_model,
rembg_color, rembg_alpha,
dir_depth],
outputs=[result]
)
def tab_video_to_wav():
src_file = gr.Textbox(label="Source Video File")
des_file = gr.Textbox(label="Destination WAV File")
run_wav = gr.Button("Convert to WAV")
result = gr.TextArea(label="Result")
run_wav.click(media_to_wav_interface, inputs=[src_file, des_file], outputs=[result])
def tab_media_split():
split_src_dir = gr.Textbox(label="Source Directory")
split_des_dir = gr.Textbox(label="Destination Directory")
divider = gr.Number(label="Divider", value=2)
file_ext = gr.Textbox(label="File Extension", value="wav")
run_split = gr.Button("Split Video")
result = gr.TextArea(label="Result")
run_split.click(
media_split_interface,
inputs=[split_src_dir, split_des_dir, divider, file_ext],
outputs=[result]
)
def tab_media_sum_duration():
sum_dir = gr.Textbox(label="Directory")
run_sum = gr.Button("Sum Media Duration")
result = gr.TextArea(label="Result")
run_sum.click(media_duration_sum_interface, inputs=[sum_dir], outputs=[result])
def tab_media_fetch():
with gr.Row():
with gr.Column():
text_src_path = gr.Textbox(label="Source Path", value="")
text_des_path = gr.Textbox(label="Destination", value="")
with gr.Group():
with gr.Row():
num_src_start = gr.Number(value=0, label="Start (sec)")
num_src_end = gr.Number(value=0, label="End (sec)")
button_src_url = gr.Button("Fetch Source", variant="primary")
with gr.Row():
text_result = gr.TextArea(label="Result")
with gr.Column():
audio_src = gr.Audio(
label="Source",
interactive=True,
show_download_button=True,
)
button_src_url.click(
fn=media_fetch_interface,
inputs=[
text_src_path, text_des_path,
num_src_start, num_src_end,
],
outputs=[
text_result, audio_src,
]
)
def webui():
with gr.Blocks() as demo:
with gr.Tab("Image"):
tab_image_process()
with gr.Tab("Extract Video Sound"):
tab_video_to_wav()
with gr.Tab("Media Fetch"):
tab_media_fetch()
with gr.Tab("Media Split"):
tab_media_split()
with gr.Tab("Media Duration"):
tab_media_sum_duration()
text_output = gr.Textbox(label="Console")
def clear_output():
uicon.capture_clear()
text_output.value = '[clear]'
clear_button = gr.Button("Clear Output")
clear_button.click(clear_output)
return demo
if __name__ == '__main__':
app = webui()
app.queue().launch(
server_port=10005,
show_error=True,
debug=True
)