diff --git a/dist/APlayer.min.js b/dist/APlayer.min.js index ea3c3f4..2ead59c 100644 --- a/dist/APlayer.min.js +++ b/dist/APlayer.min.js @@ -1,2 +1,2 @@ -"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,t){for(var a=0;ae?"0"+e:""+e},a=parseInt(e/60),i=parseInt(e-60*a);return t(a)+":"+t(i)},this.parseLrc=function(e){for(var t=[],a=0;al;l++){var o=i[l].match(/\[(\d{2}):(\d{2})\.(\d{2,3})]/g),r=i[l].replace(/\[(\d{2}):(\d{2})\.(\d{2,3})]/g,"").replace(/^\s+|\s+$/g,"");if(null!=o)for(var d=o.length,u=0;d>u;u++){var p=/\[(\d{2}):(\d{2})\.(\d{2,3})]/.exec(o[u]),c=60*p[1]+parseInt(p[2])+parseInt(p[3])/(2===(p[3]+"").length?100:1e3);s.push([c,r])}}s.sort(function(e,t){return e[0]-t[0]}),t.push(s)}return t},this.updateBar=function(e,t,i){t=t>0?t:0,t=1>t?t:1,a[e+"Bar"].style[i]=100*t+"%"},this.updateLrc=function(){var e=arguments.length<=0||void 0===arguments[0]?a.audio.currentTime:arguments[0];if(a.lrcIndex>a.lrc.length-1||e=a.lrc[a.lrcIndex+1][0])for(var t=0;t=a.lrc[t][0]&&(!a.lrc[t+1]||e-1,this.music=this.multiple?this.option.music[this.playIndex]:this.option.music;var s=void 0;if(this.option.showlrc){var n=[];if(1===this.option.showlrc)if(this.multiple)for(s=0;s\n
\n \n
\n \n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n - 00:00 / 00:00\n
\n \n
\n
\n
\n
\n
\n
\n '+(this.multiple?'':"")+"\n
\n
\n
";if(this.multiple){for(l+='\n
\n
    ',s=0;s\n \n '+(s+1)+'\n '+this.option.music[s].title+'\n '+this.option.music[s].author+"\n ";l+="\n
\n
"}this.element.innerHTML=l,this.ptime=this.element.getElementsByClassName("aplayer-ptime")[0],this.element.getElementsByClassName("aplayer-info")[0].offsetWidth<200&&this.element.getElementsByClassName("aplayer-time")[0].classList.add("aplayer-time-narrow"),this.element.getElementsByClassName("aplayer-bar-wrap")[0].style.marginRight=this.element.getElementsByClassName("aplayer-time")[0].offsetWidth+5+"px",this.option.narrow&&this.element.classList.add("aplayer-narrow"),this.button=this.element.getElementsByClassName("aplayer-button")[0],this.button.addEventListener("click",function(e){i.button.classList.contains("aplayer-play")?i.play():i.button.classList.contains("aplayer-pause")&&i.pause()}),this.multiple&&!function(){for(var e=i.element.getElementsByClassName("aplayer-list")[0].getElementsByTagName("li"),t=function(t){e[t].addEventListener("click",function(){var a=parseInt(e[t].getElementsByClassName("aplayer-list-index")[0].innerHTML)-1;a!==i.playIndex&&i.setMusic(a),i.play()})},a=0;a0?s:0,s=1>s?s:1,i.updateBar("played",s,"width"),i.option.showlrc&&i.updateLrc(parseFloat(i.playedBar.style.width)/100*i.audio.duration),i.element.getElementsByClassName("aplayer-ptime")[0].innerHTML=i.secondToTime(s*i.audio.duration)},d=function h(){document.removeEventListener("mouseup",h),document.removeEventListener("mousemove",r),i.audio.currentTime=parseFloat(i.playedBar.style.width)/100*i.audio.duration,i.playedTime=setInterval(function(){i.updateBar("played",i.audio.currentTime/i.audio.duration,"width"),i.option.showlrc&&i.updateLrc(),i.element.getElementsByClassName("aplayer-ptime")[0].innerHTML=i.secondToTime(i.audio.currentTime),i.trigger("playing")},100)};this.thumb.addEventListener("mousedown",function(){o=i.bar.clientWidth,clearInterval(i.playedTime),document.addEventListener("mousemove",r),document.addEventListener("mouseup",d)}),this.volumeBar=this.element.getElementsByClassName("aplayer-volume")[0];var u=this.element.getElementsByClassName("aplayer-volume-bar")[0],p=this.element.getElementsByClassName("aplayer-time")[0].getElementsByTagName("i")[0],c=35;this.element.getElementsByClassName("aplayer-volume-bar-wrap")[0].addEventListener("click",function(e){var t=e||window.event,s=(c-t.clientY+a(u))/c;s=s>0?s:0,s=1>s?s:1,i.updateBar("volume",s,"height"),i.audio.volume=s,i.audio.muted&&(i.audio.muted=!1),1===s?p.className="demo-icon aplayer-icon-volume-up":p.className="demo-icon aplayer-icon-volume-down"}),p.addEventListener("click",function(){i.audio.muted?(i.audio.muted=!1,p.className=1===i.audio.volume?"demo-icon aplayer-icon-volume-up":"demo-icon aplayer-icon-volume-down",i.updateBar("volume",i.audio.volume,"height")):(i.audio.muted=!0,p.className="demo-icon aplayer-icon-volume-off",i.updateBar("volume",0,"height"))});var m=this.element.getElementsByClassName("aplayer-icon-loop")[0];m.addEventListener("click",function(){i.loop?(m.classList.add("aplayer-noloop"),i.loop=!1,i.audio.loop=i.multiple?!1:i.loop):(m.classList.remove("aplayer-noloop"),i.loop=!0,i.audio.loop=i.multiple?!1:i.loop)}),this.multiple&&this.element.getElementsByClassName("aplayer-icon-menu")[0].addEventListener("click",function(){var e=i.element.getElementsByClassName("aplayer-list")[0];e.classList.contains("aplayer-list-hide")?e.classList.remove("aplayer-list-hide"):e.classList.add("aplayer-list-hide")}),this.setMusic(0),e.push(this)}},{key:"setMusic",value:function(e){var t=this;this.multiple&&"undefined"!=typeof e&&(this.playIndex=e);var a=this.playIndex;if(this.music=this.multiple?this.option.music[a]:this.option.music,this.music.pic&&(this.element.getElementsByClassName("aplayer-pic")[0].style.backgroundImage="url("+encodeURI(this.music.pic)+")"),this.element.getElementsByClassName("aplayer-title")[0].innerHTML=this.music.title,this.element.getElementsByClassName("aplayer-author")[0].innerHTML=" - "+this.music.author,this.multiple&&(this.element.getElementsByClassName("aplayer-list-light")[0]&&this.element.getElementsByClassName("aplayer-list-light")[0].classList.remove("aplayer-list-light"),this.element.getElementsByClassName("aplayer-list")[0].getElementsByTagName("li")[a].classList.add("aplayer-list-light")),this.audio&&(this.pause(),this.audio.currentTime=0),this.multiple&&!this.audios[a]||-1===this.playIndex?(this.audio=document.createElement("audio"),this.audio.src=this.music.url,this.audio.preload=this.isMobile?"none":"metadata",this.audio.addEventListener("durationchange",function(){1!==t.audio.duration&&(t.element.getElementsByClassName("aplayer-dtime")[0].innerHTML=t.secondToTime(t.audio.duration))}),this.audio.addEventListener("progress",function(){var e=t.audio.buffered.length?t.audio.buffered.end(t.audio.buffered.length-1)/t.audio.duration:0;t.updateBar("loaded",e,"width")}),this.audio.addEventListener("error",function(){t.element.getElementsByClassName("aplayer-author")[0].innerHTML=" - Error happens ╥﹏╥",t.trigger("pause")}),this.audio.addEventListener("canplay",function(){t.trigger("canplay")}),this.ended=!1,this.multiple?this.audio.addEventListener("ended",function(){t.playIndex"+this.lrc[s][1]+"

