From 9ba821ecb29046db99e2ec5a2eb224604968aa90 Mon Sep 17 00:00:00 2001 From: Samuel Zielke Date: Sun, 11 Oct 2026 23:10:55 +0200 Subject: [PATCH] Version 1.0.0 (Build 2), README nachgezogen Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01ShKCZzkdZhym6mHuPqXQAT --- README.md | 32 ++++++++++++++++++++++---------- project.yml | 4 ++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ac01ed9..330df36 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,15 @@ Somos-Pendant-9x16-v3-DE.mp4 └──── Projekt ────┘ └Fmt┘└Ver┘└Spr┘ ``` -Für die Zielversion wird ausschließlich das Format-Segment ersetzt: `9x16` → `4x5`. Alle anderen Segmente bleiben zeichengleich erhalten. +Für die Zielversion wird ausschließlich das Format-Segment ersetzt: `9x16` → `4x5`. Alle anderen Zeichen bleiben gleich erhalten. + +**Schreibweisen:** Das Format darf groß oder klein (`9x16`, `9X16`, `9×16`) und mit `-`, `_` oder Leerzeichen abgetrennt sein; die Trenner bleiben in der Zielfassung erhalten (`Kampagne_9X16_v2` → `Kampagne_4x5_v2`). Ein Rest hinter dem Format ist nicht nötig. + +**Kein Format im Namen:** Die App zeigt das schon beim Reinziehen und bietet „4x5 anhängen“ an. Dann wird der ganze Dateistamm zum Projekt, und `4x5` wird mit dem Trenner angehängt, den der Name schon benutzt (`Sommerfest Teaser.mov` → `Sommerfest Teaser/Sommerfest Teaser 4x5.mp4`). Ohne diese Wahl wird die Datei übersprungen. **Abbruchbedingungen** — die App verarbeitet nicht und meldet es sichtbar: -- Dateiname entspricht nicht dem Schema (weniger als vier Segmente) -- Format-Segment ist nicht `9x16` +- Kein `9x16` mit Projektnamen davor im Namen (Ausweg: „4x5 anhängen“, s. o.) - Quelldatei hat kein 9:16-Seitenverhältnis - Zieldatei existiert bereits (überschreiben nur nach Rückfrage) @@ -57,15 +60,17 @@ Der 4:5-Ausschnitt behält die **volle Breite** und beschneidet oben und unten: ``` Breite bleibt unverändert Höhe = Breite × 5 ÷ 4 (auf gerade Zahl gerundet) -Anker vertikal zentriert (Offset später konfigurierbar) +Anker vertikal zentriert (pro Datei verschiebbar, s. u.) ``` +**Ausschnitt verschieben:** In der Review-Ansicht lässt sich der 4:5-Rahmen mit der Maus nach oben oder unten ziehen. Für Clips mit Szenenwechsel gibt es **Positionsmarken**: an die Stelle spulen, *Marke setzen* (Taste `M`), Rahmen ziehen. Jede Marke gilt ab ihrem Frame bis zur nächsten, als harter Schnitt ohne Fahrt dazwischen. Tasten: Leertaste spielt ab, `←`/`→` springen um ein Frame. Der Plan gilt pro Datei und wird mit *Übernehmen* gesetzt; die Dateiliste zeigt angepasste Ausschnitte in Gold. + | Quelle | Ziel | |---|---| | 1080 × 1920 | 1080 × 1350 | | 2160 × 3840 | 2160 × 2700 | -**Codec-Verhalten:** Der Quell-Codec wird erkannt und passend ausgespielt — ProRes bleibt ProRes, H.264 bleibt H.264 mit vergleichbarer Bitrate. Die Audiospur läuft per Passthrough durch, ohne Neukodierung. Framerate, Farbraum und Dauer bleiben unangetastet. +**Codec-Verhalten:** Die 4:5-Fassung ist immer MP4 mit H.264 (High Profile) und AAC 128 kbit/s, das Zielformat für Feed und Meta Ads, egal ob ProRes, H.264 oder HEVC reinkommt. Die Bitrate richtet sich nach Auflösung und Framerate. Framerate und Dauer bleiben unangetastet. ## Funktionsumfang @@ -82,11 +87,11 @@ Anker vertikal zentriert (Offset später konfigurierbar) - [x] Review-Ansicht: 9:16-Master mit eingeblendetem 4:5-Rahmen zur Framing-Kontrolle, scrubbar - [ ] Menu-Bar-Betrieb mit Drop-Target -- [ ] Vertikaler Crop-Offset pro Datei justierbar -- [ ] In-App-Updates über Sparkle +- [x] Vertikaler Crop-Offset pro Datei justierbar, mit Positionsmarken für Szenenwechsel +- [x] In-App-Updates über Sparkle (automatisch plus „Nach Updates suchen …“ im App-Menü) - [ ] Batch-Verlauf der letzten Durchläufe - [ ] Hilfe-Bereich: klickbare Kurzanleitung zur Bedienung der App -- [ ] Rechtlich erforderliche Angaben (Impressum o.ä.) einbinden — Absicherung, wo genau (in-App, Download-Seite) noch offen +- [x] Rechtliche Angaben: Website verlinkt Impressum & Datenschutz von zielke.studio (wie Patchcord) ## Tech-Stack @@ -112,6 +117,7 @@ Anker vertikal zentriert (Offset später konfigurierbar) DropTwoCore Framework, komplett UI-frei ├── FileNameParser zerlegt und baut Dateinamen ├── VideoInspector liest Dimension, Codec, Framerate, Dauer +├── CropPlan Ausschnitt-Position(en) über die Laufzeit ├── CropEngine AVAsset → VideoComposition → Export └── JobQueue async/await, 1–2 parallele Exports @@ -198,7 +204,14 @@ DMG und `appcast.xml` landen anschließend auf dem eigenen Server. Der Code lieg Die Seite unter [droptwo.zielke.studio](https://droptwo.zielke.studio) liegt in `site/` und wird nicht von `publish-release.sh` hochgeladen. Die Versionsnummer liest sie selbst aus `appcast.xml`, nach einem Release muss sie also nicht angefasst werden. Nach Änderungen an der Seite: ```bash -rsync -a --chmod=F644 site/index.html site/favicon.svg samuelzielke@10.0.5.223:/var/www/updates/droptwo/ +rsync -a --chmod=D755,F644 site/index.html site/favicon.svg site/fonts site/og samuelzielke@10.0.5.223:/var/www/updates/droptwo/ +``` + +Schriften liegen selbst gehostet in `site/fonts/` (keine Anfragen an Google). Das Vorschaubild für geteilte Links `site/og/og-de.png` entsteht aus `og-de.html`: + +```bash +"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --hide-scrollbars \ + --window-size=1200,630 --screenshot="$PWD/site/og/og-de.png" "file://$PWD/site/og/og-de.html" ``` Die Übersicht aller Apps und das Statistik-Dashboard liegen im Repo `zielke-apps`. @@ -222,7 +235,6 @@ Schritt 3 entscheidet über das Projekt. Liefert AVFoundation nicht die nötige - Verhalten bei bereits vorhandenem Zielordner: ergänzen oder warnen - Ob das 9:16-Original kopiert oder verschoben wird - Bitrate-Strategie bei H.264: Quellbitrate übernehmen oder fester Qualitätsfaktor -- Vertikaler Offset — global, pro Projekt oder pro Datei ## Gestaltung diff --git a/project.yml b/project.yml index 440728d..338b4b7 100644 --- a/project.yml +++ b/project.yml @@ -9,8 +9,8 @@ options: settings: base: SWIFT_VERSION: "5.9" - MARKETING_VERSION: "0.1.0" - CURRENT_PROJECT_VERSION: "1" + MARKETING_VERSION: "1.0.0" + CURRENT_PROJECT_VERSION: "2" configs: Debug: # Ad-hoc-Signatur: laeuft lokal auf dem eigenen Rechner, braucht keine Team-ID.