From 0b021b377fae612baeca17e86a73faff5ed9249c Mon Sep 17 00:00:00 2001 From: Zach Halpern Date: Fri, 21 Dec 2018 16:08:26 -0500 Subject: [PATCH] Python3 conversion and Update for MTGJSONv4 --- main.py | 58 +++++++++++++-------------- mtgs_scraper.py | 8 ++-- scryfall_scraper.py | 73 +++++++++++++++++++--------------- spoilers.py | 95 +++++++++++++++++++++++++-------------------- verify_files.py | 4 +- wizards_scraper.py | 16 ++++---- 6 files changed, 136 insertions(+), 118 deletions(-) diff --git a/main.py b/main.py index 4e6d4928..2349d233 100644 --- a/main.py +++ b/main.py @@ -17,10 +17,10 @@ presets = { "isfullspoil": False, # when full spoil comes around, we only want to use WOTC images "includeMasterpieces": True, # if the set has masterpieces, let's get those too "oldRSS": False, # maybe MTGS hasn't updated their spoiler.rss but new cards have leaked - "dumpXML": False, # let travis print XML for testing + "dumpXML": False, # let travis print (XML for testing) # only use Scryfall data (no mtgs for ANY sets) "scryfallOnly": False, - "dumpErrors": True # print the error log from out/errors.json + "dumpErrors": True # print (the error log from out/errors.json) } setinfos = verify_files.load_file('set_info.yml','yaml_multi') @@ -43,27 +43,24 @@ def parseargs(): elif argvalue in ['false', 'False', 'F', 'f']: argvalue = False presets[preset] = argvalue - print "Setting preset " + preset + " to value " + str(argvalue) + print("Setting preset " + preset + " to value " + str(argvalue)) def save_allsets(AllSets): with io.open('out/AllSets.json', 'w', encoding='utf8') as json_file: - data = json.dumps(AllSets, ensure_ascii=False, encoding='utf8', - indent=2, sort_keys=True, separators=(',', ':')) - json_file.write(unicode(data)) + data = json.dumps(AllSets, ensure_ascii=False, indent=2, sort_keys=True, separators=(',', ':')) + json_file.write(data) def save_masterpieces(masterpieces, setinfo): with open('out/' + setinfo['masterpieces']['code'] + '.json', 'w') as outfile: - json.dump(masterpieces, outfile, sort_keys=True, - indent=2, separators=(',', ': ')) + json.dump(masterpieces, outfile, sort_keys=True, indent=2, separators=(',', ': ')) def save_setjson(mtgs, filename): with io.open('out/' + filename + '.json', 'w', encoding='utf8') as json_file: - data = json.dumps(mtgs, ensure_ascii=False, encoding='utf8', - indent=2, sort_keys=True, separators=(',', ':')) - json_file.write(unicode(data)) + data = json.dumps(mtgs, ensure_ascii=False, indent=2, sort_keys=True, separators=(',', ':')) + json_file.write(data) def save_errorlog(errorlog): @@ -77,31 +74,31 @@ def save_xml(xmlstring, outfile): else: append_or_write = 'w' with open(outfile, append_or_write) as xmlfile: - xmlfile.write(xmlstring.encode('utf-8')) + xmlfile.write(xmlstring) def verify_xml(file, schema): try: schema_doc = etree.fromstring(schema) except Exception as e: - print "XSD for " + file + " is invalid" - print schema - print e + print ("XSD for " + file + " is invalid") + print (schema) + print (e) return False xml_schema = etree.XMLSchema(schema_doc) try: xml_doc = etree.parse(file) except Exception as e: - print "XML file " + file + " is invalid" - print e + print ("XML file " + file + " is invalid") + print (e) return False try: xml_schema.assert_(xml_doc) except: xsd_errors = xml_schema.error_log - print "Errors validating XML file " + file + " against XSD:" + print ("Errors validating XML file " + file + " against XSD:") for error in xsd_errors: - print error + print (error) sys.exit("Error: " + file + " does not pass Cockatrice XSD validation.") return False return True @@ -112,10 +109,13 @@ if __name__ == '__main__': AllSets = spoilers.get_allsets() # get AllSets from mtgjson combinedjson = {} noCards = [] + del AllSets['RNA'] for setinfo in setinfos: if setinfo['code'] in AllSets: - print "Found " +setinfo['code']+ " set from set_info.yml in MTGJSON, not adding it" + print ("Found " +setinfo['code']+ " set from set_info.yml in MTGJSON, not adding it") continue + + print("Handling {}".format(setinfo['code'])) if presets['oldRSS'] or 'noRSS' in setinfo and setinfo['noRSS']: mtgs = {"cards": []} else: @@ -174,22 +174,22 @@ if __name__ == '__main__': save_xml(spoilers.pretty_xml('out/spoiler.xml'), 'out/spoiler.xml') cockatrice_xsd = requests.get('https://raw.githubusercontent.com/Cockatrice/Cockatrice/master/doc/cards.xsd').text if verify_xml('out/spoiler.xml', cockatrice_xsd): # check if our XML passes Cockatrice's XSD - print 'spoiler.xml passes Cockatrice XSD verification' + print ('spoiler.xml passes Cockatrice XSD verification') else: - print 'spoiler.xml fails Cockatrice XSD verification' + print ('spoiler.xml fails Cockatrice XSD verification') errorlog = spoilers.remove_corrected_errors(errorlog, card_corrections) save_errorlog(errorlog) save_allsets(AllSets) # save_setjson(mtgjson) if presets['dumpXML']: - print '' + print ('') with open('out/spoiler.xml', 'r') as xmlfile: - print xmlfile.read() - print '' + print (xmlfile.read()) + print ('') if presets['dumpErrors']: if errorlog != {}: - print '//----- DUMPING ERROR LOG -----' - print yaml.safe_dump(errorlog, default_flow_style=False) - print '//----- END ERROR LOG -----' + print ('//----- DUMPING ERROR LOG -----') + print (yaml.safe_dump(errorlog, default_flow_style=False)) + print ('//----- END ERROR LOG -----') else: - print "No Detected Errors!" + print ("No Detected Errors!") diff --git a/mtgs_scraper.py b/mtgs_scraper.py index 6f36de37..0bc4b794 100644 --- a/mtgs_scraper.py +++ b/mtgs_scraper.py @@ -38,7 +38,7 @@ def parse_mtgs(mtgs, manual_cards=[], card_corrections=[], delete_cards=[], rela gallery_list = list_mtgs_gallery(setinfo['mtgsurl']) for card in cards: if card['name'] not in gallery_list: - print "Removing card scraped from MTGS RSS but not in their gallery: " + card['name'] + print ("Removing card scraped from MTGS RSS but not in their gallery: " + card['name']) cards.remove(card) for card in cards: @@ -54,7 +54,7 @@ def parse_mtgs(mtgs, manual_cards=[], card_corrections=[], delete_cards=[], rela htmltags = re.compile(r'<.*?>') card['rules'] = htmltags.sub('', card['rules']) if '//' in card['name'] or 'Aftermath' in card['rules']: - print 'Splitting up Aftermath card ' + card['name'] + print ('Splitting up Aftermath card ' + card['name']) card1 = card.copy() card2 = dict(cost='', cmc='', img='', pow='', name='', rules='', type='', color='', altname='', colorIdentity='', colorArray=[], colorIdentityArray=[], setnumber='', rarity='') @@ -177,7 +177,7 @@ def parse_mtgs(mtgs, manual_cards=[], card_corrections=[], delete_cards=[], rela if 'number' in card: if 'b' in card['number'] or 'a' in card['number']: if not 'layout' in card: - print card['name'] + " has a a/b number but no 'layout'" + print (card['name'] + " has a a/b number but no 'layout'") card['type'] = card['type'].replace('instant', 'Instant').replace( 'sorcery', 'Sorcery').replace('creature', 'Creature') if '-' in card['type']: @@ -201,7 +201,7 @@ def parse_mtgs(mtgs, manual_cards=[], card_corrections=[], delete_cards=[], rela # may force 'special' in the future if card['rarity'] not in ['Mythic Rare', 'Rare', 'Uncommon', 'Common', 'Special', 'Basic Land']: #errors.append({"name": card['name'], "key": "rarity", "value": card['rarity']}) - print card['name'] + ' has rarity = ' + card['rarity'] + print (card['name'] + ' has rarity = ' + card['rarity']) if subtypes: cardjson['subtypes'] = subtypes cardjson["rarity"] = card['rarity'] diff --git a/scryfall_scraper.py b/scryfall_scraper.py index 7b6b4b1a..a25aba86 100644 --- a/scryfall_scraper.py +++ b/scryfall_scraper.py @@ -12,20 +12,20 @@ def get_scryfall(setUrl='https://api.scryfall.com/cards/search?q=++e:xln'): while setDone == False: setcards = requests.get(setUrl) setcards = setcards.json() - if setcards.has_key('data'): + if 'data' in setcards.keys(): scryfall.append(setcards['data']) else: setDone = True - print 'No Scryfall data' + print ('No Scryfall data') scryfall = [''] time.sleep(.1) # 100ms sleep, see "Rate Limits and Good Citizenship" at https://scryfall.com/docs/api - if setcards.has_key('has_more'): + if 'has_more' in setcards.keys(): if setcards['has_more']: setUrl = setcards['next_page'] else: setDone = True else: - print 'Scryfall does not "has_more"' + print ('Scryfall does not "has_more"') setDone = True if not scryfall[0] == '': import json @@ -38,6 +38,10 @@ def get_scryfall(setUrl='https://api.scryfall.com/cards/search?q=++e:xln'): else: return {'cards': []} +def merge_two_dicts(x, y): + z = x.copy() # start with x's keys and values + z.update(y) # modifies z with y's keys and values & returns None + return z def convert_scryfall(scryfall): cards2 = [] @@ -53,8 +57,8 @@ def convert_scryfall(scryfall): cardNoFaces[key] = card[key] cardNoFaces['layout'] = 'double-faced' cardNoFaces['names'] = [card['card_faces'][0]['name'], card['card_faces'][1]['name']] - card1 = dict(cardNoFaces.items() + card['card_faces'][0].items()) - card2 = dict(cardNoFaces.items() + card['card_faces'][1].items()) + card1 = merge_two_dicts(cardNoFaces, card['card_faces'][0]) + card2 = merge_two_dicts(cardNoFaces, card['card_faces'][1]) card1['collector_number'] = card1['collector_number'] + 'a' card2['collector_number'] = card2['collector_number'] + 'b' scryfall2.append(card1) @@ -64,9 +68,14 @@ def convert_scryfall(scryfall): for key in card: if key != 'card_faces': cardNoFaces[key] = card[key] + cardNoFaces['names'] = [card['card_faces'][0]['name'], card['card_faces'][1]['name']] - card1 = dict(cardNoFaces.items() + card['card_faces'][0].items()) - card2 = dict(cardNoFaces.items() + card['card_faces'][1].items()) + + # print("CZZ: {}".format(cardNoFaces)) + # print("CZZ: {}".format(card)) + + card1 = merge_two_dicts(cardNoFaces, card['card_faces'][0]) + card2 = merge_two_dicts(cardNoFaces, card['card_faces'][1]) card1['collector_number'] = str(card['collector_number']) + "a" card2['collector_number'] = str(card['collector_number']) + "b" scryfall2.append(card1) @@ -81,7 +90,7 @@ def convert_scryfall(scryfall): card2['cmc'] = int(card['cmc']) if 'names' in card: card2['names'] = card['names'] - if card.has_key('mana_cost'): + if 'mana_cost' in card.keys(): card2['manaCost'] = card['mana_cost'].replace( '{', '').replace('}', '') else: @@ -90,7 +99,7 @@ def convert_scryfall(scryfall): card2['number'] = card['collector_number'] card2['rarity'] = card['rarity'].replace( 'mythic', 'mythic rare').title() - if card.has_key('oracle_text'): + if 'oracle_text' in card.keys(): card2['text'] = card['oracle_text'].replace( u"\u2014", '-').replace(u"\u2212", "-") else: @@ -120,39 +129,39 @@ def convert_scryfall(scryfall): if 'Basic Land' in card['type_line']: card2['rarity'] = "Basic Land" if 'Legendary' in card['type_line']: - if card2.has_key('supertypes'): + if 'supertypes' in card2.keys(): card2['supertypes'].append('Legendary') else: card2['supertypes'] = ['Legendary'] if 'Snow' in card['type_line']: - if card2.has_key('supertypes'): + if 'supertypes' in card2.keys(): card2['supertypes'].append('Snow') else: card2['supertypes'] = ['Snow'] if 'Elite' in card['type_line']: - if card2.has_key('supertypes'): + if 'supertypes' in card2.keys(): card2['supertypes'].append('Elite') else: card2['supertypes'] = ['Elite'] if 'Basic' in card['type_line']: - if card2.has_key('supertypes'): + if 'supertypes' in card2.keys(): card2['supertypes'].append('Basic') else: card2['supertypes'] = ['Basic'] if 'World' in card['type_line']: - if card2.has_key('supertypes'): + if 'supertypes' in card2.keys(): card2['supertypes'].append('World') else: card2['supertypes'] = ['World'] if 'Ongoing' in card['type_line']: - if card2.has_key('supertypes'): + if 'supertypes' in card2.keys(): card2['supertypes'].append('Ongoing') else: card2['supertypes'] = ['Ongoing'] card2['types'] = cardtypes - if card.has_key('color_identity'): + if 'color_identity' in card.keys(): card2['colorIdentity'] = card['color_identity'] - if card.has_key('colors'): + if 'colors' in card.keys(): if not card['colors'] == []: card2['colors'] = [] if 'W' in card['colors']: @@ -166,28 +175,28 @@ def convert_scryfall(scryfall): if 'G' in card['colors']: card2['colors'].append("Green") #card2['colors'] = card['colors'] - if card.has_key('all_parts'): + if'all_parts' in card.keys(): card2['names'] = [] for partname in card['all_parts']: card2['names'].append(partname['name']) - if card.has_key('power'): + if'power' in card.keys(): card2['power'] = card['power'] - if card.has_key('toughness'): + if'toughness' in card.keys(): card2['toughness'] = card['toughness'] - if card.has_key('layout'): + if'layout' in card.keys(): if card['layout'] != 'normal': card2['layout'] = card['layout'] - if card.has_key('loyalty'): + if'loyalty' in card.keys(): card2['loyalty'] = card['loyalty'] - if card.has_key('artist'): + if'artist' in card.keys(): card2['artist'] = card['artist'] - # if card.has_key('source'): + # if'source' in card.keys(): # card2['source'] = card['source'] - # if card.has_key('rulings'): + # if'rulings' in card.keys(): # card2['rulings'] = card['rulings'] - if card.has_key('flavor_text'): + if'flavor_text' in card.keys(): card2['flavor'] = card['flavor_text'] - if card.has_key('multiverse_id'): + if'multiverse_id' in card.keys(): card2['multiverseid'] = card['multiverse_id'] cards2.append(card2) @@ -204,19 +213,19 @@ def smash_mtgs_scryfall(mtgs, scryfall): if key in mtgscard: if not mtgscard[key] == scryfallcard[key]: try: - print "%s's key %s\nMTGS : %s\nScryfall: %s" % (mtgscard['name'], key, mtgscard[key], scryfallcard[key]) + print ("%s's key %s\nMTGS : %s\nScryfall: %s" % (mtgscard['name'], key, mtgscard[key], scryfallcard[key])) except: - print "Error printing Scryfall vs MTGS debug info for " + mtgscard['name'] + print ("Error printing Scryfall vs MTGS debug info for " + mtgscard['name']) pass cardFound = True if not cardFound: - print "MTGS has card %s and Scryfall does not." % mtgscard['name'] + print ("MTGS has card %s and Scryfall does not." % mtgscard['name']) for scryfallcard in scryfall['cards']: cardFound = False for mtgscard in mtgs['cards']: if scryfallcard['name'] == mtgscard['name']: cardFound = True if not cardFound: - print "Scryfall has card %s and MTGS does not." % scryfallcard['name'] + print ("Scryfall has card %s and MTGS does not." % scryfallcard['name']) return mtgs diff --git a/spoilers.py b/spoilers.py index 348632a3..dd8b2897 100644 --- a/spoilers.py +++ b/spoilers.py @@ -3,6 +3,7 @@ import requests import re import os from lxml import html +import lzma import datetime import json import mtgs_scraper @@ -89,7 +90,7 @@ def correct_cards(mtgjson, manual_cards=[], card_corrections=[], delete_cards=[] mtgjson2.append(manualCard) manual_added.append(manualCard['name']) if manual_added != []: - print "Manual Cards Added: " + str(manual_added).strip('[]') + print ("Manual Cards Added: " + str(manual_added).strip('[]')) mtgjson = {"cards": mtgjson2} transforms = {} @@ -424,7 +425,7 @@ def write_xml(mtgjson, code, name, releaseDate): "\n" "\n" "\n") - # print mtgjson + # print (mtgjson) for card in mtgjson["cards"]: if 'names' in card: if 'layout' in card and card['layout'] != 'double-faced': @@ -434,24 +435,24 @@ def write_xml(mtgjson, code, name, releaseDate): newest = card["name"] count += 1 name = card["name"] - if card.has_key("manaCost"): + if "manaCost" in card.keys(): manacost = card["manaCost"].replace('{', '').replace('}', '') else: manacost = "" - if card.has_key("power") or card.has_key("toughness"): + if "power" in card.keys() or "toughness" in card.keys(): if card["power"]: pt = str(card["power"]) + "/" + str(card["toughness"]) else: pt = 0 else: pt = 0 - if card.has_key("text"): + if "text" in card.keys(): text = card["text"] else: text = "" cardcmc = str(card['cmc']) cardtype = card["type"] - if card.has_key("names"): + if "names" in card.keys(): if "layout" in card: if card['layout'] == 'split' or card['layout'] == 'aftermath': if 'names' in card: @@ -470,15 +471,15 @@ def write_xml(mtgjson, code, name, releaseDate): name += " // " + jsoncard['name'] elif card['layout'] == 'double-faced': if not 'names' in card: - print card['name'] + ' is double-faced but no "names" key' + print (card['name'] + ' is double-faced but no "names" key') else: for dfcname in card['names']: if dfcname != card['name']: related = dfcname else: - print card["name"] + " has names, but layout != split, aftermath, or double-faced" + print (card["name"] + " has names, but layout != split, aftermath, or double-faced") else: - print card["name"] + " has multiple names and no 'layout' key" + print (card["name"] + " has multiple names and no 'layout' key") tablerow = "1" if "Land" in cardtype: @@ -494,17 +495,17 @@ def write_xml(mtgjson, code, name, releaseDate): if 'b' in str(card['number']): if 'layout' in card: if card['layout'] == 'split' or card['layout'] == 'aftermath': - # print "We're skipping " + card['name'] + " because it's the right side of a split card" + # print ("We're skipping " + card['name'] + " because it's the right side of a split card") continue cardsxml.write("\n") - cardsxml.write("" + name.encode('utf-8') + "\n") + cardsxml.write("" + name + "\n") cardsxml.write( '' + code + '\n') cardsxml.write( - "" + manacost.encode('utf-8') + "\n") + "" + manacost + "\n") cardsxml.write("" + cardcmc + "\n") - if card.has_key('colors'): + if 'colors' in card.keys(): colorTranslate = { "White": "W", "Blue": "U", @@ -517,17 +518,17 @@ def write_xml(mtgjson, code, name, releaseDate): '' + colorTranslate[color] + '\n') if name + ' enters the battlefield tapped' in text: cardsxml.write("1\n") - cardsxml.write("" + cardtype.encode('utf-8') + "\n") + cardsxml.write("" + cardtype + "\n") if pt: cardsxml.write("" + pt + "\n") - if card.has_key('loyalty'): + if 'loyalty' in card.keys(): cardsxml.write("" + str(card['loyalty']) + "\n") cardsxml.write("" + tablerow + "\n") - cardsxml.write("" + text.encode('utf-8') + "\n") + cardsxml.write("" + text + "\n") if related: # for relatedname in related: cardsxml.write( - "" + related.encode('utf-8') + "\n") + "" + related + "\n") related = '' cardsxml.write("\n") @@ -535,13 +536,13 @@ def write_xml(mtgjson, code, name, releaseDate): cardsxml.write("\n") if count > 0: - print 'XML Stats for ' + code - print 'Total cards: ' + str(count) + print ('XML Stats for ' + code) + print ('Total cards: ' + str(count)) if dfccount > 0: - print 'DFC: ' + str(dfccount) - print 'Newest: ' + str(newest) + print ('DFC: ' + str(dfccount)) + print ('Newest: ' + str(newest)) else: - print 'Set ' + code + ' has no spoiled cards.' + print ('Set ' + code + ' has no spoiled cards.') def write_combined_xml(mtgjson, setinfos): @@ -587,24 +588,24 @@ def write_combined_xml(mtgjson, setinfos): newest = card["name"] count += 1 name = card["name"] - if card.has_key("manaCost"): + if "manaCost" in card.keys(): manacost = card["manaCost"].replace('{', '').replace('}', '') else: manacost = "" - if card.has_key("power") or card.has_key("toughness"): + if "power" in card.keys() or "toughness" in card.keys(): if card["power"]: pt = str(card["power"]) + "/" + str(card["toughness"]) else: pt = 0 else: pt = 0 - if card.has_key("text"): + if "text" in card.keys(): text = card["text"] else: text = "" cardcmc = str(card['cmc']) cardtype = card["type"] - if card.has_key("names"): + if "names" in card.keys(): if "layout" in card: if card["layout"] != 'split' and card["layout"] != 'aftermath': if len(card["names"]) > 1: @@ -628,7 +629,7 @@ def write_combined_xml(mtgjson, setinfos): text += "\n---\n" + cardb["text"] name += " // " + cardb['name'] else: - print card["name"] + " has multiple names and no 'layout' key" + print (card["name"] + " has multiple names and no 'layout' key") tablerow = "1" if "Land" in cardtype: @@ -644,14 +645,14 @@ def write_combined_xml(mtgjson, setinfos): if 'b' in card['number']: if 'layout' in card: if card['layout'] == 'split' or card['layout'] == 'aftermath': - # print "We're skipping " + card['name'] + " because it's the right side of a split card" + # print ("We're skipping " + card['name'] + " because it's the right side of a split card") continue cardsxml.write("\n") - cardsxml.write("" + name.encode('utf-8') + "\n") + cardsxml.write("" + name + "\n") cardsxml.write( '' + setcode + '\n') - if card.has_key('colors'): + if 'colors' in card.keys(): colorTranslate = { "White": "W", "Blue": "U", @@ -665,30 +666,30 @@ def write_combined_xml(mtgjson, setinfos): if related: # for relatedname in related: cardsxml.write( - "" + related.encode('utf-8') + "\n") + "" + related + "\n") related = '' cardsxml.write( - "" + manacost.encode('utf-8') + "\n") + "" + manacost + "\n") cardsxml.write("" + cardcmc + "\n") - cardsxml.write("" + cardtype.encode('utf-8') + "\n") + cardsxml.write("" + cardtype + "\n") if pt: cardsxml.write("" + pt + "\n") cardsxml.write("" + tablerow + "\n") - cardsxml.write("" + text.encode('utf-8') + "\n") + cardsxml.write("" + text + "\n") if name + ' enters the battlefield tapped' in text: cardsxml.write("1\n") - if card.has_key('loyalty'): + if 'loyalty' in card.keys(): cardsxml.write( "" + str(card['loyalty']) + "\n") cardsxml.write("\n") cardsxml.write("\n") - print 'XML COMBINED STATS' - print 'Total cards: ' + str(count) + print ('XML COMBINED STATS') + print ('Total cards: ' + str(count)) if dfccount > 0: - print 'DFC: ' + str(dfccount) - print 'Newest: ' + str(newest) + print ('DFC: ' + str(dfccount)) + print ('Newest: ' + str(newest)) def pretty_xml(infile): @@ -757,7 +758,7 @@ def make_masterpieces(headers, AllSets, spoil): matched = True break if not matched: - print "We couldn't find a card object to assign the data to for masterpiece " + masterpiece['name'] + print ("We couldn't find a card object to assign the data to for masterpiece " + masterpiece['name']) masterpieces2.append(masterpiece) mpsjson = { "name": headers['name'], @@ -779,11 +780,19 @@ def set_has_cards(setinfo, manual_cards, mtgjson): if set == setinfo['code']: return True +def download_file(url): + local_filename = url.split('/')[-1] + headers = {'user-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko / 20071127 Firefox / 2.0.0.11'} + r = requests.get(url, stream=True, headers=headers) + with open(local_filename, 'wb') as f: + for chunk in r.iter_content(chunk_size=1024): + if chunk: # filter out keep-alive new chunks + f.write(chunk) + return local_filename def get_allsets(): - headers = {'user-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko / 20071127 Firefox / 2.0.0.11'} - json_file = requests.get('http://mtgjson.com/json/AllSets.json', headers=headers) - AllSets = json.loads(json_file.text) + file_location = download_file('https://mtgjson.com/json/AllSets.json.xz') + AllSets = json.loads(lzma.open(file_location).read()) return AllSets diff --git a/verify_files.py b/verify_files.py index c8163eb3..fff97227 100644 --- a/verify_files.py +++ b/verify_files.py @@ -12,7 +12,7 @@ def load_file(input_file, lib_to_use): output_file.append(doc) return output_file except Exception as ex: - print "Unable to load file: " + input_file + "\nException information:\n" + str(ex.args) + print ("Unable to load file: " + input_file + "\nException information:\n" + str(ex.args)) sys.exit("Unable to load file: " + input_file) if __name__ == '__main__': @@ -21,4 +21,4 @@ if __name__ == '__main__': card_corrections = load_file('cards_corrections.yml','yaml') delete_cards = load_file('cards_delete.yml','yaml') - print "Pre-flight: All input files loaded successfully." + print ("Pre-flight: All input files loaded successfully.") diff --git a/wizards_scraper.py b/wizards_scraper.py index f317cd97..eaa0389d 100644 --- a/wizards_scraper.py +++ b/wizards_scraper.py @@ -40,7 +40,7 @@ def scrape_fullspoil(url="http://magic.wizards.com/en/articles/archive/card-imag cards.append(card) cardcount += 1 fullspoil = {"cards": cards} - print "Spoil Gallery has " + str(cardcount) + " cards." + print ("Spoil Gallery has " + str(cardcount) + " cards.") download_images(fullspoil['cards'], setinfo['code']) fullspoil = get_rarities_by_symbol(fullspoil, setinfo['code']) fullspoil = get_mana_symbols(fullspoil, setinfo['code']) @@ -90,9 +90,9 @@ def get_rarities_by_symbol(fullspoil, setcode): card['rarity'] = color if variance > highVariance: # if a card isn't close to any of the colors, it's probably a planeswalker? make it mythic. - print card['name'], 'has high variance of', variance, ', closest rarity is', card['rarity'] + print (card['name'], 'has high variance of', variance, ', closest rarity is', card['rarity']) card['rarity'] = "Mythic Rare" - # print card['name'], '$', reds, greens, blues + # print (card['name'], '$', reds, greens, blues) if symbolCount < 10: setSymbol.save( 'images/' + card['name'].replace(' // ', '') + '.symbol.jpg') @@ -195,7 +195,7 @@ def get_mana_symbols(fullspoil={}, setcode="HOU"): closestColor = color if variance < 10: # if card['name'] in ["Mirage Mirror", "Uncage the Menagerie", "Torment of Hailfire"]: - # print card['name'] + " " + str(reds) + " " + str(greens) + " " + str(blues) + # print (card['name'] + " " + str(reds) + " " + str(greens) + " " + str(blues)) if closestColor in ["2", "5"]: twoVSfive = ( manaBox[0] + 1, manaBox[1] + 4, manaBox[2] - 5, manaBox[3] - 2) @@ -248,9 +248,9 @@ def smash_fullspoil(mtgjson, fullspoil): if not match: WOTC_only.append(fullspoil_card['name']) if len(WOTC_only) > 0: - print "WOTC only cards: " - print WOTC_only - print different_keys + print ("WOTC only cards: ") + print (WOTC_only) + print (different_keys) def download_images(mtgjson, setcode): @@ -264,6 +264,6 @@ def download_images(mtgjson, setcode): if card['url']: if os.path.isfile('images/' + setcode + '/' + card['name'].replace(' // ', '') + '.jpg'): continue - # print 'Downloading ' + card['url'] + ' to images/' + setcode + '/' + card['name'].replace(' // ','') + '.jpg' + # print ('Downloading ' + card['url'] + ' to images/' + setcode + '/' + card['name'].replace(' // ','') + '.jpg') requests.get(card['url'], 'images/' + setcode + '/' + card['name'].replace(' // ', '') + '.jpg')