";this.lrcContents.innerHTML=i,this.lrcIndex||(this.lrcIndex=0),this.lrcContents.getElementsByTagName("p")[0].classList.add("aplayer-lrc-current"),this.lrcContents.style.transform="translateY(0px)",this.lrcContents.style.webkitTransform="translateY(0px)"}1!==this.audio.duration&&(this.element.getElementsByClassName("aplayer-dtime")[0].innerHTML=this.audio.duration?this.secondToTime(this.audio.duration):"00:00"),this.option.autoplay&&!this.isMobile&&this.play(),this.option.autoplay=!0,this.isMobile&&this.pause()}},{key:"play",value:function(){var t=this;if(this.audio.paused){if(this.button.classList.remove("aplayer-play"),this.button.classList.add("aplayer-pause"),this.button.innerHTML="",setTimeout(function(){t.button.innerHTML=''},100),this.option.mutex)for(var a=0;a'},100),this.audio.pause(),clearInterval(this.playedTime),this.trigger("pause"))}},{key:"on",value:function(e,t){"function"==typeof t&&this.event[e].push(t)}}]),t}();"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=t:window.APlayer=t}([]); +"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,t){for(var a=0;ae?"0"+e:""+e},a=parseInt(e/60),i=parseInt(e-60*a);return t(a)+":"+t(i)},this.parseLrc=function(e){for(var t=[],a=0;al;l++){var o=i[l].match(/\[(\d{2}):(\d{2})\.(\d{2,3})]/g),r=i[l].replace(/\[(\d{2}):(\d{2})\.(\d{2,3})]/g,"").replace(/^\s+|\s+$/g,"");if(null!=o)for(var d=o.length,u=0;d>u;u++){var p=/\[(\d{2}):(\d{2})\.(\d{2,3})]/.exec(o[u]),c=60*p[1]+parseInt(p[2])+parseInt(p[3])/(2===(p[3]+"").length?100:1e3);s.push([c,r])}}s.sort(function(e,t){return e[0]-t[0]}),t.push(s)}return t},this.updateBar=function(e,t,i){t=t>0?t:0,t=1>t?t:1,a[e+"Bar"].style[i]=100*t+"%"},this.updateLrc=function(){var e=arguments.length<=0||void 0===arguments[0]?a.audio.currentTime:arguments[0];if(a.lrcIndex>a.lrc.length-1||e=a.lrc[a.lrcIndex+1][0])for(var t=0;t=a.lrc[t][0]&&(!a.lrc[t+1]||e-1,this.music=this.multiple?this.option.music[this.playIndex]:this.option.music;var s=void 0;if(this.option.showlrc){var n=[];if(1===this.option.showlrc)if(this.multiple)for(s=0;s\n
\n \n
\n \n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n - 00:00 / 00:00\n
\n \n
\n
\n
\n
\n
\n
\n '+(this.multiple?'':"")+"\n
\n
\n
";if(this.multiple){for(l+='\n
\n
    ',s=0;s\n \n '+(s+1)+'\n '+this.option.music[s].title+'\n '+this.option.music[s].author+"\n ";l+="\n
\n
"}this.element.innerHTML=l,this.ptime=this.element.getElementsByClassName("aplayer-ptime")[0],this.element.getElementsByClassName("aplayer-info")[0].offsetWidth<200&&this.element.getElementsByClassName("aplayer-time")[0].classList.add("aplayer-time-narrow"),this.element.getElementsByClassName("aplayer-bar-wrap")[0].style.marginRight=this.element.getElementsByClassName("aplayer-time")[0].offsetWidth+5+"px",this.option.narrow&&this.element.classList.add("aplayer-narrow"),this.button=this.element.getElementsByClassName("aplayer-button")[0],this.button.addEventListener("click",function(e){i.button.classList.contains("aplayer-play")?i.play():i.button.classList.contains("aplayer-pause")&&i.pause()}),this.multiple&&!function(){for(var e=i.element.getElementsByClassName("aplayer-list")[0].getElementsByTagName("li"),t=function(t){e[t].addEventListener("click",function(){var a=parseInt(e[t].getElementsByClassName("aplayer-list-index")[0].innerHTML)-1;a!==i.playIndex&&i.setMusic(a),i.play()})},a=0;a0?s:0,s=1>s?s:1,i.updateBar("played",s,"width"),i.option.showlrc&&i.updateLrc(parseFloat(i.playedBar.style.width)/100*i.audio.duration),i.element.getElementsByClassName("aplayer-ptime")[0].innerHTML=i.secondToTime(s*i.audio.duration)},d=function h(){document.removeEventListener("mouseup",h),document.removeEventListener("mousemove",r),i.audio.currentTime=parseFloat(i.playedBar.style.width)/100*i.audio.duration,i.playedTime=setInterval(function(){i.updateBar("played",i.audio.currentTime/i.audio.duration,"width"),i.option.showlrc&&i.updateLrc(),i.element.getElementsByClassName("aplayer-ptime")[0].innerHTML=i.secondToTime(i.audio.currentTime),i.trigger("playing")},100)};this.thumb.addEventListener("mousedown",function(){o=i.bar.clientWidth,clearInterval(i.playedTime),document.addEventListener("mousemove",r),document.addEventListener("mouseup",d)}),this.volumeBar=this.element.getElementsByClassName("aplayer-volume")[0];var u=this.element.getElementsByClassName("aplayer-volume-bar")[0],p=this.element.getElementsByClassName("aplayer-time")[0].getElementsByTagName("i")[0],c=35;this.element.getElementsByClassName("aplayer-volume-bar-wrap")[0].addEventListener("click",function(e){var t=e||window.event,s=(c-t.clientY+a(u))/c;s=s>0?s:0,s=1>s?s:1,i.updateBar("volume",s,"height"),i.audio.volume=s,i.audio.muted&&(i.audio.muted=!1),1===s?p.className="demo-icon aplayer-icon-volume-up":p.className="demo-icon aplayer-icon-volume-down"}),p.addEventListener("click",function(){i.audio.muted?(i.audio.muted=!1,p.className=1===i.audio.volume?"demo-icon aplayer-icon-volume-up":"demo-icon aplayer-icon-volume-down",i.updateBar("volume",i.audio.volume,"height")):(i.audio.muted=!0,p.className="demo-icon aplayer-icon-volume-off",i.updateBar("volume",0,"height"))});var m=this.element.getElementsByClassName("aplayer-icon-loop")[0];m.addEventListener("click",function(){i.loop?(m.classList.add("aplayer-noloop"),i.loop=!1,i.audio.loop=i.multiple?!1:i.loop):(m.classList.remove("aplayer-noloop"),i.loop=!0,i.audio.loop=i.multiple?!1:i.loop)}),this.multiple&&this.element.getElementsByClassName("aplayer-icon-menu")[0].addEventListener("click",function(){var e=i.element.getElementsByClassName("aplayer-list")[0];e.classList.contains("aplayer-list-hide")?e.classList.remove("aplayer-list-hide"):e.classList.add("aplayer-list-hide")}),this.setMusic(0),e.push(this)}},{key:"setMusic",value:function(e){var t=this;this.multiple&&"undefined"!=typeof e&&(this.playIndex=e);var a=this.playIndex;if(this.music=this.multiple?this.option.music[a]:this.option.music,this.music.pic&&(this.element.getElementsByClassName("aplayer-pic")[0].style.backgroundImage="url("+encodeURI(this.music.pic)+")"),this.element.getElementsByClassName("aplayer-title")[0].innerHTML=this.music.title,this.element.getElementsByClassName("aplayer-author")[0].innerHTML=" - "+this.music.author,this.multiple&&(this.element.getElementsByClassName("aplayer-list-light")[0]&&this.element.getElementsByClassName("aplayer-list-light")[0].classList.remove("aplayer-list-light"),this.element.getElementsByClassName("aplayer-list")[0].getElementsByTagName("li")[a].classList.add("aplayer-list-light")),this.audio&&(this.pause(),this.audio.currentTime=0),this.multiple&&!this.audios[a]||-1===this.playIndex?(this.audio=document.createElement("audio"),this.audio.src=this.music.url,this.audio.preload=this.isMobile?"none":"metadata",this.audio.addEventListener("durationchange",function(){1!==t.audio.duration&&(t.element.getElementsByClassName("aplayer-dtime")[0].innerHTML=t.secondToTime(t.audio.duration))}),this.audio.addEventListener("progress",function(){var e=t.audio.buffered.length?t.audio.buffered.end(t.audio.buffered.length-1)/t.audio.duration:0;t.updateBar("loaded",e,"width")}),this.audio.addEventListener("error",function(){t.element.getElementsByClassName("aplayer-author")[0].innerHTML=" - Error happens ╥﹏╥",t.trigger("pause")}),this.audio.addEventListener("canplay",function(){t.trigger("canplay")}),this.ended=!1,this.multiple?this.audio.addEventListener("ended",function(){t.playIndex"+this.lrc[s][1]+"

