odysee.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Odysee_ is a decentralised video hosting platform.
  4. .. _Odysee: https://github.com/OdyseeTeam/odysee-frontend
  5. """
  6. import time
  7. from urllib.parse import urlencode
  8. from datetime import datetime
  9. # Engine metadata
  10. about = {
  11. "website": "https://odysee.com/",
  12. "wikidata_id": "Q102046570",
  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 (Note: lighthouse.lbry.com/search works too, and may be faster at times)
  23. base_url = "https://lighthouse.odysee.tv/search"
  24. def request(query, params):
  25. start_index = (params["pageno"] - 1) * results_per_page
  26. query_params = {
  27. "s": query,
  28. "size": results_per_page,
  29. "from": start_index,
  30. "include": "channel,thumbnail_url,title,description,duration,release_time",
  31. "mediaType": "video",
  32. }
  33. params["url"] = f"{base_url}?{urlencode(query_params)}"
  34. return params
  35. # Format the video duration
  36. def format_duration(duration):
  37. seconds = int(duration)
  38. length = time.gmtime(seconds)
  39. if length.tm_hour:
  40. return time.strftime("%H:%M:%S", length)
  41. return time.strftime("%M:%S", length)
  42. def response(resp):
  43. data = resp.json()
  44. results = []
  45. for item in data:
  46. name = item["name"]
  47. claim_id = item["claimId"]
  48. title = item["title"]
  49. thumbnail_url = item["thumbnail_url"]
  50. description = item["description"] or ""
  51. channel = item["channel"]
  52. release_time = item["release_time"]
  53. duration = item["duration"]
  54. release_date = datetime.strptime(release_time.split("T")[0], "%Y-%m-%d")
  55. formatted_date = datetime.utcfromtimestamp(release_date.timestamp())
  56. url = f"https://odysee.com/{name}:{claim_id}"
  57. iframe_url = f"https://odysee.com/$/embed/{name}:{claim_id}"
  58. odysee_thumbnail = f"https://thumbnails.odycdn.com/optimize/s:390:0/quality:85/plain/{thumbnail_url}"
  59. formatted_duration = format_duration(duration)
  60. results.append(
  61. {
  62. "title": title,
  63. "url": url,
  64. "content": description,
  65. "author": channel,
  66. "publishedDate": formatted_date,
  67. "length": formatted_duration,
  68. "thumbnail": odysee_thumbnail,
  69. "iframe_src": iframe_url,
  70. "template": "videos.html",
  71. }
  72. )
  73. return results