aurclips 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.
- aurclips-0.1.0/.gitignore +18 -0
- aurclips-0.1.0/CONTEXT.md +106 -0
- aurclips-0.1.0/LICENSE +21 -0
- aurclips-0.1.0/PKG-INFO +257 -0
- aurclips-0.1.0/README.md +206 -0
- aurclips-0.1.0/aurclips/__init__.py +3 -0
- aurclips-0.1.0/aurclips/__main__.py +366 -0
- aurclips-0.1.0/aurclips/assets/config.default.yaml +204 -0
- aurclips-0.1.0/aurclips/assets/fonts/Anton-Regular.ttf +0 -0
- aurclips-0.1.0/aurclips/assets/fonts/OFL.txt +93 -0
- aurclips-0.1.0/aurclips/clipper.py +118 -0
- aurclips-0.1.0/aurclips/config.py +184 -0
- aurclips-0.1.0/aurclips/facecrop.py +1233 -0
- aurclips-0.1.0/aurclips/heuristics.py +449 -0
- aurclips-0.1.0/aurclips/ingest.py +143 -0
- aurclips-0.1.0/aurclips/marks.py +308 -0
- aurclips-0.1.0/aurclips/notify.py +80 -0
- aurclips-0.1.0/aurclips/render.py +219 -0
- aurclips-0.1.0/aurclips/runner.py +119 -0
- aurclips-0.1.0/aurclips/safety.py +221 -0
- aurclips-0.1.0/aurclips/select_clips.py +165 -0
- aurclips-0.1.0/aurclips/state.py +444 -0
- aurclips-0.1.0/aurclips/stats.py +324 -0
- aurclips-0.1.0/aurclips/subtitles.py +152 -0
- aurclips-0.1.0/aurclips/titles.py +130 -0
- aurclips-0.1.0/aurclips/transcribe.py +202 -0
- aurclips-0.1.0/aurclips/upload.py +175 -0
- aurclips-0.1.0/config.yaml +204 -0
- aurclips-0.1.0/docs/adr/0001-extremos-apretados-centro-simple.md +42 -0
- aurclips-0.1.0/docs/adr/0002-recortador-en-la-puerta-publicador-dentro.md +46 -0
- aurclips-0.1.0/docs/adr/0003-rutas-checkout-y-usuario.md +33 -0
- aurclips-0.1.0/docs/config.md +148 -0
- aurclips-0.1.0/docs/grabar-en-beats.md +98 -0
- aurclips-0.1.0/docs/pipeline.md +87 -0
- aurclips-0.1.0/docs/selection.md +85 -0
- aurclips-0.1.0/docs/upload-youtube.md +96 -0
- aurclips-0.1.0/packaging/README.md +50 -0
- aurclips-0.1.0/packaging/crontab.example +7 -0
- aurclips-0.1.0/packaging/launchd/com.aurclips.daily.plist +29 -0
- aurclips-0.1.0/packaging/systemd/aurclips.service +12 -0
- aurclips-0.1.0/packaging/systemd/aurclips.timer +11 -0
- aurclips-0.1.0/pyproject.toml +61 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
.env
|
|
3
|
+
data/
|
|
4
|
+
logs/
|
|
5
|
+
tools/
|
|
6
|
+
credentials/
|
|
7
|
+
__pycache__/
|
|
8
|
+
*.pyc
|
|
9
|
+
dist/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
# Added by code-review-graph
|
|
12
|
+
.code-review-graph/
|
|
13
|
+
# tooling local de desarrollo (no se publica)
|
|
14
|
+
.claude/
|
|
15
|
+
.mcp.json
|
|
16
|
+
.scratch/
|
|
17
|
+
docs/agents/
|
|
18
|
+
CLAUDE.md
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# aurclips
|
|
2
|
+
|
|
3
|
+
Bot local que convierte grabaciones propias de gaming en Shorts de YouTube. El
|
|
4
|
+
creador graba y opera la herramienta, así que el vocabulario está escrito desde
|
|
5
|
+
ese punto de vista: el material es tuyo y las decisiones también.
|
|
6
|
+
|
|
7
|
+
Los `_Avoid_` valen para la prosa en español —comentarios, mensajes, docs—, no
|
|
8
|
+
para los identificadores, que van en inglés por convención del repo. Que el
|
|
9
|
+
glosario diga *Marca* no hace incorrecto a `marks.anchors`.
|
|
10
|
+
|
|
11
|
+
## Language
|
|
12
|
+
|
|
13
|
+
### Material
|
|
14
|
+
|
|
15
|
+
**Grabación**:
|
|
16
|
+
El video largo del que salen los clips, ya sea dejado en el inbox o descargado
|
|
17
|
+
de un canal. En el código y en la base es `video` (tabla `videos`).
|
|
18
|
+
_Avoid_: fuente, input, video original
|
|
19
|
+
|
|
20
|
+
**Beat**:
|
|
21
|
+
Una unidad autocontenida de 20 a 45 segundos dentro de una grabación, con
|
|
22
|
+
gancho, punto y cierre. Grabar en beats es la palanca que hace innecesario que
|
|
23
|
+
el selector adivine.
|
|
24
|
+
_Avoid_: bloque, momento, sección
|
|
25
|
+
|
|
26
|
+
**Clip**:
|
|
27
|
+
Un fragmento continuo de una grabación, elegido para publicarse como Short.
|
|
28
|
+
_Avoid_: segmento, corte, highlight
|
|
29
|
+
|
|
30
|
+
**Candidata**:
|
|
31
|
+
Un tramo de la grabación que la heurística puntuó y que todavía no es un clip.
|
|
32
|
+
_Avoid_: candidato, propuesta
|
|
33
|
+
|
|
34
|
+
**Marca**:
|
|
35
|
+
Un momento que el creador señaló mientras grababa, por voz o por archivo. Manda
|
|
36
|
+
sobre cualquier puntuación.
|
|
37
|
+
_Avoid_: señal, tag
|
|
38
|
+
|
|
39
|
+
**Short**:
|
|
40
|
+
Un clip que ya está en YouTube, publicado o programado.
|
|
41
|
+
_Avoid_: publicación, video subido
|
|
42
|
+
|
|
43
|
+
**Recorte suelto**:
|
|
44
|
+
Un video vertical producido sin entrar al pipeline: sale del modo recortador,
|
|
45
|
+
no existe en la base y por eso no tiene ni progreso ni criterio. No aparece en
|
|
46
|
+
`status`, no espera revisión y no consume hueco de publicación. Es el mismo
|
|
47
|
+
material que un **Clip** —misma selección, mismo render— pero sin el ciclo de
|
|
48
|
+
vida que hace de un clip un **Short**.
|
|
49
|
+
_Avoid_: exportación, corte rápido
|
|
50
|
+
|
|
51
|
+
### Ciclo de vida
|
|
52
|
+
|
|
53
|
+
El estado de un clip son dos cosas independientes que no hay que confundir.
|
|
54
|
+
|
|
55
|
+
**Progreso**:
|
|
56
|
+
Hasta dónde llegó algo por la parte mecánica del pipeline. Un clip está
|
|
57
|
+
pendiente, renderizado, señalado, subido o fallido; una grabación está nueva,
|
|
58
|
+
transcrita, con clips elegidos, terminada, omitida o fallida. En la base es
|
|
59
|
+
`status`.
|
|
60
|
+
_Avoid_: estado (a secas), fase, etapa
|
|
61
|
+
|
|
62
|
+
**Criterio**:
|
|
63
|
+
El veredicto del creador sobre un clip: sin revisar, aprobado o descartado. Es
|
|
64
|
+
independiente del progreso — un clip puede estar renderizado y sin revisar, o
|
|
65
|
+
renderizado y descartado. En la base es `approved`.
|
|
66
|
+
_Avoid_: aprobación, validación, visto bueno
|
|
67
|
+
|
|
68
|
+
**Revisión**:
|
|
69
|
+
El momento en que el creador recorre los clips listos y aprueba, corrige o
|
|
70
|
+
descarta cada uno. Es donde entra su criterio al pipeline.
|
|
71
|
+
_Avoid_: moderación, QA, curación
|
|
72
|
+
|
|
73
|
+
**Señalado**:
|
|
74
|
+
Un clip que el filtro de contenido apartó por lo que dice, en vez de
|
|
75
|
+
descartarlo. No confundir con **Marca**: señalado lo decide el filtro, marcado
|
|
76
|
+
lo decides tú al grabar.
|
|
77
|
+
_Avoid_: marcado (para este sentido), flagueado
|
|
78
|
+
|
|
79
|
+
**Despublicar**:
|
|
80
|
+
Devolver a la cola de revisión un clip cuyo Short borraste tú de YouTube. El
|
|
81
|
+
sistema no borra nada del canal: registra que ya no está. Publicar no es el
|
|
82
|
+
final del camino.
|
|
83
|
+
_Cómo_: `State.clip_unpublished(clip_id)`, a propósito sin comando de CLI.
|
|
84
|
+
_Avoid_: revertir, deshacer, retirar
|
|
85
|
+
|
|
86
|
+
**Reencolar**:
|
|
87
|
+
Devolver al pipeline lo que falló, tan atrás como haga falta según qué
|
|
88
|
+
artefactos sobrevivieron. Es lo que hace el comando `retry`.
|
|
89
|
+
_Avoid_: reintentar, reprocesar
|
|
90
|
+
|
|
91
|
+
**Hueco de publicación**:
|
|
92
|
+
La ranura del calendario que ocupa un Short. Se reparte uno por día, y un hueco
|
|
93
|
+
ya consumido no se vuelve a ofrecer, ni siquiera al despublicar.
|
|
94
|
+
_Avoid_: agenda, turno
|
|
95
|
+
|
|
96
|
+
### Selección
|
|
97
|
+
|
|
98
|
+
**Piso de calidad**:
|
|
99
|
+
El valor por debajo del cual una candidata se descarta, medido como fracción de
|
|
100
|
+
la mejor candidata de esa misma grabación. Decide *cuántos* clips salen.
|
|
101
|
+
_Avoid_: mínimo, corte
|
|
102
|
+
|
|
103
|
+
**Perfil**:
|
|
104
|
+
El juego de pesos con que el selector puntúa, elegido según el género del canal.
|
|
105
|
+
Decide *cuál* clip sale.
|
|
106
|
+
_Avoid_: preset, modo, configuración
|
aurclips-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Felii
|
|
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.
|
aurclips-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aurclips
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: De videos largos a YouTube Shorts verticales con subtítulos, 100% local
|
|
5
|
+
Project-URL: Homepage, https://github.com/feliivk/aurclips
|
|
6
|
+
Author: Felii
|
|
7
|
+
License: MIT License
|
|
8
|
+
|
|
9
|
+
Copyright (c) 2026 Felii
|
|
10
|
+
|
|
11
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
13
|
+
in the Software without restriction, including without limitation the rights
|
|
14
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
15
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
16
|
+
furnished to do so, subject to the following conditions:
|
|
17
|
+
|
|
18
|
+
The above copyright notice and this permission notice shall be included in all
|
|
19
|
+
copies or substantial portions of the Software.
|
|
20
|
+
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
22
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
23
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
24
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
25
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
|
+
SOFTWARE.
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Keywords: ffmpeg,local,shorts,subtitles,video,whisper,youtube
|
|
30
|
+
Classifier: Environment :: Console
|
|
31
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
32
|
+
Classifier: Operating System :: OS Independent
|
|
33
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
34
|
+
Classifier: Topic :: Multimedia :: Video
|
|
35
|
+
Requires-Python: >=3.12
|
|
36
|
+
Requires-Dist: faster-whisper>=1.1.0
|
|
37
|
+
Requires-Dist: google-api-python-client>=2.140
|
|
38
|
+
Requires-Dist: google-auth-oauthlib>=1.2
|
|
39
|
+
Requires-Dist: opencv-python-headless>=4.9
|
|
40
|
+
Requires-Dist: platformdirs>=4.0
|
|
41
|
+
Requires-Dist: pydantic>=2.7
|
|
42
|
+
Requires-Dist: pyyaml>=6.0
|
|
43
|
+
Requires-Dist: tzdata>=2024.1; sys_platform == 'win32'
|
|
44
|
+
Requires-Dist: yt-dlp>=2025.1.1
|
|
45
|
+
Provides-Extra: cuda
|
|
46
|
+
Requires-Dist: nvidia-cublas-cu12; (sys_platform != 'darwin' and platform_machine == 'x86_64') and extra == 'cuda'
|
|
47
|
+
Requires-Dist: nvidia-cudnn-cu12; (sys_platform != 'darwin' and platform_machine == 'x86_64') and extra == 'cuda'
|
|
48
|
+
Provides-Extra: dev
|
|
49
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
50
|
+
Description-Content-Type: text/markdown
|
|
51
|
+
|
|
52
|
+
# 🎬 aurclips
|
|
53
|
+
|
|
54
|
+
[](https://github.com/feliivk/aurclips/actions/workflows/ci.yml)
|
|
55
|
+
|
|
56
|
+
Convierte videos largos en Shorts verticales con subtítulos, **completamente
|
|
57
|
+
local**. Corre en **Windows, Linux y macOS**.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
aurclips clip mi_partida.mp4
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
data/output/mi_partida/
|
|
65
|
+
0001_El_truco_que_nadie_conoce.mp4 ← 9:16, subtítulos quemados
|
|
66
|
+
0001_El_truco_que_nadie_conoce.txt ← título, descripción y hashtags
|
|
67
|
+
0002_Por_que_nadie_termina_el_juego.mp4
|
|
68
|
+
0002_Por_que_nadie_termina_el_juego.txt
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Sin API keys, sin cuenta, sin mandar tu material a ningún servidor: transcribir,
|
|
72
|
+
elegir y editar pasa todo en tu máquina.
|
|
73
|
+
|
|
74
|
+
## Qué hace
|
|
75
|
+
|
|
76
|
+
- **Transcribe** con Whisper local, con tiempos por palabra (usa tu GPU NVIDIA
|
|
77
|
+
si la tienes).
|
|
78
|
+
- **Elige los momentos**: lo que marcaste al grabar manda; si no marcaste,
|
|
79
|
+
puntúa estructura (gancho, preguntas, cierre de idea, densidad) y energía de
|
|
80
|
+
audio según tu género.
|
|
81
|
+
- **Recorta a 9:16**, quita las pausas muertas (jump cuts) y encuadra en el
|
|
82
|
+
rostro si lo pides.
|
|
83
|
+
- **Quema subtítulos** estilo viral, palabra a palabra.
|
|
84
|
+
- **Escribe la metadata** de cada recorte en un `.txt` al lado: título,
|
|
85
|
+
descripción y hashtags, listos para copiar y pegar. Con
|
|
86
|
+
[Ollama](https://ollama.com) los redacta un modelo local; sin Ollama, una
|
|
87
|
+
heurística.
|
|
88
|
+
|
|
89
|
+
## Qué NO hace
|
|
90
|
+
|
|
91
|
+
- **No adivina bien sin tu ayuda.** Sin marcar nada al grabar, cuenta con **~1
|
|
92
|
+
recorte bueno por grabación**: el filtro de calidad prefiere quedarse corto
|
|
93
|
+
antes que rellenar. Marcar cambia eso por completo.
|
|
94
|
+
- **No hay magia de IA en la selección.** Es una heurística simple y a propósito
|
|
95
|
+
([ADR-0001](docs/adr/0001-extremos-apretados-centro-simple.md)): no modela
|
|
96
|
+
arcos narrativos ni persigue la viralidad. El criterio lo pones tú.
|
|
97
|
+
- **No sube nada.** Publicar en YouTube existe, pero es opcional y viene
|
|
98
|
+
apagado.
|
|
99
|
+
- **No acelera en GPU en macOS.** La GPU NVIDIA acelera la transcripción en
|
|
100
|
+
Windows y Linux; en macOS (incluido Apple Silicon) se transcribe en CPU. En
|
|
101
|
+
CPU funciona en todas partes, solo más lento.
|
|
102
|
+
- **Está en beta.** Los defaults siguen en calibración: espera cambios de
|
|
103
|
+
configuración entre versiones y **mira lo que genera antes de publicarlo**.
|
|
104
|
+
|
|
105
|
+
## Instalación
|
|
106
|
+
|
|
107
|
+
Necesitas **[Python 3.12](https://www.python.org/downloads/)** y **ffmpeg**. La
|
|
108
|
+
fuente de los subtítulos ya viene con el paquete.
|
|
109
|
+
|
|
110
|
+
**ffmpeg** (una vez, con tu gestor de paquetes):
|
|
111
|
+
|
|
112
|
+
| SO | Comando |
|
|
113
|
+
| --- | --- |
|
|
114
|
+
| macOS | `brew install ffmpeg` |
|
|
115
|
+
| Debian/Ubuntu | `sudo apt install ffmpeg` |
|
|
116
|
+
| Fedora | `sudo dnf install ffmpeg` |
|
|
117
|
+
| Windows | `winget install ffmpeg` (o lo descarga `setup.ps1` a `tools\`) |
|
|
118
|
+
|
|
119
|
+
**aurclips**:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Linux / macOS
|
|
123
|
+
git clone https://github.com/feliivk/aurclips && cd aurclips
|
|
124
|
+
sh setup.sh
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```powershell
|
|
128
|
+
# Windows
|
|
129
|
+
git clone https://github.com/feliivk/aurclips; cd aurclips
|
|
130
|
+
powershell -ExecutionPolicy Bypass -File setup.ps1
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Ambos crean un entorno virtual e instalan el comando `aurclips`. Si tienes GPU
|
|
134
|
+
NVIDIA (Windows/Linux), el setup detecta `nvidia-smi` y ofrece el soporte CUDA;
|
|
135
|
+
en CPU también funciona (baja `whisper.model` a `small`).
|
|
136
|
+
|
|
137
|
+
¿Prefieres instalarlo como un paquete más, sin el script? Es un proyecto Python
|
|
138
|
+
estándar:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
pipx install git+https://github.com/feliivk/aurclips # aislado, comando global
|
|
142
|
+
# o, dentro de tu propio entorno:
|
|
143
|
+
pip install git+https://github.com/feliivk/aurclips
|
|
144
|
+
# con soporte GPU NVIDIA (Windows/Linux x86_64):
|
|
145
|
+
pip install "aurclips[cuda] @ git+https://github.com/feliivk/aurclips"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Instalado así, aurclips guarda `config.yaml` y los datos en las carpetas de
|
|
149
|
+
usuario de tu SO (las crea y te dice dónde en el primer arranque); corriendo
|
|
150
|
+
desde el checkout usa `./config.yaml` y `./data`, como hasta ahora.
|
|
151
|
+
|
|
152
|
+
Opcional pero recomendado — un modelo local que escriba los títulos:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
ollama pull qwen2.5:7b
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
aurclips lo detecta solo. Sigue siendo local y gratis.
|
|
159
|
+
|
|
160
|
+
> Los ejemplos usan el comando `aurclips` que crea el setup. Si prefieres no
|
|
161
|
+
> activar el entorno, es equivalente a `.venv/bin/python -m aurclips` (Linux/mac)
|
|
162
|
+
> o `.venv\Scripts\python -m aurclips` (Windows).
|
|
163
|
+
|
|
164
|
+
## Ejemplo
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
aurclips clip "~/grabaciones/partida 12.mkv"
|
|
168
|
+
aurclips clip partida.mp4 --out ~/edicion
|
|
169
|
+
aurclips clip partida.mp4 --clips 1
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`--out` cambia la carpeta de destino y `--clips` pone un tope solo para esa
|
|
173
|
+
corrida. Nada de esto toca `config.yaml`, ni deja cola pendiente, ni necesita
|
|
174
|
+
credenciales: un recorte suelto entra y sale.
|
|
175
|
+
|
|
176
|
+
Recortar dos veces la misma grabación no la vuelve a transcribir — la
|
|
177
|
+
transcripción queda en caché, así que probar parámetros es barato. La segunda
|
|
178
|
+
corrida **reemplaza** los recortes de la primera en esa carpeta: si quieres
|
|
179
|
+
conservar los anteriores, dales otro `--out`.
|
|
180
|
+
|
|
181
|
+
Los mandos completos están en [Configuración](docs/config.md) y
|
|
182
|
+
[Selección](docs/selection.md).
|
|
183
|
+
|
|
184
|
+
## Luego: graba pensando en el recorte
|
|
185
|
+
|
|
186
|
+
Cuando tú controlas la fuente, el problema deja de ser *"detectar buenos
|
|
187
|
+
momentos en footage desconocido"* y pasa a ser *"grabar de forma que extraer sea
|
|
188
|
+
fácil"*. Es la palanca más grande que tienes y no toca código:
|
|
189
|
+
|
|
190
|
+
- **Graba en beats**: unidades de 20-45 s con gancho, punto y cierre.
|
|
191
|
+
- **Marca en vivo**: di **"esto es un short"** mientras grabas y ese momento
|
|
192
|
+
gana sobre cualquier puntuación. El segmento con la frase se silencia, así que
|
|
193
|
+
marca el clip pero no entra en él. No hace falta decirla clavada (se compara
|
|
194
|
+
por parecido) ni marcar todos los videos.
|
|
195
|
+
- **O por timestamps**: un `<video>.marks.txt` al lado de la grabación, que
|
|
196
|
+
puedes escribir con el hotkey de tu grabadora o con `aurclips mark`.
|
|
197
|
+
|
|
198
|
+
Guía completa: [Grabar en beats](docs/grabar-en-beats.md).
|
|
199
|
+
|
|
200
|
+
## Luego: que se publique solo
|
|
201
|
+
|
|
202
|
+
Si los recortes ya te convencen, aurclips también lleva el ciclo completo: sube
|
|
203
|
+
a YouTube en privado con fecha programada, y YouTube publica uno por día a la
|
|
204
|
+
hora que fijes.
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
aurclips run # ingesta -> recortes -> subida
|
|
208
|
+
aurclips review # aprobar o corregir antes de subir
|
|
209
|
+
aurclips status # qué hay en cola
|
|
210
|
+
aurclips report # métricas y qué está funcionando
|
|
211
|
+
aurclips retry # reencolar lo que falló
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
A diferencia del modo recortador, esto sí lleva una base de estado: cada clip
|
|
215
|
+
tiene progreso (pendiente, renderizado, subido) y criterio tuyo (sin revisar,
|
|
216
|
+
aprobado, descartado). Mientras `review.enabled` sea `true`, nada se sube sin
|
|
217
|
+
pasar por tu criterio.
|
|
218
|
+
|
|
219
|
+
Para dejarlo corriendo solo cada día, hay una receta por SO —cron/systemd en
|
|
220
|
+
Linux, launchd en macOS, Programador de tareas en Windows— en
|
|
221
|
+
[`packaging/`](packaging/README.md).
|
|
222
|
+
|
|
223
|
+
Cómo dar de alta las credenciales, la cuota diaria, la programación y qué hacer
|
|
224
|
+
si un Short salió mal: [Publicar en YouTube](docs/upload-youtube.md).
|
|
225
|
+
|
|
226
|
+
Para vigilar canales y descargar material de YouTube en vez de usar tu propio
|
|
227
|
+
inbox, mira `channels` en [Configuración](docs/config.md).
|
|
228
|
+
|
|
229
|
+
## Documentación
|
|
230
|
+
|
|
231
|
+
| | |
|
|
232
|
+
| --- | --- |
|
|
233
|
+
| [Cómo funciona](docs/pipeline.md) | El motor y los dos niveles, con el flujo de punta a punta |
|
|
234
|
+
| [Grabar en beats](docs/grabar-en-beats.md) | Cómo grabar y marcar para que recortar sea trivial |
|
|
235
|
+
| [Selección](docs/selection.md) | Cuántos clips salen y cuáles: piso de calidad y pesos |
|
|
236
|
+
| [Configuración](docs/config.md) | Todas las claves de `config.yaml` |
|
|
237
|
+
| [Publicar en YouTube](docs/upload-youtube.md) | Credenciales, cuota, programación, despublicar |
|
|
238
|
+
| [CONTEXT.md](CONTEXT.md) | El vocabulario del proyecto |
|
|
239
|
+
| [ADR](docs/adr/) | Decisiones de arquitectura y por qué |
|
|
240
|
+
|
|
241
|
+
## Desarrollo
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
pip install -e .[dev]
|
|
245
|
+
pytest
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Los tests corren en segundos, sin GPU, sin video real y sin Ollama.
|
|
249
|
+
|
|
250
|
+
## Licencia
|
|
251
|
+
|
|
252
|
+
[MIT](LICENSE). El modelo de detección de rostros embebido
|
|
253
|
+
([YuNet](https://github.com/opencv/opencv_zoo), int8) es también MIT.
|
|
254
|
+
|
|
255
|
+
Eres responsable de tener derechos sobre el contenido que recortas y de cumplir
|
|
256
|
+
los [términos de servicio de YouTube](https://www.youtube.com/t/terms) y las
|
|
257
|
+
políticas de la YouTube Data API al usar la subida automática.
|
aurclips-0.1.0/README.md
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# 🎬 aurclips
|
|
2
|
+
|
|
3
|
+
[](https://github.com/feliivk/aurclips/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
Convierte videos largos en Shorts verticales con subtítulos, **completamente
|
|
6
|
+
local**. Corre en **Windows, Linux y macOS**.
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
aurclips clip mi_partida.mp4
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
data/output/mi_partida/
|
|
14
|
+
0001_El_truco_que_nadie_conoce.mp4 ← 9:16, subtítulos quemados
|
|
15
|
+
0001_El_truco_que_nadie_conoce.txt ← título, descripción y hashtags
|
|
16
|
+
0002_Por_que_nadie_termina_el_juego.mp4
|
|
17
|
+
0002_Por_que_nadie_termina_el_juego.txt
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Sin API keys, sin cuenta, sin mandar tu material a ningún servidor: transcribir,
|
|
21
|
+
elegir y editar pasa todo en tu máquina.
|
|
22
|
+
|
|
23
|
+
## Qué hace
|
|
24
|
+
|
|
25
|
+
- **Transcribe** con Whisper local, con tiempos por palabra (usa tu GPU NVIDIA
|
|
26
|
+
si la tienes).
|
|
27
|
+
- **Elige los momentos**: lo que marcaste al grabar manda; si no marcaste,
|
|
28
|
+
puntúa estructura (gancho, preguntas, cierre de idea, densidad) y energía de
|
|
29
|
+
audio según tu género.
|
|
30
|
+
- **Recorta a 9:16**, quita las pausas muertas (jump cuts) y encuadra en el
|
|
31
|
+
rostro si lo pides.
|
|
32
|
+
- **Quema subtítulos** estilo viral, palabra a palabra.
|
|
33
|
+
- **Escribe la metadata** de cada recorte en un `.txt` al lado: título,
|
|
34
|
+
descripción y hashtags, listos para copiar y pegar. Con
|
|
35
|
+
[Ollama](https://ollama.com) los redacta un modelo local; sin Ollama, una
|
|
36
|
+
heurística.
|
|
37
|
+
|
|
38
|
+
## Qué NO hace
|
|
39
|
+
|
|
40
|
+
- **No adivina bien sin tu ayuda.** Sin marcar nada al grabar, cuenta con **~1
|
|
41
|
+
recorte bueno por grabación**: el filtro de calidad prefiere quedarse corto
|
|
42
|
+
antes que rellenar. Marcar cambia eso por completo.
|
|
43
|
+
- **No hay magia de IA en la selección.** Es una heurística simple y a propósito
|
|
44
|
+
([ADR-0001](docs/adr/0001-extremos-apretados-centro-simple.md)): no modela
|
|
45
|
+
arcos narrativos ni persigue la viralidad. El criterio lo pones tú.
|
|
46
|
+
- **No sube nada.** Publicar en YouTube existe, pero es opcional y viene
|
|
47
|
+
apagado.
|
|
48
|
+
- **No acelera en GPU en macOS.** La GPU NVIDIA acelera la transcripción en
|
|
49
|
+
Windows y Linux; en macOS (incluido Apple Silicon) se transcribe en CPU. En
|
|
50
|
+
CPU funciona en todas partes, solo más lento.
|
|
51
|
+
- **Está en beta.** Los defaults siguen en calibración: espera cambios de
|
|
52
|
+
configuración entre versiones y **mira lo que genera antes de publicarlo**.
|
|
53
|
+
|
|
54
|
+
## Instalación
|
|
55
|
+
|
|
56
|
+
Necesitas **[Python 3.12](https://www.python.org/downloads/)** y **ffmpeg**. La
|
|
57
|
+
fuente de los subtítulos ya viene con el paquete.
|
|
58
|
+
|
|
59
|
+
**ffmpeg** (una vez, con tu gestor de paquetes):
|
|
60
|
+
|
|
61
|
+
| SO | Comando |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| macOS | `brew install ffmpeg` |
|
|
64
|
+
| Debian/Ubuntu | `sudo apt install ffmpeg` |
|
|
65
|
+
| Fedora | `sudo dnf install ffmpeg` |
|
|
66
|
+
| Windows | `winget install ffmpeg` (o lo descarga `setup.ps1` a `tools\`) |
|
|
67
|
+
|
|
68
|
+
**aurclips**:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Linux / macOS
|
|
72
|
+
git clone https://github.com/feliivk/aurclips && cd aurclips
|
|
73
|
+
sh setup.sh
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```powershell
|
|
77
|
+
# Windows
|
|
78
|
+
git clone https://github.com/feliivk/aurclips; cd aurclips
|
|
79
|
+
powershell -ExecutionPolicy Bypass -File setup.ps1
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Ambos crean un entorno virtual e instalan el comando `aurclips`. Si tienes GPU
|
|
83
|
+
NVIDIA (Windows/Linux), el setup detecta `nvidia-smi` y ofrece el soporte CUDA;
|
|
84
|
+
en CPU también funciona (baja `whisper.model` a `small`).
|
|
85
|
+
|
|
86
|
+
¿Prefieres instalarlo como un paquete más, sin el script? Es un proyecto Python
|
|
87
|
+
estándar:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
pipx install git+https://github.com/feliivk/aurclips # aislado, comando global
|
|
91
|
+
# o, dentro de tu propio entorno:
|
|
92
|
+
pip install git+https://github.com/feliivk/aurclips
|
|
93
|
+
# con soporte GPU NVIDIA (Windows/Linux x86_64):
|
|
94
|
+
pip install "aurclips[cuda] @ git+https://github.com/feliivk/aurclips"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Instalado así, aurclips guarda `config.yaml` y los datos en las carpetas de
|
|
98
|
+
usuario de tu SO (las crea y te dice dónde en el primer arranque); corriendo
|
|
99
|
+
desde el checkout usa `./config.yaml` y `./data`, como hasta ahora.
|
|
100
|
+
|
|
101
|
+
Opcional pero recomendado — un modelo local que escriba los títulos:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
ollama pull qwen2.5:7b
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
aurclips lo detecta solo. Sigue siendo local y gratis.
|
|
108
|
+
|
|
109
|
+
> Los ejemplos usan el comando `aurclips` que crea el setup. Si prefieres no
|
|
110
|
+
> activar el entorno, es equivalente a `.venv/bin/python -m aurclips` (Linux/mac)
|
|
111
|
+
> o `.venv\Scripts\python -m aurclips` (Windows).
|
|
112
|
+
|
|
113
|
+
## Ejemplo
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
aurclips clip "~/grabaciones/partida 12.mkv"
|
|
117
|
+
aurclips clip partida.mp4 --out ~/edicion
|
|
118
|
+
aurclips clip partida.mp4 --clips 1
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`--out` cambia la carpeta de destino y `--clips` pone un tope solo para esa
|
|
122
|
+
corrida. Nada de esto toca `config.yaml`, ni deja cola pendiente, ni necesita
|
|
123
|
+
credenciales: un recorte suelto entra y sale.
|
|
124
|
+
|
|
125
|
+
Recortar dos veces la misma grabación no la vuelve a transcribir — la
|
|
126
|
+
transcripción queda en caché, así que probar parámetros es barato. La segunda
|
|
127
|
+
corrida **reemplaza** los recortes de la primera en esa carpeta: si quieres
|
|
128
|
+
conservar los anteriores, dales otro `--out`.
|
|
129
|
+
|
|
130
|
+
Los mandos completos están en [Configuración](docs/config.md) y
|
|
131
|
+
[Selección](docs/selection.md).
|
|
132
|
+
|
|
133
|
+
## Luego: graba pensando en el recorte
|
|
134
|
+
|
|
135
|
+
Cuando tú controlas la fuente, el problema deja de ser *"detectar buenos
|
|
136
|
+
momentos en footage desconocido"* y pasa a ser *"grabar de forma que extraer sea
|
|
137
|
+
fácil"*. Es la palanca más grande que tienes y no toca código:
|
|
138
|
+
|
|
139
|
+
- **Graba en beats**: unidades de 20-45 s con gancho, punto y cierre.
|
|
140
|
+
- **Marca en vivo**: di **"esto es un short"** mientras grabas y ese momento
|
|
141
|
+
gana sobre cualquier puntuación. El segmento con la frase se silencia, así que
|
|
142
|
+
marca el clip pero no entra en él. No hace falta decirla clavada (se compara
|
|
143
|
+
por parecido) ni marcar todos los videos.
|
|
144
|
+
- **O por timestamps**: un `<video>.marks.txt` al lado de la grabación, que
|
|
145
|
+
puedes escribir con el hotkey de tu grabadora o con `aurclips mark`.
|
|
146
|
+
|
|
147
|
+
Guía completa: [Grabar en beats](docs/grabar-en-beats.md).
|
|
148
|
+
|
|
149
|
+
## Luego: que se publique solo
|
|
150
|
+
|
|
151
|
+
Si los recortes ya te convencen, aurclips también lleva el ciclo completo: sube
|
|
152
|
+
a YouTube en privado con fecha programada, y YouTube publica uno por día a la
|
|
153
|
+
hora que fijes.
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
aurclips run # ingesta -> recortes -> subida
|
|
157
|
+
aurclips review # aprobar o corregir antes de subir
|
|
158
|
+
aurclips status # qué hay en cola
|
|
159
|
+
aurclips report # métricas y qué está funcionando
|
|
160
|
+
aurclips retry # reencolar lo que falló
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
A diferencia del modo recortador, esto sí lleva una base de estado: cada clip
|
|
164
|
+
tiene progreso (pendiente, renderizado, subido) y criterio tuyo (sin revisar,
|
|
165
|
+
aprobado, descartado). Mientras `review.enabled` sea `true`, nada se sube sin
|
|
166
|
+
pasar por tu criterio.
|
|
167
|
+
|
|
168
|
+
Para dejarlo corriendo solo cada día, hay una receta por SO —cron/systemd en
|
|
169
|
+
Linux, launchd en macOS, Programador de tareas en Windows— en
|
|
170
|
+
[`packaging/`](packaging/README.md).
|
|
171
|
+
|
|
172
|
+
Cómo dar de alta las credenciales, la cuota diaria, la programación y qué hacer
|
|
173
|
+
si un Short salió mal: [Publicar en YouTube](docs/upload-youtube.md).
|
|
174
|
+
|
|
175
|
+
Para vigilar canales y descargar material de YouTube en vez de usar tu propio
|
|
176
|
+
inbox, mira `channels` en [Configuración](docs/config.md).
|
|
177
|
+
|
|
178
|
+
## Documentación
|
|
179
|
+
|
|
180
|
+
| | |
|
|
181
|
+
| --- | --- |
|
|
182
|
+
| [Cómo funciona](docs/pipeline.md) | El motor y los dos niveles, con el flujo de punta a punta |
|
|
183
|
+
| [Grabar en beats](docs/grabar-en-beats.md) | Cómo grabar y marcar para que recortar sea trivial |
|
|
184
|
+
| [Selección](docs/selection.md) | Cuántos clips salen y cuáles: piso de calidad y pesos |
|
|
185
|
+
| [Configuración](docs/config.md) | Todas las claves de `config.yaml` |
|
|
186
|
+
| [Publicar en YouTube](docs/upload-youtube.md) | Credenciales, cuota, programación, despublicar |
|
|
187
|
+
| [CONTEXT.md](CONTEXT.md) | El vocabulario del proyecto |
|
|
188
|
+
| [ADR](docs/adr/) | Decisiones de arquitectura y por qué |
|
|
189
|
+
|
|
190
|
+
## Desarrollo
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
pip install -e .[dev]
|
|
194
|
+
pytest
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Los tests corren en segundos, sin GPU, sin video real y sin Ollama.
|
|
198
|
+
|
|
199
|
+
## Licencia
|
|
200
|
+
|
|
201
|
+
[MIT](LICENSE). El modelo de detección de rostros embebido
|
|
202
|
+
([YuNet](https://github.com/opencv/opencv_zoo), int8) es también MIT.
|
|
203
|
+
|
|
204
|
+
Eres responsable de tener derechos sobre el contenido que recortas y de cumplir
|
|
205
|
+
los [términos de servicio de YouTube](https://www.youtube.com/t/terms) y las
|
|
206
|
+
políticas de la YouTube Data API al usar la subida automática.
|