";this.lrcContents.innerHTML=i,this.lrcIndex||(this.lrcIndex=0),this.lrcContents.getElementsByTagName("p")[0].classList.add("aplayer-lrc-current"),this.lrcContents.style.transform="translateY(0px)",this.lrcContents.style.webkitTransform="translateY(0px)"}1!==this.audio.duration&&(this.element.getElementsByClassName("aplayer-dtime")[0].innerHTML=this.audio.duration?this.secondToTime(this.audio.duration):"00:00"),this.option.autoplay&&!this.isMobile&&this.play(),this.option.autoplay=!0,this.isMobile&&this.pause()}},{key:"play",value:function(){var t=this;if(this.audio.paused){if(this.button.classList.remove("aplayer-play"),this.button.classList.add("aplayer-pause"),this.button.innerHTML="",setTimeout(function(){t.button.innerHTML=''},100),this.option.mutex)for(var a=0;a'},100),this.audio.pause(),clearInterval(this.playedTime),this.trigger("pause"))}},{key:"on",value:function(e,t){"function"==typeof t&&this.event[e].push(t)}}]),t}();"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=t:window.APlayer=t}(); //# sourceMappingURL=APlayer.min.js.map diff --git a/dist/APlayer.min.js.map b/dist/APlayer.min.js.map index 8b705cd..c91c759 100644 --- a/dist/APlayer.min.js.map +++ b/dist/APlayer.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["APlayer.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","instances","APlayer","option","_this","this","isMobile","navigator","userAgent","match","autoplay","defaultOption","element","document","getElementsByClassName","narrow","mutex","showlrc","theme","loop","defaultKey","hasOwnProperty","playIndex","toString","call","music","audios","secondToTime","second","add0","num","min","parseInt","sec","parseLrc","arr","lrcs","k","lyric","split","lrc","lyricLen","lrcTimes","lrcText","replace","timeLen","j","oneTime","exec","lrcTime","push","sort","a","b","updateBar","type","percentage","direction","style","updateLrc","currentTime","arguments","undefined","audio","lrcIndex","lrcContents","transform","webkitTransform","classList","remove","getElementsByTagName","add","eventTypes","event","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","value","err","trigger","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","func","getElementViewLeft","actualLeft","offsetLeft","current","offsetParent","elementScrollLeft","body","scrollLeft","documentElement","getElementViewTop","actualTop","offsetTop","elementScrollTop","scrollTop","_this2","multiple","innerHTML","eleHTML","pic","encodeURI","title","author","ptime","offsetWidth","marginRight","button","addEventListener","e","contains","play","pause","listItem","_loop","_i","musicIndex","setMusic","playedBar","loadedBar","thumb","bar","barWidth","window","clientWidth","clientX","duration","parseFloat","width","background","thumbMove","thumbUp","removeEventListener","playedTime","setInterval","clearInterval","volumeBar","volumeBarWrap","volumeicon","barHeight","clientY","volume","muted","className","loopEle","list","index","_this3","indexMusic","backgroundImage","createElement","src","url","preload","buffered","end","ended","height","lrcHTML","_this4","paused","setTimeout","_this5","name","module","exports"],"mappings":"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","file":"APlayer.min.js","sourcesContent":["((instances) => {\n\n class APlayer {\n /**\n * APlayer constructor function\n *\n * @param {Object} option - See README\n * @constructor\n */\n constructor(option) {\n\n this.isMobile = navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(android)|(webOS)/i);\n // compatibility: some mobile browsers don't suppose autoplay\n if (this.isMobile) {\n option.autoplay = false;\n }\n\n // default options\n const defaultOption = {\n element: document.getElementsByClassName('aplayer')[0],\n narrow: false,\n autoplay: false,\n mutex: true,\n showlrc: 0,\n theme: '#b7daff',\n loop: true\n };\n for (let defaultKey in defaultOption) {\n if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {\n option[defaultKey] = defaultOption[defaultKey];\n }\n }\n\n // multiple music\n this.playIndex = Object.prototype.toString.call(option.music) === '[object Array]' ? 0 : -1;\n\n this.option = option;\n this.audios = [];\n this.loop = option.loop;\n\n /**\n * Parse second to 00:00 format\n *\n * @param {Number} second\n * @return {String} 00:00 format\n */\n this.secondToTime = (second) => {\n const add0 = (num) => {\n return num < 10 ? '0' + num : '' + num;\n };\n const min = parseInt(second / 60);\n const sec = parseInt(second - min * 60);\n return add0(min) + ':' + add0(sec);\n };\n\n /**\n * Parse lrc, suppose multiple time tag\n *\n * @param {Array} arr - Format:\n * [mm:ss.xx]lyric\n * [mm:ss.xxx]lyric\n * [mm:ss.xx][mm:ss.xx][mm:ss.xx]lyric\n *\n * @return {Array} [[[time, text], [time, text], [time, text], ...], [[time, text], [time, text], [time, text], ...], ...]\n */\n this.parseLrc = (arr) => {\n let lrcs = [];\n for (let k = 0; k < arr.length; k++) {\n const lyric = arr[k].split('\\n');\n let lrc = [];\n const lyricLen = lyric.length;\n for (let i = 0; i < lyricLen; i++) {\n // match lrc time\n const lrcTimes = lyric[i].match(/\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/g);\n // match lrc text\n const lrcText = lyric[i].replace(/\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/g, '').replace(/^\\s+|\\s+$/g, '');\n\n if (lrcTimes != null) {\n // handle multiple time tag\n const timeLen = lrcTimes.length;\n for (let j = 0; j < timeLen; j++) {\n const oneTime = /\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/.exec(lrcTimes[j]);\n const lrcTime = (oneTime[1]) * 60 + parseInt(oneTime[2]) + parseInt(oneTime[3]) / ((oneTime[3] + '').length === 2 ? 100 : 1000);\n lrc.push([lrcTime, lrcText]);\n }\n }\n }\n // sort by time\n lrc.sort((a, b) => a[0] - b[0]);\n lrcs.push(lrc);\n }\n return lrcs;\n };\n\n /**\n * Update progress bar, including loading progress bar and play progress bar\n *\n * @param {String} type - Point out which bar it is, should be played loaded or volume\n * @param {Number} percentage\n * @param {String} direction - Point out the direction of this bar, Should be height or width\n */\n this.updateBar = (type, percentage, direction) => {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this[type + 'Bar'].style[direction] = percentage * 100 + '%';\n };\n\n /**\n * Update lrc\n *\n * @param {Number} currentTime\n */\n this.updateLrc = (currentTime = this.audio.currentTime) => {\n if (this.lrcIndex > this.lrc.length - 1 || currentTime < this.lrc[this.lrcIndex][0] || (!this.lrc[this.lrcIndex + 1] || currentTime >= this.lrc[this.lrcIndex + 1][0])) {\n for (let i = 0; i < this.lrc.length; i++) {\n if (currentTime >= this.lrc[i][0] && (!this.lrc[i + 1] || currentTime < this.lrc[i + 1][0])) {\n this.lrcIndex = i;\n this.lrcContents.style.transform = `translateY(${-this.lrcIndex * 20}px)`;\n this.lrcContents.style.webkitTransform = `translateY(${-this.lrcIndex * 20}px)`;\n this.lrcContents.getElementsByClassName('aplayer-lrc-current')[0].classList.remove('aplayer-lrc-current');\n this.lrcContents.getElementsByTagName('p')[i].classList.add('aplayer-lrc-current');\n }\n }\n }\n };\n\n // define APlayer events\n this.eventTypes = ['play', 'pause', 'canplay', 'playing', 'ended', 'error'];\n this.event = {};\n for (let type of this.eventTypes) {\n this.event[type] = [];\n }\n this.trigger = (type) => {\n for (let func of this.event[type]) {\n func();\n }\n }\n }\n\n /**\n * AutoLink initialization function\n */\n init() {\n this.element = this.option.element;\n this.multiple = this.playIndex > -1;\n this.music = this.multiple ? this.option.music[this.playIndex] : this.option.music;\n\n let i;\n // parser lrc\n if (this.option.showlrc) {\n let lrcs = [];\n if (this.option.showlrc === 1) {\n if (this.multiple) {\n for (i = 0; i < this.option.music.length; i++) {\n lrcs.push(this.option.music[i].lrc);\n }\n }\n else {\n lrcs.push(this.option.music.lrc);\n }\n }\n else if (this.option.showlrc === 2 || this.option.showlrc === true) {\n for (i = 0; i < this.element.getElementsByClassName('aplayer-lrc-content').length; i++) {\n lrcs.push(this.element.getElementsByClassName('aplayer-lrc-content')[i].innerHTML);\n }\n }\n\n this.lrcs = this.parseLrc(lrcs);\n }\n\n // add class aplayer-withlrc\n if (this.option.showlrc) {\n this.element.classList.add('aplayer-withlrc');\n }\n\n // fill in HTML\n let eleHTML = `\n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n - 00:00 / 00:00\n
\n \n
\n
\n
\n
\n
\n
\n ${(this.multiple ? `` : ``)}\n
\n
\n
`;\n if (this.multiple) {\n eleHTML += `\n
\n
    `;\n for (i = 0; i < this.option.music.length; i++) {\n eleHTML += `\n
  1. \n \n ${(i + 1)}\n ${this.option.music[i].title}\n ${this.option.music[i].author}\n
  2. `\n }\n eleHTML += `\n
