diff --git a/Provider/alldebrid.py b/Provider/alldebrid.py index 6ace5d7..55f41ed 100644 --- a/Provider/alldebrid.py +++ b/Provider/alldebrid.py @@ -4,6 +4,8 @@ import hashlib import json import sys import time +import shutil +import tempfile from pathlib import Path from typing import Any, Dict, Iterable, List, Optional, Callable, Tuple from urllib.parse import urlparse @@ -14,7 +16,7 @@ from ProviderCore.base import Provider, SearchResult from SYS.provider_helpers import TableProviderMixin from SYS.utils import sanitize_filename from SYS.logger import log, debug -from SYS.models import DownloadError +from SYS.models import DownloadError, PipeObject _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() if not candidate: return None - if not candidate.lower().startswith(_ALD_MAGNET_PREFIX): - return None - try: - magnet_id_raw = candidate[len(_ALD_MAGNET_PREFIX):].strip() - return int(magnet_id_raw) - except Exception: - 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: + return int(id_part) + except Exception: + return None + return None def resolve_magnet_spec(target: str) -> Optional[str]: @@ -302,6 +313,50 @@ def resolve_magnet_spec(target: str) -> Optional[str]: 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( magnet_id: int, config: Dict[str, Any], @@ -581,7 +636,7 @@ class AllDebrid(TableProviderMixin, Provider): # Magnet URIs should be routed through this provider. TABLE_AUTO_STAGES = {"alldebrid": ["download-file"]} AUTO_STAGE_USE_SELECTION_ARGS = True - URL = ("magnet:", "alldebrid:magnet:") + URL = ("magnet:", "alldebrid:magnet:", "alldebrid:", "alldebrid🧲") URL_DOMAINS = () @classmethod @@ -662,6 +717,8 @@ class AllDebrid(TableProviderMixin, Provider): spec = resolve_magnet_spec(url) 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 cfg = self.config if isinstance(self.config, dict) else {} @@ -869,6 +926,106 @@ class AllDebrid(TableProviderMixin, Provider): except Exception: 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( self, result: SearchResult, @@ -880,28 +1037,33 @@ class AllDebrid(TableProviderMixin, Provider): path_from_result: Callable[[Any], Path], config: Optional[Dict[str, Any]] = None, ) -> 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 {} + magnet_id_direct = None if isinstance(full_metadata, dict): magnet_id_direct = full_metadata.get("magnet_id") - if magnet_id_direct is not None: - try: - magnet_id = int(magnet_id_direct) - debug(f"[download_items] Found magnet_id {magnet_id} in metadata, downloading files directly") - cfg = config if isinstance(config, dict) else (self.config or {}) - count = self._download_magnet_by_id( - magnet_id, - output_dir, - cfg, - emit, - progress, - quiet_mode, - path_from_result, - ) - debug(f"[download_items] _download_magnet_by_id returned {count}") - return count - except Exception as e: - debug(f"[download_items] Failed to download by magnet_id: {e}") + + active_id = magnet_id_direct if magnet_id_direct is not None else path_id + + if active_id is not None: + try: + magnet_id = int(active_id) + debug(f"[download_items] Found magnet_id {magnet_id}, downloading files directly") + cfg = config if isinstance(config, dict) else (self.config or {}) + count = self._download_magnet_by_id( + magnet_id, + output_dir, + cfg, + emit, + progress, + quiet_mode, + path_from_result, + ) + debug(f"[download_items] _download_magnet_by_id returned {count}") + return count + except Exception as e: + debug(f"[download_items] Failed to download by magnet_id: {e}") spec = self._resolve_magnet_spec_from_result(result) if not spec: diff --git a/ProviderCore/registry.py b/ProviderCore/registry.py index 3db6985..c2eed20 100644 --- a/ProviderCore/registry.py +++ b/ProviderCore/registry.py @@ -398,7 +398,7 @@ def match_provider_name_for_url(url: str) -> Optional[str]: dom = dom_raw.lower() if not dom: 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): return info.canonical_name continue diff --git a/SYS/metadata.py b/SYS/metadata.py index d0dd974..03f516f 100644 --- a/SYS/metadata.py +++ b/SYS/metadata.py @@ -401,7 +401,9 @@ def normalize_urls(value: Any) -> List[str]: "tidal:", "data:", "ftp:", - "sftp:")) + "sftp:", + "alldebrid:", + "alldebrid🧲")) is_struct_url = ("." in token and "/" in token and not token.startswith((".", "/"))) @@ -444,7 +446,8 @@ def normalize_urls(value: Any) -> List[str]: low = u.lower() has_scheme = low.startswith(( "http://", "https://", "magnet:", "torrent:", "tidal:", - "hydrus:", "ytdl:", "soulseek:", "matrix:", "file:" + "hydrus:", "ytdl:", "soulseek:", "matrix:", "file:", + "alldebrid:", "alldebrid🧲" )) if not (has_scheme or "://" in low): return None diff --git a/cmdlet/add_file.py b/cmdlet/add_file.py index d4d2d41..3a1c60b 100644 --- a/cmdlet/add_file.py +++ b/cmdlet/add_file.py @@ -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) 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__}") log("File path could not be resolved") 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 def _download_provider_source( pipe_obj: models.PipeObject, diff --git a/cmdlet/download_file.py b/cmdlet/download_file.py index 4d873a2..744e2de 100644 --- a/cmdlet/download_file.py +++ b/cmdlet/download_file.py @@ -554,6 +554,7 @@ class Download_File(Cmdlet): dict) else None, progress=progress, config=config, + provider_hint=provider_key ) downloaded_count += 1 @@ -2594,7 +2595,14 @@ class Download_File(Cmdlet): parsed = parse_cmdlet_args(args, self) # 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) 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() except Exception: 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]]: selection_args: Optional[List[str]] = None @@ -2786,9 +2794,15 @@ class Download_File(Cmdlet): and (not parsed.get("path")) and (not parsed.get("output"))): candidate = str(raw_url[0] or "").strip() 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 = ( - ":" 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 = ( (len(candidate) >= 2 and candidate[1] == ":") diff --git a/logs/log_fallback.txt b/logs/log_fallback.txt index 295158d..490532b 100644 --- a/logs/log_fallback.txt +++ b/logs/log_fallback.txt @@ -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: 2026-02-01T04:50:55.684809Z [DEBUG] logger.debug: DEBUG: 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: +2026-02-01T05:38:54.568209Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T05:40:18.877026Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T05:43:21.350318Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T05:49:42.813097Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T05:50:33.449999Z [DEBUG] logger.debug: DEBUG: +2026-02-01T05:50:50.429659Z [DEBUG] logger.debug: DEBUG: +2026-02-01T05:51:07.278581Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T05:56:14.258918Z [DEBUG] logger.debug: DEBUG: +2026-02-01T05:56:31.269220Z [DEBUG] logger.debug: DEBUG: +2026-02-01T05:56:48.009593Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T05:58:26.713034Z [DEBUG] logger.debug: DEBUG: +2026-02-01T05:58:43.176453Z [DEBUG] logger.debug: DEBUG: +2026-02-01T05:58:59.805711Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T06:00:38.435088Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T06:34:20.063041Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T06:40:24.108510Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T06:46:07.717108Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T06:52:22.277695Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T07:02:01.615307Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T07:02:51.552533Z [DEBUG] logger.debug: DEBUG: +2026-02-01T07:03:08.053494Z [DEBUG] logger.debug: DEBUG: +2026-02-01T07:03:24.820605Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T07:07:50.554843Z [DEBUG] logger.debug: DEBUG: +2026-02-01T07:08:07.114662Z [DEBUG] logger.debug: DEBUG: +2026-02-01T07:08:23.620063Z [DEBUG] logger.debug: DEBUG: +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: +2026-02-01T07:09:13.147916Z [DEBUG] logger.debug: DEBUG: +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: +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: +2026-02-01T07:13:04.670391Z [DEBUG] logger.debug: DEBUG: +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)