comment
IRC Chat
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
  • 1406 Vistas

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

Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 191
  • Actividad:
    0%
  • 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.
No tienes permisos para ver links. Registrate o Entra con tu cuenta

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: 191
  • Actividad:
    0%
  • 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: 3995
Último mensaje Enero 06, 2017, 12:09:08 pm
por zoro248
[Python] Descargar Archivos - by NiKo

Iniciado por ProcessKill

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

Iniciado por Snifer

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