\n
`\n }\n this.element.innerHTML = eleHTML;\n\n this.ptime = this.element.getElementsByClassName('aplayer-ptime')[0];\n\n if (this.element.getElementsByClassName('aplayer-info')[0].offsetWidth < 200) {\n this.element.getElementsByClassName('aplayer-time')[0].classList.add('aplayer-time-narrow');\n }\n // fix the width of aplayer bar\n this.element.getElementsByClassName('aplayer-bar-wrap')[0].style.marginRight = this.element.getElementsByClassName('aplayer-time')[0].offsetWidth + 5 + 'px';\n\n // switch to narrow style\n if (this.option.narrow) {\n this.element.classList.add('aplayer-narrow');\n }\n\n // play and pause button\n this.button = this.element.getElementsByClassName('aplayer-button')[0];\n this.button.addEventListener('click', (e) => {\n if (this.button.classList.contains('aplayer-play')) {\n this.play();\n }\n else if (this.button.classList.contains('aplayer-pause')) {\n this.pause();\n }\n });\n\n // click music list: change music\n if (this.multiple) {\n const listItem = this.element.getElementsByClassName('aplayer-list')[0].getElementsByTagName('li');\n for (let i = 0; i < this.option.music.length; i++) {\n listItem[i].addEventListener('click', () => {\n const musicIndex = parseInt(listItem[i].getElementsByClassName('aplayer-list-index')[0].innerHTML) - 1;\n if (musicIndex !== this.playIndex) {\n this.setMusic(musicIndex);\n }\n this.play();\n });\n }\n }\n\n // control play progress\n this.playedBar = this.element.getElementsByClassName('aplayer-played')[0];\n this.loadedBar = this.element.getElementsByClassName('aplayer-loaded')[0];\n this.thumb = this.element.getElementsByClassName('aplayer-thumb')[0];\n this.bar = this.element.getElementsByClassName('aplayer-bar')[0];\n let barWidth;\n this.bar.addEventListener('click', (event) => {\n const e = event || window.event;\n barWidth = this.bar.clientWidth;\n const percentage = (e.clientX - getElementViewLeft(this.bar)) / barWidth;\n this.updateBar('played', percentage, 'width');\n this.element.getElementsByClassName('aplayer-ptime')[0].innerHTML = this.secondToTime(percentage * this.audio.duration);\n this.audio.currentTime = parseFloat(this.playedBar.style.width) / 100 * this.audio.duration;\n });\n\n this.thumb.addEventListener('mouseover', () => {\n this.thumb.style.background = this.option.theme;\n });\n this.thumb.addEventListener('mouseout', () => {\n this.thumb.style.background = '#fff';\n });\n\n const thumbMove = (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - getElementViewLeft(this.bar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('played', percentage, 'width');\n if (this.option.showlrc) {\n this.updateLrc(parseFloat(this.playedBar.style.width) / 100 * this.audio.duration);\n }\n this.element.getElementsByClassName('aplayer-ptime')[0].innerHTML = this.secondToTime(percentage * this.audio.duration);\n };\n\n const thumbUp = () => {\n document.removeEventListener('mouseup', thumbUp);\n document.removeEventListener('mousemove', thumbMove);\n this.audio.currentTime = parseFloat(this.playedBar.style.width) / 100 * this.audio.duration;\n this.playedTime = setInterval(() => {\n this.updateBar('played', this.audio.currentTime / this.audio.duration, 'width');\n if (this.option.showlrc) {\n this.updateLrc();\n }\n this.element.getElementsByClassName('aplayer-ptime')[0].innerHTML = this.secondToTime(this.audio.currentTime);\n this.trigger('playing');\n }, 100);\n };\n\n this.thumb.addEventListener('mousedown', () => {\n barWidth = this.bar.clientWidth;\n clearInterval(this.playedTime);\n document.addEventListener('mousemove', thumbMove);\n document.addEventListener('mouseup', thumbUp);\n });\n\n // control volume\n this.volumeBar = this.element.getElementsByClassName('aplayer-volume')[0];\n const volumeBarWrap = this.element.getElementsByClassName('aplayer-volume-bar')[0];\n const volumeicon = this.element.getElementsByClassName('aplayer-time')[0].getElementsByTagName('i')[0];\n const barHeight = 35;\n this.element.getElementsByClassName('aplayer-volume-bar-wrap')[0].addEventListener('click', (event) => {\n const e = event || window.event;\n let percentage = (barHeight - e.clientY + getElementViewTop(volumeBarWrap)) / barHeight;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('volume', percentage, 'height');\n this.audio.volume = percentage;\n if (this.audio.muted) {\n this.audio.muted = false;\n }\n if (percentage === 1) {\n volumeicon.className = 'demo-icon aplayer-icon-volume-up';\n }\n else {\n volumeicon.className = 'demo-icon aplayer-icon-volume-down';\n }\n });\n volumeicon.addEventListener('click', () => {\n if (this.audio.muted) {\n this.audio.muted = false;\n volumeicon.className = this.audio.volume === 1 ? 'demo-icon aplayer-icon-volume-up' : 'demo-icon aplayer-icon-volume-down';\n this.updateBar('volume', this.audio.volume, 'height');\n }\n else {\n this.audio.muted = true;\n volumeicon.className = 'demo-icon aplayer-icon-volume-off';\n this.updateBar('volume', 0, 'height');\n }\n });\n\n // get element's view position\n function getElementViewLeft(element) {\n let actualLeft = element.offsetLeft;\n let current = element.offsetParent;\n let elementScrollLeft;\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n elementScrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;\n return actualLeft - elementScrollLeft;\n }\n\n function getElementViewTop(element) {\n let actualTop = element.offsetTop;\n let current = element.offsetParent;\n let elementScrollTop;\n while (current !== null) {\n actualTop += current.offsetTop;\n current = current.offsetParent;\n }\n elementScrollTop = document.body.scrollTop + document.documentElement.scrollTop;\n return actualTop - elementScrollTop;\n }\n\n // loop control\n const loopEle = this.element.getElementsByClassName('aplayer-icon-loop')[0];\n loopEle.addEventListener('click', () => {\n if (this.loop) {\n loopEle.classList.add('aplayer-noloop');\n this.loop = false;\n this.audio.loop = this.multiple ? false : this.loop;\n }\n else {\n loopEle.classList.remove('aplayer-noloop');\n this.loop = true;\n this.audio.loop = this.multiple ? false : this.loop;\n }\n });\n\n // toggle menu control\n if (this.multiple) {\n this.element.getElementsByClassName('aplayer-icon-menu')[0].addEventListener('click', () => {\n const list = this.element.getElementsByClassName('aplayer-list')[0];\n if (!list.classList.contains('aplayer-list-hide')) {\n list.classList.add('aplayer-list-hide');\n }\n else {\n list.classList.remove('aplayer-list-hide');\n }\n });\n }\n\n this.setMusic(0);\n\n instances.push(this);\n }\n\n /**\n * Set music\n */\n setMusic(index) {\n // get this.music\n if (this.multiple && typeof(index) !== 'undefined') {\n this.playIndex = index;\n }\n const indexMusic = this.playIndex;\n this.music = this.multiple ? this.option.music[indexMusic] : this.option.music;\n\n // set html\n if (this.music.pic) {\n this.element.getElementsByClassName('aplayer-pic')[0].style.backgroundImage = `url(${encodeURI(this.music.pic)})`;\n }\n this.element.getElementsByClassName('aplayer-title')[0].innerHTML = this.music.title;\n this.element.getElementsByClassName('aplayer-author')[0].innerHTML = ` - ${this.music.author}`;\n if (this.multiple) {\n if (this.element.getElementsByClassName('aplayer-list-light')[0]) {\n this.element.getElementsByClassName('aplayer-list-light')[0].classList.remove('aplayer-list-light');\n }\n this.element.getElementsByClassName('aplayer-list')[0].getElementsByTagName('li')[indexMusic].classList.add('aplayer-list-light');\n }\n\n // set the previous audio object\n if (this.audio) {\n this.pause();\n this.audio.currentTime = 0;\n }\n\n // get this audio object\n if ((this.multiple && !this.audios[indexMusic]) || this.playIndex === -1) {\n this.audio = document.createElement(\"audio\");\n this.audio.src = this.music.url;\n this.audio.preload = this.isMobile ? 'none' : 'metadata';\n\n // show audio time: the metadata has loaded or changed\n this.audio.addEventListener('durationchange', () => {\n if (this.audio.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('aplayer-dtime')[0].innerHTML = this.secondToTime(this.audio.duration);\n }\n });\n\n // show audio loaded bar: to inform interested parties of progress downloading the media\n this.audio.addEventListener('progress', () => {\n const percentage = this.audio.buffered.length ? this.audio.buffered.end(this.audio.buffered.length - 1) / this.audio.duration : 0;\n this.updateBar('loaded', percentage, 'width');\n });\n\n // audio download error: an error occurs\n this.audio.addEventListener('error', () => {\n this.element.getElementsByClassName('aplayer-author')[0].innerHTML = ` - Error happens ╥﹏╥`;\n this.trigger('pause');\n });\n\n // audio can play: enough data is available that the media can be played\n this.audio.addEventListener('canplay', () => {\n this.trigger('canplay');\n });\n\n // multiple music play\n this.ended = false;\n if (this.multiple) {\n this.audio.addEventListener('ended', () => {\n if (this.playIndex < this.option.music.length - 1) {\n this.setMusic(++this.playIndex);\n }\n else if (this.loop) {\n this.setMusic(0);\n }\n else if (!this.loop) {\n this.ended = true;\n this.pause();\n this.trigger('ended');\n }\n });\n }\n else {\n this.audio.addEventListener('ended', () => {\n if (!this.loop) {\n this.ended = true;\n this.pause();\n this.trigger('ended');\n }\n });\n }\n\n // control volume\n this.audio.volume = parseInt(this.element.getElementsByClassName('aplayer-volume')[0].style.height) / 100;\n\n // loop\n this.audio.loop = this.multiple ? false : this.loop;\n\n if (this.multiple) {\n this.audios[indexMusic] = this.audio;\n }\n }\n else {\n this.audio = this.audios[indexMusic];\n this.audio.volume = parseInt(this.element.getElementsByClassName('aplayer-volume')[0].style.height) / 100;\n this.audio.currentTime = 0;\n }\n\n // fill in lrc\n if (this.option.showlrc) {\n this.lrc = this.multiple ? this.lrcs[indexMusic] : this.lrcs[0];\n let lrcHTML = '';\n this.lrcContents = this.element.getElementsByClassName('aplayer-lrc-contents')[0];\n for (let i = 0; i < this.lrc.length; i++) {\n lrcHTML += `

