
Version 0.2.5
>>71999
Nop negrín, es como ya te dijeron.
La femenina She-ra > la masculina y presumida Korra.
O ¿acaso sabes de algún anon que le ponga como diamante el que una chica cabalgue un hermoso caballo blanco? los bronis no cuentan
>>72000
Con las caricaturas yankees ya estaba tan acostumbrado al cliche del niño nerd, la crush sexy o qt (si son niños) y el deportista o chico cool. Así que cuando vi al Jason me quede sin costados, además de que el chico es medio raro, no en el sentido gay, sino en el sentido de rarito preocupante.
Además que refuerza la poca (nula) autoestima de Wirt.
>>71995
Meh, fue agradable, pero solo apareció en un cap. y aún así fue menos que otros personajes como el tío de los protas.
>>72001
Solo estoy esperando mucho arte bonito con la niña sapo Ya saben de lo que hablo, sucios pasteleros
>>792293
Soy norteño ario pendejo o que ya se te olvido como se la mamaste a los argensimios en g ? puto prieto mestizo inferior.
>>72004
Secundísimo. ¿Exactamente qué van a hacer Gwen y Miles? La chispa de la película de Into the Spiderverse era el ver la maduración de un chaval que de la nada tiene toda una ciudad por salvar ya que es el único reemplazo de Peter Parker en su dimensión, encontrando también su motivo para vivir y existir. Si van a expandir su proceso de maduración es mejor transmitirlo episódicamente en vez de una película de 2 horas donde todo se va a serntir apretado y apresurado.
>>257114
Claro negro siempre y cuando no uses un continue.
A lo que me refiero es que si te pasas todos los stages sin llegar a usar un continue, puedes dar por superado el juego en esa dificultad.
Si quieres luego prueba el extra stage.
>>257081
Perdón por el retraso pero... Cuando te refieres a "no mueras", ¿significa no sacrificar 1cc?, osea si me hacen daño y me quitan una vida igual vale como "seguir"
>>56480
Joder qué buen dibujo, ¿cuantos años estudiando anatomía?, ¿4 o 6?
>>42497
No lo creé yo, solo lo modifiqué tantito. Lo puedes descargar aquí: https://github.com/crshd/startpage.rwrt
Actualización del script en Python:# -*- coding: utf-8 -*-
import sys
import os
import re
import threading
import queue
import time
import gettext
import urllib.request
import urllib.error
URLError = urllib.error.URLError
# flags
subfolder = None
overwrite = None
update = None
debug = None
# shared stuff
nbitsmutx = threading.Lock()
nbits = 0
# Expresiones regulares para evitar escribir código innecesariamente complejo
adjuntos = re.compile('[\r\n]+, ([^<]+)| title="([^"]+))')
# Detecta el tablón e ID del hilo de un enlace completo o en la forma corta: "/tablón/hilo".
enlace = re.compile("(?i)^(?:(?:(?:(?:https?://)?(?:[a-z]+[.])?)?hispachan[.]org/)?|/?)?([a-z]+)/(?:res/)?([0-9]+)(?:[.]html)?")
def getthreadinfo(url):
r = enlace.match(url)
if r:
return r.groups()
print("Error: url invalida")
exit(1)
def getimglist(url):
opener = urllib.request.build_opener()
opener.addheaders = [
('User-agent', 'Mozilla/5.0')
]
try:
f = opener.open(url, timeout=20)
b = f.read()
except URLError as e:
raise e
f.close()
return adjuntos.findall(b.decode('utf-8'))
def subproc(iqueue, oqueue):
while True:
tmp = iqueue.get()
if not tmp:
break
if saveimg(tmp[0], tmp[1]):
oqueue.put((tmp[0], True))
continue
oqueue.put((tmp[0], False))
def saveimg(url, path):
global nbits
global nbitsmutx
opener = urllib.request.build_opener()
opener.addheaders = [
('User-agent', 'Mozilla/5.0')
]
try:
f = opener.open(url, timeout=120)
except URLError as e:
if debug == True: raise e
else: return False
except Exception as e:
if debug == True: raise e
else: return False
if os.path.isfile(path):
if update:
try:
sz1 = int(f.info()["Content-Length"])
fh = open(path, "rb")
fh.seek(0, 2)
sz2 = fh.tell()
fh.close()
except Exception as e:
if debug == True: raise e
else: return False
if sz1 == sz2:
return True
# si el archivo existe intentamos con un nuevo nombre
if not update and not overwrite:
fnme, fext = os.path.splitext(path)
i = 1
while os.path.isfile(path):
path = fnme + "(" + str(i) +")" + fext
i += 1
try:
fh = open(path, "wb")
while True:
b = f.read(4096)
if not b:
break
nbitsmutx.acquire()
nbits += len(b)
nbitsmutx.release()
fh.write(b)
fh.close()
except (IOError, URLError) as e:
if debug == True: raise e
else: return False
except Exception as e:
if debug == True: raise e
else: return False
return True
def saveimages(ilist, dpath):
global nbits
path = os.path.abspath(dpath)
try:
os.makedirs(path)
except FileExistsError:
pass
print("Descargando {} imágenes en \n[{}]".format(len(ilist), path))
iqueue = queue.Queue()
oqueue = queue.Queue()
threads = []
for i in range(4):
thr = threading.Thread(target=subproc, args=(iqueue, oqueue))
thr.daemon = True
thr.start()
threads.append(thr)
for img in ilist:
if not img[0]:
continue
link = img[0]
name = img[1]
if img[2]:
name = img[2]
iqueue.put((link, os.path.join(path, name)))
f = 0
i = 0
try:
while i < len(ilist):
while not oqueue.empty():
r = oqueue.get()
print("\r..." + r[0][8:], end=" ")
if not r[1]:
print("[FAILED]", end="")
f += 1
print()
i += 1
print("\r{}Kb".format(nbits >> 10), end="")
time.sleep(0.15)
except KeyboardInterrupt:
exit(1)
print("\r{}Kb".format(nbits >> 10))
print("Terminado: archivos descargados {}, errores {}".format(i - f, f))
# Traducimos algunos mensajes, para agregar mas idiomas véase también https://stackoverflow.com/questions/22951442/how-to-make-pythons-argparse-generate-non-english-text/28836537#28836537
def convertArgparseMessages(s):
subDict = \
{'positional arguments':'Argumentos posicionales',
'optional arguments':'Argumentos opcionales',
'usage: ':'Uso: ',
'the following arguments are required: %s':'los siguientes parámetros son requeridos: %s'
#'show this help message and exit':'Affiche ce message et quitte'
}
if s in subDict:
s = subDict[s]
return s
gettext.gettext = convertArgparseMessages
import argparse
if name == "main":
parser = argparse.ArgumentParser(add_help=False, description=('Descarga los archivos adjuntos de un hilo de Hispachan.'))
parser.add_argument('url', help='Enlace del hilo o identificador en la forma "tablón/hilo".')
parser.add_argument('destino', nargs='?', help='Directorio en donde se guardaran los archivos (por defecto se descargan en el directorio actual).', default=os.getcwd())
parser.add_argument( '-h', '-help', action='help', default=argparse.SUPPRESS, help='Muestra este mensaje de ayuda y sale.')
parser.add_argument('-n', '-no-subfolder', dest='subfolder', help='Omite la creación de una subcarpeta para las imágenes.', default=True, action='store_false')
parser.add_argument('-o', '-overwrite', dest="overwrite", help='Sobrescribe los archivos con el mismo nombre.', default=False, action='store_true')
parser.add_argument('-u', '-update', dest="update", help='Solo descarga los archivos que no existen.', default=False, action='store_true')
parser.add_argument('-d', '-debug', dest="debug", help='Dispara las excepciones para facilitar la detección de bugs.', default=False, action='store_true')
# Si no hay enlace entonces se muestra la ayuda y sale
if len(sys.argv)==1:
parser.print_help()
sys.exit(1)
args = parser.parse_args(sys.argv[1:])
# Asignamos algunas variables globales predefinidas en el script
s = globals()
for option in ["subfolder", "overwrite", "update", "debug"]:
s[option] = getattr(args, option)
r = getthreadinfo(args.url)
url = "https://hispachan.org/{}/res/{}.html".format(r[0], r[1])
try:
ilist = getimglist(url)
if not ilist:
print("error: ningún archivo para descargar")
exit()
dpath = args.destino
if subfolder:
dpath = os.path.join(dpath, r[0], r[1])
saveimages(ilist, dpath)
except KeyboardInterrupt:
exit(1)
except Exception as e:
if debug == True: raise e
else: print("error:", e)
El cambio mas notorio es la incorporación del modulo argparse ( https://docs.python.org/3/library/argparse.html ) para el manejo de las opciones de la linea de comandos en lugar de hacerlo de forma "espartana" como hasta ahora (se supone que ese modulo esta incluido en Python, por lo que el script sigue manteniéndose sin dependencias externas y tan simple como es posible).
En https://github.com/josevenezuelapadron/hispachan-scraping/pull/6 se pueden ver otros cambios y correcciones menores que hice.