Video-Service fuer Kurs-Booking Plugin

Python-basierter Microservice fuer Video-Hosting und HLS-Streaming.

Technologie-Stack

Komponente Version Beschreibung
Python 3.13 Support bis Oktober 2029
FastAPI 0.115 REST API Framework
Redis 7.4 Task Queue (BSD-Lizenz)
Celery 5.4 Async Task Processing
FFmpeg 6.1 Video-Konvertierung

Quick Start

# Container starten
cd video-service
docker compose up -d

# Logs anzeigen
docker compose logs -f video-api

# Health Check
curl http://localhost:8500/api/v1/health

Architektur

video-service/
+-- app/
|   +-- main.py              # FastAPI App
|   +-- config.py            # Pydantic Settings
|   +-- celery_app.py        # Celery Config
|   +-- api/
|   |   +-- routes.py        # API Endpoints
|   |   +-- auth.py          # JWT + API-Key
|   +-- services/
|   |   +-- storage.py       # File Management
|   |   +-- converter.py     # FFmpeg Wrapper
|   +-- tasks/
|   |   +-- video_tasks.py   # Celery Tasks
|   +-- models/
|       +-- schemas.py       # Pydantic Models
+-- storage/
|   +-- uploads/             # Hochgeladene Videos
|   +-- converted/           # HLS Output
+-- tests/
    +-- test_api.py

API Endpoints

Endpoint Methode Auth Beschreibung
/health GET - Health Check
/api/v1/health GET - Detaillierter Health Check
/api/v1/videos/upload POST API-Key Video hochladen
/api/v1/videos/{id}/status GET API-Key Status abfragen
/api/v1/videos GET API-Key Alle Videos listen
/api/v1/videos/{id} DELETE API-Key Video loeschen
/api/v1/videos/{id}/token POST API-Key Stream-Token generieren
/api/v1/stream/{id}/master.m3u8 GET JWT HLS Master Playlist
/api/v1/stream/{id}/{quality}/playlist.m3u8 GET JWT Quality Playlist
/api/v1/stream/{id}/{quality}/{segment} GET JWT Video Segment

Authentifizierung

API-Key (WordPress -> Video-Service)

X-API-Key: your-api-key

JWT Token (Client -> Streaming)

/api/v1/stream/{video_id}/master.m3u8?token=eyJ...

Token-Inhalt:

{
  "video_id": "abc123",
  "buchung_id": 789,
  "ip": "192.168.1.100",
  "exp": 1701442800
}

Konfiguration

Environment Variables

Variable Default Beschreibung
API_KEY - API-Key fuer WordPress
JWT_SECRET - Secret fuer Stream-Tokens
JWT_EXPIRY_HOURS 1 Token-Gueltigkeit
REDIS_URL redis://redis:6379/0 Redis-Verbindung
STORAGE_PATH /app/storage Speicherpfad
WORDPRESS_WEBHOOK_URL - Webhook-URL
ALLOWED_ORIGINS - CORS Origins
VIDEO_DOMAIN - Produktions-Domain
MAX_UPLOAD_SIZE_MB 2048 Max. Upload (2GB)
VIDEO_QUALITIES 360p,720p,1080p HLS Qualitaeten
HLS_SEGMENT_DURATION 6 Segment-Laenge

Video-Konvertierung

HLS Output-Struktur

videos/{video_id}/
+-- metadata.json
+-- thumbnail.jpg
+-- hls/
    +-- master.m3u8
    +-- 360p/
    |   +-- playlist.m3u8
    |   +-- segment_000.ts
    |   +-- segment_001.ts
    +-- 720p/
    |   +-- playlist.m3u8
    |   +-- segment_000.ts
    +-- 1080p/
        +-- playlist.m3u8
        +-- segment_000.ts

Quality Presets

Quality Resolution Video Bitrate Audio Bitrate
360p -2:360 800k 96k
720p -2:720 2500k 128k
1080p -2:1080 5000k 192k

Webhook Events

Der Service sendet Webhooks an WordPress:

video.progress

{
  "event": "video.progress",
  "video_id": "abc123",
  "kurs_id": 42,
  "status": "processing",
  "progress": 45
}

video.ready

{
  "event": "video.ready",
  "video_id": "abc123",
  "kurs_id": 42,
  "status": "ready",
  "metadata": {
    "duration_seconds": 3600,
    "width": 1920,
    "height": 1080
  },
  "thumbnail_url": "https://..."
}

video.error

{
  "event": "video.error",
  "video_id": "abc123",
  "kurs_id": 42,
  "status": "error",
  "error_message": "FFmpeg conversion failed"
}

WordPress Integration

Einstellungen

In WordPress unter Veranstaltungen > Einstellungen > Video-Service:

  1. Video-Service URL eintragen (z.B. http://localhost:8500)
  2. API-Key eintragen (muss mit VIDEO_API_KEY uebereinstimmen)
  3. Verbindung testen

Shortcode

[kurs_video buchung_id="123"]
[kurs_video buchung_id="123" video_id="5"]

Entwicklung

# Lokale Tests
cd video-service
python -m pytest tests/ -v

# API Dokumentation
# http://localhost:8500/docs (nur im Debug-Modus)

Deployment auf Hetzner

  1. Storage Box einrichten (BX11)
  2. CX22 Server mit Docker
  3. DNS: videos.islandpferde-melanieworbs.de -> Server-IP
  4. SSL-Zertifikat via Coolify/Traefik
  5. Environment Variables in Coolify setzen

Sicherheit

  • API-Key zwischen WordPress und Service
  • JWT fuer Streaming mit IP-Binding
  • Rate-Limiting (10 req/s)
  • Kein direkter Zugriff auf Storage
  • HTTPS in Produktion

Version: 1.0.0 Stand: 02. Dezember 2025

Description
No description provided
Readme 14 MiB
Languages
Python 95%
Dockerfile 5%