Script para baixar vídeos do YouTube em Python 1/01/08
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 import sys, urllib, re, os, commands page_url = sys.argv[1] download_url = "http://www.youtube.com/get_video?video_id=%s&t=%s" 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") tmp_flv = title.replace(" ", "_") + ".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