Externe Spotify-Integration: Einen eindeutigen Selektor haben

Hallo, ich bin’s!!
Ich habe also Zugriff auf das externe Plugin :slight_smile:
Ich wollte Spotify integrieren:


Gibt es keine Möglichkeit, einen einzigen Selektor (UUID) zu haben?

Ich werde schauen

@pierre-gilles, Claude sagt, dass das Problem vom Core kommt. Hier ist seine Analyse. Du kannst es dir ansehen

Die Diagnose

Wenn das Frontend das entdeckte Gerät an /api/v1/device POSTet, sendet es keinen Selector. Der Core generiert ihn dann in einem Sequelize beforeValidate-Hook:

server/utils/addSelector.js:11-17
function addSelector(item) {
  if (item.selector) {
    item.selector = slugify(item.selector);
  } else if (item.name) {
    item.selector = slugify(item.name);   // <-- hier
  }
}

Daher ist selector = slugify(device.name), ohne jede Deduplizierung, obwohl die Spalte unique: true ist (server/models/device.js:32-36). Die UNIQUE-Konstrainte wird ignoriert, Sequelize wirft einen SequelizeUniqueConstraintError, und errorMiddleware.js:42-49 verwandelt ihn in einen 409 auf dem Attribut selector — genau das, was der Forenmitglied sieht.

Sein Spotify Connect-Gerät heißt « MacBook Pro de … » → selector macbook-pro-de-..., der bereits bei ihm existiert (wahrscheinlich ein anderes Gerät mit dem gleichen Namen: ein Chromecast, ein AirPlay, ein Gerät einer anderen Integration oder ein bereits hinzugefügter und dann umbenannter Spotify).

Was das impliziert

Das Problem liegt nicht im Spotify-Plugin: Unsere external_id sind eindeutig (ext:<selector-integration>:spotify:<deviceId>), die external_id des Spotify-Geräts gerät nie in Konflikt. Es ist eine Grenze des Cores: Der Selector wird vom Namen abgeleitet, und zwei Geräte mit dem gleichen Namen können nicht erstellt werden.

Zu beachten ist, dass der Core bereits anderswo besser kann — externalIntegration.buildSelector.js:25 schleift genau, um einen freien Kandidaten zu finden:
while ((await db.Service.findOne({ where: { selector: candidate } })) !== null) {
Diese Logik wurde einfach nie auf die Geräte angewendet.

@Will_71 Du hast recht, wir sollten diesen Fall behandeln :slight_smile: Ich kümmere mich darum in einem PR

Das ist hier korrigiert:

Das Update ist in der Version 4.84.4 live: