Schließt eine MVP-Lücke: README verlangt "überschreiben nur nach
Rückfrage", bisher landete CropEngineError.destinationAlreadyExists
nur als Fehler in der Liste.
ConversionPipeline.previewDestination berechnet den Zielpfad einer
Datei, ohne irgendetwas anzufassen — damit kann die Oberfläche vor dem
Start prüfen, ob Konflikte bestehen, statt es mitten im Batch zu
entdecken. Bei Konflikten zeigt ConversionCoordinator einen Sammel-
Alert (Ersetzen/Überspringen/Abbrechen) für den ganzen Batch; eine
Datei-für-Datei-Auswahl wäre für das MVP unverhältnismäßig viel UI für
einen Randfall.
Neuer DropItem.Status-Fall .skippedByUser unterscheidet eine bewusste
Nutzerentscheidung von einem echten Fehler/Reject.
Schritt 3 der Umsetzungsreihenfolge.
ConversionPipeline bündelt den kompletten Weg einer Datei — Namen
parsen, Projekt-Unterordner anlegen, Original kopieren, croppen — als
einzelnen, UI-freien Core-Baustein. droptwo-cli und später die App
nutzen denselben Aufruf, damit beide garantiert dasselbe tun.
JobQueue verarbeitet mehrere Dateien mit begrenzter Parallelität
(Standard 2 gleichzeitige Exporte) und liefert Ergebnisse fortlaufend
über einen AsyncStream.
droptwo-cli ruft nur noch ConversionPipeline pro Datei auf. An echtem
9:16-Testmaterial verifiziert: korrekte Zielauflösung (1080×1920 ->
1080×1350), Dauer/Framerate erhalten, plausible Bitrate, sauberer
zentrierter Crop (visuell per Frame-Vergleich geprüft).