mirror of
https://github.com/searxng/searxng.git
synced 2026-09-11 16:56:05 +00:00
* [fix] engine: pinterest - fix empty titles and complete modernization The titles from the fields ``title`` and ``grid_title`` are mostly empty or have short strings without meaningful content. Various fields for the title are now being queried, which have more informative value. As part of the bug fix, the engine was completely revised and modernized. Related: - https://github.com/searxng/searxng/pull/6690#issuecomment-5631113121 Co-authored-by: @vojkovic
87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""Pinterest (images)"""
|
|
|
|
from json import dumps
|
|
import typing as t
|
|
from searx.result_types import EngineResults
|
|
|
|
if t.TYPE_CHECKING:
|
|
from searx.extended_types import SXNG_Response
|
|
from searx.search.processors import OnlineParams
|
|
|
|
about = {
|
|
"website": "https://www.pinterest.com/",
|
|
"wikidata_id": "Q255381",
|
|
"official_api_documentation": "https://developers.pinterest.com/docs/api/v5/",
|
|
"use_official_api": False,
|
|
"require_api_key": False,
|
|
"results": "JSON",
|
|
}
|
|
|
|
categories = ["images"]
|
|
paging = True
|
|
|
|
base_url = "https://www.pinterest.com"
|
|
|
|
|
|
def request(query: str, params: "OnlineParams") -> None:
|
|
|
|
args = {
|
|
"options": {
|
|
"query": query,
|
|
"bookmarks": [params["engine_data"].get("bookmark", "")],
|
|
},
|
|
"context": {},
|
|
}
|
|
params["url"] = f"{base_url}/resource/BaseSearchResource/get/?data={dumps(args)}"
|
|
params["headers"] = {
|
|
"X-Requested-With": "XMLHttpRequest",
|
|
"X-Pinterest-AppState": "active",
|
|
"X-Pinterest-Source-Url": "/ideas/",
|
|
"X-Pinterest-PWS-Handler": "www/ideas.js",
|
|
}
|
|
|
|
|
|
def response(resp: "SXNG_Response") -> EngineResults:
|
|
res = EngineResults()
|
|
json_resp: dict[str, t.Any] = resp.json() # type: ignore
|
|
|
|
res.add(
|
|
{
|
|
"engine_data": json_resp["resource_response"]["bookmark"],
|
|
# it's called bookmark by pinterest, but it's rather a nextpage
|
|
# parameter to get the next results
|
|
"key": "bookmark",
|
|
}
|
|
)
|
|
|
|
for result in json_resp["resource_response"]["data"]["results"]:
|
|
|
|
if result["type"] == "story":
|
|
continue
|
|
|
|
main_image = result["images"]["orig"]
|
|
|
|
title = result.get("title") or result.get("grid_title") or ""
|
|
if len(title) < 5:
|
|
visual_annotation = result.get("pin_join", {}).get("visual_annotation")
|
|
if visual_annotation:
|
|
title = visual_annotation[0]
|
|
else:
|
|
title = result.get("name") or result.get("auto_alt_text") or ""
|
|
|
|
res.add(
|
|
res.types.Image(
|
|
url=result.get("link") or f"{base_url}/pin/{result['id']}/",
|
|
title=title,
|
|
content=(result.get("rich_summary") or {}).get("display_description") or "",
|
|
img_src=main_image["url"],
|
|
thumbnail_src=result["images"]["236x"]["url"],
|
|
source=(result.get("rich_summary") or {}).get("site_name") or "",
|
|
resolution=f"{main_image['width']}x{main_image['height']}",
|
|
author=f"{result['pinner'].get('full_name')} ({result['pinner']['username']})",
|
|
)
|
|
)
|
|
|
|
return res
|