dfd
This commit is contained in:
@@ -12,6 +12,7 @@ import models
|
||||
import pipeline as ctx
|
||||
from API import HydrusNetwork as hydrus_wrapper
|
||||
from SYS.logger import log, debug
|
||||
from SYS.pipeline_progress import PipelineProgress
|
||||
from SYS.utils_constant import ALL_SUPPORTED_EXTENSIONS
|
||||
from Store import Store
|
||||
from . import _shared as sh
|
||||
@@ -73,6 +74,7 @@ class Add_File(Cmdlet):
|
||||
def run(self, result: Any, args: Sequence[str], config: Dict[str, Any]) -> int:
|
||||
"""Main execution entry point."""
|
||||
parsed = parse_cmdlet_args(args, self)
|
||||
progress = PipelineProgress(ctx)
|
||||
|
||||
path_arg = parsed.get("path")
|
||||
location = parsed.get("store")
|
||||
@@ -80,6 +82,35 @@ class Add_File(Cmdlet):
|
||||
provider_room = parsed.get("room")
|
||||
delete_after = parsed.get("delete", False)
|
||||
|
||||
# Convenience: when piping a file into add-file, allow `-path <existing dir>`
|
||||
# to act as the destination export directory.
|
||||
# Example: screen-shot "https://..." | add-file -path "C:\Users\Admin\Desktop"
|
||||
if path_arg and not location and not provider_name:
|
||||
try:
|
||||
candidate_dir = Path(str(path_arg))
|
||||
if candidate_dir.exists() and candidate_dir.is_dir():
|
||||
piped_items = result if isinstance(result, list) else [result]
|
||||
has_local_source = False
|
||||
for it in piped_items:
|
||||
try:
|
||||
po = coerce_to_pipe_object(it, None)
|
||||
src = str(getattr(po, "path", "") or "").strip()
|
||||
if not src:
|
||||
continue
|
||||
if src.lower().startswith(("http://", "https://", "magnet:", "torrent:")):
|
||||
continue
|
||||
if Path(src).is_file():
|
||||
has_local_source = True
|
||||
break
|
||||
except Exception:
|
||||
continue
|
||||
if has_local_source:
|
||||
debug(f"[add-file] Treating -path directory as destination: {candidate_dir}")
|
||||
location = str(candidate_dir)
|
||||
path_arg = None
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
stage_ctx = ctx.get_stage_context()
|
||||
is_last_stage = (stage_ctx is None) or bool(getattr(stage_ctx, "is_last_stage", False))
|
||||
|
||||
@@ -93,7 +124,7 @@ class Add_File(Cmdlet):
|
||||
is_storage_backend_location = False
|
||||
|
||||
# Decide which items to process.
|
||||
# - If user provided -path, treat this invocation as single-item.
|
||||
# - If user provided -path (and it was not reinterpreted as destination), treat this invocation as single-item.
|
||||
# - Otherwise, if piped input is a list, ingest each item.
|
||||
if path_arg:
|
||||
items_to_process: List[Any] = [result]
|
||||
@@ -102,6 +133,17 @@ class Add_File(Cmdlet):
|
||||
else:
|
||||
items_to_process = [result]
|
||||
|
||||
# Minimal step-based progress for single-item runs.
|
||||
# Many add-file flows don't emit intermediate items, so without steps the pipe can look "stuck".
|
||||
use_steps = False
|
||||
steps_started = False
|
||||
step2_done = False
|
||||
try:
|
||||
ui, _ = progress.ui_and_pipe_index()
|
||||
use_steps = (ui is not None) and (len(items_to_process) == 1)
|
||||
except Exception:
|
||||
use_steps = False
|
||||
|
||||
debug(f"[add-file] INPUT result type={type(result).__name__}")
|
||||
if isinstance(result, list):
|
||||
debug(f"[add-file] INPUT result is list with {len(result)} items")
|
||||
@@ -235,6 +277,14 @@ class Add_File(Cmdlet):
|
||||
failures += 1
|
||||
continue
|
||||
|
||||
is_url_target = isinstance(media_path_or_url, str) and str(media_path_or_url).lower().startswith(
|
||||
("http://", "https://", "magnet:", "torrent:")
|
||||
)
|
||||
if use_steps and (not steps_started) and (not is_url_target):
|
||||
progress.begin_steps(3)
|
||||
progress.step("resolving source")
|
||||
steps_started = True
|
||||
|
||||
# Update pipe_obj with resolved path
|
||||
pipe_obj.path = str(media_path_or_url)
|
||||
|
||||
@@ -300,13 +350,34 @@ class Add_File(Cmdlet):
|
||||
pass
|
||||
|
||||
temp_dir_to_cleanup = Path(tempfile.mkdtemp(prefix="medios_openlibrary_"))
|
||||
|
||||
# Wire OpenLibrary download progress into pipeline Live UI (no tqdm spam).
|
||||
def _ol_progress(kind: str, completed: int, total: Optional[int], label: str) -> None:
|
||||
try:
|
||||
if kind == "pages" and total:
|
||||
progress.set_status(f"downloading pages {completed}/{total}")
|
||||
progress.set_percent(int(round((completed / max(1, total)) * 100.0)))
|
||||
elif kind == "bytes" and total:
|
||||
progress.set_status(f"downloading {label} {completed}/{total} bytes")
|
||||
progress.set_percent(int(round((completed / max(1, total)) * 100.0)))
|
||||
else:
|
||||
progress.set_status("downloading")
|
||||
except Exception:
|
||||
return
|
||||
|
||||
try:
|
||||
progress.set_percent(0)
|
||||
progress.set_status("downloading openlibrary")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
sr = SearchResult(
|
||||
table="openlibrary",
|
||||
title=str(getattr(pipe_obj, "title", None) or "Unknown"),
|
||||
path=str(media_path_or_url),
|
||||
full_metadata=full_metadata if isinstance(full_metadata, dict) else {},
|
||||
)
|
||||
downloaded = provider.download(sr, temp_dir_to_cleanup)
|
||||
downloaded = provider.download(sr, temp_dir_to_cleanup, progress_callback=_ol_progress)
|
||||
if downloaded is None:
|
||||
log("[add-file] OpenLibrary download failed", file=sys.stderr)
|
||||
failures += 1
|
||||
@@ -325,6 +396,13 @@ class Add_File(Cmdlet):
|
||||
pipe_obj.path = str(downloaded_path)
|
||||
delete_after_item = True
|
||||
|
||||
try:
|
||||
if ui is not None:
|
||||
ui.set_pipe_percent(int(pipe_idx), 100)
|
||||
ui.set_pipe_status_text(int(pipe_idx), "downloaded")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# For non-provider URLs, or if still a URL after provider attempt, delegate to download-media.
|
||||
if isinstance(media_path_or_url, str) and media_path_or_url.lower().startswith(
|
||||
("http://", "https://", "magnet:", "torrent:")
|
||||
@@ -562,6 +640,10 @@ class Add_File(Cmdlet):
|
||||
failures += 1
|
||||
continue
|
||||
|
||||
if use_steps and steps_started and (not step2_done):
|
||||
progress.step("writing destination")
|
||||
step2_done = True
|
||||
|
||||
if code == 0:
|
||||
successes += 1
|
||||
else:
|
||||
@@ -619,6 +701,9 @@ class Add_File(Cmdlet):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if use_steps and steps_started:
|
||||
progress.step("finalized")
|
||||
|
||||
if successes > 0:
|
||||
return 0
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user