Skip to content

Commit ee688f8

Browse files
committed
fix(player/react): initialize sources correctly during ssr
1 parent df13b54 commit ee688f8

7 files changed

Lines changed: 66 additions & 57 deletions

File tree

apps/site/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"@astrojs/tailwind": "^5.0.0",
3535
"@astrojs/vercel": "^5.0.0",
3636
"@iconify-json/lucide": "^1.1.112",
37-
"@maverick-js/cli": "0.40.3",
37+
"@maverick-js/cli": "0.40.4",
3838
"@tailwindcss/container-queries": "^0.1.1",
3939
"@types/markdown-it": "^12.2.0",
4040
"@types/mdast": "^4.0.0",

packages/react/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@
3535
"media-captions": "^1.0.0"
3636
},
3737
"devDependencies": {
38-
"@maverick-js/cli": "0.40.3",
38+
"@maverick-js/cli": "0.40.4",
3939
"@rollup/plugin-node-resolve": "^15.1.0",
4040
"@types/fs-extra": "^11.0.1",
4141
"@types/react": "^18.0.0",
4242
"@vitejs/plugin-react": "^4.1.0",
4343
"esbuild": "^0.16.17",
4444
"fs-extra": "^11.0.0",
45-
"maverick.js": "0.40.3",
45+
"maverick.js": "0.40.4",
4646
"media-icons": "^1.0.0",
4747
"react": "^18.0.0",
4848
"react-dom": "^18.0.0",

packages/vidstack/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
},
5151
"devDependencies": {
5252
"@floating-ui/dom": "^1.4.4",
53-
"@maverick-js/cli": "0.40.3",
53+
"@maverick-js/cli": "0.40.4",
5454
"@open-wc/semantic-dom-diff": "^0.19.5",
5555
"@open-wc/testing-helpers": "^2.1.2",
5656
"@rollup/plugin-node-resolve": "^15.1.0",
@@ -66,7 +66,7 @@
6666
"just-debounce-it": "^3.2.0",
6767
"just-throttle": "^4.2.0",
6868
"lit-html": "^2.7.4",
69-
"maverick.js": "0.40.3",
69+
"maverick.js": "0.40.4",
7070
"media-icons": "^1.0.0",
7171
"postcss": "^8.4.0",
7272
"rimraf": "^3.0.0",

packages/vidstack/src/components/player.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export class MediaPlayer
195195
el.setAttribute('data-media-player', '');
196196
setAttributeIfEmpty(el, 'tabindex', '0');
197197
setAttributeIfEmpty(el, 'role', 'region');
198+
setAttribute(el, 'data-view-type', this.$state.viewType());
198199

199200
if (__SERVER__) this._watchTitle();
200201
else effect(this._watchTitle.bind(this));
@@ -207,6 +208,7 @@ export class MediaPlayer
207208

208209
protected override onConnect(el: HTMLElement) {
209210
if (IS_IPHONE) setAttribute(el, 'data-iphone', '');
211+
setAttribute(el, 'data-view-type', this.$state.viewType());
210212

211213
canChangeVolume().then(this.$state.canSetVolume.set);
212214

packages/vidstack/src/components/provider/provider.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,23 @@ export class MediaProvider extends Component<MediaProviderProps, MediaProviderSt
2626
});
2727

2828
private _media!: MediaContext;
29+
private _sources!: SourceSelection;
2930
private _domSources = signal<MediaSrc[]>([]);
3031
private _domTracks = signal<TextTrackInit[]>([]);
3132

3233
private _loader: MediaProviderLoader | null = null;
3334

3435
protected override onSetup() {
3536
this._media = useMediaContext();
36-
if (__SERVER__) this._watchSources();
37+
this._sources = new SourceSelection(this._domSources, this._media, this.$state.loader);
3738
}
3839

3940
protected override onAttach(el: HTMLElement) {
4041
el.setAttribute('data-media-provider', '');
4142
}
4243

4344
protected override onConnect(el: HTMLElement) {
44-
this._watchSources();
45+
this._sources.connect();
4546
new Tracks(this._domTracks, this._media);
4647

4748
const resize = new ResizeObserver(animationFrameThrottle(this._onResize.bind(this)));
@@ -64,10 +65,6 @@ export class MediaProvider extends Component<MediaProviderProps, MediaProviderSt
6465
});
6566
}
6667

67-
private _watchSources() {
68-
new SourceSelection(this._domSources, this._media, this.$state.loader);
69-
}
70-
7168
protected _loadRafId = -1;
7269

