1- // Copyright © 2020-present Techassi
1+ // Copyright (c) 2020-present Techassi
22// Use of this source code is governed by a MIT-style
33// license that can be found in the LICENSE file.
4- // vue-youtube-iframe 1.0.2
4+ // vue-youtube-iframe 1.0.3
55import { h , nextTick } from 'vue' ;
66
7- const manager = {
8- factory : null ,
9- players : [ ] ,
10- events : { } ,
11- uid : 0 ,
12-
13- // registerFactory registers the YT Factory (e.g. create a new Player)
14- registerFactory ( YT ) {
15- this . factory = YT ;
16- } ,
17-
18- // registerEvents registers the YT Player events to be emitted by the component
19- registerEvents ( ) {
20- const { PlayerState } = this . factory ;
21- this . events [ PlayerState . ENDED ] = 'ended' ;
22- this . events [ PlayerState . PLAYING ] = 'playing' ;
23- this . events [ PlayerState . PAUSED ] = 'paused' ;
24- this . events [ PlayerState . BUFFERING ] = 'buffering' ;
25- this . events [ PlayerState . CUED ] = 'cued' ;
26- } ,
7+ function createManager ( ) {
8+ return {
9+ factory : undefined ,
10+ players : [ ] ,
11+ events : { } ,
12+ uid : 0 ,
13+ registerFactory ( factory ) {
14+ this . factory = factory ;
15+ } ,
16+ registerEvents ( ) {
17+ this . events [ YT . PlayerState . ENDED ] = 'ended' ;
18+ this . events [ YT . PlayerState . PLAYING ] = 'playing' ;
19+ this . events [ YT . PlayerState . PAUSED ] = 'paused' ;
20+ this . events [ YT . PlayerState . BUFFERING ] = 'buffering' ;
21+ this . events [ YT . PlayerState . CUED ] = 'cued' ;
22+ } ,
23+ register ( callback ) {
24+ this . uid ++ ;
25+ if ( this . factory != undefined ) {
26+ callback ( this . factory , `vue-youtube-iframe-${ this . uid } ` ) ;
27+ return ;
28+ }
29+ this . players . push ( callback ) ;
30+ } ,
31+ runBacklog ( ) {
32+ this . players . forEach ( ( callback ) => {
33+ if ( this . factory != undefined ) {
34+ this . uid ++ ;
35+ callback ( this . factory , `vue-youtube-iframe-${ this . uid } ` ) ;
36+ }
37+ this . players = [ ] ;
38+ } ) ;
39+ } ,
40+ } ;
41+ }
42+ const manager = createManager ( ) ;
2743
28- // register registers a new player to be initalizied and runs callback
29- register ( callback ) {
30- this . uid += 1 ;
31- if ( this . factory ) {
32- callback ( this . factory , `vue-youtube-iframe- ${ this . uid } ` ) ;
33- return ;
44+ function skipIfAutoplay ( player , playerVars ) {
45+ if ( playerVars . autoplay != undefined &&
46+ playerVars . autoplay == YT . AutoPlay . AutoPlay ) {
47+ player . mute ( ) ;
48+ if ( playerVars . start != undefined && playerVars . start != 0 ) {
49+ player . seekTo ( playerVars . start , true ) ;
3450 }
35- this . players . push ( callback ) ;
36- } ,
37-
38- // runBacklog runs backlogged initializations (when the YT factory wasn't set yet)
39- runBacklog ( ) {
40- this . players . forEach ( ( callback ) => {
41- callback ( this . factory , `vue-youtube-iframe-${ this . uid } ` ) ;
42- } ) ;
43- this . players = [ ] ;
44- } ,
45- } ;
51+ else {
52+ player . playVideo ( ) ;
53+ }
54+ }
55+ }
4656
4757const player = {
4858 name : 'YoutubeIframe' ,
@@ -58,7 +68,7 @@ const player = {
5868 playerParameters : {
5969 type : Object ,
6070 default : ( ) => ( {
61- autpplay : 0 ,
71+ autoplay : 0 ,
6272 time : 0 ,
6373 mute : 0 ,
6474 } ) ,
@@ -84,13 +94,11 @@ const player = {
8494 template : '<div><div :id="elementId"></div></div>' ,
8595 mounted ( ) {
8696 const { playerHeight, playerWidth, playerParameters, videoId } = this ;
87-
8897 manager . register ( ( factory , uid ) => {
8998 const host = this . noCookie
9099 ? 'https://www.youtube-nocookie.com'
91100 : 'https://www.youtube.com' ;
92101 this . elementId = uid ;
93-
94102 nextTick ( ) . then ( ( ) => {
95103 this . player = new factory . Player ( this . elementId , {
96104 width : playerWidth ,
@@ -100,21 +108,7 @@ const player = {
100108 host,
101109 events : {
102110 onReady : ( event ) => {
103- const p = event . target ;
104- if (
105- playerParameters . autoplay !== 'undefined' &&
106- playerParameters . autoplay === 1
107- ) {
108- p . mute ( ) ;
109- if (
110- playerParameters . start !== 'undefined' &&
111- playerParameters . start !== 0
112- ) {
113- p . seekTo ( playerParameters . start ) ;
114- } else {
115- p . playVideo ( ) ;
116- }
117- }
111+ skipIfAutoplay ( event . target , playerParameters ) ;
118112 this . $emit ( 'ready' , event ) ;
119113 } ,
120114 onStateChange : ( event ) => {
@@ -137,17 +131,16 @@ const plugin = {
137131 if ( typeof window !== 'undefined' && typeof document !== 'undefined' ) {
138132 const tag = document . createElement ( 'script' ) ;
139133 tag . src = 'https://www.youtube.com/player_api' ;
140-
141134 const firstScriptTag = document . getElementsByTagName ( 'script' ) [ 0 ] ;
142- firstScriptTag . parentNode . insertBefore ( tag , firstScriptTag ) ;
143-
144- app . component ( 'youtube-iframe' , player ) ;
145-
146- window . onYouTubeIframeAPIReady = ( ) => {
147- manager . registerFactory ( window . YT ) ;
148- manager . registerEvents ( ) ;
149- manager . runBacklog ( ) ;
150- } ;
135+ if ( firstScriptTag . parentNode != null ) {
136+ firstScriptTag . parentNode . insertBefore ( tag , firstScriptTag ) ;
137+ app . component ( 'youtube-iframe' , player ) ;
138+ window . onYouTubeIframeAPIReady = ( ) => {
139+ manager . registerFactory ( window . YT ) ;
140+ manager . registerEvents ( ) ;
141+ manager . runBacklog ( ) ;
142+ } ;
143+ }
151144 }
152145 } ,
153146} ;
0 commit comments