Initial commit

This commit is contained in:
2026-06-07 00:35:25 +02:00
parent ea13609f7c
commit b8eca61e20
24 changed files with 4991 additions and 0 deletions

163
README.md Normal file
View File

@@ -0,0 +1,163 @@
<div align="center">
<h1>OmniMTP</h1>
<p>Ein schneller (<strong>34× schneller als direkter microSD-Zugriff</strong>), nativer macOS-MTP-Client für die Nintendo Switch.<br>
Übertrage NSP-, XCI- und NRO-Dateien per USB-C, ohne die microSD-Karte auszubauen.</p>
[![macOS](https://img.shields.io/badge/macOS-12%2B-blue?style=flat-square&logo=apple&logoColor=white)](https://www.apple.com/macos/)
[![License](https://img.shields.io/badge/license-MIT-brightgreen?style=flat-square)](LICENSE)
[![C++20](https://img.shields.io/badge/C%2B%2B-20-orange?style=flat-square&logo=cplusplus&logoColor=white)]()
[![Universal](https://img.shields.io/badge/arch-Apple%20Silicon%20%2B%20Intel-lightgrey?style=flat-square)]()
<br>
<img src="OmniMTP.png" width="820" alt="OmniMTP Screenshot" />
</div>
---
> **Herkunft:** OmniMTP ist eine Weiterentwicklung von [heziMTP](https://github.com/helzeiah/heziMTP), dem ursprünglichen Projekt-Repository.
## Funktionen
- **Direkter USB-C-Transfer** — kommuniziert mit DBI oder Sphaira im MTP-Modus über USB, ohne SD-Kartenwechsel
- **Schnell** — USB-3.0-Unterstützung mit adaptiver Chunk-Größe; realistisch 60150+ MB/s, abhängig von Switch und Kabel
- **Zwei-Panel-Dateibrowser** — Mac-Dateisystem links, Switch rechts; Dateien per Drag & Drop zwischen beiden Seiten verschieben
- **Mehrfachübertragung** — mehrere Dateien mit Cmd+Klick oder Shift+Klick auswählen und gemeinsam ziehen
- **Große Dateien** — Dateien >4 GB werden korrekt unterstützt
- **Automatische Geräteerkennung** — einstecken und loslegen, kein manuelles Scannen nötig
- **Modernes macOS-UI** — natives Dark Mode, SF Pro, macOS-12+-Fensterdesign
- **Keine Abhängigkeiten** — libusb ist statisch eingebunden; nichts extra installieren
## Voraussetzungen
- **Mac:** macOS 12 Monterey oder neuer (Universal Binary — Apple Silicon + Intel)
- **Switch:** Custom Firmware mit [DBI](https://github.com/rashevskyv/dbi) oder [Sphaira](https://github.com/ITotalJustice/sphaira)
- **Kabel:** ein Kabel mit Datenübertragung (kein reines Ladekabel)
## Erste Schritte
### 1. Switch vorbereiten
In DBI: **Tools → MTP Responder**
In Sphaira: **Tools → MTP**
USB-C-Kabel anschließen und den Bildschirm offen lassen
### 2. Aus dem Quellcode bauen
```bash
git clone https://github.com/helzeiah/OmniMTP.git
cd OmniMTP
./build.sh # Release-Build
./build.sh run # bauen + starten
```
Oder manuell:
```bash
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(sysctl -n hw.logicalcpu)
open build/OmniMTP.app
```
**Build-Abhängigkeiten** (werden von CMake automatisch geladen):
- libusb 1.0.27
- keine weiteren externen Abhängigkeiten
### 3. Dateien übertragen
- **Links** den Mac durchsuchen, **rechts** die Switch
- **Ziehen:** links → rechts = hochladen, rechts → links = herunterladen
- **Doppelklick** auf eine lokale Datei lädt sie bei aktiver Verbindung direkt hoch
- **Rechtsklick** für Kontextmenü (Auf Switch hochladen / Auf Mac laden / Löschen)
- **Add Files** öffnet einen nativen Datei-Dialog für Mehrfach-Uploads
## Wie schnell ist es?
| Verbindung | Typische Geschwindigkeit |
| ---------------------------------------- | ------------------------ |
| USB 2.0 | 2545 MB/s |
| USB 3.0 (Switch OLED / direktes USB-C 3.x) | 60150+ MB/s |
Die Geschwindigkeit hängt von der microSD-Schreibgeschwindigkeit (Uploads) und der USB-Verbindung ab. Eine schnelle UHS-I-Karte plus USB-3.0-Kabel bringt das meiste raus.
## Hinweis zur Installation (macOS Gatekeeper)
Da OmniMTP nicht mit einem Apple-Developer-Zertifikat notarisiert ist, zeigt macOS beim ersten Start eine Warnung **„Unbekannter Entwickler“**. Das ist bei Open-Source-Apps außerhalb des App Store normal.
**So öffnest du die App:**
**Option A — Rechtsklick (am einfachsten)**
Rechtsklick (oder Control-Klick) auf `OmniMTP.app`**Öffnen** → im Dialog erneut **Öffnen**. Das musst du nur einmal machen.
**Option B — Terminal**
```bash
xattr -r -d com.apple.quarantine /Applications/OmniMTP.app
# oder wo auch immer du die App abgelegt hast:
xattr -r -d com.apple.quarantine ~/Downloads/OmniMTP.app
```
**Option C — Systemeinstellungen**
Systemeinstellungen → Datenschutz & Sicherheit → Bereich Sicherheit → **Trotzdem öffnen**.
---
## Fehlerbehebung
**Die App erkennt meine Switch nicht**
- Prüfe, ob DBI oder Sphaira im MTP-Modus läuft (nicht nur im Home-Menü)
- Probiere ein anderes USB-C-Kabel — viele Ladekabel haben keine Datenleitungen
- Klicke in der App auf **Scan**
**Fehler „Operation not supported“**
- DBI/Sphaira auf eine aktuelle Version aktualisieren
- Sphaira: sicherstellen, dass du im Menü **MTP Install** bist
## Geplante Erweiterungen
- **Breitere MTP-Geräteunterstützung** — die MTP/USB-Schicht ist geräteunabhängig. Android-Handys, Kameras und andere MTP-Geräte sollten mit kleinen Anpassungen an Erkennung und Protokoll funktionieren
- Ordner-Upload (rekursiv)
- Unterbrochene Übertragungen fortsetzen
- Warteschlange umsortieren
- Dateien auf dem Gerät umbenennen
## Bauen
```
./build.sh # Release (Standard)
./build.sh debug # Debug-Build
./build.sh run # Release + starten
./build.sh clean # Build-Verzeichnisse löschen
```
Das Build-System lädt libusb aus dem Quellcode und kompiliert es statisch — kein Homebrew oder Systempakete nötig.
## Architektur
```
src/
├── main.mm Einstiegspunkt (NSApp + WKWebView)
├── ui/
│ ├── App.hpp/.mm Backend: Geräteüberwachung, lokale/remote Dateien, Transfers
│ ├── WebUI.hpp/.mm Bridge: WKWebView-Setup + JS↔C++ Message Handler
│ └── webroot/ Frontend: HTML/CSS/JS (ohne Build-Schritt, ohne Frameworks)
├── mtp/
│ ├── MTPProtocol.hpp MTP-Konstanten, Container-Format, Datenstrukturen
│ ├── MTPSession.* USB/libusb-Transport, Chunked Transfers
│ └── MTPOperations.* High-Level-MTP-Operationen (GetObject, SendObject, …)
└── transfer/
└── TransferEngine.* Hintergrund-Warteschlange mit Fortschrittsanzeige
```
Die UI ist eine WKWebView-basierte HTML/CSS/JS-App, die über native Message Passing mit einem C++20-MTP-Backend spricht. Kein Electron, kein Node, keine externe Runtime — nur AppKit + WebKit + libusb.
## Lizenz
MIT — siehe [LICENSE](LICENSE).