media-converter / functions.py
lazarusking
Added multiple filters and options;added Video,audio and file view
a044023
raw
history blame
12.8 kB
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)