What’s up y’all?! ![]()
I’m excited to share a new, Xenosaga Episode III extractor that automatically slices assets straight from the XS3 disc one and 2 ISO files using Python + 7-Zip.
Although this functionality has been available to us via the Lybac tools for a while, the transition to Python makes the process cross-platform and future proof. It’s also much less sketchy than running a mystery .exe from over 20 years ago. I’m hoping that this tool will help the community continue to research the disc. I am also hoping to eventually get it to generate its own LBAs (a current limitation of this script that the Lybac exes self-resolve) but I will go ahead and post the current version so folks can work with it. Please download it below.
https://lifehold.godsibb.net/seafhttp/f/20a3e1c33945465f861f/?op=view
Note: this is very much a work in progress. Lybac’s .exes are still the most reliable method of extraction and some files may come through corrupt when you run the above. Hoping to fix it in the near future.
[HEADING=1]Requirements[/HEADING]
[LIST]
[*]Python 3.8+
[*]7-Zip (7z.exe on Windows; p7zip package on macOS/Linux)
[]A Xenosaga Episode III ISO (Disc 1 or Disc 2)
[]~5–10 GB free disk space per disc
[/LIST]
[HEADING=1]Quick start (Windows)[/HEADING]
Place your .iso file inside of the folder.
Open a terminal in the tool’s folder and run:
[CODE]REM 0) Sanity check: tells you what’s missing
python cli.py doctor --work .
REM 1) Prep: builds container_map.json + extracts X3.* banks with 7-Zip
python cli.py prep --iso “Xenosaga Episode III - Also sprach Zarathustra (USA) (Disc 1).iso” --work . --sevenzip “C:\Program Files\7-Zip\7z.exe”
REM 2) (Optional) TOC summary from LBA tables
python cli.py toc --work .
REM 3) Build the extraction manifest (maps offsets → banks)
python cli.py scan --work . --sniff
REM 4) Dry-run (no files written; logs what would happen)
python cli.py extract --work . --out .\dump --dry-run
REM 5) Real extract (add --hash for SHA-1s)
python cli.py extract --work . --out .\dump --hash
REM 6) Quick verification of a subset
python cli.py verify --work . --out .\dump --limit 200
[/CODE]
[HEADING=2]macOS / Linux[/HEADING]
python3 cli.py doctor --work .
python3 cli.py prep --iso "Xenosaga Episode III - Also sprach Zarathustra (USA) (Disc 1).iso" --work .
python3 cli.py toc --work .
python3 cli.py scan --work . --sniff
python3 cli.py extract --work . --out ./dump --dry-run
python3 cli.py extract --work . --out ./dump --hash
python3 cli.py verify --work . --out ./dump --limit 200
[HEADING=1]What you’ll get[/HEADING]
[LIST]
[]X3. banks extracted to your work folder
[]disc_7z_list.txt + container_map.json
[]out/manifest_merged.csv + out/dry_run_summary.json
[]Game files dumped under dump
[]Logs & (optional) hashes in dump_reports\…
[/LIST]
[HEADING=1]Troubleshooting[/HEADING]
[LIST]
[*]“Missing container_map.json / X3. banks”* → run prep (or build the map with container-map + extract banks via 7-Zip manually).
[*]“No Lba files found” → make sure Lba0/1/2.txt are in .\lba.
[*]7-Zip not found → pass --sevenzip with the full path to 7z.exe, or install p7zip.
[*]Relative import error → run from the folder that contains cli.py:
[/LIST]
cd Xenosaga3Extractor
python cli.py doctor --work .
[LIST]
[*]Unmapped/out_of_bounds rows get skipped by design; check out/manifest_merged.csv and _reports/extract.log.
[/LIST]
[HEADING=1]Disc 2[/HEADING]
Use a separate folder (to avoid mixing banks/manifests), then repeat the same steps.
I plan to keep building on this pretty heavily so I would love to hear feedback about it. I did rely on LLMs quite a bit for some of the heavy lifting analyzing the files and creating the python code, but it has been tested on my own machine and verified to work.
Please let me know if you have questions.
Thanks!