This commit is contained in:
2026-01-31 23:22:30 -08:00
parent ed44d69ef1
commit 753cdfb196
6 changed files with 454 additions and 35 deletions

View File

@@ -4,6 +4,8 @@ import hashlib
import json import json
import sys import sys
import time import time
import shutil
import tempfile
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Iterable, List, Optional, Callable, Tuple from typing import Any, Dict, Iterable, List, Optional, Callable, Tuple
from urllib.parse import urlparse from urllib.parse import urlparse
@@ -14,7 +16,7 @@ from ProviderCore.base import Provider, SearchResult
from SYS.provider_helpers import TableProviderMixin from SYS.provider_helpers import TableProviderMixin
from SYS.utils import sanitize_filename from SYS.utils import sanitize_filename
from SYS.logger import log, debug from SYS.logger import log, debug
from SYS.models import DownloadError from SYS.models import DownloadError, PipeObject
_HOSTS_CACHE_TTL_SECONDS = 24 * 60 * 60 _HOSTS_CACHE_TTL_SECONDS = 24 * 60 * 60
@@ -273,13 +275,22 @@ def _parse_alldebrid_magnet_id(target: str) -> Optional[int]:
candidate = str(target or "").strip() candidate = str(target or "").strip()
if not candidate: if not candidate:
return None return None
if not candidate.lower().startswith(_ALD_MAGNET_PREFIX):
return None # Handle various prefix variations: alldebrid:magnet: (standard), alldebrid🧲, or alldebrid:
id_part = None
if candidate.lower().startswith(_ALD_MAGNET_PREFIX):
id_part = candidate[len(_ALD_MAGNET_PREFIX):].strip()
elif candidate.startswith("alldebrid🧲"):
id_part = candidate[len("alldebrid🧲"):].strip()
elif candidate.lower().startswith("alldebrid:"):
id_part = candidate[len("alldebrid:"):].strip()
if id_part:
try: try:
magnet_id_raw = candidate[len(_ALD_MAGNET_PREFIX):].strip() return int(id_part)
return int(magnet_id_raw)
except Exception: except Exception:
return None return None
return None
def resolve_magnet_spec(target: str) -> Optional[str]: def resolve_magnet_spec(target: str) -> Optional[str]:
@@ -302,6 +313,50 @@ def resolve_magnet_spec(target: str) -> Optional[str]:
return None return None
def _looks_like_torrent_source(candidate: str) -> bool:
value = str(candidate or "").strip()
if not value:
return False
def _clean_segment(text: str) -> str:
cleaned = text.split("#", 1)[0].split("?", 1)[0]
return cleaned.strip().lower()
paths: list[str] = []
try:
parsed = urlparse(value)
except Exception:
parsed = None
if parsed and parsed.path:
paths.append(_clean_segment(parsed.path))
paths.append(_clean_segment(value))
for path in paths:
if path and is_torrent_file(path):
return True
return False
def _extract_value(source: Any, field: str) -> Any:
if source is None:
return None
if isinstance(source, dict):
if field in source:
return source.get(field)
else:
try:
value = getattr(source, field)
except Exception:
value = None
if value is not None:
return value
extra = getattr(source, "extra", None)
if isinstance(extra, dict) and field in extra:
return extra.get(field)
return None
def _dispatch_alldebrid_magnet_search( def _dispatch_alldebrid_magnet_search(
magnet_id: int, magnet_id: int,
config: Dict[str, Any], config: Dict[str, Any],
@@ -581,7 +636,7 @@ class AllDebrid(TableProviderMixin, Provider):
# Magnet URIs should be routed through this provider. # Magnet URIs should be routed through this provider.
TABLE_AUTO_STAGES = {"alldebrid": ["download-file"]} TABLE_AUTO_STAGES = {"alldebrid": ["download-file"]}
AUTO_STAGE_USE_SELECTION_ARGS = True AUTO_STAGE_USE_SELECTION_ARGS = True
URL = ("magnet:", "alldebrid:magnet:") URL = ("magnet:", "alldebrid:magnet:", "alldebrid:", "alldebrid🧲")
URL_DOMAINS = () URL_DOMAINS = ()
@classmethod @classmethod
@@ -662,6 +717,8 @@ class AllDebrid(TableProviderMixin, Provider):
spec = resolve_magnet_spec(url) spec = resolve_magnet_spec(url)
if not spec: if not spec:
if _looks_like_torrent_source(url):
log(f"[alldebrid] Torrent source ignored (unable to parse magnet/hash): {url}", file=sys.stderr)
return False, None return False, None
cfg = self.config if isinstance(self.config, dict) else {} cfg = self.config if isinstance(self.config, dict) else {}
@@ -869,6 +926,106 @@ class AllDebrid(TableProviderMixin, Provider):
except Exception: except Exception:
return None return None
@classmethod
def download_for_pipe_result(
cls,
result: Any,
pipe_obj: Optional[PipeObject],
config: Dict[str, Any],
) -> Tuple[Optional[Path], Optional[str], Optional[Path]]:
"""Download a remote provider result on behalf of add-file."""
download_url = (
_extract_value(result, "path")
or (getattr(pipe_obj, "url", None) if pipe_obj is not None else None)
)
download_url = str(download_url or "").strip()
if not download_url:
return None, None, None
metadata: Dict[str, Any] = {}
maybe_meta = _extract_value(result, "full_metadata") or _extract_value(result, "metadata")
if isinstance(maybe_meta, dict):
metadata.update(maybe_meta)
if pipe_obj is not None:
pipe_meta = getattr(pipe_obj, "metadata", None)
if isinstance(pipe_meta, dict):
metadata.update(pipe_meta)
table_name = str(
_extract_value(result, "table")
or (getattr(pipe_obj, "provider", None) if pipe_obj is not None else None)
or "alldebrid"
).strip()
if not table_name:
table_name = "alldebrid"
title = str(
_extract_value(result, "title")
or (getattr(pipe_obj, "title", None) if pipe_obj is not None else None)
or metadata.get("name")
or ""
).strip()
if not title:
fallback_name = None
parsed_url = None
try:
parsed_url = urlparse(download_url)
except Exception:
parsed_url = None
if parsed_url and parsed_url.path:
try:
fallback_name = Path(parsed_url.path).stem
except Exception:
fallback_name = None
title = fallback_name or "alldebrid"
media_kind = str(
_extract_value(result, "media_kind")
or metadata.get("media_kind")
or "file"
).strip() or "file"
search_result = SearchResult(
table=table_name,
title=title,
path=download_url,
detail=str(_extract_value(result, "detail") or ""),
annotations=[],
media_kind=media_kind,
tag=set(getattr(pipe_obj, "tag", []) or []),
columns=[],
full_metadata=metadata,
)
if not download_url.startswith(("http://", "https://")):
return None, None, None
download_dir = Path(tempfile.mkdtemp(prefix="add-file-alldebrid-"))
try:
provider = cls(config)
downloaded_path = provider.download(search_result, download_dir)
if not downloaded_path:
shutil.rmtree(download_dir, ignore_errors=True)
return None, None, None
if pipe_obj is not None:
pipe_obj.is_temp = True
hash_hint = (
_extract_value(result, "hash")
or _extract_value(result, "file_hash")
or (getattr(pipe_obj, "hash", None) if pipe_obj is not None else None)
)
if not hash_hint:
for candidate in ("hash", "file_hash", "info_hash"):
candidate_val = metadata.get(candidate)
if isinstance(candidate_val, str) and candidate_val.strip():
hash_hint = candidate_val.strip()
break
return downloaded_path, hash_hint, download_dir
except Exception as exc:
log(f"[alldebrid] add-file download failed: {exc}", file=sys.stderr)
shutil.rmtree(download_dir, ignore_errors=True)
return None, None, None
def download_items( def download_items(
self, self,
result: SearchResult, result: SearchResult,
@@ -880,14 +1037,19 @@ class AllDebrid(TableProviderMixin, Provider):
path_from_result: Callable[[Any], Path], path_from_result: Callable[[Any], Path],
config: Optional[Dict[str, Any]] = None, config: Optional[Dict[str, Any]] = None,
) -> int: ) -> int:
# Check if this is a direct magnet_id from the account (e.g., from selector) # Check if this is a direct magnet_id from the account (from selector or custom URL scheme)
path_id = _parse_alldebrid_magnet_id(getattr(result, "path", ""))
full_metadata = getattr(result, "full_metadata", None) or {} full_metadata = getattr(result, "full_metadata", None) or {}
magnet_id_direct = None
if isinstance(full_metadata, dict): if isinstance(full_metadata, dict):
magnet_id_direct = full_metadata.get("magnet_id") magnet_id_direct = full_metadata.get("magnet_id")
if magnet_id_direct is not None:
active_id = magnet_id_direct if magnet_id_direct is not None else path_id
if active_id is not None:
try: try:
magnet_id = int(magnet_id_direct) magnet_id = int(active_id)
debug(f"[download_items] Found magnet_id {magnet_id} in metadata, downloading files directly") debug(f"[download_items] Found magnet_id {magnet_id}, downloading files directly")
cfg = config if isinstance(config, dict) else (self.config or {}) cfg = config if isinstance(config, dict) else (self.config or {})
count = self._download_magnet_by_id( count = self._download_magnet_by_id(
magnet_id, magnet_id,

View File

@@ -398,7 +398,7 @@ def match_provider_name_for_url(url: str) -> Optional[str]:
dom = dom_raw.lower() dom = dom_raw.lower()
if not dom: if not dom:
continue continue
if "://" in dom or dom.startswith("magnet:"): if "://" in dom or dom.startswith("magnet:") or dom.endswith(":") or "🧲" in dom:
if raw_url_lower.startswith(dom): if raw_url_lower.startswith(dom):
return info.canonical_name return info.canonical_name
continue continue

View File

@@ -401,7 +401,9 @@ def normalize_urls(value: Any) -> List[str]:
"tidal:", "tidal:",
"data:", "data:",
"ftp:", "ftp:",
"sftp:")) "sftp:",
"alldebrid:",
"alldebrid🧲"))
is_struct_url = ("." in token and "/" in token is_struct_url = ("." in token and "/" in token
and not token.startswith((".", and not token.startswith((".",
"/"))) "/")))
@@ -444,7 +446,8 @@ def normalize_urls(value: Any) -> List[str]:
low = u.lower() low = u.lower()
has_scheme = low.startswith(( has_scheme = low.startswith((
"http://", "https://", "magnet:", "torrent:", "tidal:", "http://", "https://", "magnet:", "torrent:", "tidal:",
"hydrus:", "ytdl:", "soulseek:", "matrix:", "file:" "hydrus:", "ytdl:", "soulseek:", "matrix:", "file:",
"alldebrid:", "alldebrid🧲"
)) ))
if not (has_scheme or "://" in low): if not (has_scheme or "://" in low):
return None return None

