M1 Macs + Windows 10 GAMING and PERFORMANCE Improvements with Parallels 16.5!
+
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/helpers/lite-youtube.js b/helpers/lite-youtube.js
new file mode 100644
index 0000000..29639cc
--- /dev/null
+++ b/helpers/lite-youtube.js
@@ -0,0 +1,107 @@
+// https://github.com/paulirish/lite-youtube-embed/blob/master/src/lite-yt-embed.js
+
+// import canAutoPlay from 'can-autoplay'
+
+
+/**
+ * A lightweight youtube embed. Still should feel the same to the user, just MUCH faster to initialize and paint.
+ *
+ * Thx to these as the inspiration
+ * https://storage.googleapis.com/amp-vs-non-amp/youtube-lazy.html
+ * https://autoplay-youtube-player.glitch.me/
+ *
+ * Once built it, I also found these:
+ * https://github.com/ampproject/amphtml/blob/master/extensions/amp-youtube (๐๐)
+ * https://github.com/Daugilas/lazyYT
+ * https://github.com/vb/lazyframe
+ */
+class LiteYTEmbed extends HTMLElement {
+ constructor() {
+ // Always call super first in constructor
+ super()
+
+ // write element functionality in here
+
+ // console.log('canAutoplay', canAutoplay)
+
+ }
+
+ connectedCallback() {
+ this.videoId = this.getAttribute('videoid')
+
+ console.log('canAutoplay from connectedCallback', canAutoplay)
+
+ // On hover (or tap), warm up the TCP connections we're (likely) about to use.
+ this.addEventListener('pointerover', LiteYTEmbed.warmConnections, {once: true})
+
+ // 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.addEventListener('click', e => this.addIframe())
+ }
+
+ // // TODO: Support the the user changing the [videoid] attribute
+ // attributeChangedCallback() {
+ // }
+
+ /**
+ * Add a to the head
+ */
+ static addPrefetch(kind, url, as) {
+ const linkEl = document.createElement('link')
+ linkEl.rel = kind
+ linkEl.href = url
+ if (as) {
+ linkEl.as = as
+ }
+ document.head.append(linkEl)
+ }
+
+ /**
+ * Begin pre-connecting to warm up the iframe load
+ * Since the embed's network requests load within its iframe,
+ * preload/prefetch'ing them outside the iframe will only cause double-downloads.
+ * So, the best we can do is warm up a few connections to origins that are in the critical path.
+ *
+ * Maybe `` would work, but it's unsupported: http://crbug.com/593267
+ * But TBH, I don't think it'll happen soon with Site Isolation and split caches adding serious complexity.
+ */
+ static warmConnections() {
+ if (LiteYTEmbed.preconnected) return
+
+ // The iframe document and most of its subresources come right off youtube.com
+ LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube-nocookie.com')
+ // The botguard script is fetched off from google.com
+ LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com')
+
+ // Not certain if these ad related domains are in the critical path. Could verify with domain-specific throttling.
+ LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net')
+ LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net')
+
+ LiteYTEmbed.preconnected = true
+ }
+
+ addIframe() {
+ const params = new URLSearchParams(this.getAttribute('params') || [])
+ params.append('autoplay', '1')
+
+ const iframeEl = document.createElement('iframe')
+ iframeEl.width = 560
+ iframeEl.height = 315
+ // No encoding necessary as [title] is safe. https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#:~:text=Safe%20HTML%20Attributes%20include
+ iframeEl.title = this.playLabel
+ iframeEl.allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture'
+ iframeEl.allowFullscreen = true
+ // AFAIK, the encoding here isn't necessary for XSS, but we'll do it only because this is a URL
+ // https://stackoverflow.com/q/64959723/89484
+ iframeEl.src = `https://www.youtube-nocookie.com/embed/${encodeURIComponent(this.videoId)}?${params.toString()}`
+ this.append(iframeEl)
+
+ this.classList.add('lyt-activated')
+
+ // Set focus for a11y
+ this.querySelector('iframe').focus()
+ }
+}
+// Register custom element
+window.customElements.define('lite-youtube', LiteYTEmbed)
diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js
index 68e3b6d..7e007f1 100644
--- a/pages-eleventy/tv.11ty.js
+++ b/pages-eleventy/tv.11ty.js
@@ -2,7 +2,9 @@ import dotenv from 'dotenv'
import config from '../nuxt.config'
+import VideoPlayer from '../components-eleventy/video/player.js'
import VideoRow from '../components-eleventy/video/row.js'
+
import { getRouteType } from '../helpers/app-derived'
// Setup dotenv
@@ -33,7 +35,6 @@ class TV {
pagination: {
data: 'eleventy-endpoints',
- // data: 'collections.tv',
size: 1,
alias: 'tvEntry',
before: function( endpoint ) {
@@ -89,6 +90,8 @@ class TV {
// console.log('video.payload', Object.keys(video.payload))
+ const playerHtml = await this.boundComponent(VideoPlayer)()
+
const rowHtml = await this.boundComponent(VideoRow)( relatedVideos )
// const rowHtml = renderedRow.join('')
@@ -96,14 +99,9 @@ class TV {
return /* html */`