* add `-def1` ... `-def5` arguments, which can be used to generate your preferred custom config if no `-def` argument is provided, `-def1` will be used by default, to automatically copy from the following folders: * `.\_DEFAULT\0` ............... essential emu files, like latest GSE dlls (*steam_api.dll* and *steam_api64.dll*) * `.\_DEFAULT\1` ............... other GSE files and folders, including default ini files * `.\_DEFAULT\<appid>` ... other GSE files and folders, but only for the current `<appid>`, if the folder exists * (Windows only) add some useful helper tools, written in *AutoIt3*: * **gse_acw_helper.exe** - add the required achievements schema db files for *Achievement Watcher*, if .\steam_misc\extra_acw\extra_acw.zip file exists (if generated by `generate_emu_config.exe -acw <appid>`) * **gse_debug_switch.exe** - automatically switch between release and debug versions of the emulator, if *steam_api.7z* / *steam_api64.7z* file exists (or *steamclient.7z* / *steamclient64.7z*, if you use the steamclient version) paths to release and debug files inside 7z, can be customized in .\steam_misc\tools\au3\scripts\gse_debug_switch.ini * **gse_generate_interfaces.exe** - simple x64-x86 launcher for *generate_interfaces.exe* it also writes all found steam interfaces to CODEX *steam_emu.ini* (if generated by `generate_emu_config -cdx <appid>`) make sure to name your original dll to one of these formats, so it can automatically find its interfaces: * `valve_api.dll / valve_api64.dll` * `steam_api.dll.bak / steam_api64.dll.bak` or `steam_api.dll.org / steam_api64.dll.org` * `steam_api.bak / steam_api64.bak` or `steam_api.org / steam_api64.org` * `steam_api_orig.dll / steam_api64_orig.dll` or `steam_api_legit.dll / steam_api64_legit.dll` * **gse_lobby_connect.exe** - simple x64-x86 launcher for *lobby_connect.exe* * new folder structure, compatible with current and future helper tools --- default arguments are `-acw -cdx -clr <appid>` NEVER delete `.\steam_misc\app_backup`, `.\steam_misc\app_info`, `.\steam_misc\tools` and `.\steam_settings` folders MIGHT need `.\steam_misc\extra_acw` and `.\steam_misc\extra_cdx` for compatibility with Achievement Watcher and CODEX * add `-scx` argument to automatically download images / videos for trading cards, backgrounds, badges, emoticons and other tradable items unfortunately I couldn't find any direct steam api method to download the files, so I had to write a rudimentary web scrapper to extract the download links from a third-party website, hence the *scx_gen.py* script might need updating in the future if the website design changes * download screenshots and videos: * download thumbnails for both screenshots and videos, and compress them to `.zip` files * screenshots and videos are now numbered from first to last published, as in the Steam store page * add `-vids_low` / `-vids_max` arguments to download all videos, in low and / or high quality * create / update .\\*top_owners_ids.txt* when .\\*top_owners_ids.html* is present * generate controller action sets txt files for all found controller vdf configs, and zip them inside .\steam_misc\app_backup\app_backup.zip by default, the emu supports only `xboxone` and `xbox360` controller configs, though if the're are any issues with the default supported controller action sets inside .\steam_settings\controller folder, you could try to unpack and overwrite action sets for other unsupported controller configs * (Windows only) add *AdvancedRun* launchers (cmd console + silent) for `.bat` files and `.py` scripts * **[alex47exe]** major overhaul of **migrate_gse** - uses the same `.\_DEFAULT\0` and `.\_DEFAULT\1` folder structure for default configs it can convert old `.txt` format to `.ini` format, minus *branches.json*, which would require using *top_owners_ids.txt* and some login code from **generate_emu_config**, which should actually be used to properly generate the config files, instead of converting from the old `.txt` format * [alex47exe] *generate_interfaces.exe* - find all Steam Interfaces instead of only old ones the emu will ignore the ones it doesn't require, while we'll have the complete list to write it to CODEX *steam_emu.ini* * [alex47exe] *lobby_connect.exe* - improve cmd console text alignment * [alex47exe] `mods_img` instead of `mod_images` (better folder consistency), better example for `mods_img`, minor tweaks to `.ini` and `.md` files
197 lines
7.5 KiB
Python
197 lines
7.5 KiB
Python
import os
|
|
import threading
|
|
import time
|
|
import requests
|
|
|
|
def download_app_images(
|
|
base_out_dir : str,
|
|
appid : int,
|
|
clienticon : str,
|
|
icon : str,
|
|
logo : str,
|
|
logo_small : str):
|
|
|
|
icons_out_dir = os.path.join(base_out_dir, "steam_misc", "app_images")
|
|
|
|
def downloader_thread(image_name : str, image_url : str):
|
|
# try 3 times
|
|
for download_trial in range(3):
|
|
try:
|
|
r = requests.get(image_url)
|
|
if r.status_code == requests.codes.ok: # if download was successfull
|
|
with open(os.path.join(icons_out_dir, image_name), "wb") as f:
|
|
f.write(r.content)
|
|
break
|
|
except Exception as ex:
|
|
pass
|
|
|
|
time.sleep(0.1)
|
|
|
|
app_images_names = [
|
|
r'broadcast_left_panel.jpg',
|
|
r'broadcast_right_panel.jpg',
|
|
r'capsule_231x87.jpg',
|
|
r'capsule_231x87_alt_assets_0.jpg',
|
|
r'capsule_231x87_alt_assets_1.jpg',
|
|
r'capsule_231x87_alt_assets_2.jpg',
|
|
r'capsule_231x87_alt_assets_3.jpg',
|
|
r'capsule_231x87_alt_assets_4.jpg',
|
|
r'capsule_231x87_alt_assets_5.jpg',
|
|
r'capsule_231x87_alt_assets_6.jpg',
|
|
r'capsule_231x87_alt_assets_7.jpg',
|
|
r'capsule_231x87_alt_assets_8.jpg',
|
|
r'capsule_231x87_alt_assets_9.jpg',
|
|
r'capsule_467x181.jpg',
|
|
r'capsule_467x181_alt_assets_0.jpg',
|
|
r'capsule_467x181_alt_assets_1.jpg',
|
|
r'capsule_467x181_alt_assets_2.jpg',
|
|
r'capsule_467x181_alt_assets_3.jpg',
|
|
r'capsule_467x181_alt_assets_4.jpg',
|
|
r'capsule_467x181_alt_assets_5.jpg',
|
|
r'capsule_467x181_alt_assets_6.jpg',
|
|
r'capsule_467x181_alt_assets_7.jpg',
|
|
r'capsule_467x181_alt_assets_8.jpg',
|
|
r'capsule_467x181_alt_assets_9.jpg',
|
|
r'capsule_616x353.jpg',
|
|
r'capsule_616x353_alt_assets_0.jpg',
|
|
r'capsule_616x353_alt_assets_1.jpg',
|
|
r'capsule_616x353_alt_assets_2.jpg',
|
|
r'capsule_616x353_alt_assets_3.jpg',
|
|
r'capsule_616x353_alt_assets_4.jpg',
|
|
r'capsule_616x353_alt_assets_5.jpg',
|
|
r'capsule_616x353_alt_assets_6.jpg',
|
|
r'capsule_616x353_alt_assets_7.jpg',
|
|
r'capsule_616x353_alt_assets_8.jpg',
|
|
r'capsule_616x353_alt_assets_9.jpg',
|
|
r'header.jpg',
|
|
r'header_alt_assets_0.jpg',
|
|
r'header_alt_assets_1.jpg',
|
|
r'header_alt_assets_2.jpg',
|
|
r'header_alt_assets_3.jpg',
|
|
r'header_alt_assets_4.jpg',
|
|
r'header_alt_assets_5.jpg',
|
|
r'header_alt_assets_6.jpg',
|
|
r'header_alt_assets_7.jpg',
|
|
r'header_alt_assets_8.jpg',
|
|
r'header_alt_assets_9.jpg',
|
|
r'hero_capsule.jpg',
|
|
r'hero_capsule_alt_assets_0.jpg',
|
|
r'hero_capsule_alt_assets_1.jpg',
|
|
r'hero_capsule_alt_assets_2.jpg',
|
|
r'hero_capsule_alt_assets_3.jpg',
|
|
r'hero_capsule_alt_assets_4.jpg',
|
|
r'hero_capsule_alt_assets_5.jpg',
|
|
r'hero_capsule_alt_assets_6.jpg',
|
|
r'hero_capsule_alt_assets_7.jpg',
|
|
r'hero_capsule_alt_assets_8.jpg',
|
|
r'hero_capsule_alt_assets_9.jpg',
|
|
r'library_600x900.jpg',
|
|
r'library_600x900_alt_assets_0.jpg',
|
|
r'library_600x900_alt_assets_1.jpg',
|
|
r'library_600x900_alt_assets_2.jpg',
|
|
r'library_600x900_alt_assets_3.jpg',
|
|
r'library_600x900_alt_assets_4.jpg',
|
|
r'library_600x900_alt_assets_5.jpg',
|
|
r'library_600x900_alt_assets_6.jpg',
|
|
r'library_600x900_alt_assets_7.jpg',
|
|
r'library_600x900_alt_assets_8.jpg',
|
|
r'library_600x900_alt_assets_9.jpg',
|
|
r'library_600x900_2x.jpg',
|
|
r'library_600x900_2x_alt_assets_0.jpg',
|
|
r'library_600x900_2x_alt_assets_1.jpg',
|
|
r'library_600x900_2x_alt_assets_2.jpg',
|
|
r'library_600x900_2x_alt_assets_3.jpg',
|
|
r'library_600x900_2x_alt_assets_4.jpg',
|
|
r'library_600x900_2x_alt_assets_5.jpg',
|
|
r'library_600x900_2x_alt_assets_6.jpg',
|
|
r'library_600x900_2x_alt_assets_7.jpg',
|
|
r'library_600x900_2x_alt_assets_8.jpg',
|
|
r'library_600x900_2x_alt_assets_9.jpg',
|
|
r'library_hero.jpg',
|
|
r'library_hero_alt_assets_0.jpg',
|
|
r'library_hero_alt_assets_1.jpg',
|
|
r'library_hero_alt_assets_2.jpg',
|
|
r'library_hero_alt_assets_3.jpg',
|
|
r'library_hero_alt_assets_4.jpg',
|
|
r'library_hero_alt_assets_5.jpg',
|
|
r'library_hero_alt_assets_6.jpg',
|
|
r'library_hero_alt_assets_7.jpg',
|
|
r'library_hero_alt_assets_8.jpg',
|
|
r'library_hero_alt_assets_9.jpg',
|
|
r'page_bg_raw.jpg',
|
|
r'page_bg_raw_alt_assets_0.jpg',
|
|
r'page_bg_raw_alt_assets_1.jpg',
|
|
r'page_bg_raw_alt_assets_2.jpg',
|
|
r'page_bg_raw_alt_assets_3.jpg',
|
|
r'page_bg_raw_alt_assets_4.jpg',
|
|
r'page_bg_raw_alt_assets_5.jpg',
|
|
r'page_bg_raw_alt_assets_6.jpg',
|
|
r'page_bg_raw_alt_assets_7.jpg',
|
|
r'page_bg_raw_alt_assets_8.jpg',
|
|
r'page_bg_raw_alt_assets_9.jpg',
|
|
r'page_bg_generated.jpg',
|
|
r'page_bg_generated_alt_assets_0.jpg',
|
|
r'page_bg_generated_alt_assets_1.jpg',
|
|
r'page_bg_generated_alt_assets_2.jpg',
|
|
r'page_bg_generated_alt_assets_3.jpg',
|
|
r'page_bg_generated_alt_assets_4.jpg',
|
|
r'page_bg_generated_alt_assets_5.jpg',
|
|
r'page_bg_generated_alt_assets_6.jpg',
|
|
r'page_bg_generated_alt_assets_7.jpg',
|
|
r'page_bg_generated_alt_assets_8.jpg',
|
|
r'page_bg_generated_alt_assets_9.jpg',
|
|
r'page_bg_generated_v6b.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_0.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_1.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_2.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_3.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_4.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_5.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_6.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_7.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_8.jpg',
|
|
r'page_bg_generated_v6b_alt_assets_9.jpg',
|
|
r'logo.png'
|
|
]
|
|
|
|
if not os.path.exists(icons_out_dir):
|
|
os.makedirs(icons_out_dir)
|
|
time.sleep(0.050)
|
|
|
|
threads_list : list[threading.Thread] = []
|
|
for image_name in app_images_names:
|
|
image_url = f'https://cdn.cloudflare.steamstatic.com/steam/apps/{appid}/{image_name}'
|
|
t = threading.Thread(target=downloader_thread, args=(image_name, image_url), daemon=True)
|
|
threads_list.append(t)
|
|
t.start()
|
|
|
|
community_images_url = f'https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/{appid}'
|
|
if clienticon:
|
|
image_url = f'{community_images_url}/{clienticon}.ico'
|
|
t = threading.Thread(target=downloader_thread, args=('clienticon.ico', image_url), daemon=True)
|
|
threads_list.append(t)
|
|
t.start()
|
|
|
|
if icon:
|
|
image_url = f'{community_images_url}/{icon}.jpg'
|
|
t = threading.Thread(target=downloader_thread, args=('icon.jpg', image_url), daemon=True)
|
|
threads_list.append(t)
|
|
t.start()
|
|
|
|
if logo:
|
|
image_url = f'{community_images_url}/{logo}.jpg'
|
|
t = threading.Thread(target=downloader_thread, args=('logo.jpg', image_url), daemon=True)
|
|
threads_list.append(t)
|
|
t.start()
|
|
|
|
if logo_small:
|
|
image_url = f'{community_images_url}/{logo_small}.jpg'
|
|
t = threading.Thread(target=downloader_thread, args=('logo_small.jpg', image_url), daemon=True)
|
|
threads_list.append(t)
|
|
t.start()
|
|
|
|
print(f"[ ] Downloading app art images...")
|
|
|
|
for t in threads_list:
|
|
t.join()
|