UNPKG

@blocklet/images

Version:

support functions for blocklet image validation

129 lines (128 loc) 4.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getVideoId = getVideoId; exports.getEmbedUrl = getEmbedUrl; exports.getVideoCoverUrl = getVideoCoverUrl; exports.getVideoCheckUrl = getVideoCheckUrl; exports.getYoutubeId = getYoutubeId; exports.getVimeoId = getVimeoId; exports.isVideoUrl = isVideoUrl; function getYoutubeId(link) { const url = link.trim(); if (url.includes('youtu.be/')) { return url.split('youtu.be/')[1]?.split('?')[0]; } // 检查是否是嵌入格式 if (url.includes('/embed/')) { return url.split('/embed/')[1]?.split('?')[0]; } // 检查是否是标准格式 if (url.includes('youtube.com/watch')) { const urlObj = new URL(url); return urlObj.searchParams.get('v'); } // 检查是否是短链视频格式 if (url.includes('youtube.com/shorts/')) { return url.split('/shorts/')[1]?.split('?')[0]; } return ''; } function getVimeoId(link) { const url = link.trim(); // 检查是否是嵌入格式 if (url.includes('/embed/')) { return url.split('/embed/')[1]?.split('?')[0]; } // 检查是否是标准格式 if (url.includes('vimeo.com/video/')) { return url.split('/video/')[1]?.split('?')[0]; } // 检查是否是频道视频格式 if (url.includes('vimeo.com/channels/')) { return url.split('/channels/')[1]?.split('/')[1]?.split('?')[0]; } // 检查是否是群组视频格式 if (url.includes('vimeo.com/groups/')) { return url.split('/groups/')[1]?.split('/')[1]?.split('?')[0]; } // 检查是否是标准短格式 if (url.includes('vimeo.com/')) { return url.split('vimeo.com/')[1]?.split('?')[0]; } return ''; } const cacheVideoId = {}; function getVideoId(link) { const url = link.trim(); if (!url || !/^https?:\/\/.+\..+/.test(url)) return []; if (cacheVideoId[url]) return cacheVideoId[url]; cacheVideoId[url] = (() => { const urlObj = new URL(url); if (urlObj.host.includes('youtube.com') || urlObj.host.includes('youtu.be')) { return [getYoutubeId(url), 'youtube']; } if (urlObj.host.includes('vimeo.com')) { return [getVimeoId(url), 'vimeo']; } return []; })(); return cacheVideoId[url]; } const cacheEmbedUrl = {}; function getEmbedUrl(link, { modestbranding = 1, controls = 0, autoplay = 0 } = {}) { const url = link.trim(); if (!url) return ''; if (cacheEmbedUrl[url] !== undefined) return cacheEmbedUrl[url]; const [id, platform] = getVideoId(url); if (platform === 'youtube') { cacheEmbedUrl[url] = `https://www.youtube.com/embed/${id}?modestbranding=${modestbranding}&controls=${controls}&autoplay=${autoplay}`; } else if (platform === 'vimeo') { cacheEmbedUrl[url] = `https://player.vimeo.com/video/${id}?autoplay=${autoplay}`; } else { cacheEmbedUrl[url] = ''; } return cacheEmbedUrl[url]; } const cacheCoverUrl = {}; function getVideoCoverUrl(link) { const url = link.trim(); if (!url) return ''; if (cacheCoverUrl[url] !== undefined) return cacheCoverUrl[url]; const [id, platform] = getVideoId(url); if (platform === 'youtube') { cacheCoverUrl[url] = `https://img.youtube.com/vi/${id}/mqdefault.jpg`; } else if (platform === 'vimeo') { cacheCoverUrl[url] = `https://i.vimeocdn.com/${id}/1000x563`; } else { cacheCoverUrl[url] = ''; } return cacheCoverUrl[url]; } function getVideoCheckUrl(link) { const url = link.trim(); if (!url) return ''; const [id, platform] = getVideoId(url); if (platform === 'youtube') { return `https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=${id}&format=json`; } if (platform === 'vimeo') { return `https://vimeo.com/api/oembed.json?url=https://vimeo.com/${id}`; } return ''; } function isVideoUrl(link) { const url = link.trim(); return getVideoId(url).length > 0; }