This commit is contained in:
2026-02-14 20:39:33 -08:00
parent ae4880b164
commit 14871a1f02
3 changed files with 63 additions and 10 deletions

View File

@@ -1203,12 +1203,30 @@ class AllDebrid(TableProviderMixin, Provider):
log(f"AllDebrid magnet {magnet_id} has no files", file=sys.stderr)
return 0
file_entries = list(self._flatten_files(file_nodes))
total_files = len(file_entries)
if total_files <= 0:
log(f"AllDebrid magnet {magnet_id} has no downloadable files", file=sys.stderr)
return 0
try:
if progress is not None and hasattr(progress, "begin_steps"):
progress.begin_steps(total_files)
except Exception:
pass
downloaded = 0
for node in self._flatten_files(file_nodes):
for file_idx, node in enumerate(file_entries, 1):
locked_url = str(node.get("l") or node.get("link") or "").strip()
file_name = str(node.get("n") or node.get("name") or "").strip()
relpath = str(node.get("_relpath") or file_name or "").strip()
try:
if progress is not None and hasattr(progress, "step"):
progress.step(f"file {file_idx}/{total_files}: {relpath or file_name or 'download'}")
except Exception:
pass
if not locked_url or not relpath:
continue

View File

@@ -1329,7 +1329,11 @@ class PipelineExecutor:
# This executor is used by both the REPL and the `pipeline` subcommand.
# Quiet/background mode is helpful for detached/background runners, but
# it suppresses interactive UX (like the pipeline Live progress UI).
config["_quiet_background_output"] = bool(self._toolbar_output is None)
try:
is_tty = bool(getattr(sys.stderr, "isatty", lambda: False)())
except Exception:
is_tty = False
config["_quiet_background_output"] = not is_tty
return config
@staticmethod
@@ -2195,6 +2199,37 @@ class PipelineExecutor:
logger.exception("Failed to record pipeline log step for applied row action (pipeline_session=%r)", getattr(pipeline_session, 'worker_id', None))
else:
first_cmd = stages[0][0] if stages and stages[0] else None
first_cmd_norm = _norm_cmd(first_cmd)
inserted_provider_download = False
if first_cmd_norm == "add-file":
# If selected rows advertise an explicit download-file action,
# run download before add-file so add-file receives local files.
if len(selection_indices) == 1:
row_action = _get_row_action(selection_indices[0], items_list)
if row_action and _norm_cmd(row_action[0]) == "download-file":
stages.insert(0, [str(x) for x in row_action if x is not None])
inserted_provider_download = True
debug("Auto-inserting row download-file action before add-file")
# Multi-selection fallback: if any selected row declares a
# download-file action, insert a generic download-file stage.
# This keeps provider-specific behavior in provider metadata.
if (not inserted_provider_download) and len(selection_indices) > 1:
try:
has_download_row_action = False
for idx in selection_indices:
row_action = _get_row_action(idx, items_list)
if row_action and _norm_cmd(row_action[0]) == "download-file":
has_download_row_action = True
break
if has_download_row_action:
stages.insert(0, ["download-file"])
inserted_provider_download = True
debug("Auto-inserting download-file before add-file for provider selection")
except Exception:
pass
if isinstance(table_type, str) and table_type.startswith("metadata.") and first_cmd not in (
"get-tag",
"get_tag",
@@ -2204,7 +2239,7 @@ class PipelineExecutor:
print("Auto-inserting get-tag after metadata selection")
stages.insert(0, ["get-tag"])
elif auto_stage:
first_cmd_norm = _norm_cmd(first_cmd)
first_cmd_norm = _norm_cmd(stages[0][0] if stages and stages[0] else None)
auto_cmd_norm = _norm_cmd(auto_stage[0])
if first_cmd_norm not in (auto_cmd_norm, ".pipe", ".mpv"):
debug(f"Auto-inserting {auto_cmd_norm} after selection")

View File

@@ -1037,7 +1037,7 @@ class Download_File(Cmdlet):
vcodec = str(chosen.get("vcodec", "none"))
acodec = str(chosen.get("acodec", "none"))
if vcodec != "none" and acodec == "none":
selection_format_id = f"{selection_format_id}+ba"
selection_format_id = f"{selection_format_id}+bestaudio/best"
except Exception:
pass
@@ -1332,7 +1332,7 @@ class Download_File(Cmdlet):
selection_format_id = format_id
try:
if vcodec != "none" and acodec == "none" and format_id:
selection_format_id = f"{format_id}+ba"
selection_format_id = f"{format_id}+bestaudio/best"
except Exception:
selection_format_id = format_id
@@ -1572,8 +1572,8 @@ class Download_File(Cmdlet):
vcodec = str(fmt_match.get("vcodec", "none"))
acodec = str(fmt_match.get("acodec", "none"))
if vcodec != "none" and acodec == "none":
debug(f"Selected video-only format {actual_format}; using {actual_format}+ba for audio")
actual_format = f"{actual_format}+ba"
debug(f"Selected video-only format {actual_format}; using {actual_format}+bestaudio/best for audio")
actual_format = f"{actual_format}+bestaudio/best"
except Exception as e:
pass
@@ -1718,7 +1718,7 @@ class Download_File(Cmdlet):
vcodec = str(only.get("vcodec", "none"))
acodec = str(only.get("acodec", "none"))
if vcodec != "none" and acodec == "none" and fallback_format:
selection_format_id = f"{fallback_format}+ba"
selection_format_id = f"{fallback_format}+bestaudio/best"
except Exception:
selection_format_id = fallback_format
@@ -1748,7 +1748,7 @@ class Download_File(Cmdlet):
selection_format_id = format_id
try:
if vcodec != "none" and acodec == "none" and format_id:
selection_format_id = f"{format_id}+ba"
selection_format_id = f"{format_id}+bestaudio/best"
except Exception:
selection_format_id = format_id
@@ -1823,7 +1823,7 @@ class Download_File(Cmdlet):
PipelineProgress(pipeline_context).step("awaiting selection")
log("Requested format is not available; select a working format with @N", file=sys.stderr)
return 0
return 1
raise