[SOURCE] mrtzcmp3 Downloader

Iniciado por z3nth10n, 23 Octubre 2013, 21:01 PM

0 Miembros y 1 Visitante están viendo este tema.

z3nth10n

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 e instalar su plugin DownloadThemAll.

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

Interesados hablad por Discord.

Spiritdead5

#1
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


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

z3nth10n

#2
Bueno, pues... xD

Código (vbnet) [Seleccionar]
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 cases

CitarSelect 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

Interesados hablad por Discord.

Eleкtro

#3
La solución propuesta es fácilmente mejorable, muestro dos ejemplos.

Versión RegEx:
Código (vbnet) [Seleccionar]
#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:
Código (vbnet) [Seleccionar]
#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!








z3nth10n

#4
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...

Interesados hablad por Discord.

Eleкtro

#5
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.








z3nth10n

Y si no es mucho preguntar, como has procesado un millón de Strings? xD

Interesados hablad por Discord.

Eleкtro

#7
No me expresé corréctamente, quería decir que he procesado el mismo string un millón de veces.

Código (vbnet) [Seleccionar]

watch start
For x = 0 to 1000000
 URL_Decode(...)
next
watch end
mostrar resultados


Saludos








Spiritdead5

#8
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


Keyen Night

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.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...