elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Python] WS Downloader: ¡Descarga vídeos de YouTube!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Python] WS Downloader: ¡Descarga vídeos de YouTube!  (Leído 3,040 veces)
.:WindHack:.

Desconectado Desconectado

Mensajes: 167

Prisionero de mi propia mente...


Ver Perfil WWW
[Python] WS Downloader: ¡Descarga vídeos de YouTube!
« en: 18 Noviembre 2010, 15:29 pm »

Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # WS Downloader.py - v0.1 (Beta)
  4. # Autor(es): .:WindHack:. & swik
  5. # www.daw-labs.com | www.cibernodo.net
  6. # Registrado en SafeCreative
  7. # Licencia: Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0
  8. # 17/11/2010
  9.  
  10. import sys, urllib, os
  11.  
  12. #
  13. # @Charset
  14. #
  15. Char = ['%3A','%2F','%26','%2C','%3D','%252C','%253A','%7C','%3F']
  16. By =   [':','/','&',',','=',',',':','<begin>','?']
  17.  
  18. #
  19. # URLDecode(sURL)
  20. # Descifra la URL teniendo en cuenta el Charset.
  21. #
  22. def URLDecode(sURL):
  23.    for i in range(len(Char)):
  24.     sURL = sURL.replace(Char[i],By[i])
  25.    return sURL
  26.  
  27. #
  28. # GetSourceCode(sURL)
  29. # Obtiene el código de fuente del vídeo (sitio).
  30. #
  31. def GetSourceCode(sURL):
  32.    try:
  33.     URL = urllib.urlopen(sURL)
  34.     sSource = URL.read()
  35.     URL.close()
  36.     return sSource
  37.    except:
  38.        print 'Error de conexión.'
  39.        exit()
  40.  
  41. #
  42. # GetIndexVideo(sSource,Tags)
  43. # Obtiene la posición de un "Tag" o etiqueta.
  44. #
  45. def GetIndexVideo(sSource,Tags):
  46.    return sSource.find(Tags)
  47.  
  48. #
  49. # GetVideoTitle(sSource)
  50. # Obtiene el título del vídeo.
  51. #
  52. def GetVideoTitle(sSource):
  53.    sSource = sSource[2000:5500]
  54.    Begin = GetIndexVideo(sSource,'<meta name="title" content="')+28
  55.    sSource = sSource[Begin:]
  56.    End = GetIndexVideo(sSource,'>')-1
  57.    sSource = sSource[:End]
  58.    if ' ' in sSource:
  59. sSource = sSource.replace(' ','_')
  60.    return sSource
  61.  
  62. #
  63. # GetVideoURL(sSource)
  64. # Obtiene la URL de descarga del vídeo.
  65. #
  66. def GetVideoURL(sSource):
  67.    sSource = sSource[9000:30000]
  68.    Begin = GetIndexVideo(sSource,'<begin>')+7
  69.    sSource = sSource[Begin:]
  70.    End = GetIndexVideo(sSource,'id=')+19
  71.    sSource = sSource[:End]+'&title=Video(WS_Downloader)'
  72.    return sSource
  73.  
  74.  
  75. #
  76. # GetSavePath(Title)
  77. # Obtiene la ruta en la cual se guardará el vídeo, teniendo en cuenta
  78. # el sistema operativo.
  79. #
  80. def GetSavePath(Title):
  81.    if os.name == 'posix':
  82. return os.getenv('HOME')+'/'+Title+'.flv'
  83.    if os.name == 'nt':
  84. return os.getenv('HOMEDRIVE')+'\\'+Title+'.flv'
  85.  
  86. #
  87. # DownloadStatus(Bloque, Tamano, Total)
  88. # Muestra el estado de la descarga.
  89. #
  90. def DownloadStatus(Bloque, Tamano, Total):
  91.    Cantidad = Bloque * Tamano / 1024000.0
  92.    Total = Total / 1024000.0
  93.    print 'Cantidad descargada: %s MB de %s MB ...' % (round(Cantidad,1),round(Total,1))
  94.    if Cantidad >= Total:
  95.        print 'Descarga finalizada.'
  96.  
  97. #
  98. # DownloadVideo(sURL, sName, sStatus)
  99. # Descarga el vídeo de los servidores de YouTube.
  100. #
  101. def DownloadVideo(sURL, sName, sStatus):
  102.    try:
  103.        Download = urllib.urlretrieve(sURL, sName, sStatus)
  104.        return Download[0]
  105.    except:
  106.        print 'Error el descargar.'
  107.        exit()
  108.  
  109. def __main__():
  110.    __Help__ = '''
  111. __        ______    ____                      _                 _
  112. \ \     / / ___|  |  _ \ _____      ___ __ | | ___   __ _  __| | ___ _ __
  113. \ \ /\ / /\___ \ | | | |/ _ \ \ /\ / / '_ \| |/ _ \ / _` |/ _` |/ _ \ '__|
  114.  \ V  V /  ___) | | |_| | (_) \ V  V /| | | | | (_) | (_| | (_| |  __/ |  
  115.   \_/\_/  |____/  |____/ \___/ \_/\_/ |_| |_|_|\___/ \__,_|\__,_|\___|_|  
  116.    © Cibernodo & DaW - Labs
  117.    Uso:
  118.    ./WS_Downloader.py <Opción> <Id>
  119.  
  120.    Opciones:
  121.        -D     : Descargar video directamente.
  122.        -G     : Obtener URL de descarga.
  123.        -help  : Ver Ayuda.
  124.               '''
  125.  
  126.    try:
  127.        Opt = sys.argv[1]
  128.        if Opt == '-help':
  129.            print __Help__
  130.  
  131.        if len(sys.argv) > 2:
  132.            Id = URLDecode(GetSourceCode('http://www.youtube.com/watch?v='+sys.argv[2]))
  133.            Title = GetSavePath(GetVideoTitle(Id))
  134.            URL = GetVideoURL(Id)
  135.  
  136.            if Opt == '-G':
  137.                print '======== Video URL ========\n',URL
  138.  
  139.            elif Opt == '-D':
  140.                DownloadVideo(URL,Title,DownloadStatus)
  141.  
  142.    except:
  143.        print __Help__
  144.  
  145. if __name__ == "__main__":
  146.   __main__()
  147.  
  148.  
  149.  
  150.  

