fix: avoid API-only dependency and pin default categories

This commit is contained in:
袁震
2026-04-06 12:03:09 +08:00
parent d48407345d
commit cda268862f
2 changed files with 34 additions and 2 deletions
+10 -1
View File
@@ -9,7 +9,16 @@
"source": { "source": {
"root": "rule/Surge", "root": "rule/Surge",
"filename_pattern": "{name}.list", "filename_pattern": "{name}.list",
"include_categories": [], "include_categories": [
"Apple",
"China",
"ChinaIPs",
"Claude",
"Gemini",
"Lan",
"OpenAI",
"Proxy"
],
"exclude_categories": [] "exclude_categories": []
}, },
"output": { "output": {
+24 -1
View File
@@ -12,6 +12,7 @@ from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from urllib.parse import quote from urllib.parse import quote
from urllib.error import HTTPError
from urllib.request import Request, urlopen from urllib.request import Request, urlopen
try: try:
import tomllib import tomllib
@@ -67,6 +68,14 @@ class GiteaClient:
with urlopen(req) as resp: with urlopen(req) as resp:
return json.loads(resp.read().decode("utf-8")) return json.loads(resp.read().decode("utf-8"))
def _request_text_url(self, url: str) -> str:
headers = {"Accept": "text/plain"}
if self.token:
headers["Authorization"] = f"token {self.token}"
req = Request(url, headers=headers)
with urlopen(req) as resp:
return resp.read().decode("utf-8", errors="replace")
def list_dir(self, owner: str, repo: str, path: str, ref: str) -> list[dict[str, Any]]: def list_dir(self, owner: str, repo: str, path: str, ref: str) -> list[dict[str, Any]]:
encoded_path = quote(path.strip("/"), safe="/") encoded_path = quote(path.strip("/"), safe="/")
endpoint = f"/api/v1/repos/{quote(owner)}/{quote(repo)}/contents/{encoded_path}" endpoint = f"/api/v1/repos/{quote(owner)}/{quote(repo)}/contents/{encoded_path}"
@@ -88,7 +97,18 @@ class GiteaClient:
def read_file(self, owner: str, repo: str, path: str, ref: str) -> str: def read_file(self, owner: str, repo: str, path: str, ref: str) -> str:
encoded_path = quote(path.strip("/"), safe="/") encoded_path = quote(path.strip("/"), safe="/")
endpoint = f"/api/v1/repos/{quote(owner)}/{quote(repo)}/contents/{encoded_path}" endpoint = f"/api/v1/repos/{quote(owner)}/{quote(repo)}/contents/{encoded_path}"
data = self._request_json(endpoint, {"ref": ref}) try:
data = self._request_json(endpoint, {"ref": ref})
except HTTPError as exc:
if exc.code != 404:
raise
# Fallback for environments where Gitea API route is not exposed.
raw_url = (
f"{self.base_url}/{quote(owner)}/{quote(repo)}/raw/branch/"
f"{quote(ref)}/{encoded_path}"
)
return self._request_text_url(raw_url)
if not isinstance(data, dict): if not isinstance(data, dict):
raise RuntimeError(f"Path is not a file: {path}") raise RuntimeError(f"Path is not a file: {path}")
@@ -240,6 +260,9 @@ def should_include_category(name: str, cfg: Config, cli_names: set[str]) -> bool
def find_categories(client: GiteaClient, cfg: Config, cli_names: set[str]) -> list[str]: def find_categories(client: GiteaClient, cfg: Config, cli_names: set[str]) -> list[str]:
if cfg.include_categories:
return sorted([n for n in cfg.include_categories if should_include_category(n, cfg, cli_names)])
entries = client.list_dir(cfg.owner, cfg.repo, cfg.source_root, cfg.ref) entries = client.list_dir(cfg.owner, cfg.repo, cfg.source_root, cfg.ref)
categories: list[str] = [] categories: list[str] = []