2012-05-13 19 views
6

He estado por un tiempo, como parte de un proyecto más grande, tratando de encontrar una manera de transmitir Youtube AUDIO en una aplicación sin descargar el archivo correspondiente.Generando Enlaces a Audio de Youtube

Lo que tengo ahora es un programa que descarga el video usando un servicio web como saveyoutube.com. Esto, sin embargo, no es muy eficiente. La descarga del video en sí tarda unos 5 minutos, y el cliente puede cansarse de esperar y simplemente usar la interfaz de Youtube directamente. Además, supongamos que el usuario del programa desea acceder a un álbum de 4 horas de duración. Sin embargo, quieren escuchar solo una parte específica de la misma, en aras de una explicación, digamos que el usuario quiere ver el video a partir de las 2 horas en adelante (por ejemplo, tomar el video this).

No hay duda de que mi programa también funciona para esto, pero la música tarda aproximadamente 20 minutos en comenzar a reproducirse (ya que la descarga de 2 horas de audio lleva mucho tiempo). Además, he usado alrededor de 400 megabytes de espacio en la computadora del usuario para entonces. Claro, puedo almacenar el archivo en una carpeta temporal y eliminarlo después de cerrar el programa, pero que conduce a más problemas:

  1. Si el programa se bloquea en 1 minuto antes de que finalice la descarga debido a la falta de espacio (quién sabe lo que el cliente tiene en su computadora), el cliente habría perdido alrededor de 20 minutos de su tiempo por nada.

  2. Supongamos que la próxima vez que carguen el programa, desean hacer lo mismo. Luego tienen que esperar OTRO 20 minutos. Esto podría ser contrarrestado agregando un botón 'Guardar audio' a la interfaz, lo que evitaría que el programa borre el archivo cuando se cierre. Sin embargo, el primer impass permanece.

Así que aquí es mi pregunta: ¿hay una manera de generar vínculos con el audio del vídeos de Youtube? ¿Hay alguna manera de obtener una URL como http://www.youtube.com/watch?v=AOARzA8nGu4.(AUDIOEXTENSION)? De esa forma, saltar a una parte en la banda sonora sería más fácil y no requeriría descargar. He investigado esto durante bastante tiempo, y hasta ahora, lo más parecido a una respuesta fue saveyoutube: un descargador de mp3.

¿Es esto posible? Si no, ¿existe una alternativa a Youtube para que esto pueda hacerse? He investigado el Youtube API, pero una vez más es desfavorable, ya que, como la mayoría de los servicios de Google, su API es limitada.

El lenguaje de programación no es una limitación, ya que la mayoría del código se puede traducir. Sin embargo, una solución Python o C/C++ sería ideal.

¡Gracias de antemano!

P.S. Tengo un servidor disponible para esto, pero sería muy reacio a descargar todos los videos de Youtube en el servidor. Sin embargo, si hay otra solución que involucre un servidor que no implique robar la totalidad de Youtube, sería genial.

+0

Dudo que youtube almacene audio y video por separado, por lo que es imposible buscar solo audio. Además, creo que podría violar los términos del servicio. – aland

Respuesta

6

Después de una cantidad considerable de más investigación, encontré una solución. Aunque no obtuve LINKS para el audio, creé un programa que reproduce el video de YouTube de forma invisible y, por lo tanto, puedo reproducir el 'AUDIO', que era mi intención.

El programa que escribí utiliza muchos de los módulos de Python ya disponibles para lograr el objetivo.

Encontré this enlace, que explica cómo incrustar Flash en una aplicación de Python, a través de wxPython (encontrado here). Tiene un módulo activexwrapper, que utilicé para jugar el Flash.

Código:

import wx 

if wx.Platform == '__WXMSW__': 
    from wx.lib.flashwin import FlashWindow 


class MyPanel(wx.Panel): 
    def __init__(self, parent, id): 
     wx.Panel.__init__(self, parent, -1) 
     self.pdf = None 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     btnSizer = wx.BoxSizer(wx.HORIZONTAL) 

     self.flash = FlashWindow(self, style=wx.SUNKEN_BORDER) 
     sizer.Add(self.flash, proportion=1, flag=wx.EXPAND) 
     #sizer.Hide(0) 

     self.SetSizer(sizer) 
     self.SetAutoLayout(True) 
     print "Importing Flash..." 
     self.flash.LoadMovie(0, raw_input('Copy link for flash: ')) 
     #Used to load a flash file. You may also give a location of a specific file on disk. 
     print "Done." 

