mirror of
https://github.com/searxng/searxng.git
synced 2026-08-29 18:41:31 +00:00
88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""Google Videos: see :py:obj:`searx.engines.google`."""
|
|
|
|
import typing as t
|
|
|
|
from searx.engines.google import fetch_traits # pylint: disable=unused-import
|
|
from searx.engines.google import google_request, unwrap_google_url, wml_dom
|
|
from searx.result_types import EngineResults
|
|
from searx.utils import (
|
|
eval_xpath_getindex,
|
|
eval_xpath_list,
|
|
extract_text,
|
|
get_embeded_stream_url,
|
|
parse_duration_string,
|
|
)
|
|
|
|
if t.TYPE_CHECKING:
|
|
from searx.extended_types import SXNG_Response
|
|
from searx.search.processors import OnlineParams
|
|
|
|
# about
|
|
about = {
|
|
"website": "https://www.google.com",
|
|
"wikidata_id": "Q219885",
|
|
"official_api_documentation": "https://developers.google.com/custom-search",
|
|
"use_official_api": False,
|
|
"require_api_key": False,
|
|
"results": "XML",
|
|
}
|
|
|
|
# engine dependent config
|
|
categories = ["videos", "web"]
|
|
paging = True
|
|
max_page = 50
|
|
"""Google supports up to 50 pages of results, see the `Google max_page discussion`_.
|
|
|
|
.. _Google max_page discussion: https://github.com/searxng/searxng/issues/2982
|
|
"""
|
|
language_support = True
|
|
time_range_support = True
|
|
safesearch = True
|
|
|
|
|
|
def request(query: str, params: "OnlineParams") -> None:
|
|
google_request(
|
|
query,
|
|
params,
|
|
{"tbm": "vid"},
|
|
eng_traits=traits,
|
|
use_locales=False,
|
|
)
|
|
|
|
|
|
def response(resp: "SXNG_Response") -> EngineResults:
|
|
results = EngineResults()
|
|
|
|
for result in eval_xpath_list(wml_dom(resp), '//div[contains(@class, "zMzFAb")]'):
|
|
title = extract_text(
|
|
eval_xpath_getindex(result, './/span[contains(@class, "CVA68e")]', 0, default=None),
|
|
allow_none=True,
|
|
)
|
|
raw_url = eval_xpath_getindex(result, './/a[contains(@class, "fuLhoc")]/@href', 0, default=None)
|
|
if not title or not raw_url:
|
|
continue
|
|
|
|
url = unwrap_google_url(raw_url)
|
|
thumbnail = eval_xpath_getindex(result, './/img[contains(@class, "SygO9d")]/@src', 0, default="")
|
|
if "/default.jpg" in thumbnail:
|
|
thumbnail = thumbnail.split("?")[0].replace("/default.jpg", "/hqdefault.jpg")
|
|
length = None
|
|
for span in eval_xpath_list(result, './/span[contains(@class, "YVIcad")]'):
|
|
length = parse_duration_string(extract_text(span) or "")
|
|
if length:
|
|
break
|
|
|
|
results.add(
|
|
results.types.MainResult(
|
|
url=url,
|
|
title=title,
|
|
thumbnail=thumbnail,
|
|
length=length,
|
|
iframe_src=get_embeded_stream_url(url) or "",
|
|
template="videos.html",
|
|
)
|
|
)
|
|
|
|
return results
|