pixl wird gerade aktiv entwickelt. Was sich ändert, steht in den Neuigkeiten.
pixl

SDK-Referenz

Alle Funktionen der Pixl-Klasse

Alle Beispiele gehen von einer Instanz aus:

const pixl = new Pixl({ key: 'pixl_DEIN_SCHLÜSSEL' });

Optionen des Konstruktors stehen unter Installation.

Events

pixl.on(event, handler)

Registriert einen Handler für einen Event-Typ. Mit '*' bekommst du alle Events. Gibt die Instanz zurück, Aufrufe lassen sich also verketten.

pixl
  .on('twitch.cheer', (data) => console.log(`${data.username}: ${data.bits} Bits`))
  .on('*', (data, event) => console.log(event.event, data));

Der Handler bekommt zwei Argumente:

ArgumentInhalt
dataDaten des Events, siehe Event-Referenz
eventDas ganze Event: { event, data, replay, id?, at?, history? }

event.replay ist true, wenn jemand das Event im Dashboard erneut abgespielt hat. Willst du Replays ignorieren, prüf darauf. id und at (ISO-Zeitpunkt) gibt es nur bei Events, die auch im Eventlog stehen. history setzt nur feed().

pixl.off(event, handler)

Entfernt einen Handler wieder. Du musst dieselbe Funktion übergeben wie bei on().

pixl.events(query?)

Fragt das Eventlog ab, neueste Events zuerst. Gibt ein Promise zurück.

const { events, nextCursor } = await pixl.events({
  since: 'stream',
  types: ['twitch.sub', 'twitch.sub_gift'],
  limit: 20,
});

// Nächste Seite
const page2 = await pixl.events({ since: 'stream', cursor: nextCursor });
FeldTypBedeutung
sinceDate, ISO-String, Unix-ms oder 'stream'Ab wann. 'stream' = Start des letzten Streams
untilDate, ISO-String oder Unix-msBis wann (exklusiv)
typesstring[]Nur diese Event-Typen
limitnumber1 bis 200, Standard 50
cursorstringnextCursor der vorherigen Seite

Ergebnis: { events: { id, event, data, at }[], nextCursor: string | null }.

Im Eventlog stehen nur die Events, die pixl speichert (siehe Event-Referenz). Reine Live-Events wie Chat-Nachrichten oder Zwischenstände von Umfragen bekommst du nur über pixl.on().

pixl.fetchAllEvents(query?)

Wie events(), holt aber alle Seiten nacheinander und gibt die Events älteste zuerst zurück. Kennt since, until und types.

const cheers = await pixl.fetchAllEvents({ since: 'stream', types: ['twitch.cheer'] });

pixl.feed(options, handler)

Erst alle Events seit since, danach live, jedes genau einmal. Ausführlich unter Historie + live.

pixl.feed({ since: 'stream', types: ['twitch.cheer'] }, (data, event) => {
  console.log(event.history ? 'bisher' : 'neu', data.bits);
});

Kanal

pixl.org()

Infos zum Kanal, dem der Schlüssel gehört, und welche Rechte er hat: { id, name, logo, twitchChannelLogin, scopes }. Praktisch, um zu prüfen, ob ein Schlüssel funktioniert.

Subs

pixl.subs()

Aktuelle Sub-Zahl direkt von Twitch, unabhängig vom Eventlog: { total, points, at }. Braucht subs:read. Änderungen kommen live als subs.updated mit denselben Feldern, Details unter GET /subs.

const show = ({ total }) => (el.textContent = total);
pixl.subs().then(show);
pixl.on("subs.updated", show);

Musik

pixl.nowPlaying()

Was gerade auf Spotify läuft: { playing, progressMs, at, track, addedBy }. Braucht spotify:read und das Modul Musik. Ohne aktives Gerät ist track null. Änderungen kommen live als spotify.now_playing mit denselben Feldern, Details unter GET /spotify/now-playing.

