lib/exshome_player/variables/title.ex

defmodule ExshomePlayer.Variables.Title do
  @moduledoc """
  Playback title.
  """

  alias ExshomePlayer.Services.PlayerState

  use Exshome.Dependency.GenServerDependency,
    name: "player_title",
    dependencies: [{PlayerState, :player}]

  @impl GenServerDependency
  def handle_dependency_change(%DependencyState{deps: %{player: %PlayerState{} = player}} = state) do
    title = extract_title(player.metadata)
    update_value(state, title)
  end

  @spec extract_title(map() | nil) :: String.t()
  defp extract_title(nil), do: ""
  defp extract_title(%{"icy-title" => title}), do: title
  defp extract_title(%{"artist" => artist, "title" => title}), do: "#{artist} - #{title}"
  defp extract_title(%{"title" => title}), do: title
  defp extract_title(_), do: "Unknown title"
end