View File

@@ -1229,10 +1229,63 @@ class Add_File(Cmdlet):
hash_hint = get_field(result, "hash") or get_field(result, "file_hash") or getattr(pipe_obj, "hash", None) hash_hint = get_field(result, "hash") or get_field(result, "file_hash") or getattr(pipe_obj, "hash", None)
return candidate, hash_hint, None return candidate, hash_hint, None
downloaded_path, hash_hint, tmp_dir = Add_File._maybe_download_alldebrid_result(
result,
pipe_obj,
config,
)
if downloaded_path:
pipe_obj.path = str(downloaded_path)
return downloaded_path, hash_hint, tmp_dir
debug(f"No resolution path matched. result type={type(result).__name__}") debug(f"No resolution path matched. result type={type(result).__name__}")
log("File path could not be resolved") log("File path could not be resolved")
return None, None, None return None, None, None
@staticmethod
def _normalize_provider_key(value: Optional[Any]) -> Optional[str]:
if value is None:
return None
try:
normalized = str(value).strip().lower()
except Exception:
return None
if not normalized:
return None
if "." in normalized:
normalized = normalized.split(".", 1)[0]
return normalized
@staticmethod
def _maybe_download_alldebrid_result(
result: Any,
pipe_obj: models.PipeObject,
config: Dict[str, Any],
) -> Tuple[Optional[Path], Optional[str], Optional[Path]]:
provider_key = None
for source in (
pipe_obj.provider,
get_field(result, "provider"),
get_field(result, "table"),
):
candidate = Add_File._normalize_provider_key(source)
if candidate:
provider_key = candidate
break
if provider_key != "alldebrid":
return None, None, None
try:
from Provider.alldebrid import AllDebrid
except Exception:
return None, None, None
try:
return AllDebrid.download_for_pipe_result(result, pipe_obj, config)
except Exception as exc:
debug(f"[add-file] AllDebrid download helper failed: {exc}")
return None, None, None
@staticmethod @staticmethod
def _download_provider_source( def _download_provider_source(
pipe_obj: models.PipeObject, pipe_obj: models.PipeObject,

View File

@@ -554,6 +554,7 @@ class Download_File(Cmdlet):
dict) else None, dict) else None,
progress=progress, progress=progress,
config=config, config=config,
provider_hint=provider_key
) )
downloaded_count += 1 downloaded_count += 1
@@ -2594,7 +2595,14 @@ class Download_File(Cmdlet):
parsed = parse_cmdlet_args(args, self) parsed = parse_cmdlet_args(args, self)
# Resolve URLs from -url or positional arguments # Resolve URLs from -url or positional arguments
url_candidates = parsed.get("url") or [a for a in parsed.get("args", []) if isinstance(a, str) and (a.startswith("http") or "://" in a)] url_candidates = parsed.get("url") or [
a for a in parsed.get("args", [])
if isinstance(a, str) and (
a.startswith("http") or "://" in a or ":" in a
or "🧲" in a
and not a.startswith("-")
)
]
raw_url = normalize_url_list(url_candidates) raw_url = normalize_url_list(url_candidates)
quiet_mode = bool(config.get("_quiet_background_output")) if isinstance(config, dict) else False quiet_mode = bool(config.get("_quiet_background_output")) if isinstance(config, dict) else False
@@ -2618,7 +2626,7 @@ class Download_File(Cmdlet):
s_val = str(value or "").strip().lower() s_val = str(value or "").strip().lower()
except Exception: except Exception:
return False return False
return s_val.startswith(("http://", "https://")) return s_val.startswith(("http://", "https://", "magnet:", "torrent:", "alldebrid:", "alldebrid🧲"))
def _extract_selection_args(item: Any) -> tuple[Optional[List[str]], Optional[str]]: def _extract_selection_args(item: Any) -> tuple[Optional[List[str]], Optional[str]]:
selection_args: Optional[List[str]] = None selection_args: Optional[List[str]] = None
@@ -2786,9 +2794,15 @@ class Download_File(Cmdlet):
and (not parsed.get("path")) and (not parsed.get("output"))): and (not parsed.get("path")) and (not parsed.get("output"))):
candidate = str(raw_url[0] or "").strip() candidate = str(raw_url[0] or "").strip()
low = candidate.lower() low = candidate.lower()
looks_like_url = low.startswith(("http://", "https://", "ftp://")) looks_like_url = low.startswith((
"http://", "https://", "ftp://", "magnet:", "torrent:",
"alldebrid:", "alldebrid🧲"
))
looks_like_provider = ( looks_like_provider = (
":" in candidate and not candidate.startswith(("http:", "https:", "ftp:", "ftps:", "file:")) ":" in candidate and not candidate.startswith((
"http:", "https:", "ftp:", "ftps:", "file:",
"alldebrid:"
))
) )
looks_like_windows_path = ( looks_like_windows_path = (
(len(candidate) >= 2 and candidate[1] == ":") (len(candidate) >= 2 and candidate[1] == ":")

View File

@@ -607,3 +607,190 @@ http://10.162.158.28:45899/get_files/file?hash=5c7296f1a5544522e3d118f60080e0389
2026-02-01T04:50:39.033859Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000001DF0A29EC90> 2026-02-01T04:50:39.033859Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000001DF0A29EC90>
2026-02-01T04:50:55.684809Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000001DF0A29EC90> 2026-02-01T04:50:55.684809Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000001DF0A29EC90>
2026-02-01T04:51:12.287393Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s) 2026-02-01T04:51:12.287393Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s)
2026-02-01T05:38:20.685642Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T05:38:37.528797Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019FBE12FB90>
2026-02-01T05:38:54.568209Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019FBE12FB90>
2026-02-01T05:39:11.499306Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 0 result(s)
2026-02-01T05:39:28.345200Z [DEBUG] search_file._run_provider_search: No results found for query: 8
2026-02-01T05:39:45.271491Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T05:40:02.052700Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019FBE12EC90>
2026-02-01T05:40:18.877026Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019FBE470050>
2026-02-01T05:40:35.473139Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s)
2026-02-01T05:40:52.084907Z [DEBUG] logger.debug: DEBUG: [download-file] run invoked with args: ['https://releases.ubuntu.com/25.10/ubuntu-25.10-desktop-amd64.iso.torrent']
2026-02-01T05:41:08.683766Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T05:41:25.407177Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=2
2026-02-01T05:41:42.036819Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=2
2026-02-01T05:41:58.700025Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=2
2026-02-01T05:42:15.263270Z [DEBUG] logger.debug: DEBUG: Output directory: C:\Users\Admin\AppData\Local\Temp\Medios-Macina
2026-02-01T05:42:31.663208Z [DEBUG] logger.debug: DEBUG: Processing URL: https://releases.ubuntu.com/25.10/ubuntu-25.10-desktop-amd64.iso.torrent
2026-02-01T05:42:48.151962Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=2
2026-02-01T05:43:04.804447Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019FC066BF50>
2026-02-01T05:43:21.350318Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019FC066BE90>
2026-02-01T05:43:37.966291Z [DEBUG] logger.debug: DEBUG: Direct download: ubuntu-25.10-desktop-amd64.iso.torrent
2026-02-01T05:43:54.492442Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019FC066B410>
2026-02-01T05:49:42.813097Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6BE90>
2026-02-01T05:49:59.804166Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T05:50:16.612796Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6B650>
2026-02-01T05:50:33.449999Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6B590>
2026-02-01T05:50:50.429659Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x00000229281D4110>
2026-02-01T05:51:07.278581Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x00000229281D4110>
2026-02-01T05:51:24.198864Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 1 result(s)
2026-02-01T05:51:41.035358Z [DEBUG] logger.debug: DEBUG: [alldebrid] Sent magnet 453056143 to AllDebrid for download
2026-02-01T05:51:57.935933Z [DEBUG] logger.debug: DEBUG: [download-file] Processing 0 piped item(s)...
2026-02-01T05:52:14.768629Z [DEBUG] logger.debug: DEBUG: ✓ Successfully processed 0 file(s) and queued 1 magnet(s)
2026-02-01T05:54:32.519990Z [DEBUG] logger.debug: DEBUG: [Store] Unknown store type 'debrid'
2026-02-01T05:54:49.467693Z [DEBUG] logger.debug: DEBUG: [Store] Unknown store type 'debrid'
2026-02-01T05:55:06.466197Z [DEBUG] search_file.run: Backend all-debrid search failed: "Unknown store backend: all-debrid. Available: ['rpi', 'local']"
2026-02-01T05:55:23.429444Z [DEBUG] logger.debug: DEBUG: [search-file] Searching 'local'
2026-02-01T05:55:40.429236Z [DEBUG] logger.debug: DEBUG: [hydrusnetwork:local] Searching for: ubuntu
2026-02-01T05:55:57.414000Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6B1D0>
2026-02-01T05:56:14.258918Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6B1D0>
2026-02-01T05:56:31.269220Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6AC90>
2026-02-01T05:56:48.009593Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6AC90>
2026-02-01T05:57:04.463630Z [DEBUG] logger.debug: DEBUG: [hydrusnetwork:local] 0 result(s)
2026-02-01T05:57:20.977201Z [DEBUG] logger.debug: DEBUG: [search-file] 'local' -> 0 result(s)
2026-02-01T05:57:37.371749Z [DEBUG] logger.debug: DEBUG: [search-file] Searching 'rpi'
2026-02-01T05:57:53.793360Z [DEBUG] logger.debug: DEBUG: [hydrusnetwork:rpi] Searching for: ubuntu
2026-02-01T05:58:10.293366Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6AC90>
2026-02-01T05:58:26.713034Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6AC90>
2026-02-01T05:58:43.176453Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6B7D0>
2026-02-01T05:58:59.805711Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6B7D0>
2026-02-01T05:59:16.290292Z [DEBUG] logger.debug: DEBUG: [hydrusnetwork:rpi] 0 result(s)
2026-02-01T05:59:32.674044Z [DEBUG] logger.debug: DEBUG: [search-file] 'rpi' -> 0 result(s)
2026-02-01T05:59:49.098992Z [DEBUG] search_file.run: No results found
2026-02-01T06:00:05.551094Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T06:00:21.925543Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6AE10>
2026-02-01T06:00:38.435088Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000022927F6AE10>
2026-02-01T06:00:56.063587Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 4 result(s)
2026-02-01T06:01:12.572606Z [DEBUG] logger.debug: DEBUG: Auto-inserting download-file after selection
2026-02-01T06:01:28.979743Z [DEBUG] logger.debug: DEBUG: Inserted auto stage before existing pipeline: ['download-file']
2026-02-01T06:01:45.482515Z [DEBUG] logger.debug: DEBUG: Applying row action for row 0 -> ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:02:01.849708Z [DEBUG] logger.debug: DEBUG: Replacing stage 0 ['download-file'] with row action ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:02:18.396521Z [DEBUG] logger.debug: DEBUG: [download-file] run invoked with args: ['-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:02:34.821622Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:02:51.186059Z [DEBUG] logger.debug: DEBUG: [download-file] Processing 1 selected item(s) from table...
2026-02-01T06:03:07.738960Z [DEBUG] logger.debug: DEBUG: [download-file] Item 1/1: ['-url', 'alldebrid:magnet:453056143']
2026-02-01T06:03:24.187753Z [DEBUG] logger.debug: DEBUG: [download-file] Re-invoking download-file for selected item...
2026-02-01T06:03:40.685776Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:03:57.158246Z [DEBUG] download_file._run_impl: No url or piped items to download
2026-02-01T06:04:13.711114Z [DEBUG] logger.debug: DEBUG: [Store] Unknown store type 'debrid'
2026-02-01T06:04:30.184745Z [DEBUG] logger.debug: DEBUG: [add-file] Treating -path directory as destination: C:\Users\Admin\Downloads
2026-02-01T06:04:46.704198Z [DEBUG] logger.debug: DEBUG: [add-file] INPUT result type=NoneType
2026-02-01T06:05:03.237285Z [DEBUG] logger.debug: DEBUG: [add-file] PARSED args: location=C:\Users\Admin\Downloads, provider=None, delete=False
2026-02-01T06:05:19.843731Z [DEBUG] logger.debug: DEBUG: [add-file] PIPE item[0] PipeObject preview
2026-02-01T06:05:36.556930Z [DEBUG] logger.debug: DEBUG: No resolution path matched. result type=NoneType
2026-02-01T06:05:52.985865Z [DEBUG] add_file._resolve_source: File path could not be resolved
2026-02-01T06:06:09.513156Z [DEBUG] logger.debug: DEBUG: [add-file] RESOLVED source: path=None, hash=N/A...
2026-02-01T06:06:26.348500Z [DEBUG] logger.debug: DEBUG: [download-file] run invoked with args: ['-path', 'C:\\Users\\Admin\\Downloads']
2026-02-01T06:06:43.235024Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:07:00.135479Z [DEBUG] logger.debug: DEBUG: [download-file] Processing 1 selected item(s) from table...
2026-02-01T06:07:17.039344Z [DEBUG] logger.debug: DEBUG: [download-file] Item 1/1: ['-url', 'alldebrid:magnet:453056143']
2026-02-01T06:07:33.934576Z [DEBUG] logger.debug: DEBUG: [download-file] Re-invoking download-file for selected item...
2026-02-01T06:07:50.869276Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:08:07.749911Z [DEBUG] download_file._run_impl: No url or piped items to download
2026-02-01T06:33:46.595268Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T06:34:03.331255Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000002EC67DC4590>
2026-02-01T06:34:20.063041Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000002EC67DC4410>
2026-02-01T06:34:36.968421Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s)
2026-02-01T06:39:50.111277Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T06:40:07.165210Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000001A6DDB9C290>
2026-02-01T06:40:24.108510Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x000001A6DDB9C350>
2026-02-01T06:40:41.047193Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s)
2026-02-01T06:40:58.000598Z [DEBUG] logger.debug: DEBUG: Auto-inserting download-file after selection
2026-02-01T06:41:14.941587Z [DEBUG] logger.debug: DEBUG: Inserted auto stage before existing pipeline: ['download-file']
2026-02-01T06:41:31.848453Z [DEBUG] logger.debug: DEBUG: Applying row action for row 0 -> ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:41:48.702300Z [DEBUG] logger.debug: DEBUG: Replacing stage 0 ['download-file'] with row action ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:42:05.614677Z [DEBUG] logger.debug: DEBUG: [download-file] run invoked with args: ['-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:42:22.400732Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:42:39.062217Z [DEBUG] logger.debug: DEBUG: [download-file] Processing 1 selected item(s) from table...
2026-02-01T06:42:55.757959Z [DEBUG] logger.debug: DEBUG: [download-file] Item 1/1: ['-url', 'alldebrid:magnet:453056143']
2026-02-01T06:43:12.525270Z [DEBUG] logger.debug: DEBUG: [download-file] Re-invoking download-file for selected item...
2026-02-01T06:43:29.285197Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:43:45.933657Z [DEBUG] download_file._run_impl: No url or piped items to download
2026-02-01T06:44:02.596721Z [DEBUG] logger.debug: DEBUG: [Store] Unknown store type 'debrid'
2026-02-01T06:44:19.232042Z [DEBUG] logger.debug: DEBUG: [add-file] Treating -path directory as destination: C:\Users\Admin\Downloads
2026-02-01T06:44:35.803491Z [DEBUG] logger.debug: DEBUG: [add-file] INPUT result type=NoneType
2026-02-01T06:45:34.001905Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T06:45:50.830664Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000021F308C8350>
2026-02-01T06:46:07.717108Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000021F308C8410>
2026-02-01T06:46:24.671507Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s)
2026-02-01T06:46:41.535211Z [DEBUG] logger.debug: DEBUG: Auto-inserting download-file after selection
2026-02-01T06:46:58.474762Z [DEBUG] logger.debug: DEBUG: Inserted auto stage before existing pipeline: ['download-file']
2026-02-01T06:47:15.425498Z [DEBUG] logger.debug: DEBUG: Applying row action for row 0 -> ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:47:32.103024Z [DEBUG] logger.debug: DEBUG: Replacing stage 0 ['download-file'] with row action ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:47:48.783675Z [DEBUG] logger.debug: DEBUG: [download-file] run invoked with args: ['-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:48:05.417641Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:48:21.975206Z [DEBUG] logger.debug: DEBUG: [download-file] Processing 1 selected item(s) from table...
2026-02-01T06:48:38.558663Z [DEBUG] logger.debug: DEBUG: [download-file] Item 1/1: ['-url', 'alldebrid:magnet:453056143']
2026-02-01T06:48:55.169216Z [DEBUG] logger.debug: DEBUG: [download-file] Re-invoking download-file for selected item...
2026-02-01T06:49:11.791495Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:49:28.318339Z [DEBUG] download_file._run_impl: No url or piped items to download
2026-02-01T06:49:44.922882Z [DEBUG] logger.debug: DEBUG: [Store] Unknown store type 'debrid'
2026-02-01T06:50:01.491659Z [DEBUG] logger.debug: DEBUG: [add-file] Treating -path directory as destination: C:\Users\Admin\Downloads
2026-02-01T06:50:18.049203Z [DEBUG] logger.debug: DEBUG: [add-file] INPUT result type=NoneType
2026-02-01T06:50:34.573980Z [DEBUG] logger.debug: DEBUG: [add-file] PARSED args: location=C:\Users\Admin\Downloads, provider=None, delete=False
2026-02-01T06:50:51.151427Z [DEBUG] logger.debug: DEBUG: [add-file] PIPE item[0] PipeObject preview
2026-02-01T06:51:07.770236Z [DEBUG] logger.debug: DEBUG: No resolution path matched. result type=NoneType
2026-02-01T06:51:48.993991Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T06:52:05.565435Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019D4BED3C50>
2026-02-01T06:52:22.277695Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000019D4BED3D10>
2026-02-01T06:52:38.930595Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s)
2026-02-01T06:52:55.552091Z [DEBUG] logger.debug: DEBUG: Auto-inserting download-file after selection
2026-02-01T06:53:12.118174Z [DEBUG] logger.debug: DEBUG: Inserted auto stage before existing pipeline: ['download-file']
2026-02-01T06:53:28.790727Z [DEBUG] logger.debug: DEBUG: Applying row action for row 0 -> ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:53:45.327237Z [DEBUG] logger.debug: DEBUG: Replacing stage 0 ['download-file'] with row action ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:54:01.987436Z [DEBUG] logger.debug: DEBUG: [download-file] run invoked with args: ['-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T06:54:18.637408Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:54:35.221650Z [DEBUG] logger.debug: DEBUG: [download-file] Processing 1 selected item(s) from table...
2026-02-01T06:54:51.872597Z [DEBUG] logger.debug: DEBUG: [download-file] Item 1/1: ['-url', 'alldebrid:magnet:453056143']
2026-02-01T06:55:08.522116Z [DEBUG] logger.debug: DEBUG: [download-file] Re-invoking download-file for selected item...
2026-02-01T06:55:25.176164Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T06:55:41.975557Z [DEBUG] download_file._run_impl: No url or piped items to download
2026-02-01T06:55:58.717127Z [DEBUG] logger.debug: DEBUG: [Store] Unknown store type 'debrid'
2026-02-01T07:01:27.791652Z [DEBUG] logger.debug: DEBUG: [search-file] Calling alldebrid.search(filters={})
2026-02-01T07:01:44.750314Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0410>
2026-02-01T07:02:01.615307Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A07D0>
2026-02-01T07:02:18.332435Z [DEBUG] logger.debug: DEBUG: [search-file] alldebrid -> 50 result(s)
2026-02-01T07:02:34.899263Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A1310>
2026-02-01T07:02:51.552533Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A1310>
2026-02-01T07:03:08.053494Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0A10>
2026-02-01T07:03:24.820605Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0A10>
2026-02-01T07:03:41.547457Z [DEBUG] logger.debug: DEBUG: Auto-inserting download-file after selection
2026-02-01T07:03:58.225624Z [DEBUG] logger.debug: DEBUG: Inserted auto stage before existing pipeline: ['download-file']
2026-02-01T07:04:15.080542Z [DEBUG] logger.debug: DEBUG: Applying row action for row 0 -> ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T07:04:31.831637Z [DEBUG] logger.debug: DEBUG: Replacing stage 0 ['download-file'] with row action ['download-file', '-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T07:04:48.386018Z [DEBUG] logger.debug: DEBUG: [download-file] run invoked with args: ['-provider', 'alldebrid', '-url', 'alldebrid:magnet:453056143']
2026-02-01T07:05:04.914412Z [DEBUG] logger.debug: DEBUG: Starting download-file
2026-02-01T07:05:21.471255Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=4
2026-02-01T07:05:38.051683Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=4
2026-02-01T07:05:54.492141Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=4
2026-02-01T07:06:11.086311Z [DEBUG] logger.debug: DEBUG: Output directory: C:\Users\Admin\AppData\Local\Temp\Medios-Macina
2026-02-01T07:06:27.636367Z [DEBUG] logger.debug: DEBUG: Processing URL: alldebrid:magnet:453056143
2026-02-01T07:06:44.184703Z [DEBUG] alldebrid.url_patterns: [alldebrid] url_patterns loaded 0 cached host domains; total patterns=4
2026-02-01T07:07:00.670086Z [DEBUG] logger.debug: DEBUG: Provider alldebrid claimed alldebrid:magnet:453056143
2026-02-01T07:07:17.283498Z [DEBUG] logger.debug: DEBUG: [download_items] Found magnet_id 453056143, downloading files directly
2026-02-01T07:07:33.848650Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0590>
2026-02-01T07:07:50.554843Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0590>
2026-02-01T07:08:07.114662Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0590>
2026-02-01T07:08:23.620063Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0590>
2026-02-01T07:08:40.149122Z [DEBUG] logger.debug: DEBUG: [alldebrid] Unlocked restricted link for ubuntu-25.10-desktop-amd64.iso
2026-02-01T07:08:56.672058Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A1C10>
2026-02-01T07:09:13.147916Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A1C10>
2026-02-01T07:09:29.607888Z [DEBUG] logger.debug: DEBUG: Direct download: ubuntu-25.10-desktop-amd64.iso
2026-02-01T07:09:46.253597Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A0890>
2026-02-01T07:10:02.758497Z [DEBUG] logger.debug: DEBUG: ✓ Downloaded in 173.7s
2026-02-01T07:10:19.309317Z [DEBUG] logger.debug: DEBUG: [download_items] _download_magnet_by_id returned 1
2026-02-01T07:10:35.893854Z [DEBUG] logger.debug: DEBUG: [download-file] Processing 0 piped item(s)...
2026-02-01T07:10:52.406210Z [DEBUG] logger.debug: DEBUG: ✓ Successfully processed 1 file(s)
2026-02-01T07:11:09.038280Z [DEBUG] logger.debug: DEBUG: [Store] Unknown store type 'debrid'
2026-02-01T07:11:25.581121Z [DEBUG] logger.debug: DEBUG: [add-file] Treating -path directory as destination: C:\Users\Admin\Downloads
2026-02-01T07:11:42.101434Z [DEBUG] logger.debug: DEBUG: [add-file] INPUT result type=dict
2026-02-01T07:11:58.648545Z [DEBUG] logger.debug: DEBUG: [add-file] PARSED args: location=C:\Users\Admin\Downloads, provider=None, delete=False
2026-02-01T07:12:15.119837Z [DEBUG] logger.debug: DEBUG: [add-file] PIPE item[0] PipeObject preview
2026-02-01T07:12:31.628095Z [DEBUG] logger.debug: DEBUG: [hydrusnetwork:local] get_file(hash=32e30d72ae47..., url=None)
2026-02-01T07:12:48.129021Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A1C10>
2026-02-01T07:13:04.670391Z [DEBUG] logger.debug: DEBUG: <rich.panel.Panel object at 0x0000024DE12A1C10>
2026-02-01T07:13:21.189393Z [DEBUG] logger.debug: DEBUG: [hydrusnetwork:local] get_file: falling back to url=http://127.0.0.1:45869/get_files/file?hash=32e30d72ae4798c633323a2684d94a11582bb03a6ab38d2b0d5ae5eabc5e577b&Hydrus-Client-API-Access-Key=95178b08e6ba3c57991e7b4e162c6efff1ce90c500005c6ebf8524122ed2486e
2026-02-01T07:13:37.692682Z [DEBUG] logger.debug: DEBUG: [add-file] RESOLVED source: path=C:\Users\Admin\AppData\Local\Temp\Medios-Macina\ubuntu-25.10-desktop-amd64.iso, hash=32e30d72ae4798c633323a2684d94a11582bb03a6ab38d2b0d5ae5eabc5e577b...
2026-02-01T07:13:54.207275Z [DEBUG] add_file._handle_local_export: Exporting to local path: C:\Users\Admin\Downloads
2026-02-01T07:14:10.869330Z [DEBUG] add_file._emit_pipe_object: Result (1 rows)