[pyDownloader] Descargar videos de youtube y convertirlos a otro formato

  • 2 Respuestas
  • 2174 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 193
  • Actividad:
    0%
  • Reputación 0
  • Skype: hackloper
    • Ver Perfil
    • Email
Que tal a todos, terminé unos scripts para poder descargar vídeos de youtube y convertirlos a otro formato, y respecto a las otras librerias la unica diferencia es que quizas necesite mejorar bastante pero te muestra el porcentaje de descarga, se puede convertir a otro formato y también te muestra el porcentaje de conversión, espero que les guste.

primero tenemos que tener una caperta llamada "pyDownloader" que contendrá los siguientes archivos.

1- __init__.py

Código: Python
  1. from main import *

2- main.py

Código: Python
  1. #by hackloper
  2. #skype: hackloper
  3. #youtube: https://www.youtube.com/user/hackdeveloper
  4. #gmail: [email protected]
  5. #twitter: https://twitter.com/hackloper | @hackloper
  6.  
  7. import urllib2,urlparse,urllib,threading,time,os,re,pyffmpeg
  8.  
  9. class ErrorDownload(Exception):
  10.    def __init__(self,error):
  11.       self._error = error
  12.  
  13.    def __str__(self):
  14.       return repr(self._error)
  15.  
  16. class pyDownloader(object):
  17.    def __init__(self,url,convert_to=False,automatic_print=False):
  18.       self._id = urlparse.parse_qs(urlparse.urlparse(url).query)['v'][0]
  19.       self._path = "https://www.youtube.com/get_video_info?video_id="
  20.       self._content = self.get_content()
  21.       try:
  22.          self._streams = self.get_streams()
  23.       except KeyError:
  24.          raise ErrorDownload("Invalid url.")
  25.       self.convert_to = convert_to
  26.       self.automatic_print = automatic_print
  27.       self._end_download = False
  28.  
  29.    def print_write_size(self,size,name,extension):
  30.       d = os.getcwd()
  31.       error = 0
  32.       total_name = str("%s\\%s.%s" %(d,name,extension))
  33.       time.sleep(3)
  34.       while True:
  35.          try:
  36.             while int(os.path.getsize(total_name)) != int(size):
  37.                print str(int(os.path.getsize(total_name))*100/int(size))+"%"
  38.                time.sleep(0.3)
  39.             print "100%"
  40.             break
  41.          except:
  42.             if error >= 6:break
  43.             error += 1
  44.             print "error"
  45.             time.sleep(1)
  46.  
  47.    def get_size_write(self):
  48.       time.sleep(1)
  49.       d = os.getcwd()
  50.  
  51.       try:
  52.          porcent = str(int(os.path.getsize(self.total_name))*100/int(self.size))+"%"
  53.          return porcent
  54.       except WindowsError:
  55.          return "waiting"
  56.  
  57.    def get_info(self):
  58.       return self._content
  59.  
  60.    def get_size_convert(self):
  61.       if self.convert_to == False:
  62.          return False
  63.       else:
  64.          if self._end_download == False:
  65.             return "waiting"
  66.          else:
  67.             progress = pyffmpeg.progress()
  68.             rest = progress.get_size_convert()
  69.             return rest
  70.  
  71.    def get_content(self):
  72.       response = urllib2.urlopen(self._path+self._id)
  73.       parse_content = urlparse.parse_qs(response.read())
  74.       return parse_content
  75.  
  76.    def get_streams(self):
  77.       streams = self._content['url_encoded_fmt_stream_map'][0]
  78.       streams = streams.split(',')
  79.       streams = [urlparse.parse_qs(elem) for elem in streams]
  80.       return streams
  81.  
  82.    def select_url_stream(self,type_file):
  83.       for i in self._streams:
  84.          t = re.search(r'/([\w?-]+)',i['type'][0])
  85.          if t.group(1) == type_file:
  86.             return i['url'][0]
  87.  
  88.    def download_manual(self,url_stream,type_f,to,obj):
  89.       urllib.urlretrieve(url_stream,'%s.%s' %(obj.title,type_f))
  90.       obj._end_download = True
  91.       if obj.convert_to == True:
  92.          ffmpeg = pyffmpeg.ffmpeg(obj.title,obj.total_name,to)
  93.          ffmpeg.convert()
  94.  
  95.  
  96.    def download(self,type_f='mp4',to='mp3'):
  97.       self.title = self._content['title'][0]
  98.       site = urllib.urlopen(self.select_url_stream(type_f))
  99.       self.size =  site.info().getheaders('Content-Length')[0]
  100.       self.extension = type_f
  101.       d = os.getcwd()
  102.       self.total_name = str("%s\\%s.%s" %(d,self.title,type_f))
  103.       if int(self.size) == 0:
  104.          raise ErrorDownload("This video can not be downloaded by copyright")
  105.       else:
  106.          if self.automatic_print == True:
  107.             th = threading.Thread(target=self.print_write_size,args=(self.size,self.title,type_f))
  108.             th.start()
  109.             urllib.urlretrieve(self.select_url_stream(type_f),'%s.%s' %(self.title,type_f))
  110.             if self.convert_to == True:  
  111.                ffmpeg = pyffmpeg.ffmpeg(self.title,self.total_name,to)
  112.                ffmpeg.convert()
  113.          else:
  114.             url_stream = self.select_url_stream(type_f)
  115.             thread = threading.Thread(target=self.download_manual,\
  116.                args=(url_stream,type_f,to,self))
  117.             thread.start()

