mirror of
https://github.com/guillaumemeyer/watermarks-remover.git
synced 2026-08-22 13:11:57 +02:00
feat: audio/video AI/C2PA metadata stripping (MP4/MOV, WAV, MP3) (#139)
The file-cleaners layer covered 15 formats -- all image, document, or text -- and zero audio/video. That gap gets more expensive every month: Sora, Veo, ElevenLabs, and Suno all embed provenance through the same mechanisms image generators do, just in different containers. New av_meta.py adds inspect/clean for: - MP4/MOV/M4A/M4V: top-level C2PA (jumb/c2pa box) and XMP (uuid box) detection/stripping reuse inspect_isobmff()/strip_isobmff() from image_meta.py unchanged -- that's exactly the mechanism the C2PA spec defines for ISOBMFF-family containers, already proven for AVIF/HEIC. moov/udta (where generator/tool tags live) is handled separately since it's MP4-specific. - WAV: RIFF LIST INFO chunk + embedded id3 chunk. - MP3: ID3v2 frames, per-frame for v2.3/v2.4, whole-tag fallback for v2.2 (3-byte frame IDs are detected but not decomposed, so a partial rewrite is never attempted there). Every box/chunk/frame is either kept byte-identical or dropped whole -- nothing does a partial in-place rewrite of a payload, so a container can never come out semantically mangled. Default strip_all_metadata=True matches this project's existing default (privacy-first: drop everything, --keep-non-ai-metadata narrows to only AI-flagged content), same as the image cleaners. Wired through the full dispatch stack so the feature isn't a half integration: format_dispatch.py (new "av" Kind), inspect_file.py / clean_file.py (--as av), audit_lib.py (so audit_dir.py's CI/SARIF path and the pre-commit hooks from #135 both cover audio/video too), and server.py (HTTP /inspect and /clean). Closes #134 Co-authored-by: Guillaume Meyer (The Opinionated Man) <1385518+guillaumemeyer@users.noreply.github.com>
This commit is contained in:
co-authored by
Guillaume Meyer
parent
a3b414654f
commit
275a087a07
@@ -19,7 +19,7 @@ Agent skill + stdlib Python service to strip **multi-vendor AI provenance marks*
|
||||
| --- | --- | --- |
|
||||
| **A** | Invisible Unicode, exotic spaces, bidi, tag chars | Deterministic Python scripts |
|
||||
| **B** | Statistical (token-sampling) text watermarks | Agent rewrite + optional `rewrite_text.py` hook |
|
||||
| **Files** | C2PA / EXIF / XMP / doc props | PNG, JPEG, WebP, BMP, GIF, TIFF, SVG, PDF, DOCX, EPUB, ODT, HTML, Markdown |
|
||||
| **Files** | C2PA / EXIF / XMP / doc props | PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF, SVG, PDF, DOCX, XLSX, PPTX, EPUB, ODT, HTML, Markdown, MP4/MOV/M4A/M4V, WAV, MP3 |
|
||||
|
||||
Vendors / ecosystems (class-level): **Claude**, **Gemini / SynthID-Text**, **OpenAI** provenance surfaces, **open-LLM** Kirchenbauer-style marks.
|
||||
|
||||
@@ -712,6 +712,9 @@ Layer B makes sense when you specifically want the premium model's **thinking an
|
||||
| ODT | meta.xml | Drop generator / AI-ish meta |
|
||||
| HTML | meta, JSON-LD, data-ai* | Strip tags/attrs |
|
||||
| Markdown | YAML frontmatter AI keys | Drop keys + Layer A body |
|
||||
| MP4 / MOV / M4A / M4V | ISOBMFF `jumb`/`uuid` boxes (same mechanism as AVIF/HEIC) + `moov/udta` generator tags | Drop boxes |
|
||||
| WAV | RIFF `LIST INFO` chunk, embedded `id3 ` chunk | Drop chunks |
|
||||
| MP3 | ID3v2 frames (v2.3/v2.4 per-frame; v2.2 whole-tag) | Drop matched frames or whole tag |
|
||||
|
||||
#### Why PDF needs qpdf, not just exiftool
|
||||
|
||||
|
||||
Reference in New Issue
Block a user