Más Información:
DaW - Labs | WS Downloader: ¡Descarga vídeos de YouTube!
Cibernodo | WS Downloader: ¡Descarga vídeos de YouTube!


« Última modificación: 18 Noviembre 2010, 16:22 pm por .:WindHack:. » En línea

Follow me on Twitter: @windhack | Visit my website: www.daw-labs.com

"The only thing they can't take from us are our minds."
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
« Respuesta #1 en: 18 Noviembre 2010, 19:41 pm »

El code esta bien estructurado y es muy entendible :P
Seguro que esas listas Char y By contemplan todos los valores que pueden aparecer? :-\

Código
  1. from urllib import url2pathname
  2. import re
  3.  
  4. def URLDecode(sURL):
  5.    finder = re.compile('%\d+[A-Z]{0,1}')
  6.    chars = list(set(finder.findall(sURL)))
  7.    for i in chars:
  8.        sURL = sURL.replace(i,hex2char(i))
  9.    return sURL
  10.  
  11. def hex2char(char):
  12.    char = url2pathname(char)
  13.    if len(char)>1:
  14.        char = hex2char(char)
  15.    return char

Saludos


En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
.:WindHack:.

Desconectado Desconectado

Mensajes: 167

Prisionero de mi propia mente...


Ver Perfil WWW
Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
« Respuesta #2 en: 18 Noviembre 2010, 20:11 pm »

Al principio traté de hacer una función que me limpiara todos los valores codificados, muy parecida a la que has puesto pero lastimosamente no me dio el resultado que esperaba ya que me complicó un poco más todo (¡Jejeje!).

Con el resultado poco satisfactorio tomé la decisión de hacer la función usando listas, pues me sirvió y ayudó bastante para obtener la URL del vídeo más fácilmente, aunque como bien dices, no podía contemplar todos los valores posibles pero sí los estrictamente necesarios. Además podía establecer la igualdad que yo quisiera. Por ejemplo %7C le puse como valor <begin> Lo que me indicaba que allí empezaba el enlace hacia el servidor. ¡Jejejeje!


De todos modos...¡Muchas gracias Novlucker!  ;D
En línea

Follow me on Twitter: @windhack | Visit my website: www.daw-labs.com

"The only thing they can't take from us are our minds."
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
« Respuesta #3 en: 19 Noviembre 2010, 02:01 am »

Bueno, en la función que he dejado también se podría agregar lo relativo a una lista de excepciones como lo que comentas del begin :P
Si prefieres utilizar las listas te sugiero algo, cambiarlas por la versión correcta (a mi criterio) de lo que necesitas, un diccionario :P

Igual todo lo que sugiero puede ser más que nada de "estética", buen trabajo ;D

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
EvilGoblin


Desconectado Desconectado

Mensajes: 2.323


YO NO LA VOTE!


Ver Perfil
Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
« Respuesta #4 en: 19 Noviembre 2010, 02:09 am »

Baja HD --? se podria implementar bajar 720p o 1080p ?
En línea

Experimental Serial Lain [Linux User]
.:WindHack:.

Desconectado Desconectado

Mensajes: 167

Prisionero de mi propia mente...


Ver Perfil WWW
Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
« Respuesta #5 en: 19 Noviembre 2010, 02:54 am »

@Novlucker: Muchas gracias por las sugerencias, las tendré en cuenta para las próximas versiones. ¡Jejeje!.  :D

@EvilGoblin: El formato de descarga predeterminado es FLV MQ (Medium Quality - 640x360), pero de igual manera, esperamos agregar en la próxima versión soporte para HD y otros formatos como 3GP y MP4. Aunque dejo como dato, es mucho mejor y más confiable recurrir a la opción -G  :rolleyes:



~ Saludos.,
En línea

Follow me on Twitter: @windhack | Visit my website: www.daw-labs.com

"The only thing they can't take from us are our minds."
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines