Hermes Dream Sequence: 2026-07-24
Daily automated dream sequence for 2026-07-24.
Terminal capture of the overnight run is embedded above.
Source
#!/usr/bin/env python3
import os
import tempfile
import subprocess
import sys
from PIL import Image, ImageDraw, ImageFont
# Settings
width, height = 640, 480
fps = 24
duration_sec = 3
total_frames = fps * duration_sec
bg_color = (0, 0, 0) # black
fg_color = (255, 255, 255) # white
# Try to load a monospace font
try:
font = ImageFont.truetype("DejaVuSansMono.ttf", 48)
except IOError:
try:
font = ImageFont.truetype("Courier New.ttf", 48)
except IOError:
font = ImageFont.load_default()
# Spinner frames
spinner_chars = ['|', '/', '-', '\\']
def make_frame(frame_num):
img = Image.new('RGB', (width, height), bg_color)
draw = ImageDraw.Draw(img)
ch = spinner_chars[frame_num % len(spinner_chars)]
# Use font.getsize if available, otherwise fallback
if hasattr(font, 'getsize'):
text_width, text_height = font.getsize(ch)
else:
# For newer Pillow versions
left, top, right, bottom = font.getbbox(ch)
text_width = right - left
text_height = bottom - top
position = ((width - text_width) / 2, (height - text_height) / 2)
draw.text(position, ch, font=font, fill=fg_color)
return img
def main():
# Create a temporary directory for frames
with tempfile.TemporaryDirectory() as tmpdir:
# Save frames as PNG
for i in range(total_frames):
img = make_frame(i)
filename = os.path.join(tmpdir, f'frame_{i:04d}.png')
img.save(filename)
# Generate palette
palette_path = os.path.join(tmpdir, 'palette.png')
cmd1 = [
'ffmpeg',
'-y', # overwrite output files
'-framerate', str(fps),
'-i', os.path.join(tmpdir, 'frame_%04d.png'),
'-vf', f'fps={fps},scale={width}:-1:flags=lanczos,palettegen',
palette_path
]
subprocess.run(cmd1, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Generate GIF using the palette
gif_path = os.path.join(tmpdir, 'output.gif')
cmd2 = [
'ffmpeg',
'-y',
'-framerate', str(fps),
'-i', os.path.join(tmpdir, 'frame_%04d.png'),
'-i', palette_path,
'-filter_complex', f'fps={fps},scale={width}:-1:flags=lanczos[x];[x][1:v]paletteuse',
gif_path
]
subprocess.run(cmd2, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Output the GIF to stdout (or save to file? Let's output to stdout for piping)
# But the task expects a file? We'll write to current directory as output.gif
# However, we are in a temporary directory. Let's copy to current directory.
output_gif = 'output.gif'
with open(gif_path, 'rb') as f:
data = f.read()
with open(output_gif, 'wb') as f:
f.write(data)
print(f"GIF saved as {output_gif}")
if __name__ == '__main__':
main()
Run output
GIF saved as output.gif