3.2.0: el orden mira la forma de las carpetas, no solo su nombre

Medido sobre una carpeta de cliente real (8.207 archivos, 920 GB) antes de tocar nada:

- «Por nombrar» solo pregunta por lo que el plan llega a ver y no sabe resolver; ya no por las
  carpetas de la app ni por lo de dentro de la papelera. Lo aprendido vale por el nombre entero.
- Una carpeta es una grabación por lo que tiene dentro: una pieza montada no se desarma, y lo
  que no es rodaje no acaba en 00_Grabacion\OTROS. Se conserva el nombre de cada sesión.
- Una carpeta que guarda meses o años dentro se abre y cada cosa va a su mes; si la pieza ya
  existe allí, se junta con ella.
- Repaso de lo ya ordenado: lo que está en un mes que no es el de su rodaje vuelve al suyo.
- El año de un clip de Blackmagic sale de los demás clips de su tarjeta y día; un rodaje que
  pasa de medianoche cuenta como uno.
- Un clip convertido sigue siendo de su cámara, y el convertidor no repite lo que ya convirtió.
- «Exportados» junto a «_Exportados» y «_Papelera» junto a «_Para borrar» se juntan.
- «Hacer de una vez» solo mueve lo marcado; lo dudoso que queda no cuenta como pendiente.
- El inventario lleva la versión de las reglas: uno anterior pide escanear otra vez.

Pruebas: prueba_orden.py (nueva, 19 casos), probar.py 19, prueba_funcional.py 26,
prueba_ventana.py 18 desde el código y 17 con el paquete.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Este commit está contenido en:
Labstream
2026-10-04 16:33:45 -05:00
padre 45ece8f2e7
commit c419d5d943
Se han modificado 8 ficheros con 1334 adiciones y 184 borrados

Ver fichero

@@ -17,7 +17,7 @@ static/manrope.woff2 ← la tipografía, para no pedirle nada a nadie fuera de
WebView2Loader.dll ← la entrada a WebView2 (Microsoft, firmada); lo único que viaja y no es de Python
datos/ ← inventario.sqlite, config.json, diccionario.json (lo aprendido), bitacora.jsonl
empaquetar.py ← arma el paquete: dist\OrganizadorLabstream\ con OrganizadorLabstream.exe y los dos zips
probar.py ← 19 pruebas sin abrir nada · prueba_funcional.py: las 26 funciones · prueba_ventana.py: la ventana de verdad
probar.py ← 19 pruebas sin abrir nada · prueba_orden.py: el motor de orden, caso a caso · prueba_funcional.py: las 26 funciones · prueba_ventana.py: la ventana de verdad
Iniciar.bat ← desde el código, con consola (para ver lo que imprime)
```
@@ -229,7 +229,7 @@ y nunca pisa un MP4 que ya exista; las raíces de unidad (`N:\`) ya se consultan
### Publicar una versión
py -3.12 probar.py && py -3.12 prueba_funcional.py && py -3.12 prueba_ventana.py
py -3.12 probar.py && py -3.12 prueba_orden.py && py -3.12 prueba_funcional.py && py -3.12 prueba_ventana.py
py -3.12 empaquetar.py # construye dist\, los dos zips y manifiesto.json (NOTAS="..." para las notas)
py -3.12 prueba_ventana.py --paquete dist\OrganizadorLabstream # el paquete, arrancado por su .exe
bash publicar.sh # sube los zips al NAS, deja el manifiesto en GitHub y despliega el OS
@@ -757,6 +757,66 @@ son los de verdad. Consecuencias, vistas el 4 oct 2026:
- Las pruebas que dan de alta en el registro (`probar.py`, `prueba_ventana.py`) no se ven afectadas: escriben
y leen en la misma copia, y además usan una clave de ensayo.
3.2.0, el orden mira la forma de las carpetas, no solo su nombre. Munka pidió pulir la organización de las
carpetas. Antes de tocar nada se midió sobre su carpeta de Andrea Galeano (`V:\Galeano`, 8.207 archivos,
920 GB), el 4 oct 2026, y de ahí sale cada cambio:
- **«Por nombrar» preguntaba lo que no debía, y contestar hacía daño.** Salían todas las carpetas del
inventario, también las de la propia app (`_Para borrar\basura`, las etiquetas que ella misma crea dentro
de `00_Grabacion`) y las que solo existían ya dentro de la papelera. De las 6 preguntas que tenía esa
carpeta, sobraban las 6; a todas proponía «grabación» porque medía por peso, y los clips pesan cien veces
más que lo demás. Aceptarlas enseñó al diccionario que «orden», «videos» y «basura» eran grabaciones, y
como lo aprendido valía también como palabra suelta dentro de otros nombres, «videos ia» pasó a ser
grabación y el plan se dispuso a desarmar «01- Orden», 533 archivos y 65 GB con proyectos dentro.
Ahora `vocabulario` recorre el inventario igual que el plan recorre el disco y solo pregunta por lo que el
plan llega a ver y no sabe resolver; la propuesta sale de la forma de la carpeta y del número de archivos,
y nunca es «grabación» (una grabación de verdad el plan la reconoce solo). Lo aprendido vale por el nombre
entero; solo las palabras de fábrica valen dentro de otros nombres. Los nombres de la app no se pueden
enseñar, y los que se habían colado se olvidan al arrancar. Sobre la misma carpeta: de 6 preguntas a 0.
- **Una carpeta es una grabación por lo que tiene dentro** (`Estructura.es_rodaje`): casi todo clips de
cámara, y sin las carpetas de una pieza montada (exportados, portada, stock, música, proyecto). Si el
nombre lo dice con una palabra de fábrica basta con que casi todo sea material; si lo dijo alguien en
«Por nombrar», se exige cámara reconocida. Una pieza a la que se llamó grabación ya no se desarma.
Dentro de una grabación, lo que no es rodaje (un proyecto, un guion, una imagen de IA) ya no acaba en
`00_Grabacion\OTROS`: va donde iría suelto; y una subcarpeta de exportados o de música va a lo suyo. Se
conserva el nombre de cada sesión («Tomas consultorio») y la subcarpeta `Duplicados`.
- **Cajones.** Una carpeta que guarda meses o años dentro («Orden», «Proyectos\Mayo», «Edición\11-Noviembre»)
no es una cosa que mover: se abre, y lo de dentro se fecha solo, sin heredar el mes donde el cajón esté
metido (`Plan.abrir`). Vale también para una carpeta numerada como pieza cuando alguien confirma que es un
cajón. Solo en clientes cuyas piezas van por mes: una campaña con sus fechas se sigue moviendo entera.
Si la pieza que llega ya existe en ese mes, se junta con ella en vez de dejar una gemela al lado.
- **Repaso de lo ya ordenado** (`Plan.plan_auditoria`). Las carpetas de la estructura no se volvían a
mirar, así que lo que una versión anterior dejó en el mes equivocado se quedaba ahí. En esa carpeta, 385
clips (464,6 GB) estaban en un mes que no era el de su rodaje: los de diciembre de 2025, en marzo. Se
proponen a su mes los que llevan la fecha en el nombre, y con ellos lo que se grabó ese mismo día.
- **El año de un clip de Blackmagic.** El nombre trae tarjeta, mes, día y hora, pero no año. Antes salía de
la fecha del archivo (que una conversión cambia) o del año de la carpeta (que podía estar mal: mandaba a
diciembre de 2024 lo de diciembre de 2025). Ahora todos los clips de la misma tarjeta y día comparten
año (`_fechas_de_rodaje`): el del que conserve su fecha de cámara, o el más antiguo. Y un rodaje que pasa
de medianoche es uno solo: el del 31 de mayo a las 21:07 seguía a las 04:00 del 1 de junio y salía partido
en dos meses.
- **Un clip convertido sigue siendo de su cámara.** 166 clips que ya habían pasado por el convertidor
(«C0001_10bit.mp4») habían perdido su cámara: contaban como «video que no viene de cámara» e iban a OTROS
o a exportados. Y el convertidor no reconocía su propia salida: 22 estaban convertidos dos veces y algunos
tres («…_10bit_10bit_10bit.mp4»). `firma_archivo` mira el nombre sin el sufijo del convertidor (ni el
« (2)» de una copia), y `candidatos` no vuelve a ofrecer lo que ya convirtió.
- **Carpetas gemelas.** `CARPETAS_PROPIAS` comparaba sin el guion bajo, así que una «Exportados» hecha a
mano pasaba por la `_Exportados` de la app y no se tocaba: convivían las dos en el mismo mes. Ahora las
propias salen de las plantillas del tipo de cliente, y la gemela se junta con la buena. Lo mismo con la
papelera: `_Papelera`, el nombre de antes, se junta con `_Para borrar`.
- **«Hacer las N de una vez» solo hace lo marcado.** El material de cámara entraba entero aunque el plan
lo diera por dudoso. La fecha de un original de cámara sí cuenta como probable (es la del rodaje). Lo
dudoso que queda después ya no cuenta como tarea pendiente, y el stock viejo que la lista contaba ahora
se aparta entero (la licencia y el «léeme» de un paquete de Envato se quedaban atrás para siempre).
- **Inventario con versión** (`R.VERSION_REGLAS`). Cambió lo que el escaneo apunta de cada archivo, así
que un inventario hecho con una versión anterior pide «Escanear otra vez» antes de planear nada.
Comprobado sobre una réplica local de esa carpeta (mismos nombres, carpetas y fechas; archivos de 64 bytes;
el NAS no se tocó): «hacer de una vez» hizo 803 movimientos sin errores ni pérdidas, «01- Orden» quedó vacía
y repartida en sus meses, y una segunda pasada no propuso nada marcado. Pruebas: `prueba_orden.py`, nueva,
19 casos que reproducen cada uno de estos puntos en pequeño; `probar.py` 19 de 19, `prueba_funcional.py` 26
de 26 y `prueba_ventana.py` 18.
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: