elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: [AIO elhacker.NET 2015] Compilación herramientas análisis y desinfección malware


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 1083
81  Programación / .NET / Re: [SOURCE-CODE] FHM Crawler - freehardmusic.com en: 6 Abril 2018, 17:18
aquí compartí el código fuente documentado y mejorado:


Con respecto al falso positivo del AV... pues ni idea, pero es eso, un falso positivo.

Saludos!
82  Foros Generales / Foro Libre / Re: 5 mil millones de visitas... despacito... en: 6 Abril 2018, 00:27
83  Foros Generales / Foro Libre / Reflexión de medianoche: ¿es posible la reencarnación? en: 6 Abril 2018, 00:08
Quiero compartir con vosotros una reflexión personal que he tenido reciéntemente acerca de la espiritualidad, en particular acerca de la reencarnación... y que vosotros deis vuestra opinión sobre mi reflexión, o sobre el tema de la reencarnación en general, vaya.

Empecemos formulando la siguiente pregunta: ¿existe la reencarnación humana?. Bueno, quizás para determinar si existe la reencarnación primero debamos construir algunas bases lógicas y medianamente sólidas (a falta de pruebas observables ni reproducibles) con las que intentar analizar cuales son las posibilidades de que el "fenómeno" conocido como Reencarnación realmente se pueda llevar a cabo en un ser humano, entonces la pregunta cambiaría a ser: ¿es posible la reencarnación?, y mi conclusión es: NO

Antes se proseguir me gustaría aclarar un par de cosas, la primera es que no tengo creencias religiosas, no creo en un Dios anciano, barbudo y sentado en un trono en "el cielo", mientras ama y observa a los humanos, pero sin embargo si que creo firmemente en la existencia de un creador del universo al que no se si se le podría definir como una entidad inteligente, o como algo indefinible y no necesariamente atribuible al término de "entidad", y creo que cualquier persona puede comunicarse con ese creador a través de la voluntad del pensamiento (por voluntad me refiero a ejercer la intención de transmitirle tus pensamientos, otra cosa muy distinta ya sería ser respondidos o no serlo). Además de esto considero la posibilidad de que Jesús de Nazareth realmente haya existido, no lo creo ni lo dejo de creer, simplemente dejo abierta la posibilidad a falta de pruebas que puedan desmentir esta creencia tan popular entre la humanidad. Dudo hasta el punto de ser practicamente incrédulo hacia todo lo demás que esté relacionado con la religión (ángeles, demonios, cielo, infierno, etc) ya que son cosas imposibles de demostrar a ciencia cierta.
Lo segundo que quiero aclarar es que varios aspectos de mis creencias personales se basan en creencias espirituales, como por ejemplo la distinción entre cuerpo y alma, o el conocido fenómeno del viaje astral, aunque no por ello asumo ni doy por hecho que necesariamente tengan que ser fenómenos espirituales que la ciencia no pueda explicar algún día. y quien sabe si incluso reproducirlo por medios científicos

Bien, vamos con la conclusión de la que hablé al principio... ¿es posible la reencarnación?, no, al menos no en seres humanos, ¿y por qué no?, pues por la lógica de los números...
los números (la aritmética) siempre ha sido el mejor instrumento del que dispone la humanidad, capaz de demostrar "cualquier" cosa con la mayor de la exactitud que se ha conocido hasta la fecha... ya que todo en el universo "son números".

Considero que mi razón es muy simple y a su vez aplastantemente razonable, así que no debo andarme con más rodeos para explicar algo tan simple de entender: la reencarnación no es posible por que los números nos indican que en el hipotético caso de serlo, habrían más seres humanos que almas, o dicho de otro modo: habría cuerpos "vacíos", sin un alma reencarnada.

No es ningún misterio que la humanidad vive en una época de superpoblación, cada día aumenta en general la tasa de natalidad mundial, es por ello que en mi opinión la reencarnación no es un fenómeno posible en este mundo, ya que si aceptásemos que una persona al morir su alma "se eleva" para encarnarse en una nueva persona (en un feto apunto de nacer) entonces... ¿que ocurre con el resto de seres humanos que nacen al mismo tiempo, no hay reencarnación para ellos?, entonces que son, ¿robots con inteligencia artificial?.

Espero que se entienda lo que intento decir, pero por si acaso lo diré de otro modo: para que la reencarnación fuese posible, el número de reencarnaciones deberia ser igual al número de habitantes del planeta, cuando muere una persona nace otra y el alma se reencarnaría en esa nueva persona/vida, pero esto no es así, por cada persona que muere nacen 80 más, y no puede haber "personas sin alma" por lo tanto la reencarnación no es posible, no es real, no existe, o al menos estamos equivocados en el entendimiento de la misma.

Aparte de esta razón principal, muchos aspectos comunes de distintas filosofías que apoyan la creencia de la reencarnación siempre han sido muy convenientes, demasiado, hasta el punto en el que en mi opinión esas creencias deberían ser consideradas un insulto a la inteligencia, sin ir más lejos la afirmación de que si nosotros tenemos una vida de mierd@ si por ejemplo somos un individuo en estado vegetativo en la cama de un hospital pues no debemos sentir pena, debemos sonreir ya que hemos decidido reencarnar en esta persona vegetativa para sufrir, para que nos pasen estos males, en fin, "proceso evolutivo de consciencia" lo llaman algunos... creencia muy conveniente para gente que no sabe aceptar la realidad lo llamaría yo. No digo que no haya que sonreir e intentar disfrutar de lo que la vida nos ofrece aun en las peores circunstancias en las que nos podamos encontrar, pero llegando a esa conclusión por voluntad propia, no escudarse en la idea de que esto es lo que queremos que nos pase por que hemos reencarnado para sufrir... es absurdo.

Y vosotros, ¿qué pensais respecto a la reencarnación?, ¿estais de acuerdo con mi lógica?, ¿creeis que se me escapa algún detalle importante que a lo mejor he podido omitir?.

Saludos!
84  Foros Generales / Noticias / Re: Detenidos dos universitarios en Valencia por acceder al sistema informático ... en: 5 Abril 2018, 21:55
apropiarse de las claves (...) para cambiar sus notas.

arrestados como supuestos autores de los delitos de acceso ilícito a datos y programas informáticos, daños informáticos, descubrimiento y revelación de secretos, usurpación de estado civil y falsedad de documento público.

Di que si, ¡viva la justicia!, a dos chavales de 20 años que hackean un PC para robar contraseñas con la intención de cambiarse sus propias notas al final salen recibiendo acusaciones de doscientos delitos bastante graves por los que quien sabe si con suerte se quedará en una multa de unos cuantos miles de euros o por lo contrario llegarán a pasar algunos mesecitos en una celda, mientras que en el mundo real criminales de todo tipo siguen en la calle cometiendo hurtos, asesinatos, vendiendo drogas a menores y otro tipo de delitos, DELITOS REALES no comparables con entrar en un PC para cambiarte las notas, lo que debería considerarse un "delito menor" (y solo un delito, no doscientos delitos en uno mismo), pero a los delincuentes del mundo real si los arrestan no será por más de una noche en una celda y al día siguiente de vuelta para las calles...

Conclusión: la policia y la justicia hacen un gran servicio a esta comunidad, todo muy justo, competente, admirable, y muy normal.

Mierd@ de sociedad...
85  Foros Generales / Foro Libre / Re: Tiroteo en YouTube en: 5 Abril 2018, 19:11
El problema no es que tengan armas creo yo. Quitaselas y usarán ballestas, bates o a mordiscos. El problema es que han fomentado excesivamente la violencia, no hay mas

Asumir que el riesgo sin armas de fuego sería el mismo o parecido no justifica que sigan teniendo armas de fuego, además, ten en cuenta que las armas de fuego se utilizan por que permiten matar a distancia y con el menor de los esfuerzos (bueno, excepto por el esfuerzo de mantener rígida el arma para no darte un hostión en la cara por el retroceso), así que sin duda alguna prefiero que cada individuo estado unidense se pasee por la calle con uno o cinco bates en cada mano, que ya verías como la tasa de muertes descendería considerablemente por que las probabilidades de matar "eficientemente" se reducirían, ya que pegar con un bate implicaría un riesgo de acercamiento hacia la persona a la que quieres golpear, así que a muchos degenerados se les pasaría por la cabeza pegarle un "batazo" a alguien inocente, pero luego se acojonarían por si no lo consiguen, pero eso con una pistola no pasa, la pistola te da "poder", apuntas a tu víctima, aprietas el gatillo y si aciertas en algún punto crítico se muere... y sino, puedes vovlerlo a itentar todas las veces que te permita el cargador mientras la víctima sigue a varios metros bien lejos de ti... sin peligro para ti.

Las armas ayudan a que esa violencia de la que hablas vaya en crecimiento, es un círculo vicioso. La posesión de armas de fuego a estas alturas en este siglo es injustificable como tu bien pareciste querer decir por la mitad de tu comentario...

Saludos!
86  Foros Generales / Foro Libre / Re: Tiroteo en YouTube en: 5 Abril 2018, 18:17
1. Esto en un claro motivo más para seguir defendiendo la legalidad de las armas en EEUU, ¿a que si?. (no se si concretamente en California es legal o ilegal, pero me da exactamente igual.)

