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
  • 2016 Vistas

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

Desconectado $francisco

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

5- Dentro de esta carpeta tendrá que estar el archivo ffmpeg.exe que se puede descargar de su página oficial.
https://www.ffmpeg.org/

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"
    • Ver Perfil
    • Email
  • 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:
    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: 5350
Último mensaje Enero 06, 2017, 12:09:08 pm
por zoro248
[Python] Descargar Archivos - by NiKo

Iniciado por ProcessKill

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

Iniciado por Snifer

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