File size: 1,993 Bytes
6cfe55f
 
aa08cd6
 
6cfe55f
 
aa08cd6
 
 
 
6cfe55f
aa08cd6
6cfe55f
 
aa08cd6
6cfe55f
 
aa08cd6
6cfe55f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from typing import Optional, Dict

from app.db.app_config_dao import load_value, set_value


class CookieConfigManager:
    # 平台 cookie 持久化在数据库 app_config 表(key="downloader");
    # filepath 仅用于把旧的 config/downloader.json 一次性导入。
    _KEY = "downloader"

    def __init__(self, filepath: str = "config/downloader.json"):
        self._legacy_path = filepath

    def _read(self) -> Dict[str, Dict[str, str]]:
        return load_value(self._KEY, self._legacy_path, {}) or {}

    def _write(self, data: Dict[str, Dict[str, str]]):
        set_value(self._KEY, data)

    def get(self, platform: str) -> Optional[str]:
        data = self._read()
        return data.get(platform, {}).get("cookie")

    def get_browser(self, platform: str) -> Optional[str]:
        """读取该平台配置的「从浏览器读 cookie」选项,未配置返回 None。"""
        data = self._read()
        browser = data.get(platform, {}).get("browser")
        return browser or None

    def set(self, platform: str, cookie: str, browser: Optional[str] = None):
        """保存平台的 cookie 字符串及可选的浏览器名。

        browser 传 None 表示不修改原浏览器设置;传空字符串则清除浏览器设置。
        """
        data = self._read()
        entry = data.get(platform, {}) or {}
        entry["cookie"] = cookie
        if browser is not None:
            if browser:
                entry["browser"] = browser
            else:
                entry.pop("browser", None)
        data[platform] = entry
        self._write(data)

    def delete(self, platform: str):
        data = self._read()
        if platform in data:
            del data[platform]
            self._write(data)

    def list_all(self) -> Dict[str, str]:
        data = self._read()
        return {k: v.get("cookie", "") for k, v in data.items()}

    def exists(self, platform: str) -> bool:
        return self.get(platform) is not None