71 lines
1.9 KiB
Markdown
71 lines
1.9 KiB
Markdown
|
|
# HLS-Downloader — Umsetzungsplan (Final)
|
||
|
|
|
||
|
|
## Entscheidung
|
||
|
|
**ffmpeg (primär) + requests (Fallback)**
|
||
|
|
|
||
|
|
- `ffmpeg` für HLS/m3u8 Streams — ffmpeg ist auf dem System verfügbar
|
||
|
|
- `requests.get(stream=True)` für direkte MP4-URLs (wie bisher)
|
||
|
|
- `hls-downloader` Package ist leider nur ein CLI-Tool, nicht als Library importierbar
|
||
|
|
|
||
|
|
## Installierte Pakete
|
||
|
|
```bash
|
||
|
|
pip install pypdl m3u8
|
||
|
|
```
|
||
|
|
|
||
|
|
## Architektur
|
||
|
|
|
||
|
|
```
|
||
|
|
POST /api/download
|
||
|
|
│
|
||
|
|
▼
|
||
|
|
┌─────────────────────┐
|
||
|
|
│ DownloadManager │
|
||
|
|
│ (wie bisher, aber │
|
||
|
|
│ mit HLS-Support) │
|
||
|
|
└────────┬────────────┘
|
||
|
|
│
|
||
|
|
┌────▼────┐
|
||
|
|
│ URL-Typ │
|
||
|
|
└────┬────┘
|
||
|
|
│
|
||
|
|
┌────┼────────────┐
|
||
|
|
▼ ▼ ▼
|
||
|
|
.m3u8 .mp4 Fehler
|
||
|
|
│ │
|
||
|
|
│ └──▶ requests.get (stream=True)
|
||
|
|
│
|
||
|
|
└──▶ ffmpeg subprocess
|
||
|
|
-i url -c copy -bsf:a aac_adtstoasc
|
||
|
|
```
|
||
|
|
|
||
|
|
## Implementiert in app.py
|
||
|
|
|
||
|
|
### `_run()` — Dispatcher
|
||
|
|
- URL wird zuerst aufgelöst (resolveurl)
|
||
|
|
- Falls `.m3u8` im URL → `_run_hls()`
|
||
|
|
- Sonst → `_run_direct()`
|
||
|
|
|
||
|
|
### `_run_hls()` — ffmpeg
|
||
|
|
```python
|
||
|
|
cmd = ['ffmpeg', '-y', '-i', url, '-c', 'copy',
|
||
|
|
'-bsf:a', 'aac_adtstoasc',
|
||
|
|
'-progress', 'pipe:1', output_file]
|
||
|
|
```
|
||
|
|
- Progress via stdout pipe
|
||
|
|
- Progress: `out_time_ms` → geschätzter %
|
||
|
|
- Output: .ts → .mp4 umbenennen
|
||
|
|
|
||
|
|
### `_run_direct()` — requests
|
||
|
|
- Bestehender Code, aus `_run()` extrahiert
|
||
|
|
- Chunk-basiertes Streaming
|
||
|
|
- Progress in %
|
||
|
|
|
||
|
|
## Parallelität
|
||
|
|
- Jeder `add()` startet einen daemon Thread
|
||
|
|
- Mehrere Downloads parallel möglich
|
||
|
|
- Keine Queue-Library nötig (Python threading reicht)
|
||
|
|
|
||
|
|
## ToDo
|
||
|
|
- [ ] Test mit echter m3u8 URL
|
||
|
|
- [ ] Progress-Anzeige verfeinern (ffmpeg gibt keine Duration bei HLS)
|