Architektur
Überblick
Das Projekt ist eine portable WPF-Anwendung zur halbautomatischen Aufbereitung episodischer Videoquellen für mkvmerge. Die Fachlogik ist bewusst in Services und Modulklassen ausgelagert, damit UI, Dateisystemlogik und Mux-Planung getrennt wartbar bleiben.
Hauptbausteine
Composition- enthält den Composition Root und die DI-Registrierungsmodule
- trennt Stores, Tooling, Metadaten, Mux-Kern, Workflow und UI-Komposition bewusst voneinander
Modules/SeriesEpisodeMux- erkennt Episodenquellen, erzeugt Mux-Pläne und kapselt die mkvmerge-spezifische Argumentlogik
Services- enthält Archivintegration, Pfadbildung, Dateicopy/Cleanup, Logpersistenz und Settings-Zugriffe
- bündelt außerdem gemeinsame technische Heuristiken wie die Text-/Mojibake-Normalisierung, damit Parser und Probe-Service nicht auseinanderlaufen
Services/Metadata- kapselt TVDB-Zugriff, Caching und lokale Serien-Zuordnungen
- legt identische gleichzeitige TVDB-Suchen und Episoden-Loads pro Cache-Schlüssel zusammen, damit Batch-Scans keine vermeidbaren Doppelanfragen erzeugen
ViewModels/Modules- stellt Einzel- und Batch-Workflow für die GUI bereit
Composition und DI
Der App-Start läuft bewusst über einen klaren Composition Root statt über verteilte Ad-hoc-Auflösungen:
AppCompositionRooterstellt eineServiceCollection.AppCompositionModuleCatalogregistriert die fachlich getrennten Module.- Der gebaute
ServiceProviderwird validiert und nur im Startpfad verwendet. AppCompositionhält den Root-Provider über die App-Laufzeit am Leben und entsorgt ihn beim Shutdown wieder.
Wichtig dabei:
- Die Fachlogik bekommt ihre Abhängigkeiten weiterhin per Konstruktor.
IServiceProviderwird nicht an ViewModels oder Services weitergereicht.- Kleinere Service-Bundles in
Services/AppModuleServices.csbegrenzen, welche Services Einzelmodus, Batch und Shell tatsächlich sehen.
Datenfluss
- Eine Quelle wird ausgewählt oder ein Ordner wird gescannt.
SeriesEpisodeMuxPlannererkennt zugehörige Video-, AD-, Untertitel- und TXT-Dateien.- Für Batch-Ordner kann dafür einmalig ein
DirectoryDetectionContextvorbereitet und für mehrere Einzelscans wiederverwendet werden. - Dieser Kontext dedupliziert teure Kandidaten-Probes pro Datei auch unter parallelen Batch-Scans, damit identische Quellen nicht mehrfach gleichzeitig analysiert werden.
- TXT-Begleitdateien werden dabei projektweit über denselben Reader und dieselben Encoding-Heuristiken ausgewertet, damit Erkennung, Review und spätere Planerstellung nicht auseinanderlaufen.
- Für frische Quellen liest die Planerstellung normale Audiospuren aus den vollständigen Container-Metadaten, damit Mehrfach-Audio erhalten bleibt und offensichtliche AD-Spuren nicht versehentlich als normale Tonspuren eingeplant werden.
- Für Batch-Ordner kann dafür einmalig ein
EpisodeMetadataLookupServicekann die lokale Erkennung mit TVDB-Daten anreichern.- Die fachlichen Matching-Heuristiken sind bewusst von Caching und TVDB-I/O getrennt, damit Bewertungsregeln unabhängig wartbar bleiben.
SeriesArchiveServiceentscheidet, ob direkt neu gemuxt wird, ob eine bestehende Archivdatei wiederverwendet wird oder ob eine Arbeitskopie nötig ist.- Die Archiventscheidung ist dafür in vorbereitende Analyse und eigentliche Integrationsentscheidung getrennt.
- Die Umsetzung ist zusätzlich entlang der Verantwortungen
Preparation,AttachmentReuseundUsageReportingauf mehrere Partial-Dateien verteilt, damit Archivvergleich, TXT-heuristische Attachment-Zuordnung und GUI-/Diff-Aufbereitung unabhängig angepasst werden können.
SeriesEpisodeMuxPlanbeschreibt den vollständigen mkvmerge-Aufruf.MuxWorkflowCoordinatorführt Arbeitskopie, Mux und temporäres Aufräumen aus.BatchRunLogServiceschreibt bei Batch-Läufen Log- und Reportdateien in.\Logs.- Der persistierte Log sammelt gezielt den aktuellen Batch-Lauf, damit Planung, Arbeitskopien und Mux-Ausführung zusammen diagnostizierbar bleiben.
Warum DocFX
Für C# ist der direkte Gegenpart zum typischen Doxygen-Stil nicht ein anderes Kommentarformat, sondern der Standard aus XML-Dokumentationskommentaren (/// <summary>, /// <param>, /// <returns>). DocFX baut darauf auf und erzeugt daraus API-Seiten plus eine statische Doku-Site.