Repository navigation
v0.6.0 — Mux, don't burn.
Soft subs, both directions. v0.6.0 adds a path that skips libass entirely: mux an external .ass into an MKV as a separate, selectable subtitle track — video and audio stream-copied, no re-encode, done in seconds — and the inverse, extract embedded subtitle tracks back out of a container to standalone .ass / .srt files. The hardsub burn-in pipeline is untouched; this is a second way to ship subtitles, for when you'd rather keep them toggleable.
Headline feature: "Mux only (soft subs)" turns a 1.5 GB episode + an .ass into a playable MKV with a language-labeled, selectable subtitle track in seconds instead of minutes — because nothing is encoded, only copied.
Install
- Windows —
Moekoder-0.6.0-win-x64.exe. Still unsigned; SmartScreen will show More info → Run anyway on first launch. - macOS —
Moekoder-0.6.0-mac-arm64.dmg. Still unsigned; after dragging into/Applications, run:to clear the Gatekeeper quarantine.xattr -cr /Applications/Moekoder.app
- Linux — not shipped this release. Still on the roadmap.
Upgrading from v0.5.x: the Windows auto-updater pulls this in the background; the next launch comes up on v0.6.0. macOS users grab the DMG manually until code-signing lands.
Soft-sub mux
- "Mux only (soft subs)" toggle in Settings → Encoding. When on, the encoder skips the libass burn-in filter and emits
ffmpeg -i <video> -i <subs> -map 0:v -map 0:a -map 1:0 -c copy -c:s ass -metadata:s:s:0 language=<lang> -disposition:s:0 default <out.mkv>. Video + audio are stream-copied; the.assbecomes a default-flagged subtitle track. Opens in VLC / mpv with the subs selectable. - MKV forced — soft-subs in MP4 are a pain, so mux mode forces the MKV container and warns if you had MP4 selected.
- Language from the filename —
.en.ass/.pl.ass→eng/pol(ISO-639-2), with a manual override field. - I/O-bound, not encode-bound — reuses the existing
-progressparser; the bar fills near-instantly.
Subtitle extraction
- Dedicated Extract screen (new Titlebar entry) — open a container and its embedded subtitle streams are probed and listed (index / codec / language / title) in a multi-select table. Pick an output folder, pull the selected text tracks out. Image subtitles (PGS / VOBSUB) are shown but can't be selected.
- Output-format selector —
ASS/SRT/Match source, default ASS. Copies verbatim when the source already matches; transcodes otherwise (SubRip →.ass, or.ass→.srtwith a styling-loss note). - No collisions — output filenames carry the track ordinal (
<stem>.<lang>.s<N>.<ext>), so a full + a signs track both taggedengdon't overwrite each other.
Added
- Soft-sub mux mode, the dedicated Extract screen, the
subtitle:extractIPC channel, and a sharedresolveSubtitleOutputcodec ⇄ extension resolver.
Changed
- Removed the deprecated
escapeSubtitlePath/escapeSubtitlePathForlibass-escape aliases — no remaining callers; mux and extract args go straight tospawn(no shell, no libass filter), so no path escaping is needed.
Fixed
text-codec extraction no longer fabricates a.assfile that ffmpeg rejects — the generic ffprobetexttag is no longer treated as a selectable text codec.- Dropped-queue container extension is now correct when mux mode is toggled (stale-closure dependency fix on the drop-to-queue handler).
Tests
Desktop suite: 263 (was 234). Web suite: 28. New mux-arg, subtitle-codec, extractor, and renderer codec / language coverage. Lint, typecheck, and prettier clean.
Known limitations
- Multiple subtitle tracks in a single mux is out of scope — one external
.assper mux (planned for v0.7). - Extraction handles text subtitles only (copy or transcode between
.ass/.srt); image subtitles (PGS / VOBSUB) can't be exported. - Same as v0.5.x: binaries are unsigned, the auto-updater is Windows-only, there's no Linux build, and embedded-font extraction still runs per-job (no font cache).
Source under the Moekoder Source Available License.