# karaagexc/cinepresence architecture

> Architecture diagram of the GitHub repository karaagexc/cinepresence, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/karaagexc/cinepresence
- Repository: https://github.com/karaagexc/cinepresence

## Overview

CinePresence is a Windows tray application that turns supported playback sessions into Discord Rich Presence. Its main workflow reads Windows or VLC playback, selects and parses a source, resolves a title against TMDB (using cached matches and saved corrections), builds timed activity, and publishes or clears it through Discord. The UI supports source controls, settings, and manual match correction. Edges are limited to relationships visible in excerpts, the SOURCE INDEX, or README; unsampled capability links are omitted rather than inferred.

Main entry points: [`src/CinePresence.App/Services/AppController.cs`](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/AppController.cs) (App controller), [`src/CinePresence.Core/PresenceEngine.cs`](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/PresenceEngine.cs) (Presence engine), [`src/CinePresence.App/App.xaml.cs`](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/App.xaml.cs) (Tray app), [`src/CinePresence.App/MainWindow.xaml.cs`](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/MainWindow.xaml.cs) (Main window)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and controls"]
  node_appstart["Tray app<br/>[App.xaml.cs]"]
  node_mainui["Main window<br/>[MainWindow.xaml.cs]"]
  node_matchui["Match correction<br/>[MatchWindow.cs]"]
  node_controller["App controller<br/>[AppController.cs]"]
  node_branding["TMDB artwork<br/>[TmdbBranding.cs]"]
end

subgraph group_playback["Playback sources"]
  node_windows["Windows sessions"]
  node_vlc["VLC HTTP adapter<br/>[VlcAdapter.cs]"]
  node_selector["Source selection<br/>[SourceSelector.cs]"]
end

subgraph group_matching["Title matching"]
  node_parser["Title parser<br/>[TitleParser.cs]"]
  node_resolver["TMDB resolver<br/>[TmdbClient.cs]"]
end

subgraph group_presence["Presence publishing"]
  node_engine["Presence engine<br/>[PresenceEngine.cs]"]
  node_builder["Payload builder<br/>[PresenceBuilder.cs]"]
  node_publisher["Discord publisher"]
end

subgraph group_local["Local state"]
  node_cache[("Match cache<br/>[MediaCache.cs]")]
  node_settings[("Settings store<br/>[SettingsStore.cs]")]
end

node_user(("User"))
node_vlcplayer(("VLC player"))
node_tmdb["TMDB API"]
node_discord["Discord desktop"]

node_user -->|"launches"| node_appstart
node_appstart -->|"creates"| node_controller
node_appstart -->|"diagnoses"| node_windows
node_appstart -->|"diagnoses"| node_publisher
node_user -->|"controls"| node_mainui
node_mainui -->|"configures"| node_controller
node_mainui -->|"opens"| node_matchui
node_matchui -->|"searches and corrects"| node_controller
node_controller -->|"loads and saves"| node_settings
node_controller -->|"polls"| node_windows
node_controller -->|"polls"| node_vlc
node_vlc -->|"reads status"| node_vlcplayer
node_controller -->|"updates snapshots"| node_engine
node_engine -->|"selects source"| node_selector
node_engine -->|"parses title"| node_parser
node_engine -->|"resolves title"| node_resolver
node_resolver -->|"reads and writes"| node_cache
node_resolver -->|"searches and fetches details"| node_tmdb
node_engine -->|"builds payload"| node_builder
node_engine -->|"publishes or clears"| node_publisher
node_publisher -->|"sets activity"| node_discord
node_mainui -->|"uses artwork"| node_branding
node_controller -->|"constructs resolver"| node_resolver

