2012-05-13 3 views
6

Sono stato per un po 'ora, come parte di un progetto più ampio, cercando di trovare un modo per lo streaming di Youtube AUDIO in un'applicazione senza scaricare il file corrispondente.Generazione di collegamenti a YouTube Audio

Quello che ho ora è un programma che scarica il video utilizzando un servizio Web come saveyoutube.com. Questo, tuttavia, non è molto efficiente. Il download del video stesso richiede circa 5 minuti e il cliente potrebbe stancarsi di aspettare e utilizzare direttamente l'interfaccia di Youtube. Inoltre, diciamo che l'utente del programma desidera accedere ad un album di 4 ore. Tuttavia, vogliono ascoltare solo una parte specifica di esso, per motivi di spiegazione, diciamo che l'utente desidera vedere il video da 2 ore in poi (ad esempio, prendere il video this).

Non c'è dubbio che il mio programma funzioni anche per questo, ma ci vogliono circa 20 minuti per iniziare la riproduzione della musica (poiché il download di 2 ore di audio richiede molto tempo). Inoltre, ho consumato circa 400 megabyte di spazio sul computer dell'utente a quel punto. Certo, posso memorizzare il file in una cartella temporanea e cancellarlo dopo chiudono il programma, ma che porta a più problemi:

  1. Se il programma si blocca a 1 minuto prima che il download è completo a causa della mancanza di spazio (chissà cosa ha il client sul proprio computer), il cliente avrebbe sprecato circa 20 minuti del proprio tempo per niente.

  2. La prossima volta che caricano il programma, desiderano fare la stessa cosa. Quindi devono aspettare UN ALTRO 20 minuti. Ciò potrebbe essere contrastato aggiungendo un pulsante "Salva audio" all'interfaccia, che impedirà al programma di eliminare il file quando viene chiuso. Tuttavia, rimane il primo impass.

Quindi ecco la mia domanda: c'è un modo per generare un link per l'audio dei video di Youtube ? C'è un modo per ottenere un URL come http://www.youtube.com/watch?v=AOARzA8nGu4.(AUDIOEXTENSION)? In questo modo, saltare a una parte nella colonna sonora sarebbe più semplice e non richiederebbe il download. Ho cercato questo per un po ', e finora, la cosa più vicina a una risposta WAS saveyoutube: un downloader mp3.

È anche possibile farlo? In caso contrario, esiste un'alternativa a YouTube che questo può essere fatto per? Ho esaminato il numero Youtube API, ma anche questo è sfavorevole, come la maggior parte dei servizi di Google, la sua API è limitata.

Il linguaggio di programmazione non è un limite, poiché la maggior parte del codice può essere tradotto. Tuttavia, una soluzione Python o C/C++ sarebbe l'ideale.

Grazie in anticipo!

P.S. Ho un server disponibile per questo, ma sarei molto riluttante a scaricare tutti i video di Youtube sul server. Tuttavia, se c'è un'altra soluzione che coinvolge un server che non comporta la rimozione di tutta la totalità di Youtube, sarebbe grandioso.

+0

Dubito che YouTube memorizzi separatamente audio e video, quindi è impossibile recuperare solo l'audio. Inoltre, penso che potrebbe violare i Termini di servizio. – aland

risposta

6

Dopo una quantità considerevole di ulteriori ricerche, ho trovato una soluzione. Pur non ottenendo LINKS per l'audio, ho creato un programma che riproduce il video di YouTube in modo invisibile e quindi può riprodurre l'AUDIO, che era la mia intenzione.

Il programma che ho scritto utilizza un sacco dei moduli Python già disponibili per raggiungere l'obiettivo.

Ho trovato il collegamento this, che spiega come incorporare Flash in un'applicazione Python, tramite wxPython (trovato here). Ha un modulo activexwrapper, che ho utilizzato per riprodurre il Flash.

Codice:

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() 

che riproduce il video. Nel mio caso, non volevo avere la GUI, quindi ho cancellato la riga 'frame.Show(True)'. Se desideri testarlo, prova un link come "http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US", come spiegherò più avanti.

Tuttavia, ciò non consente la pausa, ecc. Pertanto, è necessario utilizzare altri metodi.

Per avviare la riproduzione automatica: aggiungere un '&autoplay=1' all'URL

Ecco come si può mettere in pausa:

È possibile generare la lunghezza del video urante il modulo youtube-dl, e uccidere il filo quando le pause utente esso. Tuttavia, memorizzerai il tempo già riprodotto, e la volta successiva aggiungerai un '&start=SECONDSPLAYED', che effettivamente 'riprenderà' il video. Dettagli su questo sono trovati here.

Inoltre, DEVI utilizzare l'URL di incorporamento di YouTube, che è l'unico che funziona. Un esempio appare come 'http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US'

Pro

  • legali *
  • veloce Flash tempo di caricamento (benchmark 0,01 secondi)
  • non spreca spazio
  • Puoi saltare alla fine senza scaricare intero file
  • Usi illimitati, a causa del mancato utilizzo dell'API YouTube

* Secondo YouTube's terms of service, sezione 4: Uso generale del servizio-Permessi e restrizioni, comma 3.

utente accetta di non accedere a contenuti attraverso qualsiasi tecnologia o mezzo diverso dalle pagine del video playback del Servizio stesso, il lettore incorporabile o altri mezzi esplicitamente autorizzati che YouTube può designare.

A causa di ciò il programma utilizza un'interfaccia alternativa che utilizza principalmente l'Embeddable Player e non fa nulla di completamente illegale (come il download del file [la mia prima idea]).

Contro

  • A causa della dipendenza da ActiveX, questa applicazione sarà NON lavorare su qualsiasi sistema operativo ma Windows.
  • Dalle persone che conosco, pochi usano Internet Explorer. Purtroppo, questo programma richiede l'installazione di INTERNET EXPLORER Flash; non Mozzila Flash, Chrome Flash. Deve assolutamente essere IE. In caso contrario, l'applicazione verrà caricata, ma il video non verrà visualizzato.
  • wx richiede un tempo MOLTO lungo per caricare (circa 10 secondi).

dipendenze

  • Per ovvie ragioni, wxPython deve essere utilizzato.
  • È necessario installare i comtypes Python (trovati here). Altrimenti, wxPython non può comunicare con ActiveX.

di funzioni di aiuto

Ho anche creato alcune funzioni per accelerare il processo per chi sta facendo la stessa cosa.

Tutte sono belle lambdas con un solo liner.

generate_link: restituisce l'URL di incorporamento di YouTube, dato un normale URL di YouTube.

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: accetta ora, minuto e secondi di dove avviare un video e restituisce un collegamento.

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

autoplay: probabilmente il più semplice, imposta l'autoplay su true e restituisce un collegamento. Accetta un link.

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

video_length: restituisce la lunghezza del video. Utile, accetta il link di YouTube.

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

Questo è inteso come una soluzione per il fatto che la licenza video restituirà un errore

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 

Pertanto, ho analizzato nella pagina video reale per ottenere la lunghezza. Un po 'più lento, ma funziona senza fallo.

4

YouTube utilizza H.264/MPEG-4 coding con audio stereo AAC. Il suono è incorporato nel file video; devi praticamente scaricare l'intero video per recuperare le tracce audio.