Files
personal_development/DownloaderWebApp/app/about_window.py
T
2026-01-03 13:30:35 -05:00

187 lines
7.1 KiB
Python

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}')