Улучшение обработки фильтров и полей в запросах к VNDB API

This commit is contained in:
2026-05-01 16:54:10 +03:00
parent b9ffe18504
commit a3c484b20b
2 changed files with 19 additions and 37 deletions

20
bot.py
View File

@@ -182,8 +182,8 @@ Staff: {stats.get('staff', 0)}
) )
results = await vndb_client.query_vn( results = await vndb_client.query_vn(
filters=["search", "=", query.strip().lower()], # ✔️ без вложенности filters=["search", "=", query.strip().lower()],
fields=["id", "title", "image{url}"], fields=["id", "title", "image.url"],
results=10 results=10
) )
@@ -200,14 +200,12 @@ Staff: {stats.get('staff', 0)}
# images # images
for vn in results["results"][:3]: for vn in results["results"][:3]:
img = vn.get("image") img_url = vn.get("image.url") or vn.get("image", {}).get("url")
if img and img.get("url"):
try: if img_url:
await update.message.reply_photo( await update.message.reply_photo(
photo=f"https://t.vndb.org{img['url']}" photo=f"https://t.vndb.org{img_url}"
) )
except Exception as e:
logger.warning(e)
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
@@ -228,15 +226,15 @@ Staff: {stats.get('staff', 0)}
return ConversationHandler.END return ConversationHandler.END
results = await vndb_client.query_character( results = await vndb_client.query_character(
filters=["search", "=", query.strip().lower()], # ✔️ важно filters=["search", "=", query.strip().lower()],
fields=["id", "name", "image{url}"], fields=["id", "name", "original", "image.url"],
results=10 results=10
) )
text = "<b>Персонажи:</b>\n\n" text = "<b>Персонажи:</b>\n\n"
for c in results.get("results", []): for c in results.get("results", []):
text += f"{c.get('id')} - {c.get('name')}\n" text += f"{c.get('id')} - {c.get('name')} ({c.get('original', '')})\n"
await update.message.reply_text(text, parse_mode="HTML") await update.message.reply_text(text, parse_mode="HTML")

View File

@@ -51,7 +51,7 @@ class VndbClient:
def _safe_filters(self, filters: Optional[List[Any]]) -> List[Any]: def _safe_filters(self, filters: Optional[List[Any]]) -> List[Any]:
if not filters: if not filters:
return ["id", ">", 0] return []
return filters return filters
async def _request( async def _request(
@@ -135,27 +135,10 @@ class VndbClient:
compact_filters: bool = False, compact_filters: bool = False,
normalized_filters: bool = False, normalized_filters: bool = False,
) -> Dict[str, Any]: ) -> Dict[str, Any]:
"""
Query visual novels
Args:
filters: Filter conditions
fields: Fields to retrieve
sort: Sort field (id, title, released, rating, votecount, searchrank)
reverse: Sort in descending order
results: Number of results per page (max 100)
page: Page number starting from 1
count: Include total count
user: User ID for user-specific filters
compact_filters: Include compact filter representation
normalized_filters: Include normalized filter representation
Returns:
Query results
"""
data = { data = {
"filters": filters or [], "filters": filters or [],
"fields": ",".join(fields) if fields else "id", "fields": ",".join(fields) if fields else "id,title,image.url",
"sort": sort, "sort": sort,
"reverse": reverse, "reverse": reverse,
"results": results, "results": results,
@@ -164,6 +147,7 @@ class VndbClient:
"compact_filters": compact_filters, "compact_filters": compact_filters,
"normalized_filters": normalized_filters, "normalized_filters": normalized_filters,
} }
if user: if user:
data["user"] = user data["user"] = user
@@ -185,7 +169,7 @@ class VndbClient:
"""Query releases""" """Query releases"""
data = { data = {
"filters": filters or [], "filters": filters or [],
"fields": ",".join(fields) if fields else "id", "fields": ",".join(fields) if fields else "id,title",
"sort": sort, "sort": sort,
"reverse": reverse, "reverse": reverse,
"results": results, "results": results,
@@ -213,8 +197,8 @@ class VndbClient:
) -> Dict[str, Any]: ) -> Dict[str, Any]:
data = { data = {
"filters": self._safe_filters(filters), "filters": filters or [],
"fields": ",".join(fields) if fields else "id,name", "fields": ",".join(fields) if fields else "id,name,original,image.url",
"sort": sort, "sort": sort,
"reverse": reverse, "reverse": reverse,
"results": results, "results": results,