# movmaker Simple Python + ffmpeg movie maker. Drop pictures, videos, music, and optionally one simple `data.txt` file into a single flat input directory. Then run one command to create an MP4 video. No YAML. No required subdirectories. ## Requirements - Python 3 - `ffmpeg` - `ffprobe` usually included with ffmpeg Install on Debian/Ubuntu/Raspberry Pi OS: ```bash sudo apt install ffmpeg ``` ## Fonts The default title/stamp styling uses these fonts: - Bebas Neue for the opening title, date, and location - Noto Sans Bold for the bottom-left/bottom-right stamps and per-file captions Both fonts support common Danish and Croatian characters such as `æ ø å Æ Ø Å č ć ž š đ Č Ć Ž Š Đ`. Install them locally for the current user: ```bash mkdir -p ~/.local/share/fonts/google curl -L -o ~/.local/share/fonts/google/BebasNeue-Regular.ttf \ 'https://github.com/google/fonts/raw/main/ofl/bebasneue/BebasNeue-Regular.ttf' sudo apt install fonts-noto-core fc-cache -f ``` Check that fonts are available: ```bash fc-match 'Bebas Neue' fc-match 'Noto Sans' ``` ## Optional Pixabay music download If the input folder has no audio file, movmaker can download one random track from Pixabay Music. Save your Pixabay API key in either an environment variable: ```bash export PIXABAY_API_KEY='your_key_here' ``` or in a local config file: ```bash mkdir -p ~/.config/movmaker echo 'PIXABAY_API_KEY=your_key_here' > ~/.config/movmaker/pixabay.env chmod 600 ~/.config/movmaker/pixabay.env ``` The default music search query is: ```text cinematic punk rock ``` Override it with: ```bash python3 movmaker.py input --music-genre "upbeat rock" ``` ## Input folder Example: ```text input/ IMG_001.jpg IMG_002.png holiday_clip.mp4 music.mp3 data.txt ``` Supported file types: - Images: `.jpg`, `.jpeg`, `.png`, `.webp`, `.bmp`, `.tif`, `.tiff` - Videos: `.mp4`, `.mov`, `.mkv`, `.avi`, `.webm`, `.m4v` - Audio: `.mp3`, `.wav`, `.m4a`, `.aac`, `.flac`, `.ogg` - Data: `data.txt`, `info.txt`, or `title.txt` Files are ordered by filename, so names like this work well: ```text 001.jpg 002.jpg 003.mp4 004.jpg ``` ## data.txt `data.txt` is optional. Simplest format: ```text Paris Trip Paris, France May 2024 ``` Those three lines mean: 1. title 2. location 3. date If the date line is omitted, movmaker uses the date from the first picture/video and displays it like: ```text May 14th 2026 ``` If the location line is omitted and GPS coordinates are found in the first picture/video that has them, movmaker reverse geocodes them and uses that as the location. It tries to return only `city/town/village, country`; if no city/town/village is found, it uses just the country. Key/value format also works: ```text title: Paris Trip date: May 2024 place: Paris, France ``` Optional per-file captions are supported: ```text IMG_001.jpg: Eiffel Tower IMG_002.jpg: Louvre IMG_003.jpg: First line | Second line ``` ## Usage Basic: ```bash python3 movmaker.py input ``` With options: ```bash python3 movmaker.py input \ --out-dir . \ --image-duration 6 \ --fade 3 \ --audio-fade 10 \ --audio-fade-in 2 \ --video-fade 1.5 \ --music-genre "cinematic punk rock" \ --resolution 1920x1080 \ --fps 30 ``` Fast preview render: ```bash python3 movmaker.py input --preview ``` ## Current behavior - scans one flat input directory - auto-detects media/audio/data files by extension - shows each image fully visible for 6 seconds by default, not counting crossfades - keeps the first image longer so the first transition starts after 2x image duration, 12 seconds by default - includes video clips inline - crossfades between media items over 3 seconds by default - loops/trims music to match the video - if no audio file exists in the input folder, searches Pixabay Music using `--music-genre` and downloads one random track; default query is `cinematic punk rock` - reads the Pixabay API key from `PIXABAY_API_KEY` or `~/.config/movmaker/pixabay.env` - fades music in over 2 seconds and out over 10 seconds by default - fades video in/out over 1.5 seconds by default - overlays the opening title for the first 6 seconds: large title, then date/location on one line - displays optional per-file captions at bottom center with a thin black outline; use `|` to split caption lines - adds persistent bottom-left title/date/place and bottom-right `@bubulescu` stamps - preserves special characters in rendered overlays and metadata - uses safe ASCII only for generated filenames, so special letters become readable equivalents like `Č` -> `C`, `å` -> `a`, `ø` -> `o` - embeds MP4 metadata: title, date, location/place, QuickTime location name, artist, comment, and creation_time - writes an MP4 file named like `YYYYMMDD_title.mp4` in the current directory by default; use `--out-dir DIR` to choose another output directory - takes `YYYYMMDD` from the first picture/video metadata, falling back to file modification date - keeps console output minimal during rendering and writes detailed ffmpeg output to `movmaker.log` in the input directory - uses local `ffmpeg/ffmpeg` and `ffmpeg/ffprobe` when present, otherwise system tools ## Notes This is an early version. The intended workflow is deliberately simple: dump files into one folder and run the script.