Repository navigation
v0.3.0 — A whole stack to burn.
The Queue tab in the titlebar — dormant since v0.1 — is finally alive. Stack up 20 episodes, walk away, come back to a folder full of finished files.
Headline feature: persistent batch queue at userData/queue.json. Atomic writes survive force-kill; boot recovery demotes orphaned active items back to wait and flags missing source files. Soft-pause lets in-flight encodes finish naturally instead of cancel-and-requeue. 1–4 parallel encodes via the orchestrator's new configurable concurrency cap.
Install
- Windows —
Moekoder-0.3.0-win-x64.exe. Still unsigned; SmartScreen will show More info → Run anyway on first launch. - macOS —
Moekoder-0.3.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.
If you're upgrading from v0.2.0, the auto-updater on Windows pulls this release in the background; the next launch comes up on v0.3.0. macOS users grab the DMG manually until code-signing lands.
What you get when you queue
- Drop a folder of episodes onto the Queue screen — auto-pair runs across every match, one drag enqueues the whole batch.
- Click Start queue → sequential (or 1–4 parallel) encodes drain the wait list while you walk away.
- Failed item? Configurable retry budget with exponential backoff (default 2 retries, 4s → 8s → 16s) before it flips to
errorand the queue keeps moving. - Pause halts the dispatcher but lets in-flight encodes finish; Resume picks up at the next waiting item.
- Force-kill the app mid-queue → relaunch → the snapshot is restored, the formerly-active item is back at
wait, and Start picks up where you left off. - Drag-reorder the wait list. Active items have their handle suppressed so a mid-encode drop can't shuffle the running job.
- Per-card chevron drops an inline
ffmpeg · stderrlog panel below the card. Copy button writes timestamped lines to your clipboard for bug reports. - Total-queue disk-space preflight at Start sums every item's estimate per output dir and rejects with a structured error listing every shortfall.
- Desktop notification fires when the queue drains. Opt out via Settings → Queue.
Queue mechanics
- Status pills on every card: Wait / Live / Done / Error / Stopped, with per-card mini progress bars and kanji-numbered positions in the wait list.
- Whole-screen drop overlay on the Queue screen — auto-pairs every match it finds in one shot.
- Atomic persistence —
writeFile(tmp) → renamesurvives force-kill. The in-memory state debounce-flushes every 200ms and synchronously onbefore-quit. - Boot recovery —
activeitems at shutdown demote towaitand have their attempts counter reset; items whose source video or subtitle vanished off disk demote toerrorwithSource file missing. The queue does not auto-resume — Start is always a deliberate user action. - Concurrency cap (1–4 parallel encodes) wired through electron-store. The segmented control on the Queue screen mirrors the same setting; the orchestrator's cap follows the queue while it's running and reverts to 1 when the queue drains so the Single route's "another encode is already running" guarantee comes back unchanged.
- Per-item retry budget with exponential backoff:
queueMaxRetriesfailed attempts (default 2) before an item flips toerror. Each retry waitsqueueBackoffMs * 2^attempts(default 4s → 8s → 16s). - Per-card actions — Force stop on
activeitems (SIGTERM via the existing orchestrator path), Retry onerror/cancelleditems, Remove on anything else (with a click-twice-to-confirm guard). - Add pair multi-file picker on both the Queue screen and the QueueSidebar — runs through the same auto-pair pipeline as drag-and-drop, so a 12-episode batch is one dialog open.
queueDefaultRouteroutes the app straight into the Queue screen on boot for power-users; default stayssingle.
Settings → Queue
Five new prefs surfaced under Settings (previously devtools-only):
- Concurrency (1–4) — mirrors the segmented control on the Queue screen.
- Max retries (0–10) — how many times a failed item retries before giving up.
- Retry backoff (1–60s) — base wait; doubles each retry.
- Notify on complete — desktop notification when the queue drains.
- Default screen — Single or Queue on launch.
Changed
- The encode orchestrator's single-job lock at
startEncodeis now a configurable concurrency cap (setConcurrencyCap, default 1). Single-route behaviour is unchanged because the cap only rises while the queue manager is actively dispatching. - The Single / Queue route switcher in the titlebar is finally wired — the markup has been there since v0.1, but the renderer never passed an
onRouteChangecallback.
Tests
31 new vitest tests across queue/manager.test.ts, queue/persistence.test.ts, queue/preflight.test.ts, and ipc/handlers/queue.test.ts — concurrency dispatch, soft-pause, retries with fake backoff timers, atomic writes, boot recovery, queue-complete notification opt-out, total-queue preflight (empty queue / wait-only filtering / dir grouping / shortfall reporting / probe-failure tolerance).
Known limitations
- Per-item logs are session-scoped (memory only, capped at 500 lines per item). Relaunching loses completed-item log buffers — by design, to keep
queue.jsonsmall. - Per-item encoding overrides aren't supported. The whole queue uses the current global preset; per-item editing arrives with v0.4.0's advanced preset editor.
- Preflight rejection currently logs to devtools
console.error. A user-facing toast / dialog lands in v0.3.1 — the renderer call sites already point atlib/queue-errors.ts:reportQueueStartErrorso the upgrade is a single-file swap. - Same as v0.2.0: binaries are unsigned, auto-updater is Windows-only, no Linux build.
- Embedded-font extraction from MKV attachments still TODO — v0.5.0.
Source under the Moekoder Source Available License.