Com certeza você já teve vontade de baixar um vídeo do YouTube para utilizar em outro lugar ou apenas para poder reproduzir offline. Existem diversos programas ou sites que fazem isso mas quando o número de vídeos começa a aumentar ou precisamos baixar uma playlist, talvez seja a hora de utilizar um programa feito por você mesmo. Para isso, existe a biblioteca PyTube.
Atenção: Este artigo é de caráter educacional e não deve ser utilizado para obter conteúdos protegidos por direitos autorais.
Para os mais ansiosos vamos ver logo como é simples baixar um vídeo usando o PyTube:
from pytube import YouTube
YouTube('sua_url').streams.get_highest_resolution().download()
Instalação do PyTube
Como boa prática, utilize sempre um ambiente virtual em todos os seus projetos. Se você não sabe como criar um utilizando o Pipenv, aprenda aqui
$ pipenv install pytube3
$ pipenv shell
Download de um vídeo
Cada link do YouTube possui, na verdade, um conjunto de streams de áudio e vídeo. Vamos listar todas as opções de stream disponíveis em uma url:
from pytube import YouTube
VIDEO_URL = 'https://www.youtube.com/watch?v=8EJ3zbKTWQ8&list='
yt = YouTube(VIDEO_URL)
for stream in yt.streams:
print(stream)
Isso nos dá o seguinte resultado:
<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="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f" progressive="False" type="video">
<Stream: itag="247" mime_type="video/webm" res="720p" fps="30fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="398" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.05M.08" progressive="False" type="video">
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401f" progressive="False" type="video">
<Stream: itag="244" mime_type="video/webm" res="480p" fps="30fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="397" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.04M.08" progressive="False" type="video">
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e" progressive="False" type="video">
<Stream: itag="243" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="396" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.01M.08" progressive="False" type="video">
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d4015" progressive="False" type="video">
<Stream: itag="242" mime_type="video/webm" res="240p" fps="30fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="395" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.00M.08" progressive="False" type="video">
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c" progressive="False" type="video">
<Stream: itag="278" mime_type="video/webm" res="144p" fps="30fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="394" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.00M.08" progressive="False" type="video">
<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2" progressive="False" type="audio">
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus" progressive="False" type="audio">
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus" progressive="False" type="audio">
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus" progressive="False" type="audio">
Podemos escolher a stream de melhor qualidade e fazer o seu download:
video = yt.streams.get_highest_resolution()
video.download()
Para mais opções de filtros dos streams disponíveis você pode dar uma olhada no repositório do PyTube no github.
Download de uma playlist
Para obter os vídeos de uma playlist, basta obtermos uma lista de urls de cada vídeo:
from pytube import YouTube, Playlist
PLAYLIST_URL = 'https://www.youtube.com/playlist?list=PLyORnIW1xT6waC0PNjAMj33FdK2ngL_ik'
playlist = Playlist(PLAYLIST_URL)
Agora é só fazer como já vimos para baixar um vídeo a partir da url:
for url in playlist:
video = YouTube(url)
stream = video.streams.get_highest_resolution()
stream.download(output_path='playlist')
Bônus: Download do áudio de um vídeo
Podemos, também, baixar apenas um arquivo de áudio:
audio = yt.streams.filter(only_audio=True)[0]
audio.download()
Código
O código completo deste artigo está disponível no github
Referências
Veja abaixo para mais informações sobre a biblioteca utilizada neste artigo:
Eduardo
5 agosto 2020 at 08:52Muito bom o artigo. mas vale a pena citar um pequeno erro que eu tive com o Pytube.
na linha 301 do arquivo extract.py, trocar:
cipher_url = [
parse_qs(formats[i][“cipher”]) for i, data in enumerate(formats)
]
por:
cipher_url = [
parse_qs(formats[i][“signatureCipher”]) for i, data in enumerate(formats)
]
Matheus Vanzan
5 agosto 2020 at 09:16Muito obrigado Eduardo! Quem encontrar o mesmo problema pode dar uma olhada nessa issue do PyTube no github.