Skip to content

Releases: blank-query/xverter

1.4.0 — the format it could only read

Choose a tag to compare

@blank-query blank-query released this 01 Sep 04:02

1.4.0 — the format it could only read

New writer: STFS (.stfs) output — write LIVE packages from any input.
STFS was the one format xVerter read but could not write. Now every input
writes it, held to the same standard as every other writer: the package is
re-read by xVerter's own reader and its entire interleaved SHA-1 hash chain
re-verified block-by-block to the volume descriptor's root before success is
reported. Content is byte-equal to source, proven at all three hash-tree
levels — including a full-scale run on the real 2.34 GB Halo: Spartan Assault
retail package.

Content type is chosen, never guessed. A LIVE package carries its type
(XBLA 0x000D0000, DLC 0x00000002, title update 0x000B0000, Xbox Original
0x00005000) in its header. An STFS source already has one, so
stfs → stfs is a faithful rebuild that preserves it. Any other source
has none to carry, so you name it with --content-type xbla|dlc|title-update|xbox-original (or a raw value). Without it, a non-STFS
source is a clear error — never a silent XBLA stamp. The junk RSA signature
bytes are the same convention xVerter's GoD output (and iso2god's) already
ships.

TUI: a content-type picker. Clicking → STFS on a non-STFS game pops a
modal to choose the type; an STFS source skips it and preserves its own. The
→ STFS button joins the Xbox 360 row.

Matrix: STFS is a normal output column for every input. Each input now
runs the STFS output family — write, round-trip to a directory, content-check
against the baseline, and verify to the descriptor root. Image input 68
edges
(was 62); STFS input 63 (it lacks the five pressed-byte audits an
image earns: 68 − 5 = 63).

STFS packages carry real, derived metadata (and you can override it).
A synthesized STFS package used to be a title_id=0 shell a console can't
index. Now X -> stfs derives the game's identity from the source: the
title id / media id / disc number come from the payload executable -
default.xex (360) or default.xbe (OG Xbox), the same exec-info GoD reads.
The display name is resolved from the title id against a bundled Xbox 360
title database (distilled from xenia-manager/x360db, ~6500 titles) - so a 360
game names itself even from a stripped ZAR, since a XEX carries no name of its
own. OG Xbox games take their name from the XBE certificate; a full retail iso
can also fall back to the redump DAT; and the source filename is the last
resort. --content-type, --title, --title-id and
--media-id fill or override any of it. On an stfs -> stfs rebuild those
flags edit the preserved header - rename a package or re-stamp an id by
converting with a flag, no metadata editor needed. (Deriving from the source
is conversion; a convert-with-override is the edit.)

STFS names over 40 bytes are refused, not truncated. STFS's file-table
name field is a hard 40 bytes of ASCII; some disc games carry longer asset
names (a real XGD3 shader is transparent_generic_viewer_centered_m.vsh,
41 chars). The writer now scans names up front and raises a clear error
naming the offender before writing anything, rather than truncating into a
valid-looking package with corrupted names. The matrix skips the STFS edge
for such a tree, like the xiso slice on a bare image.

Fixed: the TUI RAM-scratch and 4GiB-split toggles did nothing. Their
handler sat inside on_button_pressed guarded by event.switch, which a
button press never carries — so the switches were dead and an unrecognized
button id crashed. Moved to a proper on_switch_changed; the toggles now
take effect.

xVerter 1.3.0

Choose a tag to compare

@blank-query blank-query released this 23 Aug 03:12

1.3.0 — the missing conversion, and three sweeps deeper

New format: .xiso output — the trimmed bare image emulators actually want.
xverter convert "Game (redump).iso" -o Game.xiso was the one conversion an
xemu user needed and the tool refused. The new writer is a byte SLICE, not a
rebuild: XDVDFS offsets are partition-relative, so the bytes from the
partition base to the end of the image are already a complete bare image with
the original pressed layout intact. Every image-bearing source slices
(iso/GoD/CCI/CSO, and CHD via its materialized image); zar/STFS/folder
sources rebuild a bare image under the .xiso name; a bare image is refused —
there is nothing to trim. Verified the only way that counts: readback
SHA-1 against the sliced bytes, structure-checked, byte-audited against the
pressed source in the suite — and boot-tested: a real redump sliced by this
writer boots to the Halo main menu in xemu.

New interface: --progress=json. Bare --progress keeps today's text
protocol byte-identically; --progress=json renders the same events as pure
NDJSON on stderr with a closed envelope (progress* → error? → exit). Programs
driving xverter get a parser-stable contract instead of scraping human
output.

The suite grew again: 62 edges (57 for STFS). Every first-hop conversion
descends from the true source for every input kind; the xiso slice family is
byte-audited against the pressed disc; the double-build redundancy the old
composition carried is gone. The README explains exactly why STFS runs five
fewer edges (they are byte-audits whose ground truth a download title cannot
provide — fewer possible checks, never less coverage).

Three bug sweeps, ~30 verified fixes. Two hostile review passes and a
fuzzing campaign (420 generative round-trips over hostile trees, nearly 300
mutated containers, concurrency hammering, chaos input) found and fixed —
among others: two real data-loss paths (converting a gamedir onto itself
moved the user's files; an output placed inside its own source directory was
deleted by its own verification), an orphaned child conversion on SIGTERM, a
family of hostile-input hangs and allocation bombs across the parsers,
mid-read zip corruption crashing instead of refusing, and Windows
drive-letter path traversal in archive extraction. Interrupts are clean
everywhere: Ctrl-C and SIGTERM leave no partial outputs.

Portability hardening. The engine now adapts to interpreters it never
met: zstd builds without multithreading, systems without
os.copy_file_range. The full release suite passes on Android/Termux on a
Galaxy Z Fold 4 — all four titles, every edge, zero failures — and the
README carries the phone quartet's numbers.

TUI. Enter navigates the library. Buttons regrouped by console family:
Xbox 360 (ISO ZAR GoD CHD), Original Xbox (XISO CCI CSO), transport
(ZIP 7z Folder). Live update buttons fixed (they crashed the TUI since they
were wired to a method that didn't exist — found by the sweep), plus a
handful of race fixes in navigation and batch mode.

xVerter 1.0.2

Choose a tag to compare

@blank-query blank-query released this 17 Aug 03:19

xVerter 1.0.2

The definitive Xbox / Xbox 360 game format converter: any format in, any format out, verified at every step.

  • Formats: GoD, XDVDFS ISO (bare + full XGD1/2/3 redumps), ZArchive .zar, STFS (XBLA/DLC/TU, read), CCI, CSO, CHD, .zip/.7z archives, extracted folders — every reader and writer is native pure Python (CHD delegates to MAME's chdman, optional).
  • Verified: every output re-read and checked before success; ISOs authenticated against bundled Redump databases, offline.
  • Validated: full 48-edge conversion matrices, ALL PASS, on real DAT-authenticated media across every disc generation — Halo CE (XGD1), Halo 3 (XGD2), Halo CE Anniversary (XGD3), Halo Spartan Assault (XBLA). Run the same matrix on your own games: xverter test or the TUI's Test button.
  • Use it your way: standalone one-file binaries below (Windows / Linux x86_64 / Linux ARM64 / macOS — no install, double-click on Windows), or pip install xverter for the CLI + mouse-driven TUI + xv-* standalone tools.
  • Fast archives: the official multithreaded 7-Zip engine ships inside the binaries and platform wheels - no external 7-Zip needed.
  • Live progress on every stage of every operation, batch conversion with spacebar multi-select, redump identification in the details pane, deterministic reproducible ISO/ZIP output.

The macOS binary is CI-built from identical code but untested — reports welcome.