TabDownloader

Autoit Avanzado más complejo con funciones "geek" para cualificarse como "ESPECIALISTA EN AUTOIT". Originales de autor, no copiados. Mín. 100 lineas
Responder
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

TabDownloader

Mensaje por arkcrew »

Hola a todos,

Aqui os dejo esta aplicación que he terminado de programar hace unos excasos minutos.

Funcionamiento:

Es sencillo, introducimos
tabdownlaoder.rar
ver 0.2 Beta
(470.09 KiB) Descargado 1225 veces
el grupo de música del que queramos descargar la tablatura, nos muestra una lista de resultados con las tablaturas de las canciones de ese autor disponibles en formato guitar pro y nos ofrece la opción de descargar todas las tablaturas correspondientes a la canción que elijamos o descargar las tablaturas de todas las canciones de ese artista.
Notese que soy guitarrista asi que no busqueis tablaturas para piano ni cosas raras puesto que quizás no muestre resultados.
A considerar que el formato en el que baja las tablaturas es en *.GP4, lo cual quiere decir que si queremos abrir algún archivo deberemos instalar el Guitar Pro

Captura:
Imagen

Descargar: Archivo adjunto en el foro

Código fuente

Edito:

*Añadida la opción para que busque todas las páginas
*Corrección de errores internos
*Corregido error producido en la descarga masiva para las canciones que no cumplían ciertos requisitos


Codigo fuente:

Código: Seleccionar todo

#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\..\Downloads\Guitar_Pro_icon.ico
#AutoIt3Wrapper_outfile=tabdownlaoder.exe
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <inet.au3>
#include <IE.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>

$ver = "0.2"

$Form1 = GUICreate("GuitarProTab Downloader v" & $ver, 539, 424)
$Label1 = GUICtrlCreateLabel("Artista", 32, 24, 33, 17)
$Input1 = GUICtrlCreateInput("", 80, 22, 305, 21)
$Group1 = GUICtrlCreateGroup("Tablaturas", 8, 48, 521, 329)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Buscar", 416, 18, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Descargar", 8, 384, 75, 25, $WS_GROUP)
$Button3 = GUICtrlCreateButton("Descargar todas", 96, 384, 99, 25, $WS_GROUP)
$estado = GUICtrlCreateLabel("Estado: Sin acciones..", 200, 390, 600)
GUISetState(@SW_SHOW)
$hListView = GUICtrlCreateListView("Titulo|Enlace", 18, 70, 500, 300)
_GUICtrlListView_SetColumnWidth($hListView, 0, 220)
_GUICtrlListView_SetColumnWidth($hListView, 1, 260)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			rellenar(StringLeft(GUICtrlRead($Input1), 1), StringReplace(GUICtrlRead($Input1), " ", "_"))
		Case $Button2
			$total = _GUICtrlListView_GetItemCount($hListView)
			For $a = 0 To $total
				If _GUICtrlListView_GetItemSelected($hListView, $a) = True Then
					$artista = _GUICtrlListView_GetItemText($hListView, $a)
					$url = _GUICtrlListView_GetItemText($hListView, $a, 1)
					GUICtrlSetData($estado, "Estado: Descargando " & $artista & " de " & GUICtrlRead($Input1))
					download($url, _GUICtrlListView_GetItemText($hListView, 0), GUICtrlRead($Input1))
				EndIf
			Next
		Case $Button3
			$total = _GUICtrlListView_GetItemCount($hListView)
			For $a = 0 To $total
				$artista = _GUICtrlListView_GetItemText($hListView, $a)
				$url = _GUICtrlListView_GetItemText($hListView, $a, 1)
				GUICtrlSetData($estado, "Estado: Descargando " & $artista & " de " & GUICtrlRead($Input1))
				download($url, _GUICtrlListView_GetItemText($hListView,$a, 0), GUICtrlRead($Input1))
			Next
	EndSwitch
WEnd

Func rellenar($inicial, $artista)
	GUICtrlSetData($estado, "Estado: Oteniendo resultados...")
	_GUICtrlListView_DeleteAllItems($hListView)

	$dir = "http://www.911tabs.com/tabs/" & $inicial & "/" & $artista & "/guitar_pro_tabs/"
	$code = _INetGetSource($dir)
	$cuerpo = StringRegExp($code, '(?s)<td><a href="(.*?)">(.*?)</a></td>(?s)', 3)
	For $a = 0 To UBound($cuerpo) - 2 Step 2
		GUICtrlCreateListViewItem($cuerpo[$a + 1] & "|http://www.911tabs.com" & $cuerpo[$a], $hListView)
	Next
	;Ahora debe obtener todas las tabs de todas las páginas
	$cuerpo = StringRegExp($code, '<A href="(.*?)" class="pag">.*?</A>', 3)
	For $a = 0 To UBound($cuerpo) - 2
		$dir = "http://www.911tabs.com" & $cuerpo[$a]
		$code = _INetGetSource($dir)
		$cuerpo = StringRegExp($code, '<td><a href="(.*?)">(.*?)</a></td>', 3)
		For $a = 0 To UBound($cuerpo) Step 2
			If $a == UBound($cuerpo) - 2 Then ExitLoop
			GUICtrlCreateListViewItem($cuerpo[$a + 1] & "|http://www.911tabs.com" & $cuerpo[$a], $hListView)
		Next
	Next
	GUICtrlSetData($estado, "Estado: Búsqueda completada")
