Skip to content

Releases: exterminathan/EfficientAssetRipper

v0.8.8

08 May 05:53

Choose a tag to compare

Dockable workspace, profile-aware texture resolution, unified media
preview, and a slimmer setup wizard.

Added

  • Dockable workspace — every panel is a QDockWidget with 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 — FileMediaSource resolves its embedded FilePath
    to a VFS entry; raw .bk2/.mp4/.webm/.mov extract byte-for-byte.
  • Per-profile texture preset, material overrides dialog, and a
    keyword auto-detect fallback when suffix/param matching leaves
    slots empty.
  • regex_suffixes in texture_presets.json; ships Obduction-style
    _DIFF/_NRM/_MASK/_METALLIC_MASK patterns.
  • 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_path heals 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/Game marker, 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 exterminathan

v0.8.7

06 May 20:38

Choose a tag to compare

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 exterminathan

v0.8.6

06 May 05:26

Choose a tag to compare

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 .uasset rows 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 exterminathan

v0.8.5

05 May 07:47

Choose a tag to compare

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_kill removed, duplicate
    QGroupBox import 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 exterminathan

v0.8.0

05 May 06:05

Choose a tag to compare

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 SHA256SUMS and a signed
    build-provenance attestation; release notes embed sha256sum --check and
    gh attestation verify snippets.
  • 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_paths is 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 rmtree on QThreadPool with
    token-based invalidation so stale loads can't overwrite the active selection.
  • Texture classifier uses longest-suffix-wins with priority_order from
    the preset JSON breaking ties — _OR can 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 .blend flips 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.bat runs the fast test tiers as step [0b/5] and aborts on
    failure; CI builds fail if the CLI cannot be built or version_info.txt
    generation errors out.
  • build_cli.bat uses --self-contained true + PublishSingleFile so
    dev rebuilds match the shipped artifact.
  • sync.ps1 restore 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.11 pinned in CI so the py launcher 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 via QDesktopServices.
  • Theme.apply skips 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 MATT chunk parser bound-checks dims, returns (names, ok) so corrupt
    PSKs surface as scan_failed, and falls back utf-8 / cp1252 / ascii on
    material name decode.
  • blender/material_setup.py uses named mix-node
    sockets and a BSDF_RENAMES table for Blender 4.x socket names
    (Subsurface / Specular / Transmission / Sheen / Clearcoat).
  • blender/process_asset.py treats CANCELLED and
    "no mesh produced" as hard failures; .blend save 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.bat parens inside if (...) blocks escaped — fixes the
    was unexpected at this time. abort at step [3/5].
  • test_validate_re_runs_when_mtime_changes flake — explicit os.utime bump
    instead of relying on two consecutive write_bytes calls landing in distinct
    NTFS mtime ticks. Was the sole cause of the recent CI test-gate failures.

Security

  • Path traversalProfileManager CRUD routes through _safe_path,
    blocking ..\, reserved Windows device names, and inputs that resolve
    outside profiles/. CUE4ParseCLI gains SafeJoin() at every write site
    (mesh / texture / anim / props / Wwise audio).
  • DLL plantingEverything64.dll loader requires an absolute path and
    passes LOAD_LIBRARY_SEARCH_SYSTEM32; bare filenames rejected.
  • Secret redaction — new core/log_redaction.py
    masks key / aes / password / token / secret fields 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.com release URLs
    stripped before render.
  • NDJSON DoS — CUE4ParseCLI child killed if its stdout buffer exceeds
    16 MB without a newline.
  • Blender identity probe--version checked once per session; refuses
    to spawn the render subprocess if the banner isn't Blender. Manifest
    allowlist (psk extension, absolute output path, .blend suffix,
    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/main before 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 exterminathan

v0.5.0

26 Apr 20:48

Choose a tag to compare

Initial public beta release.

Added

  • Asset Scanner with Everything SDK for
    instant search across game directories.
  • Material Resolver — parses .props.txt metadata, 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 .blend files. Reuses bundled io_scene_psk_psa
    extension.
  • VFS Unpacker — built-in CUE4Parse CLI mounts .pak/.utoc archives
    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 AkAudioEvent assets, exports WEM, and
    converts to WAV/OGG via vgmstream.
  • Blend Combiner — merge multiple .blend files 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 --onedir build 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-in requires_blender / requires_everything /
    requires_dotnet_cli e2e markers.
  • MIT License and legal disclaimer for asset extraction usage.