import threading import customtkinter as ctk import webbrowser import requests from PIL import Image class AboutWindow: def __init__(self, parent, translate, version): self.parent = parent self.translate = translate self.version = version def get_github_data(self): url = "https://api.github.com/repos/Emy69/CoomerDL" try: response = requests.get(url) response.raise_for_status() repo_data = response.json() # Obtener la fecha de creación y las descargas totales (si existen releases) created_at = repo_data.get("created_at", "N/A") created_date = created_at.split("T")[0] if created_at != "N/A" else "N/A" releases_url = repo_data.get("releases_url", "").replace("{/id}", "") releases_response = requests.get(releases_url) releases_response.raise_for_status() releases_data = releases_response.json() total_downloads = sum( asset["download_count"] for release in releases_data for asset in release.get("assets", []) ) if releases_data else 0 return created_date, total_downloads except Exception as e: print(f"Error fetching GitHub data: {e}") return "N/A", 0 def show_about(self): # Crear una nueva ventana about_window = ctk.CTkToplevel(self.parent) about_window.title(self.translate("About")) about_window.geometry("300x600") about_window.resizable(False, False) # Centrar la ventana self.center_window(about_window, 300, 600) # Hacer que la ventana aparezca al frente about_window.transient(self.parent) about_window.lift() about_window.grab_set() # placeholders mientras carga created_date = self.translate("Loading...") total_downloads = self.translate("Loading...") # Crear un marco para el contenido about_frame = ctk.CTkFrame(about_window, corner_radius=15) about_frame.pack(fill="both", expand=True, padx=10, pady=10) # Encabezado estilizado header_label = ctk.CTkLabel( about_frame, text=self.translate("About This App"), font=("Helvetica", 20, "bold"), text_color="white", anchor="w" ) header_label.pack(pady=(10, 5), padx=10, anchor="w") # Cargar las imágenes de los íconos developer_icon = ctk.CTkImage(Image.open("resources/img/iconos/about/user-account-solid-24.png"), size=(20, 20)) version_icon = ctk.CTkImage(Image.open("resources/img/iconos/about/git-branch-line.png"), size=(20, 20)) downloads_icon = ctk.CTkImage(Image.open("resources/img/iconos/about/download_icon.png"), size=(20, 20)) date_icon = ctk.CTkImage(Image.open("resources/img/iconos/about/calendar-event-line.png"), size=(20, 20)) # labels que se actualizarán self.downloads_label = None self.date_label = None details = [ (developer_icon, f"{self.translate('Developer')}: Emy69", None), (version_icon, f"{self.translate('Version')}: {self.version}", None), (downloads_icon, f"{self.translate('Total Downloads')}: {total_downloads}", "downloads"), (date_icon, f"{self.translate('Release Date')}: {created_date}", "date") ] for icon, text, key in details: detail_frame = ctk.CTkFrame(about_frame, fg_color="transparent") detail_frame.pack(anchor="w", pady=5, padx=30) icon_label = ctk.CTkLabel(detail_frame, text="", image=icon) icon_label.pack(side="left", padx=(0, 10)) text_label = ctk.CTkLabel( detail_frame, text=text, font=("Helvetica", 14), text_color="white", justify="left" ) text_label.pack(side="left") if key == "downloads": # agregado self.downloads_label = text_label elif key == "date": # agregado self.date_label = text_label separator = ctk.CTkFrame(about_frame, height=1, fg_color="gray") separator.pack(fill="x", padx=10, pady=10) # Sección de plataformas soportadas supported_label = ctk.CTkLabel( about_frame, text=self.translate("Supported Platforms"), font=("Helvetica", 16, "bold"), text_color="white", anchor="w" ) supported_label.pack(pady=(10, 5), padx=10, anchor="w") # Lista de plataformas con íconos platforms = [ ("coomer.su", "https://coomer.su"), ("kemono.su", "https://kemono.su"), ("erome.com", "https://erome.com"), ("bunkr-albums.io", "https://bunkr-albums.io"), ("simpcity.su", "https://simpcity.su"), ("jpg5.su", "https://jpg5.su") ] for name, url in platforms: # Crear el marco para cada plataforma platform_frame = ctk.CTkFrame(about_frame, fg_color="transparent") platform_frame.pack(anchor="w", pady=5, padx=10) icon_image = ctk.CTkImage(Image.open("resources/img/iconos/about/global-line.png"), size=(20, 20)) icon_label = ctk.CTkLabel(platform_frame, text="", image=icon_image) icon_label.pack(side="left") # Botón con el nombre de la plataforma platform_button = ctk.CTkButton( platform_frame, text=name, font=("Helvetica", 14), fg_color="transparent", hover_color="gray25", command=lambda u=url: webbrowser.open(u) ) platform_button.pack(side="left") # Footer footer_label = ctk.CTkLabel( about_frame, text=self.translate("Thank you for using our app!"), font=("Helvetica", 12, "italic"), text_color="white", anchor="w" ) footer_label.pack(pady=(10, 10), padx=10, anchor="w") # hilo para cargar datos def fetch_and_update(): cd, td = self.get_github_data() def safe_update(): try: if not about_window.winfo_exists(): return if self.date_label and self.date_label.winfo_exists(): self.date_label.configure(text=f"{self.translate('Release Date')}: {cd}") if self.downloads_label and self.downloads_label.winfo_exists(): self.downloads_label.configure(text=f"{self.translate('Total Downloads')}: {td}") except Exception: pass about_window.after(0, safe_update) threading.Thread(target=fetch_and_update, daemon=True).start() def center_window(self, window, width, height): screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() x = int((screen_width / 2) - (width / 2)) y = int((screen_height / 2) - (height / 2)) window.geometry(f'{width}x{height}+{x}+{y}')