# xxyxssw/aivideosummaryformac architecture

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

- Interactive diagram: https://gitdiagram.com/xxyxssw/aivideosummaryformac
- Repository: https://github.com/xxyxssw/aivideosummaryformac

## Overview

VideoSummaryAI is a native macOS app that turns pasted Douyin or Bilibili links into locally transcribed video history, then generates three optional AI text treatments on demand. The primary workflow is coordinated by Pipeline; AppState owns history and separate summary-generation requests. The README documents the broader UI and provider capabilities, while sampled excerpts confirm the core orchestration and state behavior; some view and extractor internals were not sampled.

Main entry points: [`Sources/VideoSummaryAI/Services/Pipeline.swift`](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/Pipeline.swift) (Pipeline coordinator), [`Sources/VideoSummaryAI/Models/AppState.swift`](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppState.swift) (App state), [`Sources/VideoSummaryAI/Models/AppSettings.swift`](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppSettings.swift) (User preferences), [`Sources/VideoSummaryAI/Services/AISummarizer.swift`](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/AISummarizer.swift) (AI summarizer)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["App interface"]
  node_app["App entry"]
  node_home["Link input<br/>[HomeView.swift]"]
  node_historyui["History navigation"]
  node_detail["Video detail<br/>[DetailView.swift]"]
  node_summaryui["Summary sections"]
  node_settingsui["Settings<br/>[SettingsView.swift]"]
end

subgraph group_ingestion["Media ingestion"]
  node_pipeline["Pipeline coordinator<br/>[Pipeline.swift]"]
  node_urlparser["Link and ID parsing<br/>[URLParser.swift]"]
  node_douyin["Douyin media capture"]
  node_bilibili["Bilibili resolver"]
  node_downloader["Media download"]
  node_ffmpeg["Audio conversion<br/>[FFmpeg.swift]"]
end

subgraph group_content["Transcript and summaries"]
  node_transcriber["On-device transcription"]
  node_summarizer["AI summarizer<br/>[AISummarizer.swift]"]
end

subgraph group_state["State and preferences"]
  node_state["App state<br/>[AppState.swift]"]
  node_settings["User preferences<br/>[AppSettings.swift]"]
  node_history[("History store<br/>[AppState.swift]")]
end

node_user(("User"))
node_speech{{"macOS Speech"}}
node_provider{{"OpenAI-compatible API"}}
node_douyinweb{{"Douyin web media"}}
node_bilibiliapi{{"Bilibili media API"}}

node_user -->|"pastes link"| node_home
node_app -->|"presents"| node_home
node_home -->|"submits input"| node_state
node_state -->|"starts run"| node_pipeline
node_pipeline -->|"parses link"| node_urlparser
node_pipeline -->|"captures media"| node_douyin
node_pipeline -->|"resolves media"| node_bilibili
node_douyin -->|"loads and captures"| node_douyinweb
node_bilibili -->|"requests media"| node_bilibiliapi
node_pipeline -->|"downloads media"| node_downloader
node_pipeline -->|"converts audio"| node_ffmpeg
node_pipeline -->|"transcribes audio"| node_transcriber
node_transcriber -->|"uses local models"| node_speech
node_pipeline -->|"updates progress"| node_state
node_pipeline -->|"adds transcript"| node_history
node_state -->|"loads and saves"| node_history
node_historyui -->|"selects history"| node_state
node_detail -->|"reads selected item"| node_state
node_detail -->|"shows sections"| node_summaryui
node_summaryui -->|"requests generation"| node_state
node_state -->|"generates on demand"| node_summarizer
node_summarizer -->|"sends prompt"| node_provider
node_state -->|"stores generated text"| node_history
node_settingsui -->|"edits preferences"| node_settings
node_pipeline -->|"reads transcription settings"| node_settings
node_state -->|"reads summary settings"| node_settings
node_summarizer -->|"uses prompt and language"| node_settings

