Shit / ui /tabs /extras_tab.py
brentph504's picture
Upload 58 files
632bd54 verified
import os
import gradio as gr
import shutil
import roop.utilities as util
import roop.util_ffmpeg as ffmpeg
import roop.globals
from roop.utilities import clean_dir
frame_filters_map = {
"Colorize B/W Images (Deoldify Artistic)": {
"colorizer": {"subtype": "deoldify_artistic"}
},
"Colorize B/W Images (Deoldify Stable)": {
"colorizer": {"subtype": "deoldify_stable"}
},
"Background remove": {"removebg": {"subtype": ""}},
"Filter Stylize": {"filter_generic": {"subtype": "stylize"}},
"Filter Detail Enhance": {"filter_generic": {"subtype": "detailenhance"}},
"Filter Pencil Sketch": {"filter_generic": {"subtype": "pencil"}},
"Filter Cartoon": {"filter_generic": {"subtype": "cartoon"}},
"Filter C64": {"filter_generic": {"subtype": "C64"}},
}
frame_upscalers_map = {
"ESRGAN x2": {"upscale": {"subtype": "esrganx2"}},
"ESRGAN x4": {"upscale": {"subtype": "esrganx4"}},
"LSDIR x4": {"upscale": {"subtype": "lsdirx4"}},
}
def extras_tab():
filternames = ["None"]
for f in frame_filters_map.keys():
filternames.append(f)
upscalernames = ["None"]
for f in frame_upscalers_map.keys():
upscalernames.append(f)
with gr.Tab("🎉 Extras"):
with gr.Row():
files_to_process = gr.Files(
label="File(s) to process",
file_count="multiple",
file_types=["image", "video"],
)
with gr.Row(variant="panel"):
with gr.Accordion(label="Video/GIF", open=False):
with gr.Row(variant="panel"):
with gr.Column():
gr.Markdown("""
# Poor man's video editor
Re-encoding uses your configuration from the Settings Tab.
""")
with gr.Column():
cut_start_time = gr.Slider(
0,
1000000,
value=0,
label="Start Frame",
step=1.0,
interactive=True,
)
with gr.Column():
cut_end_time = gr.Slider(
1,
1000000,
value=1,
label="End Frame",
step=1.0,
interactive=True,
)
with gr.Column():
extras_chk_encode = gr.Checkbox(
label="Re-encode videos (necessary for videos with different codecs)",
value=False,
)
start_cut_video = gr.Button("Cut video")
start_extract_frames = gr.Button("Extract frames")
start_join_videos = gr.Button("Join videos")
with gr.Row(variant="panel"):
with gr.Column():
gr.Markdown("""
# Create video/gif from images
""")
with gr.Column():
extras_fps = gr.Slider(
minimum=0,
maximum=120,
value=30,
label="Video FPS",
step=1.0,
interactive=True,
)
extras_images_folder = gr.Textbox(
show_label=False, placeholder="/content/", interactive=True
)
with gr.Column():
extras_chk_creategif = gr.Checkbox(
label="Create GIF from video", value=False
)
extras_create_video = gr.Button("Create")
with gr.Row(variant="panel"):
with gr.Column():
gr.Markdown("""
# Create video from gif
""")
with gr.Column():
extras_video_fps = gr.Slider(
minimum=0,
maximum=120,
value=0,
label="Video FPS",
step=1.0,
interactive=True,
)
with gr.Column():
extras_create_video_from_gif = gr.Button("Create")
with gr.Row(variant="panel"):
with gr.Column(scale=2):
gr.Markdown("""
# Repair video
Uses FFMpeg to fix corrupt videos.
""")
with gr.Column():
extras_repair_video = gr.Button("Repair")
with gr.Row(variant="panel"):
with gr.Accordion(label="Full frame processing", open=True):
with gr.Row(variant="panel"):
filterselection = gr.Dropdown(
filternames,
value="None",
label="Colorizer/FilterFX",
interactive=True,
)
upscalerselection = gr.Dropdown(
upscalernames, value="None", label="Enhancer", interactive=True
)
with gr.Row(variant="panel"):
start_frame_process = gr.Button("Start processing")
with gr.Row():
gr.Button("👀 Open Output Folder", size="sm").click(
fn=lambda: util.open_folder(roop.globals.output_path)
)
with gr.Row():
extra_files_output = gr.Files(
label="Resulting output files", file_count="multiple"
)
start_cut_video.click(
fn=on_cut_video,
inputs=[files_to_process, cut_start_time, cut_end_time, extras_chk_encode],
outputs=[extra_files_output],
)
start_extract_frames.click(
fn=on_extras_extract_frames,
inputs=[files_to_process],
outputs=[extra_files_output],
)
start_join_videos.click(
fn=on_join_videos,
inputs=[files_to_process, extras_chk_encode],
outputs=[extra_files_output],
)
extras_create_video.click(
fn=on_extras_create_video,
inputs=[
files_to_process,
extras_images_folder,
extras_fps,
extras_chk_creategif,
],
outputs=[extra_files_output],
)
extras_create_video_from_gif.click(
fn=on_extras_create_video_from_gif,
inputs=[files_to_process, extras_video_fps],
outputs=[extra_files_output],
)
extras_repair_video.click(
fn=on_extras_repair_video,
inputs=[files_to_process],
outputs=[extra_files_output],
)
start_frame_process.click(
fn=on_frame_process,
inputs=[files_to_process, filterselection, upscalerselection],
outputs=[extra_files_output],
)
def on_cut_video(files, cut_start_frame, cut_end_frame, reencode):
if files is None:
return None
resultfiles = []
for tf in files:
f = tf.name
destfile = util.get_destfilename_from_path(f, roop.globals.output_path, "_cut")
ffmpeg.cut_video(f, destfile, cut_start_frame, cut_end_frame, reencode)
if os.path.isfile(destfile):
resultfiles.append(destfile)
else:
gr.Error("Cutting video failed!")
return resultfiles
def on_join_videos(files, chk_encode):
if files is None:
return None
filenames = []
for f in files:
filenames.append(f.name)
destfile = util.get_destfilename_from_path(
filenames[0], roop.globals.output_path, "_join"
)
sorted_filenames = util.sort_filenames_ignore_path(filenames)
ffmpeg.join_videos(sorted_filenames, destfile, not chk_encode)
resultfiles = []
if os.path.isfile(destfile):
resultfiles.append(destfile)
else:
gr.Error("Joining videos failed!")
return resultfiles
def on_extras_create_video_from_gif(files, fps):
if files is None:
return None
filenames = []
resultfiles = []
for f in files:
filenames.append(f.name)
destfilename = os.path.join(
roop.globals.output_path, "img2video." + roop.globals.CFG.output_video_format
)
ffmpeg.create_video_from_gif(filenames[0], destfilename)
if os.path.isfile(destfilename):
resultfiles.append(destfilename)
return resultfiles
def on_extras_repair_video(files):
if files is None:
return None
resultfiles = []
for tf in files:
f = tf.name
destfile = util.get_destfilename_from_path(
f, roop.globals.output_path, "_repair"
)
ffmpeg.repair_video(f, destfile)
if os.path.isfile(destfile):
resultfiles.append(destfile)
else:
gr.Error("Repairing video failed!")
return resultfiles
def on_extras_create_video(files, images_path, fps, create_gif):
if images_path is None:
return None
resultfiles = []
if len(files) > 0 and util.is_video(files[0]) and create_gif:
destfilename = files[0]
else:
util.sort_rename_frames(os.path.dirname(images_path))
destfilename = os.path.join(
roop.globals.output_path,
"img2video." + roop.globals.CFG.output_video_format,
)
ffmpeg.create_video("", destfilename, fps, images_path)
if os.path.isfile(destfilename):
resultfiles.append(destfilename)
else:
return None
if create_gif:
gifname = util.get_destfilename_from_path(destfilename, "./output", ".gif")
ffmpeg.create_gif_from_video(destfilename, gifname)
if os.path.isfile(destfilename):
resultfiles.append(gifname)
return resultfiles
def on_extras_extract_frames(files):
if files is None:
return None
resultfiles = []
for tf in files:
f = tf.name
resfolder = ffmpeg.extract_frames(f)
for file in os.listdir(resfolder):
outfile = os.path.join(resfolder, file)
if os.path.isfile(outfile):
resultfiles.append(outfile)
return resultfiles
def on_frame_process(files, filterselection, upscaleselection):
import pathlib
from roop.core import batch_process_with_options
from roop.ProcessEntry import ProcessEntry
from roop.ProcessOptions import ProcessOptions
from ui.main import prepare_environment
if files is None:
return None
if roop.globals.CFG.clear_output:
clean_dir(roop.globals.output_path)
prepare_environment()
list_files_process: list[ProcessEntry] = []
for tf in files:
list_files_process.append(ProcessEntry(tf.name, 0, 0, 0))
processoroptions = {}
filter = next((x for x in frame_filters_map.keys() if x == filterselection), None)
if filter is not None:
processoroptions.update(frame_filters_map[filter])
filter = next(
(x for x in frame_upscalers_map.keys() if x == upscaleselection), None
)
if filter is not None:
processoroptions.update(frame_upscalers_map[filter])
options = ProcessOptions(
None, processoroptions, 0, 0, "all", 0, None, None, 0, 128, False, False
)
batch_process_with_options(list_files_process, options, None)
outdir = pathlib.Path(roop.globals.output_path)
outfiles = [str(item) for item in outdir.rglob("*") if item.is_file()]
return outfiles