Skip to main content

YouTube Helper

🇫🇷 · 🇬🇧

CI License: BSD-3-Clause Python Local-first

YouTube Helper belongs to a collection of libraries called AI Helpers developed for building Artificial Intelligence.

The Promise

Local-first by design. youtube-helper runs entirely on your machine: it fetches only the media you ask for, and your data is never uploaded to a third-party service. No telemetry, no account, no cloud lock-in. You own the whole pipeline. Part of the AI Helpers suite: sovereignty over your data through local-first open source.

(youtube-helper does reach the internet: it downloads media from the source site you point it at. The promise is about no exfiltration and no telemetry, nothing about you or your requests is ever sent anywhere except the site hosting the media you asked for.)

🌍 AI Helpers

logo

YouTube Helper is a Python library that provides utility functions for downloading videos, audio, and thumbnails from platforms like YouTube, Vimeo, and DailyMotion using yt-dlp. It also supports post-processing tasks such as converting or merging media files with ffmpeg.

Documentation

💻 Documentation

🗺️ Landscape

📋 Examples

Features

Downloads (to disk), in youtube_helper.main:

  • download_video(url, output_path) / download_audio(url, output_path) / download_thumbnail(url, output_path).
  • video_url_meta_data(url) / is_valid_video_url(url) for cheap metadata probes.
  • default_ytdlp_options(verbose, ...) for customisable yt-dlp options.

Stream catalog and direct-URL resolution, in youtube_helper.streaming:

  • resolve_direct_url(url, prefer="audio"|"video"): a quick "give me one direct ffmpeg-ready URL".
  • list_video_streams(url): enumerate every video format yt-dlp finds (codec, resolution, fps, bitrate, and more).
  • pick_video_stream(url, prefer_codec=, prefer_format=, max_fps=, language=, cookies_from_browser=): constrained picker, returns one VideoStreamInfo ready to feed video_helper.extract_frames.
  • extract_frames_stream(url, ..., **extract_frames_kwargs): one-call composition of pick_video_stream and video_helper.extract_frames. It auto-wires headers and forwards any extract_frames kwarg (destination, device, batch_size, output_width, frame_step, and more), the shortest path from a YouTube, Vimeo, or Twitch URL to ML-ready frames.
  • The audio stream catalog and picker intentionally live in podcast-helper, the suite's single owner for audio PCM streaming.

No-API engagement metadata, in youtube_helper.branding:

  • channel_info(url) / channel_videos(url, max_videos, include_shorts, include_lives): a channel snapshot plus a paginated video list, with normalised engagement metrics on a cross-platform schema.
  • video_engagement(url) / engagement_batch([urls]): per-video views, likes, comments, and channel follower count, with a tolerant batched variant.
  • video_subtitles(url, output_dir, langs=("fr","en")): auto-subtitle download.
  • video_comments(url, max_count, cookies_from_browser="firefox"|"chrome"|...): a comments sample.
  • is_short(meta) / ensure_recent_ytdlp(min_version): helpers.
  • Built on yt-dlp's public metadata only: no Google Data API, no Vimeo API, no OAuth, no quota.

Installation

Prerequisites: Python 3.10-3.13, git, yt-dlp, and ffmpeg, cross-platform:

  • 🍎 macOS (Homebrew): brew install python git yt-dlp ffmpeg
  • 🐧 Ubuntu/Debian: sudo apt update && sudo apt install -y python3 python3-pip git yt-dlp ffmpeg
  • 🪟 Windows (PowerShell): winget install Python.Python.3.12 Git.Git yt-dlp.yt-dlp Gyan.FFmpeg

