Convertir: lista por carpetas con cuánto falta, «comparar» con nota de calidad, y un botón principal según el momento

Munka eligió tres de seis propuestas dibujadas en un lienzo (quedan el horario nocturno, el resumen
al acabar y marcar con criterio):
- La lista va por carpetas (la ruta una sola vez), el clip que se convierte lleva su barra y lo que le
  queda, «primero este» adelanta uno, y los excluidos salen en grupos con su porqué. Antes y después en
  una barra. La cola mide su ritmo y dice cuánto falta y a qué hora acaba (eta en /api/optimizar/cola).
- «Comparar»: el mismo cuadro del original y del convertido en tres instantes, con lupa, y «Medir la
  calidad» (VMAF) que se guarda en el trabajo; braw.py cuadro y braw.py calidad revelan el BRAW con la
  misma curva. Medido: 97,8 en 14 s con un BRAW de 16,5 GB.
- Un solo botón grande según el momento: buscar, convertir (con «reemplazar solo cuando estén
  verificados», optimizar.auto_reemplazar), la tanda con Detener, reanudar, o reemplazar lo verificado.

Pruebas: probar 19, prueba_funcional 31 (nueva: comparar), prueba_ventana 18.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Este commit está contenido en:
Labstream
2026-10-12 11:43:05 -05:00
padre d92814d16c
commit d38c51bd73
Se han modificado 5 ficheros con 544 adiciones y 40 borrados

Ver fichero

@@ -371,6 +371,18 @@ def p_convertir():
return '%s: convertido (%s), verificado y reemplazado; original apartado' % (fmt, t['motor'])
def p_comparar():
# el original ya se reemplazó (está en _Para borrar/originales): el cuadro tiene que salir de ahí
for cual in ('original', 'convertido'):
r = urllib.request.urlopen(BASE + '/api/optimizar/cuadro' + q(id=IDS['trabajo'], cual=cual, t=1.5), timeout=120)
assert r.headers.get('Content-Type') == 'image/jpeg' and len(r.read()) > 2000, 'no salió el cuadro %s' % cual
c, r = post('/api/optimizar/calidad', {'id': IDS['trabajo']})
assert c == 200 and 30 < r['vmaf'] <= 100 and r['cuadros'] > 10, r
t = next(x for x in get('/api/optimizar/cola')['trabajos'] if x['id'] == IDS['trabajo'])
assert t['nota'] == r['vmaf'] and t.get('dur'), t
return 'dos cuadros JPEG y nota VMAF %s sobre %d cuadros (%.0f s)' % (r['vmaf'], r['cuadros'], r['seg'])
def p_braw():
m = get('/api/optimizar/motores')['braw']
if not BRAW:
@@ -540,7 +552,7 @@ for nombre, fn in (('Interfaz sin nada externo', p_estatico), ('Registrar carpet
('Historial y papelera', p_historial), ('Repetidos', p_repetidos), ('Stock viejo', p_stock),
('Carpetas vacías', p_vacias), ('Mapa interactivo', p_mapa), ('Colores en Windows', p_colores),
('Motores de conversión', p_motores), ('Leer clips (ffprobe)', p_analizar),
('Convertir, verificar, reemplazar', p_convertir), ('Convertir un BRAW', p_braw), ('Control de la cola', p_cola_control),
('Convertir, verificar, reemplazar', p_convertir), ('Comparar original y convertido', p_comparar), ('Convertir un BRAW', p_braw), ('Control de la cola', p_cola_control),
('Respaldar', p_respaldo), ('Asistente / hacer de una vez', p_asistente),
('Pieza nueva', p_pieza), ('Bandeja de entrada y tarjeta', p_entrada), ('Orden automático', p_automatico),
('Arrastrar y buscar carpeta', p_soltar_y_buscar), ('Actualizaciones', p_actualizacion_offline),