New Squeezebox features in 2025.6

We’re pleased to have been able to add some new features to the Squeezebox integration in 2025.6 and we wanted to share a little more information on these, in part because a couple of them didn’t make it into the release notes.

Update Platform
@pssc added a new update platform which adds entities to the LMS service which show if there are updates available your LMS and/or for your plugins.

Alarm Support
One feature that’s been requested for a while is support for alarms. In 2025.6, we’ve introduced a switch platform and initial support for alarms. Initially, this is just support for turning individual alarms on and off, and the ability to disable or enable all alarms for a device.

We’re continuing discussions with the architecture team about the right way to extend the functionality and fully implement alarms, but for now hopefully you’ll find this useful.

Search Media

In 2025.5 a new action, search_media, was added to the media_player and is now available for squeezebox media players. This action allows you to search the media library and will be particularly useful in implementing scripts and intents - i.e. the ability to search for a particular piece of media before then playing it.

You can specify a content type to choose where to search (e.g. albums, playlists, favorites etc.), and/or a media class filter to filter the result set (e.g. album, playlist etc.).

Any questions, please let us know.

Peter, Phil & Raj
@psketch, @pssc, @rajlaud

6 Likes

One of the uses of search_media will of course be to search for something and then play it. I wrote a script to make this easier, which you can call from other scripts and automations. It’s a bit more complex because searching for favorites returns a media_content_id which can’t be played directly, so instead we’re using browse_media rather than search_media for favorites.

sequence:
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ media_content_type == 'favorites' }}"
        sequence:
          - action: media_player.browse_media
            data:
              media_content_type: "{{ media_content_type }}"
            target:
              entity_id: "{{ media_player }}"
            response_variable: search_result
    default:
      - action: media_player.search_media
        data:
          search_query: "{{ search_query }}"
          media_content_type: "{{ media_content_type }}"
        target:
          entity_id: "{{ media_player }}"
        response_variable: search_result
  - choose:
      - conditions:
          - condition: template
            value_template: >
              {% if media_content_type == 'favorites' %}
                {% set result = search_result[media_player].children %}
              {% else %}
                {% set result = search_result[media_player].result %}
              {% endif %}

              {% if match_type == 'exact' or media_content_type == 'favorites'
              %}
                {% set match = result
                    | selectattr('title', 'equalto', search_query)
                    | list | first %}
              {% else %}
                {% set match = result
                    | list | first %}
              {% endif %}
              {{ match.media_content_id is defined }}
        sequence:
          - variables:
              matched_item: >
                {% if media_content_type == 'favorites' %}
                  {% set result = search_result[media_player].children %}
                {% else %}
                  {% set result = search_result[media_player].result %}
                {% endif %}

                {% if match_type == 'exact' or media_content_type == 'favorites'
                %}
                  {% set match = result
                   | selectattr('title', 'equalto', search_query)
                   | list | first %}
                {% else %}
                  {% set match = result | list | first %}
                {% endif %}

                {% if match %}
                  {% set media_type = match.media_content_type.value if match.media_content_type.value is defined else match.media_content_type %}
                  {{
                    {
                      'title': match.title,
                      'media_content_id': match.media_content_id,
                      'media_content_type': media_type
                    }
                  }}
                {% else %}
                  {{ none }}
                {% endif %}
          - target:
              entity_id: "{{ media_player }}"
            data:
              media_content_id: "{{ matched_item['media_content_id'] }}"
              media_content_type: "{{ matched_item['media_content_type'] }}"
            action: media_player.play_media
    default:
      - data:
          title: Music Search Failed
          message: >
            Could not find an item matching '{{ search_query }}' in {{
            media_content_type }}. Available matches: {{
            search_result[media_player].result | map(attribute='title') | list
            }}
        action: notify.persistent_notification
alias: Browse/Search and Play
description: >-
  This script searches the LMS media library for an item which matches the
  specified conditions, and then plays the item on the specified Squeezebox
fields:
  search_query:
    selector:
      text: null
    name: Search Query
    description: String for which to search
    required: true
  media_content_type:
    selector:
      select:
        options:
          - Albums
          - Artists
          - Favorites
          - Playlists
          - Tracks
          - Genres
          - Album Artists
    name: Media Content Type
    description: The type of media for which to search
    required: true
  media_player:
    selector:
      entity:
        filter:
          - integration: squeezebox
            domain: media_player
    name: Squeezebox Media Player
    description: The Squeezebox player's entity
    required: true
  match_type:
    selector:
      select:
        options:
          - label: Exact Match
            value: exact
          - label: First Match
            value: first
    name: Match Type
    description: Should the search look for an exact match, or the first similar match?
    default: exact
    required: true

As you’ll see, I’ve added fields to the script, so you can call it from other scripts and automations

If this is useful, I’ll create a blueprint.

3 Likes