Try alternate provider episode sources

This commit is contained in:
Dymas
2026-09-05 09:27:21 +02:00
parent 5718e5fe91
commit a29affd9be
6 changed files with 182 additions and 52 deletions
+62 -37
View File
@@ -673,6 +673,14 @@ def provider_episode_candidates(primary_provider, primary_show_id, title, wanted
print(f"Fallback skipped {provider}: {exc}")
def provider_stream_candidates(provider, episode_id, mode, quality):
payload = bridge("resolve-all", provider, episode_id, mode, quality)
sources = payload.get("sources") or []
if isinstance(sources, list):
return [source for source in sources if isinstance(source, dict) and source.get("url")]
return []
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--provider", default="anikoto")
@@ -728,45 +736,62 @@ def main():
percent=0,
)
print(f"Resolving episode {number} on {active_provider} ({args.mode}, {args.quality})...", flush=True)
stream = bridge("resolve", active_provider, active_ep_id, args.mode, args.quality)
emit_progress(
phase="download",
message=f"Downloading episode {number} from {active_provider} {stream.get('quality') or 'auto'}.",
episode=number,
episode_index=episode_index,
episode_total=len(wanted),
provider=active_provider,
quality=stream.get("quality") or "auto",
percent=0,
)
print(f"Downloading episode {number} from {active_provider} {stream.get('quality') or 'auto'}...", flush=True)
code = download_episode(
stream,
target,
episode_number=number,
episode_index=episode_index,
episode_total=len(wanted),
)
if code != 0:
last_error = RuntimeError(f"ffmpeg failed on {active_provider} with exit code {code}")
streams = provider_stream_candidates(active_provider, active_ep_id, args.mode, args.quality)
if not streams:
last_error = RuntimeError(f"No playable {args.mode} sources on {active_provider}")
print(str(last_error), file=sys.stderr)
continue
try:
for subtitle_path in download_subtitles(stream.get("subtitles") or [], target):
print(f"Saved subtitle: {subtitle_path.name}")
except Exception as exc:
print(f"Subtitle download skipped: {exc}")
emit_progress(
phase="done",
message=f"Episode {number} saved.",
episode=number,
episode_index=episode_index,
episode_total=len(wanted),
percent=100,
)
print(f"Saved: {target.name}", flush=True)
downloaded = True
break
for stream_index, stream in enumerate(streams, start=1):
source_name = stream.get("server") or stream.get("quality") or f"source {stream_index}"
emit_progress(
phase="download",
message=(
f"Downloading episode {number} from {active_provider} "
f"{source_name} ({stream_index}/{len(streams)})."
),
episode=number,
episode_index=episode_index,
episode_total=len(wanted),
provider=active_provider,
quality=stream.get("quality") or "auto",
percent=0,
)
print(
f"Downloading episode {number} from {active_provider} "
f"{source_name} ({stream_index}/{len(streams)})...",
flush=True,
)
code = download_episode(
stream,
target,
episode_number=number,
episode_index=episode_index,
episode_total=len(wanted),
)
if code != 0:
last_error = RuntimeError(
f"Source {source_name} on {active_provider} failed with exit code {code}"
)
print(str(last_error), file=sys.stderr)
continue
try:
for subtitle_path in download_subtitles(stream.get("subtitles") or [], target):
print(f"Saved subtitle: {subtitle_path.name}")
except Exception as exc:
print(f"Subtitle download skipped: {exc}")
emit_progress(
phase="done",
message=f"Episode {number} saved.",
episode=number,
episode_index=episode_index,
episode_total=len(wanted),
percent=100,
)
print(f"Saved: {target.name}", flush=True)
downloaded = True
break
if downloaded:
break
except Exception as exc:
last_error = exc
print(f"Provider {active_provider} failed for episode {number}: {exc}", file=sys.stderr)