Está cada dia mais difícil achar sites que possibilitem o download de vídeos do Youtube. Geralmente, os sites que oferecem esse serviço tentam empurrar algum software (possivelmente malicioso, ou pago, ou os dois) pra a gente baixar e só então poder fazer download dos vídeos. Por conta dessa dificuldade, resolvi pesquisar na internet como poderia criar um programinha eu mesmo pra me ajudar nessa tarefa. Com pouco tempo de busca, já encontrei a biblioteca Python chamada pafy, que é muito simples e funcional. Então no post de hoje vou mostrar pra vocês como escreverem scripts simples pra baixar vídeos e áudios do Youtube.
O primeiro passo é instalar o pafy. Acontece que quando instalei direto pelo pip e tentei usar a lib, o programa acusou o erro KeyError: 'dislike_count'
,
depois de investigar a causa desse erro, descobri que ele já foi corrigido, mas o pip havia baixado uma versão da lib criada antes da correção. Pra resolver o problema, basta baixar a biblioteca diretamente do repositório, com o comando:
pip
3
install git+https://github.com/mps-youtube/pafy.git
(Talvez, no seu sistema o nome do comando do pip seja apenas pip, e não pip3)
Obtendo informações do vídeo com o pafy
Agora, você pode abrir o ambiente interativo do Python e começar a fazer algumas experiências.
Primeiro, devemos importar o pafy:
import pafy
Agora, devemos criar um objeto pafy, que conterá as informações do vídeo. Em nosso exemplo, vamos armazenar esse objeto numa variável chamada video. Então, depois de copiar o link do vídeo no Youtube, basta digitar:
video = pafy.new(“endereco-do-seu-video”)
No meu caso, quero baixar um vídeo do meu canal do Youtube:
video = pafy.new(“https://www.youtube.com/watch?v=slGGLxcnzWY”)
Pronto! Se tudo der certo, a variável video já deverá conter todos os metadados do vídeo. Podemos obter essas informações acessando propriedades do objeto que criamos. As mais relevantes são:
- author (autor do vídeo)
- category (categoria)
- duration (duração do vídeo)
- length (tamanho do vídeo)
- likes (curtidas)
- title (título do vídeo)
- viewcount (número de visualizações) Mas uma lista completa dos atributos do objeto pode ser obtida na documentação.
Agora podemos criar uma pequena função para descrever o vídeo que desejamos baixar:
def describe_video(video):
print("Título: ", video.title)
print("Autor: ", video.author)
print("Categoria: ", video.category)
print("Visualizações: ", video.viewcount)
print("Duração: ", video.duration)
print("Tamanho: ", video.length)
print("Curtidas: ", video.likes)
No meu caso, a saída do programa ficou assim:

Os vídeos do youtube costumam estar disponíveis em diferentes formatos e resoluções. Podemos verificar os formatos disponíveis através do atributo chamado streams para seu vídeo. Esse é um exemplo extraído diretamente da documentação:
streams = video.streams
for s in streams:
print(s)
Uma saída possível para esse código, seria:
normal:mp4@1280x720
normal:webm@640x360
normal:mp4@640x360
normal:flv@320x240
normal:3gp@320x240
normal:3gp@176x144
Também é possível listar apenas as streams de áudio:
audio_
streams = video.
audio
streams
for
a
in
audio_
streams:
print(
a
)
Observação: o “normal” no início de cada linha do exemplo acima, indica que se trata de uma stream de vídeo e áudio. Se você, por algum motivo, quiser fazer o download apenas do vídeo, sem o áudio, então utilize video.videostreams, ao invés de video.streams!
Podemos acrescentar esses fragmentos de código à nossa função que descreve o vídeo:
def describe_video(video):
print("Título: ", video.title)
print("Autor: ", video.author)
print("Categoria: ", video.category)
print("Visualizações: ", video.viewcount)
print("Duração: ", video.duration)
print("Tamanho: ", video.length)
print("Curtidas: ", video.likes)
video_streams = video.streams
audio_streams = video.audiostreams
for s in video_streams:
print(s)
for a in audio_streams:
print(a)
Fazendo download de vídeos ou áudios do Youtube com pafy
Agora podemos utilizar essas informações para fazer o download propriamente dito.
Para isso, basta usar o método download, contido nas streams do objeto. Por exemplo, para baixar a primeira opção de vídeo, poderíamos utilizar o comando:
video.streams[0].download()
Para baixar a segunda opção de áudio, poderíamos fazer:
video.audiostreams[1].download()
Os objetos pafy também possuem dois métodos bem interessantes: getbest() e getbestaudio(), que retornam a melhor stream de vídeo e de áudio, respectivamente. Então, para baixar o vídeo com melhor qualidade, basta digitar:
video.getbest().download()
O método download também aceita alguns argumentos. Os mais importantes são o quiet (recebe True / False), que define se o programa deve omitir o andamento do download ou não, filepath (recebe uma string), que indica o caminho para salvar o arquivo.
Pronto! Se tudo der certo, você já deve ter conseguido baixar um vídeo do youtube!
Mas seria bem legal se a gente tivesse um script capaz de ler vários links de um arquivo de texto e baixá-los de uma vez, não é mesmo?
Como brinde, vou deixar aqui um scriptzinho que faz exatamente isso. E aí você pode acrescentar mais funcionalidades nele, de acordo com suas necessidades:
import pafy
import os
urls = []
download_dir = "downloads" #Nome do diretório em que
#os arquivos serao salvos
urls_file = "urls.txt" #Nome do arquivo com os links
if not os.path.isdir(download_dir): #se o diretorio nao
os.mkdir(download_dir) #existir, então crie um
#Insere cada linha do arquivo na lista urls
with open(urls_file) as file:
while line := file.readline():
urls.append(line.strip())
for url in urls:
#Tenta fazer o download de cada arquivo
#É importante tratar possíveis excecoes
#caso contrario, seu programa vai parar
#ao encontrar um link quebrado ou coisa assim
try:
video = pafy.new(url)
best = video.getbest()
best.download(quiet = False, filepath=download_dir)
except:
print("Não consegui baixar o vídeo", url)
continue
Agora, basta criar um arquivo com um link do Youtube por linha e salvá-lo na mesma pasta que o script com o nome “urls.txt”. Bem simples, né? Se você quiser baixar apenas os áudios, basta substituir a linha best = video.getbest() por best = video.getbestaudio().
Ao rodar o programa, você vai ter uma saída como essa:

Depois de se familiarizar com o código, você pode encapsular tudo numa função, e criar mais funcionalidades. Que tal criar uma ferramenta de linha de comando que recebe parâmetros do usuário, como por exemplo, nome do diretório onde salvar, nome do arquivo contendo as URLs, se deseja salvar vídeo, áudio ou áudio e vídeo, etc? O céu é o limite!