video-still-animator
video-still-animator converts a single PNG or JPG into a short MP4 video using ffmpeg's Ken-Burns zoom effect. Use this skill as a fallback when upstream AI video generation fails due to content moderation, ensuring downstream merge steps still receive a valid clip with matching framing and timing, albeit without the requested camera motion.
git clone --depth 1 https://github.com/opensquilla/opensquilla /tmp/video-still-animator && cp -r /tmp/video-still-animator/src/opensquilla/skills/bundled/video-still-animator ~/.claude/skills/video-still-animatorSKILL.md
# video-still-animator — Ken-Burns fallback clip from a still
Produces a short MP4 from a single PNG/JPG using ffmpeg's `zoompan`
filter, so a downstream merge step still has a clip for every shot when
an upstream AI video generation step gets blocked.
## Why this skill exists
`seedance-2-prompt` (and any platform-moderated video model) can refuse
individual requests for reasons that have nothing to do with the
prompt's narrative quality:
- input photo contains a recognisable real person face
- output audio gets flagged by the safety classifier
- the moderation model's similarity threshold drifts day to day
In `meta-short-drama` we always have a fresh PNG on disk before the
seedance call runs, so the cheapest "the show must go on" fallback is to
turn that PNG into a Ken-Burns clip and feed it to the merger. The clip
won't have the camera motion the prompt asked for, but the character,
framing, and timing will still match the script.
## Inputs (`with:`)
| key | required | default | notes |
|---|---|---|---|
| `input_image` | yes | — | PNG or JPG path. |
| `output_path` | yes | — | Output `.mp4` path. Parent dir created if missing. |
| `duration` | no | `5` | Clip length in seconds. |
| `width` | no | `720` | Output width. Match the merge step's pipeline. |
| `height` | no | `1280` | Output height. 720x1280 = 9:16. |
| `fps` | no | `24` | Output frame rate. |
| `zoom_rate` | no | `0.0015` | Per-frame zoom delta; 0.0015 over 5s ≈ 1.18× final zoom. |
## Output specs
- H.264 video at the requested resolution + fps
- AAC silent audio track (so merge steps that demux/remux audio do not
trip on a missing stream)
- `+faststart` MP4 (web playback friendly)
## Dependencies
- ffmpeg ≥ 5.0 on PATH (or pass `--ffmpeg-path` directly).
On Windows the script also probes the winget Gyan.FFmpeg install path,
Scoop, Chocolatey, and `C:\Program Files\ffmpeg\bin` before giving up.
## Use as `on_failure` substitute
In a meta-skill DAG, hang it off the real video step:
```yaml
- id: shot1_video
kind: skill_exec
skill: seedance-2-prompt
on_failure: shot1_video_fallback
with: { ... }
- id: shot1_video_fallback
kind: skill_exec
skill: video-still-animator
with:
input_image: "{{ inputs.workspace_dir }}/.../1_shot.png"
output_path: "{{ inputs.workspace_dir }}/.../1_shot.mp4"
```
The fallback must be a standalone step (no `depends_on`, no own
`on_failure`) per the meta-skill engine rules. The PNG must already
exist on disk by the time the parent step fails — that's true here
because the image step always runs before the video step.
## Limits
- Static framing only. The zoom is uniform centre-anchored; no pan, no
rotation, no parallax. For richer fallback motion, generate a fresh
set of stills and call this multiple times.
- No real audio. The intent is a placeholder that survives the merge;
add a real soundtrack downstream if needed.
- ffmpeg version drift: very old ffmpeg (<4) may not accept the exact
`zoompan` filter syntax; install ≥ 5.Submit audio or video for multilingual dubbing, poll status, and download dubbed audio. Use when the user asks for dubbing, 多语言配音, 视频翻译配音, 译制片, or wants a source clip dubbed into another language.
Generate a structured short-video shooting script from a topic. Emits a strict, machine-parseable shot list (3 shots by default) with image prompt + video prompt + voiceover + on-screen text per shot. Trigger when the user asks for a video script, 分镜, 短视频文案, AI视频, 短剧脚本, or wants visual prompts ready for image/video generation.
Use when the user asks to schedule recurring tasks, one-off reminders, timers, or cron-style jobs through the OpenSquilla cron tool.
Multi-round research with explicit methodology, evidence tracking, and citation-tagged synthesis. Trigger on 'deep dive', 'research report', 'literature review', 'investigate X across sources', 'multi-round investigation'. Distinct from the `summarize` skill, which is a single-pass condensation; this skill maintains a state file across iterations, tracks coverage, and produces a long-form report with per-claim citations. Three execution stages: plan (scope into sub-questions), iterate (record evidence per round), compile (synthesize report). The skill itself does not fetch the web — it tells the host agent which fetches to perform via OpenSquilla's existing web tools, and records what comes back.
Read, edit, or create Microsoft Word `.docx` files. Trigger this skill whenever the user mentions a Word document, .docx file, contract, report, brief, memo, or asks to extract text, modify an existing doc, generate one from a brief, or audit tracked changes. Three execution paths: text-and-structure extraction, in-place edit-by-run (preserves styles), and create-from-scratch with python-docx. Falls back to OOXML unzip-and-patch for layout work python-docx cannot reach.
Capture the current git diff (staged, working-tree, or staged file list) as text. Direct shell call for workflows that need repository diffs without an LLM agent loop.
GitHub operations via `gh` CLI: issues, PRs, CI runs, code review, API queries. Use when: (1) checking PR status or CI, (2) creating/commenting on issues, (3) listing/filtering PRs or issues, (4) viewing run logs. NOT for: complex web UI interactions requiring manual browser flows (use browser tooling when available), bulk operations across many repos (script with gh api), or when gh auth is not configured.
Query the per-turn DecisionEntry log for skill co-occurrence patterns, meta-skill usage stats, and the router fixture corpus. Returns a JSON summary suitable for downstream LLM consumption. Used by meta-skill-creator's harvest step but also useful standalone for 'which skills did I use most this week?'