Files
gitlab-instance-0a899031_d2…/web2_proxy_config.py
eric b77a8cadb2
Some checks failed
Upstream Sync / Sync latest commits from upstream repo (push) Has been cancelled
'init'
2026-03-24 14:46:41 -05:00

97 lines
3.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
仅给「录制子进程」使用的代理配置FFmpeg / youtube2 等),不修改 Windows 系统代理。
用户在本机运行 Clash Verge 等时,通常填 http://127.0.0.1:7890 与 socks5://127.0.0.1:7890。
"""
from __future__ import annotations
import os
from pathlib import Path
from typing import Any
from configparser import ConfigParser
BASE_DIR = Path(__file__).resolve().parent
PROXY_INI = BASE_DIR / "config" / "ffmpeg_proxy.ini"
def _default_ini_text() -> str:
return (
"[proxy]\n"
"# 开启后仅作用于本软件拉起的录制/推流进程,不会改系统代理\n"
"enabled = no\n"
"# 与 Clash Verge「混合端口」一致即可示例\n"
"http = http://127.0.0.1:7890\n"
"socks = socks5://127.0.0.1:7890\n"
)
def ensure_proxy_config_file() -> None:
PROXY_INI.parent.mkdir(parents=True, exist_ok=True)
if not PROXY_INI.exists():
PROXY_INI.write_text(_default_ini_text(), encoding="utf-8")
def read_proxy_config() -> dict[str, Any]:
ensure_proxy_config_file()
cp = ConfigParser()
cp.read(PROXY_INI, encoding="utf-8")
if not cp.has_section("proxy"):
cp.add_section("proxy")
enabled = cp.get("proxy", "enabled", fallback="no").strip().lower() in (
"1",
"true",
"yes",
"on",
"",
"",
)
http = (cp.get("proxy", "http", fallback="") or "").strip()
socks = (cp.get("proxy", "socks", fallback="") or "").strip()
return {"enabled": enabled, "http": http, "socks": socks}
def write_proxy_config(data: dict[str, Any]) -> None:
ensure_proxy_config_file()
cp = ConfigParser()
cp.read(PROXY_INI, encoding="utf-8")
if not cp.has_section("proxy"):
cp.add_section("proxy")
cp.set("proxy", "enabled", "yes" if data.get("enabled") else "no")
cp.set("proxy", "http", str(data.get("http") or "").strip())
cp.set("proxy", "socks", str(data.get("socks") or "").strip())
with open(PROXY_INI, "w", encoding="utf-8") as f:
cp.write(f)
def subprocess_env_overlay() -> dict[str, str]:
"""
合并进子进程 environ 的键值(不含整个 os.environ
youtube2 / tiktok2 会读 STREAM_HTTP_PROXY / STREAM_SOCKS_PROXY。
"""
cfg = read_proxy_config()
out: dict[str, str] = {}
if not cfg["enabled"]:
return out
http = cfg["http"]
socks = cfg["socks"]
if http:
out["STREAM_HTTP_PROXY"] = http
out["HTTP_PROXY"] = http
out["HTTPS_PROXY"] = http
out["http_proxy"] = http
out["https_proxy"] = http
if socks:
out["STREAM_SOCKS_PROXY"] = socks
out["ALL_PROXY"] = socks
out["all_proxy"] = socks
return out
def merge_child_env(base: dict[str, str] | None = None) -> dict[str, str]:
"""供 asyncio subprocess / Popen 使用(完整继承系统环境后再叠加代理)。"""
env = dict(os.environ)
if base:
env.update(base)
env.update(subprocess_env_overlay())
return env