Pixl.progress(nowPlaying, now?)

Fortschritt in Millisekunden zum Zeitpunkt now (Standard: jetzt). Läuft der Song, rechnet es ab at weiter, höchstens bis zur Songlänge. Damit läuft ein Fortschrittsbalken flüssig, ohne dass pixl jede Sekunde etwas schicken muss.

let current = null;
const show = (np) => {
  current = np;
  title.textContent = np.track ? `${np.track.name} · ${np.track.artists.join(", ")}` : "";
  cover.src = np.track?.image ?? "";
};
pixl.nowPlaying().then(show);
pixl.on("spotify.now_playing", show);

setInterval(() => {
  if (current?.track) bar.style.width = `${(Pixl.progress(current) / current.track.durationMs) * 100}%`;
}, 250);

StreamElements

pixl.streamElements(path, params?)

Fragt Daten aus dem verbundenen StreamElements-Kanal ab, z.B. pixl.streamElements('sessions') oder pixl.streamElements('points/top', { limit: 10 }). Braucht streamelements:read. Erlaubte Pfade und was dahinter steckt: GET /streamelements/{pfad}. Die Antwort kommt unverändert von StreamElements.

TTS

pixl.tts.player(options?)

Spielt jedes vorgelesene tts.ready der Reihe nach ab und hält sich an „Überspringen“ aus dem Dashboard. Braucht tts:read. Optionen und Beispiele unter TTS.

pixl.tts.speak(text, { voice?, filters? })

Lässt einen Text vorlesen, abgespielt wird er dann in jedem Overlay mit Player. filters: false oder z.B. { links: false } schaltet Filter ab, siehe TTS. Braucht tts:write und verbraucht Credits des Kanals. Gibt { id, text, voice } zurück.

pixl.tts.voices() / pixl.tts.audio(id) / pixl.tts.marks(id)

Verfügbare Stimmen samt Standardstimme des Kanals, das Audio eines Eintrags als Blob (MP3) bzw. seine Zeitmarken pro Wort ([{ word, start, end }], kosten beim ersten Abruf extra).

Verbindung

pixl.status

Aktueller Verbindungsstatus:

StatusBedeutung
connectingVerbindung wird aufgebaut, auch beim Neuverbinden
connectedLive-Verbindung steht
disconnectedVerbindung weg, das SDK versucht es gleich wieder, auch während pixl gerade aktualisiert wird (spätestens alle 10 Sekunden)
unauthorizedSchlüssel ungültig oder gelöscht. Es wird nicht neu verbunden
closedMit disconnect() beendet, oder noch nicht gestartet

pixl.onStatus(handler)

Ruft handler sofort mit dem aktuellen Status auf und danach bei jedem Wechsel. Gibt eine Funktion zum Abmelden zurück.

pixl.onStatus((status) => {
  document.body.classList.toggle('offline', status !== 'connected');
});

pixl.connect() / pixl.disconnect()

Startet bzw. beendet die Live-Verbindung. Nach Abbrüchen verbindet das SDK automatisch neu, erst nach einer halben Sekunde, dann mit wachsendem Abstand bis höchstens 30 Sekunden.

pixl.request(path, params?)

Rohzugriff auf einen Endpunkt der HTTP-API, z.B. pixl.request('/events', { limit: '5' }). Für Fälle, die die anderen Funktionen noch nicht abdecken.

Fehler

HTTP-Funktionen werfen bei Fehlern einen PixlApiError mit status (HTTP-Code) und message, bei TTS zusätzlich problem. 403 heißt, dem Schlüssel fehlt ein Recht:

try {
  await pixl.events({ since: 'stream' });
} catch (e) {
  if (e.status === 404) console.log('Noch kein Stream gelaufen');
}

Fehler in deinen eigenen Handlern landen in der Konsole, brechen aber die Verbindung nicht ab.

Auf dieser Seite