{"version":3,"file":"player.js","sources":["../_src/js/youtube-player.js","../_src/js/video-player.js","../_src/js/player.js"],"sourcesContent":["class YoutubePlayer {\n constructor(_option){\n if(!_option && typeof(_option) !== 'object') {\n throw new TypeError(\"Player module need object type option\");\n }\n\n if(_option && !document.querySelector(_option.selector)) {\n throw new TypeError(`no ${_option.selector} DOM Element`);\n }\n\n this.context = $(_option.selector);\n\n this.player = null;\n\n this.config = $.extend({\n fps: 60,\n videoId: '',\n playerId: '',\n mute: false,\n autoPlay: false,\n loop: false,\n controls: false,\n coverClick: false\n }, _option);\n\n this.config.playerId = `${_option.selector.replace(/^#/, '')}__${this.config.videoId}`;\n\n this.state = {\n isPlay: false,\n isControlShow: true,\n animationFrame: 0,\n timer: null,\n isReady: false,\n isTouchInit: false\n };\n\n this.template = {\n player: `
`,\n controls: `
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t \t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t
`,\n cover: `
`,\n poster: `
`\n };\n\n this.DOM = {\n controls: null,\n progress: null,\n progressBar: null,\n poster: null,\n play: null,\n pause: null\n };\n\n this.dimension = {\n progress: 0,\n progressLeft: 0,\n };\n\n this._handleStateChange = this._handleStateChange.bind(this);\n this._handleReady = this._handleReady.bind(this);\n this._animationFrame = this._animationFrame.bind(this);\n }\n\n init(){\n if(window.YT && window.YT.Player) {\n this._setPlayer();\n return;\n }\n\n if(!window.loadYoutubeApi) {\n window.loadYoutubeApi = true;\n const tag = document.createElement('script');\n tag.src = \"https://www.youtube.com/iframe_api\";\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n\n let check = setInterval(() =>{\n if(window.YT && window.YT.Player) {\n clearInterval(check);\n this._setPlayer();\n }\n }, 200);\n\n }\n\n _setPlayer(){\n this._renderPlayer();\n\n this.player = new window.YT.Player(this.config.playerId, {\n width: '100%',\n height: '100%',\n videoId: this.config.videoId,\n playerVars: {\n modestbranding: 1,\n rel: 0,\n showinfo: 0,\n controls: 0,\n playsinline: 1,\n autoplay: this.config.autoPlay === true ? 1 : 0,\n loop: this.config.loop === true ? 1 : 0,\n playlist: this.config.loop === true ? this.config.videoId : ''\n },\n events: {\n onStateChange: this._handleStateChange,\n onReady: this._handleReady\n }\n });\n\n this._detectDom();\n this._detectDimension();\n this._setMovieSize();\n }\n\n _renderPlayer(){\n this.context.append(this.template.player);\n this.context.append(this.template.poster);\n this.context.append(this.template.cover);\n this.config.controls && this.context.append(this.template.controls);\n }\n\n _detectDom(){\n this.DOM.poster = this.context.find('.player__poster');\n\n if(this.config.controls) {\n this.DOM.controls = this.context.find('.player__controls');\n this.DOM.progress = this.context.find('.player__progress');\n this.DOM.progressBar = this.context.find('.player__progress-bar');\n this.DOM.play = this.context.find('.player__play');\n this.DOM.pause = this.context.find('.player__pause');\n }\n }\n\n _detectDimension(){\n if(this.config.controls) {\n this.dimension.progress = this.DOM.progress.width();\n this.dimension.progressLeft = this.DOM.progress[0].getBoundingClientRect().left;\n }\n }\n\n _setMovieSize(){\n let contextWidth = this.context[0].offsetWidth;\n let contextHeight = this.context[0].offsetHeight;\n let setWidth = 0;\n let setHeight = 0;\n\n if((contextWidth / contextHeight) < (1280 / 720)) {\n setWidth = contextHeight * 1280 / 720;\n setHeight = contextHeight;\n } else {\n setWidth = contextWidth;\n setHeight = contextWidth * 720 / 1280;\n }\n\n $(`#${this.config.playerId}`).css({\n width: setWidth,\n height: setHeight\n });\n }\n\n _setEvent(){\n if(this.config.controls) {\n this.context.on('click', '.player__play', () =>{\n this.play();\n });\n\n this.context.on('click', '.player__pause', () =>{\n this.pause();\n });\n\n this.context.on('click', '.player__progress', (e) =>{\n this.seek((1 - (this.dimension.progress - (e.clientX - this.dimension.progressLeft)) / this.dimension.progress) * this.player.getDuration());\n\n if(!this.state.isPlay) {\n this._handleProgressUpdate((e.clientX - this.dimension.progressLeft) / this.dimension.progress);\n }\n });\n\n this.context.on('mousemove', (e) =>{\n if(!this.state.isPlay) return;\n\n if(e.target === this.DOM.progress[0] || e.target === this.DOM.progressBar[0] || e.target === this.DOM.play[0] || e.target === this.DOM.pause[0]) return;\n\n if(!this.state.isControlShow) {\n this.state.isControlShow = true;\n\n this.DOM.controls.removeClass('player__controls_hide');\n } else {\n clearTimeout(this.state.timer);\n\n this.state.timer = setTimeout(() =>{\n if(!this.state.isPlay) return;\n this.state.isControlShow = false;\n\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n }\n });\n\n this.context.on('mouseover', '.player__controls', () =>{\n if(!this.state.isPlay) return;\n clearTimeout(this.state.timer);\n this.DOM.controls.removeClass('player__controls_hide');\n });\n\n this.context.on('mouseout', '.player__controls', () =>{\n if(!this.state.isPlay) return;\n\n clearTimeout(this.state.timer);\n\n this.state.timer = setTimeout(() =>{\n if(!this.state.isPlay) return;\n this.state.isControlShow = false;\n\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n });\n }\n\n if(this.config.coverClick) {\n this.context.on('click', '.player__cover', () =>{\n this.state.isPlay ? this.pause() : this.play();\n });\n }\n\n $(window).on('resize.player', () =>{\n this.config.controls && this._detectDimension();\n this._setMovieSize();\n });\n }\n\n _handleReady(){\n this.state.isReady = true;\n $(window).trigger(`canplay.${this.config.selector.replace(/^([#.])/, '')}`);\n $(window).trigger(`canplay.${this.config.videoId}`);\n\n this._setMovieSize();\n this._setEvent();\n $('#' + this.config.playerId).addClass('isReady');\n\n if(this.config.mute) {\n this.mute();\n }\n }\n\n _handleStateChange(e){\n switch(e.data) {\n case YT.PlayerState.PLAYING:\n if(this.state.isPlay) return;\n this.state.isPlay = true;\n\n if(this.config.controls) {\n this.DOM.play.removeClass('player__play_show');\n this.DOM.pause.addClass('player__pause_show');\n this.state.timer = setTimeout(() =>{\n if(!this.state.isPlay) return;\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n\n this.state.isControlShow = false;\n }\n\n this._animationFrame(this.state.animationFrame, this._handlePlayUpdate, e);\n\n this.DOM.poster.fadeOut();\n break;\n\n case YT.PlayerState.PAUSED:\n cancelAnimationFrame(this.state.animationFrame);\n this.state.isPlay = false;\n\n if(this.config.controls) {\n this.DOM.play.addClass('player__play_show');\n this.DOM.pause.removeClass('player__pause_show');\n this.DOM.controls.removeClass('player__controls_hide');\n\n this.state.isControlShow = true;\n }\n break;\n\n case YT.PlayerState.CUED:\n cancelAnimationFrame(this.state.animationFrame);\n this.state.isPlay = false;\n\n if(this.config.controls) {\n this.DOM.play.addClass('player__play_show');\n this.DOM.pause.removeClass('player__pause_show');\n this.DOM.controls.removeClass('player__controls_hide');\n\n this.state.isControlShow = true;\n }\n\n this.DOM.poster.show();\n\n if(this.config.controls) {\n this._handleProgressUpdate(0, 0);\n }\n\n break;\n\n case YT.PlayerState.ENDED:\n cancelAnimationFrame(this.state.animationFrame);\n this.state.isPlay = false;\n\n if(this.config.controls) {\n this.DOM.play.addClass('player__play_show');\n this.DOM.pause.removeClass('player__pause_show');\n this.DOM.controls.removeClass('player__controls_hide');\n\n this.state.isControlShow = true;\n }\n\n this.DOM.poster.show();\n\n $(window).trigger(`end.${this.config.selector.replace(/^#/, '')}`);\n\n break;\n }\n }\n\n _handlePlayUpdate(e){\n this.config.controls && this._handleProgressUpdate(e.target.getCurrentTime() / this.player.getDuration());\n }\n\n _handleProgressUpdate(bar){\n this.DOM.progressBar.css({\n 'transform': `scale(${bar > 1 ? 1 : bar}, 1)`\n });\n }\n\n _animationFrame(reqId, doFunc, e){\n let loop = () =>{\n doFunc.call(this, e);\n this.state.isPlay && (reqId = requestAnimationFrame(loop));\n };\n\n loop();\n };\n\n setTouchInit(){\n this.state.isTouchInit = true;\n }\n\n play(){\n this.state.isReady && !this.state.isPlay && this.player.playVideo();\n }\n\n stop(){\n this.player.stopVideo();\n }\n\n pause(){\n this.player.pauseVideo();\n }\n\n mute(){\n this.player.mute();\n }\n\n unMute(){\n this.player.unMute();\n }\n\n seek(t){\n this.player.seekTo(t);\n }\n\n}\n\nexport default YoutubePlayer;","class VideoPlayer {\n constructor(_option){\n if(!_option && typeof(_option) !== 'object') {\n throw new TypeError(\"Player module need object type option\");\n }\n\n if(_option && !document.querySelector(_option.selector)) {\n throw new TypeError(`no ${_option.selector} DOM Element`);\n }\n\n this.context = $(_option.selector);\n\n this.player = null;\n\n this.config = $.extend({\n fps: 60,\n videoId: '',\n playerId: '',\n mute: false,\n autoPlay: false,\n loop: false,\n controls: false,\n coverClick: false,\n poster: false\n }, _option);\n\n this.config.playerId = `${_option.selector.replace(/^#/, '')}__screen`;\n\n this.state = {\n isPlay: false,\n isControlShow: true,\n animationFrame: 0,\n timer: 0,\n isReady: false,\n firstPlay: false\n };\n\n this.template = {\n player: `\n\t\t\t\t\t`,\n controls: `
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t \t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t
`,\n cover: `
`,\n poster: `
`\n };\n\n this.DOM = {\n controls: null,\n progress: null,\n progressBar: null,\n play: null,\n pause: null,\n poster: false\n };\n\n this.dimension = {\n progress: 0,\n progressLeft: 0,\n };\n\n this._handleStateChange = this._handleStateChange.bind(this);\n this._handleReady = this._handleReady.bind(this);\n this._animationFrame = this._animationFrame.bind(this);\n }\n\n init(){\n this._setPlayer();\n }\n\n _setPlayer(){\n this._renderPlayer();\n this.video = $('#' + this.config.playerId)[0];\n this.video.load();\n\n this._detectDom();\n this._detectDimension();\n\n $(this.video).on('canplay', this._handleReady);\n }\n\n _renderPlayer(){\n this.context.append(this.template.player);\n this.context.append(this.template.cover);\n this.config.poster && this.context.append(this.template.poster);\n this.config.controls && this.context.append(this.template.controls);\n }\n\n _detectDom(){\n this.DOM.poster = this.config.poster && this.context.find('.player__poster');\n\n if(this.config.controls) {\n this.DOM.controls = this.context.find('.player__controls');\n this.DOM.progress = this.context.find('.player__progress');\n this.DOM.progressBar = this.context.find('.player__progress-bar');\n this.DOM.play = this.context.find('.player__play');\n this.DOM.pause = this.context.find('.player__pause');\n }\n }\n\n _detectDimension(){\n if(this.config.controls) {\n this.dimension.progress = this.DOM.progress.width();\n this.dimension.progressLeft = this.DOM.progress[0].getBoundingClientRect().left;\n }\n }\n\n _setMovieSize(){\n const contextWidth = this.context[0].offsetWidth;\n const contextHeight = this.context[0].offsetHeight;\n\n const videoWidth = this.video.videoWidth;\n const videoHeight = this.video.videoHeight;\n\n let setWidth = 0;\n let setHeight = 0;\n\n if((contextWidth / contextHeight) < (videoWidth / videoHeight)) {\n setWidth = contextHeight * videoWidth / videoHeight;\n setHeight = contextHeight;\n } else {\n setWidth = contextWidth;\n setHeight = contextWidth * videoHeight / videoWidth;\n }\n\n $(`#${this.config.playerId}`).css({\n width: setWidth,\n height: setHeight\n });\n }\n\n _setEvent(){\n if(this.config.controls) {\n this.context.on('click', '.player__play', () =>{\n this.play();\n });\n\n this.context.on('click', '.player__pause', () =>{\n this.pause();\n });\n\n this.context.on('click', '.player__progress', (e) =>{\n this.seek((1 - (this.dimension.progress - (e.clientX - this.dimension.progressLeft)) / this.dimension.progress) * this.video.duration);\n\n if(!this.state.isPlay) {\n this._handleProgressUpdate((e.clientX - this.dimension.progressLeft) / this.dimension.progress);\n }\n\n this.state.firstPlay || this.play();\n });\n\n this.context.on('mousemove', (e) =>{\n if(!this.state.isPlay) return;\n\n if(e.target === this.DOM.progress[0] || e.target === this.DOM.progressBar[0] || e.target === this.DOM.play[0] || e.target === this.DOM.pause[0]) return;\n\n if(!this.state.isControlShow) {\n this.state.isControlShow = true;\n\n this.DOM.controls.removeClass('player__controls_hide');\n } else {\n clearTimeout(this.state.timer);\n\n this.state.timer = setTimeout(() =>{\n if(!this.state.isPlay) return;\n this.state.isControlShow = false;\n\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n }\n });\n\n this.context.on('mouseover', '.player__controls', () =>{\n if(!this.state.isPlay) return;\n\n clearTimeout(this.state.timer);\n\n this.DOM.controls.removeClass('player__controls_hide');\n });\n\n this.context.on('mouseout', '.player__controls', () =>{\n if(!this.state.isPlay) return;\n\n clearTimeout(this.state.timer);\n\n this.state.timer = setTimeout(() =>{\n if(!this.state.isPlay) return;\n this.state.isControlShow = false;\n\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n });\n }\n\n if(this.config.coverClick) {\n this.context.on('click', '.player__cover', () =>{\n this.state.isPlay ? this.pause() : this.play();\n });\n }\n\n $(window).on('resize.player', () =>{\n this.config.controls && this._detectDimension();\n this._setMovieSize();\n });\n\n $(this.video).on('ended', () =>{\n this._handleStateChange('end');\n });\n\n $(this.video).on('play', () =>{\n this._handleStateChange('play');\n this.config.poster && this.DOM.poster.hide();\n });\n\n if(this.config.autoPlay) {\n $(this.video).one('playing', () =>{\n this._handleStateChange('play');\n });\n }\n\n $(this.video).on('pause', () =>{\n this._handleStateChange('pause');\n });\n\n $(this.video).on('durationchange', (e) =>{\n this._setMovieSize();\n });\n }\n\n _handleReady(){\n this.state.isReady = true;\n $(this.video).off('canplay');\n $(window).trigger(`canplay.${this.config.selector.replace(/^#/, '')}`);\n\n this._setMovieSize();\n this._setEvent();\n $(this.video).addClass('isReady');\n\n this.config.mute && this.mute();\n\n if(this.config.autoPlay) {\n this.play();\n }\n }\n\n _handleStateChange(state){\n switch(state) {\n case 'play':\n this.state.firstPlay = this.state.firstPlay || true;\n\n if(this.state.isPlay) return;\n this.state.isPlay = true;\n\n if(this.config.controls) {\n\n this.DOM.play.removeClass('player__play_show');\n this.DOM.pause.addClass('player__pause_show');\n\n this.state.timer = setTimeout(() =>{\n if(!this.state.isPlay) return;\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n\n this.state.isControlShow = false;\n }\n\n this._animationFrame(this.state.animationFrame, this._handlePlayUpdate, this.config.fps);\n break;\n\n case 'pause':\n this.state.isPlay = false;\n cancelAnimationFrame(this.state.animationFrame);\n\n if(this.config.controls) {\n this.DOM.play.addClass('player__play_show');\n this.DOM.pause.removeClass('player__pause_show');\n this.DOM.controls.removeClass('player__controls_hide');\n this.state.isControlShow = true;\n }\n break;\n\n case 'end':\n this.state.isPlay = false;\n cancelAnimationFrame(this.state.animationFrame);\n\n if(this.config.controls) {\n this.DOM.play.addClass('player__play_show');\n this.DOM.pause.removeClass('player__pause_show');\n this.DOM.controls.removeClass('player__controls_hide');\n this.state.isControlShow = true;\n }\n\n this.video.pause();\n\n $(window).trigger(`end.${this.config.selector.replace(/^#/, '')}`);\n\n this.config.loop ? this.play() : this.config.poster && this.DOM.poster.show();\n break;\n }\n }\n\n _handlePlayUpdate(){\n this.config.controls && this._handleProgressUpdate(this.video.currentTime / this.video.duration);\n }\n\n _handleProgressUpdate(bar){\n this.DOM.progressBar.css({\n 'transform': `scale3d(${bar > 1 ? 1 : bar}, 1,1 )`\n });\n }\n\n _animationFrame(reqId, doFunc){\n const loop = () =>{\n doFunc.call(this);\n this.state.isPlay && (reqId = requestAnimationFrame(loop));\n };\n loop();\n }\n\n play(){\n this.state.isReady && !this.state.isPlay && this.video.play();\n }\n\n stop(){\n this.video.pause();\n this.video.currentTime = 0;\n this._handlePlayUpdate();\n\n this.config.poster && this.DOM.poster.show();\n }\n\n pause(){\n this.video.pause();\n }\n\n mute(){\n this.video.muted = true;\n }\n\n unMute(){\n this.video.muted = false;\n }\n\n seek(t){\n this.video.currentTime = t;\n }\n}\n\nexport default VideoPlayer;","import YoutubePlayer from './youtube-player';\nimport VideoPlayer from './video-player';\n\nclass Player {\n constructor(_option){\n let extName = _option.videoId.substring(_option.videoId.lastIndexOf('.', _option.videoId.length)).toLowerCase();\n\n if(extName === '.mp4' || extName === '.webm') {\n this.player = new VideoPlayer(_option);\n } else {\n this.player = new YoutubePlayer(_option);\n }\n\n if(_option.autoPlay) {\n if(navigator.userAgent.match(/SamsungBrowser/)) {\n $(document).one(`click.player.autoPlay`, 'body', () =>{\n console.log('body click');\n this.play();\n });\n } else {\n $(document).one(`touchstart.player.autoPlay`, 'body', () =>{\n this.play();\n });\n }\n }\n this.init();\n }\n\n init(){\n this.player.init();\n }\n\n play(){\n this.player.play();\n }\n\n stop(){\n this.player.stop();\n }\n\n pause(){\n this.player.pause();\n }\n\n mute(){\n this.player.mute();\n }\n\n unMute(){\n this.player.unMute();\n }\n\n seek(t){\n this.player.seek(t);\n }\n}\n\nexport default Player;"],"names":["YoutubePlayer","_option","TypeError","document","querySelector","selector","context","$","player","config","extend","playerId","replace","this","videoId","state","template","DOM","dimension","_handleStateChange","bind","_handleReady","_animationFrame","window","YT","Player","_setPlayer","loadYoutubeApi","tag","createElement","src","firstScriptTag","getElementsByTagName","parentNode","insertBefore","check","setInterval","_renderPlayer","autoPlay","loop","_detectDom","_detectDimension","_setMovieSize","append","poster","cover","controls","find","progress","progressBar","play","pause","width","progressLeft","getBoundingClientRect","left","contextWidth","offsetWidth","contextHeight","offsetHeight","setWidth","setHeight","css","on","e","seek","_this2","clientX","getDuration","isPlay","_handleProgressUpdate","target","isControlShow","timer","setTimeout","addClass","removeClass","coverClick","isReady","trigger","_setEvent","mute","data","PlayerState","PLAYING","_this3","animationFrame","_handlePlayUpdate","fadeOut","PAUSED","CUED","show","ENDED","getCurrentTime","bar","reqId","doFunc","call","requestAnimationFrame","isTouchInit","playVideo","stopVideo","pauseVideo","unMute","t","seekTo","VideoPlayer","substring","lastIndexOf","length","toLowerCase","split","video","load","videoWidth","videoHeight","_this","duration","firstPlay","hide","one","off","fps","currentTime","muted","extName","navigator","userAgent","match","log","init","stop"],"mappings":"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"}