${this.lrc[i][1]}

`;\n }\n this.lrcContents.innerHTML = lrcHTML;\n if (!this.lrcIndex) {\n this.lrcIndex = 0;\n }\n this.lrcContents.getElementsByTagName('p')[0].classList.add('aplayer-lrc-current');\n this.lrcContents.style.transform = 'translateY(0px)';\n this.lrcContents.style.webkitTransform = 'translateY(0px)';\n }\n\n // set duration time\n if (this.audio.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('aplayer-dtime')[0].innerHTML = this.audio.duration ? this.secondToTime(this.audio.duration) : '00:00';\n }\n\n // autoplay\n if (this.option.autoplay && !this.isMobile) {\n this.play();\n }\n this.option.autoplay = true; // autoplay next music\n\n if (this.isMobile) {\n this.pause();\n }\n }\n\n /**\n * Play music\n */\n play() {\n if (this.audio.paused) {\n this.button.classList.remove('aplayer-play');\n this.button.classList.add('aplayer-pause');\n this.button.innerHTML = '';\n setTimeout(() => {\n this.button.innerHTML = '';\n }, 100);\n\n // pause other players (Thanks @Aprikyblue)\n if (this.option.mutex) {\n for (let i = 0; i < instances.length; i++) {\n if (this != instances[i]) {\n instances[i].pause();\n }\n }\n }\n this.audio.play();\n if (this.playedTime) {\n clearInterval(this.playedTime);\n }\n this.playedTime = setInterval(() => {\n this.updateBar('played', this.audio.currentTime / this.audio.duration, 'width');\n if (this.option.showlrc) {\n this.updateLrc();\n }\n this.ptime.innerHTML = this.secondToTime(this.audio.currentTime);\n this.trigger('playing');\n }, 100);\n this.trigger('play');\n }\n }\n\n /**\n * Pause music\n */\n pause() {\n if (!this.audio.paused || this.ended) {\n this.ended = false;\n this.button.classList.remove('aplayer-pause');\n this.button.classList.add('aplayer-play');\n this.button.innerHTML = '';\n setTimeout(() => {\n this.button.innerHTML = '';\n }, 100);\n this.audio.pause();\n clearInterval(this.playedTime);\n this.trigger('pause');\n }\n }\n\n /**\n * attach event\n */\n on(name, func) {\n if (typeof func === 'function') {\n this.event[name].push(func);\n }\n }\n }\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = APlayer\n }\n else {\n window.APlayer = APlayer;\n }\n})([]);"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["APlayer.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","instances","APlayer","option","_this","this","isMobile","navigator","userAgent","match","autoplay","defaultOption","element","document","getElementsByClassName","narrow","mutex","showlrc","theme","loop","defaultKey","hasOwnProperty","playIndex","toString","call","music","audios","secondToTime","second","add0","num","min","parseInt","sec","parseLrc","arr","lrcs","k","lyric","split","lrc","lyricLen","lrcTimes","lrcText","replace","timeLen","j","oneTime","exec","lrcTime","push","sort","a","b","updateBar","type","percentage","direction","style","updateLrc","currentTime","arguments","undefined","audio","lrcIndex","lrcContents","transform","webkitTransform","classList","remove","getElementsByTagName","add","eventTypes","event","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","value","err","trigger","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","func","getElementViewLeft","actualLeft","offsetLeft","current","offsetParent","elementScrollLeft","body","scrollLeft","documentElement","getElementViewTop","actualTop","offsetTop","elementScrollTop","scrollTop","_this2","multiple","innerHTML","eleHTML","pic","encodeURI","title","author","ptime","offsetWidth","marginRight","button","addEventListener","e","contains","play","pause","listItem","_loop","_i","musicIndex","setMusic","playedBar","loadedBar","thumb","bar","barWidth","window","clientWidth","clientX","duration","parseFloat","width","background","thumbMove","thumbUp","removeEventListener","playedTime","setInterval","clearInterval","volumeBar","volumeBarWrap","volumeicon","barHeight","clientY","volume","muted","className","loopEle","list","index","_this3","indexMusic","backgroundImage","createElement","src","url","preload","buffered","end","ended","height","lrcHTML","_this4","paused","setTimeout","_this5","name","module","exports"],"mappings":"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","file":"APlayer.min.js","sourcesContent":["(() => {\n let instances = [];\n\n class APlayer {\n /**\n * APlayer constructor function\n *\n * @param {Object} option - See README\n * @constructor\n */\n constructor(option) {\n\n this.isMobile = navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(android)|(webOS)/i);\n // compatibility: some mobile browsers don't suppose autoplay\n if (this.isMobile) {\n option.autoplay = false;\n }\n\n // default options\n const defaultOption = {\n element: document.getElementsByClassName('aplayer')[0],\n narrow: false,\n autoplay: false,\n mutex: true,\n showlrc: 0,\n theme: '#b7daff',\n loop: true\n };\n for (let defaultKey in defaultOption) {\n if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {\n option[defaultKey] = defaultOption[defaultKey];\n }\n }\n\n // multiple music\n this.playIndex = Object.prototype.toString.call(option.music) === '[object Array]' ? 0 : -1;\n\n this.option = option;\n this.audios = [];\n this.loop = option.loop;\n\n /**\n * Parse second to 00:00 format\n *\n * @param {Number} second\n * @return {String} 00:00 format\n */\n this.secondToTime = (second) => {\n const add0 = (num) => {\n return num < 10 ? '0' + num : '' + num;\n };\n const min = parseInt(second / 60);\n const sec = parseInt(second - min * 60);\n return add0(min) + ':' + add0(sec);\n };\n\n /**\n * Parse lrc, suppose multiple time tag\n *\n * @param {Array} arr - Format:\n * [mm:ss.xx]lyric\n * [mm:ss.xxx]lyric\n * [mm:ss.xx][mm:ss.xx][mm:ss.xx]lyric\n *\n * @return {Array} [[[time, text], [time, text], [time, text], ...], [[time, text], [time, text], [time, text], ...], ...]\n */\n this.parseLrc = (arr) => {\n let lrcs = [];\n for (let k = 0; k < arr.length; k++) {\n const lyric = arr[k].split('\\n');\n let lrc = [];\n const lyricLen = lyric.length;\n for (let i = 0; i < lyricLen; i++) {\n // match lrc time\n const lrcTimes = lyric[i].match(/\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/g);\n // match lrc text\n const lrcText = lyric[i].replace(/\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/g, '').replace(/^\\s+|\\s+$/g, '');\n\n if (lrcTimes != null) {\n // handle multiple time tag\n const timeLen = lrcTimes.length;\n for (let j = 0; j < timeLen; j++) {\n const oneTime = /\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/.exec(lrcTimes[j]);\n const lrcTime = (oneTime[1]) * 60 + parseInt(oneTime[2]) + parseInt(oneTime[3]) / ((oneTime[3] + '').length === 2 ? 100 : 1000);\n lrc.push([lrcTime, lrcText]);\n }\n }\n }\n // sort by time\n lrc.sort((a, b) => a[0] - b[0]);\n lrcs.push(lrc);\n }\n return lrcs;\n };\n\n /**\n * Update progress bar, including loading progress bar and play progress bar\n *\n * @param {String} type - Point out which bar it is, should be played loaded or volume\n * @param {Number} percentage\n * @param {String} direction - Point out the direction of this bar, Should be height or width\n */\n this.updateBar = (type, percentage, direction) => {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this[type + 'Bar'].style[direction] = percentage * 100 + '%';\n };\n\n /**\n * Update lrc\n *\n * @param {Number} currentTime\n */\n this.updateLrc = (currentTime = this.audio.currentTime) => {\n if (this.lrcIndex > this.lrc.length - 1 || currentTime < this.lrc[this.lrcIndex][0] || (!this.lrc[this.lrcIndex + 1] || currentTime >= this.lrc[this.lrcIndex + 1][0])) {\n for (let i = 0; i < this.lrc.length; i++) {\n if (currentTime >= this.lrc[i][0] && (!this.lrc[i + 1] || currentTime < this.lrc[i + 1][0])) {\n this.lrcIndex = i;\n this.lrcContents.style.transform = `translateY(${-this.lrcIndex * 20}px)`;\n this.lrcContents.style.webkitTransform = `translateY(${-this.lrcIndex * 20}px)`;\n this.lrcContents.getElementsByClassName('aplayer-lrc-current')[0].classList.remove('aplayer-lrc-current');\n this.lrcContents.getElementsByTagName('p')[i].classList.add('aplayer-lrc-current');\n }\n }\n }\n };\n\n // define APlayer events\n this.eventTypes = ['play', 'pause', 'canplay', 'playing', 'ended', 'error'];\n this.event = {};\n for (let type of this.eventTypes) {\n this.event[type] = [];\n }\n this.trigger = (type) => {\n for (let func of this.event[type]) {\n func();\n }\n }\n }\n\n /**\n * AutoLink initialization function\n */\n init() {\n this.element = this.option.element;\n this.multiple = this.playIndex > -1;\n this.music = this.multiple ? this.option.music[this.playIndex] : this.option.music;\n\n let i;\n // parser lrc\n if (this.option.showlrc) {\n let lrcs = [];\n if (this.option.showlrc === 1) {\n if (this.multiple) {\n for (i = 0; i < this.option.music.length; i++) {\n lrcs.push(this.option.music[i].lrc);\n }\n }\n else {\n lrcs.push(this.option.music.lrc);\n }\n }\n else if (this.option.showlrc === 2 || this.option.showlrc === true) {\n for (i = 0; i < this.element.getElementsByClassName('aplayer-lrc-content').length; i++) {\n lrcs.push(this.element.getElementsByClassName('aplayer-lrc-content')[i].innerHTML);\n }\n }\n\n this.lrcs = this.parseLrc(lrcs);\n }\n\n // add class aplayer-withlrc\n if (this.option.showlrc) {\n this.element.classList.add('aplayer-withlrc');\n }\n\n // fill in HTML\n let eleHTML = `\n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n - 00:00 / 00:00\n
\n \n
\n
\n
\n
\n
\n
\n ${(this.multiple ? `` : ``)}\n
\n
\n
`;\n if (this.multiple) {\n eleHTML += `\n
\n
    `;\n for (i = 0; i < this.option.music.length; i++) {\n eleHTML += `\n
  1. \n \n ${(i + 1)}\n ${this.option.music[i].title}\n ${this.option.music[i].author}\n
  2. `\n }\n eleHTML += `\n
