pytube3 — Biblioteca Python para YouTube

Documentação completa em Português Brasileiro • Tradução do site oficial pytube3.readthedocs.io

100%
Python Puro
0
Dependências Externas
4K
Suporte até 4K
MP4
Formatos: MP4 / WebM
🔒
Suporte a Cifra
SRT
Download de Legendas
📦

Instalação

Instale pytube3 com um único comando pip. Sem dependências externas, funciona em Python 3.6+.

Início

Início Rápido

Baixe seu primeiro vídeo do YouTube em apenas 3 linhas de código. Exemplos práticos e diretos.

Tutorial
🎞️

Streams

Entenda o conceito de streams — vídeo+áudio combinados (muxed) vs. streams adaptativos separados.

Guia
🔍

Filtros de Stream

Filtre streams por resolução, codec, tipo de mídia, fps e outros atributos com a API fluente.

Avançado
📋

Playlists

Itere sobre uma playlist inteira, acesse os URLs dos vídeos e baixe todos automaticamente.

Guia
💬

Legendas

Acesse e salve legendas de vídeos no formato SRT ou XML. Suporte a múltiplos idiomas.

Guia
🔔

Callbacks de Progresso

Monitore o progresso do download em tempo real com funções de callback personalizadas.

Avançado
📖

Referência de API

Documentação completa de todas as classes, métodos e atributos disponíveis no pytube3.

Referência
⚠️

Exceções

Conheça todas as exceções que o pytube3 pode lançar e aprenda a tratá-las corretamente.

Referência
ℹ️ Sobre o pytube3: pytube3 é um fork do projeto pytube, mantido de forma independente com correções de bugs e suporte a novos formatos do YouTube. É uma biblioteca leve, escrita 100% em Python, sem dependências externas.

📦 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
✅ Dica: O pytube3 não possui dependências externas obrigatórias. Ele usa apenas módulos da biblioteca padrão do Python, tornando a instalação simples e leve.
⚠️ Atenção: Não instale 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!")
✅ Dica: Streams progressivos (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 iniciantes
🔀

Adaptive (Adaptativo)

Vídeo e áudio em streams separados. Suporta resoluções até 4K+. Precisa de merge com ffmpeg.

Alta qualidade

Acessando 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

AtributoTipoDescrição
itagintIdentificador único do stream no YouTube
mime_typestrTipo MIME, ex.: video/mp4, audio/webm
resolutionstrResolução do vídeo, ex.: 720p, 1080p
fpsintFrames por segundo (24, 30, 60...)
vcodecstrCodec de vídeo, ex.: avc1.640028
acodecstrCodec de áudio, ex.: mp4a.40.2
abrstrBitrate de áudio, ex.: 128kbps
filesizeintTamanho do arquivo em bytes
typestrvideo ou audio
is_progressiveboolTrue se contiver vídeo e áudio juntos
is_adaptiveboolTrue se for stream adaptativo separado

Métodos de download

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âmetroTipoDescrição
fpsintFrames por segundo
res / resolutionstrResolução do vídeo (ex: "1080p")
mime_typestrTipo MIME (ex: "video/mp4")
typestr"video" ou "audio"
progressiveboolApenas streams progressivos
adaptiveboolApenas streams adaptativos
is_dashboolApenas streams DASH
only_audioboolApenas streams com pista de áudio
only_videoboolApenas streams sem pista de áudio
file_extensionstrExtensão do arquivo (ex: "mp4")
abrstrTaxa de bits de áudio (ex: "128kbps")
video_codecstrCodec de vídeo
audio_codecstrCodec de áudio
custom_filter_functionslistLista de funções lambda personalizadas

Métodos de seleção

Ordenação

Filtros personalizados com lambda

📋 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étodoTipoDescrição
titlestrTítulo da playlist
video_urlslistLista de URLs de todos os vídeos
videosgeneratorGerador de objetos YouTube
lengthintNúmero de vídeos na playlist
ownerstrNome do criador da playlist
playlist_idstrID único da playlist
playlist_urlstrURL 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}")
⚠️ Atenção: Playlists privadas ou que necessitam de autenticação não podem ser acessadas sem configurar OAuth. Verifique se a playlist é pública.

