OmniMTP

Ein schneller (3–4× schneller als direkter microSD-Zugriff), nativer macOS-MTP-Client für die Nintendo Switch.
Übertrage NSP-, XCI- und NRO-Dateien per USB-C, ohne die microSD-Karte auszubauen.

[![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)]()
OmniMTP Screenshot
--- > **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 60–150+ 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 | 25–45 MB/s | | USB 3.0 (Switch OLED / direktes USB-C 3.x) | 60–150+ 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).