From 5b8054abd9ed9bdaf8cd4633392d0550d2147331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Sun, 7 Jul 2024 08:28:09 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20#110=20=E4=BF=AE=E5=A4=8D=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=8A=A0=E8=BD=BD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/config.py | 59 +++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/xiaomusic/config.py b/xiaomusic/config.py index 56641ac1a..a82dde232 100644 --- a/xiaomusic/config.py +++ b/xiaomusic/config.py @@ -73,7 +73,7 @@ class Config: hostname: str = os.getenv("XIAOMUSIC_HOSTNAME", "192.168.2.5") port: int = int(os.getenv("XIAOMUSIC_PORT", "8090")) # 监听端口 public_port: int = int(os.getenv("XIAOMUSIC_PUBLIC_PORT", 0)) # 歌曲访问端口 - proxy: str | None = os.getenv("XIAOMUSIC_PROXY", None) + proxy: str = os.getenv("XIAOMUSIC_PROXY", None) search_prefix: str = os.getenv( "XIAOMUSIC_SEARCH", "bilisearch:" ) # "bilisearch:" or "ytsearch:" @@ -162,43 +162,40 @@ def from_options(cls, options: argparse.Namespace) -> Config: config[key] = value return cls(**config) + @classmethod + def convert_value(cls, k, v, type_hints): + if v is not None and k in type_hints: + expected_type = type_hints[k] + try: + if expected_type is bool: + converted_value = False + if str(v).lower() == "true": + converted_value = True + else: + converted_value = expected_type(v) + print(converted_value) + return converted_value + except (ValueError, TypeError) as e: + print(f"Error converting {k}:{v} to {expected_type}: {e}") + return None + @classmethod def read_from_file(cls, config_path: str) -> dict: result = {} with open(config_path, "rb") as f: - config = json.load(f) - for key, value in config.items(): - if value is not None and key in cls.__dataclass_fields__: - result[key] = value + data = json.load(f) + type_hints = get_type_hints(cls) + + for k, v in data.items(): + converted_value = cls.convert_value(k, v, type_hints) + if converted_value is not None: + result[k] = converted_value return result def update_config(self, data): - # 获取类型提示 type_hints = get_type_hints(self) for k, v in data.items(): - if v and k in type_hints: - # 获取字段的类型 - expected_type = type_hints[k] - - # 根据期望的类型进行转换 - if isinstance(v, expected_type): - # 如果v已经是正确的类型,则直接赋值 - setattr(self, k, v) - else: - # 尝试转换类型 - try: - # 特殊情况处理(例如对布尔值的转换) - if expected_type is bool: - converted_value = False - if v and v.lower() == "true": - converted_value = True - else: - # 使用期望类型的构造函数进行转换 - converted_value = expected_type(v) - except (ValueError, TypeError) as e: - print(f"Error converting {v} to {expected_type}: {e}") - continue - - # 设置转换后的值 - setattr(self, k, converted_value) + converted_value = self.convert_value(k, v, type_hints) + if converted_value is not None: + setattr(self, k, converted_value)