channel_card.gd 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. class_name ChannelCard
  2. extends HBoxContainer
  3. signal initialized
  4. signal is_setup
  5. const THUMBNAIL_SIZE := Vector2(50, 50)
  6. const THUMBNAIL_INTERPOLATION_METHOD: int = Image.INTERPOLATE_LANCZOS
  7. export(String, FILE) var default_thumbnail_path = "res://icon.png"
  8. # URL of the channel on the LBRY blockchain
  9. var _channel_url: String
  10. # All the resolved data for this `_channel_url`
  11. var _data: Dictionary = {}
  12. var _is_setup: bool = false
  13. var _default_thumbnail := ImageTexture.new()
  14. var _initialized: bool = false
  15. var _async_helper := AsyncHelper.new(self)
  16. onready var _channel_thumbnail_node: TextureRect = \
  17. find_node("ChannelThumbnail")
  18. onready var _channel_title_node: Label = find_node("ChannelTitle")
  19. onready var _channel_name_node: Label = find_node("ChannelName")
  20. func init(channel_url: String) -> void:
  21. _channel_url = channel_url
  22. _initialized = true
  23. emit_signal("initialized")
  24. func _ready() -> void:
  25. if not _initialized:
  26. yield(self, "initialized")
  27. var default_img: Image = load(default_thumbnail_path).get_data()
  28. # Make sure the thumbnail enters the scene as the correct size
  29. default_img.resize(int(THUMBNAIL_SIZE.x), int(THUMBNAIL_SIZE.y))
  30. _default_thumbnail.create_from_image(default_img)
  31. _channel_thumbnail_node.set_texture(_default_thumbnail)
  32. _setup()
  33. func _setup() -> void:
  34. if _channel_url == "":
  35. return
  36. var tracker: Dictionary = _async_helper.connect_wrapped(
  37. SDK.resolve([_channel_url]), "completed")
  38. yield(_async_helper.wait_until_finished([tracker]), "completed")
  39. var resolve_response: Dictionary = tracker["result"]
  40. if resolve_response.has("result"):
  41. _data = resolve_response["result"].get(
  42. resolve_response["result"].keys()[0])
  43. var resources: Array = yield(_get_resources(), "completed")
  44. var channel_name: String = resources[0]
  45. var channel_title: String = resources[1]
  46. var thumbnail: ImageTexture = resources[2]
  47. # Update _channel_url to the short URL if it was found
  48. if resources[0] != "":
  49. _channel_url = "lbry://" + resources[0]
  50. if channel_title == "":
  51. channel_title = channel_name.substr(1).rsplit("#", true, 1)[0]
  52. if thumbnail == null:
  53. thumbnail = _default_thumbnail
  54. var thumbnail_img: Image = thumbnail.get_data()
  55. thumbnail_img.resize(int(THUMBNAIL_SIZE.x), int(THUMBNAIL_SIZE.y),
  56. THUMBNAIL_INTERPOLATION_METHOD)
  57. thumbnail.create_from_image(thumbnail_img)
  58. _channel_name_node.set_text(channel_name)
  59. _channel_title_node.set_text(channel_title)
  60. _channel_thumbnail_node.set_texture(thumbnail)
  61. set_tooltip(_channel_url)
  62. _is_setup = true
  63. emit_signal("is_setup")
  64. func _get_resources() -> Array:
  65. """
  66. Returns:
  67. The channel name (String), channel title (String) and channel thumbnail
  68. (ImageTexture). If the channel name or title is not found, then an
  69. empty string. If the thumbnail could not be loaded or contained no
  70. data, then `null`
  71. """
  72. var channel_name: String = ""
  73. var channel_title: String = ""
  74. var channel_thumbnail: ImageTexture = null
  75. var tracker: Dictionary
  76. channel_name = _data.get("short_url", "").trim_prefix("lbry://")
  77. channel_title = _data.get("value", {}).get("title", "")
  78. var channel_thumbnail_url: String = _data \
  79. .get("value", {}) \
  80. .get("thumbnail", {}) \
  81. .get("url", "")
  82. tracker = _async_helper.connect_wrapped(
  83. Requests.get_image(channel_thumbnail_url), "completed")
  84. yield(_async_helper.wait_until_finished([tracker]), "completed")
  85. var channel_thumbnail_img: Image = tracker["result"]
  86. if not channel_thumbnail_img.is_empty():
  87. channel_thumbnail = ImageTexture.new()
  88. channel_thumbnail.create_from_image(channel_thumbnail_img)
  89. return [channel_name, channel_title, channel_thumbnail]
  90. func get_channel_url() -> String:
  91. return _get_tooltip()
  92. func get_channel_name() -> String:
  93. return _channel_name_node.get_text()
  94. func get_channel_title() -> String:
  95. return _channel_title_node.get_text()
  96. func is_setup() -> bool:
  97. return _is_setup