Bez popisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

download.py 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/python
  2. import urllib2,json,sys
  3. from lxml.html import document_fromstring
  4. def monster_image(monster):
  5. opener = urllib2.build_opener()
  6. opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
  7. image_html = opener.open('https://www.dndbeyond.com/monsters/'+monster).read()
  8. # image_html = ' <a href="https://media-waterdeep.cursecdn.com/avatars/thumbnails/0/221/1000/1000/636252765234633232.jpeg" data-lightbox="Bugbear-aside" data-title="&lt;a target=&#x27;_blank&#x27; href=&#x27;https://media-waterdeep.cursecdn.com/avatars/thumbnails/0/221/1000/1000/636252765234633232.jpeg&#x27; class=&#x27;link link-full&#x27;&gt;View Full Image&lt;/a&gt;">'
  9. # pattern = re.compile(".*\<a href=\"([a-zA-Z0-9_\-\/\.:]+)\" data-lightbox=\"\w+-aside")
  10. # m = pattern.match(image_html)
  11. # return m.group(1) if m else "NotFound";
  12. h = document_fromstring(image_html)
  13. for div in h.cssselect('a'):
  14. if div.get('data-lightbox') and div.get('data-lightbox').endswith('-aside'):
  15. return div.get('href')
  16. def subtype(d):
  17. return " (%s)"%(d) if d else ""
  18. def read_monster(monster):
  19. opener = urllib2.build_opener()
  20. opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
  21. data = json.loads(opener.open('https://api.open5e.com/monsters/'+monster).read())
  22. monster_data = ''
  23. monster_data += ' {\n'
  24. monster_data += ' "count": 1,\n'
  25. monster_data += ' "title": "%s",\n' % (data['name'])
  26. monster_data += ' "contents": [\n'
  27. monster_data += ' "subtitle | %s, %s%s, %s | %s",\n' % (data['size'][0], data['type'], subtype(data['subtype']), data['alignment'], data['challenge_rating'])
  28. monster_data += ' "fill",\n'
  29. monster_data += ' "rule",\n'
  30. monster_data += ' "fill",\n'
  31. monster_data += ' "dndstats | %s | %s | %s | %s | %s | %s",\n' % (data['strength'], data['dexterity'], data['constitution'], data['intelligence'], data['wisdom'], data['charisma'])
  32. monster_data += ' "fill",\n'
  33. monster_data += ' "rule",\n'
  34. monster_data += ' "fill",\n'
  35. def skill_func(s):
  36. return "%s: %+d" % (s, int(data['skills'][s]))
  37. monster_data += ' "property | Skills | %s",\n' % (', '.join(map(skill_func, data['skills'])))
  38. monster_data += ' "property | Senses | %s",\n' % (data['senses'])
  39. monster_data += ' "property | Languages | %s",\n' % (data['languages'])
  40. monster_data += ' "fill",\n'
  41. monster_data += ' "section | Abilities",\n'
  42. for ability in data['special_abilities']:
  43. monster_data += ' "description | %s | %s",\n' % (ability['name'], ability['desc'].replace('\n', '<br />'))
  44. monster_data += ' "fill",\n'
  45. monster_data += ' "section | Actions",\n'
  46. for action in data['actions']:
  47. monster_data += ' "description | %s | %s",\n' % (action['name'], action['desc'].replace('\n', '<br />'))
  48. monster_data += ' ""\n'
  49. monster_data += ' ],\n'
  50. monster_data += ' "tags": [],\n'
  51. monster_data += ' "color": "",\n'
  52. monster_data += ' "title_size": "14",\n'
  53. monster_data += ' "background_image": "%s",\n' % (monster_image(monster))
  54. monster_data += ' "icon": "",\n'
  55. monster_data += ' "stats": "%s|%s|%s"\n' % (data['speed']['walk'], data['hit_points'], data['armor_class'])
  56. monster_data += ' }\n'
  57. return monster_data
  58. def main():
  59. if len(sys.argv) == 1:
  60. print "usage: download.py monster1 [monster2...]"
  61. return 1
  62. monsters = []
  63. for m in sys.argv[1:]:
  64. sys.stderr.write("downloading " + m + "\n")
  65. monsters.append(read_monster(m))
  66. print("[%s]" % (",\n".join(monsters)))
  67. if __name__== "__main__":
  68. main()