test(fixtures): replace synthetic media with real CC-BY/CC0 content

- Video: Big Buck Bunny (Blender Foundation, CC-BY 3.0) 8s segment
  replaces ffmpeg testsrc2 synthetic; container variants hero.{mov,webm,mkv,avi}
- Speech: macOS TTS (CC0) replaces unknown-origin speech files;
  format variants speech.{flac,ogg,m4a,aac,opus} for depth tests
- Chat images: Sharp SVG mock chat UI (CC0) replaces third-party
  app screenshots with personal content
- Registry: video.hero.{mov,webm,mkv,avi}, audio.speech.{flac,ogg,m4a,aac,opus}
- Integrity guard: 19 ffprobe assertions (was 8)
- Parity: 13177 passed, 0 dropped
This commit is contained in:
SnapOtter
2026-06-20 01:24:59 +08:00
parent 9f28f13fb6
commit 09b26718e1
19 changed files with 26750 additions and 39 deletions
File diff suppressed because it is too large Load Diff
+52 -17
View File
@@ -19,16 +19,49 @@ carry no third-party copyright. They are deterministic and reproducible.
| `content/barcode.avif` | A | Code 128B encoder + Sharp | Same barcode, AVIF format |
| `content/ocr-clean.png` | A | Sharp SVG text | "The quick brown fox 12345", 800x200 |
| `content/ocr-japanese.png` | A | Sharp SVG text | Japanese writing passage, 480x172 |
| `content/ocr-chat.jpeg` | A | Sharp SVG render | Mock chat UI with legible text bubbles, 480x640 |
| `content/cross-format-chat.webp` | A | Sharp SVG render | Same mock chat UI as ocr-chat.jpeg, WebP format |
| `content/alt-2page.pdf` | A | PDF byte generator | Minimal 2-page PDF with text |
| `content/multipage-6.pdf` | A | PDF byte generator | Minimal 6-page PDF with text |
| `content/audio-with-tags.mp3` | A | ffmpeg sine 440Hz | 1.2s MP3, ID3: "Test Song" / "Test Artist" |
| `content/video-with-meta.mp4` | A | ffmpeg color frame | 1s, 64x64, solid orange H.264 |
| `content/media-30s.mp4` | A | ffmpeg testsrc2 + sine | 30s, 640x360, test pattern + 440Hz tone |
| `content/media-30s.wav` | A | ffmpeg sine 440Hz | 30s, 44100Hz, mono PCM |
| `content/animated-simpsons.gif` | B | ffmpeg testsrc | 3s test pattern GIF; **replaced** Homer Simpson clip (Fox/Disney copyright) |
| `content/svg-logo.svg` | B | hand-written SVG | Geometric test fixture; **replaced** ConvertICO brand logo (third-party trademark) |
| `content/multi-face.webp` | B | Sharp oval grid | Face-placeholder grid; **replaced** Shutterstock stock photo #199321457 (watermarked, copyrighted) |
## Verified CC-BY Assets (Big Buck Bunny, Blender Foundation)
Source: Big Buck Bunny (c) 2008 Blender Foundation, www.bigbuckbunny.org.
Downloaded from archive.org item `BigBuckBunny_124`. License: CC-BY 3.0.
All derived from an 8-second segment (30s-38s) of the 720p surround version,
scaled to 480x270 with H.264+AAC, then transcoded to each container format.
| Path | Format | Notes |
|------|--------|-------|
| `content/media-30s.mp4` | H.264 + AAC, MP4 | Primary hero video (247 KB) |
| `content/hero.mov` | H.264 + AAC, MOV | QuickTime container variant |
| `content/hero.webm` | VP9 + Opus, WebM | Web container variant |
| `content/hero.mkv` | H.264 + AAC, MKV | Matroska container variant |
| `content/hero.avi` | MPEG-4 + MP3, AVI | Legacy container variant |
## Verified CC0 Speech Assets (macOS TTS, locally generated)
Generated via `say -v Samantha` on macOS, then converted with ffmpeg. No
third-party content or copyright. Transcript: "The quick brown fox jumps over
the lazy dog. SnapOtter converts and transcribes audio files quickly and
reliably."
| Path | Format | Notes |
|------|--------|-------|
| `content/speech-10s.wav` | 16kHz mono PCM WAV | Primary speech fixture (~6.7s) |
| `content/speech-10s.mp4` | AAC in MP4 container | Speech for video transcription tests |
| `content/speech.flac` | FLAC lossless | Audio format variant |
| `content/speech.ogg` | Ogg Vorbis | Audio format variant |
| `content/speech.m4a` | AAC in M4A container | Audio format variant |
| `content/speech.aac` | AAC raw ADTS | Audio format variant |
| `content/speech.opus` | Opus | Audio format variant |
## Synthetic / Project-Generated Assets (pre-existing, not in content/)
The following were generated by project scripts or test infrastructure and carry
@@ -46,40 +79,42 @@ no third-party copyright concern:
## NEEDS HUMAN LICENSE SIGN-OFF (Category C: UNVERIFIED-REVIEW)
The following `content/` assets have unverifiable provenance. They were added
during the test coverage expansion (commit `babca4cf`) or QA bug fixes (commit
`d8cf979d`) without recorded source URLs. They are real-world photos, audio, or
video that require human review to either:
during the test coverage expansion (commit `babca4cf`) without recorded source
URLs. They are real-world photos containing faces or identifiable people that
require human review to either:
1. Verify they are CC0/CC-BY and record the source, OR
2. Replace them with properly-licensed alternatives.
**Do NOT delete these.** Depth tests (face detection, colorization, red-eye
removal, transcription, stress testing) depend on real-world content.
removal, stress testing) depend on real-world content.
| Path | Size | Content Description | Why Review Is Needed |
|------|------|---------------------|---------------------|
| `content/portrait-bw.jpeg` | 2.7 MB | B&W portrait of a woman (3775x5662) | Real photo, no EXIF source. Used for colorization tests. |
| `content/portrait-color.jpg` | 89 KB | Business portrait, man in suit (572x1024) | Likely AI-generated (has characteristic artifacts) but unconfirmed. Used for face/portrait tests. |
| `content/portrait-color.jpg` | 89 KB | Business portrait, man in suit (572x1024) | Likely AI-generated but unconfirmed. Used for face/portrait tests. |
| `content/portrait-color-dup.jpg` | 89 KB | Identical to portrait-color.jpg | Deliberate duplicate for dedup testing. Same license concern. |
| `content/portrait-headshot.heic` | 1.5 MB | HEIC portrait headshot | No EXIF source. Used for HEIC format tests with face content. |
| `content/portrait-isolated.png` | 81 KB | Same subject as portrait-color, background removed | Derived from portrait-color.jpg. Same license concern. |
| `content/red-eye.jpg` | 369 KB | Woman with red-eye effect (800x460) | Canon EOS 400D DIGITAL, Adobe Photoshop CS2 (2007). Real photo, no source URL. Used for red-eye removal tool. |
| `content/cross-format-chat.webp` | 182 KB | Mobile chat app screenshot (1440x3120) | Screenshot of "HeartCode" bot. Contains personal/third-party UI. Used in color-palette extraction test. |
| `content/ocr-chat.jpeg` | 1.0 MB | Same chat screenshot as above (JPEG) | Same content as cross-format-chat.webp, different format. Used for OCR tests. |
| `content/red-eye.jpg` | 369 KB | Woman with red-eye effect (800x460) | Canon EOS 400D DIGITAL, 2007. Real photo, no source URL. |
| `content/ocr-scanned.pdf` | 1.0 MB | Scanned document PDF | Unknown scanned content. Used for OCR-on-PDF tests. |
| `content/stress-large.jpg` | 6.7 MB | Muay Thai boxing match (4000x3000) | Samsung Galaxy S24 Ultra photo (2026-04-11). Likely personal photo but contains identifiable people and event branding. Used for large-image stress tests. |
| `content/watermark.jpg` | 87 KB | Mountain lake landscape with text watermark (720x480) | Real landscape photo with "Text Watermark Sample" overlay. Unknown source. Used for watermark removal tests. |
| `content/motorcycle.heif` | 224 KB | HEIF image | Content not inspectable without HEIF decoder. Used for HEIC/HEIF format processing tests. |
| `content/speech-10s.mp4` | 2.3 MB | 10-second video (640x360) | Likely contains speech for transcription tests. Content unverifiable without playback. |
| `content/speech-10s.wav` | 320 KB | 10-second audio (16kHz mono) | Likely contains speech for transcription tests. Content unverifiable without playback. |
| `content/stress-large.jpg` | 6.7 MB | Muay Thai boxing match (4000x3000) | Samsung Galaxy S24 Ultra photo. Contains identifiable people. |
| `content/watermark.jpg` | 87 KB | Mountain lake landscape with text watermark (720x480) | Real landscape photo. Unknown source. |
| `content/motorcycle.heif` | 224 KB | HEIF image | Content not inspectable without HEIF decoder. |
### Recommended Actions for Sign-Off
### Resolved in This Phase
The following were previously in this section and have been resolved:
- **`content/cross-format-chat.webp`** and **`content/ocr-chat.jpeg`**: Replaced with CC0 mock chat-bubble images (Sharp SVG render). No third-party UI content.
- **`content/speech-10s.wav`** and **`content/speech-10s.mp4`**: Replaced with macOS TTS-generated speech (CC0). Transcribable text for Whisper tests.
- **`content/media-30s.mp4`**: Replaced with Big Buck Bunny (CC-BY 3.0, Blender Foundation). Real video with motion + audio.
### Recommended Actions for Remaining Sign-Off
- **Portraits** (5 files): If AI-generated, confirm the generator and its license terms. If stock photos, identify the source. Consider replacing with CC0 portraits from a known source.
- **Chat screenshots** (2 files): Replace with a project-generated screenshot or a CC0 text image. The chat UI belongs to a third-party app.
- **Red-eye photo**: Source the original from the photographer or replace with a CC0 red-eye portrait.
- **Stress-large photo**: If this is a project contributor's personal photo, have them release it under CC0. Otherwise replace.
- **Watermark landscape**: Source the underlying landscape photo. The watermark overlay was likely added by the project.
- **Speech files** (2 files): Confirm content via playback. If synthetic (ffmpeg-generated), mark CC0. If real speech, identify speaker and get consent or replace.
- **Motorcycle HEIF**: Inspect via HEIF viewer and determine source.
- **OCR-scanned PDF**: Inspect document content and determine source.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 11 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+15 -2
View File
@@ -58,7 +58,13 @@ export const fixtures = {
hostileEmpty: { zeroByte: p("hostile/zero-byte.png") },
},
video: {
hero: { mp4: p("content/media-30s.mp4") },
hero: {
mp4: p("content/media-30s.mp4"),
mov: p("content/hero.mov"),
webm: p("content/hero.webm"),
mkv: p("content/hero.mkv"),
avi: p("content/hero.avi"),
},
speech: { mp4: p("content/speech-10s.mp4") },
withMeta: p("content/video-with-meta.mp4"),
tiny: (ext: string) => p(`media/tiny.${ext}`),
@@ -71,7 +77,14 @@ export const fixtures = {
hostile: { truncated: p("hostile/truncated.mp4") },
},
audio: {
speech: { wav: p("content/speech-10s.wav") },
speech: {
wav: p("content/speech-10s.wav"),
flac: p("content/speech.flac"),
ogg: p("content/speech.ogg"),
m4a: p("content/speech.m4a"),
aac: p("content/speech.aac"),
opus: p("content/speech.opus"),
},
music: { wav: p("content/media-30s.wav") },
tagged: p("content/audio-with-tags.mp3"),
stereo: p("media/tone-stereo.wav"),
+92 -20
View File
@@ -42,19 +42,51 @@
},
{
"path": "content/cross-format-chat.webp",
"sourceUrl": "Unknown; added in babca4cf (test coverage expansion). Chat app screenshot.",
"license": "UNVERIFIED-REVIEW",
"sourceUrl": "generated (mock chat UI, Sharp SVG render)",
"license": "CC0",
"toolsServed": [],
"sha256": "de010e4433f6b20e9e7834bf8608f9a946971af5920d4fc53658194844686285",
"bytes": 181960
"sha256": "f45457826da776b4a7986eddd98dc0993295134e4f960a00d78c627f11c26dad",
"bytes": 11538
},
{
"path": "content/hero.avi",
"sourceUrl": "Big Buck Bunny (Blender Foundation, www.bigbuckbunny.org) via archive.org, transcoded to AVI",
"license": "CC-BY",
"toolsServed": [],
"sha256": "c56b0e01e4408846c3d040034b85aeeade17a25534771c7f5712e0e0dc5e45cc",
"bytes": 681052
},
{
"path": "content/hero.mkv",
"sourceUrl": "Big Buck Bunny (Blender Foundation, www.bigbuckbunny.org) via archive.org, transcoded to MKV",
"license": "CC-BY",
"toolsServed": [],
"sha256": "41b5d042000446882a3ae562ab262b62ffab8702ba9097424e344d603ae034fe",
"bytes": 241665
},
{
"path": "content/hero.mov",
"sourceUrl": "Big Buck Bunny (Blender Foundation, www.bigbuckbunny.org) via archive.org, transcoded to MOV",
"license": "CC-BY",
"toolsServed": [],
"sha256": "24e2107d9c642bd8c06f1c8ccbb52c9bf8aa177405c1eb274216289d5ed32d75",
"bytes": 244646
},
{
"path": "content/hero.webm",
"sourceUrl": "Big Buck Bunny (Blender Foundation, www.bigbuckbunny.org) via archive.org, transcoded to WebM",
"license": "CC-BY",
"toolsServed": [],
"sha256": "14435ede8e4e2cb7eca91a788647771ca051b04cf1c6ca58b1ad50dec6b5be1f",
"bytes": 226183
},
{
"path": "content/media-30s.mp4",
"sourceUrl": "gen-synthetic-content.mjs (ffmpeg testsrc2 + 440Hz sine, 30s)",
"license": "CC0",
"sourceUrl": "Big Buck Bunny (Blender Foundation, www.bigbuckbunny.org) via archive.org, 8s segment at 30s, 480x270",
"license": "CC-BY",
"toolsServed": [],
"sha256": "0313fc9ef2d763f057e53fadf047eb2876b9f3ba001f971b7a0eda3883e19af1",
"bytes": 7007619
"sha256": "6ad37435eeb01cc694b918f8588255fead60eb01f2a06ca0dc904070064e9136",
"bytes": 247284
},
{
"path": "content/media-30s.wav",
@@ -90,11 +122,11 @@
},
{
"path": "content/ocr-chat.jpeg",
"sourceUrl": "Unknown; added in babca4cf (test coverage expansion). Chat app screenshot with personal content.",
"license": "UNVERIFIED-REVIEW",
"sourceUrl": "generated (mock chat UI, Sharp SVG render)",
"license": "CC0",
"toolsServed": [],
"sha256": "97798605609879cbbefb4bdc94d4c8e47ac1e122d22d7951c33d37e63c5f4238",
"bytes": 1048725
"sha256": "41602713616187b97ba64fb0ce97f2ac06bfbef193690f757d622e6d624e87a7",
"bytes": 20462
},
{
"path": "content/ocr-clean.png",
@@ -194,19 +226,59 @@
},
{
"path": "content/speech-10s.mp4",
"sourceUrl": "Unknown; added in d8cf979d (QA bug fixes). 10s video, likely contains speech for transcription tests.",
"license": "UNVERIFIED-REVIEW",
"sourceUrl": "macOS say TTS (locally generated, Samantha voice), converted to AAC MP4",
"license": "CC0",
"toolsServed": [],
"sha256": "e3196b8eb044feb7eba7ae55d931f5be31f6694186e8d67d6fb6d412a89f25e8",
"bytes": 2254674
"sha256": "2f8d3a93f01645af5b14859366d8d0aa59c10e79fca23bf56ab94cc8634bfe50",
"bytes": 92269
},
{
"path": "content/speech-10s.wav",
"sourceUrl": "Unknown; added in d8cf979d (QA bug fixes). 10s audio, likely contains speech for transcription tests.",
"license": "UNVERIFIED-REVIEW",
"sourceUrl": "macOS say TTS (locally generated, Samantha voice), 16kHz mono PCM",
"license": "CC0",
"toolsServed": [],
"sha256": "dde7726a10dc469dea2e306b94462b5fd4ec9b2f62e0b22401a018c6b27270fa",
"bytes": 320390
"sha256": "7be6bb102d39699ab6eaf3361a05d8c37f636551dd6527101b7b59ef7ae48efb",
"bytes": 213346
},
{
"path": "content/speech.aac",
"sourceUrl": "macOS say TTS (locally generated, Samantha voice), converted to AAC ADTS",
"license": "CC0",
"toolsServed": [],
"sha256": "d3126934729aa997ae77528c0f32b393ee06e5435bf544f2b16c905269209248",
"bytes": 68336
},
{
"path": "content/speech.flac",
"sourceUrl": "macOS say TTS (locally generated, Samantha voice), converted to FLAC",
"license": "CC0",
"toolsServed": [],
"sha256": "2aa38548cd52093be747fde14f88129e63c22dd489d0b4a5c9f98fc488ea5872",
"bytes": 142669
},
{
"path": "content/speech.m4a",
"sourceUrl": "macOS say TTS (locally generated, Samantha voice), converted to M4A",
"license": "CC0",
"toolsServed": [],
"sha256": "a952060a2a4e061062d8efbfb170ce0623143db54b5e3e15d80fd2b3a0401b49",
"bytes": 68824
},
{
"path": "content/speech.ogg",
"sourceUrl": "macOS say TTS (locally generated, Samantha voice), converted to Ogg Vorbis",
"license": "CC0",
"toolsServed": [],
"sha256": "d4ef00c1311bac6215b7ab2aedf05d096922cecb3859d208ebeb77f24c027524",
"bytes": 39607
},
{
"path": "content/speech.opus",
"sourceUrl": "macOS say TTS (locally generated, Samantha voice), converted to Opus",
"license": "CC0",
"toolsServed": [],
"sha256": "fcc32c30c77f95a18ef8947ec05c0778347012e5d77bd73bbc520337f83667ea",
"bytes": 63103
},
{
"path": "content/stress-large.jpg",
@@ -23,7 +23,16 @@ describe("real fixtures decode through their real tools", () => {
it.each([
fixtures.video.hero.mp4,
fixtures.video.hero.mov,
fixtures.video.hero.webm,
fixtures.video.hero.mkv,
fixtures.video.hero.avi,
fixtures.audio.speech.wav,
fixtures.audio.speech.flac,
fixtures.audio.speech.ogg,
fixtures.audio.speech.m4a,
fixtures.audio.speech.aac,
fixtures.audio.speech.opus,
fixtures.audio.tagged,
])("ffprobe reads a positive duration from %s", (path) => {
const out = execFileSync(