# lossless1024/streamonitor architecture

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

- Interactive diagram: https://gitdiagram.com/lossless1024/streamonitor
- Repository: https://github.com/lossless1024/streamonitor

## Overview

StreaMonitor monitors configured live-stream accounts, checks their status through site-specific adapters, records available streams, and exposes lifecycle controls and recording/status views through local console, ZeroMQ, and web interfaces. The README documents site coverage, selectable resolutions, and recording management. Some central runtime files (notably Bot and downloader implementations) were not sampled, so their internal call wiring is represented only where supported by the tree or excerpts.

Main entry points: [`streamonitor/manager.py`](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/manager.py) (Command manager), [`streamonitor/bot.py`](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/bot.py) (Streamer bots), [`Downloader.py`](https://github.com/lossless1024/streamonitor/blob/master/Downloader.py) (Downloader entry), [`streamonitor/downloaders`](https://github.com/lossless1024/streamonitor/tree/master/streamonitor/downloaders) (Stream downloaders)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Monitoring and recording"]
  node_entry["Downloader entry<br/>[Downloader.py]"]
  node_bot["Streamer bots<br/>[bot.py]"]
  node_sites["Site adapters"]
  node_downloaders["Stream downloaders"]
  node_bulk["Bulk status polling"]
end

subgraph group_controls["Control interfaces"]
  node_manager["Command manager<br/>[manager.py]"]
  node_cli["Console control<br/>[climanager.py]"]
  node_zmq["ZeroMQ control<br/>[zmqmanager.py]"]
  node_controller["Remote controller<br/>[Controller.py]"]
end

subgraph group_web["Web and recordings"]
  node_http["Web interface<br/>[httpmanager.py]"]
  node_web_helpers["Web view helpers"]
  node_video_data["Video metadata<br/>[video_data.py]"]
end

subgraph group_state["Configuration and status"]
  node_recordings["Recorded videos"]
  node_config["Streamer configuration<br/>[config.py]"]
  node_config_file["Configuration file"]
  node_space["Disk-space monitor"]
end

node_user(("Operator"))
node_site_service(("Streaming sites"))
node_ffmpeg["FFmpeg"]

node_user -->|"starts"| node_entry
node_entry -->|"loads streamers"| node_config
node_entry -->|"creates bots"| node_bot
node_bot -->|"selects adapter"| node_sites
node_sites -->|"checks status"| node_site_service
node_sites -->|"requests stream"| node_downloaders
node_downloaders -->|"fetches media"| node_site_service
node_downloaders -.->|"processes media"| node_ffmpeg
node_downloaders -->|"writes recordings"| node_recordings
node_entry -->|"starts managers"| node_manager
node_user -->|"enters commands"| node_cli
node_cli -->|"dispatches commands"| node_manager
node_user -->|"sends commands"| node_controller
node_controller -->|"sends requests"| node_zmq
node_zmq -->|"dispatches commands"| node_manager
node_manager -->|"controls streamers"| node_bot
node_manager -->|"saves streamers"| node_config
node_config -->|"reads and writes"| node_config_file
node_bulk -->|"polls bulk status"| node_sites
node_user -->|"uses web UI"| node_http
node_http -->|"dispatches commands"| node_manager
node_http -->|"builds view context"| node_web_helpers
node_web_helpers -->|"reads recordings"| node_bot
node_bot -->|"indexes video files"| node_recordings
node_web_helpers -->|"builds metadata"| node_video_data
node_http -->|"reads disk usage"| node_space
node_manager -->|"reads free space"| node_space

click node_entry "https://github.com/lossless1024/streamonitor/blob/master/Downloader.py"
click node_bot "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/bot.py"
click node_sites "https://github.com/lossless1024/streamonitor/tree/master/streamonitor/sites"
click node_downloaders "https://github.com/lossless1024/streamonitor/tree/master/streamonitor/downloaders"
click node_manager "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/manager.py"
click node_cli "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/climanager.py"
click node_zmq "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/zmqmanager.py"
click node_controller "https://github.com/lossless1024/streamonitor/blob/master/Controller.py"
click node_bulk "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/bulk_status_manager.py"
click node_http "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/httpmanager/httpmanager.py"
click node_web_helpers "https://github.com/lossless1024/streamonitor/tree/master/streamonitor/managers/httpmanager/utils"
click node_video_data "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/models/video_data.py"
click node_config "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/config.py"
click node_space "https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/outofspace_detector.py"

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_entry,node_bot,node_sites,node_downloaders,node_bulk toneBlue
class node_manager,node_cli,node_zmq,node_controller toneAmber
class node_http,node_web_helpers,node_video_data toneMint
class node_recordings,node_config,node_config_file,node_space toneRose
class node_user,node_site_service,node_ffmpeg toneIndigo
```

## Components

### Monitoring and recording

- [Downloader entry](https://github.com/lossless1024/streamonitor/blob/master/Downloader.py): `Downloader.py`
- [Streamer bots](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/bot.py): `streamonitor/bot.py`
- [Site adapters](https://github.com/lossless1024/streamonitor/tree/master/streamonitor/sites): `streamonitor/sites`
- [Stream downloaders](https://github.com/lossless1024/streamonitor/tree/master/streamonitor/downloaders): `streamonitor/downloaders`
- [Bulk status polling](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/bulk_status_manager.py): `streamonitor/managers/bulk_status_manager.py`

### Control interfaces

- [Command manager](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/manager.py): `streamonitor/manager.py`
- [Console control](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/climanager.py): `streamonitor/managers/climanager.py`
- [ZeroMQ control](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/zmqmanager.py): `streamonitor/managers/zmqmanager.py`
- [Remote controller](https://github.com/lossless1024/streamonitor/blob/master/Controller.py): `Controller.py`

### Web and recordings

- [Web interface](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/httpmanager/httpmanager.py): `streamonitor/managers/httpmanager/httpmanager.py`
- [Web view helpers](https://github.com/lossless1024/streamonitor/tree/master/streamonitor/managers/httpmanager/utils): `streamonitor/managers/httpmanager/utils`
- [Video metadata](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/models/video_data.py): `streamonitor/models/video_data.py`

### Configuration and status

- **Recorded videos**
- [Streamer configuration](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/config.py): `streamonitor/config.py`
- **Configuration file**
- [Disk-space monitor](https://github.com/lossless1024/streamonitor/blob/master/streamonitor/managers/outofspace_detector.py): `streamonitor/managers/outofspace_detector.py`

### Other components

- **Operator**
- **Streaming sites**
- **FFmpeg**

## Connections

- Operator → Downloader entry: starts
- Downloader entry → Streamer configuration: loads streamers
- Downloader entry → Streamer bots: creates bots
- Streamer bots → Site adapters: selects adapter
- Site adapters → Streaming sites: checks status
- Site adapters → Stream downloaders: requests stream
- Stream downloaders → Streaming sites: fetches media
- Stream downloaders → FFmpeg: processes media
- Stream downloaders → Recorded videos: writes recordings
- Downloader entry → Command manager: starts managers
- Operator → Console control: enters commands
- Console control → Command manager: dispatches commands
- Operator → Remote controller: sends commands
- Remote controller → ZeroMQ control: sends requests
- ZeroMQ control → Command manager: dispatches commands
- Command manager → Streamer bots: controls streamers
- Command manager → Streamer configuration: saves streamers
- Streamer configuration → Configuration file: reads and writes
- Bulk status polling → Site adapters: polls bulk status
- Operator → Web interface: uses web UI
- Web interface → Command manager: dispatches commands
- Web interface → Web view helpers: builds view context
- Web view helpers → Streamer bots: reads recordings
- Streamer bots → Recorded videos: indexes video files
- Web view helpers → Video metadata: builds metadata
- Web interface → Disk-space monitor: reads disk usage
- Command manager → Disk-space monitor: reads free space
