mirror of
https://github.com/jxxghp/MoviePilot-Plugins.git
synced 2026-05-25 07:26:52 +00:00
- 数据模型重构: 全面引入 Pydantic 模型(ClashConfig, Proxy, ProxyGroup 等)替代原有字典结构,提供更严格的数据验证与类型安全。 - 数据迁移机制: 新增 v2.1.0 数据升级脚本,支持将旧版代理、策略组及规则数据自动迁移至新架构。 - 配置补丁系统: 实现基于 JSON Patch 的细粒度配置修补机制,替代旧版覆盖逻辑,提升配置修改的灵活性。 - 服务层优化: 重写 ClashRuleProviderService 以适配新对象模型,增强代码可维护性与扩展性。 - API模型同步: 更新相关 API 数据模型以保持与内部数据结构的一致性。 - 用户界面: 批量规则管理和数据项隐藏支持
79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
import jsonpatch
|
|
from typing import Union, Any
|
|
|
|
from pydantic import Field, RootModel, model_validator
|
|
|
|
from .anytlsproxy import AnyTLSProxy
|
|
from .directproxy import DirectProxy
|
|
from .dnsproxy import DnsProxy
|
|
from .httpproxy import HttpProxy
|
|
from .hysteriaproxy import HysteriaProxy
|
|
from .hysteria2proxy import Hysteria2Proxy
|
|
from .mieruproxy import MieruProxy
|
|
from .networkmixin import NetworkMixin
|
|
from .proxybase import ProxyBase
|
|
from .shadowsocksproxy import ShadowsocksProxy
|
|
from .shadowsocksrproxy import ShadowsocksRProxy
|
|
from .snellproxy import SnellProxy
|
|
from .socks5proxy import Socks5Proxy
|
|
from .sshproxy import SshProxy
|
|
from .tlsmixin import TLSMixin
|
|
from .trojanproxy import TrojanProxy
|
|
from .tuicproxy import TuicProxy
|
|
from .vlessproxy import VlessProxy
|
|
from .vmessproxy import VmessProxy
|
|
from .wireguardproxy import WireGuardProxy
|
|
from ..generics import ResourceItem, ResourceList
|
|
|
|
ProxyType = Union[
|
|
AnyTLSProxy,
|
|
DirectProxy,
|
|
DnsProxy,
|
|
HttpProxy,
|
|
HysteriaProxy,
|
|
Hysteria2Proxy,
|
|
MieruProxy,
|
|
ShadowsocksProxy,
|
|
ShadowsocksRProxy,
|
|
SnellProxy,
|
|
Socks5Proxy,
|
|
SshProxy,
|
|
TrojanProxy,
|
|
TuicProxy,
|
|
VlessProxy,
|
|
VmessProxy,
|
|
WireGuardProxy,
|
|
]
|
|
|
|
|
|
class Proxy(RootModel[ProxyType]):
|
|
root: ProxyType = Field(..., discriminator="type")
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return self.root.name
|
|
|
|
def __getattr__(self, item):
|
|
return getattr(self.root, item)
|
|
|
|
def patch(self, patch: str) -> 'Proxy':
|
|
src = self.model_dump(mode='json', by_alias=True)
|
|
patched = jsonpatch.apply_patch(src, patch=patch, in_place=True)
|
|
return Proxy.model_validate(patched)
|
|
|
|
|
|
class ProxyData(ResourceItem[Proxy]):
|
|
raw: Union[str, dict[str, Any], None] = None
|
|
v2ray_link: str | None = None
|
|
|
|
@model_validator(mode="after")
|
|
def validate_name_consistency(self):
|
|
if self.name != self.data.name:
|
|
raise ValueError(f"name ({self.name}) must equal data.name ({self.data.name})")
|
|
return self
|
|
|
|
|
|
class Proxies(ResourceList[ProxyData]):
|
|
"""Proxies Collection"""
|
|
pass
|