123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #!/usr/bin/python
-
- import urllib2,json,sys
- from lxml.html import document_fromstring
-
- def monster_image(monster):
- opener = urllib2.build_opener()
- opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
- image_html = opener.open('https://www.dndbeyond.com/monsters/'+monster).read()
- # image_html = ' <a href="https://media-waterdeep.cursecdn.com/avatars/thumbnails/0/221/1000/1000/636252765234633232.jpeg" data-lightbox="Bugbear-aside" data-title="<a target='_blank' href='https://media-waterdeep.cursecdn.com/avatars/thumbnails/0/221/1000/1000/636252765234633232.jpeg' class='link link-full'>View Full Image</a>">'
- # pattern = re.compile(".*\<a href=\"([a-zA-Z0-9_\-\/\.:]+)\" data-lightbox=\"\w+-aside")
- # m = pattern.match(image_html)
- # return m.group(1) if m else "NotFound";
- h = document_fromstring(image_html)
- for div in h.cssselect('a'):
- if div.get('data-lightbox') and div.get('data-lightbox').endswith('-aside'):
- return div.get('href')
-
- def subtype(d):
- return " (%s)"%(d) if d else ""
-
- def read_monster(monster):
- opener = urllib2.build_opener()
- opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
- data = json.loads(opener.open('https://api.open5e.com/monsters/'+monster).read())
-
- monster_data = ''
- monster_data += ' {\n'
- monster_data += ' "count": 1,\n'
- monster_data += ' "title": "%s",\n' % (data['name'])
- monster_data += ' "contents": [\n'
- monster_data += ' "subtitle | %s, %s%s, %s | %s",\n' % (data['size'][0], data['type'], subtype(data['subtype']), data['alignment'], data['challenge_rating'])
- monster_data += ' "fill",\n'
- monster_data += ' "rule",\n'
- monster_data += ' "fill",\n'
- monster_data += ' "dndstats | %s | %s | %s | %s | %s | %s",\n' % (data['strength'], data['dexterity'], data['constitution'], data['intelligence'], data['wisdom'], data['charisma'])
- monster_data += ' "fill",\n'
- monster_data += ' "rule",\n'
- monster_data += ' "fill",\n'
- def skill_func(s):
- return "%s: %+d" % (s, int(data['skills'][s]))
- monster_data += ' "property | Skills | %s",\n' % (', '.join(map(skill_func, data['skills'])))
- monster_data += ' "property | Senses | %s",\n' % (data['senses'])
- monster_data += ' "property | Languages | %s",\n' % (data['languages'])
- monster_data += ' "fill",\n'
- monster_data += ' "section | Abilities",\n'
- for ability in data['special_abilities']:
- monster_data += ' "description | %s | %s",\n' % (ability['name'], ability['desc'].replace('\n', '<br />'))
- monster_data += ' "fill",\n'
- monster_data += ' "section | Actions",\n'
- for action in data['actions']:
- monster_data += ' "description | %s | %s",\n' % (action['name'], action['desc'].replace('\n', '<br />'))
- monster_data += ' ""\n'
- monster_data += ' ],\n'
- monster_data += ' "tags": [],\n'
- monster_data += ' "color": "",\n'
- monster_data += ' "title_size": "14",\n'
- monster_data += ' "background_image": "%s",\n' % (monster_image(monster))
- monster_data += ' "icon": "",\n'
- monster_data += ' "stats": "%s|%s|%s"\n' % (data['speed']['walk'], data['hit_points'], data['armor_class'])
- monster_data += ' }\n'
-
- return monster_data
-
- def main():
- if len(sys.argv) == 1:
- print "usage: download.py monster1 [monster2...]"
- return 1
-
- monsters = []
- for m in sys.argv[1:]:
- sys.stderr.write("downloading " + m + "\n")
- monsters.append(read_monster(m))
-
- print("[%s]" % (",\n".join(monsters)))
-
- if __name__== "__main__":
- main()
|