Releases: exterminathan/EfficientAssetRipper
v0.8.8
Dockable workspace, profile-aware texture resolution, unified media
preview, and a slimmer setup wizard.
Added
- Dockable workspace — every panel is a
QDockWidgetwith persistent
layout state and a Window menu (toggle docks, Reset Layout). - Auto AES prompt — when CUE4Parse reports unmounted archives, the
prompt opens with affected names and GUIDs. - Unified Media Preview tab plays audio and video with one auto-
switching player and side-by-side per-kind history; replaces the
Audio Preview tab. - Video export —
FileMediaSourceresolves its embeddedFilePath
to a VFS entry; raw.bk2/.mp4/.webm/.movextract byte-for-byte. - Per-profile texture preset, material overrides dialog, and a
keyword auto-detect fallback when suffix/param matching leaves
slots empty. regex_suffixesintexture_presets.json; ships Obduction-style
_DIFF/_NRM/_MASK/_METALLIC_MASKpatterns.- Tree right-click Expand/Collapse and Alt+click recursive expansion
across the asset trees.
Changed
- AES key editing lives only in Manage Profiles; the Unpacker AES
table is gone. - Setup wizard drops the Game Folder and Output Directory pages
(per-game settings live in profiles); replaced by a single Profile
page with "Open Profile Manager…". - Help menu sits to the right of Window in the menu bar.
- Bink (
.bk2) and other Qt-undecodable formats fall back to an
Open Folder shortcut so the asset is still recoverable. - Legal language refreshed across README, About dialog, and first-run
wizard. No license change.
Fixed
- Stale
presets_pathheals to the bundled file when the stored
path is missing — fixes Verify Setup reporting a dead Google Drive
path after the repo move. - Texture resolver no longer pads Obduction master materials with
unrelated keyword textures when the main pass resolved any slot. - Unpacker hand-off only feeds Send-to-Queue files written this
session, not stale PSKs from previous runs. - Categorization fallback — case-insensitive
game_folder, UE
Content/Gamemarker, on-disk top-level folder name as last
resort; reason surfaced in the asset detail dialog.
Verify this release
Each release ZIP ships with a SHA256 checksum and a build-provenance
attestation. After downloading both files you can verify:
# 1. Confirm the ZIP matches the published checksum.
sha256sum --check SHA256SUMS
# 2. Confirm the ZIP was produced by this repository's release workflow.
gh attestation verify EfficientAssetRipper-win-x64.zip --owner exterminathanv0.8.7
Unpacker performance and ergonomics: type-cache-backed asset filtering,
visual type indicators, and dropdown polish.
Added
- Type cache + heuristic scan — asset-type filter resolves without
re-walking the archive, large trees stay responsive. - Visual type indicators on Unpacker rows (mesh / texture / audio / etc.).
Changed
- Headless test suite — Qt tests run with no visible windows.
Fixed
- Unpacker filter dropdowns no longer get stuck or mismatch their state.
Verify this release
Each release ZIP ships with a SHA256 checksum and a build-provenance
attestation. After downloading both files you can verify:
# 1. Confirm the ZIP matches the published checksum.
sha256sum --check SHA256SUMS
# 2. Confirm the ZIP was produced by this repository's release workflow.
gh attestation verify EfficientAssetRipper-win-x64.zip --owner exterminathanv0.8.6
Mesh preview tab plus type-aware right-click previews across the Unpacker
and PSK Picker.
Added
- 3D Mesh Preview tab — full 360° orbit, see-through wireframe, fast load.
- Right-click "Preview Mesh / Texture / Audio / Properties" in the Unpacker;
unexpanded.uassetrows offer all kinds, expanded rows show only the
preview buttons matching their contained types. - Right-click "Preview Mesh" + "Open containing folder" in the PSK Picker.
- Auto-detect UE version from the game executable's
FileVersionInfo.
Changed
- More descriptive preview-failure status — "This asset has no data
to preview" instead of "file exported but file not found". - Optional dependencies cleanup and minor UI polish.
Fixed
- First mesh preview no longer fails with a stale "file not found" — the
resolver rescans the temp dir for both flat and nested CLI layouts. - Mesh previewer: UV-grid crash and wireframe leak between loads.
- Build script clears stale .NET artifacts before publishing CUE4ParseCLI.
Verify this release
Each release ZIP ships with a SHA256 checksum and a build-provenance
attestation. After downloading both files you can verify:
# 1. Confirm the ZIP matches the published checksum.
sha256sum --check SHA256SUMS
# 2. Confirm the ZIP was produced by this repository's release workflow.
gh attestation verify EfficientAssetRipper-win-x64.zip --owner exterminathanv0.8.5
Resilience and UX pass on top of v0.8.0. Full notes:
docs/architecture.md,
docs/troubleshooting.md.
Added
- Queue checkpoint + startup resume prompt for interrupted batches.
- Crash reporter writes redacted JSON under
logs/with a one-click
"Open GitHub issue" path. - Color Scheme dialog: live preview toggle and Reset to Default.
- Settings dialog: Restore Defaults button.
- Synthetic end-to-end pipeline test in CI (no external binaries).
Changed
- Defensive profile loading — corrupt JSON is quarantined to
<name>.json.corrupt-<ts>and the GUI keeps running. - "Set the game folder in Settings" prompts now point at Manage Profiles.
- Architecture / troubleshooting / release notes moved into
docs/.
Fixed
- Theme-aware alert banner and swatch borders pick contrast from the
active scheme instead of hardcoded values. - Long asset paths in the detail dialog wrap and are selectable.
- Several minor cleanups: dead
_terminate_then_killremoved, duplicate
QGroupBoximport dropped, hot-loop status-color lookup hoisted.
Verify this release
Each release ZIP ships with a SHA256 checksum and a build-provenance
attestation. After downloading both files you can verify:
# 1. Confirm the ZIP matches the published checksum.
sha256sum --check SHA256SUMS
# 2. Confirm the ZIP was produced by this repository's release workflow.
gh attestation verify EfficientAssetRipper-win-x64.zip --owner exterminathanv0.8.0
Pre-1.0 hardening release. Sweeping security, reliability, and UX pass across
the GUI, Blender pipeline, CUE4ParseCLI, and the CI/release chain.
Added
- Manage Profiles dialog — per-profile game/output/unpack paths, AES keys,
mappings, and UE version live in a dedicated dropdown + editor instead of the
global Settings panel. - Custom color scheme editor with live swatches alongside the four built-in
themes. - Release verification — every ZIP ships
SHA256SUMSand a signed
build-provenance attestation; release notes embedsha256sum --checkand
gh attestation verifysnippets. - Setup wizard reachable from the Help menu (previously first-run only).
- CHANGELOG enforcement — release workflow refuses to publish a tag without
a matching changelog block. - CUE4ParseCLI
--help/-h//?usage banner. - Per-run nonce protocol — Blender stdout is only trusted on
##ASSET_STATUS:<nonce>##lines so unrelated output can't masquerade as
status. Mirrored in the blend combiner. - Test coverage grew from ~250 to ~470 tests across unit / integration / Qt
tiers; new e2e smoke suite for the real CUE4ParseCLI binary under
tests/e2e/.
Changed
- Profile bar collapsed to a dropdown plus a single Manage Profiles button.
Unpacker-tab edits no longer leak back into the saved profile unless
auto_save_pathsis set. - PathPicker widget hoisted into gui/widgets.py for
consistent path field UX. - Filter rebuilds in PSK picker, asset browser, and text viewer are
debounced — 40k-asset folders stay responsive while typing. - Audio and image previewers decode and
rmtreeonQThreadPoolwith
token-based invalidation so stale loads can't overwrite the active selection. - Texture classifier uses longest-suffix-wins with
priority_orderfrom
the preset JSON breaking ties —_ORcan no longer shadow_ORM. - Material parent chain capped at depth 32; case-mixed cycles terminate.
- Closest-path tiebreaker deterministic (path-len, then lower-cased
string), insulating picks from candidate-list shuffles. - Scan cache version mismatches archived to
scan_*.json.bak.<ts>; backups
older than 30 days pruned on launch. - Processed-state auto-detect symmetric — deleting a
.blendflips state
back to False on the next load. - JobManager terminates the live Blender subprocess on cancel and emits
asset_updated(idx, state_dict)for GUI-thread state application instead of
cross-thread mutation. - MainWindow tracks worker threads, drains them on close, and writes scan
caches off-thread. build.batruns the fast test tiers as step[0b/5]and aborts on
failure; CI builds fail if the CLI cannot be built orversion_info.txt
generation errors out.build_cli.batuses--self-contained true+PublishSingleFileso
dev rebuilds match the shipped artifact.sync.ps1restore is non-destructive; backup additive unless-Force.- Dependabot collapsed to a single weekly grouped PR for GitHub Actions
updates. - CI actions pinned to full SHA + version; default permissions
contents: read, write scopes opted into per-job. PY_PYTHON=3.11pinned in CI so thepylauncher doesn't pick the
runner's 3.14 (no PySide6 wheels). PySide6 upper bound bumped to<7.0.
Fixed
- Alert banner colors and swatch borders now follow the active scheme.
- Long asset paths wrap and are selectable instead of clipping.
- Blender pipe-drain failures are logged instead of swallowed.
- Settings dialog validates path-typed fields before save, clamps the timeout,
and opens presets viaQDesktopServices. Theme.applyskips no-op reapplies and only registers fonts once per process.- Splash always closes even if the finish callback throws.
- Detail dialogs use
WA_DeleteOnClose; menu actions gain&-mnemonics and
standard shortcut keys. - PSK
MATTchunk parser bound-checks dims, returns(names, ok)so corrupt
PSKs surface asscan_failed, and falls back utf-8 / cp1252 / ascii on
material name decode. - blender/material_setup.py uses named mix-node
sockets and aBSDF_RENAMEStable for Blender 4.x socket names
(Subsurface / Specular / Transmission / Sheen / Clearcoat). - blender/process_asset.py treats
CANCELLEDand
"no mesh produced" as hard failures;.blendsave is atomic (tmp file →
os.replace) with a non-zero size check. - blender/combine_blends.py refuses to save when
nothing was appended. - core/props_parser.py reads
utf-8-sig, parses RGBA
in any order, logs JSON errors with lineno/msg. build.batparens insideif (...)blocks escaped — fixes the
was unexpected at this time.abort at step[3/5].test_validate_re_runs_when_mtime_changesflake — explicitos.utimebump
instead of relying on two consecutivewrite_bytescalls landing in distinct
NTFS mtime ticks. Was the sole cause of the recent CI test-gate failures.
Security
- Path traversal —
ProfileManagerCRUD routes through_safe_path,
blocking..\, reserved Windows device names, and inputs that resolve
outsideprofiles/. CUE4ParseCLI gainsSafeJoin()at every write site
(mesh / texture / anim / props / Wwise audio). - DLL planting —
Everything64.dllloader requires an absolute path and
passesLOAD_LIBRARY_SEARCH_SYSTEM32; bare filenames rejected. - Secret redaction — new core/log_redaction.py
maskskey/aes/password/token/secretfields and inline hex
blobs ≥ 32 chars across the root logger, the Blender cmd/stderr surface, and
job log entries. - AES error messages no longer echo raw bytes.
- Update check — GitHub responses capped at 64 KB,
tag_name
shape-validated, off-host redirects refused, non-github.comrelease URLs
stripped before render. - NDJSON DoS — CUE4ParseCLI child killed if its stdout buffer exceeds
16 MB without a newline. - Blender identity probe —
--versionchecked once per session; refuses
to spawn the render subprocess if the banner isn't Blender. Manifest
allowlist (psk extension, absolute output path,.blendsuffix,
outputs-root containment, image-extension texture paths) enforced both
Python-side and Blender-side. - Supply chain — Oodle and vgmstream downloads pinned to tag + SHA-256;
per-entry zip extraction blocks zip-slip. - vgmstream invocation uses
ProcessStartInfo.ArgumentList, eliminating
the prior shell-quoting injection surface. - Newtonsoft pinned to
TypeNameHandling.None. - Stdin oversize cap — 4 MB per-line limit on CUE4ParseCLI.
- Release tag must be an ancestor of
origin/mainbefore publish.
Verify this release
Each release ZIP ships with a SHA256 checksum and a build-provenance
attestation. After downloading both files you can verify:
# 1. Confirm the ZIP matches the published checksum.
sha256sum --check SHA256SUMS
# 2. Confirm the ZIP was produced by this repository's release workflow.
gh attestation verify EfficientAssetRipper-win-x64.zip --owner exterminathanv0.5.0
Initial public beta release.
Added
- Asset Scanner with Everything SDK for
instant search across game directories. - Material Resolver — parses
.props.txtmetadata, follows material
inheritance chains, classifies textures by PBR slot (Base Color, Normal,
ORM, Emissive, Roughness, Metallic, Mask). - Headless Blender pipeline — imports PSK/PSKX, builds full PBR shader
node graphs, saves.blendfiles. Reuses bundledio_scene_psk_psa
extension. - VFS Unpacker — built-in CUE4Parse CLI mounts
.pak/.utocarchives
with AES decryption and exports meshes, textures, animations, and audio. - Batch processing queue with progress tracking, logging, and cancel.
- Per-game profiles for game folder, AES keys, UE version, and processed
asset lists. - Texture preset system with per-material overrides
(data/texture_presets.json). - WWise audio support — scans
AkAudioEventassets, exports WEM, and
converts to WAV/OGG via vgmstream. - Blend Combiner — merge multiple
.blendfiles into a single grid
scene. - First-run setup wizard with auto-detection for Blender, Everything,
and the .NET runtime. - Auto-update check against the GitHub Releases API on startup
(cached for 24 hours, fails silently when offline). - Themeable UI — 4 built-in colour schemes (Dusk, Bloom, Slate,
Midnight) plus a custom scheme editor. - PyInstaller
--onedirbuild producing a portable
EfficientAssetRipper-win-x64.zip. - CI/CD — GitHub Actions workflows for PR/main builds and tag-driven
releases. - Test suite — pytest unit / integration / Qt tiers (~8s),
plus opt-inrequires_blender/requires_everything/
requires_dotnet_clie2e markers. - MIT License and legal disclaimer for asset extraction usage.