mirror of
https://github.com/zoriya/v10.git
synced 2026-08-16 02:45:09 +00:00
241 lines
5.9 KiB
Markdown
241 lines
5.9 KiB
Markdown
# API
|
|
|
|
Surface API for React and HTML.
|
|
|
|
## createPlayer
|
|
|
|
### React
|
|
|
|
```ts
|
|
import { createPlayer, features } from '@videojs/react';
|
|
|
|
const { Provider, Container, usePlayer } = createPlayer({
|
|
features: [features.video]
|
|
});
|
|
```
|
|
|
|
**Returns:**
|
|
|
|
| Export | Purpose |
|
|
| ----------- | ---------------------------------------- |
|
|
| `Provider` | Creates stores, provides context |
|
|
| `Container` | Attaches container element to player store |
|
|
| `usePlayer` | Access player state (typed to features) |
|
|
|
|
### HTML
|
|
|
|
```ts
|
|
import { createPlayer, features } from '@videojs/html';
|
|
|
|
const { PlayerElement, PlayerController } = createPlayer({
|
|
features: [features.video]
|
|
});
|
|
|
|
customElements.define('my-video-player', PlayerElement);
|
|
```
|
|
|
|
**Returns:**
|
|
|
|
| Export | Purpose |
|
|
| ------------------ | --------------------------------------------------- |
|
|
| `PlayerElement` | Combined provider + container element (common case) |
|
|
| `PlayerController` | Reactive controller for accessing player state |
|
|
| `ProviderElement` | Provider-only element (advanced, split cases) |
|
|
| `ContainerElement` | Container-only element (advanced, split cases) |
|
|
| `ProviderMixin` | Mixin for custom provider elements |
|
|
| `ContainerMixin` | Mixin for custom container elements |
|
|
|
|
### Config
|
|
|
|
```ts
|
|
// Individual features
|
|
createPlayer({
|
|
features: [features.playback, features.volume, features.fullscreen]
|
|
});
|
|
|
|
// Feature bundles (sugar)
|
|
createPlayer({
|
|
features: [features.video]
|
|
});
|
|
|
|
// Extended bundle
|
|
createPlayer({
|
|
features: [features.video, features.streaming]
|
|
});
|
|
```
|
|
|
|
## usePlayer (React)
|
|
|
|
Access player state with selector-based subscriptions.
|
|
|
|
### Overloads
|
|
|
|
```ts
|
|
// 1. Feature only — returns full feature slice
|
|
usePlayer(feature): FeatureSlice | undefined
|
|
|
|
// 2. Feature + selector — returns selected value from feature
|
|
usePlayer(feature, selector): R | undefined
|
|
|
|
// 3. Global selector — returns selected value from all state
|
|
usePlayer(selector): R
|
|
```
|
|
|
|
### Examples
|
|
|
|
```tsx
|
|
// Get full playback feature slice
|
|
const playback = usePlayer(features.playback);
|
|
if (!playback) return null;
|
|
playback.paused;
|
|
playback.play();
|
|
|
|
// Get specific value from feature
|
|
const paused = usePlayer(features.playback, s => s.paused);
|
|
|
|
// Derive value from feature
|
|
const isPlaying = usePlayer(features.playback, s => !s.paused && !s.ended);
|
|
|
|
// Select across multiple features (global selector)
|
|
const state = usePlayer(s => ({
|
|
paused: s.paused,
|
|
volume: s.volume
|
|
}));
|
|
```
|
|
|
|
### Performance
|
|
|
|
> **Warning:** Global selectors without feature scoping subscribe to all state changes. During playback, `currentTime` updates frequently (4-60 times/sec). Always scope to features or use specific selectors.
|
|
|
|
```tsx
|
|
// Bad — re-renders on every currentTime update
|
|
const state = usePlayer(s => s);
|
|
|
|
// Good — only subscribes to playback feature
|
|
const playback = usePlayer(features.playback);
|
|
|
|
// Good — only subscribes to paused
|
|
const paused = usePlayer(features.playback, s => s.paused);
|
|
```
|
|
|
|
### Selector Comparison
|
|
|
|
Selectors returning objects use `shallowEqual` comparison:
|
|
|
|
```tsx
|
|
// Re-renders only when paused OR volume changes
|
|
const state = usePlayer(s => ({
|
|
paused: s.paused,
|
|
volume: s.volume
|
|
}));
|
|
```
|
|
|
|
`shallowEqual` is exported from `@videojs/store` for custom use.
|
|
## store.get / store.has
|
|
|
|
Access features within feature context (subscribe/request handlers).
|
|
|
|
### store.get(feature | key | name)
|
|
|
|
Returns typed feature slice or `undefined`.
|
|
|
|
```ts
|
|
// By feature reference
|
|
store.get(features.playback) // PlaybackSlice | undefined
|
|
|
|
// By feature key (Symbol)
|
|
store.get(playbackKey) // PlaybackSlice | undefined
|
|
|
|
// By name (string)
|
|
store.get('playback') // Slice | undefined (loose typing)
|
|
```
|
|
|
|
### store.has(feature | key | name)
|
|
|
|
Returns `boolean`.
|
|
|
|
```ts
|
|
store.has(features.playback) // boolean
|
|
store.has('playback') // boolean
|
|
```
|
|
|
|
### Usage in Features
|
|
|
|
```ts
|
|
const keyboardFeature = createPlayerFeature({
|
|
subscribe: ({ store, update, signal }) => {
|
|
const playback = store.get(features.playback);
|
|
|
|
document.addEventListener('keydown', (e) => {
|
|
if (e.key === ' ') playback?.toggle();
|
|
}, { signal });
|
|
}
|
|
});
|
|
```
|
|
|
|
## PlayerController (HTML)
|
|
|
|
Reactive controller for accessing player state in custom elements.
|
|
|
|
```ts
|
|
import { createPlayer, features, MediaElement } from '@videojs/html';
|
|
|
|
const { PlayerController } = createPlayer({
|
|
features: [features.video]
|
|
});
|
|
|
|
class MediaPlayButton extends MediaElement {
|
|
#playback = new PlayerController(this, features.playback);
|
|
|
|
override connectedCallback() {
|
|
super.connectedCallback();
|
|
this.addEventListener('click', this.#handleClick);
|
|
}
|
|
|
|
#handleClick = () => {
|
|
this.#playback.value?.toggle();
|
|
};
|
|
|
|
override update() {
|
|
const playback = this.#playback.value;
|
|
if (!playback) return;
|
|
// ...
|
|
}
|
|
}
|
|
```
|
|
|
|
### Controller API
|
|
|
|
| Property | Returns | Description |
|
|
| -------- | -------------------- | ----------------------------------------------- |
|
|
| `value` | `FeatureSlice \| undefined` | Feature slice, triggers update on change |
|
|
## Type Exports
|
|
|
|
### From `@videojs/store`
|
|
|
|
```ts
|
|
import { shallowEqual } from '@videojs/store';
|
|
```
|
|
|
|
| Export | Purpose |
|
|
| -------------- | -------------------------------- |
|
|
| `shallowEqual` | Shallow comparison for selectors |
|
|
|
|
### From `@videojs/react`
|
|
|
|
```ts
|
|
import { createPlayer, features, usePlayer } from '@videojs/react';
|
|
```
|
|
|
|
### From `@videojs/html`
|
|
|
|
```ts
|
|
import { createPlayer, features, MediaElement } from '@videojs/html';
|
|
```
|
|
|
|
| Export | Purpose |
|
|
| --------------- | --------------------------------- |
|
|
| `createPlayer` | Factory for player infrastructure |
|
|
| `features` | Feature definitions and bundles |
|
|
| `MediaElement` | Base class for UI primitives |
|