click node_appstart "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/App.xaml.cs"
click node_mainui "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/MainWindow.xaml.cs"
click node_matchui "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/MatchWindow.cs"
click node_controller "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/AppController.cs"
click node_windows "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/WindowsMediaAdapter.cs"
click node_vlc "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/VlcAdapter.cs"
click node_selector "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/SourceSelector.cs"
click node_parser "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/TitleParser.cs"
click node_engine "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/PresenceEngine.cs"
click node_resolver "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/TmdbClient.cs"
click node_cache "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/MediaCache.cs"
click node_builder "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/PresenceBuilder.cs"
click node_publisher "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/DiscordPublisher.cs"
click node_settings "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/SettingsStore.cs"
click node_branding "https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/TmdbBranding.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_appstart,node_mainui,node_matchui,node_controller,node_branding,node_user toneBlue
class node_windows,node_vlc,node_selector toneAmber
class node_parser,node_resolver,node_tmdb toneMint
class node_engine,node_builder,node_publisher toneRose
class node_cache,node_settings,node_vlcplayer,node_discord toneIndigo
```

## Components

### App and controls

- [Tray app](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/App.xaml.cs): `src/CinePresence.App/App.xaml.cs`
- [Main window](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/MainWindow.xaml.cs): `src/CinePresence.App/MainWindow.xaml.cs`
- [Match correction](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/MatchWindow.cs): `src/CinePresence.App/MatchWindow.cs`
- [App controller](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/AppController.cs): `src/CinePresence.App/Services/AppController.cs`
- [TMDB artwork](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/TmdbBranding.cs): `src/CinePresence.App/Services/TmdbBranding.cs`

### Playback sources

- [Windows sessions](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/WindowsMediaAdapter.cs): `src/CinePresence.App/Services/WindowsMediaAdapter.cs`
- [VLC HTTP adapter](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/VlcAdapter.cs): `src/CinePresence.Core/VlcAdapter.cs`
- [Source selection](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/SourceSelector.cs): `src/CinePresence.Core/SourceSelector.cs`

### Title matching

- [Title parser](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/TitleParser.cs): `src/CinePresence.Core/TitleParser.cs`
- [TMDB resolver](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/TmdbClient.cs): `src/CinePresence.Core/TmdbClient.cs`

### Presence publishing

- [Presence engine](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/PresenceEngine.cs): `src/CinePresence.Core/PresenceEngine.cs`
- [Payload builder](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/PresenceBuilder.cs): `src/CinePresence.Core/PresenceBuilder.cs`
- [Discord publisher](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/DiscordPublisher.cs): `src/CinePresence.App/Services/DiscordPublisher.cs`

### Local state

- [Match cache](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.Core/MediaCache.cs): `src/CinePresence.Core/MediaCache.cs`
- [Settings store](https://github.com/karaagexc/cinepresence/blob/main/src/CinePresence.App/Services/SettingsStore.cs): `src/CinePresence.App/Services/SettingsStore.cs`

### Other components

- **User**
- **VLC player**
- **TMDB API**
- **Discord desktop**

## Connections

- User → Tray app: launches (evidence: `src/CinePresence.App/App.xaml.cs`)
- Tray app → App controller: creates (evidence: `src/CinePresence.App/App.xaml.cs`)
- Tray app → Windows sessions: diagnoses (evidence: `src/CinePresence.App/App.xaml.cs`)
- Tray app → Discord publisher: diagnoses (evidence: `src/CinePresence.App/App.xaml.cs`)
- User → Main window: controls (evidence: `README.md`)
- Main window → App controller: configures (evidence: `src/CinePresence.App/MainWindow.xaml.cs`)
- Main window → Match correction: opens (evidence: `src/CinePresence.App/MainWindow.xaml.cs`)
- Match correction → App controller: searches and corrects (evidence: `src/CinePresence.App/MatchWindow.cs`)
- App controller → Settings store: loads and saves (evidence: `src/CinePresence.App/Services/AppController.cs`)
- App controller → Windows sessions: polls (evidence: `src/CinePresence.App/Services/AppController.cs`)
- App controller → VLC HTTP adapter: polls (evidence: `src/CinePresence.App/Services/AppController.cs`)
- VLC HTTP adapter → VLC player: reads status (evidence: `src/CinePresence.Core/VlcAdapter.cs`)
- App controller → Presence engine: updates snapshots (evidence: `src/CinePresence.App/Services/AppController.cs`)
- Presence engine → Source selection: selects source (evidence: `src/CinePresence.Core/PresenceEngine.cs`)
- Presence engine → Title parser: parses title (evidence: `src/CinePresence.Core/PresenceEngine.cs`)
- Presence engine → TMDB resolver: resolves title (evidence: `src/CinePresence.Core/PresenceEngine.cs`)
- TMDB resolver → Match cache: reads and writes (evidence: `src/CinePresence.Core/TmdbClient.cs`)
- TMDB resolver → TMDB API: searches and fetches details (evidence: `src/CinePresence.Core/TmdbClient.cs`)
- Presence engine → Payload builder: builds payload (evidence: `src/CinePresence.Core/PresenceEngine.cs`)
- Presence engine → Discord publisher: publishes or clears (evidence: `src/CinePresence.Core/PresenceEngine.cs`)
- Discord publisher → Discord desktop: sets activity (evidence: `src/CinePresence.App/Services/DiscordPublisher.cs`)
- Main window → TMDB artwork: uses artwork (evidence: `src/CinePresence.App/MainWindow.xaml.cs`)
- App controller → TMDB resolver: constructs resolver (evidence: `src/CinePresence.App/Services/AppController.cs`)
