diff --git a/cors.json b/cors.json index 53864a1..4850940 100644 --- a/cors.json +++ b/cors.json @@ -4,7 +4,8 @@ "https://kinoweb-dev.web.app", "https://kinoweb-dev--staging-2ra3ji0i.web.app", "https://kinoweb.dev", - "http://localhost:5000" + "http://localhost:5000", + "https://www.gstatic.com" ], "responseHeader": [ "Accept-Ranges", diff --git a/firebase.json b/firebase.json index da37a8e..fc019ef 100644 --- a/firebase.json +++ b/firebase.json @@ -5,7 +5,7 @@ "headers": [ { "key": "Content-Security-Policy", - "value": "script-src 'self'; object-src 'none'; base-uri 'none'" + "value": "script-src 'self' www.gstatic.com; object-src 'none'; base-uri 'none'" } ] }], diff --git a/package-lock.json b/package-lock.json index 1c099f1..d0a8e3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "kino", - "version": "1.0.0-beta4", + "version": "1.0.0-beta5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2343,9 +2343,9 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "call-bind": { @@ -6441,6 +6441,15 @@ "@rollup/pluginutils": "^3.1.0" } }, + "rollup-plugin-svg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-svg/-/rollup-plugin-svg-2.0.0.tgz", + "integrity": "sha512-DmE7dSQHo1SC5L2uH2qul3Mjyd5oV6U1aVVkyvTLX/mUsRink7f1b1zaIm+32GEBA6EHu8H/JJi3DdWqM53ySQ==", + "dev": true, + "requires": { + "rollup-pluginutils": "^1.3.1" + } + }, "rollup-plugin-terser": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", @@ -6481,6 +6490,24 @@ } } }, + "rollup-pluginutils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "dev": true, + "requires": { + "estree-walker": "^0.2.1", + "minimatch": "^3.0.2" + }, + "dependencies": { + "estree-walker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", + "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "dev": true + } + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6609,9 +6636,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -6844,14 +6871,14 @@ } }, "terser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", - "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { diff --git a/package.json b/package.json index b75e18b..0060ee9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kino", - "version": "1.0.0-beta4", + "version": "1.0.0-beta5", "description": "A sample offline streaming video PWA built for web.dev/media", "main": "src/index.js", "author": "Google", @@ -36,6 +36,7 @@ "rollup": "^2.50.4", "rollup-plugin-execute": "^1.1.1", "rollup-plugin-import-css": "^2.0.1", + "rollup-plugin-svg": "^2.0.0", "rollup-plugin-terser": "^7.0.2", "tmpl": ">=1.0.5" } diff --git a/public/styles.css b/public/styles.css index 66f3b39..4a35ece 100644 --- a/public/styles.css +++ b/public/styles.css @@ -12,6 +12,7 @@ --icon: #F7F7F8; --footer-text: #5a585b; --accent-background: #12292B; + --accent-background-alpha: #12292BCC; --accent: #00C9DB; --accent-text: #fff; --separator: #3D3B3F; @@ -56,6 +57,7 @@ --icon: #858287; --footer-text: #5a585b; --accent-background: #ECEFFF; + --accent-background-alpha: #ECEFFFCC; --accent: #3740FF; --accent-text: #000; --separator: #E6E4E7; @@ -543,11 +545,15 @@ main { * Single Video */ article { + width: 100%; + box-sizing: border-box; padding-bottom: calc(var(--gutter) * 3); margin-bottom: calc(var(--gutter) * 3); border-bottom: 1px solid var(--separator); + overflow: hidden; } article .video-content { + width: 100%; max-width: 760px; margin-left: auto; margin-right: auto; @@ -611,69 +617,82 @@ h3[id*="example"]{ font-size: 24px; margin-bottom: calc(var(--gutter) / 2); } -article pre, +article pre code, .code-sample .code-sample--content { - max-width: 760px; - white-space: pre-wrap; + display: block; font-size: 18px; font-family: monospace; padding: var(--gutter); border: 1px solid var(--code-border); background: var(--code-background); - overflow-y: auto; + overflow-x: auto; } .video-container { - --play-button-size: 112px; - --aspect-ratio-16-9-padding: 56.25%; - + position: relative; border-radius: 8px; max-width: 1200px; margin: 0 auto; overflow: hidden; + padding-bottom: 56.25%; } -.video-container--image { - height: 0; - padding-bottom: var(--aspect-ratio-16-9-padding); - position: relative; - display: flex; - align-items: center; - justify-items: center; - flex-flow: column nowrap; +.video-container--overlay { + display: none; } -.video-container--image picture img, -.video-container--image > img { +.video-container.has-player { + padding-bottom: 0; +} +.has-overlay .video-container--overlay { + position: absolute; width: 100%; + height: 100%; + inset: 0; + display: grid; + place-items: center center; +} +.has-overlay .video-container--overlay > * { + grid-column: 1; + grid-row: 1; + max-width: 100%; height: auto; - - /* - * Centers the button without using absolute positioning. - * - * This helps to avoid stacking issues and clashes with fixed navigation. - */ - margin-bottom: calc(-1 * (var(--aspect-ratio-16-9-padding) / 2) - (var(--play-button-size) / 2)); } -.video-container .play { - color: #000; - background: transparent; - border-radius: 50%; - width: var(--play-button-size); - height: var(--play-button-size); - padding: 0; +.has-overlay .video-container--overlay button { + color: var(--accent); + background: var(--accent-background-alpha); + position: relative; + z-index: 100; border: none; cursor: pointer; } +button.action--play { + width: 64px; + height: 64px; + border-radius: 50%; + padding: 0; + background: #fff; + box-shadow: 0 0 30px rgba(0, 0, 0, .5); +} +button.action--unmute { + display: grid; + grid-template-rows: auto auto; + justify-items: center; + gap: 16px; + padding: 24px; + border-radius: 8px; + font-size: 16px; + font-weight: 600; +} +button.action--unmute path { + stroke: var(--accent); +} .video-container .video-container--player { display: none; height: 720px; } -.video-container.has-player .video-container--image { - display: none; -} .video-container.has-player .video-container--player { display: block; height: auto; } -.video--disabled .video-container--image, +.video--disabled .video-container--overlay, .video--disabled video-downloader { filter: grayscale(1); pointer-events: none; diff --git a/rollup.config.js b/rollup.config.js index 2680b3a..556a9a6 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -15,9 +15,10 @@ */ import css from 'rollup-plugin-import-css'; -import generateApi from './src/js/utils/generateApi.js'; -import generateCache from './src/js/utils/generateCache'; +import svg from 'rollup-plugin-svg'; import json from '@rollup/plugin-json'; +import generateApi from './src/js/utils/generateApi'; +import generateCache from './src/js/utils/generateCache'; import { terser } from 'rollup-plugin-terser'; const isWatch = process.env.npm_lifecycle_event === 'watch'; @@ -33,6 +34,7 @@ export default [ generateApi(), json(), css(), + svg(), isWatch ? {} : terser(), ], }, @@ -43,7 +45,9 @@ export default [ format: 'cjs', }, plugins: [ + generateApi(), generateCache(), + json(), isWatch ? {} : terser(), ], }, diff --git a/src/api/basics/01-single-video.md b/src/api/01-basics/01-single-video.md similarity index 77% rename from src/api/basics/01-single-video.md rename to src/api/01-basics/01-single-video.md index 3beb2e0..a26e4fa 100644 --- a/src/api/basics/01-single-video.md +++ b/src/api/01-basics/01-single-video.md @@ -9,6 +9,25 @@ video-sources: - src: https://storage.googleapis.com/kino-assets/single-video/video.mp4 type: video/mp4; codecs="avc1.640032,mp4a.40.2" thumbnail: https://storage.googleapis.com/kino-assets/single-video/thumbnail.png +media-session-artwork: + - sizes: 96x96 + src: https://storage.googleapis.com/kino-assets/single-video/artwork-96x96.png + type: image/png + - sizes: 128x128 + src: https://storage.googleapis.com/kino-assets/single-video/artwork-128x128.png + type: image/png + - sizes: 192x192 + src: https://storage.googleapis.com/kino-assets/single-video/artwork-192x192.png + type: image/png + - sizes: 256x256 + src: https://storage.googleapis.com/kino-assets/single-video/artwork-256x256.png + type: image/png + - sizes: 384x384 + src: https://storage.googleapis.com/kino-assets/single-video/artwork-384x384.png + type: image/png + - sizes: 512x512 + src: https://storage.googleapis.com/kino-assets/single-video/artwork-512x512.png + type: image/png --- ## Introduction diff --git a/src/api/basics/02-multiple-sources.md b/src/api/01-basics/02-multiple-sources.md similarity index 81% rename from src/api/basics/02-multiple-sources.md rename to src/api/01-basics/02-multiple-sources.md index 5dfe118..3cd6384 100644 --- a/src/api/basics/02-multiple-sources.md +++ b/src/api/01-basics/02-multiple-sources.md @@ -10,9 +10,29 @@ video-sources: type: video/mp4; codecs="av01.0.04M.08, mp4a.40.2" - src: https://storage.googleapis.com/kino-assets/multiple-sources/hevc.mp4 type: video/mp4; codecs="hev1.1.6.L93.90,mp4a.40.2" + cast: true - src: https://storage.googleapis.com/kino-assets/multiple-sources/vp9.webm type: video/webm thumbnail: https://storage.googleapis.com/kino-assets/multiple-sources/thumbnail.png +media-session-artwork: + - sizes: 96x96 + src: https://storage.googleapis.com/kino-assets/multiple-sources/artwork-96x96.png + type: image/png + - sizes: 128x128 + src: https://storage.googleapis.com/kino-assets/multiple-sources/artwork-128x128.png + type: image/png + - sizes: 192x192 + src: https://storage.googleapis.com/kino-assets/multiple-sources/artwork-192x192.png + type: image/png + - sizes: 256x256 + src: https://storage.googleapis.com/kino-assets/multiple-sources/artwork-256x256.png + type: image/png + - sizes: 384x384 + src: https://storage.googleapis.com/kino-assets/multiple-sources/artwork-384x384.png + type: image/png + - sizes: 512x512 + src: https://storage.googleapis.com/kino-assets/multiple-sources/artwork-512x512.png + type: image/png --- ## Introduction diff --git a/src/api/basics/03-using-webvtt.md b/src/api/01-basics/03-using-webvtt.md similarity index 84% rename from src/api/basics/03-using-webvtt.md rename to src/api/01-basics/03-using-webvtt.md index bbb7dbb..ef05f90 100644 --- a/src/api/basics/03-using-webvtt.md +++ b/src/api/01-basics/03-using-webvtt.md @@ -10,6 +10,7 @@ video-sources: type: video/mp4; codecs="av01.0.04M.08, mp4a.40.2" - src: https://storage.googleapis.com/kino-assets/using-webvtt/hevc.mp4 type: video/mp4; codecs="hev1.1.6.L93.90,mp4a.40.2" + cast: true - src: https://storage.googleapis.com/kino-assets/using-webvtt/vp9.webm type: video/webm video-subtitles: @@ -21,9 +22,28 @@ video-subtitles: - default: false kind: captions label: Česky - src: https://storage.googleapis.com/kino-assets/using-webvtt/cap-cz.vtt - srclang: cz + src: https://storage.googleapis.com/kino-assets/using-webvtt/cap-cs.vtt + srclang: cs thumbnail: https://storage.googleapis.com/kino-assets/using-webvtt/thumbnail.png +media-session-artwork: + - sizes: 96x96 + src: https://storage.googleapis.com/kino-assets/using-webvtt/artwork-96x96.png + type: image/png + - sizes: 128x128 + src: https://storage.googleapis.com/kino-assets/using-webvtt/artwork-128x128.png + type: image/png + - sizes: 192x192 + src: https://storage.googleapis.com/kino-assets/using-webvtt/artwork-192x192.png + type: image/png + - sizes: 256x256 + src: https://storage.googleapis.com/kino-assets/using-webvtt/artwork-256x256.png + type: image/png + - sizes: 384x384 + src: https://storage.googleapis.com/kino-assets/using-webvtt/artwork-384x384.png + type: image/png + - sizes: 512x512 + src: https://storage.googleapis.com/kino-assets/using-webvtt/artwork-512x512.png + type: image/png --- ## Introduction diff --git a/src/api/basics/index.md b/src/api/01-basics/index.md similarity index 100% rename from src/api/basics/index.md rename to src/api/01-basics/index.md diff --git a/src/api/streaming/04-streaming-basics.md b/src/api/02-streaming/04-streaming-basics.md similarity index 87% rename from src/api/streaming/04-streaming-basics.md rename to src/api/02-streaming/04-streaming-basics.md index 38b958f..714c22b 100644 --- a/src/api/streaming/04-streaming-basics.md +++ b/src/api/02-streaming/04-streaming-basics.md @@ -8,8 +8,12 @@ length: '1:04' video-sources: - src: https://storage.googleapis.com/kino-assets/streaming-basics/manifest.mpd type: application/dash+xml + cast: true - src: https://storage.googleapis.com/kino-assets/streaming-basics/master.m3u8 type: application/x-mpegURL +url-rewrites: + - online: https://storage.googleapis.com/kino-assets/streaming-basics/manifest.mpd + offline: https://storage.googleapis.com/kino-assets/streaming-basics/manifest-offline.mpd video-subtitles: - default: true kind: captions @@ -19,9 +23,28 @@ video-subtitles: - default: false kind: captions label: Česky - src: https://storage.googleapis.com/kino-assets/streaming-basics/cap-cz.vtt - srclang: cz + src: https://storage.googleapis.com/kino-assets/streaming-basics/cap-cs.vtt + srclang: cs thumbnail: https://storage.googleapis.com/kino-assets/streaming-basics/thumbnail.png +media-session-artwork: + - sizes: 96x96 + src: https://storage.googleapis.com/kino-assets/streaming-basics/artwork-96x96.png + type: image/png + - sizes: 128x128 + src: https://storage.googleapis.com/kino-assets/streaming-basics/artwork-128x128.png + type: image/png + - sizes: 192x192 + src: https://storage.googleapis.com/kino-assets/streaming-basics/artwork-192x192.png + type: image/png + - sizes: 256x256 + src: https://storage.googleapis.com/kino-assets/streaming-basics/artwork-256x256.png + type: image/png + - sizes: 384x384 + src: https://storage.googleapis.com/kino-assets/streaming-basics/artwork-384x384.png + type: image/png + - sizes: 512x512 + src: https://storage.googleapis.com/kino-assets/streaming-basics/artwork-512x512.png + type: image/png --- ## Introduction diff --git a/src/api/streaming/05-efficient-formats.md b/src/api/02-streaming/05-efficient-formats.md similarity index 84% rename from src/api/streaming/05-efficient-formats.md rename to src/api/02-streaming/05-efficient-formats.md index 4b7ccc0..9b08807 100644 --- a/src/api/streaming/05-efficient-formats.md +++ b/src/api/02-streaming/05-efficient-formats.md @@ -8,8 +8,12 @@ length: '1:04' video-sources: - src: https://storage.googleapis.com/kino-assets/efficient-formats/manifest.mpd type: application/dash+xml + cast: true - src: https://storage.googleapis.com/kino-assets/efficient-formats/master.m3u8 type: application/x-mpegURL +url-rewrites: + - online: https://storage.googleapis.com/kino-assets/efficient-formats/manifest.mpd + offline: https://storage.googleapis.com/kino-assets/efficient-formats/manifest-offline.mpd video-subtitles: - default: true kind: captions @@ -19,9 +23,28 @@ video-subtitles: - default: false kind: captions label: Česky - src: https://storage.googleapis.com/kino-assets/efficient-formats/cap-cz.vtt - srclang: cz + src: https://storage.googleapis.com/kino-assets/efficient-formats/cap-cs.vtt + srclang: cs thumbnail: https://storage.googleapis.com/kino-assets/efficient-formats/thumbnail.png +media-session-artwork: + - sizes: 96x96 + src: https://storage.googleapis.com/kino-assets/efficient-formats/artwork-96x96.png + type: image/png + - sizes: 128x128 + src: https://storage.googleapis.com/kino-assets/efficient-formats/artwork-128x128.png + type: image/png + - sizes: 192x192 + src: https://storage.googleapis.com/kino-assets/efficient-formats/artwork-192x192.png + type: image/png + - sizes: 256x256 + src: https://storage.googleapis.com/kino-assets/efficient-formats/artwork-256x256.png + type: image/png + - sizes: 384x384 + src: https://storage.googleapis.com/kino-assets/efficient-formats/artwork-384x384.png + type: image/png + - sizes: 512x512 + src: https://storage.googleapis.com/kino-assets/efficient-formats/artwork-512x512.png + type: image/png --- ## Introduction diff --git a/src/api/streaming/06-adaptive-streaming.md b/src/api/02-streaming/06-adaptive-streaming.md similarity index 78% rename from src/api/streaming/06-adaptive-streaming.md rename to src/api/02-streaming/06-adaptive-streaming.md index 2584e1e..c5a53af 100644 --- a/src/api/streaming/06-adaptive-streaming.md +++ b/src/api/02-streaming/06-adaptive-streaming.md @@ -8,8 +8,12 @@ length: '1:04' video-sources: - src: https://storage.googleapis.com/kino-assets/adaptive-streaming/manifest.mpd type: application/dash+xml + cast: true - src: https://storage.googleapis.com/kino-assets/adaptive-streaming/master.m3u8 type: application/x-mpegURL +url-rewrites: + - online: https://storage.googleapis.com/kino-assets/adaptive-streaming/manifest.mpd + offline: https://storage.googleapis.com/kino-assets/adaptive-streaming/manifest-offline.mpd video-subtitles: - default: true kind: captions @@ -19,9 +23,28 @@ video-subtitles: - default: false kind: captions label: Česky - src: https://storage.googleapis.com/kino-assets/adaptive-streaming/cap-cz.vtt - srclang: cz + src: https://storage.googleapis.com/kino-assets/adaptive-streaming/cap-cs.vtt + srclang: cs thumbnail: https://storage.googleapis.com/kino-assets/adaptive-streaming/thumbnail.png +media-session-artwork: + - sizes: 96x96 + src: https://storage.googleapis.com/kino-assets/adaptive-streaming/artwork-96x96.png + type: image/png + - sizes: 128x128 + src: https://storage.googleapis.com/kino-assets/adaptive-streaming/artwork-128x128.png + type: image/png + - sizes: 192x192 + src: https://storage.googleapis.com/kino-assets/adaptive-streaming/artwork-192x192.png + type: image/png + - sizes: 256x256 + src: https://storage.googleapis.com/kino-assets/adaptive-streaming/artwork-256x256.png + type: image/png + - sizes: 384x384 + src: https://storage.googleapis.com/kino-assets/adaptive-streaming/artwork-384x384.png + type: image/png + - sizes: 512x512 + src: https://storage.googleapis.com/kino-assets/adaptive-streaming/artwork-512x512.png + type: image/png --- ## Introduction diff --git a/src/api/streaming/index.md b/src/api/02-streaming/index.md similarity index 100% rename from src/api/streaming/index.md rename to src/api/02-streaming/index.md diff --git a/src/api/03-user-experience/07-autoplay.md b/src/api/03-user-experience/07-autoplay.md new file mode 100644 index 0000000..6b6cbef --- /dev/null +++ b/src/api/03-user-experience/07-autoplay.md @@ -0,0 +1,225 @@ +--- +title: Autoplay +description: | + Learn how to start video playback automatically and employ autoplay strategies that don't lead to degraded user experience. +date: Septembed 22nd, 2021 +length: '1:04' +video-sources: + - src: https://storage.googleapis.com/kino-assets/autoplay/manifest.mpd + type: application/dash+xml + - src: https://storage.googleapis.com/kino-assets/autoplay/master.m3u8 + type: application/x-mpegURL +video-subtitles: + - default: true + kind: captions + label: English + src: https://storage.googleapis.com/kino-assets/autoplay/cap-en.vtt + srclang: en + - default: false + kind: captions + label: Česky + src: https://storage.googleapis.com/kino-assets/autoplay/cap-cs.vtt + srclang: cz +thumbnail: https://storage.googleapis.com/kino-assets/autoplay/thumbnail.png +media-session-artwork: + - sizes: 96x96 + src: https://storage.googleapis.com/kino-assets/autoplay/artwork-96x96.png + type: image/png + - sizes: 128x128 + src: https://storage.googleapis.com/kino-assets/autoplay/artwork-128x128.png + type: image/png + - sizes: 192x192 + src: https://storage.googleapis.com/kino-assets/autoplay/artwork-192x192.png + type: image/png + - sizes: 256x256 + src: https://storage.googleapis.com/kino-assets/autoplay/artwork-256x256.png + type: image/png + - sizes: 384x384 + src: https://storage.googleapis.com/kino-assets/autoplay/artwork-384x384.png + type: image/png + - sizes: 512x512 + src: https://storage.googleapis.com/kino-assets/autoplay/artwork-512x512.png + type: image/png +autoplay: true +--- + +## Introduction + +Sometimes the video is not just a _part_ of your web page content. Sometimes it +is _the_ content and your users expect it to start playing automatically +as soon as possible. + +There are two main ways of accomplishing this autoplay behavior: + +1. Using the `