# yuelioi/bdl architecture

> Architecture diagram of the GitHub repository yuelioi/bdl, 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/yuelioi/bdl
- Repository: https://github.com/yuelioi/bdl

## Overview

BDL is a local-first Bilibili media downloader for desktop and Android, with a separate CLI. The main user journey is to enter a source, inspect and select parsed media, create download tasks, then monitor or control transfers; completed media may be muxed and saved locally. The graph also preserves documented account-backed library browsing, settings, and Android platform services. Workflow stages follow the README and the sampled UI; unsampled backend wiring is represented only at subsystem boundaries, not as detailed helper calls.

Main entry points: [`crates/bdl-tauri/src/commands.rs`](https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/commands.rs) (Tauri commands), [`crates/bdl-tauri/src/queue_worker.rs`](https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/queue_worker.rs) (Queue worker), [`crates/bdl-cli/src/main.rs`](https://github.com/yuelioi/bdl/blob/main/crates/bdl-cli/src/main.rs) (CLI), [`apps/desktop/src/App.vue`](https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/App.vue) (Desktop app)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["User interfaces"]
  node_desktop["Desktop app<br/>[App.vue]"]
  node_parse_ui["Parse workspace"]
  node_transfer_ui["Transfer page<br/>[useTransferPage.ts]"]
  node_library_ui["Library pages<br/>[useLibraryPage.ts]"]
  node_cli["CLI<br/>[main.rs]"]
  node_bridge["Tauri API bridge<br/>[tauri.ts]"]
end

subgraph group_domain["Media workflow"]
  node_resolver["Source resolvers<br/>[mod.rs]"]
  node_planner["Download planner<br/>[planner.rs]"]
  node_fetcher["Media fetcher<br/>[fetcher.rs]"]
  node_muxer["Media muxer<br/>[muxer.rs]"]
end

subgraph group_runtime["Task runtime"]
  node_commands["Tauri commands<br/>[commands.rs]"]
  node_queue["Queue coordinator"]
  node_worker["Queue worker<br/>[queue_worker.rs]"]
  node_db[("Local database<br/>[storage.rs]")]
end

subgraph group_account["Account and configuration"]
  node_account_core["Account services<br/>[account.rs]"]
  node_library_store["Library state<br/>[library.ts]"]
  node_settings["Settings<br/>[settings.rs]"]
end

subgraph group_platform["Platform services"]
  node_android_execution["Android background execution"]
  node_mobile_storage["Android storage bridge<br/>[mobile_storage.rs]"]
  node_android_storage["Android storage plugin<br/>[StoragePlugin.kt]"]
end

node_user(("User"))
node_bilibili(("Bilibili"))
node_media_output["Local media files"]
node_ffmpeg["FFmpeg"]

node_user -->|"uses"| node_desktop
node_desktop -->|"opens"| node_parse_ui
node_desktop -->|"opens"| node_transfer_ui
node_desktop -->|"opens"| node_library_ui
node_parse_ui -->|"requests parsing"| node_bridge
node_bridge -->|"invokes commands"| node_commands
node_commands -->|"resolves sources"| node_resolver
node_resolver -->|"requests media data"| node_bilibili
node_commands -->|"plans tasks"| node_planner
node_planner -->|"creates tasks"| node_queue
node_transfer_ui -->|"controls transfers"| node_bridge
node_commands -->|"coordinates tasks"| node_queue
node_queue -->|"dispatches work"| node_worker
node_worker -->|"downloads resources"| node_fetcher
node_fetcher -->|"fetches media"| node_bilibili
node_worker -->|"merges streams"| node_muxer
node_muxer -.->|"runs processing"| node_ffmpeg
node_worker -->|"writes downloads"| node_media_output
node_queue -->|"persists task state"| node_db
node_commands -->|"reads and writes"| node_db
node_library_ui -->|"browses library"| node_library_store
node_library_store -->|"loads content"| node_bridge
node_commands -->|"manages login"| node_account_core
node_account_core -->|"authenticates"| node_bilibili
node_commands -->|"loads settings"| node_settings
node_cli -->|"resolves input"| node_resolver
node_cli -->|"plans downloads"| node_planner
node_cli -->|"downloads media"| node_fetcher
node_cli -->|"merges streams"| node_muxer
node_worker -.->|"uses background service"| node_android_execution
node_commands -.->|"requests export"| node_mobile_storage
node_mobile_storage -.->|"dispatches storage calls"| node_android_storage
node_android_storage -.->|"exports files"| node_media_output

click node_desktop "https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/App.vue"
click node_parse_ui "https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/pages/parse/useParseResultWorkspace.ts"
click node_transfer_ui "https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/pages/useTransferPage.ts"
click node_library_ui "https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/pages/useLibraryPage.ts"
click node_cli "https://github.com/yuelioi/bdl/blob/main/crates/bdl-cli/src/main.rs"
click node_bridge "https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/api/tauri.ts"
click node_commands "https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/commands.rs"
click node_resolver "https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/resolver/mod.rs"
click node_planner "https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/planner.rs"
click node_account_core "https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/account.rs"
click node_library_store "https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/stores/library.ts"
click node_settings "https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/settings.rs"
click node_queue "https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/queue_coordinator.rs"
click node_worker "https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/queue_worker.rs"
click node_fetcher "https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/fetcher.rs"
click node_muxer "https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/muxer.rs"
click node_db "https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/storage.rs"
click node_android_execution "https://github.com/yuelioi/bdl/blob/main/crates/bdl-mobile-execution/android/src/main/java/DownloadForegroundService.kt"
click node_mobile_storage "https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/mobile_storage.rs"
click node_android_storage "https://github.com/yuelioi/bdl/blob/main/crates/bdl-mobile-storage/android/src/main/java/StoragePlugin.kt"

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_desktop,node_parse_ui,node_transfer_ui,node_library_ui,node_cli,node_bridge,node_user toneBlue
class node_resolver,node_planner,node_fetcher,node_muxer toneAmber
class node_commands,node_queue,node_worker,node_db toneMint
class node_account_core,node_library_store,node_settings toneRose
class node_android_execution,node_mobile_storage,node_android_storage,node_bilibili,node_media_output,node_ffmpeg toneIndigo
```

## Components

### User interfaces

- [Desktop app](https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/App.vue): `apps/desktop/src/App.vue`
- [Parse workspace](https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/pages/parse/useParseResultWorkspace.ts): `apps/desktop/src/pages/parse/useParseResultWorkspace.ts`
- [Transfer page](https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/pages/useTransferPage.ts): `apps/desktop/src/pages/useTransferPage.ts`
- [Library pages](https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/pages/useLibraryPage.ts): `apps/desktop/src/pages/useLibraryPage.ts`
- [CLI](https://github.com/yuelioi/bdl/blob/main/crates/bdl-cli/src/main.rs): `crates/bdl-cli/src/main.rs`
- [Tauri API bridge](https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/api/tauri.ts): `apps/desktop/src/api/tauri.ts`

### Media workflow

- [Source resolvers](https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/resolver/mod.rs): `crates/bdl-core/src/resolver/mod.rs`
- [Download planner](https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/planner.rs): `crates/bdl-core/src/planner.rs`
- [Media fetcher](https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/fetcher.rs): `crates/bdl-core/src/fetcher.rs`
- [Media muxer](https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/muxer.rs): `crates/bdl-core/src/muxer.rs`

### Task runtime

- [Tauri commands](https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/commands.rs): `crates/bdl-tauri/src/commands.rs`
- [Queue coordinator](https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/queue_coordinator.rs): `crates/bdl-tauri/src/queue_coordinator.rs`
- [Queue worker](https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/queue_worker.rs): `crates/bdl-tauri/src/queue_worker.rs`
- [Local database](https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/storage.rs): `crates/bdl-core/src/storage.rs`

### Account and configuration

- [Account services](https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/account.rs): `crates/bdl-core/src/account.rs`
- [Library state](https://github.com/yuelioi/bdl/blob/main/apps/desktop/src/stores/library.ts): `apps/desktop/src/stores/library.ts`
- [Settings](https://github.com/yuelioi/bdl/blob/main/crates/bdl-core/src/settings.rs): `crates/bdl-core/src/settings.rs`

### Platform services

- [Android background execution](https://github.com/yuelioi/bdl/blob/main/crates/bdl-mobile-execution/android/src/main/java/DownloadForegroundService.kt): `crates/bdl-mobile-execution/android/src/main/java/DownloadForegroundService.kt`
- [Android storage bridge](https://github.com/yuelioi/bdl/blob/main/crates/bdl-tauri/src/mobile_storage.rs): `crates/bdl-tauri/src/mobile_storage.rs`
- [Android storage plugin](https://github.com/yuelioi/bdl/blob/main/crates/bdl-mobile-storage/android/src/main/java/StoragePlugin.kt): `crates/bdl-mobile-storage/android/src/main/java/StoragePlugin.kt`

### Other components

- **User**
- **Bilibili**
- **Local media files**
- **FFmpeg**

## Connections

- User → Desktop app: uses
- Desktop app → Parse workspace: opens
- Desktop app → Transfer page: opens
- Desktop app → Library pages: opens
- Parse workspace → Tauri API bridge: requests parsing
- Tauri API bridge → Tauri commands: invokes commands
- Tauri commands → Source resolvers: resolves sources
- Source resolvers → Bilibili: requests media data
- Tauri commands → Download planner: plans tasks
- Download planner → Queue coordinator: creates tasks
- Transfer page → Tauri API bridge: controls transfers
- Tauri commands → Queue coordinator: coordinates tasks
- Queue coordinator → Queue worker: dispatches work
- Queue worker → Media fetcher: downloads resources
- Media fetcher → Bilibili: fetches media
- Queue worker → Media muxer: merges streams
- Media muxer → FFmpeg: runs processing
- Queue worker → Local media files: writes downloads
- Queue coordinator → Local database: persists task state
- Tauri commands → Local database: reads and writes
- Library pages → Library state: browses library
- Library state → Tauri API bridge: loads content
- Tauri commands → Account services: manages login
- Account services → Bilibili: authenticates
- Tauri commands → Settings: loads settings
- CLI → Source resolvers: resolves input
- CLI → Download planner: plans downloads
- CLI → Media fetcher: downloads media
- CLI → Media muxer: merges streams
- Queue worker → Android background execution: uses background service
- Tauri commands → Android storage bridge: requests export
- Android storage bridge → Android storage plugin: dispatches storage calls
- Android storage plugin → Local media files: exports files
