UNPKG

exarcheia-vue-silentbox

Version:

A simple lightbox inspired Vue.js component.

77 lines (68 loc) 2.06 kB
import VideoUrlDecoderMixin from './videoUrlDecoder' export default { mixins: [VideoUrlDecoderMixin], data: () => ({ sizeVideoYoutube: 'maxresdefault', sizesYoutube: ['maxresdefault', 'sddefault', 'hqdefault'], youtubeDomain: '//img.youtube.com/vi', vimeoDomain: '//vimeo.com/api/v2/video', }), methods: { isEmbedVideo(itemSrc) { const supportedVideoServices = ['youtube.com', 'youtu.be', 'vimeo.com'] return supportedVideoServices.some((service) => { return itemSrc.includes(service) }) }, isLocalVideo(itemSrc) { const supportedVideoServices = [ '.mp4', '.ogg', '.webm', '.mov', '.flv', '.wmv', '.mkv', ] return supportedVideoServices.some((service) => { return itemSrc.includes(service) }) }, async getYoutubeThumbnail(videoId) { for (const size of this.sizesYoutube) { const url = await new Promise((resolve) => { try { const image = new Image() image.src = `${location.protocol}${this.youtubeDomain}/${videoId}/${size}.jpg` image.onload = ({ target }) => { resolve(target.width !== 120 ? target.src : false) } image.onerror = () => resolve(false) } catch (e) { return false } }) if (url) { return url } } }, async getThumbnail(src) { if (src.includes('youtube.com') || src.includes('youtu.be')) { return await this.getYoutubeThumbnail(this.getYoutubeVideoId(src)) } else if (src.includes('vimeo.com')) { const videoId = this.getVimeoVideoId(src) const videoDetails = await this.httpGet( `${location.protocol}${this.vimeoDomain}/${videoId}.json` ) return videoDetails[0].thumbnail_large } else { return src } }, async httpGet(url) { const result = await fetch(url) return await result.json() }, }, }