\n
`\n }\n this.element.innerHTML = eleHTML;\n\n this.ptime = this.element.getElementsByClassName('aplayer-ptime')[0];\n\n if (this.element.getElementsByClassName('aplayer-info')[0].offsetWidth < 200) {\n this.element.getElementsByClassName('aplayer-time')[0].classList.add('aplayer-time-narrow');\n }\n // fix the width of aplayer bar\n this.element.getElementsByClassName('aplayer-bar-wrap')[0].style.marginRight = this.element.getElementsByClassName('aplayer-time')[0].offsetWidth + 5 + 'px';\n\n // switch to narrow style\n if (this.option.narrow) {\n this.element.classList.add('aplayer-narrow');\n }\n\n // play and pause button\n this.button = this.element.getElementsByClassName('aplayer-button')[0];\n this.button.addEventListener('click', (e) => {\n if (this.button.classList.contains('aplayer-play')) {\n this.play();\n }\n else if (this.button.classList.contains('aplayer-pause')) {\n this.pause();\n }\n });\n\n // click music list: change music\n if (this.multiple) {\n const listItem = this.element.getElementsByClassName('aplayer-list')[0].getElementsByTagName('li');\n for (let i = 0; i < this.option.music.length; i++) {\n listItem[i].addEventListener('click', () => {\n const musicIndex = parseInt(listItem[i].getElementsByClassName('aplayer-list-index')[0].innerHTML) - 1;\n if (musicIndex !== this.playIndex) {\n this.setMusic(musicIndex);\n }\n this.play();\n });\n }\n }\n\n // control play progress\n this.playedBar = this.element.getElementsByClassName('aplayer-played')[0];\n this.loadedBar = this.element.getElementsByClassName('aplayer-loaded')[0];\n this.thumb = this.element.getElementsByClassName('aplayer-thumb')[0];\n this.bar = this.element.getElementsByClassName('aplayer-bar')[0];\n let barWidth;\n this.bar.addEventListener('click', (event) => {\n const e = event || window.event;\n barWidth = this.bar.clientWidth;\n const percentage = (e.clientX - getElementViewLeft(this.bar)) / barWidth;\n this.updateBar('played', percentage, 'width');\n this.element.getElementsByClassName('aplayer-ptime')[0].innerHTML = this.secondToTime(percentage * this.audio.duration);\n this.audio.currentTime = parseFloat(this.playedBar.style.width) / 100 * this.audio.duration;\n });\n\n this.thumb.addEventListener('mouseover', () => {\n this.thumb.style.background = this.option.theme;\n });\n this.thumb.addEventListener('mouseout', () => {\n this.thumb.style.background = '#fff';\n });\n\n const thumbMove = (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - getElementViewLeft(this.bar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('played', percentage, 'width');\n if (this.option.showlrc) {\n this.updateLrc(parseFloat(this.playedBar.style.width) / 100 * this.audio.duration);\n }\n this.element.getElementsByClassName('aplayer-ptime')[0].innerHTML = this.secondToTime(percentage * this.audio.duration);\n };\n\n const thumbUp = () => {\n document.removeEventListener('mouseup', thumbUp);\n document.removeEventListener('mousemove', thumbMove);\n this.audio.currentTime = parseFloat(this.playedBar.style.width) / 100 * this.audio.duration;\n this.playedTime = setInterval(() => {\n this.updateBar('played', this.audio.currentTime / this.audio.duration, 'width');\n if (this.option.showlrc) {\n this.updateLrc();\n }\n this.element.getElementsByClassName('aplayer-ptime')[0].innerHTML = this.secondToTime(this.audio.currentTime);\n this.trigger('playing');\n }, 100);\n };\n\n this.thumb.addEventListener('mousedown', () => {\n barWidth = this.bar.clientWidth;\n clearInterval(this.playedTime);\n document.addEventListener('mousemove', thumbMove);\n document.addEventListener('mouseup', thumbUp);\n });\n\n // control volume\n this.volumeBar = this.element.getElementsByClassName('aplayer-volume')[0];\n const volumeBarWrap = this.element.getElementsByClassName('aplayer-volume-bar')[0];\n const volumeicon = this.element.getElementsByClassName('aplayer-time')[0].getElementsByTagName('i')[0];\n const barHeight = 35;\n this.element.getElementsByClassName('aplayer-volume-bar-wrap')[0].addEventListener('click', (event) => {\n const e = event || window.event;\n let percentage = (barHeight - e.clientY + getElementViewTop(volumeBarWrap)) / barHeight;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('volume', percentage, 'height');\n this.audio.volume = percentage;\n if (this.audio.muted) {\n this.audio.muted = false;\n }\n if (percentage === 1) {\n volumeicon.className = 'demo-icon aplayer-icon-volume-up';\n }\n else {\n volumeicon.className = 'demo-icon aplayer-icon-volume-down';\n }\n });\n volumeicon.addEventListener('click', () => {\n if (this.audio.muted) {\n this.audio.muted = false;\n volumeicon.className = this.audio.volume === 1 ? 'demo-icon aplayer-icon-volume-up' : 'demo-icon aplayer-icon-volume-down';\n this.updateBar('volume', this.audio.volume, 'height');\n }\n else {\n this.audio.muted = true;\n volumeicon.className = 'demo-icon aplayer-icon-volume-off';\n this.updateBar('volume', 0, 'height');\n }\n });\n\n // get element's view position\n function getElementViewLeft(element) {\n let actualLeft = element.offsetLeft;\n let current = element.offsetParent;\n let elementScrollLeft;\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n elementScrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;\n return actualLeft - elementScrollLeft;\n }\n\n function getElementViewTop(element) {\n let actualTop = element.offsetTop;\n let current = element.offsetParent;\n let elementScrollTop;\n while (current !== null) {\n actualTop += current.offsetTop;\n current = current.offsetParent;\n }\n elementScrollTop = document.body.scrollTop + document.documentElement.scrollTop;\n return actualTop - elementScrollTop;\n }\n\n // loop control\n const loopEle = this.element.getElementsByClassName('aplayer-icon-loop')[0];\n loopEle.addEventListener('click', () => {\n if (this.loop) {\n loopEle.classList.add('aplayer-noloop');\n this.loop = false;\n this.audio.loop = this.multiple ? false : this.loop;\n }\n else {\n loopEle.classList.remove('aplayer-noloop');\n this.loop = true;\n this.audio.loop = this.multiple ? false : this.loop;\n }\n });\n\n // toggle menu control\n if (this.multiple) {\n this.element.getElementsByClassName('aplayer-icon-menu')[0].addEventListener('click', () => {\n const list = this.element.getElementsByClassName('aplayer-list')[0];\n if (!list.classList.contains('aplayer-list-hide')) {\n list.classList.add('aplayer-list-hide');\n }\n else {\n list.classList.remove('aplayer-list-hide');\n }\n });\n }\n\n this.setMusic(0);\n\n instances.push(this);\n }\n\n /**\n * Set music\n */\n setMusic(index) {\n // get this.music\n if (this.multiple && typeof(index) !== 'undefined') {\n this.playIndex = index;\n }\n const indexMusic = this.playIndex;\n this.music = this.multiple ? this.option.music[indexMusic] : this.option.music;\n\n // set html\n if (this.music.pic) {\n this.element.getElementsByClassName('aplayer-pic')[0].style.backgroundImage = `url(${encodeURI(this.music.pic)})`;\n }\n this.element.getElementsByClassName('aplayer-title')[0].innerHTML = this.music.title;\n this.element.getElementsByClassName('aplayer-author')[0].innerHTML = ` - ${this.music.author}`;\n if (this.multiple) {\n if (this.element.getElementsByClassName('aplayer-list-light')[0]) {\n this.element.getElementsByClassName('aplayer-list-light')[0].classList.remove('aplayer-list-light');\n }\n this.element.getElementsByClassName('aplayer-list')[0].getElementsByTagName('li')[indexMusic].classList.add('aplayer-list-light');\n }\n\n // set the previous audio object\n if (this.audio) {\n this.pause();\n this.audio.currentTime = 0;\n }\n\n // get this audio object\n if ((this.multiple && !this.audios[indexMusic]) || this.playIndex === -1) {\n this.audio = document.createElement(\"audio\");\n this.audio.src = this.music.url;\n this.audio.preload = this.isMobile ? 'none' : 'metadata';\n\n // show audio time: the metadata has loaded or changed\n this.audio.addEventListener('durationchange', () => {\n if (this.audio.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('aplayer-dtime')[0].innerHTML = this.secondToTime(this.audio.duration);\n }\n });\n\n // show audio loaded bar: to inform interested parties of progress downloading the media\n this.audio.addEventListener('progress', () => {\n const percentage = this.audio.buffered.length ? this.audio.buffered.end(this.audio.buffered.length - 1) / this.audio.duration : 0;\n this.updateBar('loaded', percentage, 'width');\n });\n\n // audio download error: an error occurs\n this.audio.addEventListener('error', () => {\n this.element.getElementsByClassName('aplayer-author')[0].innerHTML = ` - Error happens ╥﹏╥`;\n this.trigger('pause');\n });\n\n // audio can play: enough data is available that the media can be played\n this.audio.addEventListener('canplay', () => {\n this.trigger('canplay');\n });\n\n // multiple music play\n this.ended = false;\n if (this.multiple) {\n this.audio.addEventListener('ended', () => {\n if (this.playIndex < this.option.music.length - 1) {\n this.setMusic(++this.playIndex);\n }\n else if (this.loop) {\n this.setMusic(0);\n }\n else if (!this.loop) {\n this.ended = true;\n this.pause();\n this.trigger('ended');\n }\n });\n }\n else {\n this.audio.addEventListener('ended', () => {\n if (!this.loop) {\n this.ended = true;\n this.pause();\n this.trigger('ended');\n }\n });\n }\n\n // control volume\n this.audio.volume = parseInt(this.element.getElementsByClassName('aplayer-volume')[0].style.height) / 100;\n\n // loop\n this.audio.loop = this.multiple ? false : this.loop;\n\n if (this.multiple) {\n this.audios[indexMusic] = this.audio;\n }\n }\n else {\n this.audio = this.audios[indexMusic];\n this.audio.volume = parseInt(this.element.getElementsByClassName('aplayer-volume')[0].style.height) / 100;\n this.audio.currentTime = 0;\n }\n\n // fill in lrc\n if (this.option.showlrc) {\n this.lrc = this.multiple ? this.lrcs[indexMusic] : this.lrcs[0];\n let lrcHTML = '';\n this.lrcContents = this.element.getElementsByClassName('aplayer-lrc-contents')[0];\n for (let i = 0; i < this.lrc.length; i++) {\n lrcHTML += `

