112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
import vdf
|
|
import os
|
|
from pathlib import Path
|
|
import questionary
|
|
from pyfiglet import Figlet
|
|
|
|
library_folders = []
|
|
apps = {}
|
|
|
|
figlet = Figlet()
|
|
|
|
print(figlet.renderText("Steam .desktop Fixer"))
|
|
|
|
if not questionary.confirm(
|
|
"This app will (probably) add a ton of files to your applications folder, you should probably back it up before continuing... (it should normally be at ~/.local/share/applications)"
|
|
).ask():
|
|
print("(that was probably a good idea tbh)")
|
|
exit()
|
|
|
|
DESKTOP_FOLDER = os.path.join(os.path.expanduser("~"), ".local/share/applications")
|
|
|
|
if not os.path.exists(DESKTOP_FOLDER):
|
|
print(
|
|
"how the heck do you not even have a .desktop folder? ur system is too crazy for me."
|
|
)
|
|
exit()
|
|
|
|
LIBRARY_FOLDER_VDF_LOCATION = os.path.join(
|
|
os.path.expanduser("~"), ".local/share/Steam/config/libraryfolders.vdf"
|
|
)
|
|
LIBRARY_FOLDER_VDF_LOCATION = (
|
|
questionary.text(
|
|
"Please enter the location of the steam libraryfolders.vdf file (nothing or default should work for normal installations, not flatpak):",
|
|
default=LIBRARY_FOLDER_VDF_LOCATION,
|
|
).ask()
|
|
or LIBRARY_FOLDER_VDF_LOCATION
|
|
)
|
|
|
|
if not os.path.exists(LIBRARY_FOLDER_VDF_LOCATION):
|
|
print(
|
|
"The file location you gave does not exist, exiting... (searching on google for the location on a flatpak install may help you)"
|
|
)
|
|
exit()
|
|
|
|
IGNORE_APPS = [
|
|
lambda app: "steam" in app["name"].lower(),
|
|
lambda app: "proton" in app["name"].lower(),
|
|
lambda app: "dedicated server" in app["name"].lower(),
|
|
lambda app: "soundtrack" in app["name"].lower(),
|
|
lambda app: "runtime" in app["name"].lower(),
|
|
lambda app: "steamvr" in app["name"].lower(),
|
|
lambda app: "tool" in app["name"].lower(),
|
|
lambda app: "authoring" in app["name"].lower(),
|
|
lambda app: "sdk" in app["name"].lower(),
|
|
lambda app: "are you ready for valve index?" in app["name"].lower(),
|
|
]
|
|
|
|
print("Generating apps list...")
|
|
|
|
library_folders_vdf = vdf.load(open(LIBRARY_FOLDER_VDF_LOCATION, "r"))
|
|
|
|
for steam_library_info in library_folders_vdf["libraryfolders"].values():
|
|
if isinstance(steam_library_info, dict):
|
|
library_folders.append(steam_library_info["path"])
|
|
|
|
for steam_library in library_folders:
|
|
steamapps_dir = os.path.join(steam_library, "steamapps")
|
|
for file in os.listdir(steamapps_dir):
|
|
if Path(file).suffix == ".acf" and file.startswith("appmanifest_"):
|
|
app_manifest = vdf.load(open(os.path.join(steamapps_dir, file)))
|
|
app_info = app_manifest["AppState"]
|
|
apps.update({app_info["appid"]: app_info["name"]})
|
|
|
|
print("Done...")
|
|
|
|
choices = []
|
|
for id, name in apps.items():
|
|
app_dict = {"id": id, "name": name}
|
|
if any(rule(app_dict) for rule in IGNORE_APPS):
|
|
choices.append(questionary.Choice(name, value=app_dict, checked=False))
|
|
else:
|
|
choices.insert(0, questionary.Choice(name, value=app_dict, checked=True))
|
|
|
|
|
|
selected_apps = questionary.checkbox(
|
|
"Please select the games you want to add...", choices
|
|
).ask()
|
|
|
|
if any(
|
|
app["name"] + ".desktop" not in os.listdir(DESKTOP_FOLDER) for app in selected_apps
|
|
):
|
|
print("Creating .desktop files...")
|
|
for app in selected_apps:
|
|
name = app["name"]
|
|
id = app["id"]
|
|
desktop_name = name + ".desktop"
|
|
if not desktop_name in os.listdir(DESKTOP_FOLDER):
|
|
with open(os.path.join(DESKTOP_FOLDER, desktop_name), "w") as f:
|
|
f.write(f"""[Desktop Entry]
|
|
Name={name}
|
|
Comment=Play this game on Steam
|
|
Exec=steam steam://rungameid/{id}
|
|
Icon=steam_icon_{id}
|
|
Terminal=false
|
|
Type=Application
|
|
Categories=Game;""")
|
|
print("Successfully added all the applications (that didn't exist already)!")
|
|
else:
|
|
print(
|
|
"You don't have any apps that need a .desktop to be generated (if you are having a problem, it's probably something else)!"
|
|
)
|