UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 9.08 kB
{ "version": 3, "sources": ["../../src/cover/embed-video-utils.js"], "sourcesContent": ["import { getBlockVariations } from '@wordpress/blocks';\nimport { matchesPatterns } from '../embed/util';\n\nconst DEFAULT_EMBED_BLOCK = 'core/embed';\n\n// List of supported video providers for cover block backgrounds\nconst DEFAULT_VIDEO_PROVIDERS = [\n\t'youtube',\n\t'vimeo',\n\t'videopress',\n\t'animoto',\n\t'tiktok',\n\t'wordpress-tv',\n];\n\n/**\n * Resolves the list of providers that are actually allowed.\n *\n * @param {string[]} [allowedVideoProviders] The providers configured via the block attribute.\n * @return {string[]} The supported providers that remain allowed.\n */\nexport function getAllowedVideoProviders( allowedVideoProviders ) {\n\tif ( ! Array.isArray( allowedVideoProviders ) ) {\n\t\treturn [];\n\t}\n\n\treturn DEFAULT_VIDEO_PROVIDERS.filter( ( provider ) =>\n\t\tallowedVideoProviders.includes( provider )\n\t);\n}\n\n/**\n * Checks if a URL is a valid video embed URL from allowed providers.\n *\n * @param {string} url The URL to validate.\n * @param {string[]} [allowedProviders] The allowed providers, Defaults to all\n * supported providers.\n * @return {boolean} True if the URL matches an allowed video provider pattern.\n */\nexport function isValidVideoEmbedUrl( url, allowedProviders ) {\n\tif ( ! url ) {\n\t\treturn false;\n\t}\n\n\tconst embedBlock = findVideoEmbedProvider( url, allowedProviders );\n\treturn embedBlock !== null;\n}\n\n/**\n * Finds the embed provider for a given URL if it's an allowed video provider.\n *\n * @param {string} url The URL to check.\n * @param {string[]} [allowedProviders] The allowed providers, Defaults to all\n * supported providers.\n * @return {string|null} The provider name slug (e.g., 'youtube') or null if not found.\n */\nexport function getVideoEmbedProvider( url, allowedProviders ) {\n\tconst embedBlock = findVideoEmbedProvider( url, allowedProviders );\n\treturn embedBlock ? embedBlock.name : null;\n}\n\n/**\n * Finds a matching video embed block variation for the given URL.\n *\n * @param {string} url The URL to match against provider patterns.\n * @param {string[]} [allowedProviders] The allowed providers, Defaults to all\n * supported providers.\n * @return {Object|null} The matching block variation or null if not found.\n */\nfunction findVideoEmbedProvider(\n\turl,\n\tallowedProviders = DEFAULT_VIDEO_PROVIDERS\n) {\n\tconst embedVariations = getBlockVariations( DEFAULT_EMBED_BLOCK );\n\n\tif ( ! embedVariations ) {\n\t\treturn null;\n\t}\n\n\tconst matchingVariation = embedVariations.find( ( { patterns } ) =>\n\t\tmatchesPatterns( url, patterns )\n\t);\n\n\tif (\n\t\t! matchingVariation ||\n\t\t! allowedProviders.includes( matchingVariation.name )\n\t) {\n\t\treturn null;\n\t}\n\n\treturn matchingVariation;\n}\n\n/**\n * Modifies embed HTML to use background video parameters.\n *\n * @param {string} html The original embed HTML.\n * @return {string|null} The modified embed HTML, or null if not possible.\n */\nexport function getBackgroundEmbedHtml( html ) {\n\tconst srcMatch = html?.match( /src=[\"']([^\"']+)[\"']/ );\n\tif ( ! srcMatch ) {\n\t\treturn null;\n\t}\n\n\tconst iframeSrc = srcMatch[ 1 ];\n\tconst backgroundSrc = getBackgroundVideoSrc( iframeSrc );\n\treturn html.replace( iframeSrc, backgroundSrc );\n}\n\n/**\n * Detects the video provider from an iframe src URL.\n *\n * @param {string} src The iframe src URL.\n * @return {string|null} The provider name slug or null if not recognized.\n */\nexport function detectProviderFromSrc( src ) {\n\tif ( ! src ) {\n\t\treturn null;\n\t}\n\n\tconst lowerSrc = src.toLowerCase();\n\n\tif (\n\t\tlowerSrc.includes( 'youtube.com' ) ||\n\t\tlowerSrc.includes( 'youtu.be' )\n\t) {\n\t\treturn 'youtube';\n\t}\n\tif ( lowerSrc.includes( 'vimeo.com' ) ) {\n\t\treturn 'vimeo';\n\t}\n\tif ( lowerSrc.includes( 'videopress.com' ) ) {\n\t\treturn 'videopress';\n\t}\n\tif ( lowerSrc.includes( 'animoto.com' ) ) {\n\t\treturn 'animoto';\n\t}\n\tif ( lowerSrc.includes( 'tiktok.com' ) ) {\n\t\treturn 'tiktok';\n\t}\n\tif ( lowerSrc.includes( 'wordpress.tv' ) ) {\n\t\treturn 'wordpress-tv';\n\t}\n\n\treturn null;\n}\n\n/**\n * Modifies an iframe src URL to add background video parameters.\n * Automatically detects the provider from the URL.\n *\n * @param {string} src The iframe src URL.\n * @return {string} The modified URL.\n */\nexport function getBackgroundVideoSrc( src ) {\n\tif ( ! src ) {\n\t\treturn src;\n\t}\n\n\ttry {\n\t\tconst url = new URL( src );\n\n\t\t// Detect provider from the iframe src URL\n\t\tconst provider = detectProviderFromSrc( src );\n\n\t\t// Add provider-specific parameters for background video behavior\n\t\tswitch ( provider ) {\n\t\t\tcase 'youtube':\n\t\t\t\t// YouTube parameters for background video\n\t\t\t\turl.searchParams.set( 'autoplay', '1' );\n\t\t\t\turl.searchParams.set( 'mute', '1' );\n\t\t\t\turl.searchParams.set( 'loop', '1' );\n\t\t\t\turl.searchParams.set( 'controls', '0' );\n\t\t\t\turl.searchParams.set( 'showinfo', '0' );\n\t\t\t\turl.searchParams.set( 'modestbranding', '1' );\n\t\t\t\turl.searchParams.set( 'playsinline', '1' );\n\t\t\t\turl.searchParams.set( 'rel', '0' );\n\t\t\t\t// For loop to work, we need the playlist parameter\n\t\t\t\tconst videoId = url.pathname.split( '/' ).pop();\n\t\t\t\tif ( videoId ) {\n\t\t\t\t\turl.searchParams.set( 'playlist', videoId );\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'vimeo':\n\t\t\t\t// Vimeo parameters for background video\n\t\t\t\turl.searchParams.set( 'autoplay', '1' );\n\t\t\t\turl.searchParams.set( 'muted', '1' );\n\t\t\t\turl.searchParams.set( 'loop', '1' );\n\t\t\t\turl.searchParams.set( 'background', '1' );\n\t\t\t\turl.searchParams.set( 'controls', '0' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'videopress':\n\t\t\tcase 'wordpress-tv':\n\t\t\t\t// VideoPress parameters\n\t\t\t\turl.searchParams.set( 'autoplay', '1' );\n\t\t\t\turl.searchParams.set( 'loop', '1' );\n\t\t\t\turl.searchParams.set( 'muted', '1' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Generic parameters that might work for other providers\n\t\t\t\turl.searchParams.set( 'autoplay', '1' );\n\t\t\t\turl.searchParams.set( 'muted', '1' );\n\t\t\t\turl.searchParams.set( 'loop', '1' );\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn url.toString();\n\t} catch {\n\t\t// If URL parsing fails, return original src\n\t\treturn src;\n\t}\n}\n"], "mappings": "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", "names": [] }