from __future__ import annotations from typing import Any, Dict, Sequence import sys import pipeline as ctx from . import _shared as sh from SYS.logger import log from Store import Store class Add_Url(sh.Cmdlet): """Add URL associations to files via hash+store.""" def __init__(self) -> None: super().__init__( name="add-url", summary="Associate a URL with a file", usage="@1 | add-url ", arg=[ sh.SharedArgs.HASH, sh.SharedArgs.STORE, sh.CmdletArg("url", required=True, description="URL to associate"), ], detail=[ "- Associates URL with file identified by hash+store", "- Multiple url can be comma-separated", ], exec=self.run, ) self.register() def run(self, result: Any, args: Sequence[str], config: Dict[str, Any]) -> int: """Add URL to file via hash+store backend.""" parsed = sh.parse_cmdlet_args(args, self) # Extract hash and store from result or args file_hash = parsed.get("hash") or sh.get_field(result, "hash") store_name = parsed.get("store") or sh.get_field(result, "store") url_arg = parsed.get("url") if not file_hash: log("Error: No file hash provided") return 1 if not store_name: log("Error: No store name provided") return 1 if not url_arg: log("Error: No URL provided") return 1 # Normalize hash file_hash = sh.normalize_hash(file_hash) if not file_hash: log("Error: Invalid hash format") return 1 # Parse url (comma-separated) urls = [u.strip() for u in str(url_arg).split(',') if u.strip()] if not urls: log("Error: No valid url provided") return 1 # Get backend and add url try: storage = Store(config) backend = storage[store_name] backend.add_url(file_hash, urls) for u in urls: ctx.emit(f"Added URL: {u}") return 0 except KeyError: log(f"Error: Storage backend '{store_name}' not configured") return 1 except Exception as exc: log(f"Error adding URL: {exc}", file=sys.stderr) return 1 CMDLET = Add_Url()