Applio / assets /themes /loadThemes.py
Vidalnt
fix: :art: Update Applio
39f384e
import json
import os
import importlib
import gradio as gr
import sys
now_dir = os.getcwd()
folder = os.path.join(
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
"assets",
"themes",
)
config_file = os.path.join(now_dir, "assets", "config.json")
sys.path.append(folder)
def read_json_file(filename):
"""Helper function to read a JSON file and return its contents."""
with open(filename, "r", encoding="utf8") as json_file:
return json.load(json_file)
def get_class(filename):
"""Retrieve the name of the first class found in the specified Python file."""
with open(filename, "r", encoding="utf8") as file:
for line in file:
if "class " in line:
class_name = line.split("class ")[1].split(":")[0].split("(")[0].strip()
return class_name
return None
def get_theme_list():
"""Compile a list of available themes from Python files and a JSON file."""
themes_from_files = [
os.path.splitext(name)[0]
for root, _, files in os.walk(folder)
for name in files
if name.endswith(".py") and root == folder
]
json_file_path = os.path.join(folder, "theme_list.json")
themes_from_url = []
try:
themes_from_url = [item["id"] for item in read_json_file(json_file_path)]
except FileNotFoundError:
print("theme_list.json not found, proceeding with available files only.")
return list(set(themes_from_files + themes_from_url))
def select_theme(name):
"""Select a theme by its name, updating the configuration file accordingly."""
selected_file = f"{name}.py"
full_path = os.path.join(folder, selected_file)
config_data = read_json_file(config_file)
if not os.path.exists(full_path):
config_data["theme"]["file"] = None
config_data["theme"]["class"] = name
else:
class_found = get_class(full_path)
if class_found:
config_data["theme"]["file"] = selected_file
config_data["theme"]["class"] = class_found
else:
print(f"Theme class not found in {selected_file}.")
return
with open(config_file, "w", encoding="utf8") as json_file:
json.dump(config_data, json_file, indent=2)
message = f"Theme {name} successfully selected. Restart the application."
print(message)
gr.Info(message)
def load_theme():
"""Load the selected theme based on the configuration file."""
try:
config_data = read_json_file(config_file)
selected_file = config_data["theme"]["file"]
class_name = config_data["theme"]["class"]
if class_name:
if selected_file:
module = importlib.import_module(selected_file[:-3])
obtained_class = getattr(module, class_name)
return obtained_class()
else:
return class_name
else:
print("No valid theme class found.")
return None
except Exception as error:
print(f"An error occurred while loading the theme: {error}")
return None
def read_current_theme():
"""Read the current theme class from the configuration file."""
try:
config_data = read_json_file(config_file)
selected_file = config_data["theme"]["file"]
class_name = config_data["theme"]["class"]
return class_name if class_name else "ParityError/Interstellar"
except Exception as error:
print(f"An error occurred loading the theme: {error}")
return "ParityError/Interstellar"