Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: z3nth10n en 23 Octubre 2013, 21:01 pm



Título: [SOURCE] mrtzcmp3 Downloader
Publicado por: z3nth10n en 23 Octubre 2013, 21:01 pm
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

  • Screenshots

(http://gyazo.com/c39a67cc97ee296162a7804ef01a1be8.png)
La app descargandose algo de música...

  • Descarga

http://www.mediafire.com/download/76r1o6dhw7p66zb/mrtzcmp3Downloader.rar

  • Modo de empleo

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


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Spiritdead5 en 25 Octubre 2013, 07:17 am
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

Código:
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


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: z3nth10n en 26 Octubre 2013, 12:42 pm
Bueno, pues... xD

Código
  1. Public Shared Function UrlDecode(ByVal value As String) As String
  2.        If String.IsNullOrEmpty(value) Then
  3.            Return String.Empty
  4.        End If
  5.        ' UrlEncode escapes with lowercase characters (e.g. %2f) but oAuth needs %2F
  6.        value = Regex.Replace(value, "(%[0-9a-f][0-9a-f])", Function(c) c.Value.ToUpper())
  7.        ' these characters are not escaped by UrlEncode() but needed to be escaped
  8.        value = value.Replace("%20", " ")
  9.        value = value.Replace("%5B", "[")
  10.        value = value.Replace("%5D", "]")
  11.        value = value.Replace("+", " ")
  12.        value = value.Replace("%3A", ":")
  13.        value = value.Replace("%23", "#")
  14.        value = value.Replace("%C3%B1", "ñ")
  15.        value = value.Replace("%28", "(")
  16.        value = value.Replace("%29", ")")
  17.        value = value.Replace("%21", "!")
  18.        Return value
  19.    End Function
  20.    Public Shared Function UrlEncode(ByVal value As String) As String
  21.        value = value.Replace(" ", "_")
  22.        Return value
  23.    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 cases

Citar
Select 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


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Eleкtro en 26 Octubre 2013, 16:29 pm
La solución propuesta es fácilmente mejorable, muestro dos ejemplos.

Versión RegEx:
Código
  1. #Region " URL Decode "
  2.  
  3.    ' [ URL Decode ]
  4.    '
  5.    ' //By Elektro H@cker
  6.    '
  7.    ' Examples :
  8.    ' MsgBox(URL_Decode("http%3A%2F%2Fwww%2Ewebsite%2Ecom%2Fpage%2Easp%3Fid%3D5%26test%3DHello%5FWorld"))
  9.    ' Result: http://www.website.com/page.asp?id=5&test=Hello_World
  10.  
  11.    Private Function URL_Decode(ByVal url As String) As String
  12.  
  13.        Return Regex.Replace( _
  14.                     url.Replace("+", Chr(Keys.Space)), _
  15.                     "(%[\dA-F]{2})", Function(hex) Chr(String.Format("&H{0}", hex.Value.Substring(1))), _
  16.                     RegexOptions.IgnoreCase)
  17.  
  18.    End Function
  19.  
  20. #End Region


Versión Select Case:
Código
  1. #Region " URL Decode "
  2.  
  3.    ' [ URL Decode ]
  4.    '
  5.    ' //By Elektro H@cker
  6.    '
  7.    ' Examples :
  8.    ' MsgBox(URL_Decode("http%3A%2F%2Fwww%2Ewebsite%2Ecom%2Fpage%2Easp%3Fid%3D5%26test%3DHello%5FWorld"))
  9.    ' Result: http://www.website.com/page.asp?id=5&test=Hello_World
  10.  
  11.    Private Function URL_Decode(ByVal url As String) As String
  12.  
  13.        Dim decoded As String = String.Empty
  14.  
  15.        For c As Integer = 0 To (url.Length - 1)
  16.            Select Case url(c)
  17.                Case "+"
  18.                    decoded &= Convert.ToChar(Keys.Space)
  19.                Case "%"
  20.                    decoded &= Convert.ToChar(CInt("&H" & url(c + 1) & url(c + 2)))
  21.                    c += 2
  22.                Case Else
  23.                    decoded &= url(c)
  24.            End Select
  25.        Next c
  26.  
  27.        Return decoded
  28.  
  29.    End Function
  30.  
  31. #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!


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: z3nth10n en 26 Octubre 2013, 16:48 pm
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...


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Eleкtro en 26 Octubre 2013, 18:31 pm
no 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:

Código:
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.


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: z3nth10n en 26 Octubre 2013, 19:59 pm
Y si no es mucho preguntar, como has procesado un millón de Strings? xD


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Eleкtro en 26 Octubre 2013, 20:40 pm
No me expresé corréctamente, quería decir que he procesado el mismo string un millón de veces.

Código
  1. watch start
  2. For x = 0 to 1000000
  3.  URL_Decode(...)
  4. next
  5. watch end
  6. mostrar resultados

Saludos


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Spiritdead5 en 26 Octubre 2013, 20:57 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

Código:
finder = Regex.Matches(data, "D\?.+? _")
 y aca
Código:
 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)


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Keyen Night en 27 Octubre 2013, 08:57 am
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.


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Spiritdead5 en 29 Octubre 2013, 05:10 am
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

  • Screenshots

La app descargandose algo de música...

  • Descarga

http://www.mediafire.com/download/76r1o6dhw7p66zb/mrtzcmp3Downloader.rar

  • Modo de empleo

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


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: 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!


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: z3nth10n en 8 Febrero 2014, 20:19 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)


Título: Re: [SOURCE] mrtzcmp3 Downloader
Publicado por: Eleкtro en 8 Febrero 2014, 21:02 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