app = wx.PySimpleApp() 
# create window/frame, no parent, -1 is default ID, title, size 
# change size as needed 
frame = wx.Frame(None, -1, "Flash Stream", size = (500, 400)) 
# make instance of class, -1 is default ID 
MyPanel(frame, -1) 
# show frame 
frame.Show(True) 
#comment if you don't want to see the ui 
print "Started" 
# start event loop 
app.MainLoop() 

que reproduce el vídeo. En mi caso, no quería tener la GUI, así que eliminé la línea 'frame.Show(True)'. Si desea probarlo, intente con un enlace como 'http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US', como explicaré más adelante.

Sin embargo, esto no permite la pausa, etc. Por lo tanto, se deben usar otros métodos.

Para iniciar la reproducción automática: añadir un '&autoplay=1' a la URL

aquí es cómo se puede hacer una pausa:

Puede generar la duración del video urante el módulo youtube-dl, y matar al hilo cuando las pausas de los usuarios eso. Sin embargo, almacenaría el tiempo que ya se jugó, y la próxima vez, agregaría un '&start=SECONDSPLAYED', que 'reanudará' efectivamente el video. Los detalles sobre esto se encuentran here.

Además, DEBE utilizar la URL de inserción de YouTube, que es la única que funciona. Un ejemplo se ve como 'http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US'

Pros

  • Legal *
  • Parpadeo rápido tiempo de carga (0.01 segundos referencia)
  • no desperdicia espacio
  • puede saltar a poner fin sin necesidad de descargar archivo completo
  • Usos ilimitados, debido a que no se usa la API de YouTube

* De acuerdo con YouTube's terms of service, sección 4: Uso general del servicio de Permisos y restricciones, inciso 3.

Usted acepta no acceder a contenido a través de cualquier tecnología o medios distintos de las páginas de reproducción de vídeo de la El servicio en sí mismo, el Reproductor incrustable u otro medio explícitamente autorizado que YouTube pueda designar.

Debido a que el programa utiliza una interfaz alternativa que utiliza principalmente el reproductor incrustable, y no hace nada completamente ilegal (como descargar el archivo [mi primera idea]).

Contras

  • Debido a la dependencia de ActiveX, esta aplicación NO trabajo en cualquier sistema operativo pero Windows.
  • De la gente que conozco, pocos usan Internet Explorer. Por desgracia, este programa requiere la instalación de INTERNET EXPLORER Flash; no Mozzila Flash, Chrome Flash. TIENE que ser IE. De lo contrario, la aplicación se cargará, pero el video no aparecerá.
  • wx lleva mucho tiempo cargar (aproximadamente 10 segundos).

Dependencias

  • Por razones obvias, wxPython debe ser utilizado.
  • Se deben instalar los comandos Python (encontrado here). De lo contrario, wxPython no se puede comunicar con ActiveX.

Funciones útiles que

que también crearon algunas funciones para agilizar el proceso para cualquier persona que está haciendo la misma cosa.

Todas son bonitas lambdas de una sola línea.

generate_link: devuelve la URL de inserción de YouTube, con una URL de YouTube normal.

generate_link = lambda link: 'http://www.youtube.com/v/'+re.compile(r'watch\?v=(.*?)(?:&|$)').search(link).group(1)+'?version=3&hl=en_US' 

start_from: Acepta la hora, los minutos y los segundos de dónde comenzar un video y devuelve un enlace.

start_from = lambda hours, minutes, seconds, link: link + '&start=' + str((hours*60*60)+(minutes*60)+seconds) 

autoplay: Probablemente el más simple, establece la reproducción automática en verdadero y devuelve un enlace. Acepta un enlace.

autoplay = lambda link: link + '&autoplay=1'  

video_length: Devuelve la longitud del video. Útil, acepta el enlace de YouTube.

video_length = lambda video: re.compile(r'length_seconds=(.*?)\\', re.S).search(urllib2.urlopen(video).read()).group(1).strip() 

Esto se entiende como una solución para el hecho de que vídeos con licencia devolverá un error

status=fail&errorcode=150&reason=This+video+contains+content+from+WMG.+It+is+restricted+from+playback+on+certain+sites.%3Cbr%2F%3E%3Cu%3E%3Ca+href%3D%27http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DVALbSjayAgw%26feature%3Dplayer_embedded%27+target%3D%27_blank%27%3EWatch+on+YouTube%3C%2Fa%3E%3C%2Fu%3E 

Por lo tanto, Analizada la página de vídeo real para obtener la longitud. Un poco más lento, pero funciona sin falta.

4

YouTube usa H.264/MPEG-4 coding con sonido estéreo AAC. El sonido está incrustado en el archivo de video; tienes que descargar todo el video para recuperar las pistas de sonido.

Cuestiones relacionadas