stickerpack_assembler/make.py

103 lines
4.5 KiB
Python
Raw Normal View History

2023-09-30 09:49:58 +00:00
#!/usr/bin/env python3
from yaml import safe_load
from pathlib import Path
from sys import argv
import logging
from shlex import quote
path_stickers_root = Path(argv[1])
path_stickers_output_dir = path_stickers_root / 'stickers'
path_stickers_source_dir = path_stickers_root / 'src'
path_makefile_gen = path_stickers_root / 'makefile.gen'
path_stickers_data_dir = path_stickers_root / 'data'
log = logging.getLogger("stickers.make")
logging.basicConfig(
filename=str(path_stickers_root / 'make.log'),
level=logging.DEBUG
)
output_ext = 'static'
out_formats = {
'static': {
'extension': 'webp',
'options': '-lossless 1 -f webp'
},
'video': {
'extension': 'webm',
'options': '-codec:v libvpx-vp9 -map v -pix_fmt yuva420p'
},
'png': {
'extension': 'png',
'options': '-preset:v icon -frames 1'
}
}
with open(path_makefile_gen, 'w') as makefile:
targets_list = list()
# makefile: skeleton rules
2023-10-09 17:04:55 +00:00
makefile.write(".PHONY: all default clean stickers/\n")
makefile.write("default: all\n")
2023-09-30 09:49:58 +00:00
makefile.write('stickers:\n\tmkdir stickers\n')
makefile.write('clean:\n\trm -vrf stickers\n')
for sticker_description_file in path_stickers_data_dir.glob('*.yaml'):
log.debug('input description file: %s', sticker_description_file)
with open(sticker_description_file) as yaml_file:
sticker_description = safe_load(yaml_file)
log.debug("stuff %s", sticker_description)
target_filename = path_stickers_output_dir \
2023-10-09 17:04:55 +00:00
/ ( sticker_description['name'] \
+ '.' \
+ out_formats[output_ext]['extension'] )
prerequisite_filename=f"{sticker_description_file} "
2023-09-30 09:49:58 +00:00
if sticker_description['input']['base'].get('format','') \
2023-10-09 17:04:55 +00:00
not in ('lavfi', 'image2'):
prerequisite_filename += str(
path_stickers_source_dir \
/ sticker_description['input']['base']['input']
).replace(' ', '\\ ')
2023-09-30 09:49:58 +00:00
targets_list.append(f"{target_filename}")
# makefile: rule declaration
2023-10-09 17:04:55 +00:00
makefile.write(f"{target_filename}: {prerequisite_filename} | stickers\n")
2023-09-30 09:49:58 +00:00
# makefile: recipe ffmpeg base
makefile.write('\tffmpeg ')
# makefile: specify format if present
if sticker_description['input']['base'].get('format'):
makefile.write(f"-f {sticker_description['input']['base']['format']} ")
# makefile: force input framerate if present
if sticker_description['input']['base'].get('framerate'):
makefile.write(f"-framerate {sticker_description['input']['base']['framerate']} ")
#makefile: input base file
input_file = quote(str(path_stickers_source_dir \
/ sticker_description['input']['base']['input']
)
)
makefile.write(f"-i {input_file} ")
# makefile: video filter: base
makefile.write('-vf ')
# makefile: video filter: change transparent color
if sticker_description['input'].get('colors',{}).get('transparent'):
makefile.write("geq=\\''")
transparent = sticker_description['input']['colors']['transparent']
makefile.write(f"r=if(lt(alpha(X,Y),128),{transparent[0]},r(X,Y)):"
f"g=if(lt(alpha(X,Y),128),{transparent[1]},g(X,Y)):"
f"b=if(lt(alpha(X,Y),128),{transparent[2]},b(X,Y)):"
"a=alpha(X,Y)'\\',"
)
# makefile: video filter: scale
out_width = sticker_description.get('output', {}).get('width', 512)
out_height = sticker_description.get('output', {}).get('height', 512)
makefile.write(f"scale=w={out_width}:h={out_height}:force_original_aspect_ratio=decrease")
# makefile: output file speed
if sticker_description.get('output', {}).get('speed'):
makefile.write(f",setpts={sticker_description['output']['speed']}")
# makefile: video filter: finalize
makefile.write(' ')
# makefile: output file options
makefile.write(f"{out_formats[output_ext]['options']} ")
# makefile: replace output without confirmation
makefile.write('-y ')
# makefile: output file
makefile.write(quote(str(target_filename)))
# makefile: finalize recipe
makefile.write('\n')
makefile.write(f"all: {' '.join(targets_list)} | stickers\n")