«Cliente» y «Tipo» no decían para qué servían ni qué iba a pasar al confirmar, y el tipo se describía por a quién se le hace en vez de por cómo queda ordenado. - Cada campo es una pregunta con una línea debajo que dice qué hace. - Debajo se ven, armadas con la plantilla de verdad (ESTADO.plantillas), las cuatro carpetas donde va a guardar el material; cambian al cambiar el tipo. - Si el nombre es un cliente que ya existe, se preselecciona SU tipo. Antes salía siempre «contenido», así que una segunda carpeta de un cliente de pauta o de proyecto se podía registrar con la plantilla equivocada. - El diálogo dice que al confirmar solo lee y arma una lista, sin mover nada. - TIPOS_CLIENTE se reescribe en términos de cómo queda ordenado. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
435 líneas
33 KiB
Markdown
435 líneas
33 KiB
Markdown
# Organizador Labstream
|
||
|
||
App local (Python, sin dependencias) para **inventariar, mapear, ordenar y optimizar** el material de los
|
||
clientes de Labstream repartido por los discos del estudio.
|
||
|
||
```
|
||
Iniciar.bat ← doble clic. Abre http://127.0.0.1:8765 en el navegador
|
||
organizador.py ← servidor + inventario + plan + cola de conversión
|
||
reglas.py ← cómo reconoce cámaras, carpetas, basura y las plantillas de estructura
|
||
resolve_bridge.py ← convierte BRAW a H.265 10 bits usando DaVinci Resolve Studio
|
||
static/index.html ← la interfaz (Carpeta · Revisar y ordenar · Convertir · Respaldar · Historial · Ajustes)
|
||
datos/ ← inventario.sqlite, config.json, diccionario.json (lo aprendido), bitacora.jsonl
|
||
```
|
||
|
||
Nunca borra nada. Todo lo que sobra va a `_Para borrar` dentro de la misma raíz y cada movimiento queda en la
|
||
bitácora para poder deshacerlo.
|
||
|
||
---
|
||
|
||
## 1. Diagnóstico (9 sep 2026)
|
||
|
||
| Raíz | Archivos | Peso | BRAW | Stock Envato | Proxies | Basura | Duplicados |
|
||
|---|---|---|---|---|---|---|---|
|
||
| `Z:\Dermatologas\David Reyes` | 4 667 | 1,36 TB | 723 GB (53 %) | 464 GB | 4,5 GB | 301 archivos | 91 GB |
|
||
| `W:\Danney` | 24 967 | 3,14 TB | 1,18 TB (40 %) | — | — | 12 000 autoguardados de AE | — |
|
||
| `N:\` (Camilo Ortega) | 24 016 | 3,10 TB | — | — | 150 GB | 1 031 archivos | — |
|
||
|
||
Lo que se repite en todas:
|
||
|
||
- **El mismo cliente vive en hasta 12 sitios.** Camilo Ortega aparece en N:, K:, L:, M:, Q: y Z:. David Reyes
|
||
en Z:, K:, Q: y V:. Danney en W:, K: y Q:. Cada sitio con un nombre distinto (`David Reyes`, `DR. DAVID REYES`).
|
||
- **Dos sistemas de orden a la vez.** Danney tiene `2026/MM- Mes/NN- Pieza` y, al lado, `Nuevo Orden/` por
|
||
cámara y año con 1,8 TB. El mismo tipo de material está en los dos.
|
||
- **Los meses no se llaman igual:** `08-Agosto`, `09- Septiembre`, `10- octubre`, `02-marzo` (que es marzo
|
||
pero numerado 02), `04 -Mayo`, `05- MAYO`.
|
||
- **Material suelto en la raíz:** PSD de 2 GB, archivos «Recuperado», capturas de pantalla, un MP4 final.
|
||
- **Intermedios enormes que ya no hacen falta:** ProRes HQ vertical de 8 GB, prerenders QuickTime Animation
|
||
de 10 GB, proxies de Resolve/Premiere al lado del original.
|
||
- **Stock de Envato copiado dentro de cada pieza** (`Visual/Elements`): 464 GB en David Reyes, con
|
||
91 GB duplicados exactos.
|
||
- **Basura de sistema por todas partes:** `.DS_Store`, `Thumbs.db`, `.tmp` de Photoshop (uno de 1,2 GB),
|
||
`~lock~`, carpetas de autoguardado de After Effects.
|
||
|
||
## 2. Cómo organizarlo
|
||
|
||
### Cuatro tipos de cliente, cuatro plantillas
|
||
|
||
| Tipo | Quiénes | Estructura |
|
||
|---|---|---|
|
||
| **contenido** (mensual) | dermatólogas, marca personal | `AAAA / MM- Mes / NN- Pieza` + `00_Grabacion` por mes |
|
||
| **pauta** (anuncios) | Camilo Ortega, Jonathan, Malpraxis | `Campañas / AAAA_Campaña` + `Material / Grabaciones, Celular, IA` |
|
||
| **proyecto** (puntual) | Brigard, PepsiCo, Kingspan, Filarmónica… | `00_Brief 01_Material 02_Grabacion 03_Proyecto 04_Exportados` |
|
||
| **interno** | recursos de Labstream | `Musica Sonidos Stock LUTs Transiciones` compartidos |
|
||
|
||
### La carpeta canónica de un cliente de contenido
|
||
|
||
```
|
||
David Reyes/
|
||
├── 00_Marca/ logos, manual, fuentes, fondos, transiciones, intros
|
||
├── 01_Proyectos/ .drp .prproj .aep .psd de trabajo (Diseño/, Edicion/)
|
||
├── 2026/
|
||
│ ├── 03- Marzo/
|
||
│ │ ├── 00_Grabacion/ originales de cámara del mes, separados por fuente
|
||
│ │ │ ├── URSA_BRAW/ ├── SONY/ ├── OSMO/ ├── CELULAR/ └── AUDIO/
|
||
│ │ ├── 01- La isotretinoina/ ← una pieza: Guion, Visual, Audio, Portada, Export
|
||
│ │ ├── 02- El poder del ácido hialurónico/
|
||
│ │ ├── _Exportados/ masters del mes
|
||
│ │ └── _Portadas/
|
||
│ └── 08- Agosto/
|
||
├── Campañas/2026_Garnier/ trabajos de marca (Dove, Loreal, Isdin…)
|
||
├── _Apoyos/ tomas de apoyo reutilizables por tema
|
||
├── _Recursos/Musica Stock (mejor aún: en la biblioteca compartida del estudio)
|
||
├── _Documentos/ propuestas, referentes, brief
|
||
├── _Revisar/ lo que la app no supo ubicar
|
||
└── _Para borrar/ basura, proxies y originales ya convertidos (la app no borra; lo revisa y lo borra una persona)
|
||
```
|
||
|
||
Reglas que hacen que funcione:
|
||
|
||
1. **Un cliente, una carpeta, un disco.** Las únicas otras dos casas legítimas son `Entregas_LAB` (K:) y
|
||
`Exportados` (Q:), que ya gestiona Labstream OS.
|
||
2. **Los archivos no se renombran nunca; solo se mueven carpetas.** Resolve y Premiere re-enlazan por nombre.
|
||
3. **Dentro de una pieza no se toca.** El orden es de la raíz hasta el nivel de pieza.
|
||
4. **El mes es el de publicación, no el de rodaje.** Una `Grabación` de diciembre que alimenta piezas de marzo
|
||
vive en `03- Marzo/00_Grabacion`. Cuando no hay mes, la app usa la fecha del nombre del archivo
|
||
(Sony, DJI, Higgsfield, Envato y el MMDD de los clips Blackmagic) y solo al final la de modificación.
|
||
5. **Stock y música van a la biblioteca compartida**, no dentro de cada pieza.
|
||
6. **Los proxies se regeneran**: a `_Para borrar/proxies`. La basura de sistema, a `_Para borrar/basura`.
|
||
7. **Política de frío.** El BRAW de piezas ya publicadas y con más de 3 meses se convierte a H.265 10 bits;
|
||
el original va a `_Para borrar/originales`; una persona lo borra cuando comprueba que nadie lo echó de menos.
|
||
|
||
## 3. Cómo la app aprende
|
||
|
||
- **Diccionario.** La pestaña lista cada nombre de carpeta que aparece en la raíz («Grabado», «Render»,
|
||
«Julio music», «Nuevo Orden»…) con su peso. Le dices qué es (grabación, exportados, portadas, marca…) y
|
||
desde entonces esa palabra se reconoce en cualquier disco. Viene sembrado con ~200 palabras vistas en las
|
||
carpetas actuales, incluidos los errores de tecleo (`Elemnts`, `Visula`, `Calular pero de`).
|
||
- **Reglas exactas.** Si en el plan corriges el destino de una carpeta, se guarda como regla para ese cliente.
|
||
- **Alias de clientes.** `DR. DAVID REYES` = `David Reyes` = `Davids`. Con ellos la pestaña Mapa cruza todos
|
||
los discos y dice dónde vive cada cliente.
|
||
- Todo está en `datos/diccionario.json` y `datos/config.json`: texto plano, se puede editar a mano o versionar.
|
||
|
||
## 4. Optimizar material viejo (MP4 H.265 10 bits)
|
||
|
||
| Origen | Motor | Resultado medido |
|
||
|---|---|---|
|
||
| Sony XAVC-I 4K 60p 4:2:2 10 bits, 228 Mb/s | ffmpeg + NVENC (RTX 5080) | 671 MB → 24,6 MB (8,4 Mb/s) en 30 s, HEVC Main10 |
|
||
| Sony XAVC-I 4K 30p, 286 Mb/s | ffmpeg + NVENC | 286 → 9,6 Mb/s, 1,5× tiempo real |
|
||
| BRAW URSA 4.6K 30p, 567 Mb/s | DaVinci Resolve Studio (H.265 NVIDIA, Main10) | ≈ 31 Mb/s → unas 18 veces menos |
|
||
|
||
- **Perfiles:** ahorro / equilibrado / máxima. El bitrate objetivo sale del tamaño del cuadro y los fps
|
||
(≈ 0,085 bits por píxel y cuadro en «equilibrado»: 4K30 → 21 Mb/s, 4.6K30 → 31 Mb/s).
|
||
- **Croma:** 4:2:0 10 bits (Main10, se reproduce en todo) o 4:2:2 10 bits (Rext; la RTX 5080 lo codifica y
|
||
Resolve lo lee, pero muchos reproductores no).
|
||
- **BRAW:** pasa por Resolve porque ffmpeg no lo decodifica. El puente abre (o crea) el proyecto
|
||
«Labstream Archivo» con gestión de color a Rec.709 Gamma 2.4, importa los clips, monta una línea de
|
||
tiempo por resolución y renderiza «clips individuales». Si Resolve no deja cambiar de proyecto, trabaja en
|
||
un bin dentro del proyecto abierto y aplica la LUT Gen 5 Film → Video a cada clip. **Resolve debe estar
|
||
abierto con un proyecto, no en el Gestor de proyectos, y sin diálogos abiertos.**
|
||
- **Flujo:** Analizar (ffprobe) → Ver candidatos → Encolar → Verificar (duración, códec, 10 bits) →
|
||
Reemplazar (el original y su `.XML` de Sony van a `_Para borrar/originales`). La salida conserva la fecha
|
||
de modificación del original y se llama `nombre_10bit.mp4` junto al original.
|
||
- Se excluyen solos: lo que ya está en HEVC/AV1 eficiente (los iPhone en HDR, por ejemplo), lo que tiene
|
||
canal alfa, los exportados/masters (salvo que se marque «incluir exportados») y lo más reciente que N meses.
|
||
|
||
Estimación con los inventarios actuales: los 1,9 TB de BRAW de Danney y David Reyes quedarían en unos
|
||
110 GB; los intermedios ProRes/XAVC de más de 1 GB (≈ 1 TB entre los dos) en menos de 100 GB.
|
||
|
||
### Stock de Envato en proyectos viejos
|
||
|
||
Las tomas de Envato se vuelven a descargar con la suscripción: en piezas ya publicadas sobran. En la
|
||
pestaña Optimizar, «Buscar stock viejo» lista, agrupado por carpeta, todo lo que la app reconoce como
|
||
Envato (nombre `…-2026-01-22-22-34-00-utc` o carpeta `Elements`) en piezas de más de N meses. Se elige
|
||
video, música o imágenes. Va a `_Para borrar/stock` (reversible desde Bitácora); la app no lo borra nunca, eso lo hace una persona desde el Explorador. En David Reyes son 464 GB.
|
||
|
||
### Respaldo compacto (pestaña Respaldo)
|
||
|
||
Copia a otro disco una versión ligera de cada cliente para tenerla a mano:
|
||
|
||
- misma estructura de carpetas (`AAAA / MM- Mes / NN- Pieza`), y donde una carpeta mezcla tipos de medio se
|
||
separa en `Video`, `Audio`, `Imagenes`, `Diseño`, `Proyectos`, `Documentos`, `Fuentes`;
|
||
- los clips de cámara van en su versión **MP4 H.265 10 bits** (verificada) en lugar del original;
|
||
el BRAW/RAW que aún no se convirtió no se copia, y la pestaña lo lista para que se convierta antes;
|
||
- sin stock de Envato, sin proxies, sin basura, sin `_Para borrar`;
|
||
- deja `INDICE.csv` (ruta en el respaldo, ruta original, tipo, bytes, fecha), `_MAPA.md` (resumen por
|
||
carpeta y tipo) y `manifest.json` en la raíz del respaldo;
|
||
- es incremental: lo que ya está igual (tamaño y fecha) se salta, así se puede detener y retomar.
|
||
|
||
Orden recomendado por cliente: Ordenar → Optimizar (convertir BRAW e intermedios, verificar, reemplazar)
|
||
→ Buscar stock viejo → Respaldo → cuando el respaldo esté comprobado, una persona borra `_Para borrar` a mano.
|
||
|
||
## 5. Los discos
|
||
|
||
15 recursos compartidos en tres cajas (NAS Labstream 192.168.0.22, LabTem 192.168.0.40 y el Blackmagic
|
||
Cloud Store Mini 192.168.0.3). La pestaña Mapa los lista con su uso y marca en azul las carpetas que
|
||
reconoce como clientes. Propuesta de niveles:
|
||
|
||
| Nivel | Dónde | Qué |
|
||
|---|---|---|
|
||
| caliente | Cloud Store Mini (10G) | el mes en edición |
|
||
| trabajo | NAS Labstream (`labstream`, `Camilo Ortega`, `Medicina1`…) | el año en curso, una carpeta por cliente |
|
||
| entregas | `Entregas_LAB` y `Exportados` | lo maneja Labstream OS |
|
||
| frío | `temple`, `Datos`, `Nubes` | años anteriores ya optimizados a H.265 10 bits |
|
||
| recursos | `Recursos Audiovisuales`, `Sonidos` | música, stock, LUTs, transiciones compartidos |
|
||
|
||
Consolidar un cliente entre discos es una copia grande; conviene hacerla en el propio NAS
|
||
(`rsync` por SSH) y no desde el PC. La app ordena **dentro** de cada raíz; el cruce entre discos lo
|
||
muestra en el mapa para decidirlo.
|
||
|
||
## 6. Uso (interfaz 1.6)
|
||
|
||
1. `Iniciar.bat` (o `py -3.12 organizador.py`). Requiere Python 3.10+, ffmpeg/ffprobe en el PATH y, para BRAW,
|
||
DaVinci Resolve Studio abierto con scripting externo en *Local*.
|
||
2. Suelta la carpeta del cliente en la barra lateral (o pega la ruta). Se registra y se escanea sola.
|
||
3. La vista **Carpeta** es el recorrido: cinco pasos con estado (hecho, en curso, listo, pendiente, bloqueado)
|
||
y un bloque «Siguiente» que dice qué toca y ofrece un solo botón principal. El **Asistente paso a paso**
|
||
sigue disponible desde ahí.
|
||
- **1 Escanear**: solo lee nombres y tamaños.
|
||
- **2 Revisar**: diagnóstico y carpetas que la app no reconoce (se nombran en un panel, al lado del plan).
|
||
- **3 Ordenar**: «Calcular» enseña qué va a pasar, agrupado por tipo (basura, grabación, piezas…), con
|
||
seguridad *seguro / revisar / dudoso*. «Aplicar» mueve dentro de la misma carpeta. Se deshace desde Historial.
|
||
- **4 Convertir a 10 bits**: tres bloques en orden: elegir clips, conversión en curso, verificar y reemplazar.
|
||
Abajo, el stock de Envato viejo.
|
||
- **5 Respaldar**: destino → Calcular → Copiar. Avisa si hay BRAW sin convertir.
|
||
4. **Historial**: cada cambio en palabras («Ordenó carpetas», «Apartó stock viejo») con su Deshacer, y lo que
|
||
hay en `_Para borrar`.
|
||
5. **Ajustes** (engranaje): carpetas registradas, clientes con alias, plantillas.
|
||
|
||
Las tareas largas (escaneo, lectura de clips, conversión, asistente, copia) se ven en la **barra inferior** desde
|
||
cualquier vista, con progreso y Detener; al terminar aparece un aviso. Un botón deshabilitado siempre dice al
|
||
lado por qué. Los errores del programa se muestran como aviso, no rompen la pantalla.
|
||
|
||
Cambios de seguridad de 1.5.0: el servidor local rechaza peticiones que no vengan de la propia página
|
||
(cabeceras Host/Origin y Content-Type), `/api/config` solo acepta ajustes de conversión y respaldo, ningún
|
||
destino puede salir de la carpeta del cliente, la carpeta `_Para borrar` ya no se vuelve a planificar como
|
||
basura, y no se encola una conversión cuya salida ya exista o esté reclamada por otro clip (MP4 y MOV del
|
||
mismo nombre). El plan se invalida al re-escanear.
|
||
|
||
Movimientos (1.5.0): si en el destino ya existe un archivo con el mismo nombre, **no se renombra con «(2)»**:
|
||
se deja donde está y sale en los errores del lote (Resolve y Premiere enlazan por nombre, y el XML de Sony
|
||
va emparejado con su clip). Solo dentro de `_Para borrar` y `Duplicados` se numera. Si un archivo está
|
||
bloqueado (abierto en un editor) o la copia entre discos queda incompleta, el original no se toca. El sidecar
|
||
Sony `C0001M01.XML` se reconoce como cámara.
|
||
|
||
Actualización automática (1.5.0): sigue funcionando igual para el usuario (aviso en la vista Carpeta →
|
||
«Actualizar ahora»), pero antes de instalar se exige que el manifiesto traiga versión con forma `1.2.3`,
|
||
nombre de zip simple, sha256 obligatorio y descarga en el mismo servidor https que el manifiesto. No se
|
||
actualiza con un escaneo, lectura, conversión, asistente o copia en marcha. El `.bat` espera a que se cierren
|
||
todas las ventanas de OrganiLAB, guarda copia de la versión actual en `actualizacion\previa`, instala y, si
|
||
la copia falla, restaura la anterior. `datos\` y `ffmpeg\` nunca se tocan.
|
||
|
||
1.5.1: los hilos de lectura de clips y de la cola de conversión ya no dejan la app «ocupada» si fallan; cada
|
||
«Reemplazar» es un lote propio (`optimizar-fecha`) que se deshace solo, y antes de mover el original comprueba
|
||
que el MP4 verificado siga ahí; «Deshacer» dice qué archivos no pudo devolver y por qué; una carpeta llamada
|
||
solo «3» bajo un año se propone como marzo con confianza media, no alta; el puente con Resolve, cuando no puede
|
||
abrir «Labstream Archivo» y usa el proyecto del editor, no toca sus ajustes ni su cola de render ni lo guarda,
|
||
y nunca pisa un MP4 que ya exista; las raíces de unidad (`N:\`) ya se consultan bien (mapa y respaldo).
|
||
|
||
### Publicar una versión
|
||
|
||
py -3.12 empaquetar.py # construye dist\, los dos zips y manifiesto.json (NOTAS="..." para las notas)
|
||
bash publicar.sh # sube los zips al NAS, deja el manifiesto en GitHub y despliega el OS
|
||
|
||
Cuando el OS sirve el manifiesto nuevo, cada copia instalada lo ve al abrirse (o al pulsar «Actualizar ahora»),
|
||
descarga el zip «app» (15 MB), comprueba el sha256 y se sustituye sola sin tocar `datos\` ni `ffmpeg\`.
|
||
|
||
1.5.2: «Juntar repetidos» comprueba el contenido (primer MB, centro y último) antes de apartar una copia
|
||
«idéntica»; si difiere, la deja y lo dice. El plan avisa cuando el destino ya tiene un archivo con ese nombre
|
||
(baja a «dudoso» y no se marca). El actualizador reintenta solo durante unos minutos si el OS responde 502/503
|
||
(pasa mientras se redespliega) en vez de fallar a la primera.
|
||
|
||
1.5.3: el recorrido de cinco pasos va fijo arriba en todas las vistas (con el paso de la vista actual
|
||
resaltado, «Volver a escanear» y el asistente siempre a mano; el paso 1 también re-escanea al hacer clic);
|
||
la página aprovecha pantallas anchas (hasta 1720 px); `_Para borrar`, `_Papelera` y `Duplicados` se muestran
|
||
como «apartado por la app», no como carpetas sin reconocer.
|
||
|
||
1.5.4: «Convertir a 10 bits» queda en tres pasos limpios: Buscar clips (lee y lista en un solo botón; los
|
||
criterios y la calidad están plegados en «Cambiar criterios»), Convertir (lista compacta con estado, sin
|
||
tabla de diez columnas) y Reemplazar. Cada clip se verifica solo al terminar, así que el paso «Verificar»
|
||
desaparece. El stock de Envato pasa a «Revisar y ordenar». Ajustes es una sola lista por cliente: tipo,
|
||
sus carpetas y otros nombres con que aparece; las plantillas quedan en «Avanzado». Confirmado que ffprobe
|
||
sí lee los BRAW (resolución, fps, duración), así que la vía Resolve es alcanzable desde la interfaz.
|
||
|
||
1.5.5: botón «Buscar actualizaciones» en la barra lateral (junto a la versión y la hora de la última
|
||
comprobación). Por comando, en PowerShell hay que dar la ruta completa del .exe con `&` (no está en el PATH):
|
||
|
||
& "C:\Users\Munka\Downloads\OrganizadorLabstream-portatil-1.4.1\OrganizadorLabstream\OrganizadorLabstream.exe" actualizar --si
|
||
|
||
(`--si` instala sin preguntar; el nombre de la carpeta portátil no cambia al actualizar, solo su contenido).
|
||
|
||
1.6.0, rediseño: el recorrido de cinco pasos vive en la barra lateral, colgando de la carpeta seleccionada
|
||
(punto de estado, dato corto, clic para ir al paso; el paso 1 re-escanea). Cada vista cabe en una pantalla:
|
||
«Revisar y ordenar» tiene pestañas internas (Qué hay · Qué va a pasar · Por nombrar con su número · Stock
|
||
viejo); «Convertir» es un solo panel con tres botones (Buscar clips, Convertir N, Reemplazar N) y una lista
|
||
única con el estado de cada clip; «Historial» es una línea de tiempo por día con lo apartado en _Para borrar
|
||
resumido arriba; «Ajustes» son tarjetas de cliente plegadas que se abren para editar. La ayuda queda en una
|
||
línea y un «?» despliega el resto. Texto 13,5 px, un solo botón lleno por pantalla, y la carpeta que está
|
||
trabajando parpadea en la barra lateral.
|
||
|
||
1.6.1: se puede desconectar una carpeta escaneada. Aparece una ✕ al pasar el ratón por la carpeta en la
|
||
barra lateral y un enlace «Desconectar» en la cabecera de «Carpeta». Solo la quita de la lista: no borra ni
|
||
mueve nada del disco. Una casilla opcional olvida también el inventario escaneado (si no se marca, al volver
|
||
a soltar la carpeta el escaneo anterior sigue ahí). No deja desconectar mientras esa carpeta se escanea,
|
||
se analiza, se le aplica el plan o tiene conversiones pendientes. Endpoint `POST /api/raiz/quitar
|
||
{raiz, datos}`; queda anotado en la bitácora como `raiz_quitada`.
|
||
|
||
1.6.2: el manifiesto de actualización va firmado. `firma.py` (RSA-2048 sin dependencias) firma
|
||
versión+archivo+sha256+tamaño al empaquetar con la clave privada de `%USERPROFILE%\.labstream\organizador-firma.json`
|
||
(haz copia de seguridad: sin ella no se pueden publicar versiones nuevas); la pública está incrustada en
|
||
`actualizador.py` y el .exe no instala nada que no cuadre con ella, aunque alguien cambiara el archivo en el
|
||
servidor. Los .exe anteriores (≤ 1.6.1) ignoran la firma y siguen actualizándose. La barra de tareas muestra el
|
||
tiempo restante estimado (≈ 4 min) a partir del avance. Corregido: tras aplicar el plan, «Moviendo» se quedaba
|
||
en la barra de tareas para siempre y bloqueaba desconectar la carpeta. Pruebas automáticas en `probar.py`
|
||
(reglas, firma, y un recorrido completo escanear → plan → aplicar → deshacer → desconectar sobre una copia
|
||
temporal): `py -3.12 probar.py`. Rendimiento medido sobre el inventario real (54 mil archivos): las consultas
|
||
con LIKE tardan menos de 10 ms; no hacía falta optimizar.
|
||
|
||
1.6.3: botón «Elegir carpeta…» (barra lateral, pantalla vacía y diálogo de añadir) que abre el selector de
|
||
carpetas de Windows, sin depender de soltar la carpeta ni de pegar la ruta. `POST /api/elegir-carpeta` lanza el
|
||
diálogo en un PowerShell aparte para no bloquear el servidor y devuelve la ruta (o nulo si se cancela).
|
||
|
||
1.7.0, recorrido paso a paso y convertidor:
|
||
- Arrastrar una carpeta a la ventana ya trae su ruta real: el puente WebView2 (`v.dom.document.events.drop`)
|
||
guarda lo soltado y la interfaz lo pide en `/api/soltado`; la búsqueda por nombre queda solo de reserva
|
||
(navegador externo).
|
||
- «Qué va a pasar» son ahora tres pasos en frases, cada uno con su botón Aplicar: 1 apartar basura y proxies,
|
||
2 ordenar por año y mes, 3 ordenar lo demás. Cada fila dice «X pasa a Y» y por qué en lenguaje llano; lo
|
||
dudoso queda sin marcar. Al aplicar un paso el plan se recalcula solo. Cada fila del plan trae `paso`.
|
||
- «Por nombrar» propone qué es cada carpeta mirando su contenido (clips de cámara, proyectos, música, fotos,
|
||
documentos, videos) y el parecido del nombre con el diccionario; botón «Sí, es …» por carpeta y «Aceptar las
|
||
sugerencias seguras» para todas las de confianza alta (≥ 90 % de un mismo tipo y ≥ 3 archivos).
|
||
- «Stock viejo» agrupa por antigüedad (más de 12, 6-12, 3-6, 1-3, menos de 1 mes) con casilla por tramo y
|
||
atajos 1/2/3/6/12 meses.
|
||
- «Deshacer» sale de la interfaz (confundía). Sigue existiendo por API/CLI para emergencias.
|
||
- «Desconectar» pasa a llamarse «Quitar de la lista» con explicación clara.
|
||
- «Convertidor» (antes «Convertir a 10 bits»): formatos MP4 H.265 10 bits, H.265 ligero, H.264, ProRes Proxy /
|
||
LT / HQ (`FORMATOS`), detección real de GPU NVIDIA (NVENC) y CPU en `/api/optimizar/motores` (se prueba
|
||
codificando 3 cuadros), cola tipo Media Encoder («Convirtiendo 2 de 3 · 47 %») y el mismo clip se puede
|
||
convertir a varios formatos. ProRes nunca reemplaza el original (es de edición). Columna `formato` en
|
||
`trabajos`.
|
||
- Respaldar por lotes: «solo lo de más de 3 / 6 / 12 meses» (`meses` en `/api/respaldo/plan`).
|
||
- Barra de tareas revisada: la conversión en curso llegaba como un id y la interfaz esperaba un objeto (salía
|
||
0 % sin nombre); ahora `estado.cola` trae `actual` (ruta, pct, raíz), `hechos` y `total`.
|
||
|
||
1.8.0, auditoría y red de seguridad. Tras revisar el código con cuatro pasadas y medir sobre el material real
|
||
(7,73 TB, 53.964 archivos):
|
||
- **Deshacer vuelve a la interfaz.** Al rediseñar el Historial en la 1.6.0 se quitaron los botones pero la app
|
||
seguía prometiendo en cuatro pantallas que «se deshace desde Historial». Ahora está en el Historial, en
|
||
«Últimos cambios» y en el aviso que sale al aplicar («Deshacer esto»).
|
||
- **«Elements» ya no convierte en stock lo que tenga dentro.** La marca solo la hereda una carpeta con nombre
|
||
completo de paquete de Envato; lo descargado se reconoce por el nombre del archivo. Medido: marcaba 1.713
|
||
archivos y 50,7 GB de material propio como desechable, que el respaldo excluye por defecto.
|
||
- **El plan contrasta el mes de la carpeta con la fecha de los archivos** (`_discrepa_mes`, `Plan.mes_real`).
|
||
Si no cuadran, baja a «probable», no se marca y sale un aviso arriba con los dos meses. 5 de las 10 carpetas
|
||
de mes con material fechable no contenían el mes que decían: son 727 GB. Los nombres Blackmagic no traen
|
||
año, así que en esos solo se compara el mes.
|
||
- **Un archivo bloqueado ya no corta el resto de su grupo** en `aplicar()`: cada archivo va por su cuenta y el
|
||
resumen dice cuántos fallaron de verdad (antes uno abierto en Resolve dejaba sin mover los 117 restantes).
|
||
- **Un escaneo interrumpido no reemplaza el inventario:** si hubo fallos de lectura y el recuento cae más de
|
||
un 10 % frente al anterior, se conserva el que había y se explica por qué.
|
||
- **Las uniones de carpeta de Windows no se recorren** (`_es_enlace`, `_id_carpeta`). Una circular dejaba el
|
||
escaneo dando vueltas sin fin: comprobado, un árbol de un archivo no terminaba en dos minutos.
|
||
- **Abrir una carpeta pasó de 8,83 s a 0,21 s:** `_resumen_carpetas` calcula de una sola pasada lo que antes
|
||
era una consulta por carpeta que recorría la tabla entera.
|
||
- **La papelera se llama igual en el disco que en pantalla.** Las plantillas guardadas con el nombre viejo
|
||
(`_Papelera`) se migran a `_Para borrar` al arrancar.
|
||
- Falsos positivos quitados: `.dat`, `.idx` y `.bak` ya no son basura de sistema, y una carpeta llamada
|
||
`Cache` a secas ya no son proxies. Las abreviaturas de mes («Mar», «May») bajan a confianza media.
|
||
- Convertidor: un clip ya convertido a un formato puede convertirse a otro (el filtro «en cola» miraba todos
|
||
los trabajos); los originales ya apartados no vuelven a salir como candidatos; en modo espejo cada formato
|
||
tiene su propio archivo; el temporal se borra si falla; y la cola no puede arrancar dos veces.
|
||
- Interfaz: los botones ya no vuelven a su etiqueta vieja pisando lo que la acción acaba de calcular, y las
|
||
rutas de Windows se recortan bien (soltar un archivo registraba el archivo como carpeta de cliente).
|
||
|
||
1.8.1, fase 2 de la auditoría:
|
||
- **Dos movimientos que acabarían en el mismo archivo se detectan antes de aplicar** (`Plan.marcar_colisiones`).
|
||
Caso real: dos carpetas de grabación genéricas del mismo mes van las dos a `00_Grabacion/SONY` y las dos
|
||
traen un `C0001.MP4`. Ahora salen sin marcar, en rojo, con un aviso que nombra las dos carpetas y el archivo
|
||
que choca. También se comprueba si el destino ya tiene un archivo con ese nombre en el disco (antes solo se
|
||
miraba en las filas de carpeta, no en los grupos de archivos); se revisan los 40 primeros de cada grupo para
|
||
no llenar la red de consultas.
|
||
- **Aplicar por pasos ya no degrada el inventario.** `actualizar_inventario` reescribe las filas de `carpetas`
|
||
con su ruta nueva en vez de borrarlas, y conserva la marca de basura/proxy heredada. Antes, como la interfaz
|
||
recalcula el plan sin volver a escanear, los pasos siguientes salían con «0 archivos · 0 B» y sin fecha.
|
||
Comprobado: tras aplicar el paso de fechas, la fila del paso 3 conserva sus 3 archivos y su peso.
|
||
|
||
1.9.0, convertidor y respaldo:
|
||
- **El análisis de clips va en paralelo** (`HILOS_ANALISIS = 8`), se puede detener y dice cuántos no se
|
||
pudieron leer. Cada lectura con ffprobe es sobre todo espera de red: 0,23 s por clip medidos en el NAS, así
|
||
que los 15.423 clips pendientes pasaban de la hora solo para poder empezar a convertir.
|
||
- **Los formatos ahora pesan de verdad distinto.** «Ligero para compartir» usaba el mismo perfil de calidad
|
||
que el de archivo y solo bajaba un techo de tasa que casi nunca se toca. Medido sobre el mismo clip:
|
||
archivo 14,3 MB, ligero 8,2 MB, H.264 18,3 MB.
|
||
- **ProRes ya no lleva cuantizador fijo:** con `-qscale` se saltaba la tasa del perfil y un «máster HQ» no
|
||
salía a tasa de HQ, que es justo lo que promete.
|
||
- **El croma 4:2:2 se prueba de verdad** al arrancar (`motores()["chroma422"]`). NVENC no lo admite antes de
|
||
Blackwell; si la tarjeta no puede, el trabajo va por CPU en vez de fallar, y la interfaz lo dice.
|
||
- **El audio multipista ya no rompe la conversión:** `-c:a copy` solo cuando hay una sola pista AAC. Con dos
|
||
pistas (cámaras de audio multipista) ffmpeg abortaba. Se guarda `pistas_audio` al analizar.
|
||
- **Raíces anidadas rechazadas:** registrar `N:\` y `N:\Camilo` dejaba a la interna sin inventario y su
|
||
respaldo copiaba cero archivos diciendo que había ido bien.
|
||
- **Respaldo incremental corregido:** compara con el archivo de origen tal como está ahora, no con lo que
|
||
decía el último escaneo. Antes, algo editado después de escanear no se volvía a copiar nunca.
|
||
- **El índice del respaldo se acumula** en vez de reescribirse con la última tanda, que es lo que hacía
|
||
inservible el respaldo por lotes.
|
||
- Interfaz: marcar una casilla del plan actualiza solo las cifras (antes repintaba la lista entera y se
|
||
perdía el foco); el buscador de Ajustes ya no borra lo que estabas editando; la lista de stock no salta al
|
||
principio en cada clic.
|
||
|
||
2.0.0, una sola lista por carpeta. La pantalla «Carpeta» deja de ser un resumen y pasa a ser la lista de
|
||
todo lo que se puede hacer ahora mismo, en orden, cada cosa con su cifra real y su botón: apartar basura y
|
||
proxies, decir qué son las carpetas que no reconoce, ordenar por fecha, ordenar lo demás, apartar stock
|
||
viejo, juntar repetidos, aligerar los clips y respaldar. Lo que ya está hecho aparece tachado con un visto.
|
||
Era la simplificación de fondo que salió de la auditoría: antes había que bajar tres niveles de navegación
|
||
(pestaña, sub-pestaña, paso) para saber qué faltaba en una carpeta.
|
||
|
||
Endpoint nuevo `GET /api/carpeta/acciones` (`acciones()`): todas las cifras salen de consultas baratas sobre
|
||
el inventario, así que tarda entre 0,04 y 0,23 s en las carpetas reales; el plan de orden solo se consulta si
|
||
ya estaba calculado, y si no el botón dice «Calcular». De paso se conecta a la interfaz la detección de
|
||
material repetido, que funcionaba por dentro pero no tenía dónde pulsarse, y `_gb` pasa a dar terabytes.
|
||
|
||
2.1.0, el asistente se fusiona con la lista. Había dos formas de hacer lo mismo: la lista de acciones y un
|
||
«Asistente paso a paso» que recorría lo mismo preguntando. Ahora hay una sola: encima de la lista sale
|
||
**«Hacer las N de una vez»**, que ejecuta seguidas las acciones que no necesitan que elijas nada (apartar
|
||
basura y proxies, ordenar por fecha, ordenar lo demás, apartar stock viejo, juntar repetidos) usando el mismo
|
||
motor que tenía el asistente. Se quedan fuera convertir y respaldar, que tienen su propio botón porque hay
|
||
que elegir. Lo dudoso nunca entra: se queda como está para que alguien lo mire.
|
||
|
||
Probado de punta a punta sobre un árbol de ensayo: 19 archivos antes y después, ninguno perdido, y en un solo
|
||
clic el material de cámara quedó repartido por mes y fuente, las piezas en su mes, la música en `_Recursos` y
|
||
la basura, los proxies y el stock viejo en `_Para borrar`. Endpoint `POST /api/acciones/hacer`; la lista de
|
||
acciones trae `automatico` (las que se pueden hacer solas) y el progreso del motor. De paso, las acciones de
|
||
ordenar dejan de contar como pendientes mientras no haya un plan calculado: después de ordenarlo todo la
|
||
lista seguía diciendo que faltaban dos cosas que en realidad ya no tenían nada.
|
||
|
||
2.2.0, la fecha de verdad manda y ya no hay que decidir nada a mano:
|
||
- **La fecha sale de lo más antiguo que sabe el disco** (`R.fecha_real`): al copiar en Windows la fecha de
|
||
creación pasa a ser la de la copia y la de modificación se conserva; al renderizar, las dos son nuevas.
|
||
Quedarse con la más antigua de las dos da siempre la mejor estimación de cuándo se grabó.
|
||
- **Un render hereda la fecha del original** (`R.base_derivado`, `_heredar_fechas`). «C0001_10bit.mp4» se
|
||
archiva en el mes en que se grabó «C0001.MP4», no en el mes en que se convirtió. Reconoce los sufijos
|
||
habituales (`_10bit`, `_ligero`, `_h264`, `_proxy`, `_LT`, `_HQ`, `_render`, `_export`, `_master`, `_final`)
|
||
y busca el original en la misma carpeta o, si el nombre es bastante propio y único, en toda la carpeta del
|
||
cliente. Si hay dos candidatos con el mismo nombre no hereda nada. Las conversiones que hace la propia app
|
||
ya conservaban la fecha del original, tanto por ffmpeg como por Resolve.
|
||
- **Cuando la carpeta y los archivos no coinciden, manda el archivo.** El nombre del clip lo pone la cámara y
|
||
la fecha la pone el disco; el nombre de la carpeta lo escribió una persona con prisa. Así el material se
|
||
archiva en el mes en que se grabó sin preguntarle nada a nadie, y el aviso ya no pide una decisión: dice lo
|
||
que la app hizo y por qué. En el material real, los 727 GB de las dos carpetas que mentían se resuelven
|
||
solos: lo de «02-marzo» va a diciembre de 2025 y lo de «08-Agosto» a abril de 2026.
|
||
|
||
2.2.1, el diálogo de añadir carpeta se explica solo. Al soltar una carpeta salían dos campos, «Cliente» y
|
||
«Tipo», sin decir para qué servían ni qué iba a pasar al confirmar, y el tipo se describía por a quién se le
|
||
hace («Contenido mensual (dermatólogas, marca personal): año / mes / pieza») en vez de por cómo queda
|
||
ordenado. Ahora cada campo es una pregunta en español con una línea debajo que dice qué hace, y el diálogo
|
||
enseña, con la plantilla de verdad del tipo elegido, las cuatro carpetas donde va a guardar el material:
|
||
|
||
```
|
||
V:\Galeano\2026\09- Septiembre\00_Grabacion\ lo que sale de la cámara
|
||
V:\Galeano\2026\09- Septiembre\Nombre de la pieza\ cada pieza, con su edición
|
||
V:\Galeano\2026\09- Septiembre\_Exportados\ lo que ya se entregó
|
||
V:\Galeano\_Recursos\Musica\ música y sonidos de siempre
|
||
```
|
||
|
||
El ejemplo se arma con `ESTADO.plantillas`, o sea que enseña exactamente lo que la app va a hacer y cambia
|
||
al cambiar el tipo. Además cierra un fallo: si el nombre que se escribe es un cliente que ya existe, se
|
||
preselecciona el tipo que ese cliente ya tiene; antes salía siempre «contenido», así que una segunda carpeta
|
||
de un cliente de pauta o de proyecto se podía registrar con la plantilla equivocada. Y el diálogo dice al
|
||
final que al confirmar solo lee y arma una lista: no mueve ni un archivo.
|
||
|
||
Probado el 9 sep 2026 sobre una copia de ensayo: plan → aplicar → deshacer → volver a aplicar deja el árbol
|
||
exacto; conversión ffmpeg verificada y reemplazo con original a `_Para borrar`. El puente de Resolve conectó
|
||
con Resolve Studio 21.1 pero no pudo abrir proyecto porque Resolve estaba en el Gestor de proyectos:
|
||
queda por probar con un proyecto abierto.
|