updating and refining plugin system refactor
This commit is contained in:
+42
-9
@@ -15,6 +15,7 @@ from SYS.logger import log, debug, debug_panel, is_debug_enabled
|
||||
from SYS.payload_builders import build_table_result_payload
|
||||
from SYS.pipeline_progress import PipelineProgress
|
||||
from SYS.result_publication import overlay_existing_result_table, publish_result_table
|
||||
from SYS.rich_display import show_available_plugins_panel, show_plugin_config_panel
|
||||
from SYS.utils_constant import ALL_SUPPORTED_EXTENSIONS
|
||||
from Store import Store
|
||||
from API.HTTP import _download_direct_file
|
||||
@@ -178,10 +179,11 @@ class Add_File(Cmdlet):
|
||||
summary=
|
||||
"Ingest a local media file to a store backend, upload plugin, or local directory.",
|
||||
usage=
|
||||
"add-file (-path <filepath> | <piped>) (-storage <location> | -plugin <upload-plugin>) [-delete]",
|
||||
"add-file (-path <filepath> | <piped>) (-store <backend|path> | -plugin <upload-plugin>) [-instance NAME] [-delete]",
|
||||
arg=[
|
||||
SharedArgs.PATH,
|
||||
SharedArgs.STORE,
|
||||
SharedArgs.INSTANCE,
|
||||
SharedArgs.URL,
|
||||
SharedArgs.PLUGIN,
|
||||
CmdletArg(
|
||||
@@ -194,7 +196,7 @@ class Add_File(Cmdlet):
|
||||
],
|
||||
detail=[
|
||||
"Note: add-file ingests local files. To fetch remote sources, use download-file and pipe into add-file.",
|
||||
"- Storage location options (use -storage):",
|
||||
"- Storage location options (use -store):",
|
||||
" hydrus: Upload to Hydrus database with metadata tagging",
|
||||
" local: Copy file to local directory",
|
||||
" <path>: Copy file to specified directory",
|
||||
@@ -202,9 +204,12 @@ class Add_File(Cmdlet):
|
||||
" 0x0: Upload to 0x0.st for temporary hosting",
|
||||
" file.io: Upload to file.io for temporary hosting",
|
||||
" internetarchive: Upload to archive.org (optional tag: ia:<identifier> to upload into an existing item)",
|
||||
"- Use -instance with -plugin to target a named provider config: add-file -plugin ftp -instance archive -path C:\\Media\\file.pdf",
|
||||
"- In plugin mode, -store <name> is still accepted as a compatibility alias for -instance <name>.",
|
||||
],
|
||||
examples=[
|
||||
'download-file "https://themathesontrust.org/papers/christianity/alcock-alphabet1.pdf" | add-file -store tutorial',
|
||||
'add-file -plugin ftp -instance archive -path C:\\Media\\report.pdf',
|
||||
],
|
||||
exec=self.run,
|
||||
)
|
||||
@@ -223,9 +228,12 @@ class Add_File(Cmdlet):
|
||||
|
||||
path_arg = parsed.get("path")
|
||||
location = parsed.get("store")
|
||||
plugin_instance = parsed.get("instance")
|
||||
source_url_arg = parsed.get("url")
|
||||
plugin_name = parsed.get("plugin")
|
||||
delete_after = parsed.get("delete", False)
|
||||
if plugin_name and not plugin_instance and location:
|
||||
plugin_instance = location
|
||||
|
||||
# Convenience: when piping a file into add-file, allow `-path <existing dir>`
|
||||
# to act as the destination export directory.
|
||||
@@ -412,6 +420,7 @@ class Add_File(Cmdlet):
|
||||
("items", total_items),
|
||||
("location", location),
|
||||
("plugin", plugin_name),
|
||||
("instance", plugin_instance),
|
||||
("delete", delete_after),
|
||||
],
|
||||
border_style="cyan",
|
||||
@@ -647,6 +656,7 @@ class Add_File(Cmdlet):
|
||||
code = self._handle_plugin_upload(
|
||||
media_path,
|
||||
plugin_name,
|
||||
plugin_instance,
|
||||
pipe_obj,
|
||||
config,
|
||||
delete_after_item
|
||||
@@ -1442,9 +1452,9 @@ class Add_File(Cmdlet):
|
||||
if not plugin_key:
|
||||
return None, None, None
|
||||
|
||||
from ProviderCore.registry import get_search_plugin
|
||||
from ProviderCore.registry import get_plugin
|
||||
|
||||
plugin = get_search_plugin(plugin_key, config)
|
||||
plugin = get_plugin(plugin_key, config)
|
||||
if plugin is None:
|
||||
return None, None, None
|
||||
|
||||
@@ -1762,6 +1772,7 @@ class Add_File(Cmdlet):
|
||||
*,
|
||||
hash_value: str,
|
||||
store: str,
|
||||
provider: Optional[str] = None,
|
||||
path: Optional[str],
|
||||
tag: List[str],
|
||||
title: Optional[str],
|
||||
@@ -1770,6 +1781,7 @@ class Add_File(Cmdlet):
|
||||
) -> None:
|
||||
pipe_obj.hash = hash_value
|
||||
pipe_obj.store = store
|
||||
pipe_obj.provider = provider
|
||||
pipe_obj.is_temp = False
|
||||
pipe_obj.path = path
|
||||
pipe_obj.tag = tag
|
||||
@@ -2180,23 +2192,42 @@ class Add_File(Cmdlet):
|
||||
def _handle_plugin_upload(
|
||||
media_path: Path,
|
||||
plugin_name: str,
|
||||
instance_name: Optional[str],
|
||||
pipe_obj: models.PipeObject,
|
||||
config: Dict[str,
|
||||
Any],
|
||||
delete_after: bool,
|
||||
) -> int:
|
||||
"""Handle uploading via an upload plugin (e.g. 0x0)."""
|
||||
from ProviderCore.registry import get_upload_plugin
|
||||
from ProviderCore.registry import (
|
||||
get_plugin_with_capability,
|
||||
list_plugin_names_with_capability,
|
||||
list_plugins_with_capability,
|
||||
)
|
||||
|
||||
log(f"Uploading via {plugin_name}: {media_path.name}", file=sys.stderr)
|
||||
|
||||
try:
|
||||
file_provider = get_upload_plugin(plugin_name, config)
|
||||
file_provider = get_plugin_with_capability(plugin_name, "upload", config)
|
||||
if not file_provider:
|
||||
log(f"Upload plugin '{plugin_name}' not available", file=sys.stderr)
|
||||
available_map = list_plugins_with_capability("upload", config)
|
||||
known_upload_plugins = set(list_plugin_names_with_capability("upload"))
|
||||
available_uploads = [name for name, enabled in available_map.items() if enabled and name in known_upload_plugins]
|
||||
|
||||
if str(plugin_name or "").strip().lower() in known_upload_plugins:
|
||||
show_plugin_config_panel([plugin_name])
|
||||
else:
|
||||
log(f"Upload plugin '{plugin_name}' is not available or does not support upload", file=sys.stderr)
|
||||
|
||||
if available_uploads:
|
||||
show_available_plugins_panel(sorted(available_uploads))
|
||||
return 1
|
||||
|
||||
hoster_url = file_provider.upload(str(media_path), pipe_obj=pipe_obj)
|
||||
hoster_url = file_provider.upload(
|
||||
str(media_path),
|
||||
pipe_obj=pipe_obj,
|
||||
instance=instance_name,
|
||||
)
|
||||
log(f"File uploaded: {hoster_url}", file=sys.stderr)
|
||||
|
||||
f_hash = Add_File._resolve_file_hash(None, media_path, pipe_obj, None)
|
||||
@@ -2209,6 +2240,7 @@ class Add_File(Cmdlet):
|
||||
extra_updates: Dict[str,
|
||||
Any] = {
|
||||
"plugin": plugin_name,
|
||||
"instance": instance_name,
|
||||
"plugin_url": hoster_url,
|
||||
}
|
||||
if isinstance(pipe_obj.extra, dict):
|
||||
@@ -2222,7 +2254,8 @@ class Add_File(Cmdlet):
|
||||
Add_File._update_pipe_object_destination(
|
||||
pipe_obj,
|
||||
hash_value=f_hash or "unknown",
|
||||
store=plugin_name or "plugin",
|
||||
store="",
|
||||
provider=plugin_name or None,
|
||||
path=file_path,
|
||||
tag=pipe_obj.tag,
|
||||
title=pipe_obj.title or (media_path.name if media_path else None),
|
||||
|
||||
Reference in New Issue
Block a user