bilibili.py 2.5 KB

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