Python3 library for downloading YouTube Videos.
Project description
Pytubefix
Python3 Library for Downloading YouTube Videos
Installation
pip install pytubefix
Quickstart
Download MP4 Video in Highest Resolution:
from pytubefix import YouTube
from pytubefix.cli import on_progress
url = "url"
yt = YouTube(url, on_progress_callback=on_progress)
print(yt.title)
ys = yt.streams.get_highest_resolution()
ys.download()
Download Audio-Only (.m4a):
from pytubefix import YouTube
from pytubefix.cli import on_progress
url = "url"
yt = YouTube(url, on_progress_callback=on_progress)
print(yt.title)
ys = yt.streams.get_audio_only()
ys.download()
Download a Complete Playlist:
from pytubefix import Playlist
from pytubefix.cli import on_progress
url = "url"
pl = Playlist(url)
for video in pl.videos:
ys = video.streams.get_audio_only()
ys.download()
Use OAuth Authentication:
from pytubefix import YouTube
from pytubefix.cli import on_progress
url = "url"
yt = YouTube(url, use_oauth=True, allow_oauth_cache=True, on_progress_callback=on_progress)
ys = yt.streams.get_highest_resolution()
ys.download() # Authenticate once for subsequent downloads
Specify Output Directory for Downloads:
from pytubefix import YouTube
from pytubefix.cli import on_progress
url = "url"
yt = YouTube(url, on_progress_callback=on_progress)
ys = yt.streams.get_highest_resolution()
ys.download(output_path="path/to/directory")
Working with Subtitles/Caption Tracks
View Available Subtitles:
from pytubefix import YouTube
yt = YouTube('http://youtube.com/watch?v=2lAe1cqCOXo')
print(yt.captions)
Print Subtitle Tracks:
from pytubefix import YouTube
yt = YouTube('http://youtube.com/watch?v=2lAe1cqCOXo')
caption = yt.captions['a.en']
print(caption.generate_srt_captions())
Save Subtitles to a Text File:
from pytubefix import YouTube
yt = YouTube('http://youtube.com/watch?v=2lAe1cqCOXo')
caption = yt.captions['a.en']
caption.save_captions("captions.txt")
Using Channels
Get Channel Name:
from pytubefix import Channel
c = Channel("https://www.youtube.com/@ProgrammingKnowledge/featured")
print(f'Channel name: {c.channel_name}')
Download All Videos from a Channel:
from pytubefix import Channel
c = Channel("https://www.youtube.com/@ProgrammingKnowledge")
print(f'Downloading videos by: {c.channel_name}')
for video in c.videos:
video.streams.get_highest_resolution().download()
Search for Videos
Basic Search:
from pytubefix import Search
results = Search('GitHub Issue Best Practices')
for video in results.videos:
print(f'Title: {video.title}')
print(f'URL: {video.watch_url}')
print(f'Duration: {video.length} sec')
print('---')
Use Filters:
from pytubefix.contrib.search import Search, Filter
filters = (
Filter.create()
.upload_date(Filter.UploadDate.TODAY)
.type(Filter.Type.VIDEO)
.duration(Filter.Duration.UNDER_4_MINUTES)
.feature([Filter.Features.CREATIVE_COMMONS, Filter.Features._4K])
.sort_by(Filter.SortBy.UPLOAD_DATE)
)
s = Search('music', filters=filters)
for video in s.videos:
print(video.watch_url)
AsyncYouTube — Advanced Guide with Complete Examples
AsyncYouTube is a fully asynchronous Python interface built on PyTubeFix, intended for developers who require complete control over YouTube video data. It provides access to video streams, metadata, chapters, key moments, and more — all without blocking your event loop.
Quick Start Example
A full program demonstrating basic usage:
import asyncio
from pytubefix import AsyncYouTube
URL = "YOUR_VIDEO_URL"
async def main():
# Initialize AsyncYouTube with OAuth to handle age-restricted content
yt = AsyncYouTube(URL, use_oauth=True, allow_oauth_cache=True)
# Fetch all available streams asynchronously
streams = await yt.streams()
print("Available Streams:")
for stream in streams:
print(stream)
if __name__ == '__main__':
asyncio.run(main())
Download a Specific Stream
Complete example showing download with progress and completion callbacks:
import asyncio
from pytubefix import AsyncYouTube
URL = "YOUR_VIDEO_URL"
async def main():
def on_progress(stream, chunk, bytes_remaining):
total = stream.filesize
percent = (1 - bytes_remaining / total) * 100
print(f"\rProgress: {percent:.2f}%", end="")
def on_complete(stream, file_path):
print(f"\n√ Done downloading: {file_path}")
yt = AsyncYouTube(URL, use_oauth=True, allow_oauth_cache=True)
yt.register_on_progress_callback(on_progress)
yt.register_on_complete_callback(on_complete)
stream = await yt.get_stream_by_itag(18) # 360p MP4 progressive stream
print(f"Downloading: {await yt.title()}")
stream.download(filename="my_video.mp4") # Blocking call by design
if __name__ == '__main__':
asyncio.run(main())
Note: Always use callbacks to track progress;
download()is synchronous.
Fetch Video Metadata
import asyncio
from pytubefix import AsyncYouTube
URL = "YOUR_VIDEO_URL"
async def main():
yt = AsyncYouTube(URL, use_oauth=True, allow_oauth_cache=True)
title = await yt.title()
views = await yt.views()
likes = await yt.likes()
author = await yt.author()
thumbnail = await yt.thumbnail_url()
print(f"Title: {title}")
print(f"Views: {views}")
print(f"Likes: {likes}")
print(f"Author: {author}")
print(f"Thumbnail URL: {thumbnail}")
if __name__ == '__main__':
asyncio.run(main())
Retrieve Chapters and Key Moments
import asyncio
from pytubefix import AsyncYouTube
URL = "YOUR_VIDEO_URL"
async def main():
yt = AsyncYouTube(URL, use_oauth=True, allow_oauth_cache=True)
chapters = await yt.chapters()
key_moments = await yt.key_moments()
print("Chapters:", chapters)
print("Key Moments:", key_moments)
if __name__ == '__main__':
asyncio.run(main())
Create AsyncYouTube from Video ID
import asyncio
from pytubefix import AsyncYouTube
VIDEO_ID = "YOUR_VIDEO_ID"
async def main():
yt = AsyncYouTube.from_id(VIDEO_ID, use_oauth=True, allow_oauth_cache=True)
streams = await yt.streams()
print("Streams fetched from Video ID:")
for s in streams:
print(s)
if __name__ == '__main__':
asyncio.run(main())
Best Practices
- Always
awaitasynchronous methods:streams(),title(),views(),likes(),chapters(),key_moments(). - Use
use_oauth=Trueto handle age-restricted content; cache tokens to minimize repeated logins. - Wrap network calls in
try/exceptto handle errors gracefully. - Combine callbacks with asyncio for efficient non-blocking downloads.
- Maintain consistent program structure with
main()andasyncio.run()for readability and maintainability.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytubefix-10.3.8.tar.gz.
File metadata
- Download URL: pytubefix-10.3.8.tar.gz
- Upload date:
- Size: 1.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a5bc786db22aecc266061d02229feb760763182d293c66d01a74b18ad4c089a
|
|
| MD5 |
76c2b6453fe8977dbb4f78e82c09a317
|
|
| BLAKE2b-256 |
c2f297b3a26b248663251cdae1d1b0394fc8654e1cf27db4f82adc28382619f5
|
File details
Details for the file pytubefix-10.3.8-py3-none-any.whl.
File metadata
- Download URL: pytubefix-10.3.8-py3-none-any.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0cf833077949418c39a0b559277edba140d8dcbafa49974bd2f3cbc8d8e0ab50
|
|
| MD5 |
3549c068dd674f5ff8c033fe33df56ce
|
|
| BLAKE2b-256 |
a6b96dd43e867c1bb6df8c2ef4156d02012f020fda16f58950bd9ee6dfbc4bcf
|