Automation - Music Assistant load list to input_select

95% of time I use Music Assistant either to listen to internet radio or single podcast that is automatically downloaded into machine.
What I wanted to achieve (and managed to) is to easily pick one of latest podcast episodes and start streaming without going into Music Assistant.

Recently I used NodeRed for automations and I’m quite fluent in using it but now I’m slowly migrating to HA automations and have some issues.

Here is my code of pushing entries into input_select:

alias: Załaduj ostatnie Rosiaki
sequence:
  - action: mass.get_library
    metadata: {}
    data:
      limit: 5
      media_type: track
      search: Rosiak
      order_by: timestamp_added_desc
    response_variable: library_list
  - variables:
      size: "{{ library_list.tracks| list |count }}"
      list: "{{[]}}"
  - action: input_select.set_options
    data:
      options:
        - Wybierz
    target:
      entity_id: input_select.raport_rosiaka_ostatnie
  - repeat:
      count: "{{size}}"
      sequence:
        - action: input_select.set_options
          data:
            options: >-
              {{state_attr('input_select.raport_rosiaka_ostatnie',
              'options')|list + [library_list.tracks[repeat.index-1].name~'
              <'~library_list.tracks[repeat.index-1].uri~'>']}}
          target:
            entity_id: input_select.raport_rosiaka_ostatnie
description: ""

Maybe you would be able to tell me how to do it better.

  1. Don’t call input_select.set_options in loop. Make list variable global, and push entries into input_select at very end
  2. Is there better way to keep technical id than having it as a part of text?
  3. Use for_each loop. Loop on library_list.tracks| list was resulting in only 1 iteration. Service call output is like:
tracks:
  - item_id: "59"
    provider: library
    name: OPOWIEŚCI ARABSKIE S03E01 Strefa Gazy
    version: ""
    sort_name: opowieści arabskie s03e01 strefa gazy
    uri: library://track/59
   .......
    track_number: 586
  - item_id: "63"
    provider: library
    name: OPOWIEŚCI ARABSKIE S03E02 Jordania
    version: ""
    sort_name: opowieści arabskie s03e02 jordania
    uri: library://track/63
   .....
    track_number: 590
  - item_id: "60"
    provider: library
    name: Raport na dziś - 13 listopada 2024
    version: ""
    sort_name: raport na dziś - 13 listopada 2024
    uri: library://track/60
    .....
    track_number: 587
  - item_id: "64"
    provider: library
    name: Raport na dziś - 20 listopada 2024
    version: ""
    sort_name: raport na dziś - 20 listopada 2024
    uri: library://track/64
    .....

As a bonus it’s the way I use it. I’m ok with it but if any suggestions please let me know:

alias: Obsługa raportu rosiaka
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_select.raport_rosiaka_ostatnie
    id: wybor
conditions: []
actions:
 sequence:
  - variables:
      st: "{{trigger.to_state.state}}"
      uri: "{{st[st.find('<')+1:st.rfind('>')]}}"
  - if:
      - condition: template
        value_template: "{{'library' in uri}}"
    then:
      - action: mass.play_media
        metadata: {}
        data:
          media_id: "{{uri}}"
          media_type: track
          enqueue: replace
        target:
          entity_id: media_player.archos_hello_7
mode: single

Ok, I think I found better solution:

alias: Załaduj ostatnie Rosiaki
sequence:
  - action: mass.get_library
    metadata: {}
    data:
      limit: 5
      media_type: track
      search: Rosiak
      order_by: timestamp_added_desc
    response_variable: library_list
  - action: mass.get_library
    metadata: {}
    data:
      limit: 5
      media_type: track
      search: Raport
      order_by: timestamp_added_desc
    response_variable: library_list2
  - variables:
      tracks: >
        [ {% for name in ( library_list.tracks| list + library_list2.tracks|
        list )|sort(attribute='item_id', reverse=true) %}  '{{name.name}}
        <{{name.uri}}>',{% endfor %}]
      l_unique_l: "{{tracks|unique|list }}"
      l_unique: "{{l_unique_l[0:5]}}"
  - action: input_select.set_options
    data:
      options: "{{['Wybierz']+l_unique}}"
    target:
      entity_id: input_select.raport_rosiaka_ostatnie
description: ""