Commit Graph

3 Commits

Author SHA1 Message Date
4b5e48a26d Walk all YouTube sources fully; channel order is not newest-first
The Iron Culture channel lists recent episodes mid-list (Ep 392/393 at
~position 360 of 396), so the 'channels enumerate newest-first' boundary
assumption is wrong: with it, rssd would break at the first pre-start-date
video and miss recent episodes, while re-resolving a boundary video every
poll. Walk channels exactly like playlists: always record out-of-range
videos as skipped so discovery stays incremental.

Also ignore media files (manual yt-dlp downloads have landed in the
working tree before).
2026-10-21 08:19:28 -04:00
bc26e73a90 Add YouTube feed support via yt-dlp, MIME-based extensions, robust state
- ytdlp: thin wrapper around yt-dlp CLI for channel/playlist discovery
  (--flat-playlist) and per-video metadata (--print-json); defaults to
  player_client=web_embedded to avoid SABR-only format restrictions.
- downloader: YouTube path extracts audio via yt-dlp -x, probes duration
  with ffprobe and rejects clips far shorter than the expected length.
- main: YouTube channel/playlist feeds, incremental discovery with
  pre-start-date boundary for newest-first channels, two-phase
  record-then-enqueue so discovered jobs survive crashes.
- poller: propagate enclosure MIME type; computeDestPath appends the
  matching file extension.
- state: jobs carry expected duration; AddJobWithStatus for skipped items.
- cmd/probe: dry-run discovery/date-resolution diagnostics.
2026-09-23 09:06:36 -04:00
6f188d1939 Initial commit. 2026-05-03 20:30:37 -04:00