From 2dfe3c5128cd0cf75177afc5cecf25b66e70853e Mon Sep 17 00:00:00 2001 From: Adam Ladachowski Date: Sat, 24 Jan 2026 19:24:38 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=AC=20Commit=20message:=20Update=20202?= =?UTF-8?q?6-01-24=2019:24:38,=201=20files,=2052=20lines?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 📁 Files changed: 1 📝 Lines changed: 52 • sft_get.py --- sft_get.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/sft_get.py b/sft_get.py index d4649ef..0f60bc5 100644 --- a/sft_get.py +++ b/sft_get.py @@ -226,6 +226,44 @@ def display_results( _display_civitai_data(civitai_data) +def get_base_name(file_path: Path) -> str: + """Get base filename without .safetensors extension.""" + name = file_path.name + for ext in (".safetensors", ".sft"): + if name.lower().endswith(ext): + return name[: -len(ext)] + return file_path.stem + + +def save_metadata( + file_path: Path, + sha256_hash: str, + local_metadata: dict[str, Any], + civitai_data: dict[str, Any] | None, +) -> tuple[Path, Path]: + """Save metadata JSON and SHA256 hash to files alongside the model.""" + base_name = get_base_name(file_path) + parent = file_path.parent + + # Save JSON metadata + json_path = parent / f"{base_name}-xm.json" + output = { + "file": str(file_path), + "sha256": sha256_hash, + "header_size": local_metadata["header_size"], + "tensor_count": local_metadata["tensor_count"], + "metadata": local_metadata["metadata"], + "civitai": civitai_data, + } + json_path.write_text(json.dumps(output, indent=2)) + + # Save SHA256 hash + sha_path = parent / f"{base_name}-xm.sha256" + sha_path.write_text(f"{sha256_hash} {file_path.name}\n") + + return json_path, sha_path + + def main() -> int: """Main entry point.""" parser = argparse.ArgumentParser( @@ -254,6 +292,11 @@ def main() -> int: dest="json_output", help="Output results as JSON", ) + parser.add_argument( + "--save", + action="store_true", + help="Save metadata JSON and SHA256 hash alongside the model file", + ) args = parser.parse_args() @@ -292,6 +335,15 @@ def main() -> int: else: display_results(file_path, local_metadata, sha256_hash, civitai_data) + # Save files if requested + if args.save: + json_path, sha_path = save_metadata( + file_path, sha256_hash, local_metadata, civitai_data + ) + console.print() + console.print(f"[green]Saved:[/green] {json_path}") + console.print(f"[green]Saved:[/green] {sha_path}") + return 0 except ValueError as e: