Metadata-Version: 2.4
Name: dove-video-editor
Version: 1.0.0rc2
Summary: DOVE - Online Video Editor
License: AGPL-3.0-or-later
License-File: LICENSE
Keywords: gstreamer,video,live-streaming,broadcast,webrtc,srt,rtmp,mixer
Author: Stefan Hageneder
Author-email: stefan.hageneder@dorftv.at
Requires-Python: >=3.12,<4.0
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: End Users/Desktop
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Multimedia :: Sound/Audio :: Mixers
Classifier: Topic :: Multimedia :: Video :: Capture
Requires-Dist: authlib (>=1.4.1,<2.0.0)
Requires-Dist: charset-normalizer (>=3.4.4,<4.0.0)
Requires-Dist: fastapi (>=0.136.0,<0.137.0)
Requires-Dist: graphviz (>=0.21,<0.22)
Requires-Dist: httpx (>=0.28.1,<0.29.0)
Requires-Dist: itsdangerous (>=2.2.0,<3.0.0)
Requires-Dist: joserfc (>=1.6.0,<2.0.0)
Requires-Dist: orjson (>=3.11.4,<4.0.0)
Requires-Dist: pydantic (>=2.12.4,<3.0.0)
Requires-Dist: starlette (>=0.45.0,<1.0.0)
Requires-Dist: toml (>=0.10.2,<0.11.0)
Requires-Dist: uvicorn (>=0.44.0,<0.45.0)
Requires-Dist: websockets (>=16.0,<17.0)
Requires-Dist: yt-dlp (>=2026.3.3,<2027.0.0)
Project-URL: Homepage, https://github.com/dorftv/dove
Project-URL: Repository, https://github.com/dorftv/dove
Description-Content-Type: text/markdown

# DOVE — Online Video Editor

<table>
  <tr>
    <td width="35%" valign="middle">
      <img src="assets/logo.png" alt="DOVE" width="240">
    </td>
    <td width="65%" valign="middle">
      DOVE is an API driven Video/Audio Editor for live mixing with an intuitive web based Interface.
      <br><br>
      Developed by and for <a href="https://dorftv.at">DORFTV</a>. Inspired by <a href="https://github.com/bbc/brave">bbc/brave</a>.
    </td>
  </tr>
</table>

