cutpoint 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cutpoint-0.1.0/.gitignore +53 -0
- cutpoint-0.1.0/AGENTS.md +139 -0
- cutpoint-0.1.0/LICENSE +21 -0
- cutpoint-0.1.0/PKG-INFO +137 -0
- cutpoint-0.1.0/README.md +85 -0
- cutpoint-0.1.0/config.example.json +46 -0
- cutpoint-0.1.0/docs/troubleshooting/README.md +36 -0
- cutpoint-0.1.0/docs/workflows/README.md +94 -0
- cutpoint-0.1.0/pyproject.toml +132 -0
- cutpoint-0.1.0/src/cutpoint/__init__.py +16 -0
- cutpoint-0.1.0/src/cutpoint/__main__.py +8 -0
- cutpoint-0.1.0/src/cutpoint/activity.py +476 -0
- cutpoint-0.1.0/src/cutpoint/analyze.py +1151 -0
- cutpoint-0.1.0/src/cutpoint/assemble.py +442 -0
- cutpoint-0.1.0/src/cutpoint/backends.py +52 -0
- cutpoint-0.1.0/src/cutpoint/boundaries.py +666 -0
- cutpoint-0.1.0/src/cutpoint/cache.py +109 -0
- cutpoint-0.1.0/src/cutpoint/cli.py +920 -0
- cutpoint-0.1.0/src/cutpoint/clips.py +836 -0
- cutpoint-0.1.0/src/cutpoint/config.py +240 -0
- cutpoint-0.1.0/src/cutpoint/crash.py +1193 -0
- cutpoint-0.1.0/src/cutpoint/crop.py +149 -0
- cutpoint-0.1.0/src/cutpoint/dsp.py +16 -0
- cutpoint-0.1.0/src/cutpoint/encode.py +216 -0
- cutpoint-0.1.0/src/cutpoint/events/__init__.py +1 -0
- cutpoint-0.1.0/src/cutpoint/events/audio_events.py +369 -0
- cutpoint-0.1.0/src/cutpoint/events/cli.py +249 -0
- cutpoint-0.1.0/src/cutpoint/events/common.py +311 -0
- cutpoint-0.1.0/src/cutpoint/events/discover.py +570 -0
- cutpoint-0.1.0/src/cutpoint/events/killfeed.py +1366 -0
- cutpoint-0.1.0/src/cutpoint/events/llama_server.py +283 -0
- cutpoint-0.1.0/src/cutpoint/events/paths.py +131 -0
- cutpoint-0.1.0/src/cutpoint/events/pipeline.py +492 -0
- cutpoint-0.1.0/src/cutpoint/events/presets/wt.json +90 -0
- cutpoint-0.1.0/src/cutpoint/events/regions.py +354 -0
- cutpoint-0.1.0/src/cutpoint/events/report.py +192 -0
- cutpoint-0.1.0/src/cutpoint/events/scoring.py +138 -0
- cutpoint-0.1.0/src/cutpoint/events/setup.py +224 -0
- cutpoint-0.1.0/src/cutpoint/events/sheets.py +171 -0
- cutpoint-0.1.0/src/cutpoint/events/tails.py +179 -0
- cutpoint-0.1.0/src/cutpoint/events/visual.py +782 -0
- cutpoint-0.1.0/src/cutpoint/events/vlm_windows.py +869 -0
- cutpoint-0.1.0/src/cutpoint/events/voice.py +363 -0
- cutpoint-0.1.0/src/cutpoint/extend.py +448 -0
- cutpoint-0.1.0/src/cutpoint/extras.py +54 -0
- cutpoint-0.1.0/src/cutpoint/ffmpeg_utils.py +1061 -0
- cutpoint-0.1.0/src/cutpoint/mix.py +768 -0
- cutpoint-0.1.0/src/cutpoint/pano/__init__.py +15 -0
- cutpoint-0.1.0/src/cutpoint/pano/check.py +56 -0
- cutpoint-0.1.0/src/cutpoint/pano/cli.py +710 -0
- cutpoint-0.1.0/src/cutpoint/pano/director.py +1319 -0
- cutpoint-0.1.0/src/cutpoint/pano/geometry.py +687 -0
- cutpoint-0.1.0/src/cutpoint/pano/project.py +470 -0
- cutpoint-0.1.0/src/cutpoint/pano/qa.py +954 -0
- cutpoint-0.1.0/src/cutpoint/pano/qa_paths.py +384 -0
- cutpoint-0.1.0/src/cutpoint/pano/render.py +574 -0
- cutpoint-0.1.0/src/cutpoint/pano/repair.py +488 -0
- cutpoint-0.1.0/src/cutpoint/pano/stitch.py +778 -0
- cutpoint-0.1.0/src/cutpoint/pano/views.py +936 -0
- cutpoint-0.1.0/src/cutpoint/pano/vlcheck.py +290 -0
- cutpoint-0.1.0/src/cutpoint/pano/x3.py +273 -0
- cutpoint-0.1.0/src/cutpoint/paths.py +142 -0
- cutpoint-0.1.0/src/cutpoint/planning.py +276 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/base.json +67 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/generic.json +21 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/hike.json +34 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/moto.json +40 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/mtb.json +43 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/skate.json +35 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/ski.json +57 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/snowboard.json +37 -0
- cutpoint-0.1.0/src/cutpoint/presets/activities/surf.json +37 -0
- cutpoint-0.1.0/src/cutpoint/refmatch.py +1345 -0
- cutpoint-0.1.0/src/cutpoint/ski.py +688 -0
- cutpoint-0.1.0/src/cutpoint/sources.py +166 -0
- cutpoint-0.1.0/src/cutpoint/stage.py +235 -0
- cutpoint-0.1.0/src/cutpoint/state.py +90 -0
- cutpoint-0.1.0/src/cutpoint/styles.py +370 -0
- cutpoint-0.1.0/src/cutpoint/tail.py +259 -0
- cutpoint-0.1.0/src/cutpoint/telemetry.py +863 -0
- cutpoint-0.1.0/src/cutpoint/timeline.py +140 -0
- cutpoint-0.1.0/src/cutpoint/transcribe.py +215 -0
- cutpoint-0.1.0/src/cutpoint/utils.py +95 -0
- cutpoint-0.1.0/src/cutpoint/vision.py +211 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.venv/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.ruff_cache/
|
|
10
|
+
.coverage
|
|
11
|
+
htmlcov/
|
|
12
|
+
|
|
13
|
+
# Runtime data (lives in CUTPOINT_HOME, default %LOCALAPPDATA%\cutpoint)
|
|
14
|
+
cache/
|
|
15
|
+
models/
|
|
16
|
+
tools/llama.cpp/
|
|
17
|
+
stage/
|
|
18
|
+
projects/
|
|
19
|
+
|
|
20
|
+
# Local, personal config and learned styles (old repo-root layout; now in CUTPOINT_HOME,
|
|
21
|
+
# keys documented in config.example.json)
|
|
22
|
+
config.json
|
|
23
|
+
styles_learned/
|
|
24
|
+
EDIT_NOTES.md
|
|
25
|
+
|
|
26
|
+
# Media
|
|
27
|
+
*.mp4
|
|
28
|
+
*.mov
|
|
29
|
+
*.mkv
|
|
30
|
+
*.insv
|
|
31
|
+
*.lrv
|
|
32
|
+
*.wav
|
|
33
|
+
*.npy
|
|
34
|
+
*.npz
|
|
35
|
+
|
|
36
|
+
# OS / editors
|
|
37
|
+
.DS_Store
|
|
38
|
+
Thumbs.db
|
|
39
|
+
.vscode/
|
|
40
|
+
.idea/
|
|
41
|
+
|
|
42
|
+
# Insta360 SDK (under NDA): never commit SDK files; keep them outside the repo,
|
|
43
|
+
# e.g. in <CUTPOINT_HOME>/sdk/insta360/
|
|
44
|
+
sdk/
|
|
45
|
+
**/insta360/
|
|
46
|
+
MediaSDK*
|
|
47
|
+
RealTimeStitcherSDKTest*
|
|
48
|
+
*CameraSDK*
|
|
49
|
+
*InsMetaDataSDK*
|
|
50
|
+
*.deb
|
|
51
|
+
ins_stitcher.h
|
|
52
|
+
ins_common.h
|
|
53
|
+
ins_realtime_stitcher.h
|
cutpoint-0.1.0/AGENTS.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Cutpoint for AI agents
|
|
2
|
+
|
|
3
|
+
You are an AI agent asked to edit video with Cutpoint. This file is what you need. Read this any
|
|
4
|
+
time with `cutpoint guide`. If you are instead changing this repository's code, read
|
|
5
|
+
[CONTRIBUTING.md](https://github.com/FerventOrange/cutpoint/blob/main/CONTRIBUTING.md).
|
|
6
|
+
|
|
7
|
+
Cutpoint finds the best moments in long recordings, exports them as numbered clips and
|
|
8
|
+
assembles a finished video. It runs locally, never modifies source videos, and writes
|
|
9
|
+
everything into a project folder.
|
|
10
|
+
|
|
11
|
+
## Status: what you can rely on
|
|
12
|
+
|
|
13
|
+
| Available now | Planned (do not call; it does not exist yet) |
|
|
14
|
+
|---|---|
|
|
15
|
+
| CLI `cutpoint` with the commands below | `cutpoint edit`, `cutpoint init` |
|
|
16
|
+
| Result files in the project folder (JSON and text) | JSON on stdout for every command |
|
|
17
|
+
| Activity profiles for crash detection: `cutpoint profile`, `--context` on `profile` and `crashes` | Agent skill, profiles for the other layers and for games |
|
|
18
|
+
|
|
19
|
+
If the user asks for "edit this video and make it a montage" in one step, do it with the loop
|
|
20
|
+
below.
|
|
21
|
+
|
|
22
|
+
## Calling the CLI
|
|
23
|
+
|
|
24
|
+
- If installed as a tool (`uv tool install cutpoint`), run `cutpoint <command> ...`; from a
|
|
25
|
+
clone, `uv run cutpoint <command> ...`. The examples below use `uv run cutpoint`; with a tool
|
|
26
|
+
install, drop `uv run`. First-time setup is in
|
|
27
|
+
[docs/getting-started.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md).
|
|
28
|
+
Check it works with `cutpoint paths` (or `uv run cutpoint paths`).
|
|
29
|
+
- Exit codes: `0` success, `1` error, `130` interrupted, `2` bad arguments.
|
|
30
|
+
- Logs and errors go to stderr as `HH:MM:SS LEVEL message`; errors are `ERROR` lines. Use
|
|
31
|
+
`cutpoint -v <command>` (flag before the command) for debug output and tracebacks.
|
|
32
|
+
- Paths inside a project must start with `projects\<name>\...` or be absolute; a bare name means
|
|
33
|
+
the project itself.
|
|
34
|
+
- Results are files, not stdout. Read the JSON files below instead of parsing logs.
|
|
35
|
+
- Commands are re-runnable. Per-source results are cached (path, size, modification time).
|
|
36
|
+
`clips` refuses a non-empty output folder without `--force`.
|
|
37
|
+
- Transcription, `events` and export can take minutes to hours. Run them in the background or
|
|
38
|
+
with a long timeout.
|
|
39
|
+
- Never modify or delete the user's source videos. You may delete or rename clips in a project's
|
|
40
|
+
`clips` folder during review.
|
|
41
|
+
- Use the real options: `cutpoint <command> --help` is authoritative;
|
|
42
|
+
[docs/commands.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/commands.md)
|
|
43
|
+
explains them.
|
|
44
|
+
|
|
45
|
+
## The full edit
|
|
46
|
+
|
|
47
|
+
Given a request such as "edit D:\Videos\clip.mp4 into a funny-moments montage":
|
|
48
|
+
|
|
49
|
+
1. **Pick a style** from the request: `funny`, `gaming`, `action`, `sport`, `commentary`
|
|
50
|
+
(long talk), `ski` (action-cam with telemetry). Footage that is not any of these: use `action`
|
|
51
|
+
or `gaming`.
|
|
52
|
+
2. **Analyze.**
|
|
53
|
+
|
|
54
|
+
```powershell
|
|
55
|
+
uv run cutpoint analyze D:\Videos\clip.mp4 --style funny --out clip-edit
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Writes `highlights.json` and `transcript.txt` into the project folder (`<projects>\clip-edit`, see
|
|
59
|
+
`cutpoint paths`).
|
|
60
|
+
3. **Optional, game footage or when a model-based pass is requested:**
|
|
61
|
+
`uv run cutpoint events clip-edit` (needs the `events` extra and `cutpoint setup`). It
|
|
62
|
+
re-ranks `highlights.json` and writes `events.json` and `events.txt`. If it reports a missing
|
|
63
|
+
module, tell the user how to add the extra (see [When something fails](#when-something-fails)).
|
|
64
|
+
4. **Choose moments.** Read `highlights.json` (`candidates` with `id`, `source`, `start`, `end`,
|
|
65
|
+
`score` 0-100, `label`, `transcript`; `suggested_top`) and, for banter and funny moments,
|
|
66
|
+
`transcript.txt` (`[file.mp4 00:12:31.4-00:12:38.9] text`). Then either:
|
|
67
|
+
- take the top N: `uv run cutpoint clips clip-edit --top 8` (or `--max-total 60` for a
|
|
68
|
+
length cap, `--ids h001 h004`), or
|
|
69
|
+
- export your own picks with a segments file:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
[
|
|
73
|
+
{"source": "D:/Videos/clip.mp4", "start": 312.4, "end": 330.0, "label": "intro"},
|
|
74
|
+
{"source": "D:/Videos/clip.mp4", "start": 1204.0, "end": 1219.5, "label": "joke"}
|
|
75
|
+
]
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`uv run cutpoint clips clip-edit --segments segments.json`
|
|
79
|
+
5. **Review.** Clips are `clips\001_<label>.mp4`, `002_...`, and `clips\manifest.json` maps each
|
|
80
|
+
to its source and times. Tell the user what was exported. Delete clips the user rejects and
|
|
81
|
+
rename to reorder (for example `005_x.mp4` to `001b_x.mp4`).
|
|
82
|
+
6. **Assemble.**
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
uv run cutpoint assemble projects\clip-edit\clips --transition fade --loudnorm
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Writes `final.mp4`, `final.fcpxml` and `final.otio` in the project folder.
|
|
89
|
+
7. **Report** the paths of `final.mp4` and the clips folder.
|
|
90
|
+
|
|
91
|
+
Variants:
|
|
92
|
+
|
|
93
|
+
| Request | Do |
|
|
94
|
+
|---|---|
|
|
95
|
+
| Short clip or reel for social media | `clips <project> --vertical --max-total 60`, then `assemble projects\<project>\clips_vertical --captions` |
|
|
96
|
+
| Highlights of a specific length | `clips <project> --max-total <seconds>` |
|
|
97
|
+
| "Extra" instruction such as "only funny moments" or "keep the speech intact" | Choose `--style`, filter candidates by `transcript`/`label`, use `--segments`. The CLI does not parse these instructions |
|
|
98
|
+
| The user says what the footage is ("downhill mtb, chest mount, muddy lens") | Before `crashes`, run `profile <project> --context "<the user's words>"`; check the choice with `profile <project> --json`. Use `--activity NAME` only when the user names a sport that has a profile. Do not edit profile files |
|
|
99
|
+
| Room to trim in an editor | `clips ... --extend 1.5` or `extend <clips_dir> --seconds 2` |
|
|
100
|
+
| 360 (Insta360 X3) footage | [docs/workflows/360.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/360.md) |
|
|
101
|
+
| Action-cam with telemetry | [docs/workflows/action-cam.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/action-cam.md) |
|
|
102
|
+
| Gameplay with kill feeds | [docs/workflows/game-streams.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/game-streams.md) |
|
|
103
|
+
|
|
104
|
+
## Project files
|
|
105
|
+
|
|
106
|
+
| File | Written by | Content |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| `highlights.json` | `analyze`, `events` | Ranked candidates and settings |
|
|
109
|
+
| `transcript.txt` | `analyze` | Time-stamped transcript |
|
|
110
|
+
| `events.json`, `events.txt` | `events` | Detected sounds, HUD events, model descriptions |
|
|
111
|
+
| `clips/manifest.json` | `clips`, `extend` | Per clip: source, start, end, score, label, tail, crop |
|
|
112
|
+
| `final.mp4`, `final.fcpxml`, `final.otio` | `assemble` | Result and timelines |
|
|
113
|
+
| `crashes.json`, `telemetry.json`, `mix_segments.json` | action-cam commands | See the action-cam page |
|
|
114
|
+
| `activity.json` | `profile`, `crashes` | Activity profile in use: `name`, `source`, `profile` |
|
|
115
|
+
|
|
116
|
+
## When something fails
|
|
117
|
+
|
|
118
|
+
Read the `ERROR` line, then
|
|
119
|
+
[docs/troubleshooting/README.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/troubleshooting/README.md).
|
|
120
|
+
The usual causes: ffmpeg not on `PATH`, a missing optional extra, Ollama not reachable (only
|
|
121
|
+
affects `--vision`), a non-empty output folder.
|
|
122
|
+
|
|
123
|
+
A missing extra `X` (for example `events`) is added differently per install. Tell the user the
|
|
124
|
+
command for theirs:
|
|
125
|
+
|
|
126
|
+
- From a clone: `uv sync --extra X`, listing every other extra in use too (the error prints this
|
|
127
|
+
form).
|
|
128
|
+
- Tool install: `uv tool install "cutpoint[X]" --reinstall`, listing every extra in use. With an
|
|
129
|
+
NVIDIA GPU and the `events` extra, add
|
|
130
|
+
`--index https://download.pytorch.org/whl/cu126 --index-strategy unsafe-best-match` so torch
|
|
131
|
+
uses CUDA ([getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md#install-as-a-tool-optional)).
|
|
132
|
+
|
|
133
|
+
## Rules
|
|
134
|
+
|
|
135
|
+
- Ask the user before running `cutpoint setup` (about 8 GB of downloads), `cutpoint stage`
|
|
136
|
+
(copies footage to local disk) or `clips --force` over an existing folder.
|
|
137
|
+
- Do not paste Insta360 SDK files, documentation or output into any file or message, other than
|
|
138
|
+
`error:` lines.
|
|
139
|
+
- Do not invent options. Check `--help`.
|
cutpoint-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 FerventOrange
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
cutpoint-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: cutpoint
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Local, agent-driven AI video editor: finds highlights, cuts clips, builds montages, handles 360 video.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
8
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
11
|
+
Classifier: Topic :: Multimedia :: Video
|
|
12
|
+
Requires-Python: <3.13,>=3.12
|
|
13
|
+
Requires-Dist: faster-whisper>=1.2.1
|
|
14
|
+
Requires-Dist: numpy<3,>=2.5.4
|
|
15
|
+
Requires-Dist: nvidia-cublas-cu12>=12.4; sys_platform == 'linux'
|
|
16
|
+
Requires-Dist: nvidia-cublas-cu12>=12.9.2.10; sys_platform == 'win32'
|
|
17
|
+
Requires-Dist: nvidia-cudnn-cu12>=9.1; sys_platform == 'linux'
|
|
18
|
+
Requires-Dist: nvidia-cudnn-cu12>=9.27.0.42; sys_platform == 'win32'
|
|
19
|
+
Requires-Dist: opencv-python>=5.0.0.93
|
|
20
|
+
Requires-Dist: opentimelineio>=0.18.1
|
|
21
|
+
Requires-Dist: requests>=2.34.2
|
|
22
|
+
Requires-Dist: scenedetect>=0.7.2
|
|
23
|
+
Provides-Extra: all
|
|
24
|
+
Requires-Dist: onnxruntime>=1.31.0; extra == 'all'
|
|
25
|
+
Requires-Dist: open-clip-torch>=3.3.0; extra == 'all'
|
|
26
|
+
Requires-Dist: panns-inference>=0.1.1; extra == 'all'
|
|
27
|
+
Requires-Dist: rapidocr-onnxruntime>=1.4.4; extra == 'all'
|
|
28
|
+
Requires-Dist: scikit-learn>=1.9.1; extra == 'all'
|
|
29
|
+
Requires-Dist: scipy>=1.18.1; extra == 'all'
|
|
30
|
+
Requires-Dist: telemetry-parser>=0.3.0; extra == 'all'
|
|
31
|
+
Requires-Dist: torch==2.14.1; extra == 'all'
|
|
32
|
+
Requires-Dist: torchlibrosa>=0.1.0; extra == 'all'
|
|
33
|
+
Requires-Dist: torchvision==0.29.1; extra == 'all'
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: pre-commit>=3.7; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
37
|
+
Requires-Dist: ruff==0.17.1; extra == 'dev'
|
|
38
|
+
Provides-Extra: events
|
|
39
|
+
Requires-Dist: onnxruntime>=1.31.0; extra == 'events'
|
|
40
|
+
Requires-Dist: open-clip-torch>=3.3.0; extra == 'events'
|
|
41
|
+
Requires-Dist: panns-inference>=0.1.1; extra == 'events'
|
|
42
|
+
Requires-Dist: rapidocr-onnxruntime>=1.4.4; extra == 'events'
|
|
43
|
+
Requires-Dist: scikit-learn>=1.9.1; extra == 'events'
|
|
44
|
+
Requires-Dist: scipy>=1.18.1; extra == 'events'
|
|
45
|
+
Requires-Dist: torch==2.14.1; extra == 'events'
|
|
46
|
+
Requires-Dist: torchlibrosa>=0.1.0; extra == 'events'
|
|
47
|
+
Requires-Dist: torchvision==0.29.1; extra == 'events'
|
|
48
|
+
Provides-Extra: gpu
|
|
49
|
+
Provides-Extra: ski
|
|
50
|
+
Requires-Dist: telemetry-parser>=0.3.0; extra == 'ski'
|
|
51
|
+
Description-Content-Type: text/markdown
|
|
52
|
+
|
|
53
|
+
<p align="center">
|
|
54
|
+
<img src="https://raw.githubusercontent.com/FerventOrange/cutpoint/main/docs/assets/logo-256.png" alt="Cutpoint logo: a clapperboard with three characters peeking out" width="200">
|
|
55
|
+
</p>
|
|
56
|
+
|
|
57
|
+
# Cutpoint
|
|
58
|
+
|
|
59
|
+
Cutpoint is an AI video editor that your coding agent drives. Tell the agent to edit a video and
|
|
60
|
+
it finds the best moments, cuts them into clips and assembles the result. All analysis runs on
|
|
61
|
+
your own computer, so your agent does not spend API credits on video, and your original files
|
|
62
|
+
are never changed.
|
|
63
|
+
|
|
64
|
+
[Are you an AI agent? Start here](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md)
|
|
65
|
+
|
|
66
|
+
(Installed from PyPI? Run `cutpoint guide`.)
|
|
67
|
+
|
|
68
|
+
## What you get
|
|
69
|
+
|
|
70
|
+
- Trimmed, numbered clips of the best moments
|
|
71
|
+
- A transcript of the video with timestamps
|
|
72
|
+
- A finished video, `final.mp4`, plus timelines you can open in DaVinci Resolve
|
|
73
|
+
- Vertical (9:16) versions for shorts and reels
|
|
74
|
+
- Works on gameplay, action-cam, sport, funny moments, commentary and 360 video
|
|
75
|
+
|
|
76
|
+
## Use it
|
|
77
|
+
|
|
78
|
+
1. Install Cutpoint (below).
|
|
79
|
+
2. Open your agent (Claude Code, Codex, Grok CLI or any CLI agent) in the Cutpoint folder, or
|
|
80
|
+
tell it where Cutpoint is.
|
|
81
|
+
3. Ask it to edit your video:
|
|
82
|
+
|
|
83
|
+
> Edit D:\Videos\clip.mp4 into a 60 second highlights video with Cutpoint.
|
|
84
|
+
|
|
85
|
+
> Find the funniest moments in ~/Videos/stream.mp4 and show me the clips before you
|
|
86
|
+
> assemble them.
|
|
87
|
+
|
|
88
|
+
> Make a vertical montage from ~/Videos/ride.mp4.
|
|
89
|
+
|
|
90
|
+
The agent runs Cutpoint, shows you the clips and writes the result into a project folder.
|
|
91
|
+
Delete or rename clips to change the cut, then ask the agent to assemble again.
|
|
92
|
+
|
|
93
|
+
One-command editing (`cutpoint edit`), a first-run setup wizard and an agent skill are
|
|
94
|
+
planned. Today the agent runs the steps itself using [AGENTS.md](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md).
|
|
95
|
+
|
|
96
|
+
## Requirements
|
|
97
|
+
|
|
98
|
+
- Windows or Linux
|
|
99
|
+
- Python 3.12 and [uv](https://docs.astral.sh/uv/)
|
|
100
|
+
- ffmpeg
|
|
101
|
+
- An NVIDIA GPU is recommended. Without one, everything still runs but slower.
|
|
102
|
+
- Optional: Ollama for AI frame rating, extra downloads (about 8 GB) for sound, on-screen text
|
|
103
|
+
and scene-description features
|
|
104
|
+
|
|
105
|
+
## Install
|
|
106
|
+
|
|
107
|
+
```powershell
|
|
108
|
+
winget install --id Gyan.FFmpeg -e
|
|
109
|
+
winget install --id astral-sh.uv -e
|
|
110
|
+
git clone https://github.com/FerventOrange/cutpoint.git
|
|
111
|
+
cd cutpoint
|
|
112
|
+
uv sync
|
|
113
|
+
uv run cutpoint paths
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
To get a global `cutpoint` command instead, run `uv tool install cutpoint` (from PyPI) after
|
|
117
|
+
installing ffmpeg and uv.
|
|
118
|
+
|
|
119
|
+
On Linux, install ffmpeg and uv with your package manager or their installers, then run the
|
|
120
|
+
last four commands. The optional extras and model downloads are explained in
|
|
121
|
+
[Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md).
|
|
122
|
+
|
|
123
|
+
## Documentation
|
|
124
|
+
|
|
125
|
+
- [Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md): install, first run, where data is stored, models
|
|
126
|
+
- [Using Cutpoint from an agent](https://github.com/FerventOrange/cutpoint/blob/main/docs/agents.md): set up Claude Code, Codex, Grok or another agent
|
|
127
|
+
- [Workflows](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/README.md): montages, game streams, action-cam, 360 video, vertical output
|
|
128
|
+
- [Command reference](https://github.com/FerventOrange/cutpoint/blob/main/docs/commands.md)
|
|
129
|
+
- [Configuration](https://github.com/FerventOrange/cutpoint/blob/main/docs/configuration.md)
|
|
130
|
+
- [Troubleshooting](https://github.com/FerventOrange/cutpoint/blob/main/docs/troubleshooting/README.md)
|
|
131
|
+
- [FAQ](https://github.com/FerventOrange/cutpoint/blob/main/docs/faq.md)
|
|
132
|
+
- [Architecture](https://github.com/FerventOrange/cutpoint/blob/main/docs/architecture.md), [Contributing](https://github.com/FerventOrange/cutpoint/blob/main/CONTRIBUTING.md), [Security](https://github.com/FerventOrange/cutpoint/blob/main/SECURITY.md)
|
|
133
|
+
- [Insta360 SDK](https://github.com/FerventOrange/cutpoint/blob/main/docs/insta360-sdk.md): optional, for high-quality 360 stitching
|
|
134
|
+
|
|
135
|
+
## License
|
|
136
|
+
|
|
137
|
+
Cutpoint is released under the [MIT License](https://github.com/FerventOrange/cutpoint/blob/main/LICENSE).
|
cutpoint-0.1.0/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/FerventOrange/cutpoint/main/docs/assets/logo-256.png" alt="Cutpoint logo: a clapperboard with three characters peeking out" width="200">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# Cutpoint
|
|
6
|
+
|
|
7
|
+
Cutpoint is an AI video editor that your coding agent drives. Tell the agent to edit a video and
|
|
8
|
+
it finds the best moments, cuts them into clips and assembles the result. All analysis runs on
|
|
9
|
+
your own computer, so your agent does not spend API credits on video, and your original files
|
|
10
|
+
are never changed.
|
|
11
|
+
|
|
12
|
+
[Are you an AI agent? Start here](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md)
|
|
13
|
+
|
|
14
|
+
(Installed from PyPI? Run `cutpoint guide`.)
|
|
15
|
+
|
|
16
|
+
## What you get
|
|
17
|
+
|
|
18
|
+
- Trimmed, numbered clips of the best moments
|
|
19
|
+
- A transcript of the video with timestamps
|
|
20
|
+
- A finished video, `final.mp4`, plus timelines you can open in DaVinci Resolve
|
|
21
|
+
- Vertical (9:16) versions for shorts and reels
|
|
22
|
+
- Works on gameplay, action-cam, sport, funny moments, commentary and 360 video
|
|
23
|
+
|
|
24
|
+
## Use it
|
|
25
|
+
|
|
26
|
+
1. Install Cutpoint (below).
|
|
27
|
+
2. Open your agent (Claude Code, Codex, Grok CLI or any CLI agent) in the Cutpoint folder, or
|
|
28
|
+
tell it where Cutpoint is.
|
|
29
|
+
3. Ask it to edit your video:
|
|
30
|
+
|
|
31
|
+
> Edit D:\Videos\clip.mp4 into a 60 second highlights video with Cutpoint.
|
|
32
|
+
|
|
33
|
+
> Find the funniest moments in ~/Videos/stream.mp4 and show me the clips before you
|
|
34
|
+
> assemble them.
|
|
35
|
+
|
|
36
|
+
> Make a vertical montage from ~/Videos/ride.mp4.
|
|
37
|
+
|
|
38
|
+
The agent runs Cutpoint, shows you the clips and writes the result into a project folder.
|
|
39
|
+
Delete or rename clips to change the cut, then ask the agent to assemble again.
|
|
40
|
+
|
|
41
|
+
One-command editing (`cutpoint edit`), a first-run setup wizard and an agent skill are
|
|
42
|
+
planned. Today the agent runs the steps itself using [AGENTS.md](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md).
|
|
43
|
+
|
|
44
|
+
## Requirements
|
|
45
|
+
|
|
46
|
+
- Windows or Linux
|
|
47
|
+
- Python 3.12 and [uv](https://docs.astral.sh/uv/)
|
|
48
|
+
- ffmpeg
|
|
49
|
+
- An NVIDIA GPU is recommended. Without one, everything still runs but slower.
|
|
50
|
+
- Optional: Ollama for AI frame rating, extra downloads (about 8 GB) for sound, on-screen text
|
|
51
|
+
and scene-description features
|
|
52
|
+
|
|
53
|
+
## Install
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
winget install --id Gyan.FFmpeg -e
|
|
57
|
+
winget install --id astral-sh.uv -e
|
|
58
|
+
git clone https://github.com/FerventOrange/cutpoint.git
|
|
59
|
+
cd cutpoint
|
|
60
|
+
uv sync
|
|
61
|
+
uv run cutpoint paths
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
To get a global `cutpoint` command instead, run `uv tool install cutpoint` (from PyPI) after
|
|
65
|
+
installing ffmpeg and uv.
|
|
66
|
+
|
|
67
|
+
On Linux, install ffmpeg and uv with your package manager or their installers, then run the
|
|
68
|
+
last four commands. The optional extras and model downloads are explained in
|
|
69
|
+
[Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md).
|
|
70
|
+
|
|
71
|
+
## Documentation
|
|
72
|
+
|
|
73
|
+
- [Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md): install, first run, where data is stored, models
|
|
74
|
+
- [Using Cutpoint from an agent](https://github.com/FerventOrange/cutpoint/blob/main/docs/agents.md): set up Claude Code, Codex, Grok or another agent
|
|
75
|
+
- [Workflows](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/README.md): montages, game streams, action-cam, 360 video, vertical output
|
|
76
|
+
- [Command reference](https://github.com/FerventOrange/cutpoint/blob/main/docs/commands.md)
|
|
77
|
+
- [Configuration](https://github.com/FerventOrange/cutpoint/blob/main/docs/configuration.md)
|
|
78
|
+
- [Troubleshooting](https://github.com/FerventOrange/cutpoint/blob/main/docs/troubleshooting/README.md)
|
|
79
|
+
- [FAQ](https://github.com/FerventOrange/cutpoint/blob/main/docs/faq.md)
|
|
80
|
+
- [Architecture](https://github.com/FerventOrange/cutpoint/blob/main/docs/architecture.md), [Contributing](https://github.com/FerventOrange/cutpoint/blob/main/CONTRIBUTING.md), [Security](https://github.com/FerventOrange/cutpoint/blob/main/SECURITY.md)
|
|
81
|
+
- [Insta360 SDK](https://github.com/FerventOrange/cutpoint/blob/main/docs/insta360-sdk.md): optional, for high-quality 360 stitching
|
|
82
|
+
|
|
83
|
+
## License
|
|
84
|
+
|
|
85
|
+
Cutpoint is released under the [MIT License](https://github.com/FerventOrange/cutpoint/blob/main/LICENSE).
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_doc": {
|
|
3
|
+
"about": "Example Cutpoint settings. Copy to <CUTPOINT_HOME>\\config.json (run `cutpoint paths` to see where that is) and keep only the keys you need; every key is optional. Keys starting with '_' are ignored.",
|
|
4
|
+
"projects_dir": "Folder for project folders. A bare project name (my-trip) or projects\\<name> argument is placed here. Env CUTPOINT_PROJECTS_DIR overrides it. Default: <CUTPOINT_HOME>\\projects.",
|
|
5
|
+
"source_remap": "{old prefix: new prefix}. Point old paths at a new location when footage moves (another drive, a backup copy): a source under an old prefix is read from the new prefix when the file exists there. Projects and cache keys keep the original path, so nothing has to be re-analysed.",
|
|
6
|
+
"source_remap_exclude": "File-name or full-path globs that are never remapped (e.g. a copy that is not verified yet).",
|
|
7
|
+
"stage_dir": "Local folder for `cutpoint stage` copies of sources on slow or network storage (NAS, USB, cloud-synced folder). Env CUTPOINT_STAGE_DIR overrides it. Default: <CUTPOINT_HOME>\\stage.",
|
|
8
|
+
"player_tags": "Your in-game name(s) for the optional game-HUD OCR in `cutpoint events` (who killed whom). Fuzzy match, ignores _ . - and spaces. `cutpoint events --player NAME` overrides it per run. Default: none.",
|
|
9
|
+
"ollama_url": "Ollama base URL for `analyze --vision` and the VLM layers of `cutpoint events`. Env OLLAMA_HOST overrides it. Default: http://localhost:11434.",
|
|
10
|
+
"pano": "Optional 360-camera (Insta360) module: sdk_exe = MediaSDKTest.exe of the Insta360 Media SDK, which you apply for yourself (see docs/insta360-sdk.md; env CUTPOINT_INSTA360_SDK overrides; default: auto-detected under <CUTPOINT_HOME>\\sdk\\insta360\\); stitch_timeout_s = kill one clip's stitch after this many seconds (default: no limit); stitched_dir = where `cutpoint 360 stitch` writes equirects (default <CUTPOINT_HOME>\\360-stitched; about 54 GB per hour of footage); studio_dirs = folders with Insta360 Studio equirect exports (default <CUTPOINT_HOME>\\360-studio); stitch_args = MediaSDKTest arguments; cmd_every = update the virtual camera every N frames (default 1; 2 halves the commands but leaves shake on every other frame); level_strength = horizon lock when stabilising, 1 = always level, 0 = follow the camera's own tilt (default 0.7); tilt_follow_s = smoothing (s) of the followed tilt (default 0.5); imu_offset_s = IMU-to-video time offset in seconds (default 0); equirect_yaw_offset = yaw correction in degrees for Studio exports (default 0); default_style = --style of `cutpoint 360 analyze` when none is given (default ski).",
|
|
11
|
+
"environment": "Not set here: CUTPOINT_HOME (data root), CUTPOINT_CONFIG (this file), CUTPOINT_CACHE_DIR, CUTPOINT_MODELS_DIR, CUTPOINT_TOOLS_DIR, CUTPOINT_STYLES_DIR, CUTPOINT_FFMPEG / CUTPOINT_FFPROBE, CUTPOINT_LLAMA_SERVER (llama-server.exe), CUTPOINT_VISION_MODEL (Ollama model for `analyze --vision`, default qwen3-vl:8b) and OLLAMA_HOST (overrides ollama_url)."
|
|
12
|
+
},
|
|
13
|
+
"projects_dir": "D:\\Footage\\cutpoint-projects",
|
|
14
|
+
"source_remap": {
|
|
15
|
+
"D:\\Footage": "E:\\Footage-copy"
|
|
16
|
+
},
|
|
17
|
+
"source_remap_exclude": [
|
|
18
|
+
"*unverified*"
|
|
19
|
+
],
|
|
20
|
+
"stage_dir": "C:\\Cutpoint\\stage",
|
|
21
|
+
"player_tags": [
|
|
22
|
+
"YourGameName"
|
|
23
|
+
],
|
|
24
|
+
"pano": {
|
|
25
|
+
"sdk_exe": "<CUTPOINT_HOME>\\sdk\\insta360\\MediaSDK-<version>-win64\\bin\\MediaSDKTest.exe",
|
|
26
|
+
"stitched_dir": "D:\\Footage\\360-stitched",
|
|
27
|
+
"stitch_timeout_s": 7200,
|
|
28
|
+
"studio_dirs": [
|
|
29
|
+
"D:\\Footage\\360-studio"
|
|
30
|
+
],
|
|
31
|
+
"stitch_args": [
|
|
32
|
+
"-stitch_type", "optflow",
|
|
33
|
+
"-output_size", "5760x2880",
|
|
34
|
+
"-enable_h265_encoder",
|
|
35
|
+
"-bitrate", "100000000",
|
|
36
|
+
"-enable_flowstate",
|
|
37
|
+
"-enable_stitchfusion"
|
|
38
|
+
],
|
|
39
|
+
"cmd_every": 1,
|
|
40
|
+
"level_strength": 0.7,
|
|
41
|
+
"tilt_follow_s": 0.5,
|
|
42
|
+
"imu_offset_s": 0.0,
|
|
43
|
+
"equirect_yaw_offset": 0.0,
|
|
44
|
+
"default_style": "ski"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Troubleshooting
|
|
2
|
+
|
|
3
|
+
Start with `cutpoint -v <command> ...`: `-v` turns on debug logging and prints tracebacks. Errors
|
|
4
|
+
are logged as `ERROR` lines and the command exits with status 1.
|
|
5
|
+
|
|
6
|
+
| Symptom | Page |
|
|
7
|
+
|---|---|
|
|
8
|
+
| ffmpeg not found, NVENC errors, slow encoding, CUDA or cuDNN errors, out of GPU memory | [ffmpeg and GPU](ffmpeg-gpu.md) |
|
|
9
|
+
| Ollama not reachable, model downloads fail, missing module, `setup` problems | [Models and Ollama](models.md) |
|
|
10
|
+
| Disk full, slow or network drives, read errors, damaged files | [Storage](storage.md) |
|
|
11
|
+
| 360 clips, SDK not found, stitching fails | [360 and the Insta360 SDK](360.md) |
|
|
12
|
+
|
|
13
|
+
## Quick checks
|
|
14
|
+
|
|
15
|
+
```powershell
|
|
16
|
+
cutpoint paths # where Cutpoint looks for data
|
|
17
|
+
ffmpeg -version # ffmpeg is installed and on PATH
|
|
18
|
+
nvidia-smi # driver and GPU are visible (NVIDIA)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Common messages
|
|
22
|
+
|
|
23
|
+
| Message or symptom | Fix |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `No module named ...` followed by an install command | An optional extra is missing. Run the printed `uv sync --extra ...` command and list every extra you use, because `uv sync` removes the packages of extras you leave out |
|
|
26
|
+
| A command works in `uv run` but not as plain `cutpoint` | The tool is not on `PATH`. Use `uv run cutpoint`, install with `uv tool install cutpoint` (or `uv tool install .` from a clone), or use the wrappers `.\cutpoint.cmd` / `.\cutpoint.ps1` |
|
|
27
|
+
| PowerShell refuses to run `cutpoint.ps1` | Use `.\cutpoint.cmd`, or `uv run cutpoint` |
|
|
28
|
+
| `clips` refuses to write | The output folder is not empty. Use another `--out`, or `--force` to replace it |
|
|
29
|
+
| `assemble` joined the wrong clips or order | It uses the `.mp4` files in the folder now, in natural filename order. Rename or delete files and run it again |
|
|
30
|
+
| Results look stale after a code or setting change | Analysis is cached per source file in `<CUTPOINT_HOME>\cache`. The cache is safe to delete, or recompute layers with `events --force LAYER` |
|
|
31
|
+
| Wrong clips in `highlights.json` for silent footage | Scoring is heuristic and works best with voice or mic audio. Silent gameplay relies on loudness, scene cuts and vision only. Pick segments yourself with `clips --segments` |
|
|
32
|
+
| Whisper hallucinated text such as "Yeah. Yeah. Yeah." | Obvious repeats are filtered. Delete `cache\<source>\transcript-*.json` to re-transcribe with the full filter |
|
|
33
|
+
|
|
34
|
+
If none of this helps, open an issue with the command, the log lines around the error, your OS
|
|
35
|
+
and GPU, and the output of `cutpoint paths`. Remove private paths first. Do not paste Insta360
|
|
36
|
+
SDK files, documentation or output.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Workflows
|
|
2
|
+
|
|
3
|
+
All examples use `cutpoint` for `uv run cutpoint`. Paths are examples; use your own.
|
|
4
|
+
|
|
5
|
+
| Page | Use it for |
|
|
6
|
+
|---|---|
|
|
7
|
+
| This page | Montage and highlights from any video, vertical output, importing into Resolve |
|
|
8
|
+
| [Game streams](game-streams.md) | Gameplay and stream recordings, HUD OCR, boxed stream layouts |
|
|
9
|
+
| [Action-cam](action-cam.md) | GoPro-style footage with telemetry: jumps, crashes, a varied mix |
|
|
10
|
+
| [360 video](360.md) | Insta360 X3: mix, director, QA, repair, clips, assemble |
|
|
11
|
+
| [360 director](360-director.md) | How the 360 virtual-camera director works |
|
|
12
|
+
|
|
13
|
+
## Montage or highlights from one or more videos
|
|
14
|
+
|
|
15
|
+
```powershell
|
|
16
|
+
# 1. Find and rank moments. Writes projects\my-edit\highlights.json and transcript.txt
|
|
17
|
+
cutpoint analyze D:\Videos\clip.mp4 --style gaming --out my-edit
|
|
18
|
+
|
|
19
|
+
# Several files and folders at once, skipping some by glob:
|
|
20
|
+
cutpoint analyze D:\Videos\session1 D:\Videos\extra.mp4 --exclude "*DVR*" --style gaming --out my-edit
|
|
21
|
+
|
|
22
|
+
# 2. Optional: detect what happens (sounds, HUD text, model descriptions).
|
|
23
|
+
# Needs the `events` extra and `cutpoint setup`. Re-ranks highlights.json.
|
|
24
|
+
cutpoint events my-edit
|
|
25
|
+
|
|
26
|
+
# 3. Export the best moments as 001_<label>.mp4, 002_<label>.mp4, ...
|
|
27
|
+
cutpoint clips my-edit --top 8
|
|
28
|
+
|
|
29
|
+
# 4. Review projects\my-edit\clips. Delete clips you do not want; rename to reorder.
|
|
30
|
+
|
|
31
|
+
# 5. Build the video from whatever is in the folder, in filename order.
|
|
32
|
+
cutpoint assemble projects\my-edit\clips --transition fade --loudnorm
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Output: `projects\my-edit\final.mp4`, `final.fcpxml` and `final.otio`.
|
|
36
|
+
|
|
37
|
+
Choose the style by content: `funny` for banter and laughter, `gaming` or `action` for fast
|
|
38
|
+
footage, `sport` for crowd-driven events, `commentary` for long talk (clips of 20-120 s, in
|
|
39
|
+
chronological order).
|
|
40
|
+
|
|
41
|
+
### Pick moments yourself
|
|
42
|
+
|
|
43
|
+
Read `transcript.txt` (or `events.txt` after `events`), then write the ranges you want:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
[
|
|
47
|
+
{"source": "D:/Videos/clip.mp4", "start": 312.4, "end": 330.0, "label": "intro"},
|
|
48
|
+
{"source": "D:/Videos/clip.mp4", "start": 1204.0, "end": 1219.5, "label": "joke"}
|
|
49
|
+
]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```powershell
|
|
53
|
+
cutpoint clips my-edit --segments segments.json
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
You can mix hand-picked segments with auto-scored ones by exporting both and joining the clips.
|
|
57
|
+
Per-segment options (tails, crop, padding) are in the [command reference](../commands.md#clips).
|
|
58
|
+
|
|
59
|
+
### More room for trimming
|
|
60
|
+
|
|
61
|
+
If you will trim in an editor, export handles:
|
|
62
|
+
|
|
63
|
+
```powershell
|
|
64
|
+
cutpoint clips my-edit --top 8 --extend 1.5 # padding at export
|
|
65
|
+
cutpoint extend projects\my-edit\clips --seconds 2 # or re-export an existing folder
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Vertical (9:16) output
|
|
69
|
+
|
|
70
|
+
```powershell
|
|
71
|
+
cutpoint clips my-edit --vertical --max-total 60 # projects\my-edit\clips_vertical, 1080x1920
|
|
72
|
+
cutpoint assemble projects\my-edit\clips_vertical --captions # projects\my-edit\final_vertical.mp4
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`--vertical` is a fixed centre crop with no subject tracking. For 360 footage the renderer
|
|
76
|
+
frames the shot itself (see [360 video](360.md)).
|
|
77
|
+
|
|
78
|
+
## Importing into DaVinci Resolve (Free)
|
|
79
|
+
|
|
80
|
+
Resolve Free has no Python API, so the hand-off is through files.
|
|
81
|
+
|
|
82
|
+
1. Open your project and choose File > Import > Timeline (Ctrl+Shift+I).
|
|
83
|
+
2. Pick `final.fcpxml`. `final.otio` also works.
|
|
84
|
+
3. Leave "Automatically import source clips into media pool" checked and click OK.
|
|
85
|
+
|
|
86
|
+
The timeline places the clips back to back in filename order at their frame rate. It uses hard
|
|
87
|
+
cuts even if the MP4 was built with `--transition fade`, so you can add transitions in Resolve.
|
|
88
|
+
Audio fades are baked into the clip files. If you move the clips folder, relink the media in
|
|
89
|
+
Resolve or run `assemble` again.
|
|
90
|
+
|
|
91
|
+
## Reading slow or network sources once
|
|
92
|
+
|
|
93
|
+
Copy sources to a local disk first with `cutpoint stage`; see
|
|
94
|
+
[slow storage](../troubleshooting/storage.md).
|