feat: Simple reserve proxy for china users

This commit is contained in:
Kamisato-Ayaka-233 2024-06-19 22:31:48 +08:00
parent 7d5e990aa9
commit 289052e824
4 changed files with 81 additions and 3 deletions

View File

@ -37,6 +37,11 @@ cache_dir = os.path.join(comfyui_manager_path, '.cache')
cached_config = None
js_path = None
reverse_proxies = {
'ghproxy-mirror': 'https://mirror.ghproxy.com/https://github.com/REPO_NAME',
'hf-mirror': 'https://hf-mirror.com/REPO_NAME'
}
comfy_ui_required_revision = 1930
comfy_ui_required_commit_datetime = datetime(2024, 1, 24, 0, 0, 0)
@ -84,6 +89,26 @@ def get_installed_packages():
return pip_map
def try_to_use_reverse_proxy(url):
policy = get_config()['reverse_proxy_policy']
if not policy:
return url
if reverse_proxy := reverse_proxies.get(policy, 'both'):
print(f"Reverse proxy is '{policy}'")
repo_name = url.split("/", 3)[-1]
if policy == 'both':
if url.startswith('https://github.com'):
return reverse_proxies['ghproxy-mirror'].replace("REPO_NAME", repo_name)
elif url.startswith('https://huggingface.co'):
return reverse_proxies['hf-mirror'].replace("REPO_NAME", repo_name)
else:
if ((url.startswith('https://github.com') and policy == 'ghproxy-mirror') or
(url.startswith('https://huggingface.co') and policy == 'hf-mirror')):
return reverse_proxy.replace("REPO_NAME", repo_name)
return url
def clear_pip_cache():
global pip_map
pip_map = None
@ -201,6 +226,7 @@ def write_config():
"file_logging": get_config()['file_logging'],
'default_ui': get_config()['default_ui'],
'component_policy': get_config()['component_policy'],
'reverse_proxy_policy': get_config()['reverse_proxy_policy'],
'double_click_policy': get_config()['double_click_policy'],
'windows_selector_event_loop_policy': get_config()['windows_selector_event_loop_policy'],
'model_download_by_agent': get_config()['model_download_by_agent'],
@ -236,6 +262,7 @@ def read_config():
'file_logging': default_conf['file_logging'].lower() == 'true' if 'file_logging' in default_conf else True,
'default_ui': default_conf['default_ui'] if 'default_ui' in default_conf else 'none',
'component_policy': default_conf['component_policy'] if 'component_policy' in default_conf else 'workflow',
'reverse_proxy_policy': default_conf['reverse_proxy_policy'] if 'reverse_proxy_policy' in default_conf else 'none',
'double_click_policy': default_conf['double_click_policy'] if 'double_click_policy' in default_conf else 'copy-all',
'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'].lower() == 'true' if 'windows_selector_event_loop_policy' in default_conf else False,
'model_download_by_agent': default_conf['model_download_by_agent'].lower() == 'true' if 'model_download_by_agent' in default_conf else False,
@ -254,6 +281,7 @@ def read_config():
'file_logging': True,
'default_ui': 'none',
'component_policy': 'workflow',
'reverse_proxy_policy': 'none',
'double_click_policy': 'copy-all',
'windows_selector_event_loop_policy': False,
'model_download_by_agent': False,
@ -519,6 +547,8 @@ def gitclone_install(files, instant_execution=False, msg_prefix=''):
if url.endswith("/"):
url = url[:-1]
url = try_to_use_reverse_proxy(url)
try:
print(f"Download: git clone '{url}'")
repo_name = os.path.splitext(os.path.basename(url))[0]
@ -659,6 +689,8 @@ def gitclone_fix(files, instant_execution=False):
if url.endswith("/"):
url = url[:-1]
url = try_to_use_reverse_proxy(url)
try:
repo_name = os.path.splitext(os.path.basename(url))[0]
repo_path = os.path.join(custom_nodes_path, repo_name)

View File

