Les cuento... trabajo en uno de esos proyectitos para matar el tiempo.
Aunque se que existen muchas aplicaciones que lo hacen, quiero bajar mp3s desde youtube utilizando cualquier plataforma (android, iphone, web, windows, etc...) y para eso se me ocurrió hacer un WebService en VB.net que me devuelva la ruta de descarga en base a algunos portales que ya realizan esta tarea. me explico:
Anteriormente desarrollé esta app en vb.net para windows:
Código:
Lo unico que hago es cargar esta web y recorrer su cod html tantas veces como sea necesario hasta que aparezca el link de descarga que necesito. Dado que la web vidtomp3.com requiere un poco de tiempo para entregar el link, debo recorrerla varias veces hasta que aparezca (la web tiene ajax implementado).Public Class Form1 Function Between(ByVal org As String, ByVal first As String, ByVal last As String) As String On Error Resume Next Dim startloc As Integer = org.IndexOf(first, 0) Dim endloc As Integer = org.IndexOf(last, startloc + first.Length) startloc = startloc + first.Length endloc = endloc - startloc Return org.Substring(startloc, endloc) End Function Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick Dim source As String = "" Dim returnstring As String = "" Dim codef As String = "" Dim final As String = "" source = WebBrowser1.DocumentText If InStr(source, "Click here to get your Download Link") Then Me.Text = "Converted, waiting for download link..." Timer1.Enabled = False returnstring = Between(source, "<a href=""download.php?server=", "&hash=") codef = Between(source, "hash=", """>Click here") final = "http://" & returnstring & ".vidtomp3.com/download/" & codef WebBrowser1.Navigate(final) ElseIf InStr(source, "Conversion complete") Then Me.Text = "Downloading..." End If End Sub Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click WebBrowser1.Navigate("about:blank") WebBrowser1.Navigate("about:blank") WebBrowser1.Navigate("about:blank") Me.Text = "Procesing request" WebBrowser1.Navigate("http://www.vidtomp3.com/process.php?url=http://www.youtube.com/watch?v=" & TextBox1.Text) Timer1.Enabled = True End Sub
Intente hacer lo mismo en un WebService vb.net, pero el resultado siempre ha sido fallido.
Cargué la web con httpwebrequest y despues extraigo su html tantas veces sea necesario (con un ciclo while) hasta que aparezca el link de descarga, pero esto no sucede nunca dado que el request solo me lee hasta el punto que dice algo como "cheking link" y no hasta que me muestra el link con ajax.
En sintesis, como el link es mostrado con ajax en la pagina, el request asume que la lectura de la web termino y me entrega el html de un punto anterior.
¿Como puedo hacer para que el codigo html obtenido a través de httpwebrequest y httpwebresponse sea el de la carga final de la web, cuando ajax ya mostró el link?
Adjunto lo que hice, sin resultados.
Código:
esto siempre me entrega el html previo a la finalización de ajax, cuando me entrega el link<WebMethod()> _ Public Function Mp3FromYoutube(ByVal code As String) As String Dim urlDownload As String Dim sourcecode As String = "" Dim sr As System.IO.StreamReader Dim aux As Integer urlDownload = "http://www.vidtomp3.com/process.php?url=http://www.youtube.com/watch?v=" & code Try Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create(urlDownload) Dim response As System.Net.HttpWebResponse = request.GetResponse() sr = New System.IO.StreamReader(response.GetResponseStream()) aux = 0 While aux = 0 aux = InStr(sourcecode, "Click here to get your Download Link") sourcecode = sr.ReadToEnd() End While Return sourcecode Catch ex As Exception Return "error" End Try End Function
Quedo pendiente a vuestra ayuda y guia maestros!!!
Saludos