odysee.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 datetime import datetime
  8. # Engine metadata
  9. about = {
  10. "website": "https://odysee.com/",
  11. "wikidata_id": "Q102046570",
  12. "official_api_documentation": None,
  13. "use_official_api": False,
  14. "require_api_key": False,
  15. "results": "JSON",
  16. }
  17. # Engine configuration
  18. paging = True
  19. results_per_page = 20
  20. categories = ['images']
  21. # Search URL (Note: lighthouse.lbry.com/search works too, and may be faster at times)
  22. base_url = "https://lighthouse.odysee.tv/search"
  23. # Request function
  24. def request(query, params):
  25. page = params.get("pageno", 1) - 1
  26. start_index = page * results_per_page
  27. query_params = {
  28. "s": query,
  29. "size": results_per_page,
  30. "from": start_index,
  31. "include": "channel,thumbnail_url,title,description,duration,release_time",
  32. "mediaType": "video",
  33. }
  34. query_str = "&".join([f"{key}={value}" for key, value in query_params.items()])
  35. params["url"] = f"{base_url}?{query_str}"
  36. return params
  37. # Format the video duration
  38. def format_duration(duration):
  39. seconds = int(duration)
  40. length = time.gmtime(seconds)
  41. if length.tm_hour:
  42. return time.strftime("%H:%M:%S", length)
  43. return time.strftime("%M:%S", length)
  44. def response(resp):
  45. data = resp.json()
  46. results = []
  47. for item in data:
  48. name = item["name"]
  49. claim_id = item["claimId"]
  50. title = item["title"]
  51. thumbnail_url = item["thumbnail_url"]
  52. description = item["description"] or ""
  53. channel = item["channel"]
  54. release_time = item["release_time"]
  55. duration = item["duration"]
  56. release_date = datetime.strptime(release_time.split("T")[0], "%Y-%m-%d")
  57. formatted_date = datetime.utcfromtimestamp(release_date.timestamp())
  58. url = f"https://odysee.com/{name}:{claim_id}"
  59. iframe_url = f"https://odysee.com/$/embed/{name}:{claim_id}"
  60. odysee_thumbnail = f"https://thumbnails.odycdn.com/optimize/s:390:0/quality:85/plain/{thumbnail_url}"
  61. formatted_duration = format_duration(duration)
  62. results.append(
  63. {
  64. "title": title,
  65. "url": url,
  66. "content": description,
  67. "author": channel,
  68. "publishedDate": formatted_date,
  69. "length": formatted_duration,
  70. "thumbnail": odysee_thumbnail,
  71. "iframe_src": iframe_url,
  72. "template": "videos.html",
  73. }
  74. )
  75. return results