💬 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

Atributos da classe Caption

Atributo / MétodoTipoDescrição
codestrCódigo do idioma (ex: "pt", "en")
namestrNome do idioma (ex: "Portuguese")
xml_captionsstrConteúdo XML bruto das legendas
generate_srt_captions()strConverte e retorna no formato SRT
ℹ️ Nota: Nem todos os vídeos têm legendas disponíveis. Alguns vídeos têm apenas legendas automáticas geradas pelo YouTube (identificadas como "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

Assinaturas dos callbacks

CallbackParâmetrosDescriçã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

AtributoTipoDescrição
titlestrTítulo do vídeo
descriptionstrDescrição completa do vídeo
authorstrNome do canal / criador
channel_idstrID do canal no YouTube
channel_urlstrURL do canal
lengthintDuração em segundos
viewsintNúmero de visualizações
ratingfloatAvaliação média (0–5)
thumbnail_urlstrURL da imagem de miniatura
publish_datedatetimeData de publicação
keywordslistLista de palavras-chave / tags
video_idstrID único do vídeo (11 chars)
watch_urlstrURL completa de watch
embed_urlstrURL de embed do vídeo
streamsStreamQueryObjeto de consulta de streams
captionsCaptionQueryObjeto de consulta de legendas
age_restrictedboolTrue 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étodoRetornoDescrição
filter(**kwargs)StreamQueryFiltra streams por atributos
order_by(attribute)StreamQueryOrdena por atributo
asc()StreamQueryOrdem crescente
desc()StreamQueryOrdem decrescente
first()StreamPrimeiro stream da lista
last()StreamÚltimo stream da lista
get_by_itag(itag)StreamStream com itag específico
get_highest_resolution()StreamStream progressivo de maior res.
get_lowest_resolution()StreamStream progressivo de menor res.
get_audio_only(subtype)StreamStream de áudio de maior qualidade
count()intQuantidade de streams
all()listLista com todos os streams

Classe Stream

MétodoParâmetrosDescrição
download()output_path, filename, filename_prefix, skip_existing, timeout, max_retriesInicia o download do stream
get_file_path()filename, output_path, filename_prefixRetorna o caminho que o arquivo seria salvo
includes_audio_trackTrue se o stream tem áudio
includes_video_trackTrue se o stream tem vídeo
is_progressiveTrue se áudio+vídeo combinados
is_adaptiveTrue se stream adaptativo
filesizeTamanho em bytes
default_filenameNome 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çãoCausaTratamento sugerido
PytubeErrorClasse base de todas as exceções pytube3Captura genérica
VideoUnavailableVídeo removido ou bloqueadoInformar ao usuário, pular na playlist
VideoPrivateVídeo configurado como privadoSolicitar permissão ao dono
VideoRegionBlockedVídeo bloqueado na sua regiãoUsar proxy em outra região
AgeRestrictedErrorVídeo com restrição de idadeAutenticar com use_oauth=True
LiveStreamErrorStream ao vivo não pode ser baixadoAguardar o fim da transmissão
MembersOnlyConteúdo exclusivo para membrosAutenticar como membro
RecordingUnavailableGravação da live não disponívelTentar mais tarde
MaxRetriesExceededLimite de tentativas de download excedidoVerificar conexão / usar retry
RegexMatchErrorFalha ao parsear conteúdo do YouTubeAtualizar pytube3 para versão mais recente
ExtractErrorFalha na extração de dados do vídeoVerificar 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

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)

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 Fix

Novas Funcionalidades

Discuta primeiro numa issue antes de implementar, para alinhar com os mantenedores.

Feature
📝

Documentação

Melhorias em docstrings, exemplos, README ou esta documentação em português.

Docs
🧪

Testes

Ampliar a cobertura de testes unitários e de integração é sempre bem-vindo.

Tests
✅ Dica: Antes de abrir um PR, certifique-se de que todos os testes passam (pytest), o código está formatado (black) e sem erros de lint (flake8).