moviestar 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.
- moviestar-0.1.0/PKG-INFO +95 -0
- moviestar-0.1.0/README.md +72 -0
- moviestar-0.1.0/pyproject.toml +42 -0
- moviestar-0.1.0/setup.cfg +4 -0
- moviestar-0.1.0/src/moviestar/__init__.py +15 -0
- moviestar-0.1.0/src/moviestar/cli.py +3111 -0
- moviestar-0.1.0/src/moviestar/ffmpeg.py +289 -0
- moviestar-0.1.0/src/moviestar/find.py +252 -0
- moviestar-0.1.0/src/moviestar/project.py +432 -0
- moviestar-0.1.0/src/moviestar/schema/__init__.py +1 -0
- moviestar-0.1.0/src/moviestar/schema/spec-0.1.json +45 -0
- moviestar-0.1.0/src/moviestar/spec.py +305 -0
- moviestar-0.1.0/src/moviestar/timecodes.py +85 -0
- moviestar-0.1.0/src/moviestar/transcribe.py +237 -0
- moviestar-0.1.0/src/moviestar.egg-info/PKG-INFO +95 -0
- moviestar-0.1.0/src/moviestar.egg-info/SOURCES.txt +26 -0
- moviestar-0.1.0/src/moviestar.egg-info/dependency_links.txt +1 -0
- moviestar-0.1.0/src/moviestar.egg-info/entry_points.txt +2 -0
- moviestar-0.1.0/src/moviestar.egg-info/requires.txt +6 -0
- moviestar-0.1.0/src/moviestar.egg-info/top_level.txt +1 -0
- moviestar-0.1.0/tests/test_cli.py +6543 -0
- moviestar-0.1.0/tests/test_ffmpeg.py +332 -0
- moviestar-0.1.0/tests/test_find.py +260 -0
- moviestar-0.1.0/tests/test_invariants.py +124 -0
- moviestar-0.1.0/tests/test_project.py +583 -0
- moviestar-0.1.0/tests/test_spec.py +400 -0
- moviestar-0.1.0/tests/test_timecodes.py +92 -0
- moviestar-0.1.0/tests/test_transcribe.py +258 -0
moviestar-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: moviestar
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Video editing CLI for AI agents. Load videos, fuzzy-search transcripts, trim, and export with FFmpeg.
|
|
5
|
+
Author: James Dillard
|
|
6
|
+
License: BSL-1.1
|
|
7
|
+
Keywords: video,ffmpeg,ai,agents,cli,transcript,whisper,editing
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Environment :: Console
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Topic :: Multimedia :: Video
|
|
12
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
Requires-Dist: click>=8.0
|
|
19
|
+
Requires-Dist: faster-whisper>=1.0
|
|
20
|
+
Requires-Dist: rapidfuzz>=3.0
|
|
21
|
+
Provides-Extra: diarize
|
|
22
|
+
Requires-Dist: pyannote.audio>=3.0; extra == "diarize"
|
|
23
|
+
|
|
24
|
+
# moviestar
|
|
25
|
+
|
|
26
|
+
**Video editing CLI for AI agents.** Give your coding agent the ability to edit video.
|
|
27
|
+
|
|
28
|
+
Your agent loads a video, fuzzy-searches the transcript, trims to result-time ranges, snaps cuts to word boundaries, and renders with FFmpeg. All output is structured JSON. Source files are never modified — edits are described in a declarative spec and applied at render time.
|
|
29
|
+
|
|
30
|
+
## Quick start
|
|
31
|
+
|
|
32
|
+
Make sure FFmpeg is on PATH (`brew install ffmpeg` on Mac), create a Python 3.10+ venv, then paste this into Claude Code, Cursor, or any coding agent:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Create a Python 3.10+ virtual environment, then:
|
|
36
|
+
|
|
37
|
+
pip install moviestar
|
|
38
|
+
moviestar --help
|
|
39
|
+
|
|
40
|
+
Read the --help output — it's your operational briefing.
|
|
41
|
+
|
|
42
|
+
Then load the video at ~/Downloads/podcast.mp4. Find the moment where
|
|
43
|
+
the host says "the bottom line, here's what I think." Trim to just
|
|
44
|
+
that sentence with --snap-to-words so the cuts don't land mid-word.
|
|
45
|
+
Export the result to ~/Desktop/clip.mp4 and tell me how long it is.
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The agent will work through `load → find → trim → export`, returning structured JSON at every step. No GUI, no timeline, no manual scrubbing.
|
|
49
|
+
|
|
50
|
+
## What's in v0.1
|
|
51
|
+
|
|
52
|
+
**Browse:**
|
|
53
|
+
- `moviestar load` — index a video, transcribe with local Whisper.
|
|
54
|
+
- `moviestar skim` — fast browse: thumbnails + transcript over a range.
|
|
55
|
+
- `moviestar inspect` — dense thumbnails on demand at a configurable interval.
|
|
56
|
+
- `moviestar watch` — extract an MP4 segment for multimodal model analysis.
|
|
57
|
+
- `moviestar status` — current project state at a glance.
|
|
58
|
+
|
|
59
|
+
**Edit:**
|
|
60
|
+
- `moviestar trim` — append a trim to the edit spec (result-time semantics; stacks compose).
|
|
61
|
+
- `moviestar undo` — pop the last operation.
|
|
62
|
+
- `moviestar spec` — show the current spec (or `--edit` to replace).
|
|
63
|
+
- `moviestar find` — fuzzy-search the transcript for a phrase.
|
|
64
|
+
|
|
65
|
+
**Output:**
|
|
66
|
+
- `moviestar export` — render the spec's effective timeline to MP4.
|
|
67
|
+
- `moviestar screenshot` — single frame at a timecode (project-aware: `--at` is in result-time).
|
|
68
|
+
|
|
69
|
+
**Always-available:**
|
|
70
|
+
- `moviestar probe` — ffprobe metadata as JSON.
|
|
71
|
+
- `--dry-run` on every expensive command (`load`, `inspect`, `watch`, `export`, `spec --edit`).
|
|
72
|
+
|
|
73
|
+
Run `moviestar --help` for the full command list.
|
|
74
|
+
|
|
75
|
+
## Why moviestar
|
|
76
|
+
|
|
77
|
+
Video editing tools are built for humans with GUIs. Agents don't have hands on a timeline or eyes on a canvas. moviestar is the hands; the agent is the brain.
|
|
78
|
+
|
|
79
|
+
- **Verbose by default.** Every command returns rich structured JSON — agents can discard what they don't need, but can't invent data the CLI didn't provide.
|
|
80
|
+
- **Deterministic.** Same input + same parameters = same output. No randomness, no hidden model calls.
|
|
81
|
+
- **Result-time semantics.** A second trim narrows the current result, not the original source. `find` matches resolve to both source-time and result-time so screenshots and exports compose cleanly.
|
|
82
|
+
- **Non-destructive.** Source files are never modified.
|
|
83
|
+
|
|
84
|
+
Full design and product principles in the project docs.
|
|
85
|
+
|
|
86
|
+
## Requirements
|
|
87
|
+
|
|
88
|
+
- **Python 3.10+**
|
|
89
|
+
- **FFmpeg** on `PATH` (`brew install ffmpeg` / `apt install ffmpeg`)
|
|
90
|
+
|
|
91
|
+
The package weighs ~210MB on install — `faster-whisper` ships local transcription out of the box (no API keys, no cloud round-trip). Diarization is opt-in: `pip install moviestar[diarize]`.
|
|
92
|
+
|
|
93
|
+
## Status
|
|
94
|
+
|
|
95
|
+
v0.1 — first public release. Core loop is working: load → browse → edit → export. The roadmap of what's next lives with the project.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# moviestar
|
|
2
|
+
|
|
3
|
+
**Video editing CLI for AI agents.** Give your coding agent the ability to edit video.
|
|
4
|
+
|
|
5
|
+
Your agent loads a video, fuzzy-searches the transcript, trims to result-time ranges, snaps cuts to word boundaries, and renders with FFmpeg. All output is structured JSON. Source files are never modified — edits are described in a declarative spec and applied at render time.
|
|
6
|
+
|
|
7
|
+
## Quick start
|
|
8
|
+
|
|
9
|
+
Make sure FFmpeg is on PATH (`brew install ffmpeg` on Mac), create a Python 3.10+ venv, then paste this into Claude Code, Cursor, or any coding agent:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Create a Python 3.10+ virtual environment, then:
|
|
13
|
+
|
|
14
|
+
pip install moviestar
|
|
15
|
+
moviestar --help
|
|
16
|
+
|
|
17
|
+
Read the --help output — it's your operational briefing.
|
|
18
|
+
|
|
19
|
+
Then load the video at ~/Downloads/podcast.mp4. Find the moment where
|
|
20
|
+
the host says "the bottom line, here's what I think." Trim to just
|
|
21
|
+
that sentence with --snap-to-words so the cuts don't land mid-word.
|
|
22
|
+
Export the result to ~/Desktop/clip.mp4 and tell me how long it is.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The agent will work through `load → find → trim → export`, returning structured JSON at every step. No GUI, no timeline, no manual scrubbing.
|
|
26
|
+
|
|
27
|
+
## What's in v0.1
|
|
28
|
+
|
|
29
|
+
**Browse:**
|
|
30
|
+
- `moviestar load` — index a video, transcribe with local Whisper.
|
|
31
|
+
- `moviestar skim` — fast browse: thumbnails + transcript over a range.
|
|
32
|
+
- `moviestar inspect` — dense thumbnails on demand at a configurable interval.
|
|
33
|
+
- `moviestar watch` — extract an MP4 segment for multimodal model analysis.
|
|
34
|
+
- `moviestar status` — current project state at a glance.
|
|
35
|
+
|
|
36
|
+
**Edit:**
|
|
37
|
+
- `moviestar trim` — append a trim to the edit spec (result-time semantics; stacks compose).
|
|
38
|
+
- `moviestar undo` — pop the last operation.
|
|
39
|
+
- `moviestar spec` — show the current spec (or `--edit` to replace).
|
|
40
|
+
- `moviestar find` — fuzzy-search the transcript for a phrase.
|
|
41
|
+
|
|
42
|
+
**Output:**
|
|
43
|
+
- `moviestar export` — render the spec's effective timeline to MP4.
|
|
44
|
+
- `moviestar screenshot` — single frame at a timecode (project-aware: `--at` is in result-time).
|
|
45
|
+
|
|
46
|
+
**Always-available:**
|
|
47
|
+
- `moviestar probe` — ffprobe metadata as JSON.
|
|
48
|
+
- `--dry-run` on every expensive command (`load`, `inspect`, `watch`, `export`, `spec --edit`).
|
|
49
|
+
|
|
50
|
+
Run `moviestar --help` for the full command list.
|
|
51
|
+
|
|
52
|
+
## Why moviestar
|
|
53
|
+
|
|
54
|
+
Video editing tools are built for humans with GUIs. Agents don't have hands on a timeline or eyes on a canvas. moviestar is the hands; the agent is the brain.
|
|
55
|
+
|
|
56
|
+
- **Verbose by default.** Every command returns rich structured JSON — agents can discard what they don't need, but can't invent data the CLI didn't provide.
|
|
57
|
+
- **Deterministic.** Same input + same parameters = same output. No randomness, no hidden model calls.
|
|
58
|
+
- **Result-time semantics.** A second trim narrows the current result, not the original source. `find` matches resolve to both source-time and result-time so screenshots and exports compose cleanly.
|
|
59
|
+
- **Non-destructive.** Source files are never modified.
|
|
60
|
+
|
|
61
|
+
Full design and product principles in the project docs.
|
|
62
|
+
|
|
63
|
+
## Requirements
|
|
64
|
+
|
|
65
|
+
- **Python 3.10+**
|
|
66
|
+
- **FFmpeg** on `PATH` (`brew install ffmpeg` / `apt install ffmpeg`)
|
|
67
|
+
|
|
68
|
+
The package weighs ~210MB on install — `faster-whisper` ships local transcription out of the box (no API keys, no cloud round-trip). Diarization is opt-in: `pip install moviestar[diarize]`.
|
|
69
|
+
|
|
70
|
+
## Status
|
|
71
|
+
|
|
72
|
+
v0.1 — first public release. Core loop is working: load → browse → edit → export. The roadmap of what's next lives with the project.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "moviestar"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Video editing CLI for AI agents. Load videos, fuzzy-search transcripts, trim, and export with FFmpeg."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = {text = "BSL-1.1"}
|
|
12
|
+
authors = [{name = "James Dillard"}]
|
|
13
|
+
keywords = ["video", "ffmpeg", "ai", "agents", "cli", "transcript", "whisper", "editing"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 3 - Alpha",
|
|
16
|
+
"Environment :: Console",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"Topic :: Multimedia :: Video",
|
|
19
|
+
"Topic :: Multimedia :: Sound/Audio :: Speech",
|
|
20
|
+
"Programming Language :: Python :: 3.10",
|
|
21
|
+
"Programming Language :: Python :: 3.11",
|
|
22
|
+
"Programming Language :: Python :: 3.12",
|
|
23
|
+
]
|
|
24
|
+
dependencies = ["click>=8.0", "faster-whisper>=1.0", "rapidfuzz>=3.0"]
|
|
25
|
+
|
|
26
|
+
[project.optional-dependencies]
|
|
27
|
+
diarize = ["pyannote.audio>=3.0"]
|
|
28
|
+
|
|
29
|
+
[project.scripts]
|
|
30
|
+
moviestar = "moviestar.cli:cli"
|
|
31
|
+
|
|
32
|
+
[tool.setuptools.packages.find]
|
|
33
|
+
where = ["src"]
|
|
34
|
+
|
|
35
|
+
[tool.setuptools.package-data]
|
|
36
|
+
"moviestar.schema" = ["*.json"]
|
|
37
|
+
|
|
38
|
+
[tool.pytest.ini_options]
|
|
39
|
+
testpaths = ["tests"]
|
|
40
|
+
markers = [
|
|
41
|
+
"slow: tests that call real faster-whisper (skipped by default; use --run-slow to include).",
|
|
42
|
+
]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""moviestar — video editing CLI for AI agents.
|
|
2
|
+
|
|
3
|
+
The version string is read from the installed package metadata so
|
|
4
|
+
``pyproject.toml`` is the single source of truth (no drift between
|
|
5
|
+
``__version__`` and the published version on PyPI). Falls back to a
|
|
6
|
+
sentinel only if the package isn't installed (e.g., running directly
|
|
7
|
+
from a checkout without `pip install -e`).
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
__version__ = version("moviestar")
|
|
14
|
+
except PackageNotFoundError: # pragma: no cover — only hit in non-installed checkouts
|
|
15
|
+
__version__ = "0.0.0+unknown"
|