@ -145,6 +145,8 @@ def set_default_ui_mode(mode):
def set_component_policy(mode):
core.get_config()['component_policy'] = mode
def set_reverse_proxy_policy(policy):
core.get_config()['reverse_proxy_policy'] = policy
def set_double_click_policy(mode):
core.get_config()['double_click_policy'] = mode
@ -653,7 +655,6 @@ async def save_snapshot(request):
except:
return web.Response(status=400)
def unzip_install(files):
temp_filename = 'manager-temp.zip'
for url in files:
@ -778,7 +779,6 @@ def copy_set_active(files, is_disable, js_path_name='.'):
print(f"{action_name} was successful.")
return True
@PromptServer.instance.routes.post("/customnode/install")
async def install_custom_node(request):
if not is_allowed_security_level('middle'):
@ -999,6 +999,8 @@ async def install_model(request):
model_url = json_data['url']
if not core.get_config()['model_download_by_agent'] and (
model_url.startswith('https://github.com') or model_url.startswith('https://huggingface.co') or model_url.startswith('https://heibox.uni-heidelberg.de')):
model_url = core.try_to_use_reverse_proxy(model_url)
model_dir = get_model_dir(json_data)
download_url(model_url, model_dir, filename=json_data['filename'])
if model_path.endswith('.zip'):
@ -1092,6 +1094,16 @@ async def component_policy(request):
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/reverse_proxy/policy")
async def reverse_proxy_policy(request):
if "value" in request.rel_url.query:
set_reverse_proxy_policy(request.rel_url.query['value'])
core.write_config()
else:
return web.Response(text=core.get_config()['reverse_proxy_policy'], status=200)
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/dbl_click/policy")
async def dbl_click_policy(request):

View File

@ -14,7 +14,7 @@ import { OpenArtShareDialog } from "./comfyui-share-openart.js";
import { CustomNodesManager } from "./custom-nodes-manager.js";
import { SnapshotManager } from "./snapshot.js";
import { ModelInstaller } from "./model-downloader.js";
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message } from "./common.js";
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message, set_reverse_proxy_policy } from "./common.js";
import { ComponentBuilderDialog, load_components, set_component_policy, getPureName } from "./components-manager.js";
import { set_double_click_policy } from "./node_fixer.js";
@ -920,6 +920,28 @@ class ManagerMenuDialog extends ComfyDialog {
set_component_policy(event.target.value);
});
// reverse-proxy policy
let reverse_proxy_combo = document.createElement("select");
reverse_proxy_combo.setAttribute("title", "If you are in China, you can use this option to enable reverse-proxy to download custom nodes and models.");
reverse_proxy_combo.className = "cm-menu-combo";
reverse_proxy_combo.appendChild($el('option', { value: 'none', text: 'Reverse Proxy: None' }, []));
reverse_proxy_combo.appendChild($el('option', { value: 'ghproxy-mirror', text: 'Reverse Proxy: GHProxy Mirror to GitHub' }, []));
reverse_proxy_combo.appendChild($el('option', { value: 'hf-mirror', text: 'Reverse Proxy: HF-Mirror to HuggingFace' }, []));
reverse_proxy_combo.appendChild($el('option', { value: 'both', text: 'Reverse Proxy: Both' }, []));
api.fetchApi('/manager/reverse_proxy/policy')
.then(response => response.text())
.then(data => {
reverse_proxy_combo.value = data;
set_reverse_proxy_policy(data);
})
reverse_proxy_combo.addEventListener('change', function (event) {
api.fetchApi(`/manager/reverse_proxy/policy?value=${event.target.value}`);
set_reverse_proxy_policy(event.target.value);
})
// double-click policy
let dbl_click_policy_combo = document.createElement("select");
dbl_click_policy_combo.setAttribute("title", "Sets the behavior when you double-click the title area of a node.");
dbl_click_policy_combo.className = "cm-menu-combo";
@ -970,6 +992,7 @@ class ManagerMenuDialog extends ComfyDialog {
default_ui_combo,
share_combo,
component_policy_combo,
reverse_proxy_combo,
dbl_click_policy_combo,
$el("br", {}, []),

View File

@ -65,6 +65,17 @@ export async function install_pip(packages) {
}
}
let reverse_proxy_policy = "none"
try {
api.fetchApi('/manager/reverse_proxy/policy')
.then(response => response.text())
.then(data => { reverse_proxy_policy = data; });
}
catch {}
export function set_reverse_proxy_policy(v) {
reverse_proxy_policy = v;
}
export async function install_via_git_url(url, manager_dialog) {
if(!url) {
return;