${this.lrc[i][1]}

`;\n }\n this.lrcContents.innerHTML = lrcHTML;\n if (!this.lrcIndex) {\n this.lrcIndex = 0;\n }\n this.lrcContents.getElementsByTagName('p')[0].classList.add('aplayer-lrc-current');\n this.lrcContents.style.transform = 'translateY(0px)';\n this.lrcContents.style.webkitTransform = 'translateY(0px)';\n }\n\n // set duration time\n if (this.audio.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('aplayer-dtime')[0].innerHTML = this.audio.duration ? this.secondToTime(this.audio.duration) : '00:00';\n }\n\n // autoplay\n if (this.option.autoplay && !this.isMobile) {\n this.play();\n }\n this.option.autoplay = true; // autoplay next music\n\n if (this.isMobile) {\n this.pause();\n }\n }\n\n /**\n * Play music\n */\n play() {\n if (this.audio.paused) {\n this.button.classList.remove('aplayer-play');\n this.button.classList.add('aplayer-pause');\n this.button.innerHTML = '';\n setTimeout(() => {\n this.button.innerHTML = '';\n }, 100);\n\n // pause other players (Thanks @Aprikyblue)\n if (this.option.mutex) {\n for (let i = 0; i < instances.length; i++) {\n if (this != instances[i]) {\n instances[i].pause();\n }\n }\n }\n this.audio.play();\n if (this.playedTime) {\n clearInterval(this.playedTime);\n }\n this.playedTime = setInterval(() => {\n this.updateBar('played', this.audio.currentTime / this.audio.duration, 'width');\n if (this.option.showlrc) {\n this.updateLrc();\n }\n this.ptime.innerHTML = this.secondToTime(this.audio.currentTime);\n this.trigger('playing');\n }, 100);\n this.trigger('play');\n }\n }\n\n /**\n * Pause music\n */\n pause() {\n if (!this.audio.paused || this.ended) {\n this.ended = false;\n this.button.classList.remove('aplayer-pause');\n this.button.classList.add('aplayer-play');\n this.button.innerHTML = '';\n setTimeout(() => {\n this.button.innerHTML = '';\n }, 100);\n this.audio.pause();\n clearInterval(this.playedTime);\n this.trigger('pause');\n }\n }\n\n /**\n * attach event\n */\n on(name, func) {\n if (typeof func === 'function') {\n this.event[name].push(func);\n }\n }\n }\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = APlayer\n }\n else {\n window.APlayer = APlayer;\n }\n})();"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/src/APlayer.js b/src/APlayer.js index 68c7543..ee2f17b 100644 --- a/src/APlayer.js +++ b/src/APlayer.js @@ -1,4 +1,5 @@ -((instances) => { +(() => { + let instances = []; class APlayer { /** @@ -622,4 +623,4 @@ else { window.APlayer = APlayer; } -})([]); \ No newline at end of file +})(); \ No newline at end of file