Hola a todos:
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:
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
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).
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:
<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
esto siempre me entrega el html previo a la finalización de ajax, cuando me entrega el link
Quedo pendiente a vuestra ayuda y guia maestros!!!
Saludos