summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHackurei <138650713+Hackurei@users.noreply.github.com>2023-09-05 11:57:48 -0600
committerMarkus Heiser <markus.heiser@darmarIT.de>2023-09-05 22:53:03 +0200
commit1f21ac7d6272f934ff717512698f64dfb4640df1 (patch)
treeb7e09e846d43e2842d33d04d4eeb99e78f021c57
parent696c35d2c33d60eb7b965fe017e08a00a939d4c4 (diff)
downloadsearxng-1f21ac7d6272f934ff717512698f64dfb4640df1.tar.gz
searxng-1f21ac7d6272f934ff717512698f64dfb4640df1.zip
[feat] engine: implementation of bilibili https://www.bilibili.com
-rw-r--r--searx/engines/bilibili.py100
-rw-r--r--searx/settings.yml5
2 files changed, 105 insertions, 0 deletions
diff --git a/searx/engines/bilibili.py b/searx/engines/bilibili.py
new file mode 100644
index 000000000..1eb8b9b84
--- /dev/null
+++ b/searx/engines/bilibili.py
@@ -0,0 +1,100 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# lint: pylint
+"""Bilibili is a Chinese video sharing website.
+
+.. _Bilibili: https://www.bilibili.com
+"""
+
+import random
+import string
+from urllib.parse import urlencode
+from datetime import datetime, timedelta
+
+# Engine metadata
+about = {
+ "website": "https://www.bilibili.com",
+ "wikidata_id": "Q3077586",
+ "official_api_documentation": None,
+ "use_official_api": False,
+ "require_api_key": False,
+ "results": "JSON",
+}
+
+# Engine configuration
+paging = True
+results_per_page = 20
+categories = ["videos"]
+
+# Search URL
+base_url = "https://api.bilibili.com/x/web-interface/wbi/search/type"
+
+cookie = {
+ "innersign": "0",
+ "buvid3": "".join(random.choice(string.hexdigits) for _ in range(16)) + "infoc",
+ "i-wanna-go-back": "-1",
+ "b_ut": "7",
+ "FEED_LIVE_VERSION": "V8",
+ "header_theme_version": "undefined",
+ "home_feed_column": "4",
+}
+
+
+def request(query, params):
+ query_params = {
+ "__refresh__": "true",
+ "page": params["pageno"],
+ "page_size": results_per_page,
+ "single_column": "0",
+ "keyword": query,
+ "search_type": "video",
+ }
+
+ params["url"] = f"{base_url}?{urlencode(query_params)}"
+ params["cookies"] = cookie
+
+ return params
+
+
+# Format the video duration
+def format_duration(duration):
+ minutes, seconds = map(int, duration.split(":"))
+ total_seconds = minutes * 60 + seconds
+
+ formatted_duration = str(timedelta(seconds=total_seconds))[2:] if 0 <= total_seconds < 3600 else ""
+
+ return formatted_duration
+
+
+def response(resp):
+ search_res = resp.json()
+
+ results = []
+
+ for item in search_res.get("data", {}).get("result", []):
+ title = item["title"]
+ url = item["arcurl"]
+ thumbnail = item["pic"]
+ description = item["description"]
+ author = item["author"]
+ video_id = item["aid"]
+ unix_date = item["pubdate"]
+
+ formatted_date = datetime.utcfromtimestamp(unix_date)
+ formatted_duration = format_duration(item["duration"])
+ iframe_url = f"https://player.bilibili.com/player.html?aid={video_id}&high_quality=1&autoplay=false&danmaku=0"
+
+ results.append(
+ {
+ "title": title,
+ "url": url,
+ "content": description,
+ "author": author,
+ "publishedDate": formatted_date,
+ "length": formatted_duration,
+ "thumbnail": thumbnail,
+ "iframe_src": iframe_url,
+ "template": "videos.html",
+ }
+ )
+
+ return results
diff --git a/searx/settings.yml b/searx/settings.yml
index b70a44b96..d6c3b6c85 100644
--- a/searx/settings.yml
+++ b/searx/settings.yml
@@ -371,6 +371,11 @@ engines:
shortcut: wp
base_url: 'https://{language}.wikipedia.org/'
+ - name: bilibili
+ engine: bilibili
+ shortcut: bil
+ disabled: true
+
- name: bing
engine: bing
shortcut: bi