Spaces:
Running
Running
import json | |
from pprint import pprint | |
from tempfile import _TemporaryFileWrapper | |
import gradio as gr | |
def parse(param: json) -> dict: | |
with open(param) as file: | |
return json.load(file) | |
data = parse("./data.json") | |
codecs = parse("./codecs.json") | |
"""Video""" | |
containers=[j.get("name") for i in data["containers"] for j in data["containers"][i]] | |
video_containers = [i.get("name") for i in data["containers"]["video"]] | |
video_codecs = [i.get("name") for i in data["codecs"]["video"]] | |
video_aspect_ratio = [i.get("name") for i in data["aspects"]] | |
video_scaling = [i.get("name") for i in data["scalings"]] | |
""" Audio """ | |
audio_containers = [i.get("name") for i in data["containers"]["audio"]] | |
audio_codecs = [i.get("name") for i in data["codecs"]["audio"]] | |
audio_channels = [i.get("name") for i in data["audioChannels"]] | |
audio_quality = [i.get("name") for i in data["audioQualities"]] | |
audio_sample_rates = [i.get("name") for i in data["sampleRates"]] | |
""" Video & Audio Filters """ | |
# deband=[i.get("name") for i in data["deband"]] | |
# deflicker=[i.get("name") for i in data["deflicker"]] | |
# deshake=[i.get("name") for i in data["deshake"]] | |
# dejudder=[i.get("name") for i in data["dejudder"]] | |
# denoise=[i.get("name") for i in data["denoise"]] | |
# deinterlace=[i.get("name") for i in data["deinterlace"]] | |
filters = ["deband", "deflicker", "deshake", | |
"dejudder", "denoise", "deinterlace"] | |
vf = [{vFilter: names} for vFilter in filters for names in [ | |
[i for i in data[vFilter]]]] | |
presets = [i.get("name") for i in data["presets"]] | |
profiles = [i.get("name") for i in data["profiles"]] | |
speeds = [i.get("name") for i in data["speeds"]] | |
outputMap = parse("./mappings.json") | |
"""Output Mappings of commands to value | |
audioQuality -b:a 128k | |
""" | |
class CommandBuilder(): | |
def __call__(self, *args, **kwds): | |
return [i.value for i in self._component] | |
def do(self, *inputs, **kwds): | |
for comp in self._component: | |
if comp.label is not None: | |
self.startfunc(comp,"",comp.value) | |
def __init__(self, *inputs: gr.Blocks) -> None: | |
self.outputDict = {} | |
self.formatOutputDict = {"vf": {}, "af": {}} | |
# state=gr.Variable() | |
# state2=gr.Variable() | |
self._component: list[gr.components.Changeable] = [] | |
self.vf, self.af, self.extra = ([] for _ in range(3)) | |
self.commands = "" | |
if inputs is None: | |
return None | |
for i in inputs: | |
self._component += self._get_component_instance(i) | |
for comp in self._component: | |
state = gr.Variable() | |
state2 = gr.Variable() | |
if comp.label is not None: | |
state.value = comp | |
state2.value = comp.label | |
comp.change(fn=self.changefunc, inputs=[ | |
state, state2, comp], outputs=[]) | |
def update(self, Component: gr.components.IOComponent): | |
for comp in self._component: | |
comp.change(lambda: gr.update( | |
value=self.commands), [], [Component]) | |
def _get_component_instance(self, inputs: gr.Blocks) -> "list[gr.components.Component]": | |
return [gr.components.get_component_instance(i, render=True) for i in inputs.children if not hasattr(i, "children")] | |
def setVideoFilters(self, options): | |
value = self.outputDict.get(options, "-") | |
filters = outputMap.get(options, None) | |
arg = "" | |
if options in ["deinterlace", "denoise"]: | |
value = "_".join(value.lower().split()) | |
arg = filters.get(value, None) | |
# self.vf.append(arg) | |
self.formatOutputDict["vf"].update({options: arg}) | |
return True | |
if options in ["deband", "deflicker", "deshake", "dejudder"]: | |
arg = filters | |
self.formatOutputDict["vf"].update({options: arg}) | |
return True | |
return | |
def setAudioFilters(self, options): | |
value = self.outputDict.get(options, "-") | |
if options in ["acontrast"]: | |
value = int(value)/100 | |
arg = f"{options}={value}" | |
self.formatOutputDict["af"].update({options: arg}) | |
return True | |
return | |
def setFormat(self, options): | |
value = self.outputDict.get(options, "-") | |
filters = outputMap.get(options, None) | |
if options in ["video", "audio"]: | |
value = "".join([i.get("value", "None") for i in data.get( | |
"codecs").get(options) if i.get("name", None) == value]) | |
arg = f"{filters} {value}" | |
self.formatOutputDict.update({options: arg}) | |
return True | |
elif data.get(options) == None: | |
arg = f"{filters} {value}" | |
self.formatOutputDict.update({options: arg}) | |
return True | |
elif options != "clip": | |
value = "".join([i.get("value", "None") for i in data.get( | |
options) if i.get("name", None) == value]) | |
arg = f"{filters} {value}" | |
self.formatOutputDict.update({options: arg}) | |
def build(self): | |
for i in self.outputDict: | |
if self.setVideoFilters(i): | |
continue | |
elif self.setAudioFilters(i): | |
continue | |
else: | |
self.setFormat(i) | |
lst_extra, vf, af = ([] for _ in range(3)) | |
for val in self.formatOutputDict: | |
if val == "vf": | |
vf = self.formatOutputDict.get(val).values() | |
vf = ",".join(list(vf)) | |
elif val == "af": | |
af = self.formatOutputDict.get(val).values() | |
af = ",".join(list(af)) | |
else: | |
lst_extra.append(self.formatOutputDict.get(val)) | |
# print(lst_extra, "temp x") | |
# if vf:self.vf=f"-vf '{vf}'" | |
# if af:self.af=f"-af '{af}'" | |
self.vf = f"-vf '{vf}'" if vf else "" | |
self.af = f"-af '{af}'" if af else "" | |
self.extra = " ".join(lst_extra) | |
self.commands = f"{self.vf} {self.af} {self.extra}" | |
def changefunc(self, input: gr.components.IOComponent, c_label="", newValue=""): | |
label, *_ = input.label.strip(": ").lower().split( | |
) if type(input.label) != list else "".join(input.label).strip(": ").lower().split() | |
label += "".join(_).title() | |
if newValue not in [None, "Source", "Auto", "", "None",0]: | |
self.outputDict.update({label: newValue}) | |
else: | |
self.outputDict.pop(label, "No Key Exists") | |
self.formatOutputDict["vf"].pop(label, "Key is None or similar") | |
self.formatOutputDict["af"].pop(label, "Key is None or similar") | |
self.formatOutputDict.pop(label, "Key is None or similar") | |
self.build() | |
print(self.commands," self.commands") | |
print(self.vf, self.af, self.extra) | |
def startfunc(self, input: gr.components.IOComponent, c_label="", newValue=""): | |
label, *_ = input.label.strip(": ").lower().split( | |
) if type(input.label) != list else "".join(input.label).strip(": ").lower().split() | |
label += "".join(_).title() | |
if newValue not in [None, "Source", "Auto", "", "None",0]: | |
self.outputDict.update({label: newValue}) | |
else: | |
self.outputDict.pop(label, "No Key Exists") | |
self.formatOutputDict["vf"].pop(label, "Key is None or similar") | |
self.formatOutputDict["af"].pop(label, "Key is None or similar") | |
self.formatOutputDict.pop(label, "Key is None or similar") | |
self.build() | |
def somefunc(input: gr.components.IOComponent, c_label=""): | |
label = "" | |
output={} | |
print(input, c_label) | |
label, *_ = input.label.strip(": ").lower().split( | |
) if type(input.label) != list else "".join(input.label).strip(": ").lower().split() | |
label += "".join(_).title() | |
print(outputMap.get(label), label, c_label) | |
if c_label not in [None, "Source", "Auto", ""]: | |
print(input.value) | |
output.update({label: c_label}) | |
else: | |
output.pop(label, "No Key Exists") | |
pprint(output) | |
# def mediaChange(option): | |
# no_=gr.update(visible=False) | |
# if option in video_containers: | |
# output=gr.update(visible=True) | |
# return [no_,output] | |
# elif option in audio_containers: | |
# output=gr.update(visible=True) | |
# return [output,no_] | |
# else: | |
# output=gr.update(visible=False) | |
# return [no_,no_] | |
def mediaChange(option): | |
no_=gr.update(visible=False) | |
output=gr.update(visible=True) | |
ops={"Audio":gr.update(visible=True)} | |
ops2={"Video":gr.update(visible=True)} | |
ops3={"File":gr.update(visible=True,interactive=False)} | |
# if option.lower()!="mp4" and option in video_containers: | |
# option="mp4" | |
chosen=lambda x:x.get(option,gr.update(visible=False)) | |
print(chosen(ops2),ops2.get(option,no_)) | |
return [chosen(ops),chosen(ops2),chosen(ops3)] | |
def videoChange(value): | |
print(value.name) | |
# if option in video_containers: | |
# output=gr.update(visible=True) | |
# return [no_,output] | |
# elif option in audio_containers: | |
# output=gr.update(visible=True) | |
# return [output,no_] | |
# else: | |
# output=gr.update(visible=False) | |
# return [no_,no_] | |
def customBitrate(choice): | |
if choice == "Custom": | |
return gr.update(visible=True, value=None) | |
else: | |
return gr.update(visible=False, value=None) | |
def supported_codecs(format: str, a=data): | |
# lst=[i for i in a["codecs"]["audio"] | |
# if i.get("supported")==None or "ogg" in i["supported"]] | |
if format: | |
format = format.lower() | |
video_lst = [val.get("name") for val in a["codecs"]["video"] | |
if val.get("supported") == None or format in val["supported"]] | |
audio_lst = [val.get("name") for val in a["codecs"]["audio"] | |
if val.get("supported") == None or format in val["supported"]] | |
return [gr.update(choices=video_lst), gr.update(choices=audio_lst)] | |
def supported_presets(format: str, a=data): | |
if format: | |
format = format.lower() | |
video_lst = [val.get("name") for val in a["presets"] | |
if val.get("supported") == None or format in val["supported"]] | |
print(format, video_lst) | |
return gr.update(choices=video_lst) | |
"""Helper Functions for Processing """ | |
def clear(*input): | |
print(input, " clear_func") | |
# for i in [inp for i in input for inp in i]: | |
# print(i, hasattr(i,"cleared_value"),type(i)) | |
# a=default_clear(input_components) | |
def clear_func(x): return [component.cleared_value if hasattr( | |
component, "cleared_value") else None for component in x] | |
print(clear_func(input)) | |
return clear_func(input) | |
def change_clipbox(choice): | |
print(gr.Dropdown().postprocess("clip test")) | |
if choice == "Enabled": | |
return [gr.update(visible=True, value="00:00"), gr.update(visible=True, value="00:10")] | |
else: | |
return [gr.update(visible=False, value=""), gr.update(visible=False, value="")] | |
def updateOutput(file: _TemporaryFileWrapper): | |
if file: | |
print(file.name) | |
return gr.update(value=file.name) | |
def get_component_instance(inputs: gr.Blocks) -> list: | |
return [gr.components.get_component_instance(i, render=True) for i in inputs.children] | |
class Clear(CommandBuilder): | |
def __call__(self, *args, **kwds): | |
return self._component | |
def __str__(self): | |
return f"{self._component} __clear__ class" | |
def __repr__(self): | |
return self._component | |
def __init__(self, *input_component: gr.Blocks()) -> None: | |
self._component = [] | |
if input_component is not None: | |
for i in input_component: | |
self._component += super()._get_component_instance(i) | |
def __get_component_instance(self, inputs: gr.Blocks) -> list: | |
# print(inputs, " class instance") | |
# res=[] | |
# for i in inputs.children: | |
# print(hasattr(i,"children")) | |
# if not (hasattr(i,"children")): | |
# res.append(gr.components.get_component_instance(i,render=True)) | |
# print(i) | |
# elif hasattr(i,"children"): | |
# continue | |
# return res | |
return [gr.components.get_component_instance(i, render=True) for i in inputs.children if not hasattr(i, "children")] | |
def add(self, *args): | |
print(args, type(args)) | |
if args is not None: | |
for i in args: | |
self._component += self.__get_component_instance(i) | |
return self._component | |
def clear(self, *args): | |
def clear_func(x): return [component.cleared_value if hasattr( | |
component, "cleared_value") else component.value for component in x] | |
return clear_func(self._component) | |