Spike's Car Radio is an active Shorts channel and its 60-second clips
were being downloaded as podcast content. yt-dlp reports these as
media_type 'short'; record such videos as skipped so they are neither
downloaded nor re-resolved. Applies to all YouTube feeds.
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).
- 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.