Registry /
http-networking / bgutil-ytdlp-pot-provider
Install & Compatibility
Where this runs
tested against v1.3.1 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
muslpy 3.10–3.920 runs
installs and imports cleanly · install 0.0s · import 0.000s · 17.8MB
glibcpy 3.10–3.920 runs
installs and imports cleanly · install 1.5s · import 0.000s · 18MB
16MB installed
● package 16MB
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
Not applicable for direct import
✓ This library is a yt-dlp plugin and is used via yt-dlp's command-line interface. Direct Python imports for end-user code are not typically needed or exposed.
The functionality is integrated into yt-dlp, and you interact with it by configuring yt-dlp parameters or ensuring the external provider is running.
This quickstart demonstrates how to use `yt-dlp` from Python to download a video, leveraging the `bgutil-ytdlp-pot-provider` plugin. It assumes the Rust POT Provider server is already running, which is the recommended setup. The Python code executes `yt-dlp` as a subprocess with the necessary extractor arguments to direct it to the POT provider.
# Step 1: Install and start the Rust POT Provider (recommended)
# Download the appropriate binary from https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs/releases
# For example, for Linux x86_64:
# wget https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs/releases/latest/download/bgutil-pot-linux-x86_64
# chmod +x bgutil-pot-linux-x86_64
# mv bgutil-pot-linux-x86_64 /usr/local/bin/bgutil-pot
# Start the provider (e.g., in a separate terminal or as a service):
# bgutil-pot server --port 4416
# Step 2: Install the Python plugin
# pip install -U bgutil-ytdlp-pot-provider
import subprocess
import os
# Example: Download a YouTube video using yt-dlp with the POT provider
# Ensure the Rust POT server is running on the default port 4416 or configured correctly.
def download_video_with_pot(video_url):
try:
# yt-dlp automatically detects and uses the running POT provider.
# The 'youtubepot-bgutilhttp:' prefix is used by yt-dlp to specify
# using the bgutil-ytdlp-pot-provider HTTP mode.
command = [
"yt-dlp",
"--extractor-args", "youtubepot-bgutilhttp:base_url=http://127.0.0.1:4416",
video_url
]
print(f"Attempting to download {video_url} with POT...")
result = subprocess.run(command, check=True, capture_output=True, text=True)
print("Download successful!")
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error during download: {e}")
print(f"Stdout: {e.stdout}")
print(f"Stderr: {e.stderr}")
except FileNotFoundError:
print("Error: yt-dlp command not found. Please ensure yt-dlp is installed and in your PATH.")
# Replace with your desired YouTube video URL
video_to_download = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
download_video_with_pot(video_to_download)
Debug
Known issues
breakingMajor breaking changes occurred in version 1.0.0. Both the external POT provider (Node.js/Deno/Rust) and the Python plugin must be updated in sync. Extractor arguments changed significantly.fixUpdate both the plugin and your POT provider to the latest versions. Adjust `yt-dlp` extractor arguments: `youtube:getpot_bgutil_baseurl` became `youtubepot-bgutilhttp:base_url` and `youtube:getpot_bgutil_script` became `youtubepot-bgutilscript:script_path`.
affects: Before 1.0.0
breakingThe `yt-dlp` dependency requires version 2025.05.22 or above for compatibility with the plugin's features and to address YouTube changes.fixUpdate `yt-dlp` to the latest version using `pip install -U yt-dlp`.
affects: < 2025.05.22 of yt-dlp
deprecatedWhen using the standalone provider (server or script), passing `visitor_data` or `data_sync_id` is deprecated. YouTube changes also led to the removal of `disable_innertube`.fixUse `--content-binding` instead of `--visitor-data` or `--data-sync-id` for script methods. Be aware that `disable_innertube` is no longer supported and may break POT generation for certain clients if no webpage is available.
affects: Before 1.0.0
gotchaProviding a POT token does not guarantee bypassing all 403 errors or bot checks, as YouTube's detection mechanisms are constantly evolving. It may only help your traffic appear more legitimate.fixMonitor `yt-dlp` and `bgutil-ytdlp-pot-provider` releases for updates, which often include fixes for new YouTube changes. Consider alternative proxies or networks if issues persist.
affects: All versions
gotchaIf using a local proxy server with the Dockerized POT provider, the Docker container's network isolation will prevent access unless `--net=host` is added to the `docker run` command.fixWhen running the Docker container for the POT provider, add `--net=host` to the `docker run` command if the provider needs to access a proxy running on the host machine.
affects: All versions with Docker
gotchaThe JavaScript-based POT generation script (as opposed to the HTTP server option or Rust implementation) is not recommended for high-concurrency usage. Each `yt-dlp` call incurs the overhead of spawning a new Node.js process.fixUse the HTTP server option (Node.js/Deno) or, preferably, the Rust POT provider in HTTP server mode for better performance and concurrency.
affects: All versions using JavaScript script mode
Upgrade
Version history
1.3.1latest on PyPI · released Mar 7, 2026
Audit
Dependencies
yt-dlprequiredRequired for the plugin to function; must be version 2025.05.22 or above.
Rust POT Provider (bgutil-pot)requiredExternal application (binary or Docker) that generates the actual POT tokens. The Python plugin communicates with this provider. The Rust implementation is recommended for performance and ease of deployment.
Node.js (>= 20) or Deno (>= 2.0.0)optionalAlternative runtime required if using the original JavaScript-based POT provider instead of the Rust version.
DockeroptionalRequired if running either the Node.js/Deno or Rust POT provider as a Docker container.