siftlode/backend/app/downloads
npeter83 cb170dfd32 feat(downloads): clickable channels + poster fallback for thumbnail-less sources
Two visual gaps for non-catalog downloads:
- Channel link: YouTube already exposes channel_url; Facebook exposes none but a
  numeric uploader_id that resolves at facebook.com/<id>. `_uploader_url` derives
  it so the auto-detected channel renders as a real clickable link.
- Poster: a source with no thumbnail (e.g. a direct reddit HLS URL) showed a
  blank image box. The worker now cuts a representative frame with ffmpeg
  (`ensure_poster`) into the `<base>.jpg` sidecar and records `poster_path`
  (migration 0050). The card, the public watch page (<video poster> + og:image),
  and link previews fall back to it via new authed + public poster endpoints.

Adds `app.downloads.backfill` (one-off, re-run-safe) to fill uploader_url
(re-extract YouTube/Facebook metadata) and posters for pre-existing downloads.
2026-07-07 22:28:49 +02:00
..
__init__.py fix(downloads): add the downloads package (was wrongly gitignored) + robust sanitizer 2026-07-03 00:19:22 +02:00
backfill.py feat(downloads): clickable channels + poster fallback for thumbnail-less sources 2026-07-07 22:28:49 +02:00
edit.py feat(downloads): clickable channels + poster fallback for thumbnail-less sources 2026-07-07 22:28:49 +02:00
formats.py fix(downloads): prefer H.264+AAC for mp4 so shared files play on iOS/Safari 2026-07-04 17:29:05 +02:00
gc.py feat(downloads): M3 — per-user quota + retention GC 2026-07-03 00:26:40 +02:00
links.py feat(downloads): clickable channels + poster fallback for thumbnail-less sources 2026-07-07 22:28:49 +02:00
og.py feat(downloads): clickable channels + poster fallback for thumbnail-less sources 2026-07-07 22:28:49 +02:00
quota.py feat(downloads): M4 — REST API (enqueue, manage, file-serve, sharing, admin) 2026-07-03 00:34:08 +02:00
service.py fix(downloads): clip long titles to fit display_name (VARCHAR 255) 2026-07-07 21:40:15 +02:00
storage.py feat(downloads): editor backend — trim/crop derivatives (phase 2) 2026-07-04 01:01:46 +02:00