Baixando vídeo do youtube com Python

No meu “ócio”(Na verdade não era para está hehe xD) quis baixar vídeo do youtube e resolvi criar um script simples para fazer download do youtube usando Python.

Resolvi compartilhar porque acho importante que exemplos sejam distribuídos na net para facilitar o aprendizado e também existe a possibilidade de alguém indicar melhorias no código que eu escrevi, ai eu posso aprender também. =D


#!/usr/bin/python
#-*- coding: utf-8 -*-

#------------------------------------------------------------------------+
#   Download Vídeo Youtube
#   por Fábio Cerqueira
#   Versão desenvolvida na aula de computador e sociedade haha xD
#
# Licença
#    Copyright (C) 2009  Fábio Cerqueira
#
#    Este programa é software livre; você pode redistribuí-lo e/ou
#    modificá-lo sob os termos da Licença Pública Geral GNU, conforme
#    publicada pela Free Software Foundation; tanto a versão 2 da
#    Licença como (a seu critério) qualquer versão mais nova.
#    Este programa é distribuído na expectativa de ser útil, mas SEM
#    QUALQUER GARANTIA; sem mesmo a garantia implícita de
#    COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM
#    PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais
#    detalhes.
#
#    Você deve ter recebido uma cópia da Licença Pública Geral GNU
#    junto com este programa; se não, escreva para a Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
#    02111-1307, USA.
#
#    Para consultar texto em inglês visite:
#    http://www.gnu.org/licenses/gpl.txt
#
#------------------------------------------------------------------------+

import urllib2
import sys

if len(sys.argv) < 2:
    print """Erro! Syntax: youtube iddovideo
    Ex: youtube PBmmBDPXwcY
        """
    sys.exit()
else:
    idVideo =  sys.argv[1]

print 'Pegando o link do video.'
page = urllib2.urlopen('http://www.youtube.com/watch?v=' + idVideo)
texto = page.readlines()

for l in texto:
    if 'VIDEO_TITLE' in l:
        fileName = l.split("'")[3].replace(' ','_') + '.flv' 
    if 'SWF_ARGS' in l:
        swfArgs = l.split('"')
        break

video_id = swfArgs[swfArgs.index('video_id') + 2]
t =  swfArgs[swfArgs.index('t') + 2]

print "Fazendo download..."

fileDown = urllib2.urlopen('http://www.youtube.com/get_video?video_id=%s&t=%s' % (video_id,t)).readlines()

fileSave = open(fileName,'wb')
fileSave.writelines(fileDown)
fileSave.close()

print "Download concluído."

Atualização para exibir barra de progresso.

#!/usr/bin/python
#-*- coding: utf-8 -*-

#------------------------------------------------------------------------+
#   Download Vídeo Youtube                                               
#   por Fábio Cerqueira                                                  
#   Versão com barra de progresso usando o urlgrabber                    
#                                                                        
# Licença                                                                 
#    Copyright (C) 2009  Fábio Cerqueira                                 
#                                                                       
#    Este programa é software livre; você pode redistribuí-lo e/ou       
#    modificá-lo sob os termos da Licença Pública Geral GNU, conforme    
#    publicada pela Free Software Foundation; tanto a versão 2 da       
#    Licença como (a seu critério) qualquer versão mais nova.            
#    Este programa é distribuído na expectativa de ser útil, mas SEM    
#    QUALQUER GARANTIA; sem mesmo a garantia implícita de                 
#    COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM             
#    PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais    
#    detalhes.                                                            
#    Para consultar texto em inglês visite:                                 
#    http://www.gnu.org/licenses/gpl.txt                                  
#                                                                         
#------------------------------------------------------------------------+

import urllib2
import sys
import urlgrabber
import urlgrabber.progress

if len(sys.argv) < 2:
    print """Erro! Syntax: youtube iddovideo
    Ex: youtube PBmmBDPXwcY
        """
    sys.exit()
else:
    idVideo =  sys.argv[1]

print 'Pegando o link do video.'
page = urllib2.urlopen('http://www.youtube.com/watch?v=' + idVideo)
texto = page.readlines()