Dentro de esta carpeta tendrá que habe rotra llamada pyffmpeg que contiene los siguientes archivos.

3- __init__.py

Código: Python
  1. from main import *

4- main.py
Código: Python
  1. #by hackloper
  2. #skype: hackloper
  3. #youtube: https://www.youtube.com/user/hackdeveloper
  4. #gmail: [email protected]
  5. #twitter: https://twitter.com/hackloper | @hackloper
  6. #blog: http://hackloper.blogspot.com.es/
  7.  
  8. import threading,os,re,time
  9.  
  10. class progress(threading.Thread):
  11.    def __init__(self):
  12.       threading.Thread.__init__(self)
  13.  
  14.    def get_seconds(self,times):
  15.       list_time = [360,60,0]
  16.       seconds = 0
  17.       split_time = times.split(":")
  18.       for i in range(3):
  19.          seconds += int(split_time[i])*list_time[i]
  20.  
  21.       return seconds
  22.  
  23.    def get_total_time(self):
  24.       times = None
  25.  
  26.       f = self.open_file()
  27.       for line in f.readlines():
  28.          if "Duration" in line:
  29.             times = re.search(r"Duration: ([\w?:]+)",line).group(1)
  30.  
  31.       f.close()
  32.       return int(self.get_seconds(times))
  33.  
  34.  
  35.    def get_actual_time(self,line):
  36.       times = re.findall(r"time=([\w?:]+)",line)
  37.       return self.get_seconds(times[-1])
  38.  
  39.    def open_file(self):
  40.       while True:
  41.          if os.path.exists("log.txt"):
  42.             f = open("log.txt","r")
  43.             return f
  44.          else:
  45.             time.sleep(1)
  46.             continue
  47.  
  48.    def get_size_convert(self):
  49.       total_time = self.get_total_time()
  50.  
  51.       f = self.open_file()
  52.       last_line = f.readlines()[-1]
  53.       if "time=" in last_line:
  54.          actual_time = self.get_actual_time(last_line)
  55.          f.close()
  56.          porcentaje = (100*actual_time)/total_time
  57.          return str(porcentaje)+"%"
  58.          time.sleep(1)
  59.       elif "muxing overhead" in last_line:
  60.          return "100%"
  61.       else:
  62.          return "waiting"
  63.  
  64.    def run(self):
  65.       total_time = self.get_total_time()
  66.  
  67.       while True:
  68.          f = self.open_file()
  69.          last_line = f.readlines()[-1]
  70.          if "time=" in last_line:
  71.             actual_time = self.get_actual_time(last_line)
  72.             f.close()
  73.             porcentaje = (100*actual_time)/total_time
  74.             print str(porcentaje)+"%"
  75.             time.sleep(1)
  76.          elif "muxing overhead":
  77.             print "100%"
  78.             break
  79.          else:
  80.             break
  81.  
  82. class ffmpeg(object):
  83.  
  84.    def __init__(self,name,total_dir,fmt_out='mp3',automatic_print=False):
  85.       self._fmt_out = fmt_out
  86.       self._name = name
  87.       self.total_dir = total_dir
  88.       self.automatic_print = automatic_print
  89.  
  90.    def convert(self):
  91.       if os.path.exists("log.txt"): os.remove("log.txt")
  92.       if self.automatic_print == True:
  93.          print "entra automatico"
  94.          p = progress()
  95.          p.daemon = True
  96.          p.start()
  97.       command = 'pyffmpeg\\ffmpeg.exe -i "%s" -y -f %s "%s.%s" 2> log.txt' %(self.total_dir,self._fmt_out,self._name,self._fmt_out)
  98.       os.system(command)

