import gradio as gr from shared.utils.plugins import WAN2GPPlugin import os import shutil import glob from pathlib import Path from datetime import datetime from huggingface_hub import snapshot_download class DownloadsPlugin(WAN2GPPlugin): def __init__(self): super().__init__() def setup_ui(self): self.request_global("get_lora_dir") self.request_global("refresh_lora_list") self.request_component("state") self.request_component("lset_name") self.request_component("loras_choices") self.add_tab( tab_id="downloads", label="Downloads", component_constructor=self.create_downloads_ui, ) def create_downloads_ui(self): with gr.Row(): with gr.Row(scale=2): gr.Markdown("WanGP's Lora Festival ! Press the following button to download i2v Remade_AI Loras collection (and bonuses Loras).") with gr.Row(scale=1): self.download_loras_btn = gr.Button("---> Let the Lora's Festival Start !", scale=1) with gr.Row(scale=1): gr.Markdown("") self.download_status = gr.Markdown() self.download_loras_btn.click( fn=self.download_loras_action, inputs=[], outputs=[self.download_status] ).then( fn=self.refresh_lora_list, inputs=[self.state, self.lset_name, self.loras_choices], outputs=[self.lset_name, self.loras_choices] ) def download_loras_action(self): yield "Please wait while the Loras are being downloaded" lora_dir = self.get_lora_dir("i2v") log_path = os.path.join(lora_dir, "log.txt") if not os.path.isfile(log_path): tmp_path = os.path.join(lora_dir, "tmp_lora_download") snapshot_download(repo_id="DeepBeepMeep/Wan2.1", allow_patterns="loras_i2v/*", local_dir=tmp_path) for f in glob.glob(os.path.join(tmp_path, "loras_i2v", "*")): if os.path.isfile(f): target_file = os.path.join(lora_dir, os.path.basename(f)) if os.path.exists(target_file): os.remove(target_file) shutil.move(f, lora_dir) try: shutil.rmtree(tmp_path) except Exception as e: print(f"Failed to remove tmp_path: {e}") dt = datetime.today().strftime('%Y-%m-%d') tm = datetime.now().strftime('%H:%M:%S') with open(log_path, "w", encoding="utf-8") as writer: writer.write(f"Loras downloaded on {dt} at {tm}") yield "Loras's Festival is successfully STARTED !" else: yield "Loras's Festival is already ON ! (Loras already downloaded)" return