Files
searxng/searx/engines/vimeo.py
2026-09-21 17:56:49 +02:00

99 lines
2.6 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""Vimeo (videos)"""
import typing as t
from datetime import datetime, timedelta
from urllib.parse import urlencode, urlparse
from searx.result_types import EngineResults
from searx.network import get
from searx.enginelib import EngineCache
# Engine metadata
about = {
"website": 'https://vimeo.com/',
"wikidata_id": 'Q156376',
"official_api_documentation": 'http://developer.vimeo.com/api',
"use_official_api": False,
"require_api_key": False,
"results": 'JSON',
}
# Engine configuration
paging = True
categories = ['videos']
results_per_page = 20
# Search URL
base_url = "https://api.vimeo.com"
# Cache keys & expiration
JWT_CACHE_KEY = "jwt"
JWT_CACHE_EXPIRATION_SECONDS = 300
CACHE: EngineCache
def setup(engine_settings: dict[str, t.Any]) -> bool:
global CACHE # pylint: disable=global-statement
CACHE = EngineCache(engine_settings["name"])
def fetch_json_web_token():
if json_web_token := CACHE.get(JWT_CACHE_KEY):
return json_web_token
jwt_url = "https://vimeo.com/_next/jwt"
jwt_headers = {
'x-requested-with': "XMLHttpRequest",
}
resp = get(url=jwt_url, headers=jwt_headers, timeout=5)
json_web_token = resp.json()["token"]
CACHE.set(key=JWT_CACHE_KEY, value=json_web_token, expire=JWT_CACHE_EXPIRATION_SECONDS)
return json_web_token
def request(query: str, params: "OnlineParams"):
json_web_token = fetch_json_web_token()
query_params = {
"filter_type": "clip",
"query": query,
"page": params["pageno"],
"per_page": results_per_page,
}
params["url"] = f"{base_url}/search?{urlencode(query_params)}"
params["headers"]["content-type"] = "application/json"
params["headers"]["authorization"] = "jwt " + json_web_token
params["headers"]["Accept"] = "application/vnd.vimeo.*+json;version=3.3"
def response(resp: "SXNG_Response") -> EngineResults:
results = EngineResults()
search_res = resp.json()
for item in search_res["data"]:
video_id = urlparse(item["clip"]["link"]).path.strip('/')
results.add(
results.types.LegacyResult(
template="videos.html",
title=item["clip"]["name"],
url=item["clip"]["link"],
author=item["clip"]["user"]["name"],
thumbnail=item["clip"]["pictures"]["base_link"],
length=timedelta(seconds=item["clip"]["duration"]),
publishedDate=datetime.fromisoformat(item["clip"]["created_time"]),
iframe_src="https://player.vimeo.com/video/" + video_id,
)
)
return results