Repository navigation
v2.0.5 — Voice notes, long files, and modern STT models
Important
Correction — the .opus claim below is wrong for this release. Detection was fixed here, but the file was then rejected at upload, so .opus transcription still failed end to end with the default OpenAI provider. Fixed in v2.0.6 — upgrade to that instead. The other two audio fixes in this release are unaffected and work as described.
Audio that used to fail now works: .opus voice messages, long non-MP3 files, and every current-generation OpenAI transcription model. Validated with the canonical suite (297 tests), the packaging gate across all three consumer surfaces, and the real-API e2e suite.
If you transcribe audio, this one is worth upgrading for. Two of these were hard failures with error messages that pointed at the wrong culprit.
🐛 Notable fixes
WhatsApp voice messages (.opus) failed outright (#69)
content-core extract voice-note.opus raised UnsupportedTypeException: Unable to determine file type. The .opus extension was missing from the MIME mapping, and the Ogg container had no magic-byte signature either — so neither detection path recognized a perfectly valid file. Remuxing to .ogg was the only workaround.
Ogg files are now detected by content as well as by extension, and disambiguated by codec: Opus, Vorbis and FLAC route to audio, Theora to video.
Audio over 10 minutes failed for any non-MP3 source (#69)
This one was never Opus-specific. Files longer than 10 minutes get split into segments, and the segments were stream-copied while being named .mp3 — so ffmpeg was asked to mux an Opus or FLAC stream into an MP3 container and refused:
[mp3 @ ...] Invalid audio stream. Exactly one MP3 audio stream is required.
.flac and .ogg were already supported input formats and hit this too, as long as they were long enough. Segments now keep the source container.
Every non-Whisper OpenAI transcription model failed (#70)
Setting stt_model to gpt-transcribe, gpt-4o-transcribe-diarize or gpt-live-transcribe failed before transcription started, with an error that read like an API problem:
response_format 'verbose_json' is not compatible with model 'gpt-transcribe-api-ev3'
In practice whisper-1 was the only OpenAI STT model that worked. The root cause was upstream in esperanto — verbose_json is Whisper-only but was requested for anything that didn't match a narrow gpt-4o-*-transcribe name shape. Fixed in esperanto 2.26.0 (lfnovo/esperanto#269, which also covers Azure deployments); this release raises the floor to pick it up.
✨ Also in this release
Plugin marketplace for Claude Code and Codex (#63) — the agent skill now installs natively:
/plugin marketplace add lfnovo/content-core
The skill moved from SKILL.md at the repository root to skills/content-core/SKILL.md and was refreshed along the way: Reddit extraction documented, YouTube live/shorts URL forms, --version, updated model examples. If you were fetching the old raw-file URL, it no longer resolves — see the README for the new path and the marketplace install.
⚠️ Breaking changes
None to the library API, CLI or MCP tools. The one thing to know: the minimum esperanto version is now 2.26.0. If you pin esperanto yourself, upgrade it alongside this release.
🙏 Thanks
No external contributions this cycle — thanks to everyone filing issues, which is where all three fixes above came from.
Full details in the CHANGELOG.
Install: pip install content-core==2.0.5
Extras: content-core[docling], [crawl4ai], [langchain]
Zero-install: uvx content-core extract <source>
MCP: uvx content-core mcp