2. No me gusta hablar de los muertos, pero por lo visto esa mujer era un poco DESAGRADECIDA por que Youtube no es un trabajo como tal, aunque a algunos se lo parezca y aunque algunos se lo tomen como una forma de vida y abusen de ello hasta el punto en que digan que youtube es donde "trabajan", pero no lo es, Youtube es una plataforma gratuita que además de serlo te ofrece una recompensa o motivación en forma de dinero por subir tu contenido, así que menos quejas, que nadie le obligaba a esa mujer a hacer y subir videos, y aun así le pagaban por hacerlo siendo algo gratuito, pues creo que esa persona deberia poner una sonrisa en vez de ponerse a pegar tiros a la gente... es que es de ser descerebrado/a y muy desagradecido/a ya que a esa señora le estaban ofreciendo un servicio gratuito y además cobraba algo de dinero por usarlo, pero cuando le quitan ese dinero de gratis no se le ocurre otra cosa más sensata que reclamar un derecho el cual nunca le ha pertenecido, y ponerse a matr gente, venga por favor... esa mujer desde luego está mejor muerta si pensamos en la seguridad del resto de ciudadanos que tienen al menos dos neuronas en el cerebro...

Quizás podría sensibilizarme hasta cierto punto y tener en consideración el punto de desesperación de esa mujer que le llevó a disparar un arma, pero es que no, no puedo, ver a gente que actua así y por esos motivos tan injustificados es algo que me supera.

Y digo yo, toda esa gente que tiene 200 afiliados pero gana una absurda miseria de céntimos con servicios PTC y plafaromas piramidales del estilo... nunca he escuchado el caso de que nadie matara a los dueños de esos servicios por que le pagaban poco... es que es de lo más absurdo por Dios.

