movmaker/README.md

162 lines
No EOL
3.9 KiB
Markdown

# movmaker
Flat-folder Python + ffmpeg movie maker, plus optional MVLog worker.
## What it does
- Input: one directory with mixed images/videos/audio + optional `data.txt`
- Output: one rendered MP4 with transitions, captions, intro/logo, stamps, and embedded metadata
- Optional worker (`mvlog_worker.py`) renders/publishes MVLog jobs either locally on the webserver or via the older SSH/SCP remote mode
## Requirements
- Python 3
- `ffmpeg`, `ffprobe`
Install (Debian/Ubuntu):
```bash
sudo apt install ffmpeg
```
## Basic usage
```bash
python3 movmaker.py /path/to/input
```
Preview render:
```bash
python3 movmaker.py /path/to/input --preview
```
Custom output dir:
```bash
python3 movmaker.py /path/to/input --out-dir /path/to/output
```
## Input model (flat folder)
Supported media:
- Images: `.jpg .jpeg .png .webp .bmp .tif .tiff`
- Videos: `.mp4 .mov .mkv .avi .webm .m4v`
- Audio: `.mp3 .wav .m4a .aac .flac .ogg`
- Data file: `data.txt` (also accepts `info.txt`, `title.txt`)
No required subfolders.
## Ordering
If `order.json` exists in the input folder, it is used first for visual media order.
Then fallback order is handled by movmaker logic (metadata/filename/file-time based sorting path).
`order.json` should contain only visual files (images/videos).
## `data.txt` format
Use `key: value` lines.
General keys used by movmaker:
- `Title` / `Name`
- `Teaser`
- `Quote_da`
- `Location` / `Place` / `Where`
- `Date` / `Dates` / `When`
- `Description` / `Desc` / `Synopsis`
Per-file captions:
```text
IMG_0001.jpg: caption text
clip01.mp4: caption text
```
Per-video source audio toggle (optional):
```text
clip01.mp4 audio: yes
```
## Current render behavior (important)
- Default still duration: 6s
- Default crossfade: 3s
- First still is extended (`FIRST_IMAGE_DURATION_MULTIPLIER`)
- Intro/logo mode supported (`--intro-logo`)
- Teaser is metadata-only (not burned into intro text)
- `quote_da` and `teaser` are embedded in output metadata
- Long video caption rule:
- if clip duration > 10s, caption starts at +2s and shows for 6s
- Output filename is normalized/safe ASCII (`YYYYMMDD_slug.mp4`)
- Detailed ffmpeg logs are written under `<input>/.logs/`
## MVLog worker (`mvlog_worker.py`)
Worker is for MVLog web integration. Preferred deployment is webserver-local: `/var/www/html/in-dir` -> render on the webserver -> `/var/www/html/out-dir`. Older SSH/SCP remote mode is still available for rollback/manual use.
Key points:
- Uses per-job state `.movmaker-state.json`
- Honors job toggles (`.movmaker-enabled`, `.movmaker-preview`, `.mvlog-hidden`)
- Includes article IDs from `.mvlog-id` in state
- Ignores `.mvlog-id` and `.mvlog-hide-map` in fingerprinting
- Publishes output atomically and clears remote cache file
- Supports remote mode (SSH/SCP) and `--local` mode
Run once on the webserver:
```bash
./mvlog_worker.py --local --remote-root /var/www/html --work-dir /srv/mvlog/work
```
Single job on the webserver:
```bash
./mvlog_worker.py --local --remote-root /var/www/html --work-dir /srv/mvlog/work --job 20260525_mohnesee
```
Older SSH/SCP remote mode from another machine:
```bash
./mvlog_worker.py
```
Force rerender:
```bash
./mvlog_worker.py --job 20260525_mohnesee --force
```
Pass extra movmaker args:
```bash
./mvlog_worker.py --movmaker-arg=--preview
```
## Webserver deployment
Recommended deployment keeps this repo checked out on the webserver at:
```text
/srv/mvlog/app
```
The worker writes temporary render data outside git at `/srv/mvlog/work` and publishes public files to `/var/www/html/out-dir`.
Systemd templates are in `deploy/systemd/`:
```bash
sudo cp deploy/systemd/mvlog-worker.service /etc/systemd/system/
sudo cp deploy/systemd/mvlog-worker.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now mvlog-worker.timer
```
## Notes
- This repo does **not** send web push itself; push is handled by MVLog web app server-side.
- Keep secrets out of git (API keys, push keys, auth files).