Página 1 de 1

TabDownloader

Publicado: 15 Dic 2011, 18:26
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 1228 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

Re: TabDownloader

Publicado: 16 Dic 2011, 11:12
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 ;-)

Re: TabDownloader

Publicado: 16 Dic 2011, 11:53
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!!

Re: TabDownloader

Publicado: 18 Dic 2011, 06:45
por XPyro
Se ve interesante y limpio como me gusta un programa :smt005 gracias por compartirlo

vamos a probar :smt006

Re: TabDownloader

Publicado: 02 Ene 2012, 11:55
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 ;-)

Re: TabDownloader

Publicado: 02 Ene 2012, 14:07
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!

Re: TabDownloader

Publicado: 05 Ene 2012, 18:05
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!

Re: TabDownloader

Publicado: 05 Ene 2012, 20:12
por jamaro
¡Fenomenal! Espero que descargues muchos tabs ;-)

Re: TabDownloader

Publicado: 06 Ene 2012, 15:30
por arkcrew
Muchas gracias!!

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

Saludos!

Re: TabDownloader

Publicado: 09 Ene 2012, 10:53
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.

Re: TabDownloader

Publicado: 10 Ene 2012, 16:22
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!

Re: TabDownloader

Publicado: 21 Nov 2012, 17:44
por arkcrew
Actualizado el código.

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

Corregidos algunos errores.

Saludos!

Re: TabDownloader

Publicado: 01 Ene 2015, 22:00
por Dex
Creo que modificaron de nuevo, cuando busco, no me da los resultados.