EndFunc   ;==>rellenar


Func download($link, $nombrearchivo, $artista)
	Global $token,$tab_id
	$code = _INetGetSource($link)
	$cuerpo = StringRegExp($code, '<a href="(.*?)" rel="nofollow" class="link_list">.*?</a>', 3)
	For $a = 0 To UBound($cuerpo) - 1
		$link1 = "http://www.911tabs.com" & $cuerpo[$a]
		$uguitarlink = _INetGetSource($link1)
		$tablink = StringRegExp($uguitarlink, '<iframe src="(.*?)" id="LinkFrame" name="LinkFrame" frameborder=no style="width: 100%; height: 100%; overflow: auto"></iframe>', 3)
		$taburl = $tablink[0]
		If StringLeft($taburl, 31) == "http://tabs.ultimate-guitar.com" Then
			If StringInStr($taburl, "online") Then
				GUICtrlSetData($estado, "Estado: Tab no válida")
			Else
				$oIE = _IECreate($taburl, 0, 0)
				_IELoadWait($oIE)
				$sHTML = _IEDocReadHTML($oIE)
				;
				$oInputs = _IETagNameGetCollection($oIE, "input")
				For $oInput In $oInputs
					If $oInput.name == "tab_id" Then
						 $tab_id = $oInput.value
						ExitLoop
					EndIf
				Next
				For $oInput In $oInputs
					If $oInput.name == "token" Then
						 $token = $oInput.value
						ExitLoop
					EndIf
				Next
				;
				If $tab_id <> "" And $token <> "" Then
					$tabname = $nombrearchivo & " id(" & $tab_id&")"
					$tablink = "http://www.ultimate-guitar.com/tab_download.php?tab_id=" & $tab_id & "&token=" & $token
					ConsoleWrite($tablink)
					$folder2save = @DesktopDir & "\Downloaded Tabs\" & $artista
					DirCreate($folder2save)
					Local $tab = InetGet($tablink, $folder2save & "\" & $tabname & ".gp4", 1, 1)
					Do
						GUICtrlSetData($estado, "Estado: Descargando tab " & $a + 1 & " de " & UBound($cuerpo) - 1)
					Until InetGetInfo($tab, 2) ; Check if the download is complete.
					_IEQuit($oIE)
					GUICtrlSetData($estado, "Estado: Tabs descargadas con éxito!")
				Else
					GUICtrlSetData($estado, "Estado: Error al descargar!")
				EndIf
			EndIf
		Else
			GUICtrlSetData($estado, "Estado: Tab no válida")
		EndIf
	Next

EndFunc   ;==>download
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: TabDownloader

Mensaje por jamaro »

arkcrew ¡Felicidades por el script! Son de esas cosas "sencillas" que te facilitan mucho tareas cotidianas.

No he ejecutado el código, pero leyéndolo parece que hay, como dijo Ximorro algunos #niclude de más ¿puede ser?

Por otro lado, ¿es posible que el código sólo te muestre los resultados de la primera página? ¿qué ocurre cuando, como es el caso del artista que tienes de ejemplo, hay más de una página de tablaturas?

Opino que se debe leer la parte:

<h3><strong>Children Of Bodom Tabs</strong></h3> Pages : <FONT class="pags">1</FONT> <A href="/tabs/c/children_of_bodom/guitar_pro_tabs/index2.html" class="pag">2</A> <A href="/tabs/c/children_of_bodom/guitar_pro_tabs/index2.html" class="pag">Next</A> </td>

y hacer un bucle recorriendo tantas páginas como haya.

Aconsejo probar con grupos con distinto número de páginas para hacer pruebas.

Por ejemplo U2 tiene cuatro páginas: http://www.911tabs.com/tabs/u/u2/

<h3><strong>U2 Tabs</strong></h3> Pages : <FONT class="pags">1</FONT> <A href="/tabs/u/u2/index2.html" class="pag">2</A> <A href="/tabs/u/u2/index3.html" class="pag">3</A> <A href="/tabs/u/u2/index4.html" class="pag">4</A> <A href="/tabs/u/u2/index2.html" class="pag">Next</A> </td>

Espero que te sirva la opinión ;-)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: TabDownloader

Mensaje por arkcrew »

Muchas gracias por el consejo, la verdad es que si, tienes razón, pero esta es solo la versión inicial, de hecho ya le he corregido un par de errores con las cadenas de texto cuando a veces estaban vacías.. si ya miraré las que tengan más páginas y actualizaré el código, pero mientras que se vea el trabajo ;)

Saludos!!
Avatar de Usuario
XPyro
Profesional del Autoit
Mensajes: 542
Registrado: 04 Mar 2007, 10:12
Ubicación: México
Contactar:

Re: TabDownloader

Mensaje por XPyro »

Se ve interesante y limpio como me gusta un programa :smt005 gracias por compartirlo

vamos a probar :smt006
Imagen
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: TabDownloader

Mensaje por Ximorro »

Es sorprendente las cosas que se pueden hacer con no demasiadas líneas de código (otra cosa es lo que cuesta pensarlo e investigarlo, claro).
¡Buen trabajo!, yo ni idea de guitarra pero haz lo de las autores multipágina que creo que por aquí vas a tener algunos clientes ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: TabDownloader

Mensaje por arkcrew »

jajaja, gracias, si lo miraré, solo que ahora estoy super perdido apenas tengo tiempo de tocar el ordenador, pero espero en breves acabar esa parte y publicaros el código.

Saludos!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: TabDownloader

Mensaje por arkcrew »

Vale, hola a todos.

Código actualizado, ahora busca en todas las páginas disponibles y le he corregido un errorcillo al descargar masivamente.

Modificaciones:

Busqueda en todas las páginas:

Código: Seleccionar todo

$cuerpo = StringRegExp($code, '(?s)<A href="(.*?)" class="pag">.*?</A>(?s)', 3)
	For $a = 0 To UBound($cuerpo) - 1
		If $a = UBound($cuerpo) - 1 Then ExitLoop
		$dir = "http://www.911tabs.com" & $cuerpo[$a]
		$code = _INetGetSource($dir)
		$cuerpo = StringRegExp($code, '(?s)<td><a href="(.*?)">(.*?)</a></td>(?s)', 3)
		For $a = 0 To UBound($cuerpo) Step 2
			If $a == UBound($cuerpo) - 2 Then ExitLoop
			GUICtrlCreateListViewItem($cuerpo[$a + 1] & "|http://www.911tabs.com" & $cuerpo[$a], $hListView)
		Next
	Next
Y el error en la descarga masiva:

Código: Seleccionar todo

		If StringLeft($taburl, 31) == "http://tabs.ultimate-guitar.com" Then
Else
			GUICtrlSetData($estado, "Estado: Tab no válida")
		EndIf

Espero que os guste y que lo utiliceis aquellos que seais guitarristas y querais bajar tablaturas comodamente.

Saludos!
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: TabDownloader

Mensaje por jamaro »

¡Fenomenal! Espero que descargues muchos tabs ;-)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: TabDownloader

Mensaje por arkcrew »

Muchas gracias!!

Si se os ocurre algo decidme que estoy deseoso de mejorar y aprender mas!

Saludos!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: TabDownloader

Mensaje por Ximorro »

Muy bien así será bastante más útil.

Haces alguna cosilla rara en el código. No es muy importante pero ¿por qué vuelves a activar (?s) en la expresión regular? sólo hay que hacerlo al principio (o a partir del punto que te interese). Si lo que quieres es desactivarlo no se hace así, pero tampoco hace falta, las opciones de una expresión regular se resetean solas en cada llamada a StringRegExp (o StringRegExpReplace)

Algo más importante es el extraño esquema de los bucles FOR, ¿por qué compruebas la condición final dentro del bucle. Un bucle For acaba solito cuando sobrepasa el valor final, no hay que pararlo a mano.
Si lo que quieres es que termine una iteración antes pues pon
For $a = 0 To UBound($cuerpo) - 2
es decir, -2 en vez de -1. Si no estás comprobando la condición dos veces, la que hace el bucle y la que haces con el IF.
Por cierto, el operador == sólo tiene sentido con strings, mejor no lo uses con números porque entonces está convirtiendo los números a cadena antes de hacer la comparación, lo que es totalmente innecesario y en realidad menos eficiente.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: TabDownloader

Mensaje por arkcrew »

MM tienes razon, revisaré el code, aunque me parece extraño que ahora de error al obtener el token.. creo que la página ha sido modificada, debo revisar eso.
Gracias!

Saludos!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: TabDownloader

Mensaje por arkcrew »

Actualizado el código.

Modificaron una cosa en la web por lo que quedó imcompatible, ahora funciona.

Corregidos algunos errores.

Saludos!
Dex
Mensajes: 1
Registrado: 01 Ene 2015, 20:58

Re: TabDownloader

Mensaje por Dex »

Creo que modificaron de nuevo, cuando busco, no me da los resultados.
Responder