"""五榜唯一列表主人:周去重 + 深池补满。""" from __future__ import annotations import logging from typing import Any, Literal from daily.delta import skill_id logger = logging.getLogger(__name__) def board_select( *, board: str, items: list[dict[str, Any]], recent_keys: set[str], limit: int, pool_size: int, kind: Literal["skill", "github"], ) -> list[dict[str, Any]]: """从深池过滤近 N 日已展示 key,按原顺序取满 limit;不足则短榜。""" if kind == "skill": from daily.skills_group import group_skills_by_source pool = group_skills_by_source(items, limit=pool_size, pool_size=pool_size) else: pool = items[: max(pool_size, limit)] out: list[dict[str, Any]] = [] for item in pool: if kind == "skill": key = skill_id(item) source = str(item.get("source") or "").strip() if (key and key in recent_keys) or (source and source in recent_keys): continue if not key and not source: continue else: key = str(item.get("repo") or "") if not key or key in recent_keys: continue out.append(item) if len(out) >= limit: break if len(out) < limit: logger.info("board_short:%s:%s", board, len(out)) return out