# mediagrab — Changelog

## v1.0.1 — 2026-06-22

- Add `--full` extended-help flag per SUITE_STANDARDS.md §3.

## v1.0.0 — 2026-06-14

Initial release.

- Three subcommands: `probe` (detect-only), `video`, `audio`.
- Extractor trait + registry:
  - `DirectFileExtractor` — URL extension + HEAD `Content-Type` gate.
  - `YouTubeExtractor` — `streamingData.formats` + `adaptiveFormats`.
    `signatureCipher` entries are skipped with a clear error; many
    such streams cannot be decoded without an embedded JS engine.
  - `VimeoExtractor` — `player.vimeo.com/video/<id>/config`.
  - `GenericExtractor` — `<video>`/`<source>` tags, OpenGraph
    `og:video`, `twitter:player:stream`, `<link rel="alternate">`
    HLS/DASH, JSON-LD `VideoObject.contentUrl`, inline `.m3u8`/`.mpd`.
- HLS support: master playlist variant selection (highest bandwidth
  or smallest height meeting `-q`), media playlist segment download,
  fMP4 init-segment handling, AES-128 stream rejection.
- Direct downloader with atomic `.part` → final-path rename and an
  `indicatif` bytes-known progress bar on stderr.
- `transcode.rs`: ffmpeg shell-out for container conversion and audio
  extraction (libmp3lame, libopus, flac, pcm_s16le, aac).
- Output template engine: `{title}`, `{id}`, `{site}`, `{ext}`.
- Mandatory tagline footer on every `--help` and successful run:
  `[ mediagrab ] ─ an independent project by johlem.net`.
- 62 unit tests; zero compiler warnings.

Out of scope for v1.0 (planned for v1.1+): DASH `.mpd` segment fetch
(probe finds them today but `video`/`audio` errors clearly), download
resume, `--cookies-from-browser`, subtitle co-download via the
existing transcript path, output rate-limit + 429 backoff, Twitter and
Reddit dedicated extractors, YouTube nsig/signature-cipher decoding.
