pytube3 — Biblioteca Python para YouTube
Documentação completa em Português Brasileiro • Tradução do site oficial pytube3.readthedocs.io
Instalação
Instale pytube3 com um único comando pip. Sem dependências externas, funciona em Python 3.6+.
InícioInício Rápido
Baixe seu primeiro vídeo do YouTube em apenas 3 linhas de código. Exemplos práticos e diretos.
TutorialStreams
Entenda o conceito de streams — vídeo+áudio combinados (muxed) vs. streams adaptativos separados.
GuiaFiltros de Stream
Filtre streams por resolução, codec, tipo de mídia, fps e outros atributos com a API fluente.
AvançadoPlaylists
Itere sobre uma playlist inteira, acesse os URLs dos vídeos e baixe todos automaticamente.
GuiaLegendas
Acesse e salve legendas de vídeos no formato SRT ou XML. Suporte a múltiplos idiomas.
GuiaCallbacks de Progresso
Monitore o progresso do download em tempo real com funções de callback personalizadas.
AvançadoReferência de API
Documentação completa de todas as classes, métodos e atributos disponíveis no pytube3.
ReferênciaExceções
Conheça todas as exceções que o pytube3 pode lançar e aprenda a tratá-las corretamente.
Referência📦 Instalação
Configure o ambiente e instale o pytube3 em minutos.
Requisitos do Sistema
- Python 3.6 ou superior (3.8+ recomendado)
- Acesso à internet
- pip atualizado
Instalação via pip (recomendado)
A maneira mais simples de instalar o pytube3 é via pip:
pip install pytube3
Instalação com ambiente virtual
É uma boa prática usar um ambiente virtual para isolar as dependências do projeto:
# Criar ambiente virtual python -m venv venv # Ativar no Linux/macOS source venv/bin/activate # Ativar no Windows venv\Scripts\activate # Instalar pytube3 pip install pytube3
Instalação a partir do código-fonte
Para obter a versão mais recente diretamente do repositório GitHub:
git clone https://github.com/hgrecco/pytube3.git cd pytube3 pip install -e .
Verificando a instalação
python -c "import pytube; print(pytube.__version__)"
Atualização
pip install --upgrade pytube3
pytube e pytube3
no mesmo ambiente virtual, pois ambos definem o pacote pytube e podem
causar conflitos.
⚡ Início Rápido
Do zero ao primeiro download em 3 linhas de código.
Seu primeiro download
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
yt.streams.first().download()
Com apenas três linhas você já tem o vídeo baixado na pasta atual! Vamos entender cada passo.
Importar e criar o objeto YouTube
from pytube import YouTube
# Passa a URL do vídeo como argumento
yt = YouTube("https://www.youtube.com/watch?v=SEU_VIDEO_ID")
Acessar metadados do vídeo
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
print("Título: ", yt.title)
print("Autor: ", yt.author)
print("Duração: ", yt.length, "segundos")
print("Descrição: ", yt.description[:200])
print("Miniatura: ", yt.thumbnail_url)
print("Views: ", yt.views)
print("Publicado: ", yt.publish_date)
print("Avaliação: ", yt.rating)
Listar streams disponíveis
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# Exibe todos os streams disponíveis
for stream in yt.streams:
print(stream)
A saída será algo como:
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video"> <Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2" progressive="True" type="video"> <Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028" progressive="False" type="video"> ...
Baixar a melhor resolução
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# Stream de melhor qualidade com áudio+vídeo
stream = yt.streams.get_highest_resolution()
stream.download(output_path="/meus/videos", filename="meu_video.mp4")
print("Download concluído!")
Baixar apenas o áudio
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# Stream de áudio com maior bitrate
audio = yt.streams.filter(only_audio=True).first()
audio.download(output_path=".", filename="musica.mp4")
print("Áudio baixado!")
progressive=True) contêm
vídeo e áudio no mesmo arquivo e são geralmente a escolha mais simples. Streams adaptativos
(adaptive=True) oferecem qualidade mais alta mas vêm separados (vídeo e áudio
precisam ser remixados com ffmpeg).
🎞️ Streams
Entenda os tipos de streams e como trabalhar com eles.
O que são Streams?
Quando um vídeo é disponibilizado no YouTube, ele é codificado em múltiplos formatos e resoluções — cada um desses é chamado de stream. O pytube3 permite inspecionar e baixar qualquer um desses streams.
Tipos de Stream
Progressive (Progressivo)
Contém vídeo e áudio no mesmo arquivo. Resolução máxima 720p. O mais simples de usar.
Recomendado para iniciantesAdaptive (Adaptativo)
Vídeo e áudio em streams separados. Suporta resoluções até 4K+. Precisa de merge com ffmpeg.
Alta qualidadeAcessando o objeto StreamQuery
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# O atributo .streams retorna um objeto StreamQuery
streams = yt.streams
print(type(streams)) # <class 'pytube.query.StreamQuery'>
# Listar todos
for s in streams:
print(s)
Atributos de um Stream
| Atributo | Tipo | Descrição |
|---|---|---|
| itag | int | Identificador único do stream no YouTube |
| mime_type | str | Tipo MIME, ex.: video/mp4, audio/webm |
| resolution | str | Resolução do vídeo, ex.: 720p, 1080p |
| fps | int | Frames por segundo (24, 30, 60...) |
| vcodec | str | Codec de vídeo, ex.: avc1.640028 |
| acodec | str | Codec de áudio, ex.: mp4a.40.2 |
| abr | str | Bitrate de áudio, ex.: 128kbps |
| filesize | int | Tamanho do arquivo em bytes |
| type | str | video ou audio |
| is_progressive | bool | True se contiver vídeo e áudio juntos |
| is_adaptive | bool | True se for stream adaptativo separado |
Métodos de download
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
stream = yt.streams.get_highest_resolution()
# Baixar para o diretório atual
stream.download()
# Especificar pasta de destino
stream.download(output_path="C:/Videos")
# Especificar nome do arquivo
stream.download(filename="rick_roll.mp4")
# Pasta + nome
stream.download(output_path="C:/Videos", filename="rick_roll.mp4")
# Obter bytes sem salvar em disco
data = stream.download(skip_existing=False)
Verificar tamanho antes de baixar
stream = yt.streams.get_highest_resolution()
# Tamanho em bytes
bytes_total = stream.filesize
mb = bytes_total / (1024 * 1024)
print(f"Tamanho: {mb:.1f} MB")
🔍 Filtros de Stream
Use a API fluente para encontrar exatamente o stream que você precisa.
Método filter()
O método filter() aceita múltiplos parâmetros e retorna um novo
StreamQuery com apenas os streams que satisfazem todos os critérios.
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# Filtrar por tipo progressivo (áudio + vídeo)
streams = yt.streams.filter(progressive=True)
# Filtrar apenas vídeos
videos = yt.streams.filter(type="video")
# Filtrar apenas áudios
audios = yt.streams.filter(type="audio")
# Filtrar por extensão
mp4s = yt.streams.filter(file_extension="mp4")
# Filtrar por resolução
hd = yt.streams.filter(res="720p")
# Filtrar por codec de vídeo
h264 = yt.streams.filter(video_codec="avc1.640028")
# Combinar filtros (AND lógico)
best = yt.streams.filter(progressive=True, file_extension="mp4")
Parâmetros disponíveis para filter()
| Parâmetro | Tipo | Descrição |
|---|---|---|
| fps | int | Frames por segundo |
| res / resolution | str | Resolução do vídeo (ex: "1080p") |
| mime_type | str | Tipo MIME (ex: "video/mp4") |
| type | str | "video" ou "audio" |
| progressive | bool | Apenas streams progressivos |
| adaptive | bool | Apenas streams adaptativos |
| is_dash | bool | Apenas streams DASH |
| only_audio | bool | Apenas streams com pista de áudio |
| only_video | bool | Apenas streams sem pista de áudio |
| file_extension | str | Extensão do arquivo (ex: "mp4") |
| abr | str | Taxa de bits de áudio (ex: "128kbps") |
| video_codec | str | Codec de vídeo |
| audio_codec | str | Codec de áudio |
| custom_filter_functions | list | Lista de funções lambda personalizadas |
Métodos de seleção
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# Primeiro resultado
primeiro = yt.streams.first()
# Último resultado
ultimo = yt.streams.last()
# Por itag específico
stream = yt.streams.get_by_itag(22)
# Maior resolução disponível (progressivo)
melhor = yt.streams.get_highest_resolution()
# Menor resolução disponível
pior = yt.streams.get_lowest_resolution()
# Melhor qualidade de áudio
audio = yt.streams.get_audio_only()
Ordenação
# Ordenar por atributo
ordenado = yt.streams.order_by("resolution").desc()
for s in ordenado:
print(s.resolution, s.mime_type)
Filtros personalizados com lambda
# Apenas streams maiores que 100 MB
grandes = yt.streams.filter(
custom_filter_functions=[
lambda s: s.filesize > 100 * 1024 * 1024
]
)
# Streams progressivos em MP4 com resolução maior que 360p
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
bons = yt.streams.filter(
custom_filter_functions=[
lambda s: s.is_progressive and
s.mime_type == "video/mp4" and
int((s.resolution or "0p")[:-1]) > 360
]
)
📋 Playlists
Baixe coleções inteiras de vídeos com a classe Playlist.
Importar e usar a classe Playlist
from pytube import Playlist
pl = Playlist("https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxx")
# Título da playlist
print(pl.title)
# Lista de URLs dos vídeos
for url in pl.video_urls:
print(url)
Baixar todos os vídeos da playlist
from pytube import Playlist, YouTube
pl = Playlist("https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxx")
print(f"Baixando {len(pl.video_urls)} vídeos de: {pl.title}")
for i, url in enumerate(pl.video_urls):
yt = YouTube(url)
stream = yt.streams.get_highest_resolution()
stream.download(output_path="minha_playlist")
print(f" [{i+1}] {yt.title} ✓")
Atributos da Playlist
| Atributo / Método | Tipo | Descrição |
|---|---|---|
| title | str | Título da playlist |
| video_urls | list | Lista de URLs de todos os vídeos |
| videos | generator | Gerador de objetos YouTube |
| length | int | Número de vídeos na playlist |
| owner | str | Nome do criador da playlist |
| playlist_id | str | ID único da playlist |
| playlist_url | str | URL completa da playlist |
Baixar playlist com tratamento de erros
from pytube import Playlist, YouTube
from pytube.exceptions import VideoUnavailable
pl = Playlist("https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxx")
for url in pl.video_urls:
try:
yt = YouTube(url)
yt.streams.get_highest_resolution().download("playlist_output")
print(f"✓ {yt.title}")
except VideoUnavailable:
print(f"✗ Vídeo indisponível: {url}")
except Exception as e:
print(f"✗ Erro em {url}: {e}")
💬 Legendas (Captions)
Acesse e salve legendas de vídeos em múltiplos idiomas.
Listar legendas disponíveis
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# Dicionário de legendas disponíveis
print(yt.captions)
# {'en': <Caption lang="English" code="en">, 'pt': <Caption lang="Portuguese" code="pt">, ...}
Obter uma legenda específica
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
# Por código de idioma
legenda_pt = yt.captions.get_by_language_code("pt")
legenda_en = yt.captions.get_by_language_code("en")
if legenda_pt:
print(legenda_pt.name) # "Portuguese"
print(legenda_pt.code) # "pt"
Gerar SRT (formato de legenda padrão)
from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
legenda = yt.captions.get_by_language_code("en")
# Gerar conteúdo SRT
srt_content = legenda.generate_srt_captions()
print(srt_content[:500])
# Salvar em arquivo
with open("legenda.srt", "w", encoding="utf-8") as f:
f.write(srt_content)
Salvar XML original
legenda = yt.captions.get_by_language_code("en")
# XML bruto do YouTube
xml_content = legenda.xml_captions
with open("legenda.xml", "w", encoding="utf-8") as f:
f.write(xml_content)
Atributos da classe Caption
| Atributo / Método | Tipo | Descrição |
|---|---|---|
| code | str | Código do idioma (ex: "pt", "en") |
| name | str | Nome do idioma (ex: "Portuguese") |
| xml_captions | str | Conteúdo XML bruto das legendas |
| generate_srt_captions() | str | Converte e retorna no formato SRT |
"a.en" ou similar).
🔔 Callbacks de Progresso
Monitore o download em tempo real com funções de callback.
Callback de progresso
O pytube3 permite registrar callbacks que são chamados periodicamente durante o download, possibilitando a exibição de barras de progresso ou logs customizados.
from pytube import YouTube
def ao_progredir(stream, chunk, bytes_restantes):
"""Chamado a cada chunk baixado."""
total = stream.filesize
baixado = total - bytes_restantes
porcentagem = (baixado / total) * 100
print(f"\r⬇️ {porcentagem:.1f}% [{baixado // 1024} KB / {total // 1024} KB]", end="")
def ao_completar(stream, caminho):
"""Chamado quando o download finaliza."""
print(f"\n✅ Download completo: {caminho}")
yt = YouTube(
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
on_progress_callback=ao_progredir,
on_complete_callback=ao_completar
)
yt.streams.get_highest_resolution().download()
Barra de progresso com tqdm
from pytube import YouTube
from tqdm import tqdm
barra = None
def init_barra(stream, *args):
global barra
barra = tqdm(total=stream.filesize, unit="B", unit_scale=True, desc=stream.title[:30])
def atualizar_barra(stream, chunk, bytes_restantes):
if barra:
barra.update(len(chunk))
def fechar_barra(stream, caminho):
if barra:
barra.close()
yt = YouTube(
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
on_progress_callback=atualizar_barra,
on_complete_callback=fechar_barra
)
yt.streams.get_highest_resolution().download()
Assinaturas dos callbacks
| Callback | Parâmetros | Descrição |
|---|---|---|
| on_progress_callback | (stream, chunk, bytes_remaining) |
Chamado a cada chunk recebido durante o download |
| on_complete_callback | (stream, file_path) |
Chamado uma vez quando o download termina |
📖 Referência de API
Documentação completa de todas as classes e métodos do pytube3.
Classe YouTube
Classe principal para interagir com um vídeo do YouTube.
Construtor
YouTube(
url: str,
on_progress_callback: Optional[Callable] = None,
on_complete_callback: Optional[Callable] = None,
proxies: Optional[Dict[str, str]] = None,
use_oauth: bool = False,
allow_oauth_cache: bool = True
)
Atributos da classe YouTube
| Atributo | Tipo | Descrição |
|---|---|---|
| title | str | Título do vídeo |
| description | str | Descrição completa do vídeo |
| author | str | Nome do canal / criador |
| channel_id | str | ID do canal no YouTube |
| channel_url | str | URL do canal |
| length | int | Duração em segundos |
| views | int | Número de visualizações |
| rating | float | Avaliação média (0–5) |
| thumbnail_url | str | URL da imagem de miniatura |
| publish_date | datetime | Data de publicação |
| keywords | list | Lista de palavras-chave / tags |
| video_id | str | ID único do vídeo (11 chars) |
| watch_url | str | URL completa de watch |
| embed_url | str | URL de embed do vídeo |
| streams | StreamQuery | Objeto de consulta de streams |
| captions | CaptionQuery | Objeto de consulta de legendas |
| age_restricted | bool | True se o vídeo tiver restrição de idade |
Classe StreamQuery
Retornado por YouTube.streams. Suporta filtragem, ordenação e seleção de streams.
| Método | Retorno | Descrição |
|---|---|---|
| filter(**kwargs) | StreamQuery | Filtra streams por atributos |
| order_by(attribute) | StreamQuery | Ordena por atributo |
| asc() | StreamQuery | Ordem crescente |
| desc() | StreamQuery | Ordem decrescente |
| first() | Stream | Primeiro stream da lista |
| last() | Stream | Último stream da lista |
| get_by_itag(itag) | Stream | Stream com itag específico |
| get_highest_resolution() | Stream | Stream progressivo de maior res. |
| get_lowest_resolution() | Stream | Stream progressivo de menor res. |
| get_audio_only(subtype) | Stream | Stream de áudio de maior qualidade |
| count() | int | Quantidade de streams |
| all() | list | Lista com todos os streams |
Classe Stream
| Método | Parâmetros | Descrição |
|---|---|---|
| download() | output_path, filename, filename_prefix, skip_existing, timeout, max_retries | Inicia o download do stream |
| get_file_path() | filename, output_path, filename_prefix | Retorna o caminho que o arquivo seria salvo |
| includes_audio_track | — | True se o stream tem áudio |
| includes_video_track | — | True se o stream tem vídeo |
| is_progressive | — | True se áudio+vídeo combinados |
| is_adaptive | — | True se stream adaptativo |
| filesize | — | Tamanho em bytes |
| default_filename | — | Nome padrão do arquivo |
Uso com proxy
from pytube import YouTube
proxies = {
"http": "http://usuario:senha@proxy.exemplo.com:8080",
"https": "https://usuario:senha@proxy.exemplo.com:8080",
}
yt = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ", proxies=proxies)
yt.streams.first().download()
⚠️ Exceções
Conheça e trate corretamente todas as exceções do pytube3.
Hierarquia de Exceções
PytubeError ├── MaxRetriesExceeded ├── HTMLParseError ├── ExtractError ├── RegexMatchError ├── VideoUnavailable │ ├── VideoPrivate │ └── VideoRegionBlocked ├── AgeRestrictedError ├── LiveStreamError ├── RecordingUnavailable ├── MembersOnly ├── VideoNotFound ├── UnknownVideoError └── PytubeURLError
Referência de todas as exceções
| Exceção | Causa | Tratamento sugerido |
|---|---|---|
| PytubeError | Classe base de todas as exceções pytube3 | Captura genérica |
| VideoUnavailable | Vídeo removido ou bloqueado | Informar ao usuário, pular na playlist |
| VideoPrivate | Vídeo configurado como privado | Solicitar permissão ao dono |
| VideoRegionBlocked | Vídeo bloqueado na sua região | Usar proxy em outra região |
| AgeRestrictedError | Vídeo com restrição de idade | Autenticar com use_oauth=True |
| LiveStreamError | Stream ao vivo não pode ser baixado | Aguardar o fim da transmissão |
| MembersOnly | Conteúdo exclusivo para membros | Autenticar como membro |
| RecordingUnavailable | Gravação da live não disponível | Tentar mais tarde |
| MaxRetriesExceeded | Limite de tentativas de download excedido | Verificar conexão / usar retry |
| RegexMatchError | Falha ao parsear conteúdo do YouTube | Atualizar pytube3 para versão mais recente |
| ExtractError | Falha na extração de dados do vídeo | Verificar URL e versão do pytube3 |
Exemplo de tratamento de exceções
from pytube import YouTube
from pytube.exceptions import (
VideoUnavailable,
VideoPrivate,
VideoRegionBlocked,
AgeRestrictedError,
LiveStreamError,
MembersOnly,
MaxRetriesExceeded,
RegexMatchError,
)
url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
try:
yt = YouTube(url)
yt.streams.get_highest_resolution().download()
print("✅ Download concluído!")
except VideoPrivate:
print("❌ Vídeo privado. Sem acesso.")
except VideoRegionBlocked:
print("❌ Bloqueado na sua região. Tente com proxy.")
except AgeRestrictedError:
print("❌ Restrição de idade. Use autenticação OAuth.")
except LiveStreamError:
print("❌ Transmissão ao vivo em andamento. Tente após o término.")
except MembersOnly:
print("❌ Conteúdo exclusivo para membros.")
except VideoUnavailable:
print("❌ Vídeo indisponível.")
except MaxRetriesExceeded:
print("❌ Muitas tentativas falharam. Verifique sua conexão.")
except RegexMatchError:
print("❌ Erro de parsing. Atualize o pytube3: pip install --upgrade pytube3")
except Exception as e:
print(f"❌ Erro inesperado: {e}")
🤝 Como Contribuir
Ajude a melhorar o pytube3 com código, testes ou documentação.
Configuração do ambiente de desenvolvimento
# 1. Faça um fork do repositório e clone git clone https://github.com/SEU_USUARIO/pytube3.git cd pytube3 # 2. Crie um ambiente virtual python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 3. Instale em modo de desenvolvimento com extras de teste pip install -e ".[dev]"
Executando os testes
# Todos os testes pytest # Com cobertura de código pytest --cov=pytube # Apenas um arquivo de teste específico pytest tests/test_streams.py # Com saída verbosa pytest -v
Padrões de código
# Verificar linting com flake8 flake8 pytube/ # Formatar com black black pytube/ # Verificar tipos com mypy mypy pytube/
Fluxo de contribuição (Git Flow)
# 1. Crie uma branch para sua feature git checkout -b feature/minha-melhoria # 2. Faça as alterações e commit seguindo Conventional Commits git add . git commit -m "feat: adiciona suporte a download de shorts" # 3. Envie para o GitHub git push origin feature/minha-melhoria # 4. Abra um Pull Request no repositório original
Tipos de contribuição bem-vindas
Correção de Bugs
Abra uma issue descrevendo o bug, inclua um exemplo mínimo reproduzível e a versão do Python/pytube3.
Bug FixNovas Funcionalidades
Discuta primeiro numa issue antes de implementar, para alinhar com os mantenedores.
FeatureDocumentação
Melhorias em docstrings, exemplos, README ou esta documentação em português.
DocsTestes
Ampliar a cobertura de testes unitários e de integração é sempre bem-vindo.
Testspytest), o código está formatado (black) e sem
erros de lint (flake8).