diff --git a/bellsauce.js b/bellsauce.js new file mode 100644 index 0000000..cc7ef6c --- /dev/null +++ b/bellsauce.js @@ -0,0 +1 @@ +(()=>{"use strict";const e=new class{Log(...e){console.log("Bellows |",...e)}LogDebug(...e){console.debug("Bellows DBG |",...e)}LogError(...e){console.error("Bellows ERR |",...e)}};class t{constructor(){this.playersMap=new Map}static async initializeApi(){if(t.instance)throw new Error("Cannot initialize YoutubeIframeApi more than once!");return new Promise((i=>{var a;if(window.onYouTubeIframeAPIReady=function(){t.instance=new t,e.LogDebug("YoutubeIframeApi successfully initialized"),i()},!$("#yt-api-script").length){const t=document.createElement("script");t.id="yt-api-script",t.src="https://www.youtube.com/iframe_api",t.type="text/javascript";const i=document.getElementsByTagName("script")[0];null===(a=i.parentNode)||void 0===a||a.insertBefore(t,i),e.LogDebug("Downloading YoutubeIframeApi...")}}))}static getInstance(){if(!t.instance)throw new Error("Tried to get YoutubeIframeApi before initialization!");return this.instance}getPlayer(e,t){const i=this.getIdString(e,t);return this.playersMap.get(i)}async createPlayer(e,t){const i=this.getIdString(e,t);if(this.playersMap.has(i))throw new Error("Player already exists for this audio container!");return new Promise(((e,a)=>{const s=function(e){let t;switch(e.data){case 2:t="Invalid videoId value.";break;case 5:t="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:t="Video not found; It may have been deleted or marked as private.";break;case 101:case 150:t="Embedding is not supported for this video.";break;default:t="Unspecified Error"}a(t)};$("body").append(`
`);const r=new YT.Player(i,{height:"270px",width:"480px",videoId:t,playerVars:{loop:1,playlist:t},events:{onReady:function(){this.playersMap.set(i,r),r.removeEventListener("onError",s),e(r)}.bind(this),onError:s.bind(this)}})}))}async createPlaylistPlayer(e,t){const i=this.getIdString(e,t);if(this.playersMap.has(i))throw new Error("Player already exists for this audio container!");return new Promise(((e,a)=>{const s=function(e){let t;switch(e.data){case 2:t="Invalid videoId value.";break;case 5:t="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:t="Video not found; It may have been deleted or marked as private.";break;case 101:case 150:t="Embedding is not supported for this video.";break;default:t="Unspecified Error"}a(t)};$("body").append(``);const r=new YT.Player(i,{height:"270px",width:"480px",playerVars:{listType:"playlist",list:t},events:{onReady:function(){this.playersMap.set(i,r),r.removeEventListener("onError",s),e(r)}.bind(this),onError:s.bind(this)}})}))}async destroyPlayer(e,t){const i=this.getIdString(e,t),a=this.playersMap.get(i);if(!a)throw new Error("Player does not exist!");1===a.getPlayerState()&&a.stopVideo(),this.playersMap.delete(i),a.destroy(),$(`div#${i}`).remove()}getIdString(e,t){return`bellows-yt-iframe-${e}-${t}`}}var i;!function(e){e[void 0]="",e.youtube="youtube"}(i||(i={}));class a{extractPlaylistKey(e){if(!e||0===e.length)return;const t=/list=([a-zA-Z0-9_-]+)/.exec(e);return t?t[1]:e.match(/^[a-zA-Z0-9_-]+$/)[0]}async getPlaylistInfo(e){if(!e)throw new Error("Empty playlist key");const i=t.getInstance();this._player=await i.createPlaylistPlayer(-1,e);try{return await this.scrapeVideoNames()}finally{i.destroyPlayer(-1,e),this._player=void 0}}async createFoundryVTTPlaylist(e,t,a){if(!e||"[object String]"!==Object.prototype.toString.call(e))throw new Error("Enter playlist name");const s=await Playlist.create({name:e,shuffle:!1}),r=AudioHelper.inputToVolume(a),o=[];for(let e=0;e