|
||
|
#41
|
||||
|
||||
|
Sería estupendo que la tarea pudiera detectar (y eliminar) archivos duplicados en varias carpetas. A estas alturas no dudo de que también serás capaz de superar ese reto. Seguimos atentos a tus mensajes.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
|
|
#42
|
||||
|
||||
|
La variable %caller es un array creado/mantenido por Tasker que guarda la secuencia de llamadas entre perfiles/escenas/tareas/etc. Cada elemento de ese array tiene la forma... callertype(=callername(:subcallername)) Dependiendo del valor de "callertype" (profile, scene, ui, launch, notification, external, task) en los otros dos valores puede aparecer diferente información. Por ejemplo, si consultas esa variable desde una tarea lanzada por la entrada de un perfil podrías ver algo así... profile=enter:PerfilCasa Consultando cada elemento del array %caller una subtarea que sea llamada desde una tarea a su vez llamada desde un perfil podría saber exactamente quién la ha sacado de su letargo. ![]() ![]() Dejando el uso de la consola a un lado (de momento) ya tengo resuelto el tema de procesar/comparar varias carpetas. ![]() Al tema... Código:
BorraDuplicados (666) A1: Destino (de goto) <Esta tarea elimina los posibles archivos duplicados de uno o varios directorios. Se puede usar como subtarea, poniendo en el par1 la lista de directorios separados por comas, y en el par2 el/los tipo(s) de archivos a procesar. La tarea devuelve cuatro valores separados por comas: archivos procesados, archivos borrados, bytes borrados, milisegundos empleados> A2: Establecer variable [ Nombre:%par1 A:/sdcard/tmp1,/sdcard/tmp2 ] Si (if) [ %caller1 ~ ui ] A3: Establecer variable [ Nombre:%par2 A:*.jpeg/*.jpg ] Si (if) [ %caller1 ~ ui ] A4: Devolver [ Valor:PARX Detener:Encendido ] Si (if) [ %par1 No ajust. | %par2 No ajust. ] A5: Establecer variable [ Nombre:%tictac A:%TIMEMS ] A6: Separar variable [ Nombre:%par1 Separador:, ] A7: For [ Variable:%carpeta Ítems:%par1() ] A8: Listar archivos [ Directorio:%carpeta Coincidir:%par2 Variable:%lista Continuar Tarea Tras Error:Encendido ] A9: For [ Variable:%archivo Ítems:%lista() ] A10: Probar Archivo [ Tipo:Tamaño Datos:%archivo Almacenar Resultado en:%bytes Continuar Tarea Tras Error:Encendido ] A11: Sumar a variable [ Nombre:%chk Valor:1 ] A12: Establecer variable [ Nombre:%archivos(%chk) A:<b>%bytes</b><a>%archivo</a> ] A13: End For A14: End For A15: Devolver [ Valor:VACIO Detener:Encendido ] Si (if) [ %archivos(#) = 0 ] A16: Procesar Array [ Variable:%archivos Tipo:Orden Alfabético ] A17: Establecer variable [ Nombre:%finchk A:%archivos(#)-1 Calcular:Encendido ] A18: Establecer variable [ Nombre:%filesbor A:0 Calcular:Apagado ] A19: Establecer variable [ Nombre:%bytesbor A:0 Calcular:Apagado ] A20: For [ Variable:%chk Ítems:1:%finchk ] A21: Establecer variable [ Nombre:%sigchk A:%chk+1 Calcular:Encendido ] A22: Establecer variable [ Nombre:%archivos A:%archivos(%chk) %archivos(%sigchk) ] A23: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<b>).*?(?=</b>) Almacenar Coincidencias En:%bytes ] A24: Si (if) [ %bytes1 = %bytes2 ] A25: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=</a>) Almacenar Coincidencias En:%file ] A26: Ejecutar consola [ Comando:cmp %file1 %file2 Almacenar Salida En:%salida Continuar Tarea Tras Error:Encendido ] A27: Si (if) [ %salida No ajust. ] A28: Sumar a variable [ Nombre:%filesbor Valor:1 ] A29: Sumar a variable [ Nombre:%bytesbor Valor:%bytes1 ] A30: Eliminar archivo [ Archivo:%file1 Continuar Tarea Tras Error:Encendido ] A31: Fin si (End if) A32: Fin si (End if) A33: End For A34: Establecer variable [ Nombre:%tictac A:%TIMEMS-%tictac Calcular:Encendido ] A35: Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] Si (if) [ %caller1 ~ ui ] A36: Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ] Esta vez he dejado el mecanismo que permite usar la tarea directamente en el UI, o como una subtarea, sin tener que tocar nada. En A2 se pone la lista de carpetas y en A3 el patrón de archivos, le das al PLAY y a funcionar. Si vais a tocar cosas desactivar A30 para evitar borrar cosas accidentalmente. Posibles mejoras... Al procesar/comparar varias carpetas poder decidir en cuál de ellas se deja el archivo si se encuentra un duplicado. ¿Podría ser interesante? ... menuda pregunta más tonta
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Los siguientes 3 usuarios han agradecido a WillyWeb su comentario: | ||
|
#43
|
||||
|
||||
|
Excelente tarea han creado!!!! He seguido el hilo día a día y realmente quedé impresionado (cómo en tantas otras ocasiones) con los que algunos pueden hacer con Tasker y sus conocimientos. Uno aprende un poquito cada día, pero el que está limitado de base en ciertos aspectos informáticos (como es mi caso) no puede más que maravillarse. Felicitaciones!!!
|
| Los siguientes 2 usuarios han agradecido a leromaro su comentario: | ||
|
#44
|
||||
|
||||
|
Lo importante (realmente lo más importante) es que entiendas lo que hace cada instrucción de la tarea. Nadie nace sabiendo y ser capaz de seguir el desarrollo de una idea como esta es el primer paso para aprender.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#45
|
||||
|
||||
|
WillyWeb, lo que has creado me viene muy grande! Tienes mi admiración! Ahora a ver cómo acomodo esto en mi tasker...
|
| Gracias de parte de: | ||
|
#46
|
||||
|
||||
|
Exacto, al tener todo ordenado se entiende, al ir siguiendo como van resolviendo, se entiende, pero el camino al resultado es muy complejo.
|
| Gracias de parte de: | ||
|
#47
|
||||
|
||||
|
Y, ¿cómo metes eso en tu Tasker? ... pues paso a paso ![]() -Creas esa tarea directamente en la pestaña "TAREAS". Sólo tienes que leer cada línea, buscar la acción y poner los parámetros que aparecen en la descripción. -Ahora ya puedes crear ese perfil con un contexto de hora...
Suponiendo que quieres limpiar de duplicados las carpetas de fotos de WhatsApp tendrías que poner algo como esto... Parámetro1... /sdcard/WhatsApp/Media/WhatsApp Images,/sdcard/WhatsApp/Media/WhatsApp Images/Sent Parámetro2... *.jpg/*.jpeg/*.gif Si quieres limpiar de duplicados las carpetas de vídeos de WhatsApp tendrías que poner algo como esto... Parámetro1... /sdcard/WhatsApp/Media/WhatsApp Video,/sdcard/WhatsApp/Media/WhatsApp Video/Sent Parámetro2... *.3gp/*.mp4 Ojo, que puede que en tu dispositivo la memoria interna no se llame "sdcard".
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Los siguientes 2 usuarios han agradecido a WillyWeb su comentario: | ||
|
#48
|
||||
|
||||
|
Una vez resuelto el problema de la "visión" sólo tienes que plasmar en acciones de Tasker lo que haces manualmente de forma inconsciente... -Buscas la lista de archivos y la ordenas por tamaños para verificar a golpe de vista si dos archivos pueden ser iguales. -Si encuentras dos posibles duplicados abres cada imagen para "ver" (comparar en binario) si realmente son la misma. -Si resulta que son la misma borras una de ellas. Eso es todo.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#49
|
||||
|
||||
|
Enhorabuena @WillyWeb...muy buen trabajo...y enhorabuena también a @Caravantes por sus aportaciones e ideas...
Me quito el sombrero ante vosotros.... En cuanto me tome la pastillita de NZT me pongo a transcribir la tarea ![]() ![]() ![]() @mlsir......hay que ir retomando las buenas costumbres....WillyWeb se ha ganado la copa y hay que subir la tarea al recopilatorio ![]() ![]()
|
|
#50
|
||||
|
||||
![]() Por cierto, en el tema de la comparación binaria me he decantado por el comando "cmp" en vez del "md5" porque con "cmp" la tarea es un 60% más rápida. El tema es que con el sistema md5 se requieren más acciones y dos procesos binarios (uno por archivo) mientras que con el sistema cmp se hace todo con un par de acciones y un único proceso binario.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 25/02/16 a las 12:08:24. |
| Gracias de parte de: | ||
|
#51
|
||||
|
||||
|
Todavía no he analizado con todo detalle la tarea que compara archivos de dos carpetas, tiene una pinta fantástica. ¿Se podrían procesar tres o más carpetas?
<b>bytes</b><a>archivo</a><p>prioridad</p>
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#52
|
||||
|
||||
![]() En caso de que %par1 incluya varias carpetas a comparar, podría ser tan "simple" como borrar siempre el archivo de la primera carpeta que se haya indicado en %par1, y mantener el archivo de la segunda incluída en %par1. Porsupuesto luego queda la dificultad de mantener el control sobre cuál archivo es de cuál carpeta y cuál es su orden de prioridad. Tal vez se podría hacer añadiendo al array un tercer dato con una referencia numérica respecto a la prioridad de borrado, algo así:
<b>bytes</b><a>archivo</a><p>prioridad</p> ![]() En lo que tenga un rato lo pruebo y os cuento.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#53
|
||||
|
||||
|
De este modo, si tienes coincidencia con tres archivos de distintas carpetas <b>1024</b><a>file1</a><p>3</p> <b>1024</b><a>file22</a><p>4</p> <b>1024</b><a>file999</a><p>1</p> En ese caso habría que empezar borrando carpeta1/file999 que es el que tiene la prioridad de borrado más alta (1). Luego habría que borrar carpeta3/file1 que es el otro que tiene mayor prioridad (3). Y en este ejemplo habría que dejar sin borrar carpeta4/file22 que es el que tiene menor prioridad de borrado (4). En este supuesto no hay ningún archivo idéntico en la carpeta2 y por eso no aparece ningún archivo con prioridad 2. También podría ocurrir que hubiese varios archivos iguales en la misma carpeta, y en ese caso me parece irrelevante que se borre uno u otro, así que borraría por orden alfabético para dejar vivo el último de ellos (o al revés).
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#54
|
||||
|
||||
|
/sdcard/CarpetaUno,/sdscard/CarpetaDos,/sdcard/CarpetaTres ...al ordenar los archivos los primeros serán los de "CarpetaDos", luego los de "CarpetaTres" y al final los de "CarpetaUno". Recuerda que se ordenan alfabéticamente. ![]() De este modo, si tienes coincidencia con tres archivos de distintas carpetas
<b>1024</b><a>file1</a><p>3</p> <b>1024</b><a>file22</a><p>4</p> <b>1024</b><a>file999</a><p>1</p> En ese caso habría que empezar borrando carpeta1/file999 que es el que tiene la prioridad de borrado más alta (1). Luego habría que borrar carpeta3/file1 que es el otro que tiene mayor prioridad (3). Y en este ejemplo habría que dejar sin borrar carpeta4/file22 que es el que tiene menor prioridad de borrado (4). En este supuesto no hay ningún archivo idéntico en la carpeta2 y por eso no aparece ningún archivo con prioridad 2. ![]() Y ademas la tarea no funciona de esa manera. El grueso del trabajo lo hace la ordenación del array, que se encarga de "juntar" los archivos candidatos a ser eliminados. Eso es lo que permite que, con una sola pasada y comparando sólo dos archivos cada vez (no varios a visa de pájaro), podamos decidir si realmente son iguales y borrar uno de los dos. Lo que se me ha ocurrido sigue dejando el grueso del trabajo en manos de la ordenación, no tiene impacto en el tiempo de proceso y sólo es necesario añadir una acción fuera del bucle principal.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#55
|
||||
|
||||
|
Menuda locura de semana. Pido disculpas de nuevo por esta sucesión de capítulos para solucionar algo que no es especialmente complicado.
![]() Al tema... Como ya he comentado la ordenación alfabética del array de pares bytes#archivo nos hace el 99% del trabajo. Suponiendo que tenemos una lista de carpetas tal que así... /CarpetaB,/CarpetaC,/CarpetaA Y si tenemos archivos candidatos a ser borrados en cada una de ellas el array quedaría así... <b>12345</b><a>/CarpetaA/IMG20160225-0099.jpg</a> <b>12345</b><a>/CarpetaB/IMG20160225-0103.jpg</a> <b>12345</b><a>/CarpetaC/IMG20160225-0041.jpg</a> La rutina que busca los duplicados avanza por la lista comparando cada archivo con el siguiente. Si son iguales se borra el primer archivo de los dos comparados. La secuencia sigue hasta llegar al penúltimo archivo de la lista que se compara con el último. Simple como el mecanismo de un chupete. Aplicando ese sistema a esos tres archivos que he puesto de ejemplo se eliminarían los dos primero y quedará el tercero. Podría valer así ya que de los tres sólo queda uno, pero es evidente que el orden de la lista de carpetas no se respeta. La solución es tan sencilla como crear un contador que se incremente con cada carpeta de la lista y añadir ese contador al array de pares (ahora tríos) para que quede así... bytes#orden#archivo. Si luego ordenamos la lista en orden alfabético inverso nos quedaría así... <b>12345</b>3<a>/CarpetaA/IMG20160225-0099.jpg</a> <b>12345</b>2<a>/CarpetaC/IMG20160225-0041.jpg</a> <b>12345</b>1<a>/CarpetaB/IMG20160225-0103.jpg</a> Y si aplicamos el mecanismo de comparación/eliminación descrito antes nos quedará de nuevo el tercer archivo, pero que esta vez sí es el de la primera carpeta puesta en la lista. Tema resuelto ... ¿seguro? Pues no. Eso funciona hasta 9 carpetas, pero si llegamos a 10 el invento falla de forma escandalosa porque al ordenar alfabéticamente la secuencia 1,2,3,4,5,6,7,8,9,10 queda así ... 1,10,2,3,4,5,6,7,8,9 ... una cagada. ![]() La solución (hasta que aparezca una nueva cagada) es iniciar ese contador de tal forma que a la primera carpeta se le asigne un 10 en vez de un 1. Eso garantiza un ordenamiento correcto hasta llegar al valor 99 lo que permite procesar 90 carpetas, que no creo que suceda jamás. Si a nadie se le ocurre por dónde puede fallar todo esto mañana pongo la tarea definitiva con todo esto implementado. Buenas noches
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#56
|
||||
|
||||
|
Eso funciona hasta 9 carpetas, pero si llegamos a 10 el invento falla de forma escandalosa porque al ordenar alfabéticamente la secuencia 1,2,3,4,5,6,7,8,9,10 queda así ... 1,10,2,3,4,5,6,7,8,9 ... una cagada.
La solución (hasta que aparezca una nueva cagada) es iniciar ese contador de tal forma que a la primera carpeta se le asigne un 10 en vez de un 1. Eso garantiza un ordenamiento correcto hasta llegar al valor 99 lo que permite procesar 90 carpetas, que no creo que suceda jamás. ![]()
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#57
|
||||
|
||||
|
felicidades a todos por contribuir en especial a los masters!
__________________
![]() "Tanto si piensas que puedes, como si piensas que no puedes, estás en lo cierto"
— Henry Ford — |
| Gracias de parte de: | ||
|
#58
|
||||
|
||||
|
Creo que con esta versión se alcanzan todos los objetivos propuestos...
Y como valores añadidos...
La descripción de la tarea es la siguiente...
Y su código Tasker... Código:
BorraDuplicados (666) A1: Destino (de goto) <La tarea elimina los posibles archivos duplicados de uno o varios directorios. Se puede usar como subtarea, poniendo en el par1 la lista de directorios separados por comas (se tiene en cuenta su orden) y en el par2 el/los tipo(s) de archivos a procesar. La tarea devuelve cuatro valores separados por comas: archivos procesados, archivos borrados, bytes borrados, milisegundos empleados> A2: Establecer variable [ Nombre:%par1 A:/sdcard/tmp2,/sdcard/tmp1 ] Si (if) [ %caller1 ~ ui ] A3: Establecer variable [ Nombre:%par2 A:*.jpeg/*.jpg ] Si (if) [ %caller1 ~ ui ] A4: Devolver [ Valor:PARX Detener:Encendido ] Si (if) [ %par1 No ajust. | %par2 No ajust. ] A5: Establecer variable [ Nombre:%tictac A:%TIMEMS ] A6: Separar variable [ Nombre:%par1 Separador:, ] A7: Establecer variable [ Nombre:%peso A:100 ] A8: For [ Variable:%carpeta Ítems:%par1() ] A9: Restar de variable [ Nombre:%peso Valor:1 ] A10: Listar archivos [ Directorio:%carpeta Coincidir:%par2 Variable:%lista Continuar Tarea Tras Error:Encendido ] A11: For [ Variable:%archivo Ítems:%lista() ] A12: Probar Archivo [ Tipo:Tamaño Datos:%archivo Almacenar Resultado en:%bytes Continuar Tarea Tras Error:Encendido ] A13: Sumar a variable [ Nombre:%chk Valor:1 ] A14: Establecer variable [ Nombre:%archivos(%chk) A:<b>%bytes</b>%peso<a>%archivo</a> ] A15: End For A16: End For A17: Devolver [ Valor:VACIO Detener:Encendido ] Si (if) [ %archivos(#) = 0 ] A18: Procesar Array [ Variable:%archivos Tipo:Orden Alfabético ] A19: Establecer variable [ Nombre:%finchk A:%archivos(#)-1 Calcular:Encendido ] A20: Establecer variable [ Nombre:%filesbor A:0 ] A21: Establecer variable [ Nombre:%bytesbor A:0 ] A22: For [ Variable:%chk Ítems:1:%finchk ] A23: Establecer variable [ Nombre:%sigchk A:%chk+1 Calcular:Encendido ] A24: Establecer variable [ Nombre:%archivos A:%archivos(%chk) %archivos(%sigchk) ] A25: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<b>).*?(?=</b>) Almacenar Coincidencias En:%bytes ] A26: Si (if) [ %bytes1 = %bytes2 ] A27: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=</a>) Almacenar Coincidencias En:%file ] A28: Ejecutar consola [ Comando:cmp %file1 %file2 Almacenar Salida En:%salida Continuar Tarea Tras Error:Encendido ] A29: Si (if) [ %salida No ajust. ] A30: Sumar a variable [ Nombre:%filesbor Valor:1 ] A31: Sumar a variable [ Nombre:%bytesbor Valor:%bytes1 ] A32: Eliminar archivo [ Archivo:%file1 Continuar Tarea Tras Error:Encendido ] A33: Fin si (End if) A34: Fin si (End if) A35: End For A36: Establecer variable [ Nombre:%tictac A:%TIMEMS-%tictac Calcular:Encendido ] A37: Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] Si (if) [ %caller1 ~ ui ] A38: Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ] Su uso como subtarea (su propósito principal) podría ser tal que así... Código:
LimpiaFotosDuplicadasWA (777) A1: Establecer variable [ Nombre:%carpeta1 A: /sdcard/WhatsApp/Media/WhatsApp Images ] A2: Establecer variable [ Nombre:%carpeta2 A: /sdcard/WhatsApp/Media/WhatsApp Images/Sent ] A3: Establecer variable [ Nombre:%filtro A: *.jpg/*.jpeg/*.gif ] A4: Realizar tarea [ Nombre:BorraDuplicados Prioridad:%priority Parámetro 1 (%par1):%carpeta2,%carpeta1 Parámetro 2 (%par2):%filtro Devolver Valor de Variable:%resultado ] A5: Flash [ Texto:%resultado Largo:Encendido ] Para usar la tarea directamente desde el UI de Tasker...
Saludos al respetable
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 16/03/16 a las 23:42:07. Razón: Aclaraciones sobre el funcionamiento de la tarea. |
| Los siguientes 8 usuarios han agradecido a WillyWeb su comentario: | ||
|
#59
|
||||
|
||||
|
Fantástico Willy.
Sigo asombrado por tu capacidad para exprimir al máximo las diferentes técnicas (comandos de Linux, gestion de arrays, expresiones regulares) todo lo cual produce un resultado óptimo. A mí me habría costado varias semanas preparar una tarea que hiciera la misma labor, pero mi tarea tendría más de 150 acciones (más compleja, dificil de entender y mantener) y lo peor de todo es que necesitaría 50 veces más tiempo para ejecutarse. Lo que has hecho es admirable. Felicitaciones y muchas gracias. Creo que, en ese post, justo tras esa frase convendría que añadieras unas explicaciones del tipo que pusiste en la primera tarea, algo como lo siguiente (corrige lo que quieras o haz tu propia versión):
Añado otra petición o sugerencia para el compañero Albalatvs que fue quien inició el hilo: Edita el primer post del hilo, añadiendo un comentario inicial para explicar que el asunto ha provocado un buen puñado de mensajes, pero quien tenga interés en la solución puede ir directamente al post definitivo que resuelve el problema y que está en http://www.htcmania.com/showthread.p...6#post22207586 Además, en ese primer post, entras en edición avanzada y cambias el prefijo del título (Consulta) poniendo SOLUCIONADO. Gracias.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| Gracias de parte de: | ||
|
|
|
#60
|
||||
|
||||
|
De mil amores lo hago Caravantes! Dame un momento! WillyWeb, me uno a las felicitaciones del compañero Caravantes. Si de mí dependiera, la copa virtual la tendrías ya!
Un saludo
|
| Gracias de parte de: | ||
![]() |
Estás aquí
|
||||||
|
||||||