Files
hy3d/hunyuan3dweb/cli.py
T
KawasakiAkasei 5328c213fe feat: add on-demand format conversion support (FBX, STL, USDZ, MP4, GIF)
- Discover /creations/resourceConvert endpoint via browser inspection
- Add resource_convert() method to api.py and api_complete.py
- Extend MODEL_FORMAT_KEYS with fbx, stl, usdz, mp4, gif
- Update get_model_urls() and download_model() with include_converted flag
- Update CLI with --converted flag for formats and download commands
- Update reverse engineering docs with native vs converted format tables
2026-05-27 13:42:29 +08:00

83 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""
Hunyuan3D Web CLI
"""
import argparse
import json
import sys
from .api import Hunyuan3DAPI, load_cookies_from_file
from .config import get_cookie_path
_DEFAULT_COOKIE = str(get_cookie_path())
def main():
parser = argparse.ArgumentParser(description="Hunyuan3D Web CLI")
subparsers = parser.add_subparsers(dest="command")
quota_parser = subparsers.add_parser("quota", help="查询配额")
quota_parser.add_argument("--cookies", "-c", default=_DEFAULT_COOKIE, help="Cookie文件路径")
list_parser = subparsers.add_parser("list", help="查询作品列表")
list_parser.add_argument("--cookies", "-c", default=_DEFAULT_COOKIE, help="Cookie文件路径")
text_parser = subparsers.add_parser("text", help="文生3D")
text_parser.add_argument("prompt", help="文本描述")
text_parser.add_argument("--cookies", "-c", default=_DEFAULT_COOKIE, help="Cookie文件路径")
text_parser.add_argument("--title", "-t", default="", help="作品标题")
status_parser = subparsers.add_parser("status", help="查询生成状态")
status_parser.add_argument("creation_id", help="创作ID")
status_parser.add_argument("--cookies", "-c", default=_DEFAULT_COOKIE, help="Cookie文件路径")
formats_parser = subparsers.add_parser("formats", help="列出创作可用下载格式")
formats_parser.add_argument("creation_id", help="创作ID")
formats_parser.add_argument("--converted", action="store_true",
help="包含转换格式 (fbx/stl/usdz/mp4/gif)")
formats_parser.add_argument("--cookies", "-c", default=_DEFAULT_COOKIE, help="Cookie文件路径")
download_parser = subparsers.add_parser("download", help="下载指定格式模型")
download_parser.add_argument("creation_id", help="创作ID")
download_parser.add_argument("--format", "-f", default="glb",
help="格式键名 (默认: glb)")
download_parser.add_argument("--output", "-o", default=None,
help="本地保存路径 (默认自动推断)")
download_parser.add_argument("--converted", action="store_true",
help="若格式为转换格式,自动调用转换接口")
download_parser.add_argument("--cookies", "-c", default=_DEFAULT_COOKIE, help="Cookie文件路径")
args = parser.parse_args()
if not args.command:
parser.print_help()
sys.exit(1)
cookies = load_cookies_from_file(args.cookies)
api = Hunyuan3DAPI(cookies)
if args.command == "quota":
print(json.dumps(api.get_quota_info(), indent=2, ensure_ascii=False))
elif args.command == "list":
print(json.dumps(api.get_creation_list(), indent=2, ensure_ascii=False))
elif args.command == "text":
result = api.generate_text(args.prompt, title=args.title)
print(json.dumps(result, indent=2, ensure_ascii=False))
elif args.command == "status":
print(json.dumps(api.get_generation_status(args.creation_id), indent=2, ensure_ascii=False))
elif args.command == "formats":
urls = api.get_model_urls(args.creation_id, include_converted=args.converted)
if not urls:
print("暂无可用格式,可能生成未完成或失败。", file=sys.stderr)
sys.exit(1)
for key, url in urls.items():
print(f"{key}: {url}")
elif args.command == "download":
path = api.download_model(args.creation_id, args.format, args.output,
include_converted=args.converted)
print(f"已下载: {path}")
if __name__ == "__main__":
main()