# mediadb prototype

Ein C++-Prototyp für einen Media-Preview-Service mit:

- Registrierung von Quelldateien via `POST /media/register`
- Abruf von Previews via `GET /media/{id}/preview?w=640&h=480&fmt=webp&t=3`
- LRU-RAM-Cache für fertige Preview-Bytes
- FFmpeg **C-API** für Dekodierung, Skalierung und Encodierung
- `cJSON` für JSON
- Platzhaltern für `libnetplus`, `libhttppp`, `uuidplus` und `authdb`

## Wichtiger Hinweis

Ich konnte die GitLab-Projektseiten der genannten Bibliotheken verifizieren, aber die eigentlichen Header-/API-Details der Repositories waren in dieser Umgebung nicht zuverlässig lesbar. Deshalb ist dieses ZIP als **ehrlicher Integrations-Prototyp** gebaut:

- Die Kernlogik für Cache, Request-Fluss und FFmpeg-C-API ist implementiert.
- Die Anbindung an `libhttppp`, `libnetplus`, `uuidplus` und `authdb` ist bewusst an klar markierten Stellen als Adapter-/TODO-Punkte vorbereitet.
- Im Default-Build läuft das Projekt im `MEDIADB_USE_PLACEHOLDER_ADAPTERS=ON`-Modus.

Sobald du mir die echten Header oder Signaturen gibst, kann ich dir die Adapter 1:1 auf deine Libraries zuschneiden.

## Projektstruktur

- `src/main.cpp` – kompletter Prototyp
- `CMakeLists.txt` – Build mit FFmpeg + cJSON
- dieses `README.md`

## Build

```bash
cmake -S . -B build
cmake --build build -j
```

## Laufzeit

Im Placeholder-Modus startet kein echter HTTP-Server, sondern nur ein sauberer Einstiegspunkt für deine spätere `libhttppp`/`libnetplus`-Integration.

## Geplante Integrationspunkte

### uuidplus

In `MediaStore::generate_id()`:

```cpp
// TODO: replace with uuidplus API, e.g. uuidplus::uuid::random().str()
```

### authdb

In `AuthService::is_authorized()`:

```cpp
// TODO: wire authdb token validation here.
```

### libhttppp + libnetplus

In `main()`:

```cpp
// 1. Create listener/socket with libnetplus.
// 2. Parse incoming requests with libhttppp.
// 3. Convert to mediadb::HttpRequest.
// 4. Pass to app.handle(...).
// 5. Serialize mediadb::HttpResponse back through libhttppp.
```

## API

### Register

```http
POST /media/register
Authorization: Bearer testtoken
Content-Type: application/json

{
  "path": "/data/in/video.mp4"
}
```

### Preview

```http
GET /media/media-1/preview?w=640&h=480&fmt=webp&t=3
```

## Unterstützte Ausgabeformate

- `webp`
- `png`
- `jpeg` / `jpg`

## Hinweise zum Code

- Der Prototyp behandelt zurzeit Video- und Bilddateien über denselben FFmpeg-Pfad.
- Für Bilder wäre später ein eigener, schlankerer Pfad sinnvoll.
- Der Cache hält nur fertige encodierte Preview-Bytes im RAM.
- Es gibt aktuell noch kein "nur ein Renderjob pro Cache-Key"-Locking; das wäre der nächste sinnvolle Schritt.
