Compare commits
No commits in common. "824a83752e6e618465823f396aad75334eed99d7" and "e02ec82568719155452bf02ef3a73e484032fe01" have entirely different histories.
824a83752e
...
e02ec82568
@ -6,7 +6,7 @@ from frame_forge.utils import exit_application
|
|||||||
|
|
||||||
|
|
||||||
program_name = "FrameForge"
|
program_name = "FrameForge"
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.0.0"
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -2,13 +2,11 @@ import re
|
|||||||
import shutil
|
import shutil
|
||||||
from random import choice
|
from random import choice
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Tuple
|
|
||||||
from numpy import linspace
|
from numpy import linspace
|
||||||
from unidecode import unidecode
|
from unidecode import unidecode
|
||||||
import awsmfunc
|
import awsmfunc
|
||||||
import vapoursynth as vs
|
import vapoursynth as vs
|
||||||
from frame_forge.exceptions import FrameForgeError
|
from frame_forge.exceptions import FrameForgeError
|
||||||
from frame_forge.font_scaler import FontScaler
|
|
||||||
from frame_forge.utils import get_working_dir, hex_to_bgr
|
from frame_forge.utils import get_working_dir, hex_to_bgr
|
||||||
|
|
||||||
|
|
||||||
@ -85,10 +83,6 @@ class GenerateImages:
|
|||||||
"1,0,0,0,100,100,0,0,1,1,0,7,5,0,0,1"
|
"1,0,0,0,100,100,0,0,1,1,0,7,5,0,0,1"
|
||||||
)
|
)
|
||||||
|
|
||||||
selected_sub_style_ref, selected_sub_style_sync = self.sync_font_scaling(
|
|
||||||
num_source_frames=num_source_frames, scaling_factor=1.35
|
|
||||||
)
|
|
||||||
|
|
||||||
self.check_de_interlaced(num_source_frames, num_encode_frames)
|
self.check_de_interlaced(num_source_frames, num_encode_frames)
|
||||||
|
|
||||||
b_frames = self.get_b_frames(num_source_frames)
|
b_frames = self.get_b_frames(num_source_frames)
|
||||||
@ -109,8 +103,7 @@ class GenerateImages:
|
|||||||
vs_encode_info,
|
vs_encode_info,
|
||||||
screenshot_comparison_dir,
|
screenshot_comparison_dir,
|
||||||
screenshot_sync_dir,
|
screenshot_sync_dir,
|
||||||
selected_sub_style_ref,
|
selected_sub_style,
|
||||||
selected_sub_style_sync,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return img_job
|
return img_job
|
||||||
@ -122,67 +115,6 @@ class GenerateImages:
|
|||||||
flush=True,
|
flush=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def sync_font_scaling(
|
|
||||||
self, num_source_frames, scaling_factor: float
|
|
||||||
) -> Tuple[str, str]:
|
|
||||||
calculate_str_len = max(
|
|
||||||
len("frame: reference"), len(str(f"frame: {num_source_frames}"))
|
|
||||||
)
|
|
||||||
scale_position = FontScaler().get_adjusted_scale(
|
|
||||||
self.sub_size + 2, scaling_factor
|
|
||||||
)
|
|
||||||
calculate_right_subs = int(
|
|
||||||
self.source_node.width
|
|
||||||
- ((calculate_str_len + self.sub_size + 2) * scale_position)
|
|
||||||
)
|
|
||||||
selected_sub_style_ref = (
|
|
||||||
f"Segoe UI,{self.sub_size + 2},&H31FF31&,&H00000000,&H00000000,&H00000000,"
|
|
||||||
f"1,0,0,0,100,100,0,0,1,1,0,7,{calculate_right_subs},0,0,1"
|
|
||||||
)
|
|
||||||
selected_sub_style_sync = (
|
|
||||||
f"Segoe UI,{self.sub_size + 2},&H31FF31&,&H00000000,&H00000000,&H00000000,"
|
|
||||||
f"1,0,0,0,100,100,0,0,1,1,0,7,{calculate_right_subs},0,0,1"
|
|
||||||
)
|
|
||||||
return selected_sub_style_ref, selected_sub_style_sync
|
|
||||||
|
|
||||||
def generate_ref_screens(
|
|
||||||
self, selected_sub_style_ref, frames: list, screenshot_sync_dir
|
|
||||||
):
|
|
||||||
"""Generates reference frames"""
|
|
||||||
for ref_frame in frames:
|
|
||||||
vs_encode_ref_info = self.core.sub.Subtitle(
|
|
||||||
clip=self.encode_node,
|
|
||||||
text=f"Reference\nFrame: {ref_frame}",
|
|
||||||
style=selected_sub_style_ref,
|
|
||||||
)
|
|
||||||
awsmfunc.ScreenGen(
|
|
||||||
vs_encode_ref_info,
|
|
||||||
frame_numbers=[ref_frame],
|
|
||||||
fpng_compression=1,
|
|
||||||
folder=screenshot_sync_dir,
|
|
||||||
suffix="b_encode__%d",
|
|
||||||
callback=self.screen_gen_callback,
|
|
||||||
)
|
|
||||||
|
|
||||||
def generate_sync_screens(
|
|
||||||
self, frame_list, selected_sub_style_sync, screenshot_sync_dir
|
|
||||||
):
|
|
||||||
"""Generates sync frames"""
|
|
||||||
for sync_frame in frame_list:
|
|
||||||
vs_sync_info = self.core.sub.Subtitle(
|
|
||||||
clip=self.source_node,
|
|
||||||
text=f"Sync\nFrame: {sync_frame}",
|
|
||||||
style=selected_sub_style_sync,
|
|
||||||
)
|
|
||||||
awsmfunc.ScreenGen(
|
|
||||||
vs_sync_info,
|
|
||||||
frame_numbers=[sync_frame],
|
|
||||||
fpng_compression=1,
|
|
||||||
folder=Path(screenshot_sync_dir),
|
|
||||||
suffix="a_source__%d",
|
|
||||||
callback=self.screen_gen_callback,
|
|
||||||
)
|
|
||||||
|
|
||||||
def generate_screens(
|
def generate_screens(
|
||||||
self,
|
self,
|
||||||
b_frames,
|
b_frames,
|
||||||
@ -190,9 +122,8 @@ class GenerateImages:
|
|||||||
vs_encode_info,
|
vs_encode_info,
|
||||||
screenshot_comparison_dir,
|
screenshot_comparison_dir,
|
||||||
screenshot_sync_dir,
|
screenshot_sync_dir,
|
||||||
selected_sub_style_ref,
|
selected_sub_style,
|
||||||
selected_sub_style_sync,
|
):
|
||||||
) -> str:
|
|
||||||
print("\nGenerating screenshots, please wait", flush=True)
|
print("\nGenerating screenshots, please wait", flush=True)
|
||||||
|
|
||||||
# handle re_sync if needed
|
# handle re_sync if needed
|
||||||
@ -238,26 +169,60 @@ class GenerateImages:
|
|||||||
sync_2 = choice(remove_sync1)
|
sync_2 = choice(remove_sync1)
|
||||||
|
|
||||||
# reference subs
|
# reference subs
|
||||||
self.generate_ref_screens(
|
vs_source_ref_info = self.core.sub.Subtitle(
|
||||||
selected_sub_style_ref, [sync_1, sync_2], screenshot_sync_dir
|
clip=self.source_node, text="Sync", style=selected_sub_style
|
||||||
|
)
|
||||||
|
vs_encode_ref_info = self.core.sub.Subtitle(
|
||||||
|
clip=self.encode_node, text="Reference", style=selected_sub_style
|
||||||
)
|
)
|
||||||
|
|
||||||
# sync subs 1
|
# generate screens for the two reference frames
|
||||||
sync_subs_1 = [sync_1 + i for i in range(-5, 6)]
|
awsmfunc.ScreenGen(
|
||||||
|
vs_encode_ref_info,
|
||||||
self.generate_sync_screens(
|
frame_numbers=[sync_1, sync_2],
|
||||||
sync_subs_1,
|
fpng_compression=1,
|
||||||
selected_sub_style_sync,
|
folder=screenshot_sync_dir,
|
||||||
Path(Path(screenshot_sync_dir) / "sync1"),
|
suffix="b_encode__%d",
|
||||||
|
callback=self.screen_gen_callback,
|
||||||
)
|
)
|
||||||
|
|
||||||
# sync subs 2
|
# generate 10 source frames around those reference frames
|
||||||
sync_subs_2 = [sync_2 + i for i in range(-5, 6)]
|
awsmfunc.ScreenGen(
|
||||||
|
vs_source_ref_info,
|
||||||
|
frame_numbers=[
|
||||||
|
sync_1 - 4,
|
||||||
|
sync_1 - 3,
|
||||||
|
sync_1 - 2,
|
||||||
|
sync_1 - 1,
|
||||||
|
sync_1,
|
||||||
|
sync_1 + 1,
|
||||||
|
sync_1 + 2,
|
||||||
|
sync_1 + 3,
|
||||||
|
sync_1 + 4,
|
||||||
|
],
|
||||||
|
fpng_compression=1,
|
||||||
|
folder=Path(Path(screenshot_sync_dir) / "sync1"),
|
||||||
|
suffix="a_source__%d",
|
||||||
|
callback=self.screen_gen_callback,
|
||||||
|
)
|
||||||
|
|
||||||
self.generate_sync_screens(
|
awsmfunc.ScreenGen(
|
||||||
sync_subs_2,
|
vs_source_ref_info,
|
||||||
selected_sub_style_sync,
|
frame_numbers=[
|
||||||
Path(Path(screenshot_sync_dir) / "sync2"),
|
sync_2 - 4,
|
||||||
|
sync_2 - 3,
|
||||||
|
sync_2 - 2,
|
||||||
|
sync_2 - 1,
|
||||||
|
sync_2,
|
||||||
|
sync_2 + 1,
|
||||||
|
sync_2 + 2,
|
||||||
|
sync_2 + 3,
|
||||||
|
sync_2 + 4,
|
||||||
|
],
|
||||||
|
fpng_compression=1,
|
||||||
|
folder=Path(Path(screenshot_sync_dir) / "sync2"),
|
||||||
|
suffix="a_source__%d",
|
||||||
|
callback=self.screen_gen_callback,
|
||||||
)
|
)
|
||||||
|
|
||||||
print("Screen generation completed", flush=True)
|
print("Screen generation completed", flush=True)
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
import math
|
|
||||||
|
|
||||||
|
|
||||||
class FontScaler:
|
|
||||||
def __init__(self, original_font_size=100, original_scale=3.5):
|
|
||||||
self.original_font_size = original_font_size
|
|
||||||
self.original_scale = original_scale
|
|
||||||
|
|
||||||
def calculate_scale_factor(self, desired_font_size):
|
|
||||||
"""Calculate the scale factor based on the desired font size."""
|
|
||||||
return math.log(desired_font_size) / math.log(self.original_font_size)
|
|
||||||
|
|
||||||
def adjust_scale_factor(self, scale_factor, multiplier):
|
|
||||||
"""Adjust the scale factor with a multiplier."""
|
|
||||||
return scale_factor * multiplier
|
|
||||||
|
|
||||||
def scale_font(self, scale_factor):
|
|
||||||
"""Scale the font size based on the original scale and scale factor."""
|
|
||||||
return self.original_scale * scale_factor
|
|
||||||
|
|
||||||
def get_adjusted_scale(self, desired_font_size, multiplier=1.0):
|
|
||||||
"""Get the adjusted font scale based on the desired font size and multiplier."""
|
|
||||||
scale_factor = self.calculate_scale_factor(desired_font_size)
|
|
||||||
adjusted_scale_factor = self.adjust_scale_factor(scale_factor, multiplier)
|
|
||||||
return self.scale_font(adjusted_scale_factor)
|
|
@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "frame-forge"
|
name = "frame-forge"
|
||||||
version = "1.0.1"
|
version = "1.0.0"
|
||||||
description = "CLI to offload image generation to"
|
description = "CLI to offload image generation to"
|
||||||
authors = ["jlw4049 <jlw_4049@hotmail.com>"]
|
authors = ["jlw4049 <jlw_4049@hotmail.com>"]
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
Loading…
Reference in New Issue
Block a user