mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-04 16:57:31 +08:00
- Fix _hash_file_obj not restoring file position when orig_pos == 0 - Fix validate_path_within_base swallowing its own ValueError - Guard against tags=None crash in upload_from_temp_path - Filter is_missing references from list_references_page results - Include Decimal in metadata filter isinstance check - Return 403 instead of 404 for PermissionError in update/add_tags routes - Re-disable seeder after non-blocking start with --disable-assets-autoscan - Remove duplicate HashMismatchError/DependencyMissingError from schemas_in - Move _emit_event outside lock in seeder resume() to prevent deadlock - Fix total_q ignoring owner_id in list_tags_with_usage - Capture ORM attributes before commit in resolve_asset_for_download - Remove dead code (if mime_type is None: pass) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
54 lines
1.2 KiB
Python
54 lines
1.2 KiB
Python
import asyncio
|
|
import os
|
|
from typing import IO
|
|
|
|
from blake3 import blake3
|
|
|
|
DEFAULT_CHUNK = 8 * 1024 * 1024
|
|
|
|
|
|
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 = blake3()
|
|
while True:
|
|
chunk = file_obj.read(chunk_size)
|
|
if not chunk:
|
|
break
|
|
h.update(chunk)
|
|
return h.hexdigest()
|
|
finally:
|
|
file_obj.seek(orig_pos)
|