Esa es mi opiión. Saludos!
87  Programación / .NET / Re: Librería de Snippets para VB.Net !! (Compartan aquí sus snippets) en: 5 Abril 2018, 17:06
Obtener un valor aleatorio de tipo Single (float en C#), Double o Decimal dentro de un rango mínimo y máximo específico.



He implementado esta solución mediante un módulo de extensiones de método para la clase System.Random

La lista de miembros disponibles son los siguientes:

  • Random.NextSingle() As Single
  • Random.NextSingle(Single) As Single
  • Random.NextSingle(Single, Single) As Single
  • Random.NextDouble(Double) As Double
  • Random.NextDouble(Double, Double) As Double
  • Random.NextDecimal() As Decimal
  • Random.NextDecimal(Decimal) As Decimal
  • Random.NextDecimal(Decimal, Decimal) As Decimal

El código fuente:
Código
  1. #Region " Option Statements "
  2.  
  3. Option Strict On
  4. Option Explicit On
  5. Option Infer Off
  6.  
  7. #End Region
  8.  
  9. #Region " Imports "
  10.  
  11. Imports System.ComponentModel
  12. Imports System.Runtime.CompilerServices
  13.  
  14. #End Region
  15.  
  16. #Region " Random Extensions "
  17.  
  18. Namespace Extensions
  19.  
  20.    ''' ----------------------------------------------------------------------------------------------------
  21.    ''' <summary>
  22.    ''' Contains custom extension methods to use with the <see cref="Random"/> type.
  23.    ''' </summary>
  24.    ''' ----------------------------------------------------------------------------------------------------
  25.    <ImmutableObject(True)>
  26.    <HideModuleName>
  27.    Public Module RandomExtensions
  28.  
  29. #Region " Public Extension Methods "
  30.  
  31.        ''' ----------------------------------------------------------------------------------------------------
  32.        ''' <summary>
  33.        ''' Returns a non-negative <see cref="Single"/> value.
  34.        ''' </summary>
  35.        ''' ----------------------------------------------------------------------------------------------------
  36.        ''' <param name="sender">
  37.        ''' The source <see cref="Random"/>.
  38.        ''' </param>
  39.        ''' ----------------------------------------------------------------------------------------------------
  40.        ''' <returns>
  41.        ''' The resulting <see cref="Single"/> value.
  42.        ''' </returns>
  43.        ''' ----------------------------------------------------------------------------------------------------
  44.        <DebuggerStepThrough>
  45.        <Extension>
  46.        <EditorBrowsable(EditorBrowsableState.Always)>
  47.        Public Function NextSingle(ByVal sender As Random) As Single
  48.            Return CSng(sender.NextDouble())
  49.        End Function
  50.  
  51.        ''' ----------------------------------------------------------------------------------------------------
  52.        ''' <summary>
  53.        ''' Returns a non-negative <see cref="Single"/> value between zero and the maximum specified.
  54.        ''' </summary>
  55.        ''' ----------------------------------------------------------------------------------------------------
  56.        ''' <param name="sender">
  57.        ''' The source <see cref="Random"/>.
  58.        ''' </param>
  59.        '''
  60.        ''' <param name="maxValue">
  61.        ''' The maximum value.
  62.        ''' </param>
  63.        ''' ----------------------------------------------------------------------------------------------------
  64.        ''' <returns>
  65.        ''' The resulting <see cref="Single"/> value.
  66.        ''' </returns>
  67.        ''' ----------------------------------------------------------------------------------------------------
  68.        <DebuggerStepThrough>
  69.        <Extension>
  70.        <EditorBrowsable(EditorBrowsableState.Always)>
  71.        Public Function NextSingle(ByVal sender As Random, ByVal maxValue As Single) As Single
  72.            Return NextSingle(sender, 0.0F, maxValue)
  73.        End Function
  74.  
  75.        ''' ----------------------------------------------------------------------------------------------------
  76.        ''' <summary>
  77.        ''' Returns a non-negative <see cref="Single"/> value between the minimum and maximum specified.
  78.        ''' </summary>
  79.        ''' ----------------------------------------------------------------------------------------------------
  80.        ''' <param name="sender">
  81.        ''' The source <see cref="Random"/>.
  82.        ''' </param>
  83.        '''
  84.        ''' <param name="minValue">
  85.        ''' The minimum value.
  86.        ''' </param>
  87.        '''
  88.        ''' <param name="maxValue">
  89.        ''' The maximum value.
  90.        ''' </param>
  91.        ''' ----------------------------------------------------------------------------------------------------
  92.        ''' <returns>
  93.        ''' The resulting <see cref="Single"/> value.
  94.        ''' </returns>
  95.        ''' ----------------------------------------------------------------------------------------------------
  96.        <DebuggerStepThrough>
  97.        <Extension>
  98.        <EditorBrowsable(EditorBrowsableState.Always)>
  99.        Public Function NextSingle(ByVal sender As Random, ByVal minValue As Single, ByVal maxValue As Single) As Single
  100.            Return NextSingle(sender) * (maxValue - minValue) + minValue
  101.        End Function
  102.  
  103.        ''' ----------------------------------------------------------------------------------------------------
  104.        ''' <summary>
  105.        ''' Returns a non-negative <see cref="Double"/> value between zero and the maximum specified.
  106.        ''' </summary>
  107.        ''' ----------------------------------------------------------------------------------------------------
  108.        ''' <param name="sender">
  109.        ''' The source <see cref="Random"/>.
  110.        ''' </param>
  111.        '''
  112.        ''' <param name="maxValue">
  113.        ''' The maximum value.
  114.        ''' </param>
  115.        ''' ----------------------------------------------------------------------------------------------------
  116.        ''' <returns>
  117.        ''' The resulting <see cref="Double"/> value.
  118.        ''' </returns>
  119.        ''' ----------------------------------------------------------------------------------------------------
  120.        <DebuggerStepThrough>
  121.        <Extension>
  122.        <EditorBrowsable(EditorBrowsableState.Always)>
  123.        Public Function NextDouble(ByVal sender As Random, ByVal maxValue As Double) As Double
  124.            Return NextDouble(sender, 0.0R, maxValue)
  125.        End Function
  126.  
  127.        ''' ----------------------------------------------------------------------------------------------------
  128.        ''' <summary>
  129.        ''' Returns a non-negative <see cref="Double"/> value between the minimum and maximum specified.
  130.        ''' </summary>
  131.        ''' ----------------------------------------------------------------------------------------------------
  132.        ''' <param name="sender">
  133.        ''' The source <see cref="Random"/>.
  134.        ''' </param>
  135.        '''
  136.        ''' <param name="minValue">
  137.        ''' The minimum value.
  138.        ''' </param>
  139.        '''
  140.        ''' <param name="maxValue">
  141.        ''' The maximum value.
  142.        ''' </param>
  143.        ''' ----------------------------------------------------------------------------------------------------
  144.        ''' <returns>
  145.        ''' The resulting <see cref="Double"/> value.
  146.        ''' </returns>
  147.        ''' ----------------------------------------------------------------------------------------------------
  148.        <DebuggerStepThrough>
  149.        <Extension>
  150.        <EditorBrowsable(EditorBrowsableState.Always)>
  151.        Public Function NextDouble(ByVal sender As Random, ByVal minValue As Double, ByVal maxValue As Double) As Double
  152.            Return sender.NextDouble() * (maxValue - minValue) + minValue
  153.        End Function
  154.  
  155.        ''' ----------------------------------------------------------------------------------------------------
  156.        ''' <summary>
  157.        ''' Returns a non-negative <see cref="Decimal"/> value.
  158.        ''' </summary>
  159.        ''' ----------------------------------------------------------------------------------------------------
  160.        ''' <param name="sender">
  161.        ''' The source <see cref="Random"/>.
  162.        ''' </param>
  163.        ''' ----------------------------------------------------------------------------------------------------
  164.        ''' <returns>
  165.        ''' The resulting <see cref="Decimal"/> value.
  166.        ''' </returns>
  167.        ''' ----------------------------------------------------------------------------------------------------
  168.        <DebuggerStepThrough>
  169.        <Extension>
  170.        <EditorBrowsable(EditorBrowsableState.Always)>
  171.        Public Function NextDecimal(ByVal sender As Random) As Decimal
  172.            Return NextDecimal(sender, Decimal.MaxValue)
  173.        End Function
  174.  
  175.        ''' ----------------------------------------------------------------------------------------------------
  176.        ''' <summary>
  177.        ''' Returns a non-negative <see cref="Decimal"/> value between zero and the maximum specified.
  178.        ''' </summary>
  179.        ''' ----------------------------------------------------------------------------------------------------
  180.        ''' <param name="sender">
  181.        ''' The source <see cref="Random"/>.
  182.        ''' </param>
  183.        '''
  184.        ''' <param name="maxValue">
  185.        ''' The maximum value.
  186.        ''' </param>
  187.        ''' ----------------------------------------------------------------------------------------------------
  188.        ''' <returns>
  189.        ''' The resulting <see cref="Decimal"/> value.
  190.        ''' </returns>
  191.        ''' ----------------------------------------------------------------------------------------------------
  192.        <DebuggerStepThrough>
  193.        <Extension>
  194.        <EditorBrowsable(EditorBrowsableState.Always)>
  195.        Public Function NextDecimal(ByVal sender As Random, ByVal maxValue As Decimal) As Decimal
  196.            Return NextDecimal(sender, Decimal.Zero, maxValue)
  197.        End Function
  198.  
  199.        ''' ----------------------------------------------------------------------------------------------------
  200.        ''' <summary>
  201.        ''' Returns a non-negative <see cref="Decimal"/> value between the minimum and maximum specified.
  202.        ''' </summary>
  203.        ''' ----------------------------------------------------------------------------------------------------
  204.        ''' <param name="sender">
  205.        ''' The source <see cref="Random"/>.
  206.        ''' </param>
  207.        '''
  208.        ''' <param name="minValue">
  209.        ''' The minimum value.
  210.        ''' </param>
  211.        '''
  212.        ''' <param name="maxValue">
  213.        ''' The maximum value.
  214.        ''' </param>
  215.        ''' ----------------------------------------------------------------------------------------------------
  216.        ''' <returns>
  217.        ''' The resulting <see cref="Decimal"/> value.
  218.        ''' </returns>
  219.        ''' ----------------------------------------------------------------------------------------------------
  220.        <DebuggerStepThrough>
  221.        <Extension>
  222.        <EditorBrowsable(EditorBrowsableState.Always)>
  223.        Public Function NextDecimal(ByVal sender As Random, ByVal minValue As Decimal, ByVal maxValue As Decimal) As Decimal
  224.            Dim nextSample As Decimal = NextDecimalSample(sender)
  225.            Return maxValue * nextSample + minValue * (1 - nextSample)
  226.        End Function
  227.  
  228. #End Region
  229.  
  230. #Region " Private Methods "
  231.  
  232.        ''' ----------------------------------------------------------------------------------------------------
  233.        ''' <summary>
  234.        ''' Provides a random <see cref="Decimal"/> value
  235.        ''' in the range: [0.0000000000000000000000000000, 0.9999999999999999999999999999)
  236.        ''' with (theoretical) uniform and discrete distribution.
  237.        ''' </summary>
  238.        ''' ----------------------------------------------------------------------------------------------------
  239.        ''' <remarks>
  240.        ''' <see href="https://stackoverflow.com/a/28860710/1248295"/>
  241.        ''' </remarks>
  242.        ''' ----------------------------------------------------------------------------------------------------
  243.        ''' <param name="rng">
  244.        ''' The source <see cref="Random"/>.
  245.        ''' </param>
  246.        ''' ----------------------------------------------------------------------------------------------------
  247.        ''' <returns>
  248.        ''' The resulting <see cref="Decimal"/> value.
  249.        ''' </returns>
  250.        ''' ----------------------------------------------------------------------------------------------------
  251.        <DebuggerStepperBoundary>
  252.        Private Function NextDecimalSample(ByVal rng As Random) As Decimal
  253.            Dim sample As Decimal = 1D
  254.            ' After ~200 million tries this never took more than one attempt
  255.            ' but it Is possible To generate combinations Of a, b, and c
  256.            ' With the approach below resulting In a sample >= 1.
  257.            Do While (sample >= 1D)
  258.                Dim a As Integer = rng.Next(0, Integer.MaxValue)
  259.                Dim b As Integer = rng.Next(0, Integer.MaxValue)
  260.                Dim c As Integer = rng.Next(542101087) ' The high bits of 0.9999999999999999999999999999m are 542101086.
  261.                sample = New Decimal(a, b, c, False, 28)
  262.            Loop
  263.            Return sample
  264.        End Function
  265.  
  266. #End Region
  267.  
  268.    End Module
  269.  
  270. End Namespace
  271.  
  272. #End Region
88  Programación / .NET / Re: Librería de Snippets para VB.Net !! (Compartan aquí sus snippets) en: 5 Abril 2018, 01:37
Ejemplo de uso del FHM Crawler que compartí en este otro post: https://foro.elhacker.net/net/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg2158878#msg2158878

Código
  1. Imports FHM
  2.  
  3. Public Module Module1
  4.  
  5.    Private WithEvents FHMCrawler As New Crawler
  6.    Private mre As New ManualResetEvent(initialState:=False)
  7.  
  8.    Public Sub Main()
  9.        FHMCrawler.SearchQuery.Artist = "Paramore"
  10.  
  11.        Console.WriteLine("URL: {0}", FHMCrawler.SearchQuery.ToString())
  12.        Console.WriteLine()
  13.        Console.WriteLine("Retrieving Album count...")
  14.        Dim albumCount As Integer = FHMCrawler.GetAlbumCount()
  15.        Console.WriteLine("Album Count: {0}", albumCount)
  16.        Console.WriteLine()
  17.        Console.WriteLine("Begin crawling, please wait...")
  18.        Fetch()
  19.        mre.WaitOne()
  20.        Console.WriteLine("Done!. Press any key to exit...")
  21.        Console.ReadKey()
  22.    End Sub
  23.  
  24.    Public Async Sub Fetch()
  25.        Dim success As Boolean = Await FHMCrawler.FetchAlbumsAsync()
  26.        mre.Set()
  27.    End Sub
  28.  
  29.    <DebuggerStepperBoundary>
  30.    Private Sub FHMCrawler_BeginPageCrawl(ByVal sender As Object, e As PageCrawlBeginEventArgs) Handles FHMCrawler.PageCrawlBegin
  31.        Console.WriteLine("[+] Begin crawling page with index: {0}", e.SearchPage)
  32.        Console.WriteLine()
  33.    End Sub
  34.  
  35.    <DebuggerStepperBoundary>
  36.    Private Sub FHMCrawler_EndPageCrawl(ByVal sender As Object, e As PageCrawlEndEventArgs) Handles FHMCrawler.PageCrawlEnd
  37.        For Each albumInfo As AlbumInfo In e.Albums
  38.            Dim sb As New StringBuilder()
  39.            sb.AppendLine(String.Format("Artist Name.....: {0}", albumInfo.Artist))
  40.            sb.AppendLine(String.Format("Album Title.....: {0}", albumInfo.Title))
  41.            sb.AppendLine(String.Format("Album Year......: {0}", albumInfo.Year))
  42.            sb.AppendLine(String.Format("Album Country...: {0}", albumInfo.Country))
  43.            sb.AppendLine(String.Format("Album Genre.....: {0}", albumInfo.Genre))
  44.            sb.AppendLine(String.Format("Album Id........: {0}", albumInfo.Id))
  45.            sb.AppendLine(String.Format("Album Url.......: {0}", albumInfo.Uri.AbsoluteUri))
  46.            sb.AppendLine(String.Format("Download Link(s): {0}", String.Format("{{ {0} }}", String.Join(", ", albumInfo.DownloadLinks))))
  47.            Console.WriteLine(sb.ToString())
  48.        Next albumInfo
  49.        Console.WriteLine("[+] End crawling page with index: {0}", e.SearchPage)
  50.        Console.WriteLine()
  51.    End Sub
  52.  
  53. End Module

Output:
Citar

URL: http://freehardmusic.com/index.php?field_band=Paramore&field_country=all&field_genre=all&field_year=all&option=com_sobi2&search=Search&searchphrase=exact&sobi2Search=&sobi2Task=axSearch&SobiCatSelected_0=0&sobiCid=0&SobiSearchPage=0

Retrieving Album count...
Album Count: 13

Begin crawling, please wait...
  • Begin crawling page with index: 0

Artist Name.....: Paramore
Album Title.....: After Laughter
Album Year......: 2017
Album Country...: Unitedstates
Album Genre.....: Pop Rock
Album Id........: 750762
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=750762
Download Link(s): { https://mega.nz/#!cL5DjAyT!yUxVz9-L_E5qLgsUnlrQyu2TTkBjHFy3Qo4rthK6wso }

Artist Name.....: Paramore
Album Title.....: Ignorance (Single)
Album Year......: 2009
Album Country...: Unitedstates
Album Genre.....: Female Vocal, Punk-Rock
Album Id........: 706939
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=706939
Download Link(s): { http://www.mediafire.com/file/z4blihr29e08o9v/P_I-Single+14-12-16.rar }

Artist Name.....: Paramore
Album Title.....: Decode (Single)
Album Year......: 2008
Album Country...: Unitedstates
Album Genre.....: Emo, Punk-Rock
Album Id........: 706938
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=706938
Download Link(s): { http://www.mediafire.com/file/flmfffs94s6coc7/P_D-Single+14-12-16.rar }

Artist Name.....: Paramore
Album Title.....: Misery Business Ep
Album Year......: 2007
Album Country...: Unitedstates
Album Genre.....: Emo, Female Vocal, Punk-Rock
Album Id........: 706937
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=706937
Download Link(s): { http://www.mediafire.com/file/rbn99qf5vcypzmb/P_MB-EP+14-12-16.rar }

Artist Name.....: Paramore
Album Title.....: Hallelujah Ep
Album Year......: 2007
Album Country...: Unitedstates
Album Genre.....: Emo, Female Vocal, Punk-Rock
Album Id........: 706936
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=706936
Download Link(s): { http://www.mediafire.com/file/vzmjxy7dzbvz0wu/P_H-EP+14-12-16.rar }

Artist Name.....: Paramore
Album Title.....: Acoustic Ep [Unnoficial]
Album Year......: 2008
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 679494
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=679494
Download Link(s): { https://yadi.sk/d/t3uohja1iGahE }

Artist Name.....: Paramore
Album Title.....: The Summer Tic [Ep]
Album Year......: 2006
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 679493
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=679493
Download Link(s): { https://yadi.sk/d/hfBw4_6SiGZpz }

Artist Name.....: Paramore
Album Title.....: The Final Riot!
Album Year......: 2008
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 669959
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=669959
Download Link(s): { http://www.mediafire.com/download/9agyx5hwzha6qsi/PTFR.rar }

Artist Name.....: Paramore
Album Title.....: Brand New Eyes
Album Year......: 2009
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 669957
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=669957
Download Link(s): { http://www.mediafire.com/download/2151e2bj7qtjaki/PBNE.rar }

Artist Name.....: Paramore
Album Title.....: The Singles Club Ep
Album Year......: 2011
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 669955
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=669955
Download Link(s): { http://www.mediafire.com/download/b6q2c7nyxdca00n/PSC.rar }

  • End crawling page with index: 0
  • Begin crawling page with index: 1

Artist Name.....: Paramore
Album Title.....: Pararmore
Album Year......: 2013
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 669953
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=669953
Download Link(s): { http://www.mediafire.com/download/y11109qmik6icj4/PP.rar }

Artist Name.....: Paramore
Album Title.....: Riot!
Album Year......: 2007
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 669949
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=669949
Download Link(s): { http://www.mediafire.com/download/dyc03s9vokkogv7/PR.rar }

Artist Name.....: Paramore
Album Title.....: All We Know Is Falling
Album Year......: 2005
Album Country...: Unitedstates
Album Genre.....: Power Pop, Pop Rock, Punk-Rock
Album Id........: 669948
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=669948
Download Link(s): { http://www.mediafire.com/download/nsbiuigwij7y5tf/PAWKIF.rar }

  • End crawling page with index: 1

Done!. Press any key to exit...


Otro output addicional:
Código:
Search Params: field_band=h%c3%a9roes+del+silencio&field_country=all&field_genre=all&field_year=all

Uri: http://freehardmusic.com/index.php?field_band=h%C3%A9roes+del+silencio&field_country=all&field_genre=all&field_year=all&option=com_sobi2&search=Search&searchphrase=exact&sobi2Search=&sobi2Task=axSearch&SobiCatSelected_0=0&sobiCid=0&SobiSearchPage=0

Retrieving Album count...
Album Count: 21

Begin crawling, please wait...
[+] Begin crawling page with index: 0

Artist Name.....: Héroes Del Silencio
Album Title.....: The Platinum Collection (Compilation)
Album Year......: 2006
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 770138
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=770138
Download Link(s): { https://mega.nz/#!5yAE0ZpA!IFhADBkkKHgEN4Gghum-h9iKbQlH6N3owXymDokmF4Q }

Artist Name.....: Héroes Del Silencio
Album Title.....: Tesoro - Concert In Valencia 27Th October 2007 (Video)
Album Year......: 2008
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 770135
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=770135
Download Link(s): { https://mega.nz/#!834HAAiY!S7NDexqPxuPU6nEVv9PriekUi3MN3O2oBCtrTd2Nx8Y }

Artist Name.....: Héroes Del Silencio
Album Title.....: Senda '91 (Live)
Album Year......: 1991
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 770129
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=770129
Download Link(s): { https://mega.nz/#!8uAC1DIS!tctPPSySY6I2v7kteAahx6iKlDVs8R5WnrWvXUBtqaM }

Artist Name.....: Héroes Del Silencio
Album Title.....: En Directo
Album Year......: 1989
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 770127
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=770127
Download Link(s): { https://mega.nz/#!wnJwmYpD!XIFosoFfCar5UTAAjgORH0QHW8jm5ELRqZGK4UTNMfU }

Artist Name.....: Héroes Del Silencio
Album Title.....: Héroes Del Silencio (Compilation)
Album Year......: 1999
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 770126
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=770126
Download Link(s): { https://mega.nz/#!47R2jKqD!WmwbU3DvhVoBcZvf2IMPMATpAC_woGtKiBo_YzTp3eo }

Artist Name.....: Héroes Del Silencio
Album Title.....: Senderos De Traición (25Th Anniversary Edition)
Album Year......: 2015
Album Country...: Spain
Album Genre.....: Rock And Roll
Album Id........: 703496
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=703496
Download Link(s): { https://www.mediafire.com/?gwyzc4pvvhjdiax }

Artist Name.....: Héroes Del Silencio
Album Title.....: Volveremos (Compilation)
Album Year......: 2016
Album Country...: Spain
Album Genre.....: Rock And Roll
Album Id........: 703259
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=703259
Download Link(s): { http://www.mediafire.com/file/sh9pr3uvb86my6b/703259.rar }

Artist Name.....: Héroes Del Silencio
Album Title.....: El Espíritu Del Vino (20Th Anniversary Edition)
Album Year......: 2012
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 700503
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=700503
Download Link(s): { https://mega.nz/#!lgESxaJb!5K3YpWZ1Znq5EhZij9ltPd1GLaTaH_dSePXm5pCN6dg }

Artist Name.....: Héroes Del Silencio
Album Title.....: Antología Audiovisual (Compilation)
Album Year......: 2004
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 700490
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=700490
Download Link(s): { https://mega.nz/#!w8FUDQhb!COgXmh-uPayeSk5k1mpHrdIy5VziIIvTO7iaW0MfmTM }

Artist Name.....: Héroes Del Silencio
Album Title.....: Entre Dos Tierras (Ep)
Album Year......: 1992
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 700488
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=700488
Download Link(s): { https://mega.nz/#!7V1H3T4L!1q_o2lLp-b6Ky2p7P_minriRplYwUc8WRdSi7K24aes }

[+] End crawling page with index: 0

[+] Begin crawling page with index: 1

Artist Name.....: Héroes Del Silencio
Album Title.....: Héroes Del Silencio (Ep)
Album Year......: 1986
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 700487
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=700487
Download Link(s): { https://mega.nz/#!GNkTyZwA!0EXRDQwIpyG5BoVoY5zCnkonnAe3ZzFJmD4hwfmi-og, https://mega.nz/#!ljZ13RRK!u36qptAkX9XJN2LNKKZYTk25o-6kC4vgp1TXZ5wDRyo }

Artist Name.....: Heroés Del Silencio
Album Title.....: Live In Germany (Live)
Album Year......: 2011
Album Country...: Spain
Album Genre.....: Pop Rock, Alternative Rock
Album Id........: 691258
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=691258
Download Link(s): { https://mega.nz/#!84oxmBgB!q1x4NuAd79OUAyp4X7O5Da0b0KFwWwOoFNKqGGFQHW8 }

Artist Name.....: Héroes Del Silencio
Album Title.....: Canciones '84 - '96 (Compilation)
Album Year......: 2000
Album Country...: Spain
Album Genre.....: Classic Rock
Album Id........: 675749
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=675749
Download Link(s): { https://mega.nz/#!8uI0iBBD!3SFYXCJRse5ijwmC9TLgTtfhL8Jr__t3-qSI7IPurSI }

Artist Name.....: Héroes Del Silencio
Album Title.....: Tour 2007 (Live)
Album Year......: 2007
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 639726
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=639726
Download Link(s): { https://mega.co.nz/#!t81VUIxT!Y5qEQUR5C8wIA69pH4w90DWRCxN8dcKsCVSFmCT46P8 }

Artist Name.....: Héroes Del Silencio
Album Title.....: Rarezas (Compilation)
Album Year......: 1998
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 639724
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=639724
Download Link(s): { http://www.mediafire.com/download/v6oyrrh7un9o8t0/HDS98-R.gif, https://mega.co.nz/#!pgUlFC5Y!M3KOBFXZb5ZoN1TD-KRHOhl1mzIwm5WoQjqtsbncevk }

Artist Name.....: Héroes Del Silencio
Album Title.....: El Ruido Y La Furia (Live)
Album Year......: 2005
Album Country...: Spain
Album Genre.....: Rock And Roll, Hard Rock
Album Id........: 639723
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=639723
Download Link(s): { https://mega.co.nz/#!N1tgEIhA!FhSGL1xaktCN1HphZuOJFn5EmRhetkfS8bUpAB47KCY }

Artist Name.....: Héroes Del Silencio
Album Title.....: El Mar No Cesa
Album Year......: 1988
Album Country...: Spain
Album Genre.....: Pop Rock
Album Id........: 46543
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=46543
Download Link(s): { http://www.mediafire.com/?no7d4y5vp2btna6 }

Artist Name.....: Héroes Del Silencio
Album Title.....: Para Siempre (Live)
Album Year......: 1996
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 43036
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=43036
Download Link(s): { http://www.mediafire.com/?q73ip21df7qb19d }

Artist Name.....: Héroes Del Silencio
Album Title.....: Senderos De Traición
Album Year......: 1990
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 37296
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=37296
Download Link(s): { https://mega.co.nz/#!ok0UQIrB!bfQdCTtlLd4Rh7MIptTvfnPFDI9oBEd-ZvotzILoCFw }

Artist Name.....: Héroes Del Silencio
Album Title.....: Avalancha
Album Year......: 1995
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 37292
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=37292
Download Link(s): { https://mega.nz/#!Fc4zEaia!-5LYB3ueWHoZB890f34zsW_aTUTrsFQAwIvbpcZH4as }

[+] End crawling page with index: 1

[+] Begin crawling page with index: 2

Artist Name.....: Héroes Del Silencio
Album Title.....: El Espíritu Del Vino
Album Year......: 1993
Album Country...: Spain
Album Genre.....: Hard Rock
Album Id........: 37253
Album Url.......: http://freehardmusic.com/albums.html?sobi2Task=sobi2Details&catid=0&sobi2Id=37253
Download Link(s): { https://mega.nz/#!0ZxC2LiJ!D1Rl95lm9sgz9RGxEPSmGSrW8ZvzVH5VckbDOJ81GnA }

[+] End crawling page with index: 2

Done!. Press any key to exit...
89  Programación / .NET / Re: Librería de Snippets para VB.Net !! (Compartan aquí sus snippets) en: 5 Abril 2018, 01:34
Comparto el código fuente de FHM Crawler, mejorado y documentado... (bueno, me he visto obligado a simplificar y recortar la documentación por el límite de caracteres del foro)

Aquí el programa original:


Aquí el nuevo algoritmo reutilizable:

AlbumInfo.vb
Código
  1. #Region " Imports "
  2.  
  3. Imports System.Collections.ObjectModel
  4.  
  5. #End Region
  6.  
  7. Namespace FHM
  8.  
  9.    ''' <summary>Represents the information of an album crawled with <see cref="FHM.Crawler"/>.</summary>
  10.    Public NotInheritable Class AlbumInfo
  11.  
  12. #Region " Properties "
  13.  
  14.        ''' <summary>Gets the album identifier (that is used in the 'sobiid' and 'sobi2id' parameters).</summary>
  15.        Public ReadOnly Property Id As String
  16.  
  17.        ''' <summary>Gets the album <see cref="Uri"/>.</summary>
  18.        Public ReadOnly Property Uri As Uri
  19.  
  20.        ''' <summary>Gets the artist name.</summary>
  21.        Public ReadOnly Property Artist As String
  22.  
  23.        ''' <summary>Gets the album title.</summary>
  24.        Public ReadOnly Property Title As String
  25.  
  26.        ''' <summary>Gets the country of the band/artist.</summary>
  27.        Public ReadOnly Property Country As String
  28.  
  29.        ''' <summary>Gets the music genre.</summary>
  30.        Public ReadOnly Property Genre As String
  31.  
  32.        ''' <summary>Gets the year that the album has been released.</summary>
  33.        Public ReadOnly Property Year As Integer
  34.  
  35.        ''' <summary>Gets the urls to download the album. It can be a single url, or multiple of them.</summary>
  36.        Public ReadOnly Property DownloadLinks As ReadOnlyCollection(Of String)
  37.  
  38. #End Region
  39.  
  40. #Region " Constructors "
  41.  
  42.        Private Sub New()
  43.        End Sub
  44.  
  45.        ''' <summary>Initializes a new instance of the <see cref="AlbumInfo"/> class.</summary>
  46.        ''' <param name="id">The album identifier>.</param>
  47.        ''' <param name="uri">The album <see cref="Uri"/>.</param>
  48.        ''' <param name="artist">The artist name.</param>
  49.        ''' <param name="title">The album title.</param>
  50.        ''' <param name="country">The country of the band/artist.</param>
  51.        ''' <param name="genre">The music genre.</param>
  52.        ''' <param name="year">The year that the album has been released.</param>
  53.        ''' <param name="downloadLinks">The urls to download the album. It can be a single url, or multiple of them.</param>
  54.        Public Sub New(id As String, uri As Uri,
  55.                       artist As String, title As String,
  56.                       country As String, genre As String, year As Integer,
  57.                       downloadLinks As IEnumerable(Of String))
  58.  
  59.            Me.Id = id
  60.            Me.Uri = uri
  61.            Me.Artist = artist
  62.            Me.Title = title
  63.            Me.Country = country
  64.            Me.Genre = genre
  65.            Me.Year = year
  66.            Me.DownloadLinks = New ReadOnlyCollection(Of String)(downloadLinks)
  67.  
  68.        End Sub
  69.  
  70. #End Region
  71.  
  72.    End Class
  73.  
  74. End Namespace

SearchQuery.vb
Código
  1. #Region " Imports "
  2.  
  3. Imports System.Collections.Specialized
  4.  
  5. Imports ElektroKit.Core.Extensions.NameValueCollection
  6.  
  7. #End Region
  8.  
  9. Namespace FHM
  10.  
  11.    ''' <summary>Represents a search query of the http://freehardmusic.com/ website,
  12.    ''' that is managed by the <see cref="FHM.Crawler.FetchAlbums()"/>
  13.    ''' and <see cref="FHM.Crawler.FetchAlbumsAsync()"/> methods.
  14.    ''' <para></para>
  15.    ''' Note that a search query can be performed in two different ways:
  16.    ''' <para></para>
  17.    ''' 1. An artist-name based search (<see cref="SearchQuery.Artist"/>).
  18.    ''' <para></para>
  19.    ''' 2. A non-artist name based search. That is, a custom search based on country (<see cref="SearchQuery.Country"/>),
  20.    ''' genre (<see cref="SearchQuery.Genre"/>) or year criterias (<see cref="SearchQuery.Year"/>);
  21.    ''' this kind of search can combine the three mentioned criterias, but not the artist name (<see cref="SearchQuery.Artist"/>).
  22.    Public NotInheritable Class SearchQuery
  23.  
  24. #Region " Properties "
  25.  
  26.        ''' <summary>Gets or sets the artist name.</summary>
  27.        Public Property Artist As String
  28.            Get
  29.                Return Me.artistB
  30.            End Get
  31.            <DebuggerStepThrough>
  32.            Set(value As String)
  33.                If Not (Me.countryB.Equals("all", StringComparison.OrdinalIgnoreCase)) OrElse
  34.                   Not (Me.genreB.Equals("all", StringComparison.OrdinalIgnoreCase)) OrElse
  35.                   Not (Me.yearB.Equals("all", StringComparison.OrdinalIgnoreCase)) Then
  36.  
  37.                    Throw New ArgumentException("To perform an artist-name based search, you must set the value of Country, Genre and Year properties to ""all"" before setting the Artist property.", paramName:=NameOf(value))
  38.                End If
  39.                Me.artistB = value
  40.            End Set
  41.        End Property
  42.        Private artistB As String
  43.  
  44.        ''' <summary>Gets or sets the country of the band/artist.</summary>
  45.        Public Property Country As String
  46.            Get
  47.                Return Me.countryB
  48.            End Get
  49.            <DebuggerStepThrough>
  50.            Set(value As String)
  51.                If Not (value.Equals("all", StringComparison.OrdinalIgnoreCase)) AndAlso Not String.IsNullOrEmpty(Me.artistB) Then
  52.                    Throw New ArgumentException("To perform a country based search, you must set the value of Artist property to an empty string.", paramName:=NameOf(value))
  53.                End If
  54.                Me.countryB = value
  55.            End Set
  56.        End Property
  57.        Private countryB As String
  58.  
  59.        ''' <summary>Gets or sets the music genre.</summary>
  60.        Public Property Genre As String
  61.            Get
  62.                Return Me.genreB
  63.            End Get
  64.            <DebuggerStepThrough>
  65.            Set(value As String)
  66.                If Not (value.Equals("all", StringComparison.OrdinalIgnoreCase)) AndAlso Not String.IsNullOrEmpty(Me.artistB) Then
  67.                    Throw New ArgumentException("To perform a genre based search, you must set the value of Artist property to an empty string.", paramName:=NameOf(value))
  68.                End If
  69.                Me.genreB = value
  70.            End Set
  71.        End Property
  72.        Private genreB As String
  73.  
  74.        ''' <summary>Gets or sets the year that the album has been released.</summary>
  75.        Public Property Year As String
  76.            Get
  77.                Return Me.yearB
  78.            End Get
  79.            <DebuggerStepThrough>
  80.            Set(value As String)
  81.                If Not (value.Equals("all", StringComparison.OrdinalIgnoreCase)) AndAlso Not String.IsNullOrEmpty(Me.artistB) Then
  82.                    Throw New ArgumentException("To perform a year based search, you must set the value of Artist property to an empty string.", paramName:=NameOf(value))
  83.                End If
  84.                Me.yearB = value
  85.            End Set
  86.        End Property
  87.        Private yearB As String
  88.  
  89.        ''' <summary>Gets the <see cref="Uri"/> that represents this search query.</summary>
  90.        Public ReadOnly Property Uri As Uri
  91.            Get
  92.                Return Me.Uri(searchPage:=0)
  93.            End Get
  94.        End Property
  95.  
  96.        ''' <summary>Gets the <see cref="Uri"/> that represents this search query.</summary>
  97.        ''' <param name="searchPage">The index of the search page parameter.</param>
  98.        Public ReadOnly Property Uri(searchPage As Integer) As Uri
  99.            Get
  100.                Return New Uri(Me.ToString(searchPage), UriKind.Absolute)
  101.            End Get
  102.        End Property
  103.  
  104. #End Region
  105.  
  106. #Region " Constructors "
  107.  
  108.        Private Sub New()
  109.        End Sub
  110.  
  111.        ''' <summary>Initializes a new instance of the <see cref="SearchQuery"/> class.</summary>
  112.        ''' <param name="artist">The artist name.</param>
  113.        Public Sub New(artist As String)
  114.            Me.artistB = artist
  115.            Me.genreB = "all"
  116.            Me.countryB = "all"
  117.            Me.yearB = "all"
  118.        End Sub
  119.  
  120.        ''' <summary>Initializes a new instance of the <see cref="SearchQuery"/> class.</summary>
  121.        ''' <param name="genre">The music genre. Default value is: "all"</param>
  122.        ''' <param name="country">The country of the band/artist. Default value is: "all"</param>
  123.        ''' <param name="year">The year that the album has been released. Default value is: "all"</param>
  124.        Public Sub New(Optional genre As String = "all",
  125.                       Optional country As String = "all",
  126.                       Optional year As String = "all")
  127.  
  128.            Me.artistB = ""
  129.            Me.genreB = genre
  130.            Me.countryB = country
  131.            Me.yearB = year
  132.        End Sub
  133.  
  134. #End Region
  135.  
  136. #Region " Public Methods "
  137.  
  138.        ''' <summary>Resets the current search query to its default values.</summary>
  139.        <DebuggerStepThrough>
  140.        Public Sub Reset()
  141.            Me.Artist = ""
  142.            Me.Country = "all"
  143.            Me.Genre = "all"
  144.            Me.Year = "all"
  145.        End Sub
  146.  
  147.        ''' <summary>Returns a <see cref="String"/> that represents the search query.</summary>
  148.        ''' <returns>A <see cref="String"/> that represents the search query.</returns>
  149.        Public Overrides Function ToString() As String
  150.            Return Me.ToString(searchPage:=0)
  151.        End Function
  152.  
  153.        ''' <summary>Returns a <see cref="String"/> that represents the search query.</summary>
  154.        ''' <param name="searchPage">The index of the search page parameter.</param>
  155.        ''' <returns>A <see cref="String"/> that represents the search query.</returns>
  156.        Public Overloads Function ToString(searchPage As Integer) As String
  157.  
  158.            If (searchPage < 0) Then
  159.                Throw New ArgumentException("Positive integer value is required.", paramName:=NameOf(searchPage))
  160.            End If
  161.  
  162.            Dim params As New NameValueCollection From {
  163.                {"field_band", Me.Artist},
  164.                {"field_country", Me.Country},
  165.                {"field_genre", Me.Genre},
  166.                {"field_year", Me.Year},
  167.                {"option", "com_sobi2"},
  168.                {"search", "Search"},
  169.                {"searchphrase", "exact"},
  170.                {"sobi2Search", ""},
  171.                {"sobi2Task", "axSearch"},
  172.                {"SobiCatSelected_0", "0"},
  173.                {"sobiCid", "0"},
  174.                {"SobiSearchPage", searchPage}
  175.            }
  176.  
  177.            Return params.ToQueryString(New Uri("http://freehardmusic.com/index.php"))
  178.  
  179.        End Function
  180.  
  181. #End Region
  182.  
  183.    End Class
  184.  
  185. End Namespace

PageCrawlBeginEventArgs.vb
Código
  1. Namespace FHM
  2.  
  3.    ''' <summary>Represents the event data of the <see cref="FHM.Crawler.PageCrawlBegin"/> event.</summary>
  4.    Public NotInheritable Class PageCrawlBeginEventArgs : Inherits EventArgs
  5.  
  6. #Region " Properties "
  7.  
  8.        ''' <summary>Gets the search query used.</summary>
  9.        Public ReadOnly Property SearchQuery As SearchQuery
  10.  
  11.        ''' <summary>Gets the index of the search page being crawled.</summary>
  12.        Public ReadOnly Property SearchPage As Integer
  13.  
  14. #End Region
  15.  
  16. #Region " Constructors "
  17.  
  18.        Private Sub New()
  19.        End Sub
  20.  
  21.        ''' <summary>Initializes a new instance of the <see cref="PageCrawlBeginEventArgs"/> class.</summary>
  22.        ''' <param name="searchQuery">The search query used.</param>
  23.        ''' <param name="searchPage">The index of the search page.</param>
  24.        Public Sub New(searchQuery As SearchQuery, searchPage As Integer)
  25.            Me.SearchQuery = searchQuery
  26.            Me.SearchPage = searchPage
  27.        End Sub
  28.  
  29. #End Region
  30.  
  31.    End Class
  32.  
  33. End Namespace

PageCrawlEndEventArgs.vb
Código
  1. Namespace FHM
  2.  
  3.    ''' <summary>Represents the event data of the <see cref="FHM.Crawler.PageCrawlEnd"/> event.</summary>
  4.    Public NotInheritable Class PageCrawlEndEventArgs : Inherits EventArgs
  5.  
  6. #Region " Properties "
  7.  
  8.        ''' <summary>Gets the search query used.</summary>
  9.        Public ReadOnly Property SearchQuery As SearchQuery
  10.  
  11.        ''' <summary>Gets the index of the search page crawled.</summary>
  12.        Public ReadOnly Property SearchPage As Integer
  13.  
  14.        ''' <summary>Gets a collection of <see cref="AlbumInfo"/> that contains the information of the albums that were crawled.</summary>
  15.        Public ReadOnly Property Albums As ReadOnlyCollection(Of AlbumInfo)
  16.  
  17. #End Region
  18.  
  19. #Region " Constructors "
  20.  
  21.        Private Sub New()
  22.        End Sub
  23.  
  24.        ''' <summary>Initializes a new instance of the <see cref="PageCrawlEndEventArgs"/> class.</summary>
  25.        ''' <param name="searchQuery">The search query used.</param>
  26.        ''' <param name="searchPage">The index of the search page crawled.</param>
  27.        ''' <param name="albums">A collection of <see cref="AlbumInfo"/> that contains the information of the albums that were crawled.</param>
  28.        Public Sub New(searchQuery As SearchQuery, searchPage As Integer, albums As ICollection(Of AlbumInfo))
  29.            Me.SearchQuery = searchQuery
  30.            Me.SearchPage = searchPage
  31.            Me.Albums = New ReadOnlyCollection(Of AlbumInfo)(albums)
  32.        End Sub
  33.  
  34. #End Region
  35.  
  36.    End Class
  37.  
  38. End Namespace

Crawler.vb
Código
  1. #Region " Imports "
  2.  
  3. Imports System.Collections.Specialized
  4. Imports System.Text.RegularExpressions
  5.  
  6. Imports HtmlDocument = HtmlAgilityPack.HtmlDocument
  7. Imports HtmlNode = HtmlAgilityPack.HtmlNode
  8. Imports HtmlNodeCollection = HtmlAgilityPack.HtmlNodeCollection
  9.  
  10. Imports ElektroKit.Core.Extensions.NameValueCollection
  11.  
  12. #End Region
  13.  
  14. Namespace FHM
  15.  
  16.    ''' <summary>A crawler that searchs and collect albums (its download links) from the http://freehardmusic.com/ website.</summary>
  17.    Public Class Crawler : Implements IDisposable
  18.  
  19. #Region " Private Fields "
  20.  
  21.        ''' <summary>The <see cref="Uri"/> that points to "http://freehardmusic.com/".</summary>
  22.        Protected ReadOnly uriBase As New Uri("http://freehardmusic.com/")
  23.  
  24.        ''' <summary>The <see cref="Uri"/> that points to "http://freehardmusic.com/index2.php".</summary>
  25.        Protected ReadOnly uriIndex As New Uri(Me.uriBase, "/index2.php")
  26.  
  27.        ''' <summary>Flag that determines whether this <see cref="Crawler"/> is busy in a pending fetch operation.</summary>
  28.        Protected isFetching As Boolean
  29.  
  30.        ''' <summary>The <see cref="CancellationToken"/> instance that cancels a pending fetch operation
  31.        ''' started by a call of <see cref="Crawler.FetchAlbumsAsync()"/>.</summary>
  32.        Protected cancelToken As CancellationToken
  33.  
  34.        ''' <summary>The <see cref="CancellationTokenSource"/> instance that signals to <see cref="Crawler.cancelToken"/>.</summary>
  35.        Protected cancelTokenSrc As CancellationTokenSource
  36.  
  37. #End Region
  38.  
  39. #Region " Properties "
  40.  
  41.        ''' <summary>Gets the search query.</summary>
  42.        Public ReadOnly Property SearchQuery As SearchQuery
  43.  
  44. #End Region
  45.  
  46. #Region " Events "
  47.  
  48.        ''' <summary>Occurs when a page is about to be crawled.</summary>
  49.        Public Event PageCrawlBegin As EventHandler(Of PageCrawlBeginEventArgs)
  50.  
  51.        ''' <summary>Occurs when a page is crawled.</summary>
  52.        Public Event PageCrawlEnd As EventHandler(Of PageCrawlEndEventArgs)
  53.  
  54. #End Region
  55.  
  56. #Region " Constructors "
  57.  
  58.        ''' <summary>Initializes a new instance of the <see cref="Crawler"/> class.</summary>
  59.        Public Sub New()
  60.            Me.SearchQuery = New SearchQuery()
  61.            Me.cancelTokenSrc = New CancellationTokenSource()
  62.            Me.cancelToken = Me.cancelTokenSrc.Token
  63.        End Sub
  64.  
  65. #End Region
  66.  
  67. #Region " Public Methods "
  68.  
  69.        ''' <summary>Gets the count of the albums found using the current search query.</summary>
  70.        ''' <returns>The count of the albums found using the current search query.</returns>
  71.        <DebuggerStepThrough>
  72.        Public Overridable Function GetAlbumCount() As Integer
  73.            Dim t As Task(Of Integer) = Task.Run(Of Integer)(AddressOf Me.GetAlbumCountAsync)
  74.            t.Wait()
  75.  
  76.            Return t.Result
  77.        End Function
  78.  
  79.        ''' <summary>Asynchronously gets the count of the albums found using the current search query.</summary>
  80.        ''' <returns>The count of the albums found using the current search query.</returns>
  81.        <DebuggerStepThrough>
  82.        Public Overridable Async Function GetAlbumCountAsync() As Task(Of Integer)
  83.            Dim query As String = Me.SearchQuery.ToString(searchPage:=0)
  84.            Dim uriSearch As New Uri(query)
  85.            Dim htmlSourceCode As String = String.Empty
  86.            Using wc As New WebClient
  87.                htmlSourceCode = Await wc.DownloadStringTaskAsync(uriSearch)
  88.            End Using
  89.  
  90.            Dim htmldoc As New HtmlDocument
  91.            htmldoc.LoadHtml(htmlSourceCode)
  92.  
  93.            Dim xPathResultString As String = "//div[@id='mainbody']/table[1]/tr[2]/td"
  94.  
  95.            Dim node As HtmlNode = htmldoc.DocumentNode.SelectSingleNode(xPathResultString)
  96.  
  97.            Dim text As String = node.InnerText
  98.            text = Regex.Replace(text, "\n", "", RegexOptions.None)    ' Remove new lines.
  99.            text = Regex.Replace(text, "\t", " "c, RegexOptions.None)  ' Replace tabs for white-spaces.
  100.            text = Regex.Replace(text, "\s+", " "c, RegexOptions.None) ' Replace duplicated white-spaces.
  101.  
  102.            Dim albumCount As Integer = CInt(Regex.Match(text, "\d+", RegexOptions.None).Value)
  103.            Return albumCount
  104.        End Function
  105.  
  106.        ''' <summary>Fetch any album found using the current search query.</summary>
  107.        <DebuggerStepThrough>
  108.        Public Overridable Sub FetchAlbums()
  109.            Dim t As Task = Task.Run(AddressOf Me.FetchAlbumsAsync)
  110.            t.Wait()
  111.        End Sub
  112.  
  113.        ''' <summary>Asynchronously fetch any album found using the current search query.</summary>
  114.        ''' <returns>Returns <see langword="False"/> if the fetch operation was canceled by a call to
  115.        ''' <see cref="Crawler.CancelFetchAlbumsAsync()"/> method.</returns>
  116.        <DebuggerStepThrough>
  117.        Public Overridable Async Function FetchAlbumsAsync() As Task(Of Boolean)
  118.            If (Me.isFetching) Then
  119.                Throw New Exception("Another fetch operation is already running in background.")
  120.            End If
  121.            Me.isFetching = True
  122.  
  123.            Me.cancelTokenSrc.Dispose()
  124.            Me.cancelTokenSrc = New CancellationTokenSource()
  125.            Me.cancelToken = Me.cancelTokenSrc.Token
  126.  
  127.            Dim albumCount As Integer = Await Me.GetAlbumCountAsync()
  128.            If (albumCount = 0) Then
  129.                Me.isFetching = False
  130.                Return True
  131.            End If
  132.  
  133.            Dim maxPages As Integer = ((albumCount \ 10) + 1) ' 10 albums per page.
  134.            For i As Integer = 0 To (maxPages - 1)
  135.                Dim query As String = Me.SearchQuery.ToString(searchPage:=i)
  136.                Dim uriSearch As New Uri(query)
  137.                Dim htmlSourceCode As String = String.Empty
  138.                Using wc As New WebClient
  139.                    htmlSourceCode = Await wc.DownloadStringTaskAsync(uriSearch)
  140.                End Using
  141.  
  142.                If (Me.cancelToken.IsCancellationRequested) Then
  143.                    Me.isFetching = False
  144.                    Return False
  145.                End If
  146.  
  147.                Me.OnPageCrawlBegin(New PageCrawlBeginEventArgs(Me.SearchQuery, i))
  148.                Await Me.ParseHtmlSourceCode(i, htmlSourceCode)
  149.            Next i
  150.  
  151.            Me.isFetching = False
  152.            Return True
  153.        End Function
  154.  
  155.        ''' <summary>Aborts a pending fetch operation started by a call to <see cref="Crawler.FetchAlbumsAsync()"/> function.</summary>
  156.        <DebuggerStepThrough>
  157.        Public Sub CancelFetchAlbumsAsync()
  158.            If Not (Me.isFetching) Then
  159.                Throw New Exception("No fetch operation is running.")
  160.            End If
  161.  
  162.            If (Me.cancelToken.IsCancellationRequested) Then
  163.                ' Handle redundant cancellation calls to CancelFetchAlbums()...
  164.                Me.cancelToken.ThrowIfCancellationRequested()
  165.            End If
  166.  
  167.            Me.cancelTokenSrc.Cancel()
  168.        End Sub
  169.  
  170.        ''' <summary>Resets the current search query (<see cref="Crawler.SearchQuery"/>) to its default values.</summary>
  171.        <DebuggerStepThrough>
  172.        Public Sub ResetSearchQuery()
  173.            Me.SearchQuery.Reset()
  174.        End Sub
  175.  
  176. #End Region
  177.  
  178. #Region " Event-Invocators "
  179.  
  180.        ''' <summary>Raises the <see cref="Crawler.PageCrawlBegin"/> event.</summary>
  181.        ''' <param name="e">The <see cref="PageCrawlBeginEventArgs"/> instance containing the event data.</param>
  182.        Protected Overridable Sub OnPageCrawlBegin(e As PageCrawlBeginEventArgs)
  183.            If (Me.PageCrawlBeginEvent IsNot Nothing) Then
  184.                RaiseEvent PageCrawlBegin(Me, e)
  185.            End If
  186.        End Sub
  187.  
  188.        ''' <summary>Raises the <see cref="Crawler.PageCrawlEnd"/> event.</summary>
  189.        ''' <param name="e">The <see cref="PageCrawlBeginEventArgs"/> instance containing the event data.</param>
  190.        Protected Overridable Sub OnPageCrawlEnd(e As PageCrawlEndEventArgs)
  191.            If (Me.PageCrawlEndEvent IsNot Nothing) Then
  192.                RaiseEvent PageCrawlEnd(Me, e)
  193.            End If
  194.        End Sub
  195.  
  196. #End Region
  197.  
  198. #Region " Private Methods "
  199.  
  200.        ''' <summary>Parses the html source code to crawl the albums.</summary>
  201.        ''' <param name="searchPage">The index of the search page.</param>
  202.        ''' <param name="htmlSourceCode">The html source code to parse.</param>
  203.        ''' <returns>Returns <see langword="True"/> if the operation succed; otherwise, <see langword="False"/>.</returns>
  204.        <DebuggerStepperBoundary>
  205.        Private Async Function ParseHtmlSourceCode(searchPage As Integer, htmlSourceCode As String) As Task(Of Boolean)
  206.  
  207.            Dim albums As New Collection(Of AlbumInfo)
  208.  
  209.            Dim xPathTable As String = "//table[@class='vicard']"
  210.            Dim xPathArtist As String = ".//tr/td/span[@class='sobi2Listing_field_band']"
  211.            Dim xPathCountry As String = ".//table[@class='vicard2']/tr/td[@class='goods']/table[@class='goods']/tr/td/img"
  212.            Dim xPathGenre As String = ".//tr[3]/td/table/tr/td[2]/table/tr/td"
  213.            Dim xPathYear As String = ".//tr/td/span[@class='sobi2Listing_field_year']"
  214.            Dim xPathTitle As String = ".//tr/td/p[@class='sobi2ItemTitle']/a[@title]"
  215.            Dim xPathUrl As String = ".//table[@class='vicard2']/tr/td/a[@href]"
  216.  
  217.            Dim htmldoc As New HtmlDocument
  218.            Try
  219.              htmldoc.LoadHtml(htmlSourceCode)
  220.            Catch ex As Exception
  221.                Return False
  222.            End Try
  223.  
  224.            Dim nodes As HtmlNodeCollection = htmldoc.DocumentNode.SelectNodes(xPathTable)
  225.            If (nodes.Count = 0) Then
  226.                Return False
  227.            End If
  228.  
  229.            For Each node As HtmlNode In nodes
  230.                Dim artist As String
  231.                Dim title As String
  232.                Dim country As String
  233.                Dim genre As String
  234.                Dim year As String
  235.  
  236.                Dim albumId As String
  237.                Dim albumUrl As String
  238.  
  239.                Try
  240.                    artist = node.SelectSingleNode(xPathArtist).InnerText
  241.                    artist = Encoding.UTF8.GetString(Encoding.Default.GetBytes(artist))
  242.                    artist = HttpUtility.HtmlDecode(artist)
  243.                    artist = New CultureInfo("en-US").TextInfo.ToTitleCase(artist.Trim(" "c).ToLower())
  244.                Catch ex As Exception
  245.                    artist = "unknown"
  246.                End Try
  247.  
  248.                Try
  249.                    title = node.SelectSingleNode(xPathTitle).GetAttributeValue("title", "")
  250.                    title = Encoding.UTF8.GetString(Encoding.Default.GetBytes(title))
  251.                    title = HttpUtility.HtmlDecode(title)
  252.                    title = New CultureInfo("en-US").TextInfo.ToTitleCase(title.Trim(" "c).ToLower())
  253.                Catch ex As Exception
  254.                    title = "unknown"
  255.                End Try
  256.  
  257.                Try
  258.                    country = node.SelectSingleNode(xPathCountry).GetAttributeValue("src", "unknown")
  259.                    country = Path.GetFileNameWithoutExtension(country)
  260.                    country = New CultureInfo("en-US").TextInfo.ToTitleCase(country.ToLower())
  261.                Catch ex As Exception
  262.                    country = "unknown"
  263.                End Try
  264.  
  265.                Try
  266.                    genre = node.SelectSingleNode(xPathGenre).InnerText
  267.                    genre = Regex.Replace(genre, "\n", "", RegexOptions.None)    ' Remove new lines.
  268.                    genre = Regex.Replace(genre, "\t", " "c, RegexOptions.None)  ' Replace tabs for white-spaces.
  269.                    genre = Regex.Replace(genre, "\s+", " "c, RegexOptions.None) ' Replace duplicated white-spaces.
  270.                    genre = New CultureInfo("en-US").TextInfo.ToTitleCase(genre.Trim(" "c).ToLower())
  271.                Catch ex As Exception
  272.                    genre = "unknown"
  273.                End Try
  274.  
  275.                Try
  276.                    year = node.SelectSingleNode(xPathYear).InnerText.Trim(" "c)
  277.                Catch ex As Exception
  278.                    year = "unknown"
  279.                End Try
  280.  
  281.                Try
  282.                    albumUrl = node.SelectSingleNode(xPathUrl).GetAttributeValue("href", "").Trim(" "c)
  283.                    albumUrl = HttpUtility.HtmlDecode(albumUrl)
  284.                Catch ex As Exception
  285.                    Continue For
  286.                End Try
  287.  
  288.                albumId = HttpUtility.ParseQueryString(New Uri(albumUrl).Query)("sobi2Id")
  289.  
  290.                Dim downloadUrlParams As New NameValueCollection From {
  291.                    {"sobiid", albumId},
  292.                    {"sobi2Task", "addSRev"},
  293.                    {"no_html", "1"},
  294.                    {"option", "com_sobi2"},
  295.                    {"rvote", "1"}
  296.                }
  297.  
  298.                Dim downloadLinks As List(Of String)
  299.                Try
  300.                    Using wc As New WebClient()
  301.                        htmlSourceCode = Await wc.DownloadStringTaskAsync(New Uri(downloadUrlParams.ToQueryString(Me.uriIndex)))
  302.                    End Using
  303.  
  304.                    Dim xDoc As XDocument = XDocument.Parse(htmlSourceCode)
  305.                    Dim elements As IEnumerable(Of XElement) = xDoc.<rev>
  306.                    downloadLinks = New List(Of String) From {
  307.                        elements.<msg>.Value,
  308.                        elements.<msg2>.Value,
  309.                        elements.<msg3>.Value,
  310.                        elements.<msg4>.Value,
  311.                        elements.<msg5>.Value,
  312.                        elements.<msg6>.Value,
  313.                        elements.<msg7>.Value,
  314.                        elements.<msg8>.Value,
  315.                        elements.<msg9>.Value,
  316.                        elements.<msg10>.Value,
  317.                        elements.<msg11>.Value,
  318.                        elements.<msg12>.Value,
  319.                        elements.<msg13>.Value
  320.                    }
  321.                Catch ex As Exception
  322.                    Continue For
  323.                End Try
  324.  
  325.                downloadLinks = (From item As String In downloadLinks
  326.                                 Where Not String.IsNullOrWhiteSpace(item)
  327.                                 Select item.TrimEnd(" "c)
  328.                                ).ToList()
  329.  
  330.                Dim albumInfo As New AlbumInfo(albumId, New Uri(albumUrl, UriKind.Absolute),
  331.                                               artist, title, country, genre, year,
  332.                                               downloadLinks)
  333.  
  334.                albums.Add(albumInfo)
  335.            Next node
  336.  
  337.            Me.OnPageCrawlEnd(New PageCrawlEndEventArgs(Me.SearchQuery, searchPage, albums))
  338.            Return True
  339.        End Function
  340.  
  341. #End Region
  342.  
  343. #Region " IDisposable Implementation "
  344.  
  345.        ''' <summary>Flag to detect redundant calls when disposing.</summary>
  346.        Private isDisposed As Boolean = False
  347.  
  348.        ''' <summary>Releases all the resources used by this <see cref="Crawler"/>.</summary>
  349.        <DebuggerStepThrough>
  350.        Public Sub Dispose() Implements IDisposable.Dispose
  351.            Me.Dispose(isDisposing:=True)
  352.            GC.SuppressFinalize(obj:=Me)
  353.        End Sub
  354.  
  355.        ''' <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
  356.        ''' <param name="isDisposing"><see langword="True"/> to release both managed and unmanaged resources;
  357.        ''' <see langword="False"/> to release only unmanaged resources.</param>
  358.        <DebuggerStepThrough>
  359.        Protected Overridable Sub Dispose(isDisposing As Boolean)
  360.            If (Not Me.isDisposed) AndAlso (isDisposing) Then
  361.                If (Me.cancelTokenSrc IsNot Nothing) Then
  362.                    Me.cancelTokenSrc.Dispose()
  363.                    Me.cancelTokenSrc = Nothing
  364.                End If
  365.                Me.cancelToken = Nothing
  366.                Me.isFetching = False
  367.                Me.ResetSearchQuery()
  368.            End If
  369.  
  370.            Me.isDisposed = True
  371.        End Sub
  372.  
  373. #End Region
  374.  
  375.    End Class
  376.  
  377. End Namespace

NameValueCollectionExtensions.vb
90  Programación / .NET / Re: Cerrar "Carpetas" en C# en: 4 Abril 2018, 13:05
Lo que comentas es normal y obvio; la función Process.GetProcesses() como su nombre indica por si mismo tiene el propósito de devolver una colección de procesos en ejecución, no una colección de ventanas creadas por "X" proceso...

Aquí abajo te comparto un código de mi librería comercial ElektroKit para obtener las ventanas abiertas del explorador de Windows:

Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Gets a <see cref="IEnumerable(Of ShellBrowserWindow)"/> containing the opened windows explorer instances.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <returns>
  7. ''' A <see cref="IEnumerable(Of ShellBrowserWindow)"/> containing the opened windows explorer instances.
  8. ''' </returns>
  9. ''' ----------------------------------------------------------------------------------------------------
  10. <DebuggerStepThrough>
  11. Public Shared Iterator Function GetExplorerWindows() As IEnumerable(Of ShellBrowserWindow)
  12.  
  13.    Dim shell As New Shell32.Shell
  14.  
  15.    Try
  16.        For Each window As ShellBrowserWindow In DirectCast(shell.Windows, IShellWindows)
  17.  
  18.            Select Case window.Document.GetType().Name
  19.  
  20.                Case "__ComObject" ' Explorer Window. ShellWindowTypeConstants.SWC_EXPLORER
  21.                    Yield window
  22.  
  23.               ' Case "HTMLDocumentClass" ' Internet Explorer Window. ShellWindowTypeConstants.SWC_BROWSER
  24.               '     ' Do Nothing.
  25.  
  26.                Case Else ' Other type of window.
  27.                    ' Do Nothing.
  28.  
  29.            End Select
  30.  
  31.        Next window
  32.  
  33.    Catch ex As Exception
  34.        Throw ex
  35.  
  36.    Finally
  37.        Marshal.FinalReleaseComObject(shell)
  38.  
  39.    End Try
  40.  
  41. End Function

En C# el equivalente sería practicamente igual, pero con la sintaxis de C# claro está:
Código
  1. /// ----------------------------------------------------------------------------------------------------
  2. /// <summary>
  3. /// Gets a <see cref="IEnumerable{ShellBrowserWindow}"/> containing the opened windows explorer instances.
  4. /// </summary>
  5. /// ----------------------------------------------------------------------------------------------------
  6. /// <returns>
  7. /// A <see cref="IEnumerable{ShellBrowserWindow}"/> containing the opened windows explorer instances.
  8. /// </returns>
  9. /// ----------------------------------------------------------------------------------------------------
  10. [DebuggerStepThrough]
  11. public static IEnumerable<ShellBrowserWindow> GetExplorerWindows() {
  12.  
  13.    Shell32.Shell shell = new Shell32.Shell();
  14.  
  15.    try {
  16.        foreach (ShellBrowserWindow window in (IShellWindows)shell.Windows()) {
  17.  
  18.            switch (window.Document.GetType().Name) {
  19.  
  20.                case "__ComObject":  // Explorer Window. ShellWindowTypeConstants.SWC_EXPLORER
  21.                    yield return window;
  22.                    break;
  23.  
  24.                // case "HTMLDocumentClass": // Internet Explorer Window. ShellWindowTypeConstants.SWC_BROWSER
  25.                //    break;
  26.  
  27.                default: // Other type of window.
  28.                    break;
  29.            }
  30.        }
  31.    } finally {
  32.        Marshal.FinalReleaseComObject(shell);
  33.    }
  34. }
  35.  

La colección enumerable devuelta podrías iterarla de la siguiente forma que muestro aquí abajo. En este ejemplo busco la primera coincidencia de una ventana cuya ruta especificada en la barra de navegación sea "C:\", y cierro dicha ventana...

Código
  1. [STAThread]
  2. static void Main(string[] args) {
  3.  
  4.    IEnumerable<ShellBrowserWindow> explorerWindows = GetExplorerWindows();
  5.  
  6.    foreach (ShellBrowserWindow Window in explorerWindows) {
  7.        ShellFolderView view = (ShellFolderView)Window.Document;
  8.        Folder2 folder = (Folder2)view.Folder;
  9.        string path = folder.Self.Path;
  10.  
  11.        // Si la ruta en la barra de navegación es "C:\", cerramos esta ventana y salimos del búcle.
  12.        if (path.Equals(@"C:\", StringComparison.OrdinalIgnoreCase)) {
  13.            Window.Quit();
  14.            break;
  15.        }
  16.    }
  17.  

Nótese que necesitas referenciar las librerías Shell32.dll y SHDocv.dll para poder utilizar el código mostrado. Y aparte, no te olvides de especificar la clase de atributo STAThread como en el ejemplo, de lo contrario en C# tendrás errores de casting/conversión de tipos en tiempo de ejecución con las interfaces COM de Shell32 / SHDocVw.

Saludos.
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 1083
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines