bilibili.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Bilibili is a Chinese video sharing website.
  4. .. _Bilibili: https://www.bilibili.com
  5. """
  6. import random
  7. import string
  8. from urllib.parse import urlencode
  9. from datetime import datetime, timedelta
  10. # Engine metadata
  11. about = {
  12. "website": "https://www.bilibili.com",
  13. "wikidata_id": "Q3077586",
  14. "official_api_documentation": None,
  15. "use_official_api": False,
  16. "require_api_key": False,
  17. "results": "JSON",
  18. }
  19. # Engine configuration
  20. paging = True
  21. results_per_page = 20
  22. categories = ["videos"]
  23. # Search URL
  24. base_url = "https://api.bilibili.com/x/web-interface/wbi/search/type"
  25. cookie = {
  26. "innersign": "0",
  27. "buvid3": "".join(random.choice(string.hexdigits) for _ in range(16)) + "infoc",
  28. "i-wanna-go-back": "-1",
  29. "b_ut": "7",
  30. "FEED_LIVE_VERSION": "V8",
  31. "header_theme_version": "undefined",
  32. "home_feed_column": "4",
  33. }
  34. def request(query, params):
  35. query_params = {
  36. "__refresh__": "true",
  37. "page": params["pageno"],
  38. "page_size": results_per_page,
  39. "single_column": "0",
  40. "keyword": query,
  41. "search_type": "video",
  42. }
  43. params["url"] = f"{base_url}?{urlencode(query_params)}"
  44. params["cookies"] = cookie
  45. return params
  46. # Format the video duration
  47. def format_duration(duration):
  48. minutes, seconds = map(int, duration.split(":"))
  49. total_seconds = minutes * 60 + seconds
  50. formatted_duration = str(timedelta(seconds=total_seconds))[2:] if 0 <= total_seconds < 3600 else ""
  51. return formatted_duration
  52. def response(resp):
  53. search_res = resp.json()
  54. results = []
  55. for item in search_res.get("data", {}).get("result", []):
  56. title = item["title"]
  57. url = item["arcurl"]
  58. thumbnail = item["pic"]
  59. description = item["description"]
  60. author = item["author"]
  61. video_id = item["aid"]
  62. unix_date = item["pubdate"]
  63. formatted_date = datetime.utcfromtimestamp(unix_date)
  64. formatted_duration = format_duration(item["duration"])
  65. iframe_url = f"https://player.bilibili.com/player.html?aid={video_id}&high_quality=1&autoplay=false&danmaku=0"
  66. results.append(
  67. {
  68. "title": title,
  69. "url": url,
  70. "content": description,
  71. "author": author,
  72. "publishedDate": formatted_date,
  73. "length": formatted_duration,
  74. "thumbnail": thumbnail,
  75. "iframe_src": iframe_url,
  76. "template": "videos.html",
  77. }
  78. )
  79. return results