Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: .:WindHack:. en 18 Noviembre 2010, 15:29 pm



Título: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
Publicado por: .:WindHack:. 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! (http://daw-labs.com/ws-downloader-%C2%A1descarga-videos-de-youtube/)
Cibernodo | WS Downloader: ¡Descarga vídeos de YouTube! (http://foro.cibernodo.net/tema-ws-downloader-%C2%A1descarga-v%C3%ADdeos-de-youtube)


Título: Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
Publicado por: Novlucker 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


Título: Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
Publicado por: .:WindHack:. 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


Título: Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
Publicado por: Novlucker 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


Título: Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
Publicado por: EvilGoblin en 19 Noviembre 2010, 02:09 am
Baja HD --? se podria implementar bajar 720p o 1080p ?


Título: Re: [Python] WS Downloader: ¡Descarga vídeos de YouTube!
Publicado por: .:WindHack:. 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.,