BlueProject
Published on

Media Ingest llega a macOS — Fase 1 (carpeta local, Organizar e Historial)

Authors
  • avatar
    Name
    Mateo Londoño Toro
    Twitter

En el post anterior documente Media Ingest en Windows: Sync por USB (Shell/MTP), Organizar e Historial con rollback. Esta bitacora cubre el port a macOS — Fase 1: la misma app, usable en Mac, sin pretender clonar el acceso WPD al iPhone.

Evidencia de campo (mismo dia): el flujo Captura de imagen → carpeta Temporal ya corro con el iPhone real — ver Evidencia — Captura de imagen → Media Ingest.

Evidencia con tests: preview read-only Temporal → Media ({year}/{month}/{day}/{type}), 111 archivos / ~6.1 GiB, mas capturas UI regeneradas por pytest — ver Evidencia con tests — Temporal → Media.

Las capturas de UI de este post salen del pipeline de docs/tests (docs/assets, regeneradas con pytest tests/test_docs_screenshots.py). La captura de Captura de imagen es evidencia manual del Mac.

Por que Fase 1 no incluye USB en Mac

En Windows el iPhone aparece bajo Este equipo via drivers Apple + Shell. En macOS ese stack no existe: el import crudo ya lo cubren Captura de imagen / Fotos. Donde Media Ingest aporta valor es despues: reglas de carpetas, nombres, dedupe, sesiones reversibles.

Asi que Fase 1 prioriza el ROI:

  1. Organizar (origen → destino con plantillas)
  2. Sync desde carpeta local (medios ya descargados / QA)
  3. Historial (revertir, abrir carpetas, vaciar con send2trash)

USB con libimobiledevice queda para Fase 2, solo si Captura de imagen + Organizar no alcanza.

Captura de imagen importando del iPhone a Temporal

Evidencia 2026-08-05: iPhone de Mateo → Captura de imagen → Temporal (90 items, HEIC/MOV/MP4 en curso).

Inicio de Media Ingest

Misma app, mismos flujos

La UI sigue siendo PySide6 + QFluentWidgets. En Mac el chrome Fluent no es nativo (traffic lights / menubar): Fase 1 lo documenta — cerrar la ventana = salir, con Cmd+Q y un menu minimo Salir.

Flujo Sincronizar

En Darwin, Sync ya no habla de Este equipo. El origen es una carpeta local: eliges con el picker, Detectar la lista, y preparas la exportacion como siempre.

Preparar exportacion

Organizar no dependia del dispositivo: ya era filesystem puro. En Mac es el nucleo del valor (pasar de una carpeta a otra con estructura).

Modulo Organizar
Animacion al organizar

Historial, papelera y cuota

Cada Sync u Organizar deja sesion. Revertir mueve a la papelera interna; vaciar intenta enviar a la Papelera del SO via send2trash.

Historial y rollback
Flujo de revertir

En Windows habia preflight de cuota BitBucket (el incidente de ~313 GB lo dejo claro). En macOS no hay API equivalente: la app no finge que la cuota «cabe». Antes de vaciar muestra un aviso explicito de sin verificacion de cuota, con log. No es cosmetico: es la misma filosofia de seguridad, adaptada al SO.

Vaciado de papelera

Detalles de plataforma que importan

TemaComportamiento Fase 1
Datos de app~/Library/Application Support/MediaIngest
Destino default (instalacion nueva)~/Pictures/MediaIngest
Settings Windows existentesSe conservan (D:\Contenido no se pisa al actualizar)
Abrir en Finderopen para carpetas; open -R para revelar un archivo
iCloud placeholdersSe omiten con warning si hay sibling .icloud
CI macOSNo hay runner: GUI/Fluent se verifica a mano
Ajustes — carpeta origen
Registro

Arranque en Mac

pip install -r requirements.txt
python main.py

Smoke minimo: carpeta origen local (idealmente fuera de iCloud) → Detectar → Sync → Organizar → Historial → Abrir destino / Revertir / Vaciar (con el aviso de cuota).

Que queda fuera (a proposito)

  • iPhone USB / libimobiledevice
  • Empaquetado .app / notarizacion
  • Runner CI macOS
  • Linux

El producto en Windows sigue siendo el camino USB completo. En Mac, Fase 1 convierte el dolor de organizar y auditar sesiones en algo usable sin reinventar el import del telefono.

Siguiente posible paso: Fase 2 solo si el flujo Captura de imagen → carpeta → Media Ingest se queda corto en el dia a dia. La primera evidencia de ese flujo ya esta publicada: Evidencia — Captura de imagen.