'init'
Some checks failed
Upstream Sync / Sync latest commits from upstream repo (push) Has been cancelled

This commit is contained in:
eric
2026-03-24 14:46:41 -05:00
parent c5a1a9a404
commit b77a8cadb2
164 changed files with 57060 additions and 58 deletions

96
web2_proxy_config.py Normal file
View File

@@ -0,0 +1,96 @@
"""
仅给「录制子进程」使用的代理配置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