send
Grupo de Telegram
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

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

  • 2 Respuestas
  • 1236 Vistas

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

Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 192
  • Actividad:
    1.67%
  • Reputación 0
    • Ver Perfil
    • Email
  • Skype: hackloper
« en: Junio 06, 2015, 10:52:47 pm »
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: hackloper.soporte@gmail.com
  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: hackloper.soporte@gmail.com
  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 Barlan

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • "The demons of my own design"
    • Ver Perfil
  • Twitter: @BarlanV
« Respuesta #1 en: Junio 06, 2015, 11:07:26 pm »
¡ 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: 192
  • Actividad:
    1.67%
  • Reputación 0
    • Ver Perfil
    • Email
  • Skype: hackloper
« Respuesta #2 en: Junio 07, 2015, 07:49:47 am »
Gracias, cambiare el post y pondré mas información de como funciona todo.

 

¿Te gustó el post? COMPARTILO!



[VIDEOTUTORIAL] Hacking con Python - LATAM - 34 videos - 1.1 GB

Iniciado por graphixx

Respuestas: 4
Vistas: 3490
Último mensaje Enero 06, 2017, 12:09:08 pm
por zoro248
[Python] Descargar Archivos - by NiKo

Iniciado por ProcessKill

Respuestas: 3
Vistas: 3263
Último mensaje Noviembre 03, 2012, 11:50:45 am
por BigBear
Canal en Youtube de Hacking con Python

Iniciado por Snifer

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