mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-02-19 06:30:07 +00:00
- Make blake3 import lazy in hashing.py (only imported when needed) - Add compute_hashes parameter to AssetSeeder.start(), build_asset_specs(), and seed_assets() - Fix missing tag clearing: include is_missing states in sync when update_missing_tags=True - Clear is_missing flag on cache states when files are restored with matching mtime/size - Fix validation error serialization in routes.py (use json.loads(ve.json())) Amp-Thread-ID: https://ampcode.com/threads/T-019c3614-56d4-74a8-a717-19922d6dbbee Co-authored-by: Amp <amp@ampcode.com>
68 lines
1.5 KiB
Python
68 lines
1.5 KiB
Python
import asyncio
|
|
import os
|
|
from typing import IO
|
|
|
|
DEFAULT_CHUNK = 8 * 1024 * 1024
|
|
|
|
_blake3 = None
|
|
|
|
|
|
def _get_blake3():
|
|
global _blake3
|
|
if _blake3 is None:
|
|
try:
|
|
from blake3 import blake3 as _b3
|
|
_blake3 = _b3
|
|
except ImportError:
|
|
raise ImportError(
|
|
"blake3 is required for asset hashing. Install with: pip install blake3"
|
|
)
|
|
return _blake3
|
|
|
|
|
|
def compute_blake3_hash(
|
|
fp: str | IO[bytes],
|
|
chunk_size: int = DEFAULT_CHUNK,
|
|
) -> str:
|
|
if hasattr(fp, "read"):
|
|
return _hash_file_obj(fp, chunk_size)
|
|
|
|
with open(os.fspath(fp), "rb") as f:
|
|
return _hash_file_obj(f, chunk_size)
|
|
|
|
|
|
async def compute_blake3_hash_async(
|
|
fp: str | IO[bytes],
|
|
chunk_size: int = DEFAULT_CHUNK,
|
|
) -> str:
|
|
if hasattr(fp, "read"):
|
|
return await asyncio.to_thread(compute_blake3_hash, fp, chunk_size)
|
|
|
|
def _worker() -> str:
|
|
with open(os.fspath(fp), "rb") as f:
|
|
return _hash_file_obj(f, chunk_size)
|
|
|
|
return await asyncio.to_thread(_worker)
|
|
|
|
|
|
def _hash_file_obj(file_obj: IO, chunk_size: int = DEFAULT_CHUNK) -> str:
|
|
if chunk_size <= 0:
|
|
chunk_size = DEFAULT_CHUNK
|
|
|
|
orig_pos = file_obj.tell()
|
|
|
|
try:
|
|
if orig_pos != 0:
|
|
file_obj.seek(0)
|
|
|
|
h = _get_blake3()()
|
|
while True:
|
|
chunk = file_obj.read(chunk_size)
|
|
if not chunk:
|
|
break
|
|
h.update(chunk)
|
|
return h.hexdigest()
|
|
finally:
|
|
if orig_pos != 0:
|
|
file_obj.seek(orig_pos)
|