Script para baixar vídeos do YouTube em Python

Para praticar fiz um script que baixa vídeos do YouTube e converte para AVI. Mais um teste bobo somente para estudar um pouco de Python. O script baixa usando wget e converte usando ffmpeg então só funciona em unices que tenham esses dois programas. Depois vou ver se faço pelo menos o download em Python puro.

Eu não checo o único argumento de entrada porque acredito que seja óbvio, é apenas a URL do vídeo. Se você quiser usar basta salvar o código abaixo como yt ou qualquer coisa que poupe digitação em algum lugar como /usr/bin e usar:

$ yt http://www.youtube.com/watch?v=8QXO7ExtQrQ

O script é uma "versão" em Python do script que o Pedro Martelletto fez em Lua e esta disponível no sistema de ports do OpenBSD.

Como já falei, é só exercício. Se você precisa de um script para uso intenso (quem precisa?) recomendo experimentar o youtube-dl também em Python com muito mais recursos, a única coisa que ele não faz é converter o vídeo para AVI.

Se você usa Windows devem existir trocentos programas em .NET que ocupam 30MB de memória RAM e 50MB de espaço em disco para fazer isso.

#!/usr/bin/env python
"""
    Description: Uses wget and ffmpeg to download and convert YouTube videos to AVI.
    Author: Vinicius de F Silva <viniciusfs@gmail.com>
    License: Public Domain
"""
import sys, urllib, re, os, commands

page_url = sys.argv[1]
download_url = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=18"
wget_cmd = "wget -O \'%s\' \'%s\'"
ffmpeg_cmd = "ffmpeg -y -i \'%s\' -b 1000k -vcodec mpeg4 -acodec copy \'%s\'"

socket = urllib.urlopen(page_url)
html_buffer = socket.read()
socket.close()

video_params_pattern = re.compile("video_id=(?P<video_id>.*)&t=(?P<t_param>[^\"&]*)")
video_params = video_params_pattern.search(html_buffer)

title_pattern = re.compile("\<meta name=\"title\" content=\"(?P<title>.*)\"")
title = title_pattern.search(html_buffer).group("title")

cleaner = re.compile(r"[^A-Za-z0-9\_]")
title = title.replace(" ", "_")
title = cleaner.sub("", title)

tmp_flv = title + ".flv"
output_filename = tmp_flv.replace(".flv", ".avi")
output_filename = output_filename.lower()

os_cmd = wget_cmd % (tmp_flv, download_url%(video_params.group("video_id"), video_params.group("t_param")))
wget_status, wget_output = commands.getstatusoutput(os_cmd)
os_cmd = ffmpeg_cmd % (tmp_flv, output_filename)
ffmpeg_status, ffmpeg_output = commands.getstatusoutput(os_cmd)

os.remove(tmp_flv)

print "File %s saved successfully." % output_filename

Comentários