huge refactor of plugin system
This commit is contained in:
+111
-19
@@ -337,6 +337,13 @@ class Add_File(Cmdlet):
|
||||
except Exception as exc:
|
||||
debug(f"[add-file] Directory scan failed: {exc}")
|
||||
|
||||
if result is None and not path_arg and not explicit_path_list_results and not dir_scan_results:
|
||||
try:
|
||||
if ctx.get_stage_context() is not None:
|
||||
return 0
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Determine if -store targets a registered backend (vs a filesystem export path).
|
||||
is_storage_backend_location = False
|
||||
if location:
|
||||
@@ -354,6 +361,19 @@ class Add_File(Cmdlet):
|
||||
)
|
||||
return 1
|
||||
|
||||
plugin_storage_backend = None
|
||||
if plugin_name:
|
||||
plugin_storage_backend = Add_File._resolve_plugin_storage_backend(
|
||||
plugin_name,
|
||||
plugin_instance,
|
||||
config,
|
||||
store_instance=storage_registry,
|
||||
)
|
||||
|
||||
effective_storage_backend_name = plugin_storage_backend or (
|
||||
str(location) if location and is_storage_backend_location else None
|
||||
)
|
||||
|
||||
# Decide which items to process.
|
||||
# - If directory scan was performed, use those results
|
||||
# - If user provided -path (and it was not reinterpreted as destination), treat this invocation as single-item.
|
||||
@@ -371,13 +391,6 @@ class Add_File(Cmdlet):
|
||||
else:
|
||||
items_to_process = [result]
|
||||
|
||||
if result is None and not path_arg and not explicit_path_list_results and not dir_scan_results:
|
||||
try:
|
||||
if ctx.get_stage_context() is not None:
|
||||
return 0
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
total_items = len(items_to_process) if isinstance(items_to_process, list) else 0
|
||||
processed_items = 0
|
||||
try:
|
||||
@@ -549,15 +562,16 @@ class Add_File(Cmdlet):
|
||||
live_progress = None
|
||||
|
||||
want_final_search_file = (
|
||||
bool(is_last_stage) and bool(is_storage_backend_location)
|
||||
and bool(location) and bool(live_progress)
|
||||
bool(is_last_stage)
|
||||
and bool(effective_storage_backend_name)
|
||||
and bool(live_progress)
|
||||
)
|
||||
auto_search_file_after_add = False
|
||||
|
||||
# When ingesting multiple items into a backend store, defer URL association and
|
||||
# apply it once at the end (bulk) to avoid per-item URL API calls.
|
||||
defer_url_association = (
|
||||
bool(is_storage_backend_location) and bool(location)
|
||||
bool(effective_storage_backend_name)
|
||||
and len(items_to_process) > 1
|
||||
)
|
||||
|
||||
@@ -642,7 +656,7 @@ class Add_File(Cmdlet):
|
||||
|
||||
# When using -path (filesystem export), allow all file types.
|
||||
# When using -store (backend), restrict to SUPPORTED_MEDIA_EXTENSIONS.
|
||||
allow_all_files = not (location and is_storage_backend_location)
|
||||
allow_all_files = not bool(effective_storage_backend_name)
|
||||
if not self._validate_source(media_path, allow_all_extensions=allow_all_files):
|
||||
failures += 1
|
||||
continue
|
||||
@@ -653,14 +667,33 @@ class Add_File(Cmdlet):
|
||||
progress.step("ingesting file")
|
||||
|
||||
if plugin_name:
|
||||
code = self._handle_plugin_upload(
|
||||
media_path,
|
||||
plugin_name,
|
||||
plugin_instance,
|
||||
pipe_obj,
|
||||
config,
|
||||
delete_after_item
|
||||
)
|
||||
if effective_storage_backend_name:
|
||||
code = self._handle_storage_backend(
|
||||
item,
|
||||
media_path,
|
||||
effective_storage_backend_name,
|
||||
pipe_obj,
|
||||
config,
|
||||
delete_after_item,
|
||||
collect_payloads=collected_payloads,
|
||||
collect_relationship_pairs=pending_relationship_pairs,
|
||||
defer_url_association=defer_url_association,
|
||||
pending_url_associations=pending_url_associations,
|
||||
defer_tag_association=defer_url_association,
|
||||
pending_tag_associations=pending_tag_associations,
|
||||
suppress_last_stage_overlay=want_final_search_file,
|
||||
auto_search_file=auto_search_file_after_add,
|
||||
store_instance=storage_registry,
|
||||
)
|
||||
else:
|
||||
code = self._handle_plugin_upload(
|
||||
media_path,
|
||||
plugin_name,
|
||||
plugin_instance,
|
||||
pipe_obj,
|
||||
config,
|
||||
delete_after_item
|
||||
)
|
||||
if code == 0:
|
||||
successes += 1
|
||||
else:
|
||||
@@ -1431,6 +1464,65 @@ class Add_File(Cmdlet):
|
||||
normalized = normalized.split(".", 1)[0]
|
||||
return normalized
|
||||
|
||||
@staticmethod
|
||||
def _resolve_plugin_storage_backend(
|
||||
plugin_name: Optional[Any],
|
||||
instance_name: Optional[Any],
|
||||
config: Dict[str, Any],
|
||||
*,
|
||||
store_instance: Optional[Any] = None,
|
||||
) -> Optional[str]:
|
||||
plugin_key = Add_File._normalize_provider_key(plugin_name)
|
||||
if not plugin_key:
|
||||
return None
|
||||
|
||||
from ProviderCore.registry import get_plugin_with_capability
|
||||
|
||||
file_provider = get_plugin_with_capability(plugin_key, "upload", config)
|
||||
if file_provider is None:
|
||||
return None
|
||||
|
||||
resolver = getattr(file_provider, "resolve_backend", None)
|
||||
if not callable(resolver):
|
||||
return None
|
||||
|
||||
explicit_instance = str(instance_name or "").strip() or None
|
||||
try:
|
||||
storage = store_instance if store_instance is not None else Store(config)
|
||||
except Exception:
|
||||
storage = None
|
||||
|
||||
try:
|
||||
resolved_name, backend = resolver(
|
||||
explicit_instance,
|
||||
storage=storage,
|
||||
require_explicit=bool(explicit_instance),
|
||||
)
|
||||
except TypeError:
|
||||
try:
|
||||
resolved_name, backend = resolver(explicit_instance)
|
||||
except Exception:
|
||||
return None
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
if backend is None:
|
||||
return None
|
||||
|
||||
resolved_text = str(resolved_name or explicit_instance or "").strip()
|
||||
if not resolved_text:
|
||||
return None
|
||||
|
||||
checker = getattr(file_provider, "is_backend", None)
|
||||
if callable(checker):
|
||||
try:
|
||||
if not checker(backend, resolved_text):
|
||||
return None
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
return resolved_text
|
||||
|
||||
@staticmethod
|
||||
def _maybe_download_plugin_result(
|
||||
result: Any,
|
||||
|
||||
Reference in New Issue
Block a user