@@ -219,9 +219,15 @@ def _try_link_protocol_to_native(self, protocol_player: Player) -> None:
219219 continue
220220
221221 # For universal players, check if this protocol player is in its stored list
222+ # or if identifiers match (for new protocol players like Sendspin bridges
223+ # that weren't previously known to the Universal Player)
222224 if native_player .provider .domain == "universal_player" :
223225 if isinstance (native_player , UniversalPlayer ):
224- if protocol_player .player_id in native_player ._protocol_player_ids :
226+ is_known = protocol_player .player_id in native_player ._protocol_player_ids
227+ is_match = not is_known and self ._identifiers_match (
228+ native_player , protocol_player , protocol_domain
229+ )
230+ if is_known or is_match :
225231 self ._add_protocol_link (native_player , protocol_player , protocol_domain )
226232 # Copy identifiers from protocol player to universal player
227233 # This is important for restored universal players which start
@@ -230,6 +236,9 @@ def _try_link_protocol_to_native(self, protocol_player: Player) -> None:
230236 native_player .device_info .add_identifier (conn_type , value )
231237 # Update model/manufacturer if universal player has generic values
232238 self ._update_universal_device_info (native_player , protocol_player )
239+ # Register newly matched protocol player with the universal player
240+ if is_match :
241+ native_player .add_protocol_player (protocol_player .player_id )
233242 # Persist updated data to config (async via task)
234243 self ._save_universal_player_data (native_player )
235244 protocol_player .update_state ()
0 commit comments