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.

update_cards.py 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from urllib.request import Request, urlopen, HTTPError
  2. import json
  3. import sys
  4. import shutil
  5. from pathlib import Path
  6. def save(name, data):
  7. with open(name, 'w', encoding = 'utf8') as file:
  8. json.dump(data, file, ensure_ascii = False, indent = 4, sort_keys = True)
  9. def download(url):
  10. cards = list()
  11. page = 1
  12. nonEmpty = True
  13. while nonEmpty:
  14. request_url = '{}page={}'.format(url, page)
  15. print('Loading page {}...'.format(page))
  16. try:
  17. req = Request(request_url, headers={'User-Agent': 'Mozilla/5.0'})
  18. response = json.loads(urlopen(req).read().decode("utf-8"))
  19. cardsPage = response['cards']
  20. nonEmpty = bool(cardsPage)
  21. if nonEmpty:
  22. cards.extend(cardsPage)
  23. page += 1
  24. except HTTPError as e:
  25. print ('Failed at page {}: {}'.format(page, e.reason))
  26. return cards
  27. names = {}
  28. oracle = {}
  29. oracle_file_name = 'data/oracle.json'
  30. names_file_name = 'data/names.json'
  31. def download_all():
  32. print ("downloading the whole card set")
  33. return download('https://api.magicthegathering.io/v1/cards?')
  34. def download_set(set_name):
  35. print ("downloading set {}".format(set_name))
  36. return download('https://api.magicthegathering.io/v1/cards?set={}&'.format(set_name))
  37. def process_cards(cards):
  38. languages = ['Russian']
  39. ignore = [
  40. {'language': 'Russian', 'name': 'Plunder'},
  41. {'language': 'Russian', 'name': 'Goblin Spelunkers'},
  42. {'language': 'Russian', 'name': 'Raise Dead'},
  43. ]
  44. copy = ['name', 'flavor', 'power', 'toughness', 'colors', 'printings', 'legality', 'manaCost', 'subtypes', 'text', 'layout', 'colorIdentity', 'type', 'types', 'cmc', 'loyalty', 'rulings']
  45. for card in cards:
  46. if card['name'] in names:
  47. if not card['name'] in names[card['name']]:
  48. names[card['name']].append(card['name'])
  49. else:
  50. names[card['name']] = [card['name']]
  51. if 'foreignNames' in card:
  52. for translation in card['foreignNames']:
  53. if translation['name'] and translation['language'] in languages and not {'language': translation['language'], 'name': card['name']} in ignore:
  54. if translation['name'] in names:
  55. if not card['name'] in names[translation['name']]:
  56. print('{} version of "{}": "{}" is named as another card "{}"'.format(translation['language'], card['name'], translation['name'], names[translation['name']]))
  57. names[translation['name']].append(card['name'])
  58. else:
  59. names[translation['name']] = [card['name']]
  60. if not card['name'] in oracle:
  61. oracle[card['name']] = {k: card[k] for k in card if k in copy}
  62. def backup_data_files():
  63. try:
  64. shutil.copyfile(oracle_file_name, oracle_file_name + ".bak")
  65. shutil.copyfile(names_file_name, names_file_name + '.bak')
  66. return True
  67. except shutil.Error:
  68. return False
  69. if len(sys.argv) == 2:
  70. if not Path(oracle_file_name).is_file() or not Path(names_file_name).is_file():
  71. print("oracle of name files don't exist. Exiting")
  72. exit()
  73. if not backup_data_files():
  74. print("failed to create backup files. Exiting")
  75. exit()
  76. with open(names_file_name) as file:
  77. names = json.load(file)
  78. with open(oracle_file_name) as file:
  79. oracle = json.load(file)
  80. cards = download_set(sys.argv[1])
  81. else:
  82. cards = download_all()
  83. process_cards(cards)
  84. save('data/names.json', names)
  85. save('data/oracle.json', oracle)