Playback rate
Playback rate
Quality
Quality
Captions
Captions
Audio
Audio
"},
config: {"autoplay":true,"captions":"","preload":true,"addrum":true,"showHeatmap":false,"trackView":true,"token":"","muted":false,"loop":false,"expires":0,"playsinline":false,"showSpeed":true,"rememberPosition":null,"forceSettings":false,"t":"","lang":"en","levelCap":false,"chromecast":false,"disableIosPlayer":false,"disableAirPlay":false,"drmEngine":"hls","baseUrl":"https://video.bunnycdn.com","isJit":false,"sessionTrackingConfig":{"iframeDomain":"iframe.mediadelivery.net","videoApiHostname":"https://video.bunnycdn.com","serverId":"1348","pullzoneTier":1},"isFairPlay":false,"fairPlayUseHls":false},
startTime: 0,
playbackSpeeds: ["0.50","0.75","1.00","1.25","1.50","1.75","2.00","4.00"],
heatmapData: null
};
let videoPlayer;
// Initialize the player and expose its API
const initializePlayer = () => {
if (!window.VideoPlayer) {
throw new Error('VideoPlayer class is not available');
}
// Create and initialize the player
videoPlayer = new VideoPlayer(playerConfig);
videoPlayer.initialize();
// Expose player API on window for external access
window.player = {
play: () => videoPlayer.video?.play(),
pause: () => videoPlayer.video?.pause(),
currentTime: {
get: () => videoPlayer.video?.currentTime ?? 0,
set: (time) => { if (videoPlayer.video) videoPlayer.video.currentTime = time; }
},
volume: {
get: () => videoPlayer.video?.volume ?? 1,
set: (vol) => { if (videoPlayer.video) videoPlayer.video.volume = vol; }
},
muted: {
get: () => videoPlayer.video?.muted ?? false,
set: (mute) => { if (videoPlayer.video) videoPlayer.video.muted = mute; }
}
};
};
// Wait for both DOM content and module script to load
const moduleScript = document.querySelector('script[type="module"]');
if (!moduleScript) {
throw new Error('Module script not found');
}
// Create a promise that resolves when the module script loads
const moduleLoaded = new Promise((resolve, reject) => {
moduleScript.addEventListener('load', resolve);
moduleScript.addEventListener('error', reject);
});
// Create a promise that resolves when the DOM is ready
const domReady = new Promise(resolve => {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', resolve);
} else {
resolve();
}
});
// Initialize when both DOM and module are ready
Promise.all([domReady, moduleLoaded])
.then(() => {
// Give a small delay for module execution
requestAnimationFrame(initializePlayer);
// Initialize RUM (Real User Monitoring) if enabled
try {
if (window.RumJob) {
const rumJob = new window.RumJob();
rumJob.start();
} else {
console.warn('RUM tracking requested but RumJob is not available');
}
} catch (error) {
console.error('Failed to initialize RUM:', error);
}
})
.catch(error => {
console.error('Failed to initialize player:', error);
});