> ## Documentation Index
> Fetch the complete documentation index at: https://bym.lonestill.uk/llms.txt
> Use this file to discover all available pages before exploring further.

# api.Events

> Подписка на события плеера

## Методы

```js theme={null}
api.Events.on(event, handler)
api.Events.off(event, handler)
```

## События

| Событие        | Аргумент handler         | Когда                |
| -------------- | ------------------------ | -------------------- |
| `play`         | —                        | Трек начал играть    |
| `pause`        | —                        | Пауза                |
| `ended`        | —                        | Трек закончился      |
| `trackChange`  | `track: Track \| null`   | Сменился трек        |
| `speedChange`  | `speed: number`          | Скорость изменилась  |
| `volumeChange` | `volume: number` (0–1)   | Громкость изменилась |
| `seeked`       | `position: number` (сек) | Перемотка            |

Тип `Track`: `{ title, artist, album, artwork }`

<Warning>
  `api.Events.on` **не снимается автоматически** при `stop()`. Снимай вручную через `api.Events.off`.
</Warning>

## Как работает trackChange

BYM полингует `navigator.mediaSession.metadata` раз в 500мс. При смене `title + artist` — эмиттит `trackChange`. Задержка до 500мс — норма.

## Пример

```js theme={null}
BYM.register({ id: 'event-demo' }, (api) => {
  function onTrack(track) {
    api.Logger.log('Трек:', track?.title ?? 'нет трека');
  }
  function onVolume(vol) {
    api.Logger.log('Громкость:', Math.round(vol * 100) + '%');
  }

  return {
    start() {
      api.Events.on('trackChange',  onTrack);
      api.Events.on('volumeChange', onVolume);
    },
    stop() {
      api.Events.off('trackChange',  onTrack);
      api.Events.off('volumeChange', onVolume);
    },
  };
});
```
