diff --git a/backend/smw_client.py b/backend/smw_client.py index 80f36a7..7390c17 100644 --- a/backend/smw_client.py +++ b/backend/smw_client.py @@ -83,9 +83,9 @@ class SmwClient: # Kategorien # # ------------------------------------------------------------------ # - async def get_category_members(self, category: str, limit: int = 500) -> list[dict]: + async def get_category_members(self, category: str, limit: int = 500, recursive: bool = True) -> list[dict]: """ - Gibt alle Seiten einer Kategorie zurück. + Gibt alle Seiten einer Kategorie zurück (optional rekursiv durch Unterkategorien). Gibt Liste von {"pageid": int, "title": str} zurück. """ members = [] @@ -97,7 +97,7 @@ class SmwClient: "list": "categorymembers", "cmtitle": f"Kategorie:{category}", "cmlimit": min(limit, 500), - "cmtype": "page", + "cmtype": "page", # Nur Seiten, keine Unterkategorien "cmprop": "ids|title", } if cmcontinue: @@ -111,8 +111,47 @@ class SmwClient: else: break + # Rekursiv durch Unterkategorien gehen + if recursive: + subcats = await self._get_subcategories(category) + logger.info(f"Kategorie '{category}': {len(members)} direkte Seiten, {len(subcats)} Unterkategorien") + + for subcat in subcats: + if len(members) >= limit: + break + subcat_name = subcat["title"].replace("Kategorie:", "") + subcat_members = await self.get_category_members(subcat_name, limit=limit - len(members), recursive=True) + members.extend(subcat_members) + return members[:limit] + async def _get_subcategories(self, category: str) -> list[dict]: + """Gibt alle Unterkategorien einer Kategorie zurück.""" + subcats = [] + cmcontinue = None + + while True: + params = { + "action": "query", + "list": "categorymembers", + "cmtitle": f"Kategorie:{category}", + "cmlimit": 500, + "cmtype": "subcat", # Nur Unterkategorien + "cmprop": "ids|title", + } + if cmcontinue: + params["cmcontinue"] = cmcontinue + + data = await self._get(params) + subcats.extend(data["query"]["categorymembers"]) + + if "continue" in data: + cmcontinue = data["continue"].get("cmcontinue") + else: + break + + return subcats + # ------------------------------------------------------------------ # # Seiteninhalte # # ------------------------------------------------------------------ #