""" LoRA Loader for WAN 2.2 - references files from lkzd7/WAN2.2_LoraSet_NSFW """ import urllib.parse import re from huggingface_hub import hf_hub_download LORA_REPO = "lkzd7/WAN2.2_LoraSet_NSFW" HF_TOKEN = None LORA_FILES = [ "Blink_Squatting_Cowgirl_Position_I2V_HIGH.safetensors", "Blink_Squatting_Cowgirl_Position_I2V_LOW.safetensors", "PENISLORA_22_i2v_HIGH_e320.safetensors", "PENISLORA_22_i2v_LOW_e496.safetensors", "Pornmaster_wan 2.2_14b_I2V_bukkake_v1.4_high_noise.safetensors", "Pornmaster_wan 2.2_14b_I2V_bukkake_v1.4_low_noise.safetensors", "W22_Multiscene_Photoshoot_Softcore_i2v_HN.safetensors", "W22_Multiscene_Photoshoot_Softcore_i2v_LN.safetensors", "WAN-2.2-I2V-Double-Blowjob-HIGH-v1.safetensors", "WAN-2.2-I2V-Double-Blowjob-LOW-v1.safetensors", "WAN-2.2-I2V-HandjobBlowjobCombo-HIGH-v1.safetensors", "WAN-2.2-I2V-HandjobBlowjobCombo-LOW-v1.safetensors", "WAN-2.2-I2V-SensualTeasingBlowjob-HIGH-v1.safetensors", "WAN-2.2-I2V-SensualTeasingBlowjob-LOW-v1.safetensors", "iGOON_Blink_Blowjob_I2V_HIGH.safetensors", "iGOON_Blink_Blowjob_I2V_LOW.safetensors", "iGoon - Blink_Front_Doggystyle_I2V_HIGH.safetensors", "iGoon - Blink_Front_Doggystyle_I2V_LOW.safetensors", "iGoon - Blink_Missionary_I2V_HIGH.safetensors", "iGoon - Blink_Missionary_I2V_LOW v2.safetensors", "iGoon - Blink_Missionary_I2V_LOW.safetensors", "iGoon%20-%20Blink_Back_Doggystyle_HIGH.safetensors", "iGoon%20-%20Blink_Back_Doggystyle_LOW.safetensors", "iGoon%20-%20Blink_Facial_I2V_HIGH.safetensors", "iGoon%20-%20Blink_Facial_I2V_LOW.safetensors", "iGoon_Blink_Missionary_I2V_HIGH v2.safetensors", "iGoon_Blink_Titjob_I2V_HIGH.safetensors", "iGoon_Blink_Titjob_I2V_LOW.safetensors", "lips-bj_high_noise.safetensors", "lips-bj_low_noise.safetensors", "mql_casting_sex_doggy_kneel_diagonally_behind_vagina_wan22_i2v_v1_high_noise.safetensors", "mql_casting_sex_doggy_kneel_diagonally_behind_vagina_wan22_i2v_v1_low_noise.safetensors", "mql_casting_sex_reverse_cowgirl_lie_front_vagina_wan22_i2v_v1_high_noise.safetensors", "mql_casting_sex_reverse_cowgirl_lie_front_vagina_wan22_i2v_v1_low_noise.safetensors", "mql_casting_sex_spoon_wan22_i2v_v1_high_noise.safetensors", "mql_casting_sex_spoon_wan22_i2v_v1_low_noise.safetensors", "mql_doggy_a_wan22_t2v_v1_high_noise .safetensors", "mql_doggy_a_wan22_t2v_v1_low_noise.safetensors", "mql_massage_tits_wan22_i2v_v1_high_noise.safetensors", "mql_massage_tits_wan22_i2v_v1_low_noise.safetensors", "mql_panties_aside_wan22_i2v_v1_high_noise.safetensors", "mql_panties_aside_wan22_i2v_v1_low_noise.safetensors", "mqlspn_a_wan22_t2v_v1_high_noise.safetensors", "mqlspn_a_wan22_t2v_v1_low_noise.safetensors", "sfbehind_v2.1_high_noise.safetensors", "sfbehind_v2.1_low_noise.safetensors", "sid3l3g_transition_v2.0_H.safetensors", "sid3l3g_transition_v2.0_L.safetensors", "wan2.2_i2v_high_ulitmate_pussy_asshole.safetensors", "wan2.2_i2v_low_ulitmate_pussy_asshole.safetensors", "wan22-mouthfull-140epoc-high-k3nk.safetensors", "wan22-mouthfull-152epoc-low-k3nk.safetensors", ] LORA_PAIRS = {} for f in LORA_FILES: name = urllib.parse.unquote(f).replace(".safetensors", "") is_high = bool(re.search(r'(high|HN|_H\b)', name, re.IGNORECASE)) is_low = bool(re.search(r'(low|LN|_L\b)', name, re.IGNORECASE)) group = re.sub(r'[\s_-]*(high|low|noise|HN|LN)([\s_-]*noise)?[\s_-]*(v?\d+(\.\d+)?)?\s*$', '', name, flags=re.IGNORECASE).strip() group = re.sub(r'[\s_]+$', '', group) if group not in LORA_PAIRS: LORA_PAIRS[group] = {"HIGH": None, "LOW": None} if is_high: LORA_PAIRS[group]["HIGH"] = f elif is_low: LORA_PAIRS[group]["LOW"] = f def get_lora_choices(): choices = [] for group in sorted(LORA_PAIRS.keys()): p = LORA_PAIRS[group] if p["HIGH"] and p["LOW"]: choices.append(group) elif p["HIGH"]: choices.append(f"{group} (HIGH only)") elif p["LOW"]: choices.append(f"{group} (LOW only)") return choices def download_lora(group_name): if not group_name: return None, None clean_name = re.sub(r'\s*\(HIGH only\)|\s*\(LOW only\)', '', group_name) if clean_name not in LORA_PAIRS: return None, None pair = LORA_PAIRS[clean_name] high_path, low_path = None, None if pair["HIGH"]: high_path = hf_hub_download(LORA_REPO, pair["HIGH"], token=HF_TOKEN) if pair["LOW"]: low_path = hf_hub_download(LORA_REPO, pair["LOW"], token=HF_TOKEN) return high_path, low_path def load_lora_to_pipe(pipe, group_name, adapter_name="lora"): high_path, low_path = download_lora(group_name) if high_path and low_path: pipe.load_lora_weights(high_path, adapter_name=f"{adapter_name}_high") pipe.load_lora_weights(low_path, adapter_name=f"{adapter_name}_low") print(f"Loaded LoRA pair: {group_name}") return True elif high_path: pipe.load_lora_weights(high_path, adapter_name=adapter_name) print(f"Loaded LoRA: {group_name}") return True return False def unload_lora(pipe): try: pipe.unload_lora_weights() except: pass