7370
@method

packages/vidstack/src/components/provider/source-select.ts

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { getRequestCredentials, preconnect } from '../../utils/network';
1313
let warned = __DEV__ ? new Set<any>() : undefined;
1414

1515
export class SourceSelection {
16+
private _initialize = false;
1617
private _loaders: ReadSignal<MediaProviderLoader[]>;
1718

1819
constructor(
@@ -30,23 +31,36 @@ export class SourceSelection {
3031
: [HLS_LOADER, VIDEO_LOADER, AUDIO_LOADER];
3132
});
3233

33-
if (__SERVER__) {
34-
const { $state } = _media;
35-
$state.sources.set(normalizeSrc(_media.$props.src()));
36-
for (const src of $state.sources()) {
37-
const loader = this._loaders().find((loader) => loader.canPlay(src));
38-
if (loader) {
39-
$state.source.set(src);
40-
$state.mediaType.set(loader.mediaType(src));
41-
this._loader.set(loader);
42-
}
43-
}
44-
return;
34+
const { $state } = _media;
35+
36+
$state.sources.set(normalizeSrc(_media.$props.src()));
37+
38+
// Initialize.
39+
for (const src of $state.sources()) {
40+
const loader = this._loaders().find((loader) => loader.canPlay(src));
41+
if (!loader) continue;
42+
43+
const mediaType = loader.mediaType(src);
44+
this._media.$state.source.set(src);
45+
this._media.$state.mediaType.set(mediaType);
46+
this._media.$state.inferredViewType.set(mediaType);
47+
48+
this._loader.set(loader);
49+
this._initialize = true;
50+
}
51+
}
52+
53+
connect() {
54+
const loader = this._loader();
55+
if (this._initialize) {
56+
this._notifySourceChange(this._media.$state.source(), loader);
57+
this._notifyLoaderChange(loader);
58+
this._initialize = false;
4559
}
4660

4761
effect(this._onSourcesChange.bind(this));
4862
effect(this._onSourceChange.bind(this));
49-
effect(this._onPreconnect.bind(this));
63+
effect(this._onConnect.bind(this));
5064
effect(this._onLoadSource.bind(this));
5165
}
5266

@@ -120,36 +134,32 @@ export class SourceSelection {
120134
}
121135
}
122136

123-
this._notifySourceChange(currentSource, newSource, newLoader);
124-
this._notifyLoaderChange(peek(this._loader), newLoader);
137+
if (newSource.src !== currentSource.src || newSource.type !== currentSource.type) {
138+
this._notifySourceChange(newSource, newLoader);
139+
}
140+
141+
if (newLoader !== peek(this._loader)) {
142+
this._notifyLoaderChange(newLoader);
143+
}
125144

126145
return newSource;
127146
}
128147

129-
protected _notifySourceChange(
130-
currentSource: MediaSrc,
131-
newSource: MediaSrc,
132-
newLoader: MediaProviderLoader | null,
133-
) {
134-
if (newSource.src === currentSource.src && newSource.type === currentSource.type) return;
135-
this._media.delegate._dispatch('source-change', { detail: newSource });
148+
protected _notifySourceChange(src: MediaSrc, loader: MediaProviderLoader | null) {
149+
this._media.delegate._dispatch('source-change', { detail: src });
136150
this._media.delegate._dispatch('media-type-change', {
137-
detail: newLoader?.mediaType(newSource) || 'unknown',
151+
detail: loader?.mediaType(src) || 'unknown',
138152
});
139153
}
140154

141-
protected _notifyLoaderChange(
142-
currentLoader: MediaProviderLoader | null,
143-
newLoader: MediaProviderLoader | null,
144-
) {
145-
if (newLoader === currentLoader) return;
155+
protected _notifyLoaderChange(loader: MediaProviderLoader | null) {
146156
this._media.delegate._dispatch('provider-change', { detail: null });
147-
newLoader && peek(() => newLoader!.preconnect?.(this._media));
148-
this._loader.set(newLoader);
149-
this._media.delegate._dispatch('provider-loader-change', { detail: newLoader });
157+
loader && peek(() => loader!.preconnect?.(this._media));
158+
this._loader.set(loader);
159+
this._media.delegate._dispatch('provider-loader-change', { detail: loader });
150160
}
151161

152-
private _onPreconnect() {
162+
private _onConnect() {
153163
const provider = this._media.$provider();
154164
if (!provider) return;
155165

pnpm-lock.yaml

Lines changed: 14 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)