mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
188 lines
5.6 KiB
Python
188 lines
5.6 KiB
Python
#!/usr/bin/env python3
|
||
|
||
import json
|
||
import os
|
||
import re
|
||
import urllib.request
|
||
|
||
database = 'scryfall-all-cards.json'
|
||
scryfalldburl = 'https://archive.scryfall.com/json/' + database
|
||
# 'scryfall lang code':'ISO 639 lang code'
|
||
languages = {'es': 'es-ES', 'de': 'de-DE',
|
||
'it': 'it-IT', 'zhs': 'zh-CN'}
|
||
langfiles = {'es': None, 'de': None, 'it': None, 'zhs': None}
|
||
|
||
urllib.request.urlretrieve(scryfalldburl, database)
|
||
|
||
# Sort file and remove duplicates
|
||
|
||
|
||
def cleanfile(filename):
|
||
names_seen = set()
|
||
outfile = open(filename + ".tmp2", "w", encoding='utf8')
|
||
with open(filename + ".tmp", "r", encoding='utf8') as r:
|
||
for line in sorted(r):
|
||
name = line.split('|')[0]
|
||
if name not in names_seen:
|
||
outfile.write(line)
|
||
names_seen.add(name)
|
||
outfile.close()
|
||
os.remove(filename + ".tmp")
|
||
|
||
# Manual patch of file translations
|
||
|
||
|
||
def patchtranslations(filename):
|
||
ffinal = open(filename + '.txt', 'w', encoding='utf8')
|
||
try:
|
||
fpatch = open(filename + '-patch.txt', 'r', encoding='utf8')
|
||
except FileNotFoundError:
|
||
open(filename + '-patch.txt', 'w', encoding='utf8').close()
|
||
fpatch = open(filename + '-patch.txt', 'r', encoding='utf8')
|
||
|
||
patchline = fpatch.readline()
|
||
|
||
with open(filename + '.tmp2', 'r', encoding='utf8') as temp:
|
||
for templine in temp:
|
||
tempname = templine.split('|')[0]
|
||
patchname = patchline.split('|')[0]
|
||
if patchname == tempname:
|
||
ffinal.write(patchline)
|
||
patchline = fpatch.readline()
|
||
else:
|
||
ffinal.write(templine)
|
||
|
||
ffinal.close()
|
||
fpatch.close()
|
||
os.remove(filename + '.tmp2')
|
||
|
||
|
||
with open(database, mode='r', encoding='utf8') as json_file:
|
||
# todo:all cards json size >= 800MB,using json iteration library,avoid load all content in to memory.
|
||
data = json.load(json_file)
|
||
|
||
for lang in languages.keys():
|
||
langfiles[lang] = open(
|
||
'cardnames-{0}.tmp'.format(languages[lang]), 'w', encoding='utf8')
|
||
|
||
for card in data:
|
||
if card['lang'] in languages.keys():
|
||
try:
|
||
name = card['name']
|
||
except:
|
||
pass
|
||
|
||
# Parse simple card
|
||
if ' // ' not in name:
|
||
tname = ttype = toracle = ''
|
||
|
||
try:
|
||
tname = card['printed_name']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
ttype = card['printed_type_line']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
toracle = card['printed_text']
|
||
#make zh-CN reminder text work
|
||
toracle = toracle.replace('(','(')
|
||
toracle = toracle.replace(')',')')
|
||
except:
|
||
pass
|
||
|
||
output = name + '|' + tname + '|' + ttype
|
||
output = output + '|' + toracle
|
||
output = output.replace('\n', '\\n')
|
||
output = output + '\n'
|
||
|
||
for lang in languages.keys():
|
||
if card['lang'] == lang:
|
||
langfiles[lang].write(output)
|
||
|
||
# Parse double card
|
||
else:
|
||
tname0 = tname1 = ttype0 = ttype1 = toracle0 = toracle1 = ''
|
||
|
||
cardfaces = card['card_faces']
|
||
|
||
try:
|
||
name0 = cardfaces[0]['name']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
name1 = cardfaces[1]['name']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
tname0 = cardfaces[0]['printed_name']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
tname1 = cardfaces[1]['printed_name']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
ttype0 = cardfaces[0]['printed_type_line']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
ttype1 = cardfaces[1]['printed_type_line']
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
toracle0 = cardfaces[0]['printed_text']
|
||
#make zh-CN reminder text work
|
||
toracle0 = toracle0.replace('(','(')
|
||
toracle0 = toracle0.replace(')',')')
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
toracle1 = cardfaces[1]['printed_text']
|
||
#make zh-CN reminder text work
|
||
toracle1 = toracle1.replace('(','(')
|
||
toracle1 = toracle1.replace(')',')')
|
||
except:
|
||
pass
|
||
|
||
# Output Card0
|
||
|
||
output0 = name0 + '|' + tname0 + '|' + ttype0
|
||
output0 = output0 + '|' + toracle0
|
||
output0 = output0.replace('\n', '\\n')
|
||
|
||
for lang in languages.keys():
|
||
if card['lang'] == lang:
|
||
langfiles[lang].write(output0 + '\n')
|
||
|
||
# Output Card1
|
||
|
||
output1 = name1 + '|' + tname1 + '|' + ttype1
|
||
output1 = output1 + '|' + toracle1
|
||
output1 = output1.replace('\n', '\\n')
|
||
|
||
for lang in languages.keys():
|
||
if card['lang'] == lang:
|
||
langfiles[lang].write(output1 + '\n')
|
||
|
||
for lang in languages.keys():
|
||
langfiles[lang].close()
|
||
|
||
# Sort file and remove duplicates
|
||
for lang in languages.keys():
|
||
cleanfile("cardnames-{0}".format(languages[lang]))
|
||
|
||
# Patch language files
|
||
for lang in languages.keys():
|
||
patchtranslations("cardnames-{0}".format(languages[lang]))
|