Hola buenas, he hecho una app que espero que os guste:
(http://mrtzcmp3.net/logo.gif)
Descripción: Esta app mediante "algoritmos", lo que hace es, sacar la música de dicha web (http://mrtzcmp3.net/) en links para que luego sean descargados...
**Luego explico como descargarse los links de forma rápida y cómoda(http://gyazo.com/c39a67cc97ee296162a7804ef01a1be8.png)
La app descargandose algo de música...http://www.mediafire.com/download/76r1o6dhw7p66zb/mrtzcmp3Downloader.rar
Básicamente, tenéis que poner los títulos de las músicas separados por puntos y comas, y luego, darle a
"Buscar"... La app lo único que va a hacer va a ser los links de la música, ya luego vosotros pues tenéis que descargarosla aparte...
> Tutorial:Antes de nada, decir que
JD y Orbit downloader no van... Así que la última solución es descargarse Firefox (https://download.mozilla.org/?product=firefox-stub&os=win&lang=es-ES) e instalar su plugin DownloadThemAll (https://addons.mozilla.org/en-US/firefox/addon/downthemall/).
Una vez hecho esto, cogemos el archivo con la lista generada por mi app, y lo abrimos con un
editor de textos que admita
busquedas con
Regex como
Sublime Text, cogemos y buscamos con
Regex esto:
http://.+, luego le damos a
Find All, copiamos el texto seleccionado y lo ponemos en un nuevo archivo y reemplazamos todos los
espacios por
%20, y después lo guardamos y lo volvemos a abrir con
FF, una vez con el
TXT abierto en
FF, damos click derecho y
dTa OneClick...
Como podéis observar:(http://gyazo.com/bffc5290273fdedb236f44061a2f84a8.png)
Un saludo.
PD: Ya se que la app no tiene el nombre más correcto, pero es el primero que se me ocurrió... xD
ya vi como le haces, practicamente parseas los documents del webclient q seguramente usas, y rastreas el script q tiene los .mp3 del reproductor de dicha web, estuve dandole 1 vueltita al firebug y le pille
por cierto acabas de darme 1 terrible idea sobre una arquitectura de gestion de archivos y esta pequeña web, ojala tenga 1 gran repertorio de musica
1 rato jugando con mis algoritmos llegue a esto, es mejorable, lo mejorare, pero te dejare este para q veas q si se puede mejorar
Imports System.Net
Imports System.Text.RegularExpressions
Imports System.IO
Class MainWindow
#Region "Variables"
Dim response As HttpWebResponse
Dim request As HttpWebRequest
Dim cookies As New CookieContainer
Dim Identificador As String
Dim data As String
Dim finder As MatchCollection
Private Delegate Sub Refresher()
#End Region
#Region "API"
Dim base As String = "http://mrtzcmp3.net/"
Dim Extension1 As String = "_1s.html"
#End Region
#Region "Funciones"
Public Sub tarea(ByVal URL As String)
request = CType(HttpWebRequest.Create(base & Utils.UrlEncode(URL) & Extension1), HttpWebRequest)
request.CookieContainer = cookies
response = CType(request.GetResponse(), HttpWebResponse)
For Each cook As Cookie In response.Cookies
If cook.Name = "haras" Then
Identificador = cook.Value
End If
cookies.Add(cook)
Next
data = New System.IO.StreamReader(response.GetResponseStream()).ReadToEnd()
finder = Regex.Matches(data, "D\?.+? _")
If finder.Count > 0 Then
request = CType(HttpWebRequest.Create(base & finder(0).Value & Identificador), HttpWebRequest)
request.CookieContainer = cookies
response = CType(request.GetResponse(), HttpWebResponse)
data = New System.IO.StreamReader(response.GetResponseStream()).ReadToEnd()
finder = Regex.Matches(data, "Get_a_a_\w+\.mp3")
If finder.Count > 0 Then
request = CType(HttpWebRequest.Create(base & finder(1).Value), HttpWebRequest)
request.CookieContainer = cookies
Using Respuesta As HttpWebResponse = CType(request.GetResponse, HttpWebResponse)
'Asocio la respuesta al stream local
Dim total As Integer = Respuesta.ContentLength
Dim StreamRespuesta As Stream = Respuesta.GetResponseStream
'Bucle que lee y escribe en el fichero
Using ptfArchivoDestino As New FileStream("test.mp3", FileMode.Create)
Dim buffer(102400) As Byte '100KB
Dim Leido As Integer = 0
Dim acumulador As Integer = 0
Do
Leido = StreamRespuesta.Read(buffer, 0, buffer.Length)
acumulador += Leido
ptfArchivoDestino.Write(buffer, 0, Leido)
ProgressBar1.Dispatcher.Invoke(New Refresher(Sub() ProgressBar1.Value = (acumulador / total) * 100))
System.Threading.Thread.Sleep(50)
Loop Until Leido = 0 'Compruebo que no es final de transmision(1)
End Using
End Using
End If
End If
End Sub
#End Region
Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
Dim t As System.Threading.Thread
t = New System.Threading.Thread(AddressOf tarea)
t.Start(TextBox1.Text)
End Sub
End Class
Public Class Utils
Public Shared Function UrlDecode(ByVal value As String) As String
If String.IsNullOrEmpty(value) Then
Return String.Empty
End If
' UrlEncode escapes with lowercase characters (e.g. %2f) but oAuth needs %2F
value = Regex.Replace(value, "(%[0-9a-f][0-9a-f])", Function(c) c.Value.ToUpper())
' these characters are not escaped by UrlEncode() but needed to be escaped
value = value.Replace("%20", " ")
value = value.Replace("%5B", "[")
value = value.Replace("%5D", "]")
value = value.Replace("+", " ")
value = value.Replace("%3A", ":")
value = value.Replace("%23", "#")
value = value.Replace("%C3%B1", "ñ")
value = value.Replace("%28", "(")
value = value.Replace("%29", ")")
value = value.Replace("%21", "!")
Return value
End Function
Public Shared Function UrlEncode(ByVal value As String) As String
value = value.Replace(" ", "_")
Return value
End Function
End Class
(http://img163.imageshack.us/img163/5363/ifkw.jpg)
añadi unas cuantas cositas interesantes, para q le veas e investigues
LENGUAJE VB.NET PLATAFORMA WPF
1 consejo, si haras 1 programa que baja canciones Hacelo completo, no solo dejarle la URL al user para q la baje desde otro programa, es muy mal visto
si es dificil, lee, podras, lo q te deje ahi permite bajar el archivo pero cambie las rutas 1 poco en los httpwebcreate
Bueno, pues... xD
Public Shared Function UrlDecode(ByVal value As String) As String
If String.IsNullOrEmpty(value) Then
Return String.Empty
End If
' UrlEncode escapes with lowercase characters (e.g. %2f) but oAuth needs %2F
value = Regex.Replace(value, "(%[0-9a-f][0-9a-f])", Function(c) c.Value.ToUpper())
' these characters are not escaped by UrlEncode() but needed to be escaped
value = value.Replace("%20", " ")
value = value.Replace("%5B", "[")
value = value.Replace("%5D", "]")
value = value.Replace("+", " ")
value = value.Replace("%3A", ":")
value = value.Replace("%23", "#")
value = value.Replace("%C3%B1", "ñ")
value = value.Replace("%28", "(")
value = value.Replace("%29", ")")
value = value.Replace("%21", "!")
Return value
End Function
Public Shared Function UrlEncode(ByVal value As String) As String
value = value.Replace(" ", "_")
Return value
End Function
Esto ya lo había pensado, es más tenía pensado hacer de forma mas sencilla esa función, como tengo un host, pues subo un archivo php que me codifique la URL y me devuelta la string codificada, así no tengo que estar añadiendo cases ni nada, y pa colmo, tengo todos los caracteres convertidos...
Por lo demás, le echare un vistazo...
PD: He añadido un buscador más mp3 skull, subiré otra app, con más cosas... :P
Un saludo. Y gracias por tomarte la molestia... ;D
Por cierto, si algo me enseño
Elektro es a usar
select casesCitarSelect case value
case is ñ
return tal de tal
end select
no es por nada, pero ahorras mucho espacio en la memoria que metiendo 40 variables replace.. xD
La solución propuesta es fácilmente mejorable, muestro dos ejemplos.
Versión RegEx:
#Region " URL Decode "
' [ URL Decode ]
'
' //By Elektro H@cker
'
' Examples :
' MsgBox(URL_Decode("http%3A%2F%2Fwww%2Ewebsite%2Ecom%2Fpage%2Easp%3Fid%3D5%26test%3DHello%5FWorld"))
' Result: http://www.website.com/page.asp?id=5&test=Hello_World
Private Function URL_Decode(ByVal url As String) As String
Return Regex.Replace( _
url.Replace("+", Chr(Keys.Space)), _
"(%[\dA-F]{2})", Function(hex) Chr(String.Format("&H{0}", hex.Value.Substring(1))), _
RegexOptions.IgnoreCase)
End Function
#End Region
Versión Select Case:
#Region " URL Decode "
' [ URL Decode ]
'
' //By Elektro H@cker
'
' Examples :
' MsgBox(URL_Decode("http%3A%2F%2Fwww%2Ewebsite%2Ecom%2Fpage%2Easp%3Fid%3D5%26test%3DHello%5FWorld"))
' Result: http://www.website.com/page.asp?id=5&test=Hello_World
Private Function URL_Decode(ByVal url As String) As String
Dim decoded As String = String.Empty
For c As Integer = 0 To (url.Length - 1)
Select Case url(c)
Case "+"
decoded &= Convert.ToChar(Keys.Space)
Case "%"
decoded &= Convert.ToChar(CInt("&H" & url(c + 1) & url(c + 2)))
c += 2
Case Else
decoded &= url(c)
End Select
Next c
Return decoded
End Function
#End Region
También se puede mejorar todo lo demás del proyecto en general para desarrollar un downloader asincronico, pero con este código es más que suficiente.
Esto lo posteo para todas aquellas personas que se encuentren en la misma situación,
sincéramente, no lo posteo para ayudar al autor del post, ni al otro usuario.
Un saludo!
Bueno, claro, siempre puedes hacer lo que PHP hace en VB.NET, que es coger y convertir las letras a ASCII y ese ASCII a Hexadecimal..
Un saludo.
PD: El método por Select Case no me termina de convencer, no se porque parece que ocupa más memoria RAM...
Cita de: Ikillnukes en 26 Octubre 2013, 16:48 PMno se porque parece que ocupa más memoria RAM...
Un RegEx reserva más memoria y es lento en comparación, tarda más en inicializarse y en finalizar su ejecución (Lease las diferentes
RegExOptions para ajustar un poco estas caracteristicas).
Según un test de velocidad que acabo de realizar para decodificar 1.000.000 de strings, estos han sido los resultados:
Método 1 (Regex.Replace): 11.826 segundos
Método 2 (String Append): 6.201 segundos
Óbviamente, para procesar una efímera cantidad de urls, no importa en absoluto que método se use ya que la diferencia en
ms no se podrá apreciar.
Saludos.
Y si no es mucho preguntar, como has procesado un millón de Strings? xD
No me expresé corréctamente, quería decir que he procesado el mismo string un millón de veces.
watch start
For x = 0 to 1000000
URL_Decode(...)
next
watch end
mostrar resultados
Saludos
Cita de: Ikillnukes en 26 Octubre 2013, 19:59 PM
Y si no es mucho preguntar, como has procesado un millón de Strings? xD
sigo prefiriendo mi forma :) mis algoritmos se basan en optimizacion de CPU, y un select case para y un ciclo para decodear o encodear una URL me parece un desperdicion pero bueno
lo de arriba lo arme en 5 min, pero hay unas cuantas cosas q deberias revisar porque tienes 1 bug algo feo en el codigo
sobre todo aca
finder = Regex.Matches(data, "D\?.+? _")
y aca
request = CType(HttpWebRequest.Create(base & finder(0).Value & Identificador), HttpWebRequest)
no estas tomando en cuenta algo importante
(http://img822.imageshack.us/img822/6591/d2pr.jpg)
System.Web.HttpUtility
Es una clase de .Net, que contiene métodos que pueden "parsear" los caracteres inválidos en hexadecimal y viceversa. Están disponibles los métodos Encode/Decode Url, respectivamente para cada caso.
Cita de: Ikillnukes en 23 Octubre 2013, 21:01 PM
Hola buenas, he hecho una app que espero que os guste:
Descripción: Esta app mediante "algoritmos", lo que hace es, sacar la música de dicha web (http://mrtzcmp3.net/) en links para que luego sean descargados...*
*Luego explico como descargarse los links de forma rápida y cómoda
La app descargandose algo de música...
http://www.mediafire.com/download/76r1o6dhw7p66zb/mrtzcmp3Downloader.rar
Básicamente, tenéis que poner los títulos de las músicas separados por puntos y comas, y luego, darle a "Buscar"... La app lo único que va a hacer va a ser los links de la música, ya luego vosotros pues tenéis que descargarosla aparte...
> Tutorial:
Antes de nada, decir que JD y Orbit downloader no van... Así que la última solución es descargarse Firefox (https://download.mozilla.org/?product=firefox-stub&os=win&lang=es-ES) e instalar su plugin DownloadThemAll (https://addons.mozilla.org/en-US/firefox/addon/downthemall/).
Una vez hecho esto, cogemos el archivo con la lista generada por mi app, y lo abrimos con un editor de textos que admita busquedas con Regex como Sublime Text, cogemos y buscamos con Regex esto: http://.+, luego le damos a Find All, copiamos el texto seleccionado y lo ponemos en un nuevo archivo y reemplazamos todos los espacios por %20, y después lo guardamos y lo volvemos a abrir con FF, una vez con el TXT abierto en FF, damos click derecho y dTa OneClick...
Como podéis observar:
Un saludo.
PD: Ya se que la app no tiene el nombre más correcto, pero es el primero que se me ocurrió... xD
debo darte las gracias por la idea, tube q rediseñarlo desde 0, y añadir varios request mas y un metodo POST para obtener toda la data completa, pero a la final desarme esa web con todo y ropa
un consejo, las cookies no las modifiques :P no hace falta
(http://img42.imageshack.us/img42/458/ncwn.jpg)
mejorado
(http://img31.imageshack.us/img31/4559/dg2v.jpg)
te invito a probar Windows Presentation Foundation :) el winforms quedo obsoleto
Este aporte ha sido añadido al Recopilatorio de temas interesantes (http://foro.elhacker.net/net/recopilatorio_de_temas_interesantes-t301256.0.html) ;)
Gracias por compartir.
Salu2!
Cita de: Eleкtro en 8 Enero 2014, 21:47 PM
Este aporte ha sido añadido al Recopilatorio de temas interesantes (http://foro.elhacker.net/net/recopilatorio_de_temas_interesantes-t301256.0.html) ;)
Gracias por compartir.
Salu2!
Gracias a ti por añadirlo. :D
¡Nueva actualización!+ Arreglado el downloader, mrtzcmp3 cambió algunos detalles de su web, por lo que no se encontraba ningún link, ya se ha arreglado el problema.
+ Arreglada una pequeña excepción que saltaba al final de cada analización.
+ Ahora la URL se parsea por lo que los links pueden ser identificados antes.
Próximas características:+ Compatibilidad con JDownloader, así al terminar el analisis preguntar al usuario si desea descargar los links disponibles con JD.
+ Nuevos motores de busqueda como Plixid y MP3Crank.
+ Panel de herramientas (cambiar el delimitador, filtrado de busqueda (tamaño, etc), etc)
Cita de: Ikillnukes en 8 Febrero 2014, 20:19 PM+ Nuevos motores de busqueda como Plixid y MP3Crank.
No mezcles cosas Ikillnukes, plixid y mp3crank/mp3boo no son motores de búsqueda de mp3, solo son páginas que hostean links de albums,
lo que quiero decir es que, o haces un spider de canciones, o lo haces de álbumes, pero de las dos cosas acabaría siendo un tremendo lio para buscar... no creo que quieras descargarte un album entero sólamente para una canción que te interese.
...o bien le añades opciones para elegir si se desea buscar albumes o canciones.
EDITO: Bueno, hubo una confusión por mi parte (más q comprensible gracias a la peculiar forma que tiene Ikillnukes para hacer las cosas, como siempre)...ya que en la imagen que ha compartido Ikillnukes pone "
Descargando X de X canciones" pues yo me pensaba que el propósito del programa era buscar y descargar, pero no es así, no descarga, así que modifico mis sugerencias...
Te sugiero optimizaciones que le faltan al programa:
1. Un botón para pausar/reanudar o cancelar la descarga masiva.
2. Eso de escribir todas las canciones separados por un delimitador en una sola linea en ese textbox o richtextbox o lo que sea es treméndamente feo, usa un control óptimo como podría se run Listbox, así mantienes ordenados cada cancion en una sola linea... es que tal y como está ahora, es todo demasiado manual.
3. Poder arrastrar y soltar un archivo de texto en ese textbox o richtextbox (o en un Listbox si me hicieras caso).
4. Si le das dos veces al botón "Buscar", se pone a buscar una vez pero cuando acaba la búsqueda la app y las progressbars se vuelven locas y se freezea, obligando a matarla desde el administrador de tareas.
5. La app es inmovible, no se puede minimizar después de darle al botón 'buscar' ya que la operación bloquea la gui, tienes solución para este problema single-thread en distintas Classes:
Tasks,
BackgroundWorker,
Thread.
(No he mirado el source)
Saludos