Browse Source

[feat] engine: implementation of bilibili https://www.bilibili.com

Hackurei 1 year ago
parent
commit
1f21ac7d62
2 changed files with 105 additions and 0 deletions
  1. 100 0
      searx/engines/bilibili.py
  2. 5 0
      searx/settings.yml

+ 100 - 0
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

+ 5 - 0
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