click node_app "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/VideoSummaryAIApp.swift"
click node_home "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/HomeView.swift"
click node_historyui "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/HistorySidebar.swift"
click node_detail "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/DetailView.swift"
click node_summaryui "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/SummarySectionView.swift"
click node_settingsui "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/SettingsView.swift"
click node_state "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppState.swift"
click node_settings "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppSettings.swift"
click node_history "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppState.swift"
click node_pipeline "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/Pipeline.swift"
click node_urlparser "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/URLParser.swift"
click node_douyin "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/DouyinExtractor.swift"
click node_bilibili "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/BilibiliExtractor.swift"
click node_downloader "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/MediaDownloader.swift"
click node_ffmpeg "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/FFmpeg.swift"
click node_transcriber "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/TranscriberService.swift"
click node_summarizer "https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/AISummarizer.swift"

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_app,node_home,node_historyui,node_detail,node_summaryui,node_settingsui,node_user toneBlue
class node_pipeline,node_urlparser,node_douyin,node_bilibili,node_downloader,node_ffmpeg toneAmber
class node_transcriber,node_summarizer,node_provider,node_bilibiliapi toneMint
class node_state,node_settings,node_history toneRose
class node_speech,node_douyinweb toneIndigo
```

## Components

### App interface

- [App entry](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/VideoSummaryAIApp.swift): `Sources/VideoSummaryAI/VideoSummaryAIApp.swift`
- [Link input](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/HomeView.swift): `Sources/VideoSummaryAI/Views/HomeView.swift`
- [History navigation](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/HistorySidebar.swift): `Sources/VideoSummaryAI/Views/HistorySidebar.swift`
- [Video detail](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/DetailView.swift): `Sources/VideoSummaryAI/Views/DetailView.swift`
- [Summary sections](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/SummarySectionView.swift): `Sources/VideoSummaryAI/Views/SummarySectionView.swift`
- [Settings](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Views/SettingsView.swift): `Sources/VideoSummaryAI/Views/SettingsView.swift`

### Media ingestion

- [Pipeline coordinator](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/Pipeline.swift): `Sources/VideoSummaryAI/Services/Pipeline.swift`
- [Link and ID parsing](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/URLParser.swift): `Sources/VideoSummaryAI/Services/URLParser.swift`
- [Douyin media capture](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/DouyinExtractor.swift): `Sources/VideoSummaryAI/Services/DouyinExtractor.swift`
- [Bilibili resolver](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/BilibiliExtractor.swift): `Sources/VideoSummaryAI/Services/BilibiliExtractor.swift`
- [Media download](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/MediaDownloader.swift): `Sources/VideoSummaryAI/Services/MediaDownloader.swift`
- [Audio conversion](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/FFmpeg.swift): `Sources/VideoSummaryAI/Services/FFmpeg.swift`

### Transcript and summaries

- [On-device transcription](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/TranscriberService.swift): `Sources/VideoSummaryAI/Services/TranscriberService.swift`
- [AI summarizer](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Services/AISummarizer.swift): `Sources/VideoSummaryAI/Services/AISummarizer.swift`

### State and preferences

- [App state](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppState.swift): `Sources/VideoSummaryAI/Models/AppState.swift`
- [User preferences](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppSettings.swift): `Sources/VideoSummaryAI/Models/AppSettings.swift`
- [History store](https://github.com/xxyxssw/aivideosummaryformac/blob/main/Sources/VideoSummaryAI/Models/AppState.swift): `Sources/VideoSummaryAI/Models/AppState.swift`

### Other components

- **User**
- **macOS Speech**
- **OpenAI-compatible API**
- **Douyin web media**
- **Bilibili media API**

## Connections

- User → Link input: pastes link
- App entry → Link input: presents
- Link input → App state: submits input
- App state → Pipeline coordinator: starts run
- Pipeline coordinator → Link and ID parsing: parses link
- Pipeline coordinator → Douyin media capture: captures media
- Pipeline coordinator → Bilibili resolver: resolves media
- Douyin media capture → Douyin web media: loads and captures
- Bilibili resolver → Bilibili media API: requests media
- Pipeline coordinator → Media download: downloads media
- Pipeline coordinator → Audio conversion: converts audio
- Pipeline coordinator → On-device transcription: transcribes audio
- On-device transcription → macOS Speech: uses local models
- Pipeline coordinator → App state: updates progress
- Pipeline coordinator → History store: adds transcript
- App state → History store: loads and saves
- History navigation → App state: selects history
- Video detail → App state: reads selected item
- Video detail → Summary sections: shows sections
- Summary sections → App state: requests generation
- App state → AI summarizer: generates on demand
- AI summarizer → OpenAI-compatible API: sends prompt
- App state → History store: stores generated text
- Settings → User preferences: edits preferences
- Pipeline coordinator → User preferences: reads transcription settings
- App state → User preferences: reads summary settings
- AI summarizer → User preferences: uses prompt and language
