Schritt 4 der Umsetzungsreihenfolge.
- AppSettings: Quell-/Zielordner über Security-Scoped Bookmarks,
überlebt einen Neustart.
- DropZoneView: Drag & Drop plus Dateiauswahl-Dialog, öffnet im
konfigurierten Quellordner.
- ConversionCoordinator treibt JobQueue an, sortiert neue Dateien nach
zuletzt geändert, hält Fortschritt/Status pro Datei nach.
- FileListView zeigt Fortschritt und hebt Problemfälle (übersprungen/
abgelehnt/fehlgeschlagen) sichtbar hervor — keine stillen Abbrüche.
- CoreErrors+LocalizedError: deutsche Klartexte für die Core-Fehler-
Enums leben bewusst im App-Target, nicht im UI-freien Core.
- AppIcon aus assets/icon.svg gebaut (alle 10 macOS-Icongrößen via
rsvg-convert, ImageMagicks eingebauter SVG-Renderer hat den
Rahmen-Stroke verschluckt).
Bewusst ausgeklammert (spätere Schritte): Review-Ansicht, Menu-Bar-
Betrieb, Signierung/Notarisierung/Sparkle, Overwrite-Rückfrage-Dialog.
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).
Schritt 2 der Umsetzungsreihenfolge.
VideoInspector liest Dimension (orientierungskorrigiert), Codec,
Framerate, Dauer und Audiospur-Vorhandensein über die moderne
async AVFoundation-API.
CropEngine läuft über AVAssetReader/AVAssetWriter statt
AVAssetExportSession, weil das die volle Kontrolle über Zielbitrate
und Profil gibt. Zielformat ist fest MP4/H.264/AAC, unabhängig vom
Quellcodec — das Deliverable landet ausschließlich bei Meta Ads.
Bitrate wird aus Auflösung × Framerate abgeleitet (Faustregel,
überschreibbar über Options), Audio läuft nicht mehr per Passthrough,
sondern wird nach AAC-LC transkodiert. Crop bleibt volle Breite,
vertikal zentriert, Höhe auf gerade Zahl gerundet.
Tests synthetisieren ihre Clips zur Laufzeit per AVAssetWriter
(TestVideoFactory) statt Binärdateien einzuchecken.
Schritt 1 der Umsetzungsreihenfolge. Anker ist das Format-Segment
(9x16/4x5), nicht die Position — dadurch bleiben Projektnamen und
Sprachkürzel mit eigenem Bindestrich intakt (z.B. "Somos-Pendant" oder
"EN-US"). Sucht das rechteste Vorkommen, verlangt mindestens ein
Segment davor und danach, erkennt Finder-Duplikate und meldet
Ablehnungen/Skips unterscheidbar statt still zu scheitern.
14 Tests inklusive der Bindestrich- und Groß-/Kleinschreibungs-Kantenfälle.