5- Dentro de esta carpeta tendrá que estar el archivo ffmpeg.exe que se puede descargar de su página oficial.
You are not allowed to view links. Register or Login

Metodo de uso

Código: Python
  1. import pyDownloader
  2. #"convert_to" y "automatic_print" por defecto es False
  3. obj = pyDownloader.pyDownloader("url_completa_de_youtube",convert_to=True,automatic_print=False)
  4. #"type_f" es el formate de descarga que por defecto es "mp4" y "to" es el formato al que se va a convertir
  5. #que por defecto es "mp3"
  6. obj.download(type_f="ogg",to="flv")
  7.  
  8. def downloading():
  9.    while True:
  10.       info_download = obj.get_size_write()
  11.       if info_download == "waiting":
  12.          time.sleep(1)
  13.       elif info_download == "100%":
  14.          print info_download
  15.          break
  16.       else:
  17.          print info_download
  18.          time.sleep(1)
  19.  
  20. def convert():
  21.    while True:
  22.       info_convert = obj.get_size_convert()
  23.       if info_convert == False:
  24.          break
  25.       elif info_convert == "waiting":
  26.          time.sleep(1)
  27.       elif info_convert == "100%":
  28.          print info_convert
  29.          break
  30.       else:
  31.          print info_convert
  32.          time.sleep(1)
  33.  
  34. downloading()
  35. convert()
Bueno, pues lo dicho, espero que les guste y que les sea útil.
« Última modificación: Junio 07, 2015, 12:34:39 pm por Expermicid »

Desconectado Sajuuk

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • "The demons of my own design"
  • Twitter: @BarlanV
    • Ver Perfil
    • Email
¡ Excelente trabajo $francisco !
Una vez quise hacerlo, pero no avancé nada. Me distraigo fácilmente xD :v
 
Saludos!
« Última modificación: Junio 06, 2015, 11:11:24 pm por Barlan »


Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 193
  • Actividad:
    0%
  • Reputación 0
  • Skype: hackloper
    • Ver Perfil
    • Email
Gracias, cambiare el post y pondré mas información de como funciona todo.

 

clsFTP.interactivo() navegar por un ftp y descargar archivo o directorio

Iniciado por darkucla

Respuestas: 3
Vistas: 416
Último mensaje Enero 11, 2020, 05:19:50 pm
por DtxdF
[VIDEOTUTORIAL] Hacking con Python - LATAM - 34 videos - 1.1 GB

Iniciado por graphixx

Respuestas: 5
Vistas: 6028
Último mensaje Abril 07, 2020, 12:24:04 pm
por Br0ken
[Python] Descargar Archivos - by NiKo

Iniciado por ProcessKill

Respuestas: 3
Vistas: 4747
Último mensaje Noviembre 03, 2012, 11:50:45 am
por BigBear
Otro Cifrador/Descifrador por desplazamiento, Decimación y Afin

Iniciado por darkucla

Respuestas: 1
Vistas: 303
Último mensaje Enero 18, 2020, 09:30:50 am
por noxonsoftwares
Canal en Youtube de Hacking con Python

Iniciado por Snifer

Respuestas: 6
Vistas: 5212
Último mensaje Octubre 11, 2014, 10:49:19 pm
por Flemon