diff --git a/assets/js/embed.js b/assets/js/embed.js index d058e323..9b47ff2a 100644 --- a/assets/js/embed.js +++ b/assets/js/embed.js @@ -63,116 +63,117 @@ addEventListener('load', function (e) { } }); -function return_message(message,target_window){ - if(target_window===undefined){ +function return_message(message, target_window) { + if (target_window === undefined) { target_window = window.parent; } let url_params = new URLSearchParams(location.search); let widgetid = url_params.get('widgetid'); - let additional_info = {from:'invidious_control'}; - if(widgetid!==null){ + let additional_info = { from: 'invidious_control' }; + if (widgetid !== null) { additional_info.widgetid = widgetid; } - if(message.message_kind==='event'&&message.eventname==='timeupdate'||message.eventname==='loadedmetadata'){ - let add_value = {getvolume:player.volume(),getduration:player.duration(),getcurrenttime:player.currentTime(),getplaystatus:player.paused(),getplaybackrate:player.playbackRate(),getloopstatus:player.loop(),getmutestatus:player.muted(),getfullscreenstatus:player.isFullscreen(),getavailableplaybackrates:options.playbackRates,gettitle:player_data.title}; - additional_info['value'] = add_value; + if (message.message_kind === 'event') { + if (message.eventname === 'timeupdate' || message.eventname === 'loadedmetadata') { + additional_info['value'] = { getvolume: player.volume(), getduration: player.duration(), getcurrenttime: player.currentTime(), getplaystatus: player.paused(), getplaybackrate: player.playbackRate(), getloopstatus: player.loop(), getmutestatus: player.muted(), getfullscreenstatus: player.isFullscreen(), getavailableplaybackrates: options.playbackRates, gettitle: player_data.title }; + } } - if(message.eventname==='error'){ - additional_info['value'] = {geterrorcode:player.error().code}; + if (message.eventname === 'error') { + additional_info['value'] = { geterrorcode: player.error().code }; } - message = Object.assign(additional_info,message); + message = Object.assign(additional_info, message); let target_origin = url_params.get('origin') || '*'; - target_window.postMessage(message,target_origin); + target_window.postMessage(message, target_origin); } -function control_embed_iframe(message){ - let url_params = new URLSearchParams(location.search); - let origin = url_params.get('origin'); - if(origin===null||origin===message.origin){ - let widgetid = url_params.get('widgetid'); - if((widgetid===null&&message.data.widgetid===null)||widgetid===message.data.widgetid&&message.data.target==='invidious_control'){ - switch(message.data.eventname){ +function control_embed_iframe(message) { + const url_params = new URLSearchParams(location.search); + const origin = url_params.get('origin'); + const origin_equal = origin === null || origin === message.origin; + if (origin_equal) { + const widgetid = url_params.get('widgetid'); + const widgetid_equal = (widgetid === null && message.data.widgetid === null) || widgetid === message.data.widgetid; + const target_name_equal = message.data.target === 'invidious_control'; + const eventname_string_check = typeof message.data.eventname === 'string'; + if (widgetid_equal && target_name_equal && eventname_string_check) { + let message_return_value; + switch (message.data.eventname) { case 'play': player.play(); break; case 'pause': player.pause(); break; - case 'getvolume': - return_message({command:'getvolume',value:player.volume(),message_kind:'info_return'},message.source); - break; + case 'setvolume': player.volume(message.data.value); break; - case 'getduration': - return_message({command:'getduration',value:player.duration(),message_kind:'info_return'},message.source); - break; - case 'getcurrenttime': - return_message({command:'getcurrenttime',value:player.currentTime(),message_kind:'info_return'},message.source); - break; case 'seek': const duration = player.duration(); let newTime = helpers.clamp(message.data.value, 0, duration); player.currentTime(newTime); break; - case 'getplaystatus': - return_message({command:'getplaystatus',value:player.paused(),message_kind:'info_return'},message.source); - break; - case 'getplaybackrate': - return_message({command:'getplaybackrate',value:player.playbackRate(),message_kind:'info_return'},message.source); - break; case 'setplaybackrate': player.playbackRate(message.data.value); break; - case 'getavailableplaybackrates': - return_message({command:'getavailableplaybackrates',value:options.playbackRates,message_kind:'info_return'},message.source); - break; - case 'getloopstatus': - return_message({command:'getloopstatus',value:player.loop(),message_kind:'info_return'},message.source); - break; case 'setloopstatus': player.loop(message.data.value); break; - case 'getmutestatus': - return_message({command:'getmutestatus',value:player.muted(),message_kind:'info_return'},message.source); - break; - case 'setmutestatus': - player.muted(message.data.value); - break; - case 'gettitle': - return_message({command:'gettitle',value:player_data.title,message_kind:'info_return'},message.source); - break; - case 'getfullscreenstatus': - return_message({command:'getfullscreenstatus',value:player.isFullscreen(),message_kind:'info_return'},message.source); - break; case 'requestfullscreen': player.requestFullscreen(); break; case 'exitfullscreen': player.exitFullscreen(); break; - case 'geterrorcode': - return_message({command:'geterrorcode',value:player.error().code,message_kind:'info_return'},message.source); - break; - case 'getplaylist': + case 'getvolume': + message_return_value = player.volume(); + break; + case 'getduration': + message_return_value = player.duration(); + break; + case 'getcurrenttime': + message_return_value = player.currentTime(); + break; + case 'getplaystatus': + message_return_value = player.paused(); + break; + case 'getplaybackrate': + message_return_value = player.playbackRate(); + break; + case 'getavailableplaybackrates': + message_return_value = options.playbackRates; + break; + case 'getloopstatus': + message_return_value = player.loop(); + break; + case 'getmutestatus': + message_return_value = player.muted(); + break; + case 'gettitle': + message_return_value = player_data.title; + break; + case 'getfullscreenstatus': + message_return_value = player.isFullscreen(); + break; + case 'geterrorcode': + message_return_value = player.error().code; + break; + default: + console.info("Unhandled event name: " + message.data.eventname); + break; + } + if (message_return_value !== undefined) { + return_message({ command: message.data.eventname, value: message_return_value, message_kind: 'info_return' }, message.source); } } } } -if(new URLSearchParams(location.search).get('enablejsapi')==='1'){ - window.addEventListener('message',control_embed_iframe); - player.on('ended',function(){return_message({message_kind:'event',eventname:'ended'})}); - player.on('error',function(){return_message({message_kind:'event',eventname:'error'})}); - player.on('ratechange',function(){return_message({message_kind:'event',eventname:'ratechange'})}); - player.on('volumechange',function(){return_message({message_kind:'event',eventname:'volumechange'})}); - player.on('waiting',function(){return_message({message_kind:'event',eventname:'waiting'})}); - player.on('timeupdate',function(){return_message({message_kind:'event',eventname:'timeupdate'})}); - player.on('loadedmetadata',function(){return_message({message_kind:'event',eventname:'loadedmetadata'})}); - player.on('play',function(){return_message({message_kind:'event',eventname:'play'})}); - player.on('seeking',function(){return_message({message_kind:'event',eventname:'seeking'})}); - player.on('seeked',function(){return_message({message_kind:'event',eventname:'seeked'})}); - player.on('playerresize',function(){return_message({message_kind:'event',eventname:'playerresize'})}); - player.on('pause',function(){return_message({message_kind:'event',eventname:'pause'})}); +if (new URLSearchParams(location.search).get('enablejsapi') === '1') { + window.addEventListener('message', control_embed_iframe); + const event_list = ['ended', 'error', 'ratechange', 'volumechange', 'waiting', 'timeupdate', 'loadedmetadata', 'play', 'seeking', 'seeked', 'playerresize', 'pause']; + event_list.forEach(event_name => { + player.on(event_name, function () { return_message({ message_kind: 'event', eventname: event_name }) }); + }); } diff --git a/assets/js/invidious_iframe_api.js b/assets/js/invidious_iframe_api.js index 4690048e..48d3b978 100644 --- a/assets/js/invidious_iframe_api.js +++ b/assets/js/invidious_iframe_api.js @@ -1,149 +1,156 @@ -class invidious_embed{ +class invidious_embed { static widgetid = 0; - static eventname_table = {onPlaybackRateChange:'ratechange',onStateChange:'statechange',onerror:'error'}; + static eventname_table = { onPlaybackRateChange: 'ratechange', onStateChange: 'statechange', onerror: 'error' }; + static available_event_name = ['ended', 'error', 'ratechange', 'volumechange', 'waiting', 'timeupdate', 'loadedmetadata', 'play', 'seeking', 'seeked', 'playerresize', 'pause']; static api_promise = false; - addEventListener(eventname,func){ - if(eventname in invidious_embed.eventname_table){ + static invidious_instance = ''; + addEventListener(eventname, func) { + if (eventname in invidious_embed.eventname_table) { this.eventobject[invidious_embed.eventname_table[eventname]].push(func); } - else{ - try{ - this.eventobject[eventname].push(func); - } - catch{} + else { + this.eventobject[eventname].push(func); } } - removeEventListner(eventname,func){ + + removeEventListner(eventname, func) { let internal_eventname; - if(eventname in invidious_embed.eventname_table){ + if (eventname in invidious_embed.eventname_table) { internal_eventname = invidious_embed.eventname_table[eventname]; } - else{ + else if (invidious_embed.available_event_name.includes(eventname)) { internal_eventname = eventname; } - this.eventobject[internal_eventname] = this.eventobject[internal_eventname].fillter(x=>x!==func); + this.eventobject[internal_eventname] = this.eventobject[internal_eventname].fillter(x => x !== func); } - Player(element,options){ + + Player(element, options) { this.player_status = -1; this.error_code = 0; this.volume = 100; - this.eventobject = {ready:[],ended:[],error:[],ratechange:[],volumechange:[],waiting:[],timeupdate:[],loadedmetadata:[],play:[],seeking:[],seeked:[],playerresize:[],pause:[],statechange:[]}; - var replace_elemnt; - if(element===undefined||element===null){ + this.eventobject = { ready: [], ended: [], error: [], ratechange: [], volumechange: [], waiting: [], timeupdate: [], loadedmetadata: [], play: [], seeking: [], seeked: [], playerresize: [], pause: [], statechange: [] }; + let replace_elemnt; + if (element === undefined || element === null) { throw 'Please, pass element id or HTMLElement as first argument'; } - else if(typeof element==='string'){ + else if (typeof element === 'string') { replace_elemnt = document.getElementById(element); } - else{ + else { replace_elemnt = element; } - var iframe_src = ''; - if(options.host!==undefined&&options.host!==""){ + let iframe_src = ''; + if (options.host !== undefined && options.host !== "") { iframe_src = new URL(options.host).origin; } - else{ + else if (invidious_embed.invidious_instance !== '') { + iframe_src = invidious_embed.invidious_instance; + } + else { iframe_src = 'https://vid.puffyan.us';//I set most hot instanse but this may need discuss or change ay to default instanse } this.target_origin = iframe_src.slice(); iframe_src += '/embed/'; - if(typeof options.videoId==='string'&&options.videoId.length===11){ + if (typeof options.videoId === 'string' && options.videoId.length === 11) { iframe_src += options.videoId; this.videoId = options.videoId; } - else{ + else { this.error_code = 2; this.event_executor('error'); return; } - var search_params = new URLSearchParams(''); - search_params.append('widgetid',invidious_embed.widgetid); + let search_params = new URLSearchParams(''); + search_params.append('widgetid', invidious_embed.widgetid); this.widgetid = invidious_embed.widgetid; invidious_embed.widgetid++; - search_params.append('origin',location.origin); - search_params.append('enablejsapi','1'); - if(typeof options.playerVars==='object'){ + search_params.append('origin', location.origin); + search_params.append('enablejsapi', '1'); + if (typeof options.playerVars === 'object') { this.option_playerVars = options.playerVars; - for (let x in options.playerVars){ - if(typeof x==='string'&&typeof options.playerVars[x]==='string'){ - search_params.append(x,options.playerVars[x]); + for (let x in options.playerVars) { + if (typeof x === 'string' && typeof options.playerVars[x] === 'string') { + search_params.append(x, options.playerVars[x]); } } - if(options.playerVars.autoplay===undefined){ - search_params.append('autoplay','0'); + if (options.playerVars.autoplay === undefined) { + search_params.append('autoplay', '0'); } } iframe_src += "?" + search_params.toString(); - if(options.events!==undefined&&typeof options.events==='object'){ - for(let x in options.events){ - this.addEventListener(x,options.events[x]); + if (typeof options.events === 'object') { + for (let x in options.events) { + this.addEventListener(x, options.events[x]); } } this.player_iframe = document.createElement("iframe"); this.loaded = false; - this.addEventListener('loadedmetadata',()=>{this.event_executor('ready');this.loaded=true}); - this.addEventListener('loadedmetadata',()=>{this.setVolume(this.volume)}); + this.addEventListener('loadedmetadata', () => { this.event_executor('ready'); this.loaded = true }); + this.addEventListener('loadedmetadata', () => { this.setVolume(this.volume) }); this.player_iframe.src = iframe_src; - if (typeof options.width === 'number'){ + if (typeof options.width === 'number') { this.player_iframe.width = options.width; } - else{ - if(document.body.clientWidth < 640){ + else { + if (document.body.clientWidth < 640) { this.player_iframe.width = document.body.clientWidth; } - else{ + else { this.player_iframe.width = 640; } } - if(options.width!==undefined&&typeof options.width==='number'){ + if (typeof options.width === 'number') { this.player_iframe.width = options.width; } - else{ - this.player_iframe.height = this.player_iframe.width * (9/16); + else { + this.player_iframe.height = this.player_iframe.width * (9 / 16); } this.player_iframe.style.border = "none"; replace_elemnt.replaceWith(this.player_iframe); this.eventdata = {}; return this; } - postMessage(data){ - var additionalInfo = {'origin':location.origin,'widgetid':String(this.widgetid),'target':'invidious_control'}; - data = Object.assign(additionalInfo,data); - this.player_iframe.contentWindow.postMessage(data,this.target_origin); + + postMessage(data) { + const additionalInfo = { 'origin': location.origin, 'widgetid': this.widgetid.toString(), 'target': 'invidious_control' }; + data = Object.assign(additionalInfo, data); + this.player_iframe.contentWindow.postMessage(data, this.target_origin); } - event_executor(eventname){ - var execute_functions = this.eventobject[eventname]; - var return_data = {data:undefined,target:this}; - if(eventname==='statechange'){ + + event_executor(eventname) { + const execute_functions = this.eventobject[eventname]; + let return_data = { data: undefined, target: this }; + if (eventname === 'statechange') { return_data.data = this.getPlayerState(); } - for(var x=0;x { + if (message.data.command === 'getvolume') { + element(message.data.value * 100); } - else{ - promise_array[x](message.data.value); + else { + element(message.data.value); } - } + }); this.message_wait[message.data.command] = []; break; case 'event': if (typeof message.data.eventname === 'string') { this.event_executor(message.data.eventname); - var previous_status = this.player_status; - switch(message.data.eventname){ + const previous_status = this.player_status; + switch (message.data.eventname) { case 'ended': this.player_status = 0; break; @@ -152,7 +159,7 @@ class invidious_embed{ break; case 'timeupdate': this.player_status = 1; - this.eventdata = Object.assign({},this.eventdata,message.data.value); + this.eventdata = Object.assign({}, this.eventdata, message.data.value); break; case 'pause': this.player_status = 2; @@ -161,222 +168,251 @@ class invidious_embed{ this.player_status = 3; break; case 'loadedmetadata': - this.eventdata = Object.assign({},this.eventdata,message.data.value); + this.eventdata = Object.assign({}, this.eventdata, message.data.value); break; } - if(previous_status!==this.player_status){ + if (previous_status !== this.player_status) { this.event_executor('statechange'); } } } } } - promise_resolve(){ - var res_outer; - var pro = new Promise((res,rej)=>{res_outer=res}); - return {'promise':pro,'resolve':res_outer}; - } - promise_send_event(event_name){ - if(invidious_embed.api_promise){ - var pro_object = this.promise_resolve(); - this.message_wait[event_name].push(pro_object.resolve); - this.postMessage({eventname:event_name}); - return pro_object.promise; + + promise_send_event(event_name) { + if (invidious_embed.api_promise) { + const promise_object = new Promise((resolve, reject) => { this.message_wait[event_name].push(resolve) }); + this.postMessage({ eventname: event_name }); + return promise_object; } - else{ + else { return this.eventdata[event_name]; } } - getPlayerState(){ + + getPlayerState() { return this.player_status; } - playVideo(){ - this.postMessage({eventname:'play'}); + + playVideo() { + this.postMessage({ eventname: 'play' }); } - pauseVideo(){ - this.postMessage({eventname:'pause'}); + + pauseVideo() { + this.postMessage({ eventname: 'pause' }); } - getVolume(){ + + getVolume() { return this.promise_send_event('getvolume'); } - setVolume(volume){ - volume = Number(volume); - this.volume = volume; - if(volume!==NaN&&volume!=undefined&&volume>=0&&volume<=100){ - this.postMessage({eventname:'setvolume',value:volume/100}); + + setVolume(volume) { + if (typeof volume === 'number') { + this.volume = volume; + if (volume !== NaN && volume != undefined && volume >= 0 && volume <= 100) { + this.postMessage({ eventname: 'setvolume', value: volume / 100 }); + } + } + else { + console.warn("setVolume first argument must be number"); } } - getIframe(){ + + getIframe() { return this.player_iframe; } - destroy(){ + + destroy() { this.player_iframe.remove(); } - mute(){ - this.postMessage({eventname:'setmutestatus',value:true}); + + mute() { + this.postMessage({ eventname: 'setmutestatus', value: true }); } - unMute(){ - this.postMessage({eventname:'setmutestatus',value:false}); + + unMute() { + this.postMessage({ eventname: 'setmutestatus', value: false }); } - isMuted(){ + + isMuted() { return this.promise_send_event('getmutestatus'); } - seekTo(seconds,allowSeekAhead){//seconds must be a number and allowSeekAhead is ignore + + seekTo(seconds, allowSeekAhead) {//seconds must be a number and allowSeekAhead is ignore seconds = Number(seconds); - if(seconds!==NaN&&seconds!==undefined){ - this.postMessage({eventname:'seek',value:seconds}); + if (seconds !== NaN && seconds !== undefined) { + this.postMessage({ eventname: 'seek', value: seconds }); } } - setSize(width,height){//width and height must be Number + + setSize(width, height) {//width and height must be Number this.player_iframe.width = Number(width); this.player_iframe.height = Number(height); } - getPlaybackRate(){ + + getPlaybackRate() { return this.promise_send_event('getplaybackrate'); } - setPlaybackRate(suggestedRate){//suggestedRate must be number.this player allow not available playback rate such as 1.4 + + setPlaybackRate(suggestedRate) {//suggestedRate must be number.this player allow not available playback rate such as 1.4 suggestedRate = Number(suggestedRate); - if(suggestedRate!==NaN&&suggestedRate!==undefined){ - this.postMessage({eventname:'setplaybackrate',value:suggestedRate}); + if (suggestedRate !== NaN && suggestedRate !== undefined) { + this.postMessage({ eventname: 'setplaybackrate', value: suggestedRate }); } } - getAvailablePlaybackRates(){ + + getAvailablePlaybackRates() { return this.promise_send_event('getavailableplaybackrates'); } - playOtherVideoById(option,autoplay,startSeconds_arg){//internal fuction + + playOtherVideoById(option, autoplay, startSeconds_arg) {//internal fuction let videoId = ''; - let startSeconds = -1; + let startSeconds = 0; let endSeconds = -1; let mediaContetUrl = ''; - if(typeof option==='string'){ - if(option.length===11){ + if (typeof option === 'string') { + if (option.length === 11) { videoId = option } - else{ + else { mediaContetUrl = option; } if (typeof startSeconds_arg === 'number') { startSeconds = startSeconds_arg; } } - else if(typeof option==='object'){ - if(option.videoId!==undefined&&typeof option.videoId==='string'){ - if(option.videoId.length==11){ + else if (typeof option === 'object') { + if (typeof option.videoId === 'string') { + if (option.videoId.length == 11) { videoId = option.videoId; } - else{ + else { this.error_code = 2; this.event_executor('error'); + return; } } else if (typeof option.mediaContentUrl === 'string') { mediaContetUrl = option.mediaContentUrl; } - else{ + else { this.error_code = 2; this.event_executor('error'); + return; } - if(option.startSeconds!==undefined&&typeof option.startSeconds==='number'&&option.startSeconds>=0){ + if (typeof option.startSeconds === 'number' && option.startSeconds >= 0) { startSeconds = option.startSeconds; } - if(option.endSeconds!==undefined&&typeof option.endSeconds==='number'&&option.endSeconds>=0){ + if (typeof option.endSeconds === 'number' && option.endSeconds >= 0) { endSeconds = option.endSeconds; } } - if(mediaContetUrl.length>0){ + if (mediaContetUrl.length > 0) { var tmp_videoId = ''; - if(mediaContetUrl.indexOf('/v/')!==-1){ - var end_pos = mediaContetUrl.length-1; - if(mediaContetUrl.indexOf('?')!==-1){ + if (mediaContetUrl.indexOf('/v/') !== -1) { + var end_pos = mediaContetUrl.length - 1; + if (mediaContetUrl.indexOf('?') !== -1) { end_pos = mediaContetUrl.indexOf('?'); } - tmp_videoId = mediaContetUrl.substring(mediaContetUrl.indexOf('/v/'),end_pos); + tmp_videoId = mediaContetUrl.substring(mediaContetUrl.indexOf('/v/'), end_pos); } - else{ + else { tmp_videoId = new URL(mediaContetUrl).searchParams.get('v'); } - if(tmp_videoId===null||tmp_videoId.length!==11){ + if (tmp_videoId === null || tmp_videoId.length !== 11) { this.error_code = 2; this.event_executor('error'); + return; } videoId = tmp_videoId; } - var iframe_sorce = this.target_origin.slice(); + let iframe_sorce = this.target_origin.slice(); iframe_sorce += "/embed/" + videoId; this.videoId = videoId; - var search_params = new URLSearchParams(''); - search_params.append('origin',location.origin); - search_params.append('enablejsapi','1'); - search_params.append('widgetid',invidious_embed.widgetid); + let search_params = new URLSearchParams(''); + search_params.append('origin', location.origin); + search_params.append('enablejsapi', '1'); + search_params.append('widgetid', invidious_embed.widgetid); this.widgetid = invidious_embed.widgetid; invidious_embed.widgetid++; search_params.append('autoplay', Number(autoplay)); - if(this.option_playerVars!==undefined){ - for(var x in this.option_playerVars){ - if(x!=='autoplay'&&x!=='start'&&x!=='end'){ - search_params.append(x,this.option_playerVars[x]); + if (this.option_playerVars !== undefined) { + Object.keys(this.option_playerVars).forEach(key => { + if (key !== 'autoplay' && key !== 'start' && key !== 'end') { + search_params.append(key, this.option_playerVars[key]); } - } + }) } - if(startSeconds!==-1&&startSeconds>=0){ - search_params.append('start',startSeconds); + if (startSeconds > 0) { + search_params.append('start', startSeconds); } - if(endSeconds!==-1&&endSeconds>=0){ - if(endSeconds>startSeconds){ - search_params.append('end',endSeconds); + if (endSeconds !== -1 && endSeconds >= 0) { + if (endSeconds > startSeconds) { + search_params.append('end', endSeconds); } - else{ - throw 'invalid end seconds'; + else { + throw 'Invalid end seconds because end seconds before start seconds'; } } iframe_sorce += "?" + search_params.toString(); this.player_iframe.src = iframe_sorce; - if(autoplay){ + if (autoplay) { this.player_status = 5; } this.eventdata = {}; } - loadVideoById(option,startSeconds){ - this.playOtherVideoById(option,true,startSeconds); + + loadVideoById(option, startSeconds) { + this.playOtherVideoById(option, true, startSeconds); } - cueVideoById(option,startSeconds){ - this.playOtherVideoById(option,false,startSeconds); + + cueVideoById(option, startSeconds) { + this.playOtherVideoById(option, false, startSeconds); } - cueVideoByUrl(option,startSeconds){ - this.playOtherVideoById(option,false,startSeconds); + + cueVideoByUrl(option, startSeconds) { + this.playOtherVideoById(option, false, startSeconds); } - loadVideoByUrl(option,startSeconds){ - this.playOtherVideoById(option,true,startSeconds); + + loadVideoByUrl(option, startSeconds) { + this.playOtherVideoById(option, true, startSeconds); } - getDuration(){ + + getDuration() { return this.promise_send_event('getduration'); } - getVideoUrl(){ + + getVideoUrl() { return this.target_origin + "/watch?v=" + this.videoId; } - async getVideoEmbedCode(){ + + async getVideoEmbedCode() { var title = await this.getVideoTitle(); - return ''; + return ''; } - getCurrentTime(){ + + getCurrentTime() { return this.promise_send_event('getcurrenttime'); } - constructor(element,options){ - this.Player(element,options); - window.addEventListener('message',(ms)=>{this.receiveMessage(ms)}); - this.message_wait = {getvolume:[],getmutestatus:[],getduration:[],getcurrenttime:[],getplaybackrate:[],getavailableplaybackrates:[],gettitle:[]}; + + constructor(element, options) { + this.Player(element, options); + window.addEventListener('message', (ms) => { this.receiveMessage(ms) }); + this.message_wait = { getvolume: [], getmutestatus: [], getduration: [], getcurrenttime: [], getplaybackrate: [], getavailableplaybackrates: [], gettitle: [] }; } - async getVideoData(){ - return {video_id:this.videoId,title:await this.promise_send_event('gettitle')}; + + async getVideoData() { + return { video_id: this.videoId, title: await this.promise_send_event('gettitle') }; } } -function invidious_ready(func){ - if(typeof func==='function'){ +function invidious_ready(func) { + if (typeof func === 'function') { func(); } } -const invidious = {Player:invidious_embed,PlayerState:{ENDED:0,PLAYING:1,PAUSED:2,BUFFERING:3,CUED:5},ready:invidious_ready}; -try{ +invidious_embed.invidious_instance = new URL(document.currentScript.src).origin; +const invidious = { Player: invidious_embed, PlayerState: { ENDED: 0, PLAYING: 1, PAUSED: 2, BUFFERING: 3, CUED: 5 }, ready: invidious_ready }; +try { onInvidiousIframeAPIReady(); } -catch{} +catch { }