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