Try alternate provider episode sources
This commit is contained in:
+62
-37
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user