From 50f679698e78221eafc2cdd7e6d81827fdeebbd2 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 15 May 2021 16:23:33 -0500 Subject: [PATCH] Enable player api --- components-eleventy/video/player.js | 27 ++++++++++++++++-- helpers/lite-youtube.js | 43 ++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/components-eleventy/video/player.js b/components-eleventy/video/player.js index 8ba495b..52954be 100644 --- a/components-eleventy/video/player.js +++ b/components-eleventy/video/player.js @@ -1,3 +1,22 @@ +function renderTimestamps ( video ) { + const timestampsForRender = video.timestamps.map( timestamp => { + const [ minutes, seconds ] = timestamp.time.split(':') + + return { + ...timestamp, + inSeconds: (minutes * 60) + Number(seconds) + } + }) + + return timestampsForRender.map( timestamp => (/* html */` + + `) ).join('') +} + export default async function ( video, options = {} ) { const { width = '325px', @@ -14,6 +33,8 @@ export default async function ( video, options = {} ) { // console.log('video', video) + const timestampsHtml = renderTimestamps( video ) + return /* html */` -
- +
+
+ ${ timestampsHtml } +
` diff --git a/helpers/lite-youtube.js b/helpers/lite-youtube.js index 8151b8e..a9dfcce 100644 --- a/helpers/lite-youtube.js +++ b/helpers/lite-youtube.js @@ -21,6 +21,14 @@ class LiteYTEmbed extends HTMLElement { super() this._uid = Date.now() + this.$refs = {} + + this.playerLoaded = false + this.player = null + this.playing = false + this.progressInterval = null + this.playerTime = 0 + this.preconnected = false } connectedCallback() { @@ -46,7 +54,10 @@ class LiteYTEmbed extends HTMLElement { // Once the user clicks, add the real iframe and drop our play button // TODO: In the future we could be like amp-youtube and silently swap in the iframe during idle time // We'd want to only do this for in-viewport or near-viewport ones: https://github.com/ampproject/amphtml/pull/5003 - this.playerPoster.addEventListener('click', e => this.addIframe()) + this.playerPoster.addEventListener('click', e => { + this.addIframe() + this.startPlayerLoad() + }) // Mounted @@ -114,6 +125,8 @@ class LiteYTEmbed extends HTMLElement { const iframeEl = document.createElement('iframe') + this.$refs['frame'] = iframeEl + iframeEl.width = '100%' iframeEl.height = '100%' // No encoding necessary as [title] is safe. https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#:~:text=Safe%20HTML%20Attributes%20include @@ -168,7 +181,7 @@ class LiteYTEmbed extends HTMLElement { } hasTimestamps () { - return this.timestamps.length > 0 + return this.timestamps().length > 0 } hasPlayer () { @@ -179,7 +192,7 @@ class LiteYTEmbed extends HTMLElement { const currentTime = this.playerTime// / 100 const reversesTimestamps = [ - ...this.timestamps + ...this.timestamps() ] // reversesTimestamps.reverse() @@ -256,7 +269,7 @@ class LiteYTEmbed extends HTMLElement { // }, static addPrefetch(kind, url, as) { - console.log('prefetching', url) + // console.log('prefetching', url) const linkEl = document.createElement('link') @@ -288,6 +301,8 @@ class LiteYTEmbed extends HTMLElement { } async startPlayerLoad () { + // console.log('Starting player load') + this.playerLoaded = true await this.initializePlayer() @@ -298,7 +313,7 @@ class LiteYTEmbed extends HTMLElement { } async initializePlayer () { - // console.log('Youtube Embed API Ready') + console.log('Initializing player') // Clear player this.player = null @@ -308,7 +323,9 @@ class LiteYTEmbed extends HTMLElement { // If there are no timestamps // then stop - if (!this.hasTimestamps) { + if ( !this.hasTimestamps() ) { + console.log('No timestamps. Skipping Youtube API initialization') + this.playerLoaded = true return } @@ -337,9 +354,13 @@ class LiteYTEmbed extends HTMLElement { const onReady = () => new Promise( resolve => { + // console.log('Started onReady') + this.player = new YT.Player(this.$refs['frame'].id, { events: { 'onReady': readyEvent => { + // console.log('Resolving onReady') + this.onPlayerReady( readyEvent ) resolve( readyEvent ) @@ -356,9 +377,11 @@ class LiteYTEmbed extends HTMLElement { }) - await onReady() + // console.log('Waiting for ready') - // console.log('Youtube Player API ready', JSON.stringify(this.player)) + const readyEvent = await onReady() + + // console.log('Youtube Player API ready', readyEvent, JSON.stringify(this.player)) } initializeApi () { @@ -375,8 +398,8 @@ class LiteYTEmbed extends HTMLElement { }) } - onPlayerPlaying () { - console.log('Player playing') + onPlayerPlaying = () => { + // console.log('Player playing') this.playing = true this.progressInterval = setInterval(() => {