mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-25 07:05:43 -03:00
feat: add license information handling for Civitai models
Add license resolution utilities and integrate license information into model metadata processing. The changes include: - Add `resolve_license_payload` function to extract license data from Civitai model responses - Integrate license information into model metadata in CivitaiClient and MetadataSyncService - Add license flags support in model scanning and caching - Implement CommercialUseLevel enum for standardized license classification - Update model scanner to handle unknown fields when extracting metadata values This ensures proper license attribution and compliance when working with Civitai models.
This commit is contained in:
@@ -11,7 +11,8 @@ from py.services import model_scanner
|
||||
from py.services.model_cache import ModelCache
|
||||
from py.services.model_hash_index import ModelHashIndex
|
||||
from py.services.model_scanner import CacheBuildResult, ModelScanner
|
||||
from py.services.persistent_model_cache import PersistentModelCache
|
||||
from py.services.persistent_model_cache import PersistentModelCache, DEFAULT_LICENSE_FLAGS
|
||||
from py.utils.civitai_utils import build_license_flags
|
||||
from py.utils.models import BaseModelMetadata
|
||||
|
||||
|
||||
@@ -122,6 +123,7 @@ async def test_initialize_cache_populates_cache(tmp_path: Path):
|
||||
_normalize_path(tmp_path / "one.txt"),
|
||||
_normalize_path(tmp_path / "nested" / "two.txt"),
|
||||
}
|
||||
assert {item["license_flags"] for item in cache.raw_data} == {DEFAULT_LICENSE_FLAGS}
|
||||
|
||||
assert scanner._hash_index.get_path("hash-one") == _normalize_path(tmp_path / "one.txt")
|
||||
assert scanner._hash_index.get_path("hash-two") == _normalize_path(tmp_path / "nested" / "two.txt")
|
||||
@@ -179,12 +181,49 @@ async def test_initialize_in_background_applies_scan_result(tmp_path: Path, monk
|
||||
_normalize_path(tmp_path / "one.txt"),
|
||||
_normalize_path(tmp_path / "nested" / "two.txt"),
|
||||
}
|
||||
assert {item["license_flags"] for item in cache.raw_data} == {DEFAULT_LICENSE_FLAGS}
|
||||
assert scanner._hash_index.get_path("hash-two") == _normalize_path(tmp_path / "nested" / "two.txt")
|
||||
assert scanner._tags_count == {"alpha": 1, "beta": 1}
|
||||
assert scanner._excluded_models == [_normalize_path(tmp_path / "skip-file.txt")]
|
||||
assert ws_stub.payloads[-1]["progress"] == 100
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_build_cache_entry_encodes_license_flags(tmp_path: Path):
|
||||
scanner = DummyScanner(tmp_path)
|
||||
|
||||
metadata = {
|
||||
"file_path": _normalize_path(tmp_path / "sample.txt"),
|
||||
"file_name": "sample",
|
||||
"model_name": "Sample",
|
||||
"folder": "",
|
||||
"size": 1,
|
||||
"modified": 1.0,
|
||||
"sha256": "hash",
|
||||
"tags": [],
|
||||
"civitai": {
|
||||
"model": {
|
||||
"allowNoCredit": False,
|
||||
"allowCommercialUse": ["Image", "Rent"],
|
||||
"allowDerivatives": True,
|
||||
"allowDifferentLicense": False,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
expected_flags = build_license_flags(
|
||||
{
|
||||
"allowNoCredit": False,
|
||||
"allowCommercialUse": ["Image", "Rent"],
|
||||
"allowDerivatives": True,
|
||||
"allowDifferentLicense": False,
|
||||
}
|
||||
)
|
||||
|
||||
entry = scanner._build_cache_entry(metadata)
|
||||
assert entry["license_flags"] == expected_flags
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_initialize_in_background_uses_persisted_cache_without_full_scan(tmp_path: Path, monkeypatch):
|
||||
monkeypatch.setenv('LORA_MANAGER_DISABLE_PERSISTENT_CACHE', '0')
|
||||
|
||||
Reference in New Issue
Block a user