@playkit-js/playkit-js-youtube 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### 2.2.2 (2025-04-03)
6
+
5
7
  ### 2.2.1 (2025-04-02)
6
8
 
7
9
  ## 2.2.0 (2025-03-23)
@@ -1,2 +1,2 @@
1
- var playkit;(()=>{var e={42:(e,t,n)=>{var i=n(292),a=n(791);"string"==typeof(a=a.__esModule?a.default:a)&&(a=[[e.id,a,""]]),i(a,{attributes:{id:"@playkit-js/playkit-js-youtube"},insert:function(e){window.kalturaGlobalConfig&&"string"==typeof window.kalturaGlobalConfig.stylesNonce&&e.setAttribute("nonce",window.kalturaGlobalConfig.stylesNonce),document.head.appendChild(e)},singleton:!1}),e.exports=a.locals||{}},278:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n,i,a,r=e[1]||"",o=e[3];if(!o)return r;if(t&&"function"==typeof btoa){var s=(n=o,i=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),a="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(i),"/*# ".concat(a," */")),u=o.sources.map((function(e){return"/*# sourceURL=".concat(o.sourceRoot||"").concat(e," */")}));return[r].concat(u).concat([s]).join("\n")}return[r].join("\n")}(t,e);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,i){"string"==typeof e&&(e=[[null,e,""]]);var a={};if(i)for(var r=0;r<this.length;r++){var o=this[r][0];null!=o&&(a[o]=!0)}for(var s=0;s<e.length;s++){var u=[].concat(e[s]);i&&a[u[0]]||(n&&(u[2]?u[2]="".concat(n," and ").concat(u[2]):u[2]=n),t.push(u))}},t}},292:(e,t,n)=>{"use strict";var i,a=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),r=[];function o(e){for(var t=-1,n=0;n<r.length;n++)if(r[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},i=[],a=0;a<e.length;a++){var s=e[a],u=t.base?s[0]+t.base:s[0],c=n[u]||0,l="".concat(u," ").concat(c);n[u]=c+1;var d=o(l),p={css:s[1],media:s[2],sourceMap:s[3]};-1!==d?(r[d].references++,r[d].updater(p)):r.push({identifier:l,updater:f(p,t),references:1}),i.push(l)}return i}function u(e){var t=document.createElement("style"),i=e.attributes||{};if(void 0===i.nonce){var r=n.nc;r&&(i.nonce=r)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),"function"==typeof e.insert)e.insert(t);else{var o=a(e.insert||"head");if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(t)}return t}var c,l=(c=[],function(e,t){return c[e]=t,c.filter(Boolean).join("\n")});function d(e,t,n,i){var a=n?"":i.media?"@media ".concat(i.media," {").concat(i.css,"}"):i.css;if(e.styleSheet)e.styleSheet.cssText=l(t,a);else{var r=document.createTextNode(a),o=e.childNodes;o[t]&&e.removeChild(o[t]),o.length?e.insertBefore(r,o[t]):e.appendChild(r)}}function p(e,t,n){var i=n.css,a=n.media,r=n.sourceMap;if(a?e.setAttribute("media",a):e.removeAttribute("media"),r&&btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var h=null,y=0;function f(e,t){var n,i,a;if(t.singleton){var r=y++;n=h||(h=u(t)),i=d.bind(null,n,r,!1),a=d.bind(null,n,r,!0)}else n=u(t),i=p.bind(null,n,t),a=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else a()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=(void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i));var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var i=0;i<n.length;i++){var a=o(n[i]);r[a].references--}for(var u=s(e,t),c=0;c<n.length;c++){var l=o(n[c]);0===r[l].references&&(r[l].updater(),r.splice(l,1))}n=u}}}},773:e=>{"use strict";e.exports=KalturaPlayer},791:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});var i=n(278),a=n.n(i)()(!0);a.push([e.id,".playkit-iOS .playkit-engine-youtube,\n.playkit-Mac-OS .playkit-engine-youtube {\n object-fit: fill;\n}\n","",{version:3,sources:["style.css"],names:[],mappings:"AAAA;;EAEE,gBAAgB;AAClB",file:"style.css",sourcesContent:[".playkit-iOS .playkit-engine-youtube,\n.playkit-Mac-OS .playkit-engine-youtube {\n object-fit: fill;\n}\n"]}]);const r=a},948:(e,t,n)=>{"use strict";t.L=void 0;const i=n(773),a="YouTubeClipChapter";class r extends i.BasePlugin{constructor(e,t,n){super(e,t,n)}get timelineManager(){return this.player.getService("timeline")}static isValid(){return!0}loadMedia(){this.eventManager.listenOnce(this.player,this.player.Event.Core.SOURCE_SELECTED,(()=>{if(this.player.engineType===this.player.EngineType.YOUTUBE&&this.timelineManager){const{seekFrom:e,clipTo:t,duration:n}=this.player.config.sources,i=!!(t&&n&&t<n);(e||i)&&(this.timelineManager.disableChapters(),e&&this.timelineManager.addKalturaCuePoint(e,a,0),i&&this.timelineManager.addKalturaCuePoint(t,a,1))}}))}reset(){}destroy(){}}t.L=r}},t={};function n(i){var a=t[i];if(void 0!==a)return a.exports;var r=t[i]={id:i,exports:{}};return e[i](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var i={};(()=>{"use strict";n.r(i),n.d(i,{Engine:()=>s,NAME:()=>d,Plugin:()=>c.L,VERSION:()=>l});const e=KalturaPlayer.core;function t(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o={controls:0,autoplay:0,origin:window.location.origin,iv_load_policy:3,disablekb:1,modestbranding:1,playsinline:1,rel:0,fs:0,cc_load_policy:1},s=function(n){var i,s;function u(t,i){var o;return r(a(o=n.call(this)||this),"_isAdaptiveBitrate",!0),r(a(o),"_loaded",!1),r(a(o),"_isSeeking",!1),r(a(o),"_firstPlaying",!0),r(a(o),"_currentState",null),r(a(o),"_playerTracks",[]),r(a(o),"_clipToInterval",null),o._eventManager=new e.EventManager,o._createVideoElement(),o._init(t,i),o}s=n,(i=u).prototype=Object.create(s.prototype),i.prototype.constructor=i,i.__proto__=s,u.isSupported=function(){return!0},u.createEngine=function(e,t){return new this(e,t)},u.canPlaySource=function(e){var t="string"==typeof e.mimetype&&"video/youtube"===e.mimetype.toLowerCase();return u._logger.debug("canPlayType result for mimeType: "+e.mimetype+" is "+t.toString()),t},u.runCapabilities=function(){},u.getCapabilities=function(){var e,t=!1;"connection"in navigator&&navigator.connection&&(t=!!navigator.connection.saveData);var n=((e={})[u.id]={autoplay:!1,mutedAutoPlay:!t},e);return Promise.resolve(n)},u.prepareVideoElement=function(){u._logger.debug("Prepare the video element for playing not supported")};var c,l,d=u.prototype;return d.restore=function(e,t){this.reset(),this._init(e,t)},d._reset=function(){this._stopSeekTargetWatchDog(),this._stopPlayingWatchDog(),this.detach(),this._playerReady()&&this._api.stopVideo&&this._api.stopVideo(),this._loaded=!1,this._firstPlaying=!0,this._isSeeking=!1,this._isAdaptiveBitrate=!0,this._playerTracks=[],this._currentState=null,this._clipToInterval&&(clearInterval(this._clipToInterval),this._clipToInterval=null)},d.reset=function(){this._reset(),this._eventManager.removeAll(),this._api&&this._api.destroy&&this._api.destroy()},d.destroy=function(){this._reset(),this._api&&this._api.destroy&&this._api.destroy(),this._eventManager.destroy()},d.attach=function(){},d.detach=function(){},d.getVideoElement=function(){return this._el},d.selectVideoTrack=function(t){this._api&&t instanceof e.VideoTrack&&(!t.active||this.isAdaptiveBitrateEnabled())&&(this.isAdaptiveBitrateEnabled()&&this.dispatchEvent(e.EventType.ABR_MODE_CHANGED,{mode:"manual"}),this._isAdaptiveBitrate=!1,this._api.setPlaybackQuality(t.label))},d.selectAudioTrack=function(e){u._logger.info("audio track switching not supported, cannot switch to "+e.language)},d.selectTextTrack=function(e){u._logger.info("text track switching not supported, cannot switch to "+e.language)},d.hideTextTrack=function(){},d.enableAdaptiveBitrate=function(){this._api&&(this._api.setPlaybackQuality("default"),this._isAdaptiveBitrate=!0)},d.isAdaptiveBitrateEnabled=function(){return this._isAdaptiveBitrate},d.seekToLiveEdge=function(){},d.attachMediaSource=function(){},d.detachMediaSource=function(){},d.getStartTimeOfDvrWindow=function(){return 0},d.isLive=function(){return!1},d.play=function(){this._api&&(this.currentTime===this.duration&&(this.currentTime=0),this._api.playVideo())},d.pause=function(){this._api&&this._api.pauseVideo&&this._api.pauseVideo()},d.load=function(e){var t=this;return this._sdkLoaded.then((function(){var n={videoId:t._source.url,startSeconds:e&&e>0?e:0};t._api.cueVideoById(n),t._loaded=!0})).catch((function(e){return Promise.reject(e)})),this._videoLoaded={},this._videoLoaded.promise=new Promise((function(e,n){t._videoLoaded.resolve=e,t._videoLoaded.reject=n})),this._videoLoaded.promise},d._playerReady=function(){return!(!this._api||!this._loaded)},d._parseVideoTracks=function(){var t=this._api.getAvailableQualityLevels(),n=this._api.getPlaybackQuality(),i=[];return t.forEach((function(t,a){var r={active:n===t,label:t,bandwidth:0,width:a+1,height:a+1,language:"",index:a};i.push(new e.VideoTrack(r))})),i},d._startSeekTargetWatchDog=function(){var t=this,n=this.currentTime;this._stopSeekTargetWatchDog(),this._seekTargetIntervalId=setInterval((function(){t.paused&&t._isSeeking?t.currentTime!==n&&(t.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),t.dispatchEvent(new e.FakeEvent(e.EventType.SEEKED)),t._isSeeking=!1):t._stopSeekTargetWatchDog()}),250)},d._stopSeekTargetWatchDog=function(){this._seekTargetIntervalId&&(clearInterval(this._seekTargetIntervalId),this._seekTargetIntervalId=null)},d._init=function(t,n){var i=this;this._source=t,this._config=n,this._api=null,this._videoLoaded=null,this._playingIntervalId=null;var a=function(t){var n=new e.Error(e.Error.Severity.CRITICAL,e.Error.Category.PLAYER,e.Error.Code.LOAD_FAILED,t);i.dispatchEvent(new e.FakeEvent(e.EventType.ERROR,n))};this._sdkLoaded=new Promise((function(e,t){i._apiReady=function(){(i._config.playback.muted||i._config.playback.autoplay)&&(i._api.mute&&i._api.mute(),i._muted=!0),e()},i._apiError=function(e){var n=i._getYoutubeErrorCodeData(e.data);a(n),t(e.data)}})),this._loadYouTubeIframeAPI().then((function(){i._loadYouTubePlayer()})).catch((function(e){a(e)}))},d._createVideoElement=function(){var t=this._el=e.Utils.Dom.createElement("div");e.Utils.Dom.setAttribute(t,"id",e.Utils.Generator.uniqueId(5)),e.Utils.Dom.setAttribute(t,"tabindex","-1")},d._getYoutubeErrorCodeData=function(e){switch(e){case 2:return{code:e,message:"Invalid params"};case 5:return{code:e,message:"Error while trying to play the video"};case 100:return{code:e,message:"Video not found"};case 101:case 150:return{code:e,message:"The owner of the requested video does not allow it to be played in embedded players"};default:return{code:e,message:"Unknown error"}}},d._loadYouTubePlayer=function(){var t=this,n=function(){var n={playerVars:o,events:{onReady:t._apiReady,onError:t._apiError,onStateChange:function(e){return t._onPlayerStateChange(e)},onPlaybackQualityChange:function(e){return t._onPlaybackQualityChange(e)},onVolumeChange:function(){return t.dispatchEvent(new e.FakeEvent(e.EventType.VOLUME_CHANGE))}}};if(n.playerVars.playsinline=t._config.playback.playsinline?1:0,n.playerVars.autoplay=t._config.playback.autoplay?1:0,e.Utils.Object.hasPropertyPath(t._config,"playback.options.youtube")){var i=t._config.playback.options.youtube;e.Utils.Object.mergeDeep(n.playerVars,i.playerVars)}t._api=new window.YT.Player(t._el.id,n)};if(this._api)return this._apiReady();window&&window.YT&&window.YT.Player?n():window.onYouTubeIframeAPIReady=n},d._loadYouTubeIframeAPI=function(){var t=this;return new Promise((function(n,i){if(window&&window.YT&&window.YT.Player)return n();var a=e.Utils.Dom.createElement("script"),r="https://www.youtube.com/iframe_api";e.Utils.Object.hasPropertyPath(t._config,"playback.options.youtube")&&t._config.playback.options.youtube.iframeApi&&(r=t._config.playback.options.youtube.iframeApi),a.src=r,a.async=!0,a.onload=function(){n()},a.onerror=function(){i({message:"Youtube Iframe API loading failed: "+r})};var o=document.getElementsByTagName("script")[0];o&&o.parentNode&&o.parentNode.insertBefore(a,o)}))},d._getPlayerStateKey=function(e){var t=window.YT.PlayerState;return Object.keys(t).find((function(n){return t[n]===e}))||"UNKNOWN"},d._onPlayerStateChange=function(e){var t=window.YT.PlayerState,n=e.data;if(u._logger.info("player state changed from "+this._getPlayerStateKey(this._currentState)+" to "+this._getPlayerStateKey(n)),n!==this._currentState)switch(this._currentState=n,this._currentState){case t.UNSTARTED:this._handleLoaded();break;case t.ENDED:this._onEnded();break;case t.PLAYING:this._firstPlaying&&this._handleFirstPlaying(),this._onPlaying();break;case t.PAUSED:this._onPaused();break;case t.BUFFERING:this._onBuffering();case t.CUED:}},d._onPlaybackQualityChange=function(t){var n=this._playerTracks.find((function(n){return n instanceof e.VideoTrack&&n.label===t.data}));this.dispatchEvent(e.EventType.VIDEO_TRACK_CHANGED,{selectedVideoTrack:n})},d._handleClipTo=function(){var e=this;this._clipToInterval&&clearInterval(this._clipToInterval);var t=this._config.sources.clipTo;this._api&&t&&this.currentTime<t&&(this._clipToInterval=setInterval((function(){e._api.getCurrentTime()>=t&&(e._api.pauseVideo(),clearInterval(e._clipToInterval))}),200))},d._onPlaying=function(){this._handleClipTo(),this.dispatchEvent(new e.FakeEvent(e.EventType.PLAY)),this.dispatchEvent(new e.FakeEvent(e.EventType.PLAYING)),this._startPlayingWatchDog(),this._isSeeking&&(this._isSeeking=!1,this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this.dispatchEvent(new e.FakeEvent(e.EventType.SEEKED)))},d._handleLoaded=function(){this._loaded&&(this.dispatchEvent(new e.FakeEvent(e.EventType.LOADED_METADATA)),this.dispatchEvent(new e.FakeEvent(e.EventType.LOADED_DATA)),this._videoLoaded.resolve({tracks:this._playerTracks}))},d._handleFirstPlaying=function(){this._firstPlaying=!1,this.dispatchEvent(new e.FakeEvent(e.EventType.DURATION_CHANGE));var t=this._config.sources.seekFrom;this._api&&t&&this._api.seekTo(t),this._api&&this._config.sources.captions.length>0&&this._api.setOption("captions","track",{})},d._onBuffering=function(){this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.WAITING))},d._onPaused=function(){this._isSeeking&&(this._isSeeking=!1),this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this.dispatchEvent(new e.FakeEvent(e.EventType.PAUSE))},d._onEnded=function(){this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this.dispatchEvent(new e.FakeEvent(e.EventType.PAUSE)),this.dispatchEvent(new e.FakeEvent(e.EventType.ENDED))},d._startPlayingWatchDog=function(){var t=this;this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this._playingIntervalId=setInterval((function(){t._isSeeking||t.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE))}),250)},d._stopPlayingWatchDog=function(){clearInterval(this._playingIntervalId),this._playingIntervalId=null},d.getThumbnail=function(e){return null},d.resetAllCues=function(){},d.enterPictureInPicture=function(){},d.exitPictureInPicture=function(){},d.isPictureInPictureSupported=function(){return!1},c=u,(l=[{key:"id",get:function(){return u.id}},{key:"src",set:function(e){this._source.url=e},get:function(){return this._loaded&&this._source?this._source.url:""}},{key:"currentTime",get:function(){return this._playerReady()?this._api.getCurrentTime():0},set:function(t){this._api&&this.currentTime!==t&&(this._isSeeking=!0,this._api.seekTo(t,!0),this.dispatchEvent(new e.FakeEvent(e.EventType.SEEKING)),this.paused&&this._startSeekTargetWatchDog())}},{key:"duration",get:function(){return this._playerReady()?this._api.getDuration():NaN}},{key:"volume",set:function(e){this._playerReady()&&this._api.setVolume(100*e)},get:function(){return this._playerReady()?this._api.getVolume()/100:1}},{key:"paused",get:function(){return!this._playerReady()||![window.YT.PlayerState.PLAYING,window.YT.PlayerState.BUFFERING].includes(this._api.getPlayerState())}},{key:"seeking",get:function(){return this._isSeeking}},{key:"seekable",get:function(){var e=this;return{length:1,start:function(){return 0},end:function(){return e._api?e.currentTime:0}}}},{key:"played",get:function(){var e=this;return{length:1,start:function(){return 0},end:function(){return e._api?e.currentTime:0}}}},{key:"buffered",get:function(){var e=this;return{length:1,start:function(){return 0},end:function(){return e._api&&e._api.getVideoLoadedFraction?e._api.getVideoLoadedFraction()*e.duration:0}}}},{key:"muted",set:function(e){this._playerReady()&&(e?this._api.mute():this._api.unMute(),this._muted=e)},get:function(){var e=!1;return this._playerReady()&&(e="boolean"==typeof this._muted?this._muted:this._api.isMuted()),e}},{key:"defaultMuted",get:function(){return!1}},{key:"poster",set:function(e){},get:function(){return""}},{key:"preload",set:function(e){},get:function(){return"none"}},{key:"autoplay",set:function(e){},get:function(){return!1}},{key:"loop",set:function(e){},get:function(){return!1}},{key:"controls",set:function(e){},get:function(){return!1}},{key:"playbackRate",set:function(e){this._api&&this._api.setPlaybackRate(e)},get:function(){return this._playerReady()?this._api.getPlaybackRate():1}},{key:"defaultPlaybackRate",set:function(e){},get:function(){return 1}},{key:"ended",get:function(){return!!this._playerReady()&&this._api.getPlayerState()===window.YT.PlayerState.ENDED}},{key:"error",get:function(){return null}},{key:"networkState",get:function(){if(!this._playerReady())return 0;var e=window.YT.PlayerState;switch(this._api.getPlayerState()){case e.UNSTARTED:return 0;case e.BUFFERING:return 2;default:return 1}}},{key:"readyState",get:function(){if(!this._api)return 0;var e=window.YT.PlayerState;switch(this._api.getPlayerState()){case e.UNSTARTED:return 0;case e.BUFFERING:return 2;default:return 4}}},{key:"videoHeight",get:function(){return-1}},{key:"videoWidth",get:function(){return-1}},{key:"playsinline",set:function(e){},get:function(){return this._config.playsinline}},{key:"crossOrigin",set:function(e){},get:function(){return null}},{key:"playbackRates",get:function(){var e=u.PLAYBACK_RATES;if(this._playerReady()){var t=this._api.getAvailablePlaybackRates();t&&Array.isArray(t)&&(e=t)}return e}},{key:"isInPictureInPicture",get:function(){return!1}},{key:"targetBuffer",get:function(){return NaN}},{key:"availableBuffer",get:function(){return NaN}}])&&t(c.prototype,l),u}(e.FakeEventTarget);r(s,"_logger",(0,e.getLogger)("Youtube")),r(s,"id","youtube"),r(s,"PLAYBACK_RATES",[1]),n(42);var u=n(773),c=n(948),l="2.2.1",d="@playkit-js/playkit-js-youtube";(0,u.registerPlugin)("youtube",c.L),s.isSupported()&&(0,e.registerEngine)(s.id,s)})(),(playkit=void 0===playkit?{}:playkit).youtube=i})();
1
+ var playkit;(()=>{var e={42:(e,t,n)=>{var i=n(292),a=n(791);"string"==typeof(a=a.__esModule?a.default:a)&&(a=[[e.id,a,""]]),i(a,{attributes:{id:"@playkit-js/playkit-js-youtube"},insert:function(e){window.kalturaGlobalConfig&&"string"==typeof window.kalturaGlobalConfig.stylesNonce&&e.setAttribute("nonce",window.kalturaGlobalConfig.stylesNonce),document.head.appendChild(e)},singleton:!1}),e.exports=a.locals||{}},278:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n,i,a,r=e[1]||"",o=e[3];if(!o)return r;if(t&&"function"==typeof btoa){var s=(n=o,i=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),a="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(i),"/*# ".concat(a," */")),u=o.sources.map((function(e){return"/*# sourceURL=".concat(o.sourceRoot||"").concat(e," */")}));return[r].concat(u).concat([s]).join("\n")}return[r].join("\n")}(t,e);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,i){"string"==typeof e&&(e=[[null,e,""]]);var a={};if(i)for(var r=0;r<this.length;r++){var o=this[r][0];null!=o&&(a[o]=!0)}for(var s=0;s<e.length;s++){var u=[].concat(e[s]);i&&a[u[0]]||(n&&(u[2]?u[2]="".concat(n," and ").concat(u[2]):u[2]=n),t.push(u))}},t}},292:(e,t,n)=>{"use strict";var i,a=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),r=[];function o(e){for(var t=-1,n=0;n<r.length;n++)if(r[n].identifier===e){t=n;break}return t}function s(e,t){for(var n={},i=[],a=0;a<e.length;a++){var s=e[a],u=t.base?s[0]+t.base:s[0],c=n[u]||0,l="".concat(u," ").concat(c);n[u]=c+1;var d=o(l),p={css:s[1],media:s[2],sourceMap:s[3]};-1!==d?(r[d].references++,r[d].updater(p)):r.push({identifier:l,updater:f(p,t),references:1}),i.push(l)}return i}function u(e){var t=document.createElement("style"),i=e.attributes||{};if(void 0===i.nonce){var r=n.nc;r&&(i.nonce=r)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),"function"==typeof e.insert)e.insert(t);else{var o=a(e.insert||"head");if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(t)}return t}var c,l=(c=[],function(e,t){return c[e]=t,c.filter(Boolean).join("\n")});function d(e,t,n,i){var a=n?"":i.media?"@media ".concat(i.media," {").concat(i.css,"}"):i.css;if(e.styleSheet)e.styleSheet.cssText=l(t,a);else{var r=document.createTextNode(a),o=e.childNodes;o[t]&&e.removeChild(o[t]),o.length?e.insertBefore(r,o[t]):e.appendChild(r)}}function p(e,t,n){var i=n.css,a=n.media,r=n.sourceMap;if(a?e.setAttribute("media",a):e.removeAttribute("media"),r&&btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var h=null,y=0;function f(e,t){var n,i,a;if(t.singleton){var r=y++;n=h||(h=u(t)),i=d.bind(null,n,r,!1),a=d.bind(null,n,r,!0)}else n=u(t),i=p.bind(null,n,t),a=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else a()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=(void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i));var n=s(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var i=0;i<n.length;i++){var a=o(n[i]);r[a].references--}for(var u=s(e,t),c=0;c<n.length;c++){var l=o(n[c]);0===r[l].references&&(r[l].updater(),r.splice(l,1))}n=u}}}},773:e=>{"use strict";e.exports=KalturaPlayer},791:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});var i=n(278),a=n.n(i)()(!0);a.push([e.id,".playkit-iOS .playkit-engine-youtube,\n.playkit-Mac-OS .playkit-engine-youtube {\n object-fit: fill;\n}\n","",{version:3,sources:["style.css"],names:[],mappings:"AAAA;;EAEE,gBAAgB;AAClB",file:"style.css",sourcesContent:[".playkit-iOS .playkit-engine-youtube,\n.playkit-Mac-OS .playkit-engine-youtube {\n object-fit: fill;\n}\n"]}]);const r=a},948:(e,t,n)=>{"use strict";t.L=void 0;const i=n(773),a="YouTubeClipChapter";class r extends i.BasePlugin{constructor(e,t,n){super(e,t,n)}get timelineManager(){return this.player.getService("timeline")}static isValid(){return!0}loadMedia(){this.eventManager.listenOnce(this.player,this.player.Event.Core.SOURCE_SELECTED,(()=>{if(this.player.engineType===this.player.EngineType.YOUTUBE&&this.timelineManager){const{seekFrom:e,clipTo:t,duration:n}=this.player.config.sources,i=!!(t&&n&&t<n);(e||i)&&(this.timelineManager.disableChapters(),e&&this.timelineManager.addKalturaCuePoint(e,a,0),i&&this.timelineManager.addKalturaCuePoint(t,a,1))}}))}reset(){}destroy(){}}t.L=r}},t={};function n(i){var a=t[i];if(void 0!==a)return a.exports;var r=t[i]={id:i,exports:{}};return e[i](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var i={};(()=>{"use strict";n.r(i),n.d(i,{Engine:()=>s,NAME:()=>d,Plugin:()=>c.L,VERSION:()=>l});const e=KalturaPlayer.core;function t(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o={controls:0,autoplay:0,origin:window.location.origin,iv_load_policy:3,disablekb:1,modestbranding:1,playsinline:1,rel:0,fs:0,cc_load_policy:1},s=function(n){var i,s;function u(t,i){var o;return r(a(o=n.call(this)||this),"_isAdaptiveBitrate",!0),r(a(o),"_loaded",!1),r(a(o),"_isSeeking",!1),r(a(o),"_firstPlaying",!0),r(a(o),"_currentState",null),r(a(o),"_playerTracks",[]),r(a(o),"_clipToInterval",null),o._eventManager=new e.EventManager,o._createVideoElement(),o._init(t,i),o}s=n,(i=u).prototype=Object.create(s.prototype),i.prototype.constructor=i,i.__proto__=s,u.isSupported=function(){return!0},u.createEngine=function(e,t){return new this(e,t)},u.canPlaySource=function(e){var t="string"==typeof e.mimetype&&"video/youtube"===e.mimetype.toLowerCase();return u._logger.debug("canPlayType result for mimeType: "+e.mimetype+" is "+t.toString()),t},u.runCapabilities=function(){},u.getCapabilities=function(){var e,t=!1;"connection"in navigator&&navigator.connection&&(t=!!navigator.connection.saveData);var n=((e={})[u.id]={autoplay:!1,mutedAutoPlay:!t},e);return Promise.resolve(n)},u.prepareVideoElement=function(){u._logger.debug("Prepare the video element for playing not supported")};var c,l,d=u.prototype;return d.restore=function(e,t){this.reset(),this._init(e,t)},d._reset=function(){this._stopSeekTargetWatchDog(),this._stopPlayingWatchDog(),this.detach(),this._playerReady()&&this._api.stopVideo&&this._api.stopVideo(),this._loaded=!1,this._firstPlaying=!0,this._isSeeking=!1,this._isAdaptiveBitrate=!0,this._playerTracks=[],this._currentState=null,this._clipToInterval&&(clearInterval(this._clipToInterval),this._clipToInterval=null)},d.reset=function(){this._reset(),this._eventManager.removeAll(),this._api&&this._api.destroy&&this._api.destroy()},d.destroy=function(){this._reset(),this._api&&this._api.destroy&&this._api.destroy(),this._eventManager.destroy()},d.attach=function(){},d.detach=function(){},d.getVideoElement=function(){return this._el},d.selectVideoTrack=function(t){this._api&&t instanceof e.VideoTrack&&(!t.active||this.isAdaptiveBitrateEnabled())&&(this.isAdaptiveBitrateEnabled()&&this.dispatchEvent(e.EventType.ABR_MODE_CHANGED,{mode:"manual"}),this._isAdaptiveBitrate=!1,this._api.setPlaybackQuality(t.label))},d.selectAudioTrack=function(e){u._logger.info("audio track switching not supported, cannot switch to "+e.language)},d.selectTextTrack=function(e){u._logger.info("text track switching not supported, cannot switch to "+e.language)},d.hideTextTrack=function(){},d.enableAdaptiveBitrate=function(){this._api&&(this._api.setPlaybackQuality("default"),this._isAdaptiveBitrate=!0)},d.isAdaptiveBitrateEnabled=function(){return this._isAdaptiveBitrate},d.seekToLiveEdge=function(){},d.attachMediaSource=function(){},d.detachMediaSource=function(){},d.getStartTimeOfDvrWindow=function(){return 0},d.isLive=function(){return!1},d.play=function(){this._api&&(this.currentTime===this.duration&&(this.currentTime=0),this._api.playVideo())},d.pause=function(){this._api&&this._api.pauseVideo&&this._api.pauseVideo()},d.load=function(e){var t=this;return this._sdkLoaded.then((function(){var n={videoId:t._source.url,startSeconds:e&&e>0?e:0};t._api.cueVideoById(n),t._loaded=!0})).catch((function(e){return Promise.reject(e)})),this._videoLoaded={},this._videoLoaded.promise=new Promise((function(e,n){t._videoLoaded.resolve=e,t._videoLoaded.reject=n})),this._videoLoaded.promise},d._playerReady=function(){return!(!this._api||!this._loaded)},d._parseVideoTracks=function(){var t=this._api.getAvailableQualityLevels(),n=this._api.getPlaybackQuality(),i=[];return t.forEach((function(t,a){var r={active:n===t,label:t,bandwidth:0,width:a+1,height:a+1,language:"",index:a};i.push(new e.VideoTrack(r))})),i},d._startSeekTargetWatchDog=function(){var t=this,n=this.currentTime;this._stopSeekTargetWatchDog(),this._seekTargetIntervalId=setInterval((function(){t.paused&&t._isSeeking?t.currentTime!==n&&(t.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),t.dispatchEvent(new e.FakeEvent(e.EventType.SEEKED)),t._isSeeking=!1):t._stopSeekTargetWatchDog()}),250)},d._stopSeekTargetWatchDog=function(){this._seekTargetIntervalId&&(clearInterval(this._seekTargetIntervalId),this._seekTargetIntervalId=null)},d._init=function(t,n){var i=this;this._source=t,this._config=n,this._api=null,this._videoLoaded=null,this._playingIntervalId=null;var a=function(t){var n=new e.Error(e.Error.Severity.CRITICAL,e.Error.Category.PLAYER,e.Error.Code.LOAD_FAILED,t);i.dispatchEvent(new e.FakeEvent(e.EventType.ERROR,n))};this._sdkLoaded=new Promise((function(e,t){i._apiReady=function(){(i._config.playback.muted||i._config.playback.autoplay)&&(i._api.mute&&i._api.mute(),i._muted=!0),e()},i._apiError=function(e){var n=i._getYoutubeErrorCodeData(e.data);a(n),t(e.data)}})),this._loadYouTubeIframeAPI().then((function(){i._loadYouTubePlayer()})).catch((function(e){a(e)}))},d._createVideoElement=function(){var t=this._el=e.Utils.Dom.createElement("div");e.Utils.Dom.setAttribute(t,"id",e.Utils.Generator.uniqueId(5)),e.Utils.Dom.setAttribute(t,"tabindex","-1")},d._getYoutubeErrorCodeData=function(e){switch(e){case 2:return{code:e,message:"Invalid params"};case 5:return{code:e,message:"Error while trying to play the video"};case 100:return{code:e,message:"Video not found"};case 101:case 150:return{code:e,message:"The owner of the requested video does not allow it to be played in embedded players"};default:return{code:e,message:"Unknown error"}}},d._loadYouTubePlayer=function(){var t=this,n=function(){var n={playerVars:o,events:{onReady:t._apiReady,onError:t._apiError,onStateChange:function(e){return t._onPlayerStateChange(e)},onPlaybackQualityChange:function(e){return t._onPlaybackQualityChange(e)},onVolumeChange:function(){return t.dispatchEvent(new e.FakeEvent(e.EventType.VOLUME_CHANGE))}}};if(n.playerVars.playsinline=t._config.playback.playsinline?1:0,n.playerVars.autoplay=t._config.playback.autoplay?1:0,e.Utils.Object.hasPropertyPath(t._config,"playback.options.youtube")){var i=t._config.playback.options.youtube;e.Utils.Object.mergeDeep(n.playerVars,i.playerVars)}t._api=new window.YT.Player(t._el.id,n)};if(this._api)return this._apiReady();window&&window.YT&&window.YT.Player?n():window.onYouTubeIframeAPIReady=n},d._loadYouTubeIframeAPI=function(){var t=this;return new Promise((function(n,i){if(window&&window.YT&&window.YT.Player)return n();var a=e.Utils.Dom.createElement("script"),r="https://www.youtube.com/iframe_api";e.Utils.Object.hasPropertyPath(t._config,"playback.options.youtube")&&t._config.playback.options.youtube.iframeApi&&(r=t._config.playback.options.youtube.iframeApi),a.src=r,a.async=!0,a.onload=function(){n()},a.onerror=function(){i({message:"Youtube Iframe API loading failed: "+r})};var o=document.getElementsByTagName("script")[0];o&&o.parentNode&&o.parentNode.insertBefore(a,o)}))},d._getPlayerStateKey=function(e){var t=window.YT.PlayerState;return Object.keys(t).find((function(n){return t[n]===e}))||"UNKNOWN"},d._onPlayerStateChange=function(e){var t=window.YT.PlayerState,n=e.data;if(u._logger.info("player state changed from "+this._getPlayerStateKey(this._currentState)+" to "+this._getPlayerStateKey(n)),n!==this._currentState)switch(this._currentState=n,this._currentState){case t.UNSTARTED:this._handleLoaded();break;case t.ENDED:this._onEnded();break;case t.PLAYING:this._firstPlaying&&this._handleFirstPlaying(),this._onPlaying();break;case t.PAUSED:this._onPaused();break;case t.BUFFERING:this._onBuffering();case t.CUED:}},d._onPlaybackQualityChange=function(t){var n=this._playerTracks.find((function(n){return n instanceof e.VideoTrack&&n.label===t.data}));this.dispatchEvent(e.EventType.VIDEO_TRACK_CHANGED,{selectedVideoTrack:n})},d._handleClipTo=function(){var e=this;this._clipToInterval&&clearInterval(this._clipToInterval);var t=this._config.sources.clipTo;this._api&&t&&this.currentTime<t&&(this._clipToInterval=setInterval((function(){e._api.getCurrentTime()>=t&&(e._api.pauseVideo(),clearInterval(e._clipToInterval))}),200))},d._onPlaying=function(){this._handleClipTo(),this.dispatchEvent(new e.FakeEvent(e.EventType.PLAY)),this.dispatchEvent(new e.FakeEvent(e.EventType.PLAYING)),this._startPlayingWatchDog(),this._isSeeking&&(this._isSeeking=!1,this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this.dispatchEvent(new e.FakeEvent(e.EventType.SEEKED)))},d._handleLoaded=function(){this._loaded&&(this.dispatchEvent(new e.FakeEvent(e.EventType.LOADED_METADATA)),this.dispatchEvent(new e.FakeEvent(e.EventType.LOADED_DATA)),this._videoLoaded.resolve({tracks:this._playerTracks}))},d._handleFirstPlaying=function(){this._firstPlaying=!1,this.dispatchEvent(new e.FakeEvent(e.EventType.DURATION_CHANGE));var t=this._config.sources,n=t.seekFrom,i=t.captions;this._api&&n&&this._api.seekTo(n),this._api&&i&&i.length>0&&this._api.setOption("captions","track",{})},d._onBuffering=function(){this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.WAITING))},d._onPaused=function(){this._isSeeking&&(this._isSeeking=!1),this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this.dispatchEvent(new e.FakeEvent(e.EventType.PAUSE))},d._onEnded=function(){this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this.dispatchEvent(new e.FakeEvent(e.EventType.PAUSE)),this.dispatchEvent(new e.FakeEvent(e.EventType.ENDED))},d._startPlayingWatchDog=function(){var t=this;this._stopPlayingWatchDog(),this.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE)),this._playingIntervalId=setInterval((function(){t._isSeeking||t.dispatchEvent(new e.FakeEvent(e.EventType.TIME_UPDATE))}),250)},d._stopPlayingWatchDog=function(){clearInterval(this._playingIntervalId),this._playingIntervalId=null},d.getThumbnail=function(e){return null},d.resetAllCues=function(){},d.enterPictureInPicture=function(){},d.exitPictureInPicture=function(){},d.isPictureInPictureSupported=function(){return!1},c=u,(l=[{key:"id",get:function(){return u.id}},{key:"src",set:function(e){this._source.url=e},get:function(){return this._loaded&&this._source?this._source.url:""}},{key:"currentTime",get:function(){return this._playerReady()?this._api.getCurrentTime():0},set:function(t){this._api&&this.currentTime!==t&&(this._isSeeking=!0,this._api.seekTo(t,!0),this.dispatchEvent(new e.FakeEvent(e.EventType.SEEKING)),this.paused&&this._startSeekTargetWatchDog())}},{key:"duration",get:function(){return this._playerReady()?this._api.getDuration():NaN}},{key:"volume",set:function(e){this._playerReady()&&this._api.setVolume(100*e)},get:function(){return this._playerReady()?this._api.getVolume()/100:1}},{key:"paused",get:function(){return!this._playerReady()||![window.YT.PlayerState.PLAYING,window.YT.PlayerState.BUFFERING].includes(this._api.getPlayerState())}},{key:"seeking",get:function(){return this._isSeeking}},{key:"seekable",get:function(){var e=this;return{length:1,start:function(){return 0},end:function(){return e._api?e.currentTime:0}}}},{key:"played",get:function(){var e=this;return{length:1,start:function(){return 0},end:function(){return e._api?e.currentTime:0}}}},{key:"buffered",get:function(){var e=this;return{length:1,start:function(){return 0},end:function(){return e._api&&e._api.getVideoLoadedFraction?e._api.getVideoLoadedFraction()*e.duration:0}}}},{key:"muted",set:function(e){this._playerReady()&&(e?this._api.mute():this._api.unMute(),this._muted=e)},get:function(){var e=!1;return this._playerReady()&&(e="boolean"==typeof this._muted?this._muted:this._api.isMuted()),e}},{key:"defaultMuted",get:function(){return!1}},{key:"poster",set:function(e){},get:function(){return""}},{key:"preload",set:function(e){},get:function(){return"none"}},{key:"autoplay",set:function(e){},get:function(){return!1}},{key:"loop",set:function(e){},get:function(){return!1}},{key:"controls",set:function(e){},get:function(){return!1}},{key:"playbackRate",set:function(e){this._api&&this._api.setPlaybackRate(e)},get:function(){return this._playerReady()?this._api.getPlaybackRate():1}},{key:"defaultPlaybackRate",set:function(e){},get:function(){return 1}},{key:"ended",get:function(){return!!this._playerReady()&&this._api.getPlayerState()===window.YT.PlayerState.ENDED}},{key:"error",get:function(){return null}},{key:"networkState",get:function(){if(!this._playerReady())return 0;var e=window.YT.PlayerState;switch(this._api.getPlayerState()){case e.UNSTARTED:return 0;case e.BUFFERING:return 2;default:return 1}}},{key:"readyState",get:function(){if(!this._api)return 0;var e=window.YT.PlayerState;switch(this._api.getPlayerState()){case e.UNSTARTED:return 0;case e.BUFFERING:return 2;default:return 4}}},{key:"videoHeight",get:function(){return-1}},{key:"videoWidth",get:function(){return-1}},{key:"playsinline",set:function(e){},get:function(){return this._config.playsinline}},{key:"crossOrigin",set:function(e){},get:function(){return null}},{key:"playbackRates",get:function(){var e=u.PLAYBACK_RATES;if(this._playerReady()){var t=this._api.getAvailablePlaybackRates();t&&Array.isArray(t)&&(e=t)}return e}},{key:"isInPictureInPicture",get:function(){return!1}},{key:"targetBuffer",get:function(){return NaN}},{key:"availableBuffer",get:function(){return NaN}}])&&t(c.prototype,l),u}(e.FakeEventTarget);r(s,"_logger",(0,e.getLogger)("Youtube")),r(s,"id","youtube"),r(s,"PLAYBACK_RATES",[1]),n(42);var u=n(773),c=n(948),l="2.2.2",d="@playkit-js/playkit-js-youtube";(0,u.registerPlugin)("youtube",c.L),s.isSupported()&&(0,e.registerEngine)(s.id,s)})(),(playkit=void 0===playkit?{}:playkit).youtube=i})();
2
2
  //# sourceMappingURL=playkit-youtube.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"playkit-youtube.js","mappings":"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","sources":["webpack://playkit.youtube/./style.css?d979","./youtube/../node_modules/css-loader/dist/runtime/api.js","./youtube/../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","./youtube/external root \"KalturaPlayer\"","./youtube/./style.css","./youtube/./youtube-plugin.ts","./youtube/webpack/bootstrap","./youtube/webpack/runtime/compat get default export","./youtube/webpack/runtime/define property getters","./youtube/webpack/runtime/hasOwnProperty shorthand","./youtube/webpack/runtime/make namespace object","./youtube/webpack/runtime/nonce","./youtube/external var [\"KalturaPlayer\",\"core\"]","./youtube/./youtube.js","./youtube/./index.js"],"sourcesContent":["var api = require(\"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../node_modules/css-loader/dist/cjs.js!./style.css\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {\"attributes\":{\"id\":\"@playkit-js/playkit-js-youtube\"}};\n\noptions.insert = function (styleElement) {\n if (window.kalturaGlobalConfig && typeof window.kalturaGlobalConfig.stylesNonce === 'string') {\n styleElement.setAttribute('nonce', window.kalturaGlobalConfig.stylesNonce);\n }\n document.head.appendChild(styleElement);\n};\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (useSourceMap) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item, useSourceMap);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n }\n\n return content;\n }).join('');\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === 'string') {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring\n\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (useSourceMap && typeof btoa === 'function') {\n var sourceMapping = toComment(cssMapping);\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n return \"/*# \".concat(data, \" */\");\n}","\"use strict\";\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDom.length; i++) {\n if (stylesInDom[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var index = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3]\n };\n\n if (index !== -1) {\n stylesInDom[index].references++;\n stylesInDom[index].updater(obj);\n } else {\n stylesInDom.push({\n identifier: identifier,\n updater: addStyle(obj, options),\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n var attributes = options.attributes || {};\n\n if (typeof attributes.nonce === 'undefined') {\n var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n if (nonce) {\n attributes.nonce = nonce;\n }\n }\n\n Object.keys(attributes).forEach(function (key) {\n style.setAttribute(key, attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n } else {\n style.removeAttribute('media');\n }\n\n if (sourceMap && btoa) {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n if (Object.prototype.toString.call(newList) !== '[object Array]') {\n return;\n }\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDom[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDom[_index].references === 0) {\n stylesInDom[_index].updater();\n\n stylesInDom.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","module.exports = KalturaPlayer;","// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".playkit-iOS .playkit-engine-youtube,\\n.playkit-Mac-OS .playkit-engine-youtube {\\n object-fit: fill;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"style.css\"],\"names\":[],\"mappings\":\"AAAA;;EAEE,gBAAgB;AAClB\",\"file\":\"style.css\",\"sourcesContent\":[\".playkit-iOS .playkit-engine-youtube,\\n.playkit-Mac-OS .playkit-engine-youtube {\\n object-fit: fill;\\n}\\n\"]}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { BasePlugin, KalturaPlayer } from '@playkit-js/kaltura-player-js';\n\nconst YT_CHAPTER_TYPE: string = 'YouTubeClipChapter';\n\nclass YouTubePlugin extends BasePlugin {\n constructor(name: string, player: KalturaPlayer, config: any) {\n super(name, player, config);\n }\n\n public get timelineManager(): any {\n return this.player.getService('timeline');\n }\n\n public static isValid(): boolean {\n return true;\n }\n\n public loadMedia(): void {\n this.eventManager.listenOnce(this.player, this.player.Event.Core.SOURCE_SELECTED, () => {\n if (this.player.engineType === this.player.EngineType.YOUTUBE && this.timelineManager) {\n const {seekFrom, clipTo, duration} = this.player.config.sources;\n const isClipToValid = !!(clipTo && duration && clipTo < duration);\n if (seekFrom || isClipToValid) {\n this.timelineManager.disableChapters();\n if (seekFrom) {\n this.timelineManager.addKalturaCuePoint(seekFrom, YT_CHAPTER_TYPE, 0);\n }\n if (isClipToValid) {\n this.timelineManager.addKalturaCuePoint(clipTo, YT_CHAPTER_TYPE, 1);\n }\n }\n }\n });\n }\n\n public reset(): void {}\n\n public destroy(): void {}\n}\n\nexport { YouTubePlugin };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","const __WEBPACK_NAMESPACE_OBJECT__ = KalturaPlayer.core;","//@flow\nimport {\n EventManager,\n FakeEventTarget,\n FakeEvent,\n EventType,\n Error,\n} from \"@playkit-js/playkit-js\";\nimport {\n Track,\n VideoTrack,\n AudioTrack,\n TextTrack as PKTextTrack,\n} from \"@playkit-js/playkit-js\";\nimport { Utils, getLogger } from \"@playkit-js/playkit-js\";\n\nconst YOUTUBE_IFRAME_API_URL = \"https://www.youtube.com/iframe_api\";\n\nconst YOUTUBE_MIMETYPE = \"video/youtube\";\n\nconst TIME_INTERVAL_TIMEOUT = 250;\n\nconst DEFAULT_PLAYER_VARS: { [var: string]: number | string } = {\n controls: 0,\n autoplay: 0,\n origin: window.location.origin,\n iv_load_policy: 3,\n disablekb: 1,\n modestbranding: 1,\n playsinline: 1,\n rel: 0,\n fs: 0,\n cc_load_policy: 1\n};\n\n/**\n * Youtube engine for playback.\n * @classdesc\n */\nclass Youtube extends FakeEventTarget implements IEngine {\n /**\n * The video element.\n * @type {HTMLVideoElement}\n * @private\n */\n _el: HTMLVideoElement;\n /**\n * The event manager of the engine.\n * @type {EventManager}\n * @private\n */\n _eventManager: EventManager;\n\n /**\n * The player config object.\n * @type {Object}\n * @private\n */\n _config: Object;\n\n /**\n * weather bitrate is adaptive or discrete\n * @type {boolean}\n * @private\n */\n _isAdaptiveBitrate: boolean = true;\n\n _source: PKMediaSourceObject;\n\n _api: any;\n\n _sdkLoaded: Promise<*>;\n\n _apiReady: Function;\n\n _apiError: Function;\n\n _loaded: boolean = false;\n\n _isSeeking: boolean = false;\n\n _firstPlaying: boolean = true;\n\n _currentState: number | null = null;\n\n _playerTracks: Array<Track> = [];\n\n _clipToInterval: any = null;\n\n /**\n * The Youtube class logger.\n * @type {any}\n * @static\n * @private\n */\n static _logger: any = getLogger(\"Youtube\");\n\n /**\n * @type {string} - The engine id.\n * @public\n * @static\n */\n static id: string = \"youtube\";\n\n static isSupported(): boolean {\n return true;\n }\n\n /**\n * Factory method to create an engine.\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n * @returns {IEngine} - New instance of the run time engine.\n * @public\n * @static\n */\n static createEngine(source: PKMediaSourceObject, config: Object): IEngine {\n return new this(source, config);\n }\n\n /**\n * Checks if the engine can play a given source.\n * @param {PKMediaSourceObject} source - The source object to check.\n * @returns {boolean} - Whether the engine can play the source.\n * @public\n * @static\n */\n static canPlaySource(source: PKMediaSourceObject): boolean {\n let canPlayType =\n typeof source.mimetype === \"string\"\n ? source.mimetype.toLowerCase() === YOUTUBE_MIMETYPE\n : false;\n Youtube._logger.debug(\n \"canPlayType result for mimeType: \" +\n source.mimetype +\n \" is \" +\n canPlayType.toString()\n );\n return canPlayType;\n }\n\n /**\n * Runs the Youtube capabilities tests.\n * @returns {void}\n * @public\n * @static\n */\n static runCapabilities(): void {}\n\n /**\n * Gets the youtube capabilities.\n * @return {Promise<Object>} - The Youtube capabilities object.\n * @public\n * @static\n */\n static getCapabilities(): Promise<Object> {\n let dataSaver = false;\n if (\"connection\" in navigator && navigator.connection) {\n // $FlowFixMe\n dataSaver = !!navigator.connection.saveData;\n }\n const capabilities = {\n [Youtube.id]: {\n autoplay: false,\n mutedAutoPlay: !dataSaver,\n },\n };\n return Promise.resolve(capabilities);\n }\n\n /**\n * For browsers which block auto play, use the user gesture to open the video element and enable playing via API.\n * @returns {void}\n * @private\n * @public\n */\n static prepareVideoElement(): void {\n Youtube._logger.debug(\n \"Prepare the video element for playing not supported\"\n );\n }\n\n /**\n * The player playback rates.\n * @type {Array<number>}\n */\n static PLAYBACK_RATES: Array<number> = [1];\n\n /**\n * @constructor\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n */\n constructor(source: PKMediaSourceObject, config: Object) {\n super();\n this._eventManager = new EventManager();\n this._createVideoElement();\n this._init(source, config);\n }\n\n /**\n * Restores the engine.\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n * @returns {void}\n */\n restore(source: PKMediaSourceObject, config: Object): void {\n this.reset();\n this._init(source, config);\n }\n\n /**\n * shared reset of the engine.\n * @returns {void}\n * @private\n */\n _reset(): void {\n this._stopSeekTargetWatchDog();\n this._stopPlayingWatchDog();\n this.detach();\n if (this._playerReady()) {\n this._api.stopVideo && this._api.stopVideo();\n }\n this._loaded = false;\n this._firstPlaying = true;\n this._isSeeking = false;\n this._isAdaptiveBitrate = true;\n this._playerTracks = [];\n this._currentState = null;\n if (this._clipToInterval) {\n clearInterval(this._clipToInterval);\n this._clipToInterval = null;\n }\n }\n\n /**\n * Resets the engine.\n * @returns {void}\n */\n reset(): void {\n this._reset();\n this._eventManager.removeAll();\n if (this._api) {\n this._api.destroy && this._api.destroy();\n }\n }\n\n /**\n * Destroys the engine.\n * @public\n * @returns {void}\n */\n destroy(): void {\n this._reset();\n if (this._api) {\n this._api.destroy && this._api.destroy();\n }\n this._eventManager.destroy();\n }\n\n /**\n * Get the engine's id\n * @public\n * @returns {string} the engine's id\n */\n get id(): string {\n return Youtube.id;\n }\n\n /**\n * Listen to the video events and triggers them from the engine.\n * @public\n * @returns {void}\n */\n attach(): void {}\n\n /**\n * Remove the listeners of the video element events.\n * @public\n * @returns {void}\n */\n detach(): void {}\n\n /**\n * @returns {HTMLVideoElement} - The video element.\n * @public\n */\n getVideoElement(): HTMLVideoElement {\n return this._el;\n }\n\n /**\n * Select a new video track.\n * @param {VideoTrack} videoTrack - The video track object to set.\n * @returns {void}\n */\n selectVideoTrack(videoTrack: VideoTrack): void {\n if (this._api) {\n if (\n videoTrack instanceof VideoTrack &&\n (!videoTrack.active || this.isAdaptiveBitrateEnabled())\n ) {\n if (this.isAdaptiveBitrateEnabled()) {\n this.dispatchEvent(EventType.ABR_MODE_CHANGED, { mode: \"manual\" });\n }\n this._isAdaptiveBitrate = false;\n this._api.setPlaybackQuality(videoTrack.label);\n }\n }\n }\n\n /**\n * Select a new audio track.\n * @param {AudioTrack} audioTrack - The video track object to set.\n * @returns {void}\n */\n selectAudioTrack(audioTrack: AudioTrack): void {\n Youtube._logger.info(\n `audio track switching not supported, cannot switch to ` +\n audioTrack.language\n );\n }\n\n /**\n * Select a new text track.\n * @param {PKTextTrack} textTrack - The playkit text track object to set.\n * @returns {void}\n */\n selectTextTrack(textTrack: PKTextTrack): void {\n Youtube._logger.info(\n `text track switching not supported, cannot switch to ` +\n textTrack.language\n );\n }\n\n /**\n * Hide the text track\n * @function hideTextTrack\n * @returns {void}\n * @public\n */\n hideTextTrack(): void {}\n\n /**\n * Enables adaptive bitrate switching according to the media source extension logic.\n * @function enableAdaptiveBitrate\n * @returns {void}\n * @public\n */\n enableAdaptiveBitrate(): void {\n if (this._api) {\n this._api.setPlaybackQuality(\"default\");\n this._isAdaptiveBitrate = true;\n }\n }\n\n /**\n * Checking if adaptive bitrate switching is enabled.\n * @function isAdaptiveBitrateEnabled\n * @returns {boolean} - Whether adaptive bitrate is enabled.\n * @public\n */\n isAdaptiveBitrateEnabled(): boolean {\n return this._isAdaptiveBitrate;\n }\n\n /**\n * Seeking to live edge.\n * @function seekToLiveEdge\n * @returns {void}\n * @public\n */\n seekToLiveEdge(): void {}\n\n attachMediaSource(): void {}\n\n detachMediaSource(): void {}\n\n /**\n * Get the start time of DVR window in live playback in seconds.\n * @returns {Number} - start time of DVR window.\n * @public\n */\n getStartTimeOfDvrWindow(): number {\n return 0;\n }\n\n /**\n * Checking if the current playback is live.\n * @function isLive\n * @returns {boolean} - Whether playback is live.\n * @public\n */\n isLive(): boolean {\n return false;\n }\n\n /**\n * Start/resume playback.\n * @public\n * @returns {void}\n */\n play(): void {\n if (this._api) {\n if (this.currentTime === this.duration) {\n this.currentTime = 0;\n }\n this._api.playVideo();\n }\n }\n\n /**\n * Pause playback.\n * @public\n * @returns {void}\n */\n pause(): void {\n if (this._api && this._api.pauseVideo) {\n this._api.pauseVideo();\n }\n }\n\n /**\n * Load media.\n * @param {number} startTime - Optional time to start the video from.\n * @public\n * @returns {Promise<Object>} - The loaded data\n */\n load(startTime: ?number): Promise<Object> {\n this._sdkLoaded\n .then(() => {\n //TODO: if autoplay pass it here and check in play if already playing?\n const loadOptions = {\n videoId: this._source.url,\n startSeconds: startTime && startTime > 0 ? startTime : 0,\n };\n this._api.cueVideoById(loadOptions);\n this._loaded = true;\n })\n .catch((error) => {\n return Promise.reject(error);\n });\n this._videoLoaded = {};\n this._videoLoaded.promise = new Promise((resolve, reject) => {\n this._videoLoaded.resolve = resolve;\n this._videoLoaded.reject = reject;\n });\n return this._videoLoaded.promise;\n }\n\n _playerReady(): boolean {\n return !!(this._api && this._loaded);\n }\n\n /**\n * Parse youtube video tracks into player video tracks.\n * @returns {Array<VideoTrack>} - The parsed video tracks.\n * @private\n */\n _parseVideoTracks(): Array<VideoTrack> {\n const levels: Array<string> = this._api.getAvailableQualityLevels();\n const currentLevel: string = this._api.getPlaybackQuality();\n const videoTracks = [];\n levels.forEach((level, i) => {\n let settings = {\n active: currentLevel === level,\n label: level,\n bandwidth: 0,\n width: i + 1, //TODO: get estimated width and height from https://developers.google.com/youtube/iframe_api_reference#Playback_quality\n height: i + 1,\n language: \"\",\n index: i,\n };\n videoTracks.push(new VideoTrack(settings));\n });\n return videoTracks;\n }\n\n /**\n * Set a source.\n * @param {string} source - Source to set.\n * @public\n * @returns {void}\n */\n set src(source: string): void {\n this._source.url = source;\n }\n\n /**\n * Get the source url.\n * @returns {string} - The source url.\n * @public\n */\n get src(): string {\n return this._loaded && this._source ? this._source.url : \"\";\n }\n\n /**\n * Get the current time in seconds.\n * @returns {Number} - The current playback time.\n * @public\n */\n get currentTime(): number {\n return this._playerReady() ? this._api.getCurrentTime() : 0;\n }\n\n /**\n * Set the current time in seconds.\n * @param {Number} to - The number to set in seconds.\n * @public\n * @returns {void}\n */\n set currentTime(to: number): void {\n if (this._api) {\n if (this.currentTime !== to) {\n this._isSeeking = true;\n this._api.seekTo(to, true);\n this.dispatchEvent(new FakeEvent(EventType.SEEKING));\n if (this.paused) {\n this._startSeekTargetWatchDog();\n }\n }\n }\n }\n\n _startSeekTargetWatchDog() {\n const previousTime = this.currentTime;\n this._stopSeekTargetWatchDog();\n this._seekTargetIntervalId = setInterval(() => {\n if (!this.paused || !this._isSeeking) {\n this._stopSeekTargetWatchDog();\n } else if (this.currentTime !== previousTime) {\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.SEEKED));\n this._isSeeking = false;\n }\n }, TIME_INTERVAL_TIMEOUT);\n }\n\n _stopSeekTargetWatchDog() {\n if (this._seekTargetIntervalId) {\n clearInterval(this._seekTargetIntervalId);\n this._seekTargetIntervalId = null;\n }\n }\n\n /**\n * Get the duration in seconds.\n * @returns {Number} - The playback duration.\n * @public\n */\n get duration(): number {\n return this._playerReady() ? this._api.getDuration() : NaN;\n }\n\n /**\n * Set playback volume.\n * @param {Number} vol - The volume to set.\n * @public\n * @returns {void}\n */\n set volume(vol: number): void {\n this._playerReady() && this._api.setVolume(vol * 100);\n }\n\n /**\n * Get playback volume.\n * @returns {Number} - The volume value of the video element.\n * @public\n */\n get volume(): number {\n return this._playerReady() ? this._api.getVolume() / 100 : 1;\n }\n\n /**\n * Get paused state.\n * @returns {boolean} - The paused value of the video element.\n * @public\n */\n get paused(): boolean {\n if (this._playerReady()) {\n return ![\n window.YT.PlayerState.PLAYING,\n window.YT.PlayerState.BUFFERING,\n ].includes(this._api.getPlayerState());\n } else {\n return true;\n }\n }\n\n /**\n * Get seeking state.\n * @returns {boolean} - The seeking value of the video element.\n * @public\n */\n get seeking(): boolean {\n return this._isSeeking;\n }\n\n /**\n * Get the first seekable range (part) of the video in seconds.\n * @returns {TimeRanges} - First seekable range (part) of the video in seconds.\n * @public\n */\n get seekable(): any {\n return {\n length: 1,\n start: () => {\n return 0;\n },\n end: () => {\n return this._api ? this.currentTime : 0;\n },\n };\n }\n\n /**\n * Get the first played range (part) of the video in seconds.\n * @returns {TimeRanges} - First played range (part) of the video in seconds.\n * @public\n */\n get played(): any {\n return {\n length: 1,\n start: () => {\n return 0;\n },\n end: () => {\n return this._api ? this.currentTime : 0;\n },\n };\n }\n\n /**\n * Get the first buffered range (part) of the video in seconds.\n * @returns {TimeRanges} - First buffered range (part) of the video in seconds.\n * @public\n */\n get buffered(): any {\n return {\n length: 1,\n start: () => {\n return 0;\n },\n end: () => {\n return this._api && this._api.getVideoLoadedFraction\n ? this._api.getVideoLoadedFraction() * this.duration\n : 0;\n },\n };\n }\n\n /**\n * Set player muted state.\n * @param {boolean} mute - The new mute value.\n * @public\n * @returns {void}\n */\n set muted(mute: boolean): void {\n if (this._playerReady()) {\n mute ? this._api.mute() : this._api.unMute();\n this._muted = mute;\n }\n }\n\n /**\n * Get player muted state.\n * @returns {boolean} - The muted value of the video element.\n * @public\n */\n get muted(): boolean {\n let muted = false;\n if (this._playerReady()) {\n muted =\n typeof this._muted === \"boolean\" ? this._muted : this._api.isMuted();\n }\n return muted;\n }\n\n /**\n * Get the default mute value.\n * @returns {boolean} - The defaultMuted of the video element.\n * @public\n */\n get defaultMuted(): boolean {\n return false;\n }\n\n /**\n * Sets an image to be shown while the video is downloading, or until the user hits the play button.\n * @param {string} poster - The image url to be shown.\n * @returns {void}\n * @public\n */\n set poster(poster: string): void {}\n\n /**\n * Gets an image to be shown while the video is downloading, or until the user hits the play button.\n * @returns {poster} - The image url.\n * @public\n */\n get poster(): string {\n return \"\";\n }\n\n /**\n * Specifies if and how the author thinks that the video should be loaded when the page loads.\n * @param {string} preload - The preload value.\n * @public\n * @returns {void}\n */\n set preload(preload: string): void {}\n\n /**\n * Gets the preload value of the video element.\n * @returns {string} - The preload value.\n * @public\n */\n get preload(): string {\n return \"none\";\n }\n\n /**\n * Set if the video will automatically start playing as soon as it can do so without stopping.\n * @param {boolean} autoplay - The autoplay value.\n * @public\n * @returns {void}\n */\n set autoplay(autoplay: boolean): void {}\n\n /**\n * Gets the autoplay value of the video element.\n * @returns {boolean} - The autoplay value.\n * @public\n */\n get autoplay(): boolean {\n return false;\n }\n\n /**\n * Set to specifies that the video will start over again, every time it is finished.\n * @param {boolean} loop - the loop value.\n * @public\n * @returns {void}\n */\n set loop(loop: boolean) {}\n\n /**\n * Gets the loop value of the video element.\n * @returns {boolean} - The loop value.\n * @public\n */\n get loop(): boolean {\n return false;\n }\n\n /**\n * Set to specifies that video controls should be displayed.\n * @param {boolean} controls - the controls value.\n * @public\n * @returns {void}\n */\n set controls(controls: boolean): void {}\n\n /**\n * Gets the controls value of the video element.\n * @returns {boolean} - The controls value.\n * @public\n */\n get controls(): boolean {\n return false;\n }\n\n /**\n * Sets the current playback speed of the audio/video.\n * @param {Number} playbackRate - The playback speed value.\n * @public\n * @returns {void}\n */\n set playbackRate(playbackRate: number): void {\n if (this._api) {\n this._api.setPlaybackRate(playbackRate);\n }\n }\n\n /**\n * Gets the current playback speed of the audio/video.\n * @returns {Number} - The current playback speed value.\n * @public\n */\n get playbackRate(): number {\n return this._playerReady() ? this._api.getPlaybackRate() : 1;\n }\n\n /**\n * Sets the default playback speed of the audio/video.\n * @param {Number} defaultPlaybackRate - The default playback speed value.\n * @public\n * @returns {void}\n */\n set defaultPlaybackRate(defaultPlaybackRate: number) {}\n\n /**\n * Gets the default playback speed of the audio/video.\n * @returns {Number} - The default playback speed value.\n * @public\n */\n get defaultPlaybackRate(): number {\n return 1;\n }\n\n /**\n * The ended property returns whether the playback of the audio/video has ended.\n * @returns {boolean} - The ended value.\n * @public\n */\n get ended(): boolean {\n return this._playerReady()\n ? this._api.getPlayerState() === window.YT.PlayerState.ENDED\n : false;\n }\n\n /**\n * The error property returns a MediaError object.\n * @returns {MediaError} - The MediaError object has a code property containing the error state of the audio/video.\n * @public\n */\n get error(): ?MediaError {\n return null;\n }\n\n /**\n * @returns {Number} - The current network state (activity) of the audio/video.\n * @public\n */\n get networkState(): number {\n if (!this._playerReady()) {\n return 0;\n }\n const playerState = window.YT.PlayerState;\n switch (this._api.getPlayerState()) {\n case playerState.UNSTARTED:\n return 0;\n case playerState.BUFFERING:\n return 2;\n default:\n return 1;\n }\n }\n\n /**\n * Indicates if the audio/video is ready to play or not.\n * @returns {Number} - The current ready state of the audio/video.\n * 0 = HAVE_NOTHING - no information whether or not the audio/video is ready.\n * 1 = HAVE_METADATA - metadata for the audio/video is ready.\n * 2 = HAVE_CURRENT_DATA - data for the current playback position is available, but not enough data to play next frame/millisecond.\n * 3 = HAVE_FUTURE_DATA - data for the current and at least the next frame is available.\n * 4 = HAVE_ENOUGH_DATA - enough data available to start playing.\n */\n get readyState(): number {\n if (!this._api) {\n return 0;\n }\n const playerState = window.YT.PlayerState;\n switch (this._api.getPlayerState()) {\n case playerState.UNSTARTED:\n return 0;\n case playerState.BUFFERING:\n return 2;\n default:\n return 4;\n }\n }\n\n /**\n * @returns {Number} - The height of the video player, in pixels.\n * @public\n */\n get videoHeight(): number {\n return -1;\n }\n\n /**\n * @returns {Number} - The width of the video player, in pixels.\n * @public\n */\n get videoWidth(): number {\n return -1;\n }\n\n /**\n * @param {boolean} playsinline - Whether to set on the video tag the playsinline attribute.\n */\n set playsinline(playsinline: boolean): void {}\n\n /**\n * @returns {boolean} - Whether the video tag has an attribute of playsinline.\n */\n get playsinline(): boolean {\n return this._config.playsinline;\n }\n\n /**\n * Set crossOrigin attribute.\n * @param {?string} crossOrigin - 'anonymous' or 'use-credentials'\n */\n set crossOrigin(crossOrigin: ?string): void {}\n\n /**\n * Get crossOrigin attribute.\n * @returns {?string} - 'anonymous' or 'use-credentials'\n */\n get crossOrigin(): ?string {\n return null;\n }\n\n /**\n * get the playback rates\n * @return {number[]} - playback rates\n */\n get playbackRates(): Array<number> {\n let playbackRates = Youtube.PLAYBACK_RATES;\n if (this._playerReady()) {\n const rates = this._api.getAvailablePlaybackRates();\n if (rates && Array.isArray(rates)) {\n playbackRates = rates;\n }\n }\n return playbackRates;\n }\n\n /**\n * Initializes the engine.\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n * @private\n * @returns {void}\n */\n _init(source: PKMediaSourceObject, config: Object): void {\n this._source = source;\n this._config = config;\n this._api = null;\n this._videoLoaded = null;\n this._playingIntervalId = null;\n const dispatchError = (e) => {\n const error = new Error(\n Error.Severity.CRITICAL,\n Error.Category.PLAYER,\n Error.Code.LOAD_FAILED,\n e\n );\n this.dispatchEvent(new FakeEvent(EventType.ERROR, error));\n };\n this._sdkLoaded = new Promise((resolve, reject) => {\n this._apiReady = () => {\n if (this._config.playback.muted || this._config.playback.autoplay) {\n this._api.mute && this._api.mute();\n this._muted = true;\n }\n resolve();\n };\n this._apiError = (e) => {\n const error = this._getYoutubeErrorCodeData(e.data);\n dispatchError(error);\n reject(e.data);\n };\n });\n this._loadYouTubeIframeAPI()\n .then(() => {\n this._loadYouTubePlayer();\n })\n .catch((e) => {\n dispatchError(e);\n });\n }\n\n _createVideoElement() {\n const el = (this._el = Utils.Dom.createElement(\"div\"));\n Utils.Dom.setAttribute(el, \"id\", Utils.Generator.uniqueId(5));\n Utils.Dom.setAttribute(el, \"tabindex\", \"-1\");\n }\n\n _getYoutubeErrorCodeData(\n errorNumber: number\n ): { code: number, message: string } {\n switch (errorNumber) {\n case 2:\n return { code: errorNumber, message: \"Invalid params\" };\n case 5:\n return {\n code: errorNumber,\n message: \"Error while trying to play the video\",\n };\n case 100:\n return { code: errorNumber, message: \"Video not found\" };\n case 101:\n case 150:\n return {\n code: errorNumber,\n message:\n \"The owner of the requested video does not allow it to be played in embedded players\",\n };\n default:\n return {\n code: errorNumber,\n message: \"Unknown error\",\n };\n }\n }\n\n /**\n * Loads the YouTube player.\n * @private\n * @returns {void}\n */\n _loadYouTubePlayer(): void {\n const loadYouTubePlayer = () => {\n const config = {\n playerVars: DEFAULT_PLAYER_VARS,\n events: {\n onReady: this._apiReady,\n onError: this._apiError,\n onStateChange: (e) => this._onPlayerStateChange(e),\n onPlaybackQualityChange: (e) => this._onPlaybackQualityChange(e),\n onVolumeChange: () =>\n this.dispatchEvent(new FakeEvent(EventType.VOLUME_CHANGE)),\n },\n };\n config.playerVars.playsinline = this._config.playback.playsinline ? 1 : 0;\n config.playerVars.autoplay = this._config.playback.autoplay ? 1 : 0;\n if (\n Utils.Object.hasPropertyPath(this._config, \"playback.options.youtube\")\n ) {\n const youtubeConfig = this._config.playback.options.youtube;\n Utils.Object.mergeDeep(config.playerVars, youtubeConfig.playerVars);\n }\n this._api = new window.YT.Player(this._el.id, config);\n };\n if (this._api) {\n return this._apiReady();\n }\n if (window && window.YT && window.YT.Player) {\n loadYouTubePlayer();\n } else {\n window.onYouTubeIframeAPIReady = loadYouTubePlayer;\n }\n }\n\n /**\n * Load YouTube IFrame API element dom object.\n * @private\n * @returns {void}\n */\n _loadYouTubeIframeAPI(): Promise<*> {\n return new Promise((resolve, reject) => {\n if (window && window.YT && window.YT.Player) {\n return resolve();\n }\n const tag = Utils.Dom.createElement(\"script\");\n let url = YOUTUBE_IFRAME_API_URL;\n if (\n Utils.Object.hasPropertyPath(this._config, \"playback.options.youtube\")\n ) {\n if (this._config.playback.options.youtube.iframeApi) {\n url = this._config.playback.options.youtube.iframeApi;\n }\n }\n tag.src = url;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n tag.onerror = () => {\n reject({ message: \"Youtube Iframe API loading failed: \" + url });\n };\n const firstScriptTag = document.getElementsByTagName(\"script\")[0];\n if (firstScriptTag && firstScriptTag.parentNode) {\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n });\n }\n\n _getPlayerStateKey(state: number | null): string {\n const playerState = window.YT.PlayerState;\n return (\n Object.keys(playerState).find((key) => playerState[key] === state) ||\n \"UNKNOWN\"\n );\n }\n\n _onPlayerStateChange(event: any): void {\n const playerState = window.YT.PlayerState;\n const newState = event.data;\n Youtube._logger.info(\n `player state changed from ${this._getPlayerStateKey(\n this._currentState\n )} to ${this._getPlayerStateKey(newState)}`\n );\n if (newState === this._currentState) {\n return;\n }\n this._currentState = newState;\n\n switch (this._currentState) {\n case playerState.UNSTARTED:\n this._handleLoaded();\n break;\n case playerState.ENDED:\n this._onEnded();\n break;\n case playerState.PLAYING:\n if (this._firstPlaying) {\n this._handleFirstPlaying();\n }\n this._onPlaying();\n break;\n case playerState.PAUSED:\n this._onPaused();\n break;\n case playerState.BUFFERING:\n this._onBuffering();\n break;\n case playerState.CUED:\n break;\n }\n }\n\n _onPlaybackQualityChange(event: any): void {\n let videoTrack = this._playerTracks.find((track) => {\n return track instanceof VideoTrack && track.label === event.data;\n });\n this.dispatchEvent(EventType.VIDEO_TRACK_CHANGED, {\n selectedVideoTrack: videoTrack,\n });\n }\n\n _handleClipTo(): void {\n if (this._clipToInterval) {\n clearInterval(this._clipToInterval);\n }\n const { clipTo } = this._config.sources;\n if (this._api && clipTo && this.currentTime < clipTo) {\n this._clipToInterval = setInterval(() => {\n if (this._api.getCurrentTime() >= clipTo) {\n this._api.pauseVideo();\n clearInterval(this._clipToInterval);\n }\n }, 200);\n }\n }\n\n _onPlaying() {\n this._handleClipTo();\n this.dispatchEvent(new FakeEvent(EventType.PLAY));\n this.dispatchEvent(new FakeEvent(EventType.PLAYING));\n this._startPlayingWatchDog();\n if (this._isSeeking) {\n this._isSeeking = false;\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.SEEKED));\n }\n }\n\n _handleLoaded() {\n if (this._loaded) {\n this.dispatchEvent(new FakeEvent(EventType.LOADED_METADATA));\n this.dispatchEvent(new FakeEvent(EventType.LOADED_DATA));\n this._videoLoaded.resolve({ tracks: this._playerTracks });\n }\n }\n\n _handleFirstPlaying() {\n this._firstPlaying = false;\n this.dispatchEvent(new FakeEvent(EventType.DURATION_CHANGE));\n const {seekFrom} = this._config.sources;\n if (this._api && seekFrom) {\n this._api.seekTo(seekFrom);\n }\n if (this._api && this._config.sources.captions.length > 0) {\n this._api.setOption('captions', 'track', {});\n }\n }\n\n _onBuffering() {\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.WAITING));\n }\n\n _onPaused() {\n if (this._isSeeking) {\n this._isSeeking = false;\n }\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.PAUSE));\n }\n\n _onEnded() {\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.PAUSE));\n this.dispatchEvent(new FakeEvent(EventType.ENDED));\n }\n\n _startPlayingWatchDog() {\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this._playingIntervalId = setInterval(() => {\n if (!this._isSeeking) {\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n }\n }, TIME_INTERVAL_TIMEOUT);\n }\n\n _stopPlayingWatchDog() {\n clearInterval(this._playingIntervalId);\n this._playingIntervalId = null;\n }\n\n // eslint-disable-next-line no-unused-vars\n getThumbnail(time: number): null {\n return null;\n }\n\n resetAllCues(): void {}\n enterPictureInPicture(): void {}\n exitPictureInPicture(): void {}\n isPictureInPictureSupported(): boolean {\n return false;\n }\n get isInPictureInPicture(): boolean {\n return false;\n }\n\n get targetBuffer(): number {\n return NaN;\n }\n\n get availableBuffer(): number {\n return NaN;\n }\n\n}\n\nexport { Youtube };\n","// @flow\nimport { registerEngine } from \"@playkit-js/playkit-js\";\nimport { Youtube } from \"./youtube\";\nimport \"./style.css\";\nimport { registerPlugin } from \"@playkit-js/kaltura-player-js\";\n// $FlowFixMe\nimport { YouTubePlugin } from \"./youtube-plugin\";\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst VERSION = __VERSION__;\nconst NAME = __NAME__;\n\nexport { Youtube as Engine };\nexport { VERSION, NAME };\nexport { YouTubePlugin as Plugin };\n\nconst pluginName: string = 'youtube';\nregisterPlugin(pluginName, YouTubePlugin);\n\nif (Youtube.isSupported()) {\n registerEngine(Youtube.id, Youtube);\n}\n"],"names":["api","content","__esModule","default","module","id","options","styleElement","window","kalturaGlobalConfig","stylesNonce","setAttribute","document","head","appendChild","exports","locals","useSourceMap","list","toString","this","map","item","sourceMap","base64","data","cssMapping","btoa","sourceMapping","unescape","encodeURIComponent","JSON","stringify","concat","sourceURLs","sources","source","sourceRoot","join","cssWithMappingToString","i","modules","mediaQuery","dedupe","alreadyImportedModules","length","_i","push","memo","getTarget","target","styleTarget","querySelector","HTMLIFrameElement","contentDocument","e","stylesInDom","getIndexByIdentifier","identifier","result","modulesToDom","idCountMap","identifiers","base","count","index","obj","css","media","references","updater","addStyle","insertStyleElement","style","createElement","attributes","nonce","Object","keys","forEach","key","insert","Error","textStore","replaceText","replacement","filter","Boolean","applyToSingletonTag","remove","styleSheet","cssText","cssNode","createTextNode","childNodes","removeChild","insertBefore","applyToTag","removeAttribute","firstChild","singleton","singletonCounter","update","styleIndex","bind","parentNode","removeStyleElement","newObj","all","atob","lastIdentifiers","newList","prototype","call","newLastIdentifiers","_index","splice","KalturaPlayer","___CSS_LOADER_EXPORT___","YT_CHAPTER_TYPE","YouTubePlugin","BasePlugin","constructor","name","player","config","super","timelineManager","getService","isValid","loadMedia","eventManager","listenOnce","Event","Core","SOURCE_SELECTED","engineType","EngineType","YOUTUBE","seekFrom","clipTo","duration","isClipToValid","disableChapters","addKalturaCuePoint","reset","destroy","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","d","a","definition","o","defineProperty","enumerable","get","prop","hasOwnProperty","r","Symbol","toStringTag","value","nc","core","DEFAULT_PLAYER_VARS","controls","autoplay","origin","location","iv_load_policy","disablekb","modestbranding","playsinline","rel","fs","cc_load_policy","Youtube","_eventManager","EventManager","_createVideoElement","_init","isSupported","createEngine","canPlaySource","canPlayType","mimetype","toLowerCase","_logger","debug","runCapabilities","getCapabilities","dataSaver","navigator","connection","saveData","capabilities","mutedAutoPlay","Promise","resolve","prepareVideoElement","restore","_reset","_stopSeekTargetWatchDog","_stopPlayingWatchDog","detach","_playerReady","_api","stopVideo","_loaded","_firstPlaying","_isSeeking","_isAdaptiveBitrate","_playerTracks","_currentState","_clipToInterval","clearInterval","removeAll","attach","getVideoElement","_el","selectVideoTrack","videoTrack","VideoTrack","active","isAdaptiveBitrateEnabled","dispatchEvent","EventType","ABR_MODE_CHANGED","mode","setPlaybackQuality","label","selectAudioTrack","audioTrack","info","language","selectTextTrack","textTrack","hideTextTrack","enableAdaptiveBitrate","seekToLiveEdge","attachMediaSource","detachMediaSource","getStartTimeOfDvrWindow","isLive","play","currentTime","playVideo","pause","pauseVideo","load","startTime","_sdkLoaded","then","loadOptions","videoId","_source","url","startSeconds","cueVideoById","catch","error","reject","_videoLoaded","promise","_parseVideoTracks","levels","getAvailableQualityLevels","currentLevel","getPlaybackQuality","videoTracks","level","settings","bandwidth","width","height","_startSeekTargetWatchDog","previousTime","_seekTargetIntervalId","setInterval","paused","FakeEvent","TIME_UPDATE","SEEKED","_config","_playingIntervalId","dispatchError","Severity","CRITICAL","Category","PLAYER","Code","LOAD_FAILED","ERROR","_apiReady","playback","muted","mute","_muted","_apiError","_getYoutubeErrorCodeData","_loadYouTubeIframeAPI","_loadYouTubePlayer","el","Utils","Dom","Generator","uniqueId","errorNumber","code","message","loadYouTubePlayer","playerVars","events","onReady","onError","onStateChange","_onPlayerStateChange","onPlaybackQualityChange","_onPlaybackQualityChange","onVolumeChange","VOLUME_CHANGE","hasPropertyPath","youtubeConfig","youtube","mergeDeep","YT","Player","onYouTubeIframeAPIReady","tag","iframeApi","src","async","onload","onerror","firstScriptTag","getElementsByTagName","_getPlayerStateKey","state","playerState","PlayerState","find","event","newState","UNSTARTED","_handleLoaded","ENDED","_onEnded","PLAYING","_handleFirstPlaying","_onPlaying","PAUSED","_onPaused","BUFFERING","_onBuffering","CUED","track","VIDEO_TRACK_CHANGED","selectedVideoTrack","_handleClipTo","getCurrentTime","PLAY","_startPlayingWatchDog","LOADED_METADATA","LOADED_DATA","tracks","DURATION_CHANGE","seekTo","captions","setOption","WAITING","PAUSE","getThumbnail","time","resetAllCues","enterPictureInPicture","exitPictureInPicture","isPictureInPictureSupported","to","SEEKING","getDuration","NaN","vol","setVolume","getVolume","includes","getPlayerState","start","end","getVideoLoadedFraction","unMute","isMuted","poster","preload","loop","playbackRate","setPlaybackRate","getPlaybackRate","defaultPlaybackRate","crossOrigin","playbackRates","PLAYBACK_RATES","rates","getAvailablePlaybackRates","Array","isArray","FakeEventTarget","getLogger","VERSION","__VERSION__","NAME","__NAME__","registerPlugin","registerEngine"],"sourceRoot":""}
1
+ {"version":3,"file":"playkit-youtube.js","mappings":"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","sources":["webpack://playkit.youtube/./style.css?d979","./youtube/../node_modules/css-loader/dist/runtime/api.js","./youtube/../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","./youtube/external root \"KalturaPlayer\"","./youtube/./style.css","./youtube/./youtube-plugin.ts","./youtube/webpack/bootstrap","./youtube/webpack/runtime/compat get default export","./youtube/webpack/runtime/define property getters","./youtube/webpack/runtime/hasOwnProperty shorthand","./youtube/webpack/runtime/make namespace object","./youtube/webpack/runtime/nonce","./youtube/external var [\"KalturaPlayer\",\"core\"]","./youtube/./youtube.js","./youtube/./index.js"],"sourcesContent":["var api = require(\"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../node_modules/css-loader/dist/cjs.js!./style.css\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {\"attributes\":{\"id\":\"@playkit-js/playkit-js-youtube\"}};\n\noptions.insert = function (styleElement) {\n if (window.kalturaGlobalConfig && typeof window.kalturaGlobalConfig.stylesNonce === 'string') {\n styleElement.setAttribute('nonce', window.kalturaGlobalConfig.stylesNonce);\n }\n document.head.appendChild(styleElement);\n};\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (useSourceMap) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item, useSourceMap);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n }\n\n return content;\n }).join('');\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === 'string') {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring\n\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (useSourceMap && typeof btoa === 'function') {\n var sourceMapping = toComment(cssMapping);\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n return \"/*# \".concat(data, \" */\");\n}","\"use strict\";\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDom.length; i++) {\n if (stylesInDom[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var index = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3]\n };\n\n if (index !== -1) {\n stylesInDom[index].references++;\n stylesInDom[index].updater(obj);\n } else {\n stylesInDom.push({\n identifier: identifier,\n updater: addStyle(obj, options),\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n var attributes = options.attributes || {};\n\n if (typeof attributes.nonce === 'undefined') {\n var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n if (nonce) {\n attributes.nonce = nonce;\n }\n }\n\n Object.keys(attributes).forEach(function (key) {\n style.setAttribute(key, attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n } else {\n style.removeAttribute('media');\n }\n\n if (sourceMap && btoa) {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n if (Object.prototype.toString.call(newList) !== '[object Array]') {\n return;\n }\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDom[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDom[_index].references === 0) {\n stylesInDom[_index].updater();\n\n stylesInDom.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","module.exports = KalturaPlayer;","// Imports\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(true);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".playkit-iOS .playkit-engine-youtube,\\n.playkit-Mac-OS .playkit-engine-youtube {\\n object-fit: fill;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"style.css\"],\"names\":[],\"mappings\":\"AAAA;;EAEE,gBAAgB;AAClB\",\"file\":\"style.css\",\"sourcesContent\":[\".playkit-iOS .playkit-engine-youtube,\\n.playkit-Mac-OS .playkit-engine-youtube {\\n object-fit: fill;\\n}\\n\"]}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { BasePlugin, KalturaPlayer } from '@playkit-js/kaltura-player-js';\n\nconst YT_CHAPTER_TYPE: string = 'YouTubeClipChapter';\n\nclass YouTubePlugin extends BasePlugin {\n constructor(name: string, player: KalturaPlayer, config: any) {\n super(name, player, config);\n }\n\n public get timelineManager(): any {\n return this.player.getService('timeline');\n }\n\n public static isValid(): boolean {\n return true;\n }\n\n public loadMedia(): void {\n this.eventManager.listenOnce(this.player, this.player.Event.Core.SOURCE_SELECTED, () => {\n if (this.player.engineType === this.player.EngineType.YOUTUBE && this.timelineManager) {\n const {seekFrom, clipTo, duration} = this.player.config.sources;\n const isClipToValid = !!(clipTo && duration && clipTo < duration);\n if (seekFrom || isClipToValid) {\n this.timelineManager.disableChapters();\n if (seekFrom) {\n this.timelineManager.addKalturaCuePoint(seekFrom, YT_CHAPTER_TYPE, 0);\n }\n if (isClipToValid) {\n this.timelineManager.addKalturaCuePoint(clipTo, YT_CHAPTER_TYPE, 1);\n }\n }\n }\n });\n }\n\n public reset(): void {}\n\n public destroy(): void {}\n}\n\nexport { YouTubePlugin };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","const __WEBPACK_NAMESPACE_OBJECT__ = KalturaPlayer.core;","//@flow\nimport {\n EventManager,\n FakeEventTarget,\n FakeEvent,\n EventType,\n Error,\n} from \"@playkit-js/playkit-js\";\nimport {\n Track,\n VideoTrack,\n AudioTrack,\n TextTrack as PKTextTrack,\n} from \"@playkit-js/playkit-js\";\nimport { Utils, getLogger } from \"@playkit-js/playkit-js\";\n\nconst YOUTUBE_IFRAME_API_URL = \"https://www.youtube.com/iframe_api\";\n\nconst YOUTUBE_MIMETYPE = \"video/youtube\";\n\nconst TIME_INTERVAL_TIMEOUT = 250;\n\nconst DEFAULT_PLAYER_VARS: { [var: string]: number | string } = {\n controls: 0,\n autoplay: 0,\n origin: window.location.origin,\n iv_load_policy: 3,\n disablekb: 1,\n modestbranding: 1,\n playsinline: 1,\n rel: 0,\n fs: 0,\n cc_load_policy: 1\n};\n\n/**\n * Youtube engine for playback.\n * @classdesc\n */\nclass Youtube extends FakeEventTarget implements IEngine {\n /**\n * The video element.\n * @type {HTMLVideoElement}\n * @private\n */\n _el: HTMLVideoElement;\n /**\n * The event manager of the engine.\n * @type {EventManager}\n * @private\n */\n _eventManager: EventManager;\n\n /**\n * The player config object.\n * @type {Object}\n * @private\n */\n _config: Object;\n\n /**\n * weather bitrate is adaptive or discrete\n * @type {boolean}\n * @private\n */\n _isAdaptiveBitrate: boolean = true;\n\n _source: PKMediaSourceObject;\n\n _api: any;\n\n _sdkLoaded: Promise<*>;\n\n _apiReady: Function;\n\n _apiError: Function;\n\n _loaded: boolean = false;\n\n _isSeeking: boolean = false;\n\n _firstPlaying: boolean = true;\n\n _currentState: number | null = null;\n\n _playerTracks: Array<Track> = [];\n\n _clipToInterval: any = null;\n\n /**\n * The Youtube class logger.\n * @type {any}\n * @static\n * @private\n */\n static _logger: any = getLogger(\"Youtube\");\n\n /**\n * @type {string} - The engine id.\n * @public\n * @static\n */\n static id: string = \"youtube\";\n\n static isSupported(): boolean {\n return true;\n }\n\n /**\n * Factory method to create an engine.\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n * @returns {IEngine} - New instance of the run time engine.\n * @public\n * @static\n */\n static createEngine(source: PKMediaSourceObject, config: Object): IEngine {\n return new this(source, config);\n }\n\n /**\n * Checks if the engine can play a given source.\n * @param {PKMediaSourceObject} source - The source object to check.\n * @returns {boolean} - Whether the engine can play the source.\n * @public\n * @static\n */\n static canPlaySource(source: PKMediaSourceObject): boolean {\n let canPlayType =\n typeof source.mimetype === \"string\"\n ? source.mimetype.toLowerCase() === YOUTUBE_MIMETYPE\n : false;\n Youtube._logger.debug(\n \"canPlayType result for mimeType: \" +\n source.mimetype +\n \" is \" +\n canPlayType.toString()\n );\n return canPlayType;\n }\n\n /**\n * Runs the Youtube capabilities tests.\n * @returns {void}\n * @public\n * @static\n */\n static runCapabilities(): void {}\n\n /**\n * Gets the youtube capabilities.\n * @return {Promise<Object>} - The Youtube capabilities object.\n * @public\n * @static\n */\n static getCapabilities(): Promise<Object> {\n let dataSaver = false;\n if (\"connection\" in navigator && navigator.connection) {\n // $FlowFixMe\n dataSaver = !!navigator.connection.saveData;\n }\n const capabilities = {\n [Youtube.id]: {\n autoplay: false,\n mutedAutoPlay: !dataSaver,\n },\n };\n return Promise.resolve(capabilities);\n }\n\n /**\n * For browsers which block auto play, use the user gesture to open the video element and enable playing via API.\n * @returns {void}\n * @private\n * @public\n */\n static prepareVideoElement(): void {\n Youtube._logger.debug(\n \"Prepare the video element for playing not supported\"\n );\n }\n\n /**\n * The player playback rates.\n * @type {Array<number>}\n */\n static PLAYBACK_RATES: Array<number> = [1];\n\n /**\n * @constructor\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n */\n constructor(source: PKMediaSourceObject, config: Object) {\n super();\n this._eventManager = new EventManager();\n this._createVideoElement();\n this._init(source, config);\n }\n\n /**\n * Restores the engine.\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n * @returns {void}\n */\n restore(source: PKMediaSourceObject, config: Object): void {\n this.reset();\n this._init(source, config);\n }\n\n /**\n * shared reset of the engine.\n * @returns {void}\n * @private\n */\n _reset(): void {\n this._stopSeekTargetWatchDog();\n this._stopPlayingWatchDog();\n this.detach();\n if (this._playerReady()) {\n this._api.stopVideo && this._api.stopVideo();\n }\n this._loaded = false;\n this._firstPlaying = true;\n this._isSeeking = false;\n this._isAdaptiveBitrate = true;\n this._playerTracks = [];\n this._currentState = null;\n if (this._clipToInterval) {\n clearInterval(this._clipToInterval);\n this._clipToInterval = null;\n }\n }\n\n /**\n * Resets the engine.\n * @returns {void}\n */\n reset(): void {\n this._reset();\n this._eventManager.removeAll();\n if (this._api) {\n this._api.destroy && this._api.destroy();\n }\n }\n\n /**\n * Destroys the engine.\n * @public\n * @returns {void}\n */\n destroy(): void {\n this._reset();\n if (this._api) {\n this._api.destroy && this._api.destroy();\n }\n this._eventManager.destroy();\n }\n\n /**\n * Get the engine's id\n * @public\n * @returns {string} the engine's id\n */\n get id(): string {\n return Youtube.id;\n }\n\n /**\n * Listen to the video events and triggers them from the engine.\n * @public\n * @returns {void}\n */\n attach(): void {}\n\n /**\n * Remove the listeners of the video element events.\n * @public\n * @returns {void}\n */\n detach(): void {}\n\n /**\n * @returns {HTMLVideoElement} - The video element.\n * @public\n */\n getVideoElement(): HTMLVideoElement {\n return this._el;\n }\n\n /**\n * Select a new video track.\n * @param {VideoTrack} videoTrack - The video track object to set.\n * @returns {void}\n */\n selectVideoTrack(videoTrack: VideoTrack): void {\n if (this._api) {\n if (\n videoTrack instanceof VideoTrack &&\n (!videoTrack.active || this.isAdaptiveBitrateEnabled())\n ) {\n if (this.isAdaptiveBitrateEnabled()) {\n this.dispatchEvent(EventType.ABR_MODE_CHANGED, { mode: \"manual\" });\n }\n this._isAdaptiveBitrate = false;\n this._api.setPlaybackQuality(videoTrack.label);\n }\n }\n }\n\n /**\n * Select a new audio track.\n * @param {AudioTrack} audioTrack - The video track object to set.\n * @returns {void}\n */\n selectAudioTrack(audioTrack: AudioTrack): void {\n Youtube._logger.info(\n `audio track switching not supported, cannot switch to ` +\n audioTrack.language\n );\n }\n\n /**\n * Select a new text track.\n * @param {PKTextTrack} textTrack - The playkit text track object to set.\n * @returns {void}\n */\n selectTextTrack(textTrack: PKTextTrack): void {\n Youtube._logger.info(\n `text track switching not supported, cannot switch to ` +\n textTrack.language\n );\n }\n\n /**\n * Hide the text track\n * @function hideTextTrack\n * @returns {void}\n * @public\n */\n hideTextTrack(): void {}\n\n /**\n * Enables adaptive bitrate switching according to the media source extension logic.\n * @function enableAdaptiveBitrate\n * @returns {void}\n * @public\n */\n enableAdaptiveBitrate(): void {\n if (this._api) {\n this._api.setPlaybackQuality(\"default\");\n this._isAdaptiveBitrate = true;\n }\n }\n\n /**\n * Checking if adaptive bitrate switching is enabled.\n * @function isAdaptiveBitrateEnabled\n * @returns {boolean} - Whether adaptive bitrate is enabled.\n * @public\n */\n isAdaptiveBitrateEnabled(): boolean {\n return this._isAdaptiveBitrate;\n }\n\n /**\n * Seeking to live edge.\n * @function seekToLiveEdge\n * @returns {void}\n * @public\n */\n seekToLiveEdge(): void {}\n\n attachMediaSource(): void {}\n\n detachMediaSource(): void {}\n\n /**\n * Get the start time of DVR window in live playback in seconds.\n * @returns {Number} - start time of DVR window.\n * @public\n */\n getStartTimeOfDvrWindow(): number {\n return 0;\n }\n\n /**\n * Checking if the current playback is live.\n * @function isLive\n * @returns {boolean} - Whether playback is live.\n * @public\n */\n isLive(): boolean {\n return false;\n }\n\n /**\n * Start/resume playback.\n * @public\n * @returns {void}\n */\n play(): void {\n if (this._api) {\n if (this.currentTime === this.duration) {\n this.currentTime = 0;\n }\n this._api.playVideo();\n }\n }\n\n /**\n * Pause playback.\n * @public\n * @returns {void}\n */\n pause(): void {\n if (this._api && this._api.pauseVideo) {\n this._api.pauseVideo();\n }\n }\n\n /**\n * Load media.\n * @param {number} startTime - Optional time to start the video from.\n * @public\n * @returns {Promise<Object>} - The loaded data\n */\n load(startTime: ?number): Promise<Object> {\n this._sdkLoaded\n .then(() => {\n //TODO: if autoplay pass it here and check in play if already playing?\n const loadOptions = {\n videoId: this._source.url,\n startSeconds: startTime && startTime > 0 ? startTime : 0,\n };\n this._api.cueVideoById(loadOptions);\n this._loaded = true;\n })\n .catch((error) => {\n return Promise.reject(error);\n });\n this._videoLoaded = {};\n this._videoLoaded.promise = new Promise((resolve, reject) => {\n this._videoLoaded.resolve = resolve;\n this._videoLoaded.reject = reject;\n });\n return this._videoLoaded.promise;\n }\n\n _playerReady(): boolean {\n return !!(this._api && this._loaded);\n }\n\n /**\n * Parse youtube video tracks into player video tracks.\n * @returns {Array<VideoTrack>} - The parsed video tracks.\n * @private\n */\n _parseVideoTracks(): Array<VideoTrack> {\n const levels: Array<string> = this._api.getAvailableQualityLevels();\n const currentLevel: string = this._api.getPlaybackQuality();\n const videoTracks = [];\n levels.forEach((level, i) => {\n let settings = {\n active: currentLevel === level,\n label: level,\n bandwidth: 0,\n width: i + 1, //TODO: get estimated width and height from https://developers.google.com/youtube/iframe_api_reference#Playback_quality\n height: i + 1,\n language: \"\",\n index: i,\n };\n videoTracks.push(new VideoTrack(settings));\n });\n return videoTracks;\n }\n\n /**\n * Set a source.\n * @param {string} source - Source to set.\n * @public\n * @returns {void}\n */\n set src(source: string): void {\n this._source.url = source;\n }\n\n /**\n * Get the source url.\n * @returns {string} - The source url.\n * @public\n */\n get src(): string {\n return this._loaded && this._source ? this._source.url : \"\";\n }\n\n /**\n * Get the current time in seconds.\n * @returns {Number} - The current playback time.\n * @public\n */\n get currentTime(): number {\n return this._playerReady() ? this._api.getCurrentTime() : 0;\n }\n\n /**\n * Set the current time in seconds.\n * @param {Number} to - The number to set in seconds.\n * @public\n * @returns {void}\n */\n set currentTime(to: number): void {\n if (this._api) {\n if (this.currentTime !== to) {\n this._isSeeking = true;\n this._api.seekTo(to, true);\n this.dispatchEvent(new FakeEvent(EventType.SEEKING));\n if (this.paused) {\n this._startSeekTargetWatchDog();\n }\n }\n }\n }\n\n _startSeekTargetWatchDog() {\n const previousTime = this.currentTime;\n this._stopSeekTargetWatchDog();\n this._seekTargetIntervalId = setInterval(() => {\n if (!this.paused || !this._isSeeking) {\n this._stopSeekTargetWatchDog();\n } else if (this.currentTime !== previousTime) {\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.SEEKED));\n this._isSeeking = false;\n }\n }, TIME_INTERVAL_TIMEOUT);\n }\n\n _stopSeekTargetWatchDog() {\n if (this._seekTargetIntervalId) {\n clearInterval(this._seekTargetIntervalId);\n this._seekTargetIntervalId = null;\n }\n }\n\n /**\n * Get the duration in seconds.\n * @returns {Number} - The playback duration.\n * @public\n */\n get duration(): number {\n return this._playerReady() ? this._api.getDuration() : NaN;\n }\n\n /**\n * Set playback volume.\n * @param {Number} vol - The volume to set.\n * @public\n * @returns {void}\n */\n set volume(vol: number): void {\n this._playerReady() && this._api.setVolume(vol * 100);\n }\n\n /**\n * Get playback volume.\n * @returns {Number} - The volume value of the video element.\n * @public\n */\n get volume(): number {\n return this._playerReady() ? this._api.getVolume() / 100 : 1;\n }\n\n /**\n * Get paused state.\n * @returns {boolean} - The paused value of the video element.\n * @public\n */\n get paused(): boolean {\n if (this._playerReady()) {\n return ![\n window.YT.PlayerState.PLAYING,\n window.YT.PlayerState.BUFFERING,\n ].includes(this._api.getPlayerState());\n } else {\n return true;\n }\n }\n\n /**\n * Get seeking state.\n * @returns {boolean} - The seeking value of the video element.\n * @public\n */\n get seeking(): boolean {\n return this._isSeeking;\n }\n\n /**\n * Get the first seekable range (part) of the video in seconds.\n * @returns {TimeRanges} - First seekable range (part) of the video in seconds.\n * @public\n */\n get seekable(): any {\n return {\n length: 1,\n start: () => {\n return 0;\n },\n end: () => {\n return this._api ? this.currentTime : 0;\n },\n };\n }\n\n /**\n * Get the first played range (part) of the video in seconds.\n * @returns {TimeRanges} - First played range (part) of the video in seconds.\n * @public\n */\n get played(): any {\n return {\n length: 1,\n start: () => {\n return 0;\n },\n end: () => {\n return this._api ? this.currentTime : 0;\n },\n };\n }\n\n /**\n * Get the first buffered range (part) of the video in seconds.\n * @returns {TimeRanges} - First buffered range (part) of the video in seconds.\n * @public\n */\n get buffered(): any {\n return {\n length: 1,\n start: () => {\n return 0;\n },\n end: () => {\n return this._api && this._api.getVideoLoadedFraction\n ? this._api.getVideoLoadedFraction() * this.duration\n : 0;\n },\n };\n }\n\n /**\n * Set player muted state.\n * @param {boolean} mute - The new mute value.\n * @public\n * @returns {void}\n */\n set muted(mute: boolean): void {\n if (this._playerReady()) {\n mute ? this._api.mute() : this._api.unMute();\n this._muted = mute;\n }\n }\n\n /**\n * Get player muted state.\n * @returns {boolean} - The muted value of the video element.\n * @public\n */\n get muted(): boolean {\n let muted = false;\n if (this._playerReady()) {\n muted =\n typeof this._muted === \"boolean\" ? this._muted : this._api.isMuted();\n }\n return muted;\n }\n\n /**\n * Get the default mute value.\n * @returns {boolean} - The defaultMuted of the video element.\n * @public\n */\n get defaultMuted(): boolean {\n return false;\n }\n\n /**\n * Sets an image to be shown while the video is downloading, or until the user hits the play button.\n * @param {string} poster - The image url to be shown.\n * @returns {void}\n * @public\n */\n set poster(poster: string): void {}\n\n /**\n * Gets an image to be shown while the video is downloading, or until the user hits the play button.\n * @returns {poster} - The image url.\n * @public\n */\n get poster(): string {\n return \"\";\n }\n\n /**\n * Specifies if and how the author thinks that the video should be loaded when the page loads.\n * @param {string} preload - The preload value.\n * @public\n * @returns {void}\n */\n set preload(preload: string): void {}\n\n /**\n * Gets the preload value of the video element.\n * @returns {string} - The preload value.\n * @public\n */\n get preload(): string {\n return \"none\";\n }\n\n /**\n * Set if the video will automatically start playing as soon as it can do so without stopping.\n * @param {boolean} autoplay - The autoplay value.\n * @public\n * @returns {void}\n */\n set autoplay(autoplay: boolean): void {}\n\n /**\n * Gets the autoplay value of the video element.\n * @returns {boolean} - The autoplay value.\n * @public\n */\n get autoplay(): boolean {\n return false;\n }\n\n /**\n * Set to specifies that the video will start over again, every time it is finished.\n * @param {boolean} loop - the loop value.\n * @public\n * @returns {void}\n */\n set loop(loop: boolean) {}\n\n /**\n * Gets the loop value of the video element.\n * @returns {boolean} - The loop value.\n * @public\n */\n get loop(): boolean {\n return false;\n }\n\n /**\n * Set to specifies that video controls should be displayed.\n * @param {boolean} controls - the controls value.\n * @public\n * @returns {void}\n */\n set controls(controls: boolean): void {}\n\n /**\n * Gets the controls value of the video element.\n * @returns {boolean} - The controls value.\n * @public\n */\n get controls(): boolean {\n return false;\n }\n\n /**\n * Sets the current playback speed of the audio/video.\n * @param {Number} playbackRate - The playback speed value.\n * @public\n * @returns {void}\n */\n set playbackRate(playbackRate: number): void {\n if (this._api) {\n this._api.setPlaybackRate(playbackRate);\n }\n }\n\n /**\n * Gets the current playback speed of the audio/video.\n * @returns {Number} - The current playback speed value.\n * @public\n */\n get playbackRate(): number {\n return this._playerReady() ? this._api.getPlaybackRate() : 1;\n }\n\n /**\n * Sets the default playback speed of the audio/video.\n * @param {Number} defaultPlaybackRate - The default playback speed value.\n * @public\n * @returns {void}\n */\n set defaultPlaybackRate(defaultPlaybackRate: number) {}\n\n /**\n * Gets the default playback speed of the audio/video.\n * @returns {Number} - The default playback speed value.\n * @public\n */\n get defaultPlaybackRate(): number {\n return 1;\n }\n\n /**\n * The ended property returns whether the playback of the audio/video has ended.\n * @returns {boolean} - The ended value.\n * @public\n */\n get ended(): boolean {\n return this._playerReady()\n ? this._api.getPlayerState() === window.YT.PlayerState.ENDED\n : false;\n }\n\n /**\n * The error property returns a MediaError object.\n * @returns {MediaError} - The MediaError object has a code property containing the error state of the audio/video.\n * @public\n */\n get error(): ?MediaError {\n return null;\n }\n\n /**\n * @returns {Number} - The current network state (activity) of the audio/video.\n * @public\n */\n get networkState(): number {\n if (!this._playerReady()) {\n return 0;\n }\n const playerState = window.YT.PlayerState;\n switch (this._api.getPlayerState()) {\n case playerState.UNSTARTED:\n return 0;\n case playerState.BUFFERING:\n return 2;\n default:\n return 1;\n }\n }\n\n /**\n * Indicates if the audio/video is ready to play or not.\n * @returns {Number} - The current ready state of the audio/video.\n * 0 = HAVE_NOTHING - no information whether or not the audio/video is ready.\n * 1 = HAVE_METADATA - metadata for the audio/video is ready.\n * 2 = HAVE_CURRENT_DATA - data for the current playback position is available, but not enough data to play next frame/millisecond.\n * 3 = HAVE_FUTURE_DATA - data for the current and at least the next frame is available.\n * 4 = HAVE_ENOUGH_DATA - enough data available to start playing.\n */\n get readyState(): number {\n if (!this._api) {\n return 0;\n }\n const playerState = window.YT.PlayerState;\n switch (this._api.getPlayerState()) {\n case playerState.UNSTARTED:\n return 0;\n case playerState.BUFFERING:\n return 2;\n default:\n return 4;\n }\n }\n\n /**\n * @returns {Number} - The height of the video player, in pixels.\n * @public\n */\n get videoHeight(): number {\n return -1;\n }\n\n /**\n * @returns {Number} - The width of the video player, in pixels.\n * @public\n */\n get videoWidth(): number {\n return -1;\n }\n\n /**\n * @param {boolean} playsinline - Whether to set on the video tag the playsinline attribute.\n */\n set playsinline(playsinline: boolean): void {}\n\n /**\n * @returns {boolean} - Whether the video tag has an attribute of playsinline.\n */\n get playsinline(): boolean {\n return this._config.playsinline;\n }\n\n /**\n * Set crossOrigin attribute.\n * @param {?string} crossOrigin - 'anonymous' or 'use-credentials'\n */\n set crossOrigin(crossOrigin: ?string): void {}\n\n /**\n * Get crossOrigin attribute.\n * @returns {?string} - 'anonymous' or 'use-credentials'\n */\n get crossOrigin(): ?string {\n return null;\n }\n\n /**\n * get the playback rates\n * @return {number[]} - playback rates\n */\n get playbackRates(): Array<number> {\n let playbackRates = Youtube.PLAYBACK_RATES;\n if (this._playerReady()) {\n const rates = this._api.getAvailablePlaybackRates();\n if (rates && Array.isArray(rates)) {\n playbackRates = rates;\n }\n }\n return playbackRates;\n }\n\n /**\n * Initializes the engine.\n * @param {PKMediaSourceObject} source - The selected source object.\n * @param {Object} config - The player configuration.\n * @private\n * @returns {void}\n */\n _init(source: PKMediaSourceObject, config: Object): void {\n this._source = source;\n this._config = config;\n this._api = null;\n this._videoLoaded = null;\n this._playingIntervalId = null;\n const dispatchError = (e) => {\n const error = new Error(\n Error.Severity.CRITICAL,\n Error.Category.PLAYER,\n Error.Code.LOAD_FAILED,\n e\n );\n this.dispatchEvent(new FakeEvent(EventType.ERROR, error));\n };\n this._sdkLoaded = new Promise((resolve, reject) => {\n this._apiReady = () => {\n if (this._config.playback.muted || this._config.playback.autoplay) {\n this._api.mute && this._api.mute();\n this._muted = true;\n }\n resolve();\n };\n this._apiError = (e) => {\n const error = this._getYoutubeErrorCodeData(e.data);\n dispatchError(error);\n reject(e.data);\n };\n });\n this._loadYouTubeIframeAPI()\n .then(() => {\n this._loadYouTubePlayer();\n })\n .catch((e) => {\n dispatchError(e);\n });\n }\n\n _createVideoElement() {\n const el = (this._el = Utils.Dom.createElement(\"div\"));\n Utils.Dom.setAttribute(el, \"id\", Utils.Generator.uniqueId(5));\n Utils.Dom.setAttribute(el, \"tabindex\", \"-1\");\n }\n\n _getYoutubeErrorCodeData(\n errorNumber: number\n ): { code: number, message: string } {\n switch (errorNumber) {\n case 2:\n return { code: errorNumber, message: \"Invalid params\" };\n case 5:\n return {\n code: errorNumber,\n message: \"Error while trying to play the video\",\n };\n case 100:\n return { code: errorNumber, message: \"Video not found\" };\n case 101:\n case 150:\n return {\n code: errorNumber,\n message:\n \"The owner of the requested video does not allow it to be played in embedded players\",\n };\n default:\n return {\n code: errorNumber,\n message: \"Unknown error\",\n };\n }\n }\n\n /**\n * Loads the YouTube player.\n * @private\n * @returns {void}\n */\n _loadYouTubePlayer(): void {\n const loadYouTubePlayer = () => {\n const config = {\n playerVars: DEFAULT_PLAYER_VARS,\n events: {\n onReady: this._apiReady,\n onError: this._apiError,\n onStateChange: (e) => this._onPlayerStateChange(e),\n onPlaybackQualityChange: (e) => this._onPlaybackQualityChange(e),\n onVolumeChange: () =>\n this.dispatchEvent(new FakeEvent(EventType.VOLUME_CHANGE)),\n },\n };\n config.playerVars.playsinline = this._config.playback.playsinline ? 1 : 0;\n config.playerVars.autoplay = this._config.playback.autoplay ? 1 : 0;\n if (\n Utils.Object.hasPropertyPath(this._config, \"playback.options.youtube\")\n ) {\n const youtubeConfig = this._config.playback.options.youtube;\n Utils.Object.mergeDeep(config.playerVars, youtubeConfig.playerVars);\n }\n this._api = new window.YT.Player(this._el.id, config);\n };\n if (this._api) {\n return this._apiReady();\n }\n if (window && window.YT && window.YT.Player) {\n loadYouTubePlayer();\n } else {\n window.onYouTubeIframeAPIReady = loadYouTubePlayer;\n }\n }\n\n /**\n * Load YouTube IFrame API element dom object.\n * @private\n * @returns {void}\n */\n _loadYouTubeIframeAPI(): Promise<*> {\n return new Promise((resolve, reject) => {\n if (window && window.YT && window.YT.Player) {\n return resolve();\n }\n const tag = Utils.Dom.createElement(\"script\");\n let url = YOUTUBE_IFRAME_API_URL;\n if (\n Utils.Object.hasPropertyPath(this._config, \"playback.options.youtube\")\n ) {\n if (this._config.playback.options.youtube.iframeApi) {\n url = this._config.playback.options.youtube.iframeApi;\n }\n }\n tag.src = url;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n tag.onerror = () => {\n reject({ message: \"Youtube Iframe API loading failed: \" + url });\n };\n const firstScriptTag = document.getElementsByTagName(\"script\")[0];\n if (firstScriptTag && firstScriptTag.parentNode) {\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n });\n }\n\n _getPlayerStateKey(state: number | null): string {\n const playerState = window.YT.PlayerState;\n return (\n Object.keys(playerState).find((key) => playerState[key] === state) ||\n \"UNKNOWN\"\n );\n }\n\n _onPlayerStateChange(event: any): void {\n const playerState = window.YT.PlayerState;\n const newState = event.data;\n Youtube._logger.info(\n `player state changed from ${this._getPlayerStateKey(\n this._currentState\n )} to ${this._getPlayerStateKey(newState)}`\n );\n if (newState === this._currentState) {\n return;\n }\n this._currentState = newState;\n\n switch (this._currentState) {\n case playerState.UNSTARTED:\n this._handleLoaded();\n break;\n case playerState.ENDED:\n this._onEnded();\n break;\n case playerState.PLAYING:\n if (this._firstPlaying) {\n this._handleFirstPlaying();\n }\n this._onPlaying();\n break;\n case playerState.PAUSED:\n this._onPaused();\n break;\n case playerState.BUFFERING:\n this._onBuffering();\n break;\n case playerState.CUED:\n break;\n }\n }\n\n _onPlaybackQualityChange(event: any): void {\n let videoTrack = this._playerTracks.find((track) => {\n return track instanceof VideoTrack && track.label === event.data;\n });\n this.dispatchEvent(EventType.VIDEO_TRACK_CHANGED, {\n selectedVideoTrack: videoTrack,\n });\n }\n\n _handleClipTo(): void {\n if (this._clipToInterval) {\n clearInterval(this._clipToInterval);\n }\n const { clipTo } = this._config.sources;\n if (this._api && clipTo && this.currentTime < clipTo) {\n this._clipToInterval = setInterval(() => {\n if (this._api.getCurrentTime() >= clipTo) {\n this._api.pauseVideo();\n clearInterval(this._clipToInterval);\n }\n }, 200);\n }\n }\n\n _onPlaying() {\n this._handleClipTo();\n this.dispatchEvent(new FakeEvent(EventType.PLAY));\n this.dispatchEvent(new FakeEvent(EventType.PLAYING));\n this._startPlayingWatchDog();\n if (this._isSeeking) {\n this._isSeeking = false;\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.SEEKED));\n }\n }\n\n _handleLoaded() {\n if (this._loaded) {\n this.dispatchEvent(new FakeEvent(EventType.LOADED_METADATA));\n this.dispatchEvent(new FakeEvent(EventType.LOADED_DATA));\n this._videoLoaded.resolve({ tracks: this._playerTracks });\n }\n }\n\n _handleFirstPlaying() {\n this._firstPlaying = false;\n this.dispatchEvent(new FakeEvent(EventType.DURATION_CHANGE));\n const {seekFrom, captions} = this._config.sources;\n if (this._api && seekFrom) {\n this._api.seekTo(seekFrom);\n }\n if (this._api && captions && captions.length > 0) {\n this._api.setOption('captions', 'track', {});\n }\n }\n\n _onBuffering() {\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.WAITING));\n }\n\n _onPaused() {\n if (this._isSeeking) {\n this._isSeeking = false;\n }\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.PAUSE));\n }\n\n _onEnded() {\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this.dispatchEvent(new FakeEvent(EventType.PAUSE));\n this.dispatchEvent(new FakeEvent(EventType.ENDED));\n }\n\n _startPlayingWatchDog() {\n this._stopPlayingWatchDog();\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n this._playingIntervalId = setInterval(() => {\n if (!this._isSeeking) {\n this.dispatchEvent(new FakeEvent(EventType.TIME_UPDATE));\n }\n }, TIME_INTERVAL_TIMEOUT);\n }\n\n _stopPlayingWatchDog() {\n clearInterval(this._playingIntervalId);\n this._playingIntervalId = null;\n }\n\n // eslint-disable-next-line no-unused-vars\n getThumbnail(time: number): null {\n return null;\n }\n\n resetAllCues(): void {}\n enterPictureInPicture(): void {}\n exitPictureInPicture(): void {}\n isPictureInPictureSupported(): boolean {\n return false;\n }\n get isInPictureInPicture(): boolean {\n return false;\n }\n\n get targetBuffer(): number {\n return NaN;\n }\n\n get availableBuffer(): number {\n return NaN;\n }\n\n}\n\nexport { Youtube };\n","// @flow\nimport { registerEngine } from \"@playkit-js/playkit-js\";\nimport { Youtube } from \"./youtube\";\nimport \"./style.css\";\nimport { registerPlugin } from \"@playkit-js/kaltura-player-js\";\n// $FlowFixMe\nimport { YouTubePlugin } from \"./youtube-plugin\";\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst VERSION = __VERSION__;\nconst NAME = __NAME__;\n\nexport { Youtube as Engine };\nexport { VERSION, NAME };\nexport { YouTubePlugin as Plugin };\n\nconst pluginName: string = 'youtube';\nregisterPlugin(pluginName, YouTubePlugin);\n\nif (Youtube.isSupported()) {\n registerEngine(Youtube.id, Youtube);\n}\n"],"names":["api","content","__esModule","default","module","id","options","styleElement","window","kalturaGlobalConfig","stylesNonce","setAttribute","document","head","appendChild","exports","locals","useSourceMap","list","toString","this","map","item","sourceMap","base64","data","cssMapping","btoa","sourceMapping","unescape","encodeURIComponent","JSON","stringify","concat","sourceURLs","sources","source","sourceRoot","join","cssWithMappingToString","i","modules","mediaQuery","dedupe","alreadyImportedModules","length","_i","push","memo","getTarget","target","styleTarget","querySelector","HTMLIFrameElement","contentDocument","e","stylesInDom","getIndexByIdentifier","identifier","result","modulesToDom","idCountMap","identifiers","base","count","index","obj","css","media","references","updater","addStyle","insertStyleElement","style","createElement","attributes","nonce","Object","keys","forEach","key","insert","Error","textStore","replaceText","replacement","filter","Boolean","applyToSingletonTag","remove","styleSheet","cssText","cssNode","createTextNode","childNodes","removeChild","insertBefore","applyToTag","removeAttribute","firstChild","singleton","singletonCounter","update","styleIndex","bind","parentNode","removeStyleElement","newObj","all","atob","lastIdentifiers","newList","prototype","call","newLastIdentifiers","_index","splice","KalturaPlayer","___CSS_LOADER_EXPORT___","YT_CHAPTER_TYPE","YouTubePlugin","BasePlugin","constructor","name","player","config","super","timelineManager","getService","isValid","loadMedia","eventManager","listenOnce","Event","Core","SOURCE_SELECTED","engineType","EngineType","YOUTUBE","seekFrom","clipTo","duration","isClipToValid","disableChapters","addKalturaCuePoint","reset","destroy","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","d","a","definition","o","defineProperty","enumerable","get","prop","hasOwnProperty","r","Symbol","toStringTag","value","nc","core","DEFAULT_PLAYER_VARS","controls","autoplay","origin","location","iv_load_policy","disablekb","modestbranding","playsinline","rel","fs","cc_load_policy","Youtube","_eventManager","EventManager","_createVideoElement","_init","isSupported","createEngine","canPlaySource","canPlayType","mimetype","toLowerCase","_logger","debug","runCapabilities","getCapabilities","dataSaver","navigator","connection","saveData","capabilities","mutedAutoPlay","Promise","resolve","prepareVideoElement","restore","_reset","_stopSeekTargetWatchDog","_stopPlayingWatchDog","detach","_playerReady","_api","stopVideo","_loaded","_firstPlaying","_isSeeking","_isAdaptiveBitrate","_playerTracks","_currentState","_clipToInterval","clearInterval","removeAll","attach","getVideoElement","_el","selectVideoTrack","videoTrack","VideoTrack","active","isAdaptiveBitrateEnabled","dispatchEvent","EventType","ABR_MODE_CHANGED","mode","setPlaybackQuality","label","selectAudioTrack","audioTrack","info","language","selectTextTrack","textTrack","hideTextTrack","enableAdaptiveBitrate","seekToLiveEdge","attachMediaSource","detachMediaSource","getStartTimeOfDvrWindow","isLive","play","currentTime","playVideo","pause","pauseVideo","load","startTime","_sdkLoaded","then","loadOptions","videoId","_source","url","startSeconds","cueVideoById","catch","error","reject","_videoLoaded","promise","_parseVideoTracks","levels","getAvailableQualityLevels","currentLevel","getPlaybackQuality","videoTracks","level","settings","bandwidth","width","height","_startSeekTargetWatchDog","previousTime","_seekTargetIntervalId","setInterval","paused","FakeEvent","TIME_UPDATE","SEEKED","_config","_playingIntervalId","dispatchError","Severity","CRITICAL","Category","PLAYER","Code","LOAD_FAILED","ERROR","_apiReady","playback","muted","mute","_muted","_apiError","_getYoutubeErrorCodeData","_loadYouTubeIframeAPI","_loadYouTubePlayer","el","Utils","Dom","Generator","uniqueId","errorNumber","code","message","loadYouTubePlayer","playerVars","events","onReady","onError","onStateChange","_onPlayerStateChange","onPlaybackQualityChange","_onPlaybackQualityChange","onVolumeChange","VOLUME_CHANGE","hasPropertyPath","youtubeConfig","youtube","mergeDeep","YT","Player","onYouTubeIframeAPIReady","tag","iframeApi","src","async","onload","onerror","firstScriptTag","getElementsByTagName","_getPlayerStateKey","state","playerState","PlayerState","find","event","newState","UNSTARTED","_handleLoaded","ENDED","_onEnded","PLAYING","_handleFirstPlaying","_onPlaying","PAUSED","_onPaused","BUFFERING","_onBuffering","CUED","track","VIDEO_TRACK_CHANGED","selectedVideoTrack","_handleClipTo","getCurrentTime","PLAY","_startPlayingWatchDog","LOADED_METADATA","LOADED_DATA","tracks","DURATION_CHANGE","captions","seekTo","setOption","WAITING","PAUSE","getThumbnail","time","resetAllCues","enterPictureInPicture","exitPictureInPicture","isPictureInPictureSupported","to","SEEKING","getDuration","NaN","vol","setVolume","getVolume","includes","getPlayerState","start","end","getVideoLoadedFraction","unMute","isMuted","poster","preload","loop","playbackRate","setPlaybackRate","getPlaybackRate","defaultPlaybackRate","crossOrigin","playbackRates","PLAYBACK_RATES","rates","getAvailablePlaybackRates","Array","isArray","FakeEventTarget","getLogger","VERSION","__VERSION__","NAME","__NAME__","registerPlugin","registerEngine"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playkit-js/playkit-js-youtube",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "main": "dist/playkit-youtube.js",
5
5
  "scripts": {
6
6
  "clean": "rm -rf ./dist",
package/src/index.html CHANGED
@@ -1,9 +1,35 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <title>Title</title>
6
- <script src="./playkit-youtube.js" type="text/javascript"></script>
7
- </head>
8
- <body></body>
9
- </html>
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <title>Youtube engine</title>
7
+ <script src="https://unpkg.com/@playkit-js/kaltura-player-js@latest/dist/kaltura-ovp-player.js"></script>
8
+ <script src="./playkit-youtube.js" type="text/javascript"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="player-placeholder" style="width: 768px; height: 480px"></div>
13
+ <script>
14
+ const config = {
15
+ logLevel: 'DEBUG',
16
+ targetId: 'player-placeholder',
17
+ provider: {
18
+ partnerId: 4992442,
19
+ log: {
20
+ level: "DEBUG"
21
+ }
22
+ },
23
+ playback: {
24
+ autoplay: false
25
+ },
26
+ plugins: {}
27
+ };
28
+
29
+ const player = KalturaPlayer.setup(config);
30
+
31
+ player.setMedia({ "sources": { "progressive": [{ "mimetype": "video/youtube", "url": "neSQgkEy_xQ" }] } });
32
+ </script>
33
+ </body>
34
+
35
+ </html>
package/src/youtube.js CHANGED
@@ -1172,11 +1172,11 @@ class Youtube extends FakeEventTarget implements IEngine {
1172
1172
  _handleFirstPlaying() {
1173
1173
  this._firstPlaying = false;
1174
1174
  this.dispatchEvent(new FakeEvent(EventType.DURATION_CHANGE));
1175
- const {seekFrom} = this._config.sources;
1175
+ const {seekFrom, captions} = this._config.sources;
1176
1176
  if (this._api && seekFrom) {
1177
1177
  this._api.seekTo(seekFrom);
1178
1178
  }
1179
- if (this._api && this._config.sources.captions.length > 0) {
1179
+ if (this._api && captions && captions.length > 0) {
1180
1180
  this._api.setOption('captions', 'track', {});
1181
1181
  }
1182
1182
  }