-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Studio: native macOS EDL editor for video-use #138
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
a786bc7
bbec8a0
1caba73
931f95a
1e50d2a
2e278e7
0ba2ea3
1bfd264
aa35e5b
1b53e01
97407c6
818036e
a46743c
c0c7ff5
76bb4eb
de3fc7c
4f5841d
56f64b3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,102 @@ | ||
| name: CI | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| pull_request: | ||
|
|
||
| jobs: | ||
| skill-sync: | ||
| name: SKILL.md copies in sync | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Root SKILL.md matches packaged copy | ||
| run: diff -u SKILL.md src/video_use/SKILL.md | ||
|
|
||
| test: | ||
| name: ${{ matrix.os }} | ||
| runs-on: ${{ matrix.os }} | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| os: [ubuntu-latest, macos-latest, windows-latest] | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.12" | ||
|
|
||
| - name: Install ffmpeg | ||
| uses: FedericoCarboni/setup-ffmpeg@v3 | ||
|
|
||
| - name: Install video-use | ||
| run: pip install . | ||
|
|
||
| - name: Doctor | ||
| env: | ||
| ELEVENLABS_API_KEY: ci-dummy-key | ||
| run: video-use doctor | ||
|
|
||
| - name: Subcommand help screens | ||
| shell: bash | ||
| run: | | ||
| video-use --version | ||
| video-use skill | head -3 | ||
| video-use skill manim-video | head -3 | ||
| video-use where | ||
| for c in transcribe transcribe-batch pack timeline grade render; do | ||
| video-use "$c" --help > /dev/null | ||
| done | ||
| video-use grade --list-presets > /dev/null | ||
|
|
||
| - name: Render smoke test (synthetic clip + EDL) | ||
| shell: bash | ||
| run: | | ||
| mkdir -p smoke/edit | ||
| ffmpeg -y -f lavfi -i "testsrc2=duration=10:size=1280x720:rate=30" \ | ||
| -f lavfi -i "sine=frequency=440:duration=10" \ | ||
| -c:v libx264 -pix_fmt yuv420p -c:a aac smoke/clip.mp4 2>/dev/null | ||
| cat > smoke/edit/edl.json <<EOF | ||
| { | ||
| "version": 1, | ||
| "sources": {"clip": "$PWD/smoke/clip.mp4"}, | ||
| "ranges": [ | ||
| {"source": "clip", "start": 1.0, "end": 3.5, "beat": "HOOK", "quote": "", "reason": "ci"}, | ||
| {"source": "clip", "start": 6.0, "end": 8.0, "beat": "CTA", "quote": "", "reason": "ci"} | ||
| ], | ||
| "grade": "neutral_punch", | ||
| "total_duration_s": 4.5 | ||
| } | ||
| EOF | ||
| video-use render smoke/edit/edl.json -o smoke/edit/out.mp4 --no-subtitles | ||
| dur=$(ffprobe -v error -show_entries format=duration -of csv=p=0 smoke/edit/out.mp4) | ||
| echo "output duration: $dur" | ||
| python -c "import sys; d=float('$dur'); sys.exit(0 if 4.2 < d < 5.0 else 1)" | ||
|
|
||
| - name: Timeline view smoke test | ||
| shell: bash | ||
| run: | | ||
| video-use timeline smoke/edit/out.mp4 0 4 -o smoke/edit/tl.png | ||
| python -c "from pathlib import Path; assert Path('smoke/edit/tl.png').stat().st_size > 10000" | ||
|
|
||
| - name: Path containment regression | ||
| shell: bash | ||
| run: | | ||
| echo "secret" > smoke/secret.srt | ||
| cat > smoke/edit/evil.json <<EOF | ||
| { | ||
| "version": 1, | ||
| "sources": {"clip": "$PWD/smoke/clip.mp4"}, | ||
| "ranges": [{"source": "clip", "start": 1.0, "end": 2.0, "beat": "X", "quote": "", "reason": ""}], | ||
| "grade": "none", | ||
| "subtitles": "../../secret.srt", | ||
| "total_duration_s": 1.0 | ||
| } | ||
| EOF | ||
| if video-use render smoke/edit/evil.json -o smoke/edit/evil.mp4; then | ||
| echo "traversal EDL was not rejected" && exit 1 | ||
| else | ||
| echo "traversal rejected as expected" | ||
| fi |
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -20,18 +20,25 @@ Try video-use in [Browser Use Cloud](https://cloud.browser-use.com/v4?utm_campai | |||||||
| - **Self-evaluates the rendered output** at every cut boundary before showing you anything | ||||||||
| - **Persists session memory** in `project.md` so next week's session picks up where you left off | ||||||||
|
|
||||||||
| ## Setup prompt | ||||||||
| ## Install | ||||||||
|
|
||||||||
| Paste into Claude Code, Codex, Hermes, Openclaw, or any agent with shell access: | ||||||||
| ```bash | ||||||||
| uv tool install video-use | ||||||||
| mkdir -p ~/.claude/skills/video-use | ||||||||
| video-use skill > ~/.claude/skills/video-use/SKILL.md | ||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P2: Following 'Install from source' for a fresh user fails at Prompt for AI agents
Suggested change
|
||||||||
| video-use doctor | ||||||||
| ``` | ||||||||
|
|
||||||||
| `doctor` tells you if anything is missing (ffmpeg, API key). Store your ElevenLabs key with `video-use key` (grab one at [elevenlabs.io/app/settings/api-keys](https://elevenlabs.io/app/settings/api-keys)). | ||||||||
|
|
||||||||
| Or let your agent do it β paste into Claude Code, Codex, Hermes, Openclaw, or any agent with shell access: | ||||||||
|
|
||||||||
| ```text | ||||||||
| Set up https://github.com/browser-use/video-use for me. | ||||||||
| Set up video-use for me. | ||||||||
|
|
||||||||
| Read install.md first to install this repo, wire up ffmpeg, register the skill with whichever agent you're running under, and set up the ElevenLabs API key β ask me to paste it when you need it. Then read SKILL.md for daily usage, and always read helpers/ because that's where the editing scripts live. After install, don't transcribe anything on your own β just tell me it's ready and wait for me to drop footage into a folder. | ||||||||
| Read https://raw.githubusercontent.com/browser-use/video-use/main/install.md and follow it: install the video-use tool, wire up ffmpeg, register the skill with whichever agent you're running under, and set up the ElevenLabs API key β ask me to paste it when you need it. After install, don't transcribe anything on your own β just tell me it's ready and wait for me to drop footage into a folder. | ||||||||
| ``` | ||||||||
|
|
||||||||
| The agent handles the clone, dependencies, skill registration, and prompts you once for your ElevenLabs API key (grab one at [elevenlabs.io/app/settings/api-keys](https://elevenlabs.io/app/settings/api-keys)). | ||||||||
|
|
||||||||
| Then point your agent at a folder of raw takes: | ||||||||
|
|
||||||||
| ```bash | ||||||||
|
|
@@ -47,25 +54,18 @@ And in the session: | |||||||
|
|
||||||||
| It inventories the sources, proposes a strategy, waits for your OK, then produces `edit/final.mp4` next to your sources. All outputs live in `<videos_dir>/edit/` β the skill directory stays clean. | ||||||||
|
|
||||||||
| ## Manual install | ||||||||
| ## Install from source | ||||||||
|
|
||||||||
| If you'd rather do it by hand: | ||||||||
| If you'd rather hack on it: | ||||||||
|
|
||||||||
| ```bash | ||||||||
| # 1. Clone and symlink into your agent's skills directory | ||||||||
| git clone https://github.com/browser-use/video-use ~/Developer/video-use | ||||||||
| ln -sfn ~/Developer/video-use ~/.claude/skills/video-use # Claude Code | ||||||||
| # ln -sfn ~/Developer/video-use ~/.codex/skills/video-use # Codex | ||||||||
|
|
||||||||
| # 2. Install deps | ||||||||
| cd ~/Developer/video-use | ||||||||
| uv sync # or: pip install -e . | ||||||||
| pip install -e . # same `video-use` command, editable | ||||||||
| video-use skill > ~/.claude/skills/video-use/SKILL.md | ||||||||
| brew install ffmpeg # required | ||||||||
| brew install yt-dlp # optional, for downloading online sources | ||||||||
|
|
||||||||
| # 3. Add your ElevenLabs API key | ||||||||
| cp .env.example .env | ||||||||
| $EDITOR .env # ELEVENLABS_API_KEY=... | ||||||||
| video-use key # paste your ElevenLabs API key | ||||||||
| ``` | ||||||||
|
|
||||||||
| ## How it works | ||||||||
|
|
||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P2: Following 'Install from source' for a fresh user fails at
video-use skill > ~/.claude/skills/video-use/SKILL.mdbecause the target directory doesn't exist and the shell>redirect errors out. Addmkdir -p ~/.claude/skills/video-usebefore the redirect, matching the 'Install' section.Prompt for AI agents