Optional — Tor (only needed for the download resilience fallback #3):

  • 🍎 macOS (Homebrew): brew install tor && brew services start tor
  • 🐧 Ubuntu/Debian: sudo apt update && sudo apt install -y tor (the package's systemd service starts automatically; if not, sudo systemctl enable --now tor)
  • 🪟 Windows: choco install tor (Chocolatey), then run tor in a terminal — or install the Tor Browser and set YOUTUBE_HELPER_TOR_PROXY=socks5h://127.0.0.1:9150 (its bundled proxy listens on 9150, not the standalone daemon's default 9050)

We recommend using Python environments. Check this link if you're unfamiliar with setting one up: 🥸 Tech tips.

From PyPI (recommended)

pip install youtube-helper

# Optional surfaces
pip install "youtube-helper[cli]"       # click-based CLI twin
pip install "youtube-helper[api]"       # FastAPI HTTP surface

From source (no PyPI)

git clone https://github.com/warith-harchaoui/youtube-helper.git
cd youtube-helper
pip install -e .

# Optional surfaces
pip install -e ".[cli]"
pip install -e ".[api]"

Usage

For the full catalog of recipes (downloads, stream catalog / picker, direct-URL resolver, composing with video-helper, branding metadata, subtitles & comments), see 📋 EXAMPLES.md.

Quick start: download a video, extract metadata, and download the audio:

import youtube_helper as yth
import video_helper as vh
import audio_helper as ah
import os_helper as osh
import os

osh.verbosity(0)

# Example YouTube URL
youtube_url = "https://www.youtube.com/watch?v=YE7VzlLtp-4"

folder = "yt_tests"
os.makedirs(folder, exist_ok=True)

# Download a video
video = "big-buck-bunny.mp4"
video = os.path.join(folder, video)
yth.download_video(youtube_url, video)

# Extract metadata from the video URL
metadata = yth.video_url_meta_data(youtube_url)
print(metadata["title"])
# Big Buck Bunny

print(metadata["duration"])
# 597

print(metadata["description"])
# Big Buck Bunny tells the story of a giant rabbit with a heart bigger than himself. When one sunny day three rodents rudely harass him, something snaps... and the rabbit ain't no bunny anymore! In the typical cartoon tradition he prepares the nasty rodents a comical revenge.
# 
# Licensed under the Creative Commons Attribution license
# 
# http://www.bigbuckbunny.org/

print(metadata["channel"])
# Blender

details = vh.video_dimensions(video)
print(details)
# {'width': 1280, 'height': 720, 'duration': 596.458, 'frame_rate': 24.0, 'has_sound': True}

# Download the audio from the video
audio = "big-buck-bunny.mp3"
audio = os.path.join(folder, audio)
yth.download_audio(youtube_url, audio)

audio, sample_rate = ah.load_audio(audio)
print(sample_rate)
# 44100

Download resilience

Every yt-dlp call in youtube_helper.main (metadata, thumbnail, audio, video) retries automatically when the normal approach gets blocked (rate-limiting, bot checks, IP bans):

  1. Normal: the default request, as configured by default_ytdlp_options.
  2. Browser User-Agent: retried with a fully-populated, up-to-date desktop Chrome User-Agent and matching headers. Override with the YOUTUBE_HELPER_USER_AGENT environment variable.
  3. Tor: retried again over a local Tor SOCKS proxy (socks5h://127.0.0.1:9050 by default, so DNS is resolved through Tor too). Requires a Tor daemon running locally — see the per-OS install commands under Installation. Override the proxy URL with YOUTUBE_HELPER_TOR_PROXY.

If all three fail, the original error from the last attempt is raised.

Legal and Ethical Use

YouTube Helper is a thin wrapper around yt-dlp and ffmpeg. You are responsible for how you use it. Only download or process media that you own, that is in the public domain or under a permissive license (e.g. Creative Commons), or for which you have explicit permission from the rights holder. Respect each platform's Terms of Service and any applicable copyright, privacy, and data-protection laws in your jurisdiction. The authors provide this library for legitimate uses such as personal archiving, accessibility, research, and content you have rights to, not for circumventing access controls or redistributing copyrighted material.

Multi-surface exposure

youtube-helper is not just a library: the same functions are exposed as two CLIs, a FastAPI HTTP surface, MCP tools, and a browser GUI:

# Python library (default)
import youtube_helper as yth

# argparse-based CLI (installed automatically)
youtube-helper metadata     --url https://www.youtube.com/watch?v=YE7VzlLtp-4
youtube-helper audio        --url https://www.youtube.com/watch?v=YE7VzlLtp-4 --output out.mp3
youtube-helper resolve      --url https://www.youtube.com/watch?v=YE7VzlLtp-4 --prefer audio
youtube-helper channel-info --url https://www.youtube.com/@blender

# click-based CLI twin (needs the [cli] extra)
pip install "youtube-helper[cli]"
youtube-helper-click metadata --url https://www.youtube.com/watch?v=YE7VzlLtp-4

# FastAPI HTTP surface (needs the [api] extra)
pip install "youtube-helper[api]"
uvicorn youtube_helper.api:app --port 8000
# → OpenAPI docs at http://localhost:8000/docs

# Browser GUI (needs the [api] extra): paste a URL, pick audio or video
uvicorn youtube_helper.api:app --port 8000
# → open http://localhost:8000/gui  (or just http://localhost:8000/)

# MCP tools (needs the [mcp] extra): same app, plus an /mcp endpoint
pip install "youtube-helper[mcp]"
youtube-helper-mcp

Download bench GUI (GET /gui): a single self-contained page (Tailwind via CDN + vanilla JS, no build step). Paste a YouTube (or any yt-dlp-supported) URL, choose audio (with a sample rate) or video, hit Download, and the result plays inline with a download link. It POSTs to the same /audio / /video endpoints, zero extra server logic. Local-first: the page only talks to your local API.

See TRIGGERS.md for the exhaustive catalogue of what fires each operation.

Docker image:

docker build -t youtube-helper .
docker run --rm -p 8000:8000 youtube-helper

A richer GUI plan (video library board, channel comparator, batch downloader) lives in GUI.md.

Author

Acknowledgements

Special thanks to Mohamed Chelali and Bachir Zerroug for fruitful discussions.

License

This project is licensed under the BSD-3-Clause License. See the LICENSE file for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

youtube_helper-2.2.0.tar.gz (59.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

youtube_helper-2.2.0-py3-none-any.whl (47.5 kB view details)

Uploaded Python 3

File details

Details for the file youtube_helper-2.2.0.tar.gz.

File metadata

  • Download URL: youtube_helper-2.2.0.tar.gz
  • Upload date:
  • Size: 59.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for youtube_helper-2.2.0.tar.gz
Algorithm Hash digest
SHA256 407aff8c1d8f062e35853db37b4936c348ac32d1da35967c4122e098a90cc2d8
MD5 3e38eb660c98a0fccb91d75d62c2e4d4
BLAKE2b-256 c7071854bec1034586acd7373134b30e0f8073c827956b2b181aa35f83f5dbbe

See more details on using hashes here.

File details

Details for the file youtube_helper-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: youtube_helper-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 47.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for youtube_helper-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9e5d9fe22a4846aee93e86089b5f44f0fdc15decf38cb0c7884864e8e0e51781
MD5 35cba51ce44f56451b0d32f56cb7d654
BLAKE2b-256 c643f360164b6117a811d3ec027d963ac0b065d81205a46430481245aace213a

See more details on using hashes here.

Release history Release notifications | RSS feed

2.3.0

2 files

2.2.1

2 files

This release

2.2.0 This release

2 files

2.1.2

2 files

2.1.1

2 files

2.1.0

2 files

2.0.0

2 files

1.5.1

2 files

1.5.0

2 files

1.4.0

2 files

1.3.9

2 files

1.3.8

2 files

1.3.7

2 files

1.3.6

2 files

1.3.5

2 files

1.3.4

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page