import ujson as json from aiofiles import open as async_open from httpx import AsyncClient, URL from utils.const import AMBR_HOST, PROJECT_ROOT __all__ = ['update_metadata_from_ambr', 'update_metadata_from_github'] client = AsyncClient() async def update_metadata_from_ambr(overwrite: bool = True): result = [] targets = ['material', 'weapon', 'avatar', 'reliquary'] for target in targets: path = PROJECT_ROOT.joinpath(f'metadata/data/{target}.json') if not overwrite and path.exists(): continue url = AMBR_HOST.join(f"v2/chs/{target}") path.parent.mkdir(parents=True, exist_ok=True) response = await client.get(url) json_data = json.loads(response.text)['data']['items'] async with async_open(path, mode='w', encoding='utf-8') as file: data = json.dumps(json_data, ensure_ascii=False) await file.write(data) result.append(json_data) return result async def update_metadata_from_github(overwrite: bool = True): path = PROJECT_ROOT.joinpath('metadata/data/namecard.json') if not overwrite and path.exists(): return host = URL("https://raw.fastgit.org/Dimbreath/GenshinData/master/") text_map_url = host.join("TextMap/TextMapCHS.json") material_url = host.join("ExcelBinOutput/MaterialExcelConfigData.json") text_map_json_data = json.loads((await client.get(text_map_url)).text) material_json_data = json.loads((await client.get(material_url)).text) data = {} for namecard_data in filter(lambda x: x.get('materialType', None) == 'MATERIAL_NAMECARD', material_json_data): name = text_map_json_data[str(namecard_data['nameTextMapHash'])] icon = namecard_data['icon'] navbar = namecard_data['picPath'][0] banner = namecard_data['picPath'][1] rank = namecard_data['rankLevel'] description = text_map_json_data[str(namecard_data['descTextMapHash'])].replace('\\n', '\n') data.update({ str(namecard_data['id']): { "id": namecard_data['id'], "name": name, "rank": rank, "icon": icon, "navbar": navbar, "profile": banner, "description": description, } }) async with async_open(path, mode='w', encoding='utf-8') as file: data = json.dumps(data, ensure_ascii=False) await file.write(data) return data