for l in texto:
    if 'VIDEO_TITLE' in l:
        fileName = l.split("'")[3].replace(' ','_') + '.flv' 
    if 'SWF_ARGS' in l:
        swfArgs = l.split('"')
        break

video_id = swfArgs[swfArgs.index('video_id') + 2]
t =  swfArgs[swfArgs.index('t') + 2]

print "Fazendo download..."

url = 'http://www.youtube.com/get_video?video_id=%s&t=%s' % (video_id,t)

prog = urlgrabber.progress.text_progress_meter()
urlgrabber.urlgrab(url,fileName,progress_obj=prog)
Anúncios

13 thoughts on “Baixando vídeo do youtube com Python

  1. Gilson Maluko

    hehe, é mesmo msn você “nunca quase está”.

    Eu queria tirar umas duvidas sobre os modulos.

    Se liga,

    Toda pasta dentro de um projeto é como um modulo certo?

    Então como um modulo importar um outro modulo numa pasta acima?

    Olha a estrutura das pastas

    .\project.py

    ..\Sounds
    ..\Sounds\sound.py

    ..\Grafics
    ..\Grafics\graph.yp

    ..\Functions
    ..\Functions\funcs.yp

    Como fazer pro sound.py e graph.py importar o funcs.py?

    Acho que expliquei direitinho minha duvida!

    ;P

    Aguardo o feedback!

  2. Thiago Coutinho

    > Toda pasta dentro de um projeto é como um modulo certo?

    Desde que tenha o arquivo __init__.py dentro do dir, assim o Python entende que aquele dir pode ser importado.

    > Então como um modulo importar um outro modulo numa pasta acima?

    O diretório acima é o diretório raiz. Ele tb vai ter um __init__.py. No sound.py, vc teria q adicionar o dir raiz no path, e depois poderia importar qualquer módulo. Ex:

    import sys
    sys.path.insert(0, ‘/caminho/do/dir/raiz’)

    import Graphics.graph
    import Functions.funcs

    Esta é forma que faria, não quer dizer que é a forma certa de fazer :^)

  3. Gilson Maluko

    Thiago, valeu! funfou beleza!!

    Tenho mais um dúvida

    Tem como eu ver o tanto de bytes que uma variavel está ocupando?

    Qual variavel ocupa mais espaço uma string ou uma lista?
    Qual seria a mais rapida para procurar?
    Qual teria mais performace?

  4. Thales Oliveira

    Fábio, tem como me add no gtalk? estou com algumas duvidas, creio que duvidas simples mas não teho muita facilidade com py.
    Meu gtalk é esse e-mail ai.

    Abraço cara, e obrigado pela contribuição,

    Thales Oliveira

  5. fabiocerqueira

    Gilson, n sei dizer qual ocupa mais espaço, mas se formos pensar que lista é mutável e aceita vários tipos ao mesmo tempo, creio que por essa facilidade que ela tenha deva ocupar mais espaço e tenha menor performance(nada certo)

    Thales Oliveira: adicionei você no gtalk, caso n chegue meu gtalk é steelday@gmail.com

  6. Henrique

    estava procurando um jeito de conseguir o arquivo do video, mas não quero baixar-lo, então procurando no google achei este blog e vendo o codigo de download vi que pode ser possivel, mas não entendo isso, afinal oque é esta variavel t

    50.video_id = swfArgs[swfArgs.index(‘video_id’) + 2]
    51.t = swfArgs[swfArgs.index(‘t’) + 2]
    52.
    53.print “Fazendo download…”
    54.
    55.url = ‘http://www.youtube.com/get_video?video_id=%s&;t=%s’ % (video_id,t)

  7. Miguel

    Eu não consigo …. sempre quando tento aparece erro no ‘swfArgs’ … quando mando ele dar um print , mostra que esta vazio “none”

    Vou escrever o tipo de erro que esta dando

    ” video_id = swfArgs[swfArgs.index(‘video_id’) + 2]
    NameError: name ‘swfArgs’ is not defined ”

    Té mais

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s