invidious/assets/js/embed.js

230 lines
9.1 KiB
JavaScript
Raw Normal View History

2022-04-20 04:38:24 -04:00
'use strict';
var video_data = JSON.parse(document.getElementById('video_data').textContent);
function get_playlist(plid) {
2022-04-20 06:04:44 -04:00
var plid_url;
2019-05-06 11:37:10 -04:00
if (plid.startsWith('RD')) {
2022-04-20 06:04:44 -04:00
plid_url = '/api/v1/mixes/' + plid +
2019-05-06 12:23:14 -04:00
'?continuation=' + video_data.id +
'&format=html&hl=' + video_data.preferences.locale;
2019-05-06 11:37:10 -04:00
} else {
2022-04-20 06:04:44 -04:00
plid_url = '/api/v1/playlists/' + plid +
2019-08-05 19:49:13 -04:00
'?index=' + video_data.index +
'&continuation' + video_data.id +
2019-05-06 12:23:14 -04:00
'&format=html&hl=' + video_data.preferences.locale;
2019-05-06 11:37:10 -04:00
}
helpers.xhr('GET', plid_url, {retries: 5, entity_name: 'playlist'}, {
on200: function (response) {
if (!response.nextVideo)
return;
player.on('ended', function () {
var url = new URL('https://example.com/embed/' + response.nextVideo);
const search_params = new URLSearchParams(location.search);
url.searchParams.set('list', plid);
if (!plid.startsWith('RD'))
url.searchParams.set('index', response.index);
if (video_data.params.autoplay || video_data.params.continue_autoplay)
url.searchParams.set('autoplay', '1');
if (video_data.params.listen !== video_data.preferences.listen)
url.searchParams.set('listen', video_data.params.listen);
if (video_data.params.speed !== video_data.preferences.speed)
url.searchParams.set('speed', video_data.params.speed);
if (video_data.params.local !== video_data.preferences.local)
url.searchParams.set('local', video_data.params.local);
if (search_params.get('widgetid') !== null)
url.searchParams.set('widgetid', search_params.get('widgetid'));
if (search_params.get('origin') !== null)
url.searchParams.set('origin', search_params.get('origin'));
if (search_params.get('enablejsapi') !== null)
url.searchParams.set('enablejsapi', search_params.get('enablejsapi'));
location.assign(url.pathname + url.search);
});
2019-05-06 11:37:10 -04:00
}
});
2019-05-06 11:37:10 -04:00
}
addEventListener('load', function (e) {
2019-10-18 12:44:11 -04:00
if (video_data.plid) {
get_playlist(video_data.plid);
} else if (video_data.video_series) {
player.on('ended', function () {
var url = new URL('https://example.com/embed/' + video_data.video_series.shift());
if (video_data.params.autoplay || video_data.params.continue_autoplay)
2019-10-18 12:44:11 -04:00
url.searchParams.set('autoplay', '1');
if (video_data.params.listen !== video_data.preferences.listen)
2019-10-18 12:44:11 -04:00
url.searchParams.set('listen', video_data.params.listen);
if (video_data.params.speed !== video_data.preferences.speed)
2019-10-18 12:44:11 -04:00
url.searchParams.set('speed', video_data.params.speed);
if (video_data.params.local !== video_data.preferences.local)
2019-10-18 12:44:11 -04:00
url.searchParams.set('local', video_data.params.local);
if (video_data.video_series.length !== 0)
2022-04-20 05:05:19 -04:00
url.searchParams.set('playlist', video_data.video_series.join(','));
2019-05-06 11:37:10 -04:00
2019-10-18 12:44:11 -04:00
location.assign(url.pathname + url.search);
});
}
});
2023-08-17 22:40:50 -04:00
2023-08-29 11:52:58 -04:00
function return_message(message, target_window) {
if (target_window === undefined) {
2023-08-17 22:40:50 -04:00
target_window = window.parent;
}
let url_params = new URLSearchParams(location.search);
let widgetid = url_params.get('widgetid');
2023-08-29 11:52:58 -04:00
let additional_info = { from: 'invidious_control' };
2023-09-24 10:04:09 -04:00
2023-08-29 11:52:58 -04:00
if (widgetid !== null) {
2023-08-17 22:40:50 -04:00
additional_info.widgetid = widgetid;
}
2023-09-24 10:04:09 -04:00
2023-08-29 11:52:58 -04:00
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,
getplaylistindex: video_data.index,
getplaylistid: video_data.plid
};
2023-08-29 11:52:58 -04:00
}
2023-08-17 22:40:50 -04:00
}
2023-09-24 10:04:09 -04:00
2023-08-29 11:52:58 -04:00
if (message.eventname === 'error') {
additional_info['value'] = { geterrorcode: player.error().code };
2023-08-17 22:40:50 -04:00
}
2023-09-24 10:04:09 -04:00
2023-08-29 11:52:58 -04:00
message = Object.assign(additional_info, message);
let target_origin = url_params.get('origin') || '*';
2023-08-29 11:52:58 -04:00
target_window.postMessage(message, target_origin);
2023-08-17 22:40:50 -04:00
}
2023-08-29 11:52:58 -04:00
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');
2023-09-02 13:17:14 -04:00
const widgetid_equal = widgetid === message.data.widgetid;
2023-08-29 11:52:58 -04:00
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) {
2023-08-17 22:40:50 -04:00
case 'play':
player.play();
break;
case 'pause':
player.pause();
break;
2023-08-29 11:52:58 -04:00
2023-08-17 22:40:50 -04:00
case 'setvolume':
player.volume(message.data.value);
break;
case 'seek':
const duration = player.duration();
let newTime = helpers.clamp(message.data.value, 0, duration);
2023-09-06 10:31:09 -04:00
if (player.paused() && player.currentTime() === 0) {
player.play();
}
2023-08-17 22:40:50 -04:00
player.currentTime(newTime);
break;
2023-08-29 11:52:58 -04:00
case 'setplaybackrate':
player.playbackRate(message.data.value);
break;
case 'setloopstatus':
player.loop(message.data.value);
break;
case 'requestfullscreen':
player.requestFullscreen();
break;
case 'exitfullscreen':
player.exitFullscreen();
break;
case 'getvolume':
message_return_value = player.volume();
break;
case 'getduration':
message_return_value = player.duration();
break;
case 'getcurrenttime':
message_return_value = player.currentTime();
break;
2023-08-17 22:40:50 -04:00
case 'getplaystatus':
2023-08-29 11:52:58 -04:00
message_return_value = player.paused();
2023-08-17 22:40:50 -04:00
break;
case 'getplaybackrate':
2023-08-29 11:52:58 -04:00
message_return_value = player.playbackRate();
2023-08-17 22:40:50 -04:00
break;
case 'getavailableplaybackrates':
2023-08-29 11:52:58 -04:00
message_return_value = options.playbackRates;
2023-08-17 22:40:50 -04:00
break;
case 'getloopstatus':
2023-08-29 11:52:58 -04:00
message_return_value = player.loop();
2023-08-17 22:40:50 -04:00
break;
case 'getmutestatus':
2023-08-29 11:52:58 -04:00
message_return_value = player.muted();
2023-08-17 22:40:50 -04:00
break;
case 'gettitle':
2023-08-29 11:52:58 -04:00
message_return_value = player_data.title;
2023-08-17 22:40:50 -04:00
break;
case 'getfullscreenstatus':
2023-08-29 11:52:58 -04:00
message_return_value = player.isFullscreen();
2023-08-17 22:40:50 -04:00
break;
case 'geterrorcode':
2023-08-29 11:52:58 -04:00
message_return_value = player.error().code;
break;
2023-09-02 13:17:14 -04:00
case 'getplaylistindex':
message_return_value = video_data.index;
break;
case 'getplaylistid':
message_return_value = video_data.plid;
break;
2023-08-29 11:52:58 -04:00
default:
console.info("Unhandled event name: " + message.data.eventname);
2023-08-17 22:40:50 -04:00
break;
2023-08-29 11:52:58 -04:00
}
2023-09-24 10:04:09 -04:00
2023-08-29 11:52:58 -04:00
if (message_return_value !== undefined) {
return_message({ command: message.data.eventname, value: message_return_value, message_kind: 'info_return' }, message.source);
2023-08-17 22:40:50 -04:00
}
}
}
}
2023-08-29 11:52:58 -04:00
if (new URLSearchParams(location.search).get('enablejsapi') === '1') {
window.addEventListener('message', control_embed_iframe);
2023-09-24 10:04:09 -04:00
const event_list = [
'ended',
'error',
'ratechange',
'volumechange',
'waiting',
'timeupdate',
'loadedmetadata',
'play',
'seeking',
'seeked',
'playerresize',
'pause'
];
2023-08-29 11:52:58 -04:00
event_list.forEach(event_name => {
2023-09-24 10:04:09 -04:00
player.on(event_name, function () {
return_message({ message_kind: 'event', eventname: event_name })
});
2023-08-29 11:52:58 -04:00
});
2023-08-17 22:47:14 -04:00
}