| """ |
| 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 |
|
|