immersive-home/content/entities/media_player/media_player.gd

94 lines
2.2 KiB
GDScript3
Raw Normal View History

2023-11-26 03:01:27 +02:00
extends StaticBody3D
@export var entity_id = "media_player.bedroomspeaker"
2023-11-29 01:16:25 +02:00
@export var image_width = 0.15
2023-11-26 03:01:27 +02:00
@onready var previous = $Previous
@onready var next = $Next
@onready var play = $Play
@onready var logo = $PlayingInfo/Logo
@onready var title = $PlayingInfo/Title
@onready var artist = $PlayingInfo/Artist
@onready var http_request = $PlayingInfo/HTTPRequest
@onready var slider = $Slider
2023-11-26 03:01:27 +02:00
var playing = false
var volume = 50
2023-11-26 03:01:27 +02:00
# Called when the node enters the scene tree for the first time.
func _ready():
var stateInfo = await HomeApi.get_state(entity_id)
set_state(stateInfo)
await HomeApi.watch_state(entity_id, func(new_state):
set_state(new_state)
)
previous.on_button_down.connect(func():
HomeApi.set_state(entity_id, "previous")
)
play.on_button_down.connect(func():
if playing:
HomeApi.set_state(entity_id, "pause")
else:
HomeApi.set_state(entity_id, "play")
)
next.on_button_down.connect(func():
HomeApi.set_state(entity_id, "next")
)
slider.on_value_changed.connect(set_volume)
func set_volume(value):
volume = value
HomeApi.set_state(entity_id, "volume", {"volume_level": value / 100})
2023-11-26 03:01:27 +02:00
func set_state(stateInfo):
var state = stateInfo["state"]
if state == "playing":
if stateInfo["attributes"].has("entity_picture_local"):
load_image(stateInfo["attributes"]["entity_picture_local"])
title.text = stateInfo["attributes"]["media_title"]
artist.text = stateInfo["attributes"]["media_artist"]
volume = float(stateInfo["attributes"]["volume_level"]) * 100
slider.value = volume
2023-11-26 03:01:27 +02:00
playing = true
play.label = "pause"
else:
playing = false
play.label = "play_arrow"
func load_image(url: String):
http_request.request("http://192.168.33.33:8123" + url)
var result = await http_request.request_completed
if result[0] != HTTPRequest.RESULT_SUCCESS:
print("Error loading image: ", result[0], " ", result[1])
return
var image = Image.new()
var error = image.load_jpg_from_buffer(result[3])
2023-11-29 01:16:25 +02:00
var pixel_size = image_width / image.get_size().x
2023-11-26 03:01:27 +02:00
if error != OK:
print("Error loading image: ", error)
return
var texture = ImageTexture.create_from_image(image)
logo.texture = texture
2023-11-29 01:16:25 +02:00
logo.pixel_size = pixel_size
2023-12-09 19:39:38 +02:00
func _save():
return {
"transform": transform,
"entity_id": entity_id
}