HashScripts's picture
Upload 167 files
b293d47 verified
import json
from typing import Any, Dict, List, Union
from enum import Enum
import collections.abc
from shortGPT.editing_framework.core_editing_engine import CoreEditingEngine
def update_dict(d, u):
for k, v in u.items():
if isinstance(v, collections.abc.Mapping):
d[k] = update_dict(d.get(k, {}), v)
else:
d[k] = v
return d
class EditingStep(Enum):
CROP_1920x1080 = "crop_1920x1080_to_short.json"
ADD_CAPTION_SHORT = "make_caption.json"
ADD_CAPTION_SHORT_ARABIC = "make_caption_arabic.json"
ADD_CAPTION_LANDSCAPE = "make_caption_landscape.json"
ADD_CAPTION_LANDSCAPE_ARABIC = "make_caption_arabic_landscape.json"
ADD_WATERMARK = "show_watermark.json"
ADD_SUBSCRIBE_ANIMATION = "subscribe_animation.json"
SHOW_IMAGE = "show_top_image.json"
ADD_VOICEOVER_AUDIO = "add_voiceover.json"
ADD_BACKGROUND_MUSIC = "background_music.json"
ADD_REDDIT_IMAGE = "show_reddit_image.json"
ADD_BACKGROUND_VIDEO = "add_background_video.json"
INSERT_AUDIO = "insert_audio.json"
EXTRACT_AUDIO = "extract_audio.json"
ADD_BACKGROUND_VOICEOVER = "add_background_voiceover.json"
class Flow(Enum):
WHITE_REDDIT_IMAGE_FLOW = "build_reddit_image.json"
from pathlib import Path
_here = Path(__file__).parent
STEPS_PATH = (_here / 'editing_steps/').resolve()
FLOWS_PATH = (_here / 'flows/').resolve()
class EditingEngine:
def __init__(self,):
self.editing_step_tracker = dict((step, 0) for step in EditingStep)
self.schema = {'visual_assets': {}, 'audio_assets': {}}
def addEditingStep(self, editingStep: EditingStep, args: Dict[str, any] = {}):
json_step = json.loads(
open(STEPS_PATH / f"{editingStep.value}", 'r', encoding='utf-8').read())
step_name, editingStepDict = list(json_step.items())[0]
if 'inputs' in editingStepDict:
required_args = (editingStepDict['inputs']['actions'] if 'actions' in editingStepDict['inputs'] else []) + (editingStepDict['inputs']['parameters'] if 'parameters' in editingStepDict['inputs'] else [])
for required_argument in required_args:
if required_argument not in args:
raise Exception(
f"Error. '{required_argument}' input missing, you must include it to use this editing step")
if required_args:
pass
action_names = [action['type'] for action in editingStepDict['actions']
] if 'actions' in editingStepDict else []
param_names = [param_name for param_name in editingStepDict['parameters']
] if 'parameters' in editingStepDict else []
for arg_name in args:
if ('inputs' in editingStepDict):
if 'parameters' in editingStepDict['inputs'] and arg_name in param_names:
editingStepDict['parameters'][arg_name] = args[arg_name]
pass
if 'actions' in editingStepDict['inputs'] and arg_name in action_names:
for i, action in enumerate(editingStepDict['actions']):
if action['type'] == arg_name:
editingStepDict['actions'][i]['param'] = args[arg_name]
if editingStepDict['type'] == 'audio':
self.schema['audio_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict
else:
self.schema['visual_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict
self.editing_step_tracker[editingStep] += 1
def ingestFlow(self, flow: Flow, args):
json_flow = json.loads(open(FLOWS_PATH / f"{flow.value}", 'r', encoding='utf-8').read())
for required_argument in list(json_flow['inputs'].keys()):
if required_argument not in args:
raise Exception(
f"Error. '{required_argument}' input missing, you must include it to use this editing step")
update = args[required_argument]
for path_key in reversed(json_flow['inputs'][required_argument].split("/")):
update = {path_key: update}
json_flow = update_dict(json_flow, update)
self.schema = json_flow
def dumpEditingSchema(self):
return self.schema
def renderVideo(self, outputPath, logger=None):
engine = CoreEditingEngine()
engine.generate_video(self.schema, outputPath, logger=logger)
def renderImage(self, outputPath, logger=None):
engine = CoreEditingEngine()
engine.generate_image(self.schema, outputPath, logger=logger)
def generateAudio(self, outputPath, logger=None):
engine = CoreEditingEngine()
engine.generate_audio(self.schema, outputPath, logger=logger)
# import json
# from typing import Any, Dict, List, Union
# from enum import Enum
# import collections.abc
# import os
# from shortGPT.editing_framework.core_editing_engine import CoreEditingEngine
# def update_dict(d, u):
# for k, v in u.items():
# if isinstance(v, collections.abc.Mapping):
# d[k] = update_dict(d.get(k, {}), v)
# else:
# d[k] = v
# return d
# class EditingStep(Enum):
# CROP_1920x1080 = "crop_1920x1080_to_short.json"
# ADD_CAPTION_SHORT = "make_caption.json"
# ADD_CAPTION_SHORT_ARABIC = "make_caption_arabic.json"
# ADD_CAPTION_LANDSCAPE = "make_caption_landscape.json"
# ADD_CAPTION_LANDSCAPE_ARABIC = "make_caption_arabic_landscape.json"
# ADD_WATERMARK = "show_watermark.json"
# ADD_SUBSCRIBE_ANIMATION = "subscribe_animation.json"
# SHOW_IMAGE = "show_top_image.json"
# ADD_VOICEOVER_AUDIO = "add_voiceover.json"
# ADD_BACKGROUND_MUSIC = "background_music.json"
# ADD_REDDIT_IMAGE = "show_reddit_image.json"
# ADD_BACKGROUND_VIDEO = "add_background_video.json"
# INSERT_AUDIO = "insert_audio.json"
# EXTRACT_AUDIO = "extract_audio.json"
# ADD_BACKGROUND_VOICEOVER = "add_background_voiceover.json"
# class Flow(Enum):
# WHITE_REDDIT_IMAGE_FLOW = "build_reddit_image.json"
# STEPS_PATH = "shortGPT/editing_framework/editing_steps/"
# FLOWS_PATH = "shortGPT/editing_framework/flows/"
# class EditingTrack:
# def __init__(self, filepath=None):
# self.editing_step_tracker = dict((step, 0) for step in EditingStep)
# self.schema = {'visual_assets': {}, 'audio_assets': {}}
# self.filepath = filepath
# if filepath is not None:
# try:
# self.load_from_file(filepath)
# except FileNotFoundError:
# self.save_to_file(filepath)
# def addEditingStep(self, editingStep: EditingStep, args: Dict[str, any] = {}):
# json_step = json.loads(
# open(STEPS_PATH+editingStep.value, 'r', encoding='utf-8').read())
# step_name, editingStepDict = list(json_step.items())[0]
# if 'inputs' in editingStepDict:
# required_args = (editingStepDict['inputs']['actions'] if 'actions' in editingStepDict['inputs'] else []) + (editingStepDict['inputs']['parameters'] if 'parameters' in editingStepDict['inputs'] else [])
# for required_argument in required_args:
# if required_argument not in args:
# raise Exception(
# f"Error. '{required_argument}' input missing, you must include it to use this editing step")
# if required_args:
# pass
# action_names = [action['type'] for action in editingStepDict['actions']
# ] if 'actions' in editingStepDict else []
# param_names = [param_name for param_name in editingStepDict['parameters']
# ] if 'parameters' in editingStepDict else []
# for arg_name in args:
# if ('inputs' in editingStepDict):
# if 'parameters' in editingStepDict['inputs'] and arg_name in param_names:
# editingStepDict['parameters'][arg_name] = args[arg_name]
# pass
# if 'actions' in editingStepDict['inputs'] and arg_name in action_names:
# for i, action in enumerate(editingStepDict['actions']):
# if action['type'] == arg_name:
# editingStepDict['actions'][i]['param'] = args[arg_name]
# if editingStepDict['type'] == 'audio':
# self.schema['audio_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict
# else:
# self.schema['visual_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict
# self.editing_step_tracker[editingStep] += 1
# def ingestFlow(self, flow: Flow, args):
# json_flow = json.loads(open(FLOWS_PATH+flow.value, 'r', encoding='utf-8').read())
# for required_argument in list(json_flow['inputs'].keys()):
# if required_argument not in args:
# raise Exception(
# f"Error. '{required_argument}' input missing, you must include it to use this editing step")
# update = args[required_argument]
# for path_key in reversed(json_flow['inputs'][required_argument].split("/")):
# update = {path_key: update}
# json_flow = update_dict(json_flow, update)
# self.schema = json_flow
# def dumpEditingSchema(self):
# return self.schema
# def save_to_file(self):
# if self.file_path:
# with open(self.file_path, 'w') as f:
# json.dump({'step_tracker': {key.name: value for key, value in self.step_tracker.items()}, 'asset_schema': self.asset_schema}, f)
# def load_from_file(self):
# if self.file_path and os.path.exists(self.file_path):
# with open(self.file_path, 'r') as f:
# data = json.load(f)
# self.step_tracker = {EditingStep[key]: value for key, value in data.get('step_tracker', {}).items()}
# self.asset_schema = data.get('asset_schema', {'visual_assets': {}, 'audio_assets': {}})
# else:
# raise Exception("File does not exist")
# def renderVideo(self, outputPath, logger=None):
# engine = CoreEditingEngine()
# engine.generate_video(self.schema, outputPath, logger=logger)
# def renderImage(self, outputPath, logger=None):
# engine = CoreEditingEngine()
# engine.generate_image(self.schema, outputPath, logger=logger)
# def generateAudio(self, outputPath, logger=None):
# engine = CoreEditingEngine()
# engine.generate_audio(self.schema, outputPath, logger=logger)