feat(settings): skip previously downloaded model versions

This commit is contained in:
Will Miao
2026-04-03 19:01:19 +08:00
parent 33a7f07558
commit d36b16c213
18 changed files with 302 additions and 11 deletions

View File

@@ -64,6 +64,19 @@ class DownloadManager:
"""Get the checkpoint scanner from registry"""
return await ServiceRegistry.get_checkpoint_scanner()
async def _has_been_downloaded(self, model_type: str, model_version_id: int) -> bool:
try:
history_service = await ServiceRegistry.get_downloaded_version_history_service()
return await history_service.has_been_downloaded(model_type, model_version_id)
except Exception as exc:
logger.debug(
"Failed to read download history for %s version %s: %s",
model_type,
model_version_id,
exc,
)
return False
async def download_from_civitai(
self,
model_id: int = None,
@@ -355,6 +368,57 @@ class DownloadManager:
"error": f'Model type "{model_type_from_info}" is not supported for download',
}
resolved_version_id = model_version_id
raw_version_id = version_info.get("id")
if resolved_version_id is None and raw_version_id is not None:
try:
resolved_version_id = int(raw_version_id)
except (TypeError, ValueError):
resolved_version_id = None
if (
get_settings_manager().get_skip_previously_downloaded_model_versions()
and resolved_version_id is not None
and await self._has_been_downloaded(model_type, resolved_version_id)
):
file_name = ""
files = version_info.get("files")
if isinstance(files, list):
primary_file = next(
(
file_info
for file_info in files
if isinstance(file_info, dict) and file_info.get("primary")
),
None,
)
selected_file = primary_file
if selected_file is None:
selected_file = next(
(file_info for file_info in files if isinstance(file_info, dict)),
None,
)
if isinstance(selected_file, dict):
raw_file_name = selected_file.get("name", "")
if isinstance(raw_file_name, str):
file_name = raw_file_name.strip()
message = (
f"Skipped download for '{file_name or version_info.get('name') or f'model_version:{resolved_version_id}'}' "
f"because version {resolved_version_id} was already downloaded before"
)
logger.info(message)
return {
"success": True,
"skipped": True,
"status": "skipped",
"reason": "previously_downloaded_version",
"message": message,
"model_version_id": resolved_version_id,
"file_name": file_name,
"download_id": download_id,
}
excluded_base_models = get_settings_manager().get_download_skip_base_models()
base_model_value = version_info.get("baseModel", "")
if (

View File

@@ -91,6 +91,7 @@ DEFAULT_SETTINGS: Dict[str, Any] = {
"update_flag_strategy": "same_base",
"auto_organize_exclusions": [],
"metadata_refresh_skip_paths": [],
"skip_previously_downloaded_model_versions": False,
"download_skip_base_models": [],
}
@@ -314,6 +315,10 @@ class SettingsManager:
self.settings["download_skip_base_models"] = []
inserted_defaults = True
if "skip_previously_downloaded_model_versions" not in self.settings:
self.settings["skip_previously_downloaded_model_versions"] = False
inserted_defaults = True
had_mature_level = "mature_blur_level" in self.settings
raw_mature_level = self.settings.get("mature_blur_level")
normalized_mature_level = self.normalize_mature_blur_level(raw_mature_level)
@@ -1090,6 +1095,17 @@ class SettingsManager:
self._save_settings()
return base_models
def get_skip_previously_downloaded_model_versions(self) -> bool:
value = self.settings.get("skip_previously_downloaded_model_versions", False)
if isinstance(value, bool):
return value
normalized = False
if isinstance(value, str):
normalized = value.strip().lower() in {"1", "true", "yes", "on"}
self.settings["skip_previously_downloaded_model_versions"] = normalized
self._save_settings()
return normalized
def get_extra_folder_paths(self) -> Dict[str, List[str]]:
"""Get extra folder paths for the active library.