Files
Medios-Macina/cmdlet/get_url.py

108 lines
3.1 KiB
Python
Raw Normal View History

2025-11-25 20:09:33 -08:00
from __future__ import annotations
2025-12-14 00:53:52 -08:00
from dataclasses import dataclass
from typing import Any, Dict, List, Sequence
2025-12-01 01:10:16 -08:00
import sys
2025-11-25 20:09:33 -08:00
import pipeline as ctx
2025-12-14 00:53:52 -08:00
from ._shared import Cmdlet, SharedArgs, parse_cmdlet_args, get_field, normalize_hash
2025-12-11 19:04:02 -08:00
from SYS.logger import log
from Store import Store
2025-11-25 20:09:33 -08:00
2025-12-14 00:53:52 -08:00
@dataclass
class UrlItem:
url: str
hash: str
store: str
2025-12-11 12:47:30 -08:00
class Get_Url(Cmdlet):
"""Get url associated with files via hash+store."""
2025-12-14 00:53:52 -08:00
def __init__(self) -> None:
super().__init__(
name="get-url",
summary="List url associated with a file",
usage="@1 | get-url",
arg=[
SharedArgs.HASH,
SharedArgs.STORE,
],
detail=[
"- Lists all url associated with file identified by hash+store",
],
exec=self.run,
)
self.register()
2025-12-01 01:10:16 -08:00
2025-12-11 12:47:30 -08:00
def run(self, result: Any, args: Sequence[str], config: Dict[str, Any]) -> int:
"""Get url for file via hash+store backend."""
parsed = parse_cmdlet_args(args, self)
# Extract hash and store from result or args
file_hash = parsed.get("hash") or get_field(result, "hash")
store_name = parsed.get("store") or get_field(result, "store")
if not file_hash:
log("Error: No file hash provided")
return 1
if not store_name:
log("Error: No store name provided")
return 1
# Normalize hash
file_hash = normalize_hash(file_hash)
if not file_hash:
log("Error: Invalid hash format")
return 1
# Get backend and retrieve url
2025-12-01 01:10:16 -08:00
try:
2025-12-11 19:04:02 -08:00
storage = Store(config)
2025-12-11 12:47:30 -08:00
backend = storage[store_name]
2025-12-11 19:04:02 -08:00
urls = backend.get_url(file_hash)
2025-12-14 00:53:52 -08:00
from result_table import ResultTable
title = str(get_field(result, "title") or "").strip()
table_title = "Title"
if title:
table_title = f"Title: {title}"
table = ResultTable(table_title, max_columns=1).set_preserve_order(True)
table.set_source_command("get-url", [])
items: List[UrlItem] = []
for u in list(urls or []):
u = str(u or "").strip()
if not u:
continue
row = table.add_row()
row.add_column("Url", u)
item = UrlItem(url=u, hash=file_hash, store=str(store_name))
items.append(item)
ctx.emit(item)
# Make this a real result table so @.. / @,, can navigate it
ctx.set_last_result_table(table if items else None, items, subject=result)
if not items:
log("No url found", file=sys.stderr)
return 0
2025-12-11 12:47:30 -08:00
except KeyError:
log(f"Error: Storage backend '{store_name}' not configured")
return 1
2025-12-01 01:10:16 -08:00
except Exception as exc:
2025-12-11 12:47:30 -08:00
log(f"Error retrieving url: {exc}", file=sys.stderr)
return 1
2025-12-01 01:10:16 -08:00
2025-12-11 12:47:30 -08:00
2025-12-14 00:53:52 -08:00
CMDLET = Get_Url()
2025-11-25 20:09:33 -08:00