@@ -13,6 +13,7 @@ import { getRequestCredentials, preconnect } from '../../utils/network';
1313let warned = __DEV__ ? new Set < any > ( ) : undefined ;
1414
1515export 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
0 commit comments