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.
Files changed (42) hide show
  1. aurclips-0.1.0/.gitignore +18 -0
  2. aurclips-0.1.0/CONTEXT.md +106 -0
  3. aurclips-0.1.0/LICENSE +21 -0
  4. aurclips-0.1.0/PKG-INFO +257 -0
  5. aurclips-0.1.0/README.md +206 -0
  6. aurclips-0.1.0/aurclips/__init__.py +3 -0
  7. aurclips-0.1.0/aurclips/__main__.py +366 -0
  8. aurclips-0.1.0/aurclips/assets/config.default.yaml +204 -0
  9. aurclips-0.1.0/aurclips/assets/fonts/Anton-Regular.ttf +0 -0
  10. aurclips-0.1.0/aurclips/assets/fonts/OFL.txt +93 -0
  11. aurclips-0.1.0/aurclips/clipper.py +118 -0
  12. aurclips-0.1.0/aurclips/config.py +184 -0
  13. aurclips-0.1.0/aurclips/facecrop.py +1233 -0
  14. aurclips-0.1.0/aurclips/heuristics.py +449 -0
  15. aurclips-0.1.0/aurclips/ingest.py +143 -0
  16. aurclips-0.1.0/aurclips/marks.py +308 -0
  17. aurclips-0.1.0/aurclips/notify.py +80 -0
  18. aurclips-0.1.0/aurclips/render.py +219 -0
  19. aurclips-0.1.0/aurclips/runner.py +119 -0
  20. aurclips-0.1.0/aurclips/safety.py +221 -0
  21. aurclips-0.1.0/aurclips/select_clips.py +165 -0
  22. aurclips-0.1.0/aurclips/state.py +444 -0
  23. aurclips-0.1.0/aurclips/stats.py +324 -0
  24. aurclips-0.1.0/aurclips/subtitles.py +152 -0
  25. aurclips-0.1.0/aurclips/titles.py +130 -0
  26. aurclips-0.1.0/aurclips/transcribe.py +202 -0
  27. aurclips-0.1.0/aurclips/upload.py +175 -0
  28. aurclips-0.1.0/config.yaml +204 -0
  29. aurclips-0.1.0/docs/adr/0001-extremos-apretados-centro-simple.md +42 -0
  30. aurclips-0.1.0/docs/adr/0002-recortador-en-la-puerta-publicador-dentro.md +46 -0
  31. aurclips-0.1.0/docs/adr/0003-rutas-checkout-y-usuario.md +33 -0
  32. aurclips-0.1.0/docs/config.md +148 -0
  33. aurclips-0.1.0/docs/grabar-en-beats.md +98 -0
  34. aurclips-0.1.0/docs/pipeline.md +87 -0
  35. aurclips-0.1.0/docs/selection.md +85 -0
  36. aurclips-0.1.0/docs/upload-youtube.md +96 -0
  37. aurclips-0.1.0/packaging/README.md +50 -0
  38. aurclips-0.1.0/packaging/crontab.example +7 -0
  39. aurclips-0.1.0/packaging/launchd/com.aurclips.daily.plist +29 -0
  40. aurclips-0.1.0/packaging/systemd/aurclips.service +12 -0
  41. aurclips-0.1.0/packaging/systemd/aurclips.timer +11 -0
  42. 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.
@@ -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
+ [![tests](https://github.com/feliivk/aurclips/actions/workflows/ci.yml/badge.svg)](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.
@@ -0,0 +1,206 @@
1
+ # 🎬 aurclips
2
+
3
+ [![tests](https://github.com/feliivk/aurclips/actions/workflows/ci.yml/badge.svg)](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.
@@ -0,0 +1,3 @@
1
+ """Bot de automatización de Shorts: descarga, recorta, edita y publica."""
2
+
3
+ __version__ = "0.1.0"