# 🎬 Video Download System

Personalisierte, zeitlich begrenzte Download-Links für große Videodateien mit Admin-Dashboard und vollständigem Zugriffsprotokoll.

## Features

- **Personalisierte Links** mit Vorname, Nachname, E-Mail
- **24h Timer** – startet beim ersten Klick, Countdown wird live angezeigt
- **Admin-Dashboard** – Links erstellen, verwalten, Statistiken einsehen
- **Zugriffsprotokolle** – IP-Adressen, Zeitpunkte, Download-Status
- **Große Dateien** – Chunked Delivery, kein PHP upload_max_filesize Problem
- **Download-Fortsetzung** – HTTP Range Requests werden unterstützt
- **Keine externe DB** – SQLite, keine Konfiguration nötig
- **3 Auslieferungsmethoden** – PHP, Apache X-Sendfile, Nginx X-Accel-Redirect

## Voraussetzungen

- PHP 8.0+ mit SQLite3 Extension (standardmäßig aktiv)
- Apache oder Nginx Webserver

## Installation

### 1. Dateien hochladen

```
/var/www/downloads/
├── admin.php           ← Admin-Panel
├── config.php          ← Konfiguration
├── database.php        ← Datenbank-Klasse
├── download.php        ← Download-Seite (öffentlich)
├── serve.php           ← Datei-Auslieferung
├── .htaccess           ← Apache-Schutz
├── data/               ← Datenbank (wird automatisch erstellt)
│   └── .htaccess       ← Zugangsschutz
└── nginx-example.conf  ← Nginx Konfiguration (Referenz)
```

### 2. Konfiguration anpassen (`config.php`)

```php
// Pfad zur Videodatei (AUSSERHALB des Webroot!)
define('VIDEO_FILE_PATH', '/var/data/videos/mein-video.mp4');
define('VIDEO_FILE_NAME', 'Mein-Video.mp4');

// Admin-Passwort setzen
// Hash erzeugen: php -r "echo password_hash('DEIN_PASSWORT', PASSWORD_BCRYPT);"
define('ADMIN_PASS_HASH', '$2y$10$deinHashHier...');
```

### 3. Verzeichnisrechte

```bash
# data-Verzeichnis muss beschreibbar sein
chmod 750 data/
chown www-data:www-data data/

# Videodatei muss für PHP lesbar sein
chmod 644 /var/data/videos/mein-video.mp4
```

### 4. Admin-Passwort generieren

```bash
php -r "echo password_hash('MeinSicheresPasswort123', PASSWORD_BCRYPT) . PHP_EOL;"
```

Den ausgegebenen Hash in `config.php` bei `ADMIN_PASS_HASH` eintragen.

## Auslieferungsmethode wählen

### PHP (Standard) – Funktioniert überall
```php
define('DOWNLOAD_METHOD', 'php');
```
- Keine zusätzliche Konfiguration nötig
- PHP liefert die Datei in 8 MB Chunks aus
- Gut für die meisten Fälle, verbraucht aber PHP-Prozess während des Downloads

### Apache X-Sendfile – Empfohlen für Apache
```bash
# Modul installieren
apt install libapache2-mod-xsendfile
a2enmod xsendfile

# In Apache VHost:
XSendFile On
XSendFilePath /var/data/videos
```
```php
define('DOWNLOAD_METHOD', 'xsendfile');
```

### Nginx X-Accel-Redirect – Empfohlen für Nginx
Siehe `nginx-example.conf` und:
```php
define('DOWNLOAD_METHOD', 'xaccel');
define('XACCEL_PREFIX', '/internal-videos');
```

## Nutzung

### Links erstellen
1. `https://deine-domain.de/downloads/admin.php` aufrufen
2. Einloggen
3. Vorname, Nachname, E-Mail eingeben → Link wird generiert
4. Link an den Empfänger senden

### Download-Ablauf
1. Empfänger klickt den Link → 24h Timer startet
2. Countdown wird live angezeigt
3. Download kann beliebig oft gestartet werden solange der Timer läuft
4. Nach 24h ist der Link automatisch gesperrt

### Admin-Funktionen
- **Link erstellen** – mit Vorname, Nachname, E-Mail, optional Notiz
- **Übersicht** – alle Links mit Status (Bereit/Aktiv/Abgelaufen/Deaktiviert)
- **Details** – vollständiges Zugriffsprotokoll pro Link
- **Deaktivieren/Reaktivieren** – Links manuell sperren oder zurücksetzen

## Sicherheitshinweise

- Videodatei **außerhalb des Webroot** ablegen
- `config.php` und `database.php` sind per `.htaccess` geschützt
- SQLite-Datenbank liegt im geschützten `data/` Verzeichnis
- Admin-Passwort als bcrypt-Hash speichern
- HTTPS empfohlen (besonders für Admin-Login)

## FAQ

**Stört `upload_max_filesize` den Download?**
Nein! Diese PHP-Einstellung betrifft nur Datei-Uploads, nicht Downloads.

**Was passiert bei Verbindungsabbruch?**
Der Download kann fortgesetzt werden (Range Requests). Der Browser setzt automatisch beim letzten Byte fort.

**Kann ich mehrere Videodateien verwenden?**
In der aktuellen Version wird eine Datei konfiguriert. Für mehrere Dateien müsste `download_links` um ein `datei_id`-Feld erweitert werden.

**Kann ich die Gültigkeitsdauer ändern?**
Ja, in `config.php`: `define('LINK_VALIDITY_HOURS', 48);` für z.B. 48 Stunden.
