Classes/Bases/Skills/Uniques to DB

This commit is contained in:
mikx
2026-06-23 09:12:49 -04:00
commit ba5a438374
7 changed files with 820 additions and 0 deletions

221
importer.py Normal file
View File

@@ -0,0 +1,221 @@
import json
import requests
def download_and_parse_items(url):
"""
Downloads item bases JSON from the given URL and parses it
into a flat structure suitable for MySQL insertion.
"""
print(f"Downloading base items JSON from: {url}")
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=60)
response.raise_for_status()
print("Download completed. Parsing JSON structure...")
raw_data = response.json()
parsed_items = []
for item_id, item_val in raw_data.items():
# Extrapolate requirements
reqs = item_val.get("requirements") or {}
req_level = reqs.get("level")
req_strength = reqs.get("strength")
req_dexterity = reqs.get("dexterity")
req_intelligence = reqs.get("intelligence")
# Extrapolate visual identity
vis = item_val.get("visual_identity") or {}
vis_id = vis.get("id")
vis_dds = vis.get("dds_file")
# Serialize nested lists/dicts to JSON strings
properties = json.dumps(item_val.get("properties")) if item_val.get("properties") is not None else None
tags = json.dumps(item_val.get("tags")) if item_val.get("tags") is not None else None
implicits = json.dumps(item_val.get("implicits")) if item_val.get("implicits") is not None else None
skills_granted = json.dumps(item_val.get("skills_granted")) if item_val.get("skills_granted") is not None else None
# Prepare tuple matching schema order:
# id, name, item_class, inherits_from, domain, drop_level,
# inventory_width, inventory_height, release_state,
# req_level, req_strength, req_dexterity, req_intelligence,
# visual_identity_id, visual_identity_dds,
# properties, tags, implicits, skills_granted
parsed_item = (
item_id,
item_val.get("name", "Unknown Name"),
item_val.get("item_class"),
item_val.get("inherits_from"),
item_val.get("domain", "undefined"),
item_val.get("drop_level"),
item_val.get("inventory_width"),
item_val.get("inventory_height"),
item_val.get("release_state"),
req_level,
req_strength,
req_dexterity,
req_intelligence,
vis_id,
vis_dds,
properties,
tags,
implicits,
skills_granted
)
parsed_items.append(parsed_item)
print(f"Successfully parsed {len(parsed_items)} items from JSON.")
return parsed_items
def download_and_parse_skills(url):
"""
Downloads skill_gems.json from the given URL and parses it
into a flat structure suitable for MySQL insertion.
"""
print(f"Downloading skill gems JSON from: {url}")
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=60)
response.raise_for_status()
print("Download completed. Parsing JSON structure...")
raw_data = response.json()
parsed_skills = []
for skill_id, skill_val in raw_data.items():
base_item = skill_val.get("base_item") or {}
display_name = base_item.get("display_name", "Unknown Name")
release_state = base_item.get("release_state")
req_weights = skill_val.get("requirement_weights") or {}
req_dex = req_weights.get("dexterity", 0)
req_int = req_weights.get("intelligence", 0)
req_str = req_weights.get("strength", 0)
# List structures to be JSON serialized
crafting_types = json.dumps(skill_val.get("crafting_types")) if skill_val.get("crafting_types") is not None else None
grants_skills = json.dumps(skill_val.get("grants_skills")) if skill_val.get("grants_skills") is not None else None
recommended_supports = json.dumps(skill_val.get("recommended_supports")) if skill_val.get("recommended_supports") is not None else None
tags = json.dumps(skill_val.get("tags")) if skill_val.get("tags") is not None else None
# Prepare tuple matching schema order:
# id, display_name, release_state, color, crafting_level, gem_type,
# icon_dds_file, skill_name, support_name, support_text,
# tutorial_video, ui_image,
# req_weight_dexterity, req_weight_intelligence, req_weight_strength,
# crafting_types, grants_skills, recommended_supports, tags
parsed_skill = (
skill_id,
display_name,
release_state,
skill_val.get("color"),
skill_val.get("crafting_level"),
skill_val.get("gem_type"),
skill_val.get("icon_dds_file"),
skill_val.get("skill_name"),
skill_val.get("support_name"),
skill_val.get("support_text"),
skill_val.get("tutorial_video"),
skill_val.get("ui_image"),
req_dex,
req_int,
req_str,
crafting_types,
grants_skills,
recommended_supports,
tags
)
parsed_skills.append(parsed_skill)
print(f"Successfully parsed {len(parsed_skills)} skill gems from JSON.")
return parsed_skills
def download_and_parse_item_classes(url):
"""
Downloads item_classes.json from the given URL and parses it
into a flat structure suitable for MySQL insertion.
"""
print(f"Downloading item classes JSON from: {url}")
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=60)
response.raise_for_status()
print("Download completed. Parsing JSON structure...")
raw_data = response.json()
parsed_classes = []
for class_id, class_val in raw_data.items():
influence_tags = json.dumps(class_val.get("influence_tags")) if class_val.get("influence_tags") is not None else None
# Prepare tuple matching schema order:
# id, category, category_id, name, influence_tags
parsed_class = (
class_id,
class_val.get("category"),
class_val.get("category_id"),
class_val.get("name", "Unknown Name"),
influence_tags
)
parsed_classes.append(parsed_class)
print(f"Successfully parsed {len(parsed_classes)} item classes from JSON.")
return parsed_classes
def download_and_parse_uniques(url):
"""
Downloads uniques.json from the given URL and parses it
into a flat structure suitable for MySQL insertion.
"""
print(f"Downloading uniques JSON from: {url}")
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=60)
response.raise_for_status()
print("Download completed. Parsing JSON structure...")
raw_data = response.json()
parsed_uniques = []
for item_id, item_val in raw_data.items():
# Extrapolate visual identity
vis = item_val.get("visual_identity") or {}
vis_id = vis.get("id")
vis_dds = vis.get("dds_file")
# Prepare tuple matching schema order:
# id, name, unique_id, item_class,
# inventory_width, inventory_height, is_alternate_art,
# visual_identity_id, visual_identity_dds,
# renamed_version, base_version
parsed_unique = (
item_id,
item_val.get("name", "Unknown Name"),
item_val.get("id"),
item_val.get("item_class"),
item_val.get("inventory_width"),
item_val.get("inventory_height"),
item_val.get("is_alternate_art"),
vis_id,
vis_dds,
item_val.get("renamed_version"),
item_val.get("base_version")
)
parsed_uniques.append(parsed_unique)
print(f"Successfully parsed {len(parsed_uniques)} uniques from JSON.")
return parsed_uniques