commit 7f3d91166e4a473ac33b5ceca7dc48c33b9b61f0
parent be41be52153ffd20353f54f2dbe85b9d1a921f8d
Author: rbckman <rob@tarina.org>
Date: Thu, 23 Oct 2025 09:17:36 +0100
start of title maker
Diffstat:
3 files changed, 109 insertions(+), 10 deletions(-)
diff --git a/extras/roberta.ttf b/extras/roberta.ttf
Binary files differ.
diff --git a/extras/titlemaker.py b/extras/titlemaker.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from PIL import Image, ImageDraw, ImageFont
+import os
+
+def create_title_png(text, output_path, font_path=None, font_size=100, text_color="white"):
+ """
+ Create a Full HD (1920x1080) PNG image with centered text and transparent background.
+
+ Parameters:
+ text (str): Text to display on the image
+ output_path (str): Path to save the PNG file
+ font_path (str): Path to TTF font file (optional, uses default if None)
+ font_size (int): Font size for the text
+ text_color (str): Color of the text (e.g., "white", "#FFFFFF")
+ """
+ try:
+ # Create a new Full HD image with transparent background (RGBA mode)
+ image = Image.new('RGBA', (1920, 1080), (0, 0, 0, 0)) # Fully transparent background
+ draw = ImageDraw.Draw(image)
+
+ # Load font (use default PIL font if none provided)
+ if font_path and os.path.exists(font_path):
+ font = ImageFont.truetype(font_path, font_size)
+ else:
+ font = ImageFont.load_default()
+ # Scale default font size (Pillow's default is small)
+ if font_size != 100:
+ print("Warning: Custom font size ignored when using default font")
+
+ # Get text size to center it (use textsize for older Pillow versions)
+ text_width, text_height = draw.textsize(text, font=font)
+
+ # Calculate centered position
+ text_x = (1920 - text_width) // 2
+ text_y = (1080 - text_height) // 2
+
+ # Draw the text
+ draw.text((text_x, text_y), text, fill=text_color, font=font)
+
+ # Save the image as PNG to preserve transparency
+ image.save(output_path, 'PNG')
+ print(f"Transparent title image saved to {output_path}")
+
+ except Exception as e:
+ print(f"An error occurred: {str(e)}")
+
+# Example usage
+if __name__ == "__main__":
+ title_text = "GONZO PI IS AWESOME"
+ output_file = "title001.png"
+
+ # Optional: Specify a TTF font file (e.g., Arial, downloaded TTF, etc.)
+ # font_path = "path/to/your/font.ttf" # Uncomment and set path if you have a TTF font
+ font_path = None # Use default font if None
+
+ create_title_png(
+ text=title_text,
+ output_path=output_file,
+ font_path='roberta.ttf',
+ font_size=100,
+ text_color="white"
+ )
diff --git a/gonzopi.py b/gonzopi.py
@@ -4883,12 +4883,6 @@ def get_video_length_str(filepath):
def get_video_length(filepath):
global db
video_origins = (os.path.realpath(filepath))
- if os.path.isfile(filepath[:-3]+'info') == True:
- with open(filepath[:-3]+'info', 'r') as f:
- duration_ms = f.readline().strip()
- print('duration in ms: ' + str(duration_ms))
- return int(duration_ms)
- # Parse the file
try:
media_info = MediaInfo.parse(filepath)
except:
@@ -5153,20 +5147,26 @@ def renderaudio(filmfolder, filmname, scene, audiofiles, filename, dubfiles, dub
except:
audiosilence(filename)
audiolength = get_audio_length(filename+'.wav')
+ if audiolength == None:
+ audiosilence(filename)
+ audiolength = get_audio_length(filename+'.wav')
if videolength != 0 and videolength != None:
if audiolength > videolength:
audiotrim(filename, 'end','')
+ if audiolength < videolength:
+ print('FUUUUUUUUUUUU')
+ #time.sleep(5)
for i, d in zip(dubmix, dubfiles):
writemessage('Dub ' + str(p) + ' audio found lets mix...')
#first trimit!
- audiotrim(filename, 'end', d)
+ #audiotrim(filename, 'end', d)
try:
#pipe = subprocess.check_output('soxi -D ' + d, shell=True)
#dubaudiolength = pipe.decode()
- dubaudiolength=get_audio_lenght(d)
+ dubaudiolength=get_audio_length(d)
if dubaudiolength != videolength:
print('dub wrong length!')
- time.sleep(5)
+ #time.sleep(5)
except:
pass
#print(d)
@@ -5175,7 +5175,7 @@ def renderaudio(filmfolder, filmname, scene, audiofiles, filename, dubfiles, dub
os.system('cp ' + filename + '.wav ' + filename + '_tmp.wav')
#Fade and make stereo
run_command('sox -V0 -b 16 -G ' + d + ' -c 2 '+filmfolder+'.tmp/fade.wav fade ' + str(round(i[2],1)) + ' 0 ' + str(round(i[3],1)))
- run_command('sox -V0 -b 16 -G -m -v ' + str(round(i[0],1)) + ' '+filmfolder+'.tmp/fade.wav -v ' + str(round(i[1],1)) + ' ' + filename + '_tmp.wav -c 2 ' + rendered_audio + '.wav trim 0 ' + str(audiolength))
+ run_command('sox -V0 -b 16 -G -m -v ' + str(round(i[0],1)) + ' '+filmfolder+'.tmp/fade.wav -v ' + str(round(i[1],1)) + ' ' + filename + '_tmp.wav -c 2 ' + rendered_audio + '.wav trim 0 ' + str(videolength))
os.system('ln -sfr '+rendered_audio+'.wav '+filename+'.wav')
try:
os.remove(filename + '_tmp.wav')
@@ -5184,6 +5184,18 @@ def renderaudio(filmfolder, filmname, scene, audiofiles, filename, dubfiles, dub
pass
print('Dub mix ' + str(p) + ' done!')
p += 1
+ try:
+ videolength = get_video_length(filename+'.mp4')
+ except:
+ videolength = 0
+ try:
+ audiolength = get_audio_length(filename+'.wav')
+ except:
+ audiosilence(filename)
+ audiolength = get_audio_length(filename+'.wav')
+ if int(audiolength) != int(videolength):
+ vumetermessage('trimming audio to video...')
+ audiosync, videolength, audiolength = audiotrim(filename, 'end','')
return
#-------------Fast Edit-----------------
@@ -5422,6 +5434,28 @@ def rendershot(filmfolder, filmname, renderfilename, scene, shot):
rendermenu = True
newaudiomix = True
renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
+ ###---------TITLES----------
+ if os.path.isfile(scenedir+'title/title001.png') == True:
+ videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
+ tot = int(videos_totalt.videos)
+ video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
+ #compileshot(scenedir+'blend/'+blendmodes[blendselect]+'.h264',filmfolder,filmname)
+ run_command('ffmpeg -y -i '+renderfilename+'.mp4 -i '+scenedir+'title/title001.png '+encoder()+'-filter_complex "[0:v][1:v]overlay=0:0:enable=\'between(t,2,8)\'[v]" -map "[v]" -map 0:a? '+filmfolder+'.tmp/title.mp4')
+ screen_filename = scenedir+'take' + str(counttakes2(scenedir)+1).zfill(3)
+ run_command('cp ' + renderfilename + '.wav ' + screen_filename + '.wav')
+ #make a new sublink
+ run_command('cp '+filmfolder+'.tmp/title.mp4 '+video_origins+'.mp4')
+ os.system('ln -sfr '+video_origins+'.mp4 '+screen_filename+'.mp4')
+ run_command('rm '+filmfolder+'.tmp/title.mp4')
+ run_command('rm -r title/title001.png')
+ run_command('ffmpeg -y -sseof -1 -i ' + screen_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + screen_filename + '.jpeg')
+ #ffmpeg -i blendtest.mp4 -i blendtest3.mp4 -filter_complex "blend=screen" output2.mp4
+ newaudiomix = True
+ take=counttakes2(scenedir)
+ renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
+ updatethumb=True
+ rendermenu = True
+ newaudiomix = True
###---------BLEND----------
if os.path.isfile(scenedir+'blend/'+blendmodes[blendselect]+'.mp4') == True:
videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
@@ -5652,6 +5686,7 @@ def renderscene(filmfolder, filmname, scene):
print('renderfix is:'+str(renderfixscene))
# Render if needed
if videohash != oldvideohash or renderfixscene == True:
+ run_command('rm '+renderfilename+'.info')
rendervideo(filmfolder,filmname,scene,filmfiles, renderfilename, 'scene ' + str(scene))
#fastedit(filmfolder, filmname, filmfiles, scene)
#run_command('cp '+renderfilename+ '.mp4 '+renderfilename+'_tmp.mp4')