[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)
[![Python 3.12+](https://img.shields.io/badge/python-3.12+-3776AB.svg?logo=python&logoColor=white)](https://www.python.org/downloads/)
[![GStreamer 1.26+](https://img.shields.io/badge/GStreamer-1.26+-F47B20.svg)](https://gstreamer.freedesktop.org/)
[![Nuxt 4](https://img.shields.io/badge/Nuxt-4-00DC82.svg?logo=nuxt&logoColor=white)](https://nuxt.com/)
[![FastAPI](https://img.shields.io/badge/FastAPI-009688.svg?logo=fastapi&logoColor=white)](https://fastapi.tiangolo.com/)

<table>
  <tr>
    <td width="50%"><img src=".github/screenshots/main-ui.png" alt="Main mixing interface — scene grid, program output, and multi-input panel"></td>
    <td width="50%"><img src=".github/screenshots/nodecg-overlay.png" alt="NodeCG broadcast graphics overlay with live lower third controls"></td>
  </tr>
</table>

## Concept

```
Inputs → Scenes → Program → Outputs
```

**Inputs** — media sources: local files, network streams, web pages, yt-dlp URLs, cameras, test patterns.

**Scenes** — compositor layouts combining multiple inputs. Each scene has slots with per-slot position, size, z-order, alpha, and volume controls.

**Program** — the currently live scene, sent to all active outputs simultaneously. Cut or crossfade between scenes.

**Outputs** — streaming destinations (SRT, RTMP, HLS, WebRTC, Decklink, etc.). Multiple outputs can share an encoder; dedicated encoders per output are also possible.

## Features

### Inputs

| Type | Description |
|------|-------------|
| `uridecodebin3` | Local files and streams (HTTP, SRT, RTMP, RTSP) |
| `playlist` | Sequence of video clips and HTML pages |
| `wpesrc` | Web page rendered as video (HTML/CSS/JS overlays) |
| `ytdlp` | YouTube, Twitch, and hundreds of other sites via yt-dlp |
| `nodecg` | NodeCG broadcast graphics |
| `v4l2src` | Webcams and capture cards (V4L2) |
| `imagesrc` | Still images (PNG, JPEG, WebP, SVG) |
| `testsrc` | SMPTE color bars and test patterns |
| `whip` | Browser screen share or webcam via WebRTC (experimental) |

### Outputs

| Type | Description |
|------|-------------|
| `srtsink` | SRT push to a remote listener |
| `srtserversink` | SRT server mode (remotes connect to DOVE) |
| `rtmpsink` | RTMP push |
| `rtspclientsink` | RTSP push |
| `hlssink2` | HLS segments (also used for previews) |
| `splitmuxsink` | Segmented file recording |
| `decklink` | SDI/HDMI via Blackmagic Design card |
| `shout2send` | Icecast/Shoutcast audio stream |

### Encoders

Hardware-accelerated encoding via VAAPI (AMD/Intel) or Vulkan. Software fallback via x264/x265. Set `video_encoder.name = "auto"` to pick the best available encoder at startup. Multiple outputs can share a single encoder, or each output can have its own dedicated encoder.

| Encoder | Type |
|---------|------|
| `x264` | Software (always available) |
| `openh264` | Software alternative |
| `vah264enc` / `vaapih264enc` | VAAPI (AMD/Intel) |
| `vulkanh264enc` | Vulkan (Mesa 26+, GStreamer 1.28+) |
| `mpph264enc` | Rockchip hardware |

### Audio & Video Filters

Per-input dynamic filter chains, applied at runtime without pipeline restart.

**Audio:** highpass, lowpass, 3-band/10-band EQ, compressor (LSP), expander (LSP), gate (LSP), limiter, amplify, pan, invert, echo, denoise, loudnorm. See [`docs/audio-filters.md`](docs/audio-filters.md).

**Video:** color balance, flip/mirror, crop, color effects, blur, chroma key. **Experimental (requires `frei0r-plugins`):** pixelate, cartoon, glow, vignette, film grain, glitch, scanlines, sobel edge, color halftone. See [`docs/video-filters.md`](docs/video-filters.md).

### Previews

- **WebRTC** — sub-second latency preview in the browser.
- **HLS** — works in restricted networks, through any reverse proxy over HTTPS.

### Keyboard Shortcuts

Full keyboard control for live production: scene selection (1–9), cut/crossfade (Enter), transition toggle (T), and more. Press `?` in the UI for the full list. See [`docs/keyboard-shortcuts.md`](docs/keyboard-shortcuts.md).

## Quick Start

**Want a ready-to-run setup with example inputs and scenes?** See [dove-demo](https://github.com/dorftv/dove-demo) for a pre-configured docker-compose stack you can spin up in one command.

To install DOVE from scratch:

### Docker Compose

```bash
git clone https://github.com/dorftv/dove.git && cd dove
cp config-example.toml config.toml
```

**Software rendering (no GPU):**
```bash
docker compose up
```

**AMD GPU (VAAPI + Vulkan):**
```bash
docker compose -f docker-compose.yml -f docker-compose.amd.yml up
```

**Intel GPU (VAAPI + Vulkan):**
```bash
docker compose -f docker-compose.yml -f docker-compose.intel.yml up
```

Open [http://localhost:5000](http://localhost:5000)

### Configuration

Copy `config-example.toml` to `config.toml` and edit as needed. See [`docs/config.md`](docs/config.md) for all options.

```toml
[main]
default_resolution = "HD720"    # QHD, FullHD, HD720, nHD, …
default_framerate = "30/1"
volume = 0.7

[preview.scenes]
type = ["webrtcbin", "hlssink2"]
video_encoder.name = "auto"
```

## Authentication

Optional OIDC authentication (Keycloak, Authentik, Authelia, etc.). Disabled by default — enable with:

```toml
[auth]
enabled = true
issuer = "https://auth.example.com/realms/dove"
client_id = "dove-app"
client_secret = "your-secret"
```

Four roles: User, Supervisor, Outputs, Admin. See [`docs/auth.md`](docs/auth.md) for setup, role details, API tokens, and nginx integration.

## Documentation

In-app help is available at `/help` after starting DOVE. All docs are in the [`docs/`](docs/) directory:

**Setup** — [Interface overview](docs/interface.md) · [Configuration](docs/config.md) · [Authentication](docs/auth.md)

**Pipeline** — [Inputs](docs/inputs.md) ([uridecodebin3](docs/inputs-uridecodebin3.md) · [playlist](docs/inputs-playlist.md) · [wpesrc](docs/inputs-wpesrc.md) · [ytdlp](docs/inputs-ytdlp.md) · [nodecg](docs/inputs-nodecg.md) · [testsrc](docs/inputs-testsrc.md)) · [Scenes](docs/scenes.md) · [Outputs](docs/outputs.md) · [Encoders](docs/encoders.md)

**Effects & Output** — [Audio filters](docs/audio-filters.md) · [Video filters](docs/video-filters.md) · [Previews](docs/previews.md)

**Operations** — [Debugging](docs/debugging.md)

## Tech Stack

- **GStreamer 1.26+**
- **FastAPI + uvicorn** — REST API and WebSocket
- **Nuxt 4** — web frontend
- **Python 3.12+**

## Development

Running DOVE natively from a Python venv: see [`docs/install.md`](docs/install.md).

## Contributing

Contributions are welcome! Please open an issue first to discuss larger changes. For bug reports, include the GStreamer version, config, and relevant logs.

## Notes

- Decklink requires a supported Blackmagic Design card and the `decklink` GStreamer plugin
- WebRTC previews use `announced_ip` for the server's public IP — set in `config.toml` or via `ANNOUNCED_IP` env var

## License

[GNU Affero General Public License v3.0](LICENSE)

