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

- Name
- Mateo Londoño Toro
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:
- Organizar (origen → destino con plantillas)
- Sync desde carpeta local (medios ya descargados / QA)
- Historial (revertir, abrir carpetas, vaciar con
send2trash)
USB con libimobiledevice queda para Fase 2, solo si Captura de imagen + Organizar no alcanza.

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

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.

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.

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


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.


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.

Detalles de plataforma que importan
| Tema | Comportamiento Fase 1 |
|---|---|
| Datos de app | ~/Library/Application Support/MediaIngest |
| Destino default (instalacion nueva) | ~/Pictures/MediaIngest |
| Settings Windows existentes | Se conservan (D:\Contenido no se pisa al actualizar) |
| Abrir en Finder | open para carpetas; open -R para revelar un archivo |
| iCloud placeholders | Se omiten con warning si hay sibling .icloud |
| CI macOS | No hay runner: GUI/Fluent se verifica a mano |


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.