@@ -69,6 +69,12 @@ interface Player extends YT.Player {
69
69
// The only field available is destroy and addEventListener.
70
70
type UninitializedPlayer = Pick < Player , 'videoId' | 'destroy' | 'addEventListener' > ;
71
71
72
+ /**
73
+ * Whether we're currently rendering inside a browser. Equivalent of `Platform.isBrowser`,
74
+ * but copied over here so we don't have to add another dependency.
75
+ */
76
+ const isBrowser = typeof window === 'object' && ! ! window ;
77
+
72
78
/**
73
79
* Angular component that renders a YouTube player via the YouTube player
74
80
* iframe API.
@@ -80,7 +86,7 @@ type UninitializedPlayer = Pick<Player, 'videoId' | 'destroy' | 'addEventListene
80
86
changeDetection : ChangeDetectionStrategy . OnPush ,
81
87
encapsulation : ViewEncapsulation . None ,
82
88
// This div is *replaced* by the YouTube player embed.
83
- template : '<div #youtube_container ></div>' ,
89
+ template : '<div #youtubeContainer ></div>' ,
84
90
} )
85
91
export class YouTubePlayer implements AfterViewInit , OnDestroy , OnInit {
86
92
/** YouTube Video ID to view */
@@ -147,15 +153,21 @@ export class YouTubePlayer implements AfterViewInit, OnDestroy, OnInit {
147
153
@Output ( ) playbackRateChange = new EventEmitter < YT . OnPlaybackRateChangeEvent > ( ) ;
148
154
149
155
/** The element that will be replaced by the iframe. */
150
- @ViewChild ( 'youtube_container' , { static : false } ) youtubeContainer : ElementRef | undefined ;
156
+ @ViewChild ( 'youtubeContainer' , { static : false } )
157
+ youtubeContainer : ElementRef < HTMLElement > ;
158
+
151
159
private _youtubeContainer = new EventEmitter < HTMLElement > ( ) ;
152
160
private _destroyed = new EventEmitter < undefined > ( ) ;
153
-
154
161
private _player : Player | undefined ;
155
162
156
163
constructor ( private _ngZone : NgZone ) { }
157
164
158
165
ngOnInit ( ) {
166
+ // Don't do anything if we're not in a browser environment.
167
+ if ( ! isBrowser ) {
168
+ return ;
169
+ }
170
+
159
171
let iframeApiAvailableObs : Observable < boolean > = observableOf ( true ) ;
160
172
if ( ! window . YT ) {
161
173
if ( this . showBeforeIframeApiLoads ) {
@@ -223,19 +235,15 @@ export class YouTubePlayer implements AfterViewInit, OnDestroy, OnInit {
223
235
}
224
236
225
237
ngAfterViewInit ( ) {
226
- if ( ! this . youtubeContainer ) {
227
- return ;
228
- }
229
238
this . _youtubeContainer . emit ( this . youtubeContainer . nativeElement ) ;
230
239
}
231
240
232
241
ngOnDestroy ( ) {
233
- if ( ! this . _player ) {
234
- return ;
242
+ if ( this . _player ) {
243
+ this . _player . destroy ( ) ;
244
+ window . onYouTubeIframeAPIReady = undefined ;
245
+ this . _destroyed . emit ( ) ;
235
246
}
236
- this . _player . destroy ( ) ;
237
- window . onYouTubeIframeAPIReady = undefined ;
238
- this . _destroyed . emit ( ) ;
239
247
}
240
248
241
249
private _runInZone < T extends ( ...args : any [ ] ) => void > ( callback : T ) :
@@ -249,166 +257,122 @@ export class YouTubePlayer implements AfterViewInit, OnDestroy, OnInit {
249
257
250
258
/** See https://developers.google.com/youtube/iframe_api_reference#playVideo */
251
259
playVideo ( ) {
252
- if ( ! this . _player ) {
253
- return ;
260
+ if ( this . _player ) {
261
+ this . _player . playVideo ( ) ;
254
262
}
255
- this . _player . playVideo ( ) ;
256
263
}
257
264
258
265
/** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */
259
266
pauseVideo ( ) {
260
- if ( ! this . _player ) {
261
- return ;
267
+ if ( this . _player ) {
268
+ this . _player . pauseVideo ( ) ;
262
269
}
263
- this . _player . pauseVideo ( ) ;
264
270
}
265
271
266
272
/** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */
267
273
stopVideo ( ) {
268
- if ( ! this . _player ) {
269
- return ;
274
+ if ( this . _player ) {
275
+ this . _player . stopVideo ( ) ;
270
276
}
271
- this . _player . stopVideo ( ) ;
272
277
}
273
278
274
279
/** See https://developers.google.com/youtube/iframe_api_reference#seekTo */
275
280
seekTo ( seconds : number , allowSeekAhead : boolean ) {
276
- if ( ! this . _player ) {
277
- return ;
281
+ if ( this . _player ) {
282
+ this . _player . seekTo ( seconds , allowSeekAhead ) ;
278
283
}
279
- this . _player . seekTo ( seconds , allowSeekAhead ) ;
280
284
}
281
285
282
286
/** See https://developers.google.com/youtube/iframe_api_reference#mute */
283
287
mute ( ) {
284
- if ( ! this . _player ) {
285
- return ;
288
+ if ( this . _player ) {
289
+ this . _player . mute ( ) ;
286
290
}
287
- this . _player . mute ( ) ;
288
291
}
289
292
290
293
/** See https://developers.google.com/youtube/iframe_api_reference#unMute */
291
294
unMute ( ) {
292
- if ( ! this . _player ) {
293
- return ;
295
+ if ( this . _player ) {
296
+ this . _player . unMute ( ) ;
294
297
}
295
- this . _player . unMute ( ) ;
296
298
}
297
299
298
300
/** See https://developers.google.com/youtube/iframe_api_reference#isMuted */
299
301
isMuted ( ) : boolean {
300
- if ( ! this . _player ) {
301
- return false ;
302
- }
303
- return this . _player . isMuted ( ) ;
302
+ return ! this . _player || this . _player . isMuted ( ) ;
304
303
}
305
304
306
305
/** See https://developers.google.com/youtube/iframe_api_reference#setVolume */
307
306
setVolume ( volume : number ) {
308
- if ( ! this . _player ) {
309
- return ;
307
+ if ( this . _player ) {
308
+ this . _player . setVolume ( volume ) ;
310
309
}
311
- this . _player . setVolume ( volume ) ;
312
310
}
313
311
314
312
/** See https://developers.google.com/youtube/iframe_api_reference#getVolume */
315
313
getVolume ( ) : number {
316
- if ( ! this . _player ) {
317
- return 0 ;
318
- }
319
- return this . _player . getVolume ( ) ;
314
+ return this . _player ? this . _player . getVolume ( ) : 0 ;
320
315
}
321
316
322
317
/** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */
323
318
setPlaybackRate ( playbackRate : number ) {
324
- if ( ! this . _player ) {
325
- return ;
319
+ if ( this . _player ) {
320
+ return this . _player . setPlaybackRate ( playbackRate ) ;
326
321
}
327
- return this . _player . setPlaybackRate ( playbackRate ) ;
328
322
}
329
323
330
324
/** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */
331
325
getPlaybackRate ( ) : number {
332
- if ( ! this . _player ) {
333
- return 0 ;
334
- }
335
- return this . _player . getPlaybackRate ( ) ;
326
+ return this . _player ? this . _player . getPlaybackRate ( ) : 0 ;
336
327
}
337
328
338
329
/** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */
339
330
getAvailablePlaybackRates ( ) : number [ ] {
340
- if ( ! this . _player ) {
341
- return [ ] ;
342
- }
343
- return this . _player . getAvailablePlaybackRates ( ) ;
331
+ return this . _player ? this . _player . getAvailablePlaybackRates ( ) : [ ] ;
344
332
}
345
333
346
334
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */
347
335
getVideoLoadedFraction ( ) : number {
348
- if ( ! this . _player ) {
349
- return 0 ;
350
- }
351
- return this . _player . getVideoLoadedFraction ( ) ;
336
+ return this . _player ? this . _player . getVideoLoadedFraction ( ) : 0 ;
352
337
}
353
338
354
339
/** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */
355
340
getPlayerState ( ) : YT . PlayerState | undefined {
356
- if ( ! window . YT ) {
341
+ if ( ! isBrowser || ! window . YT ) {
357
342
return undefined ;
358
343
}
359
344
360
- if ( ! this . _player ) {
361
- return YT . PlayerState . UNSTARTED ;
362
- }
363
- return this . _player . getPlayerState ( ) ;
345
+ return this . _player ? this . _player . getPlayerState ( ) : YT . PlayerState . UNSTARTED ;
364
346
}
365
347
366
348
/** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */
367
349
getCurrentTime ( ) : number {
368
- if ( ! this . _player ) {
369
- return 0 ;
370
- }
371
- return this . _player . getCurrentTime ( ) ;
350
+ return this . _player ? this . _player . getCurrentTime ( ) : 0 ;
372
351
}
373
352
374
353
/** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */
375
354
getPlaybackQuality ( ) : YT . SuggestedVideoQuality {
376
- if ( ! this . _player ) {
377
- return 'default' ;
378
- }
379
- return this . _player . getPlaybackQuality ( ) ;
355
+ return this . _player ? this . _player . getPlaybackQuality ( ) : 'default' ;
380
356
}
381
357
382
358
/** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */
383
359
getAvailableQualityLevels ( ) : YT . SuggestedVideoQuality [ ] {
384
- if ( ! this . _player ) {
385
- return [ ] ;
386
- }
387
- return this . _player . getAvailableQualityLevels ( ) ;
360
+ return this . _player ? this . _player . getAvailableQualityLevels ( ) : [ ] ;
388
361
}
389
362
390
363
/** See https://developers.google.com/youtube/iframe_api_reference#getDuration */
391
364
getDuration ( ) : number {
392
- if ( ! this . _player ) {
393
- return 0 ;
394
- }
395
- return this . _player . getDuration ( ) ;
365
+ return this . _player ? this . _player . getDuration ( ) : 0 ;
396
366
}
397
367
398
368
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */
399
369
getVideoUrl ( ) : string {
400
- if ( ! this . _player ) {
401
- return '' ;
402
- }
403
- return this . _player . getVideoUrl ( ) ;
370
+ return this . _player ? this . _player . getVideoUrl ( ) : '' ;
404
371
}
405
372
406
373
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */
407
374
getVideoEmbedCode ( ) : string {
408
- if ( ! this . _player ) {
409
- return '' ;
410
- }
411
- return this . _player . getVideoEmbedCode ( ) ;
375
+ return this . _player ? this . _player . getVideoEmbedCode ( ) : '' ;
412
376
}
413
377
}
414
378
0 commit comments