@bigfishtv/cockpit
Version:
255 lines (238 loc) • 6.76 kB
JavaScript
/**
* Video Utilities
* @module Utilities/videoUtils
*/
/**
* Takes a Youtube or Viemo url and returns an object with id and playlist_id (if available) extracted, otherwise returns false
* @param {String} string - Youtube or Vimeo url
* @return {Object}
*/
export function detectVideo(str) {
var youtube_id = extractYoutubeId(str);
var youtube_playlist_id = extractYoutubePlaylistId(str);
var vimeo_id = extractVimeoId(str);
var wistia_id = extractWistiaId(str);
if (youtube_playlist_id || youtube_id) {
return {
type: 'youtube',
video_id: youtube_id,
playlist_id: youtube_playlist_id || null,
start_time: extractYouTubeStartTime(str),
passcode: null
};
}
if (vimeo_id) {
return {
type: 'vimeo',
video_id: vimeo_id,
playlist_id: null,
start_time: extractVimeoStartTime(str),
passcode: extractVimeoPasscode(str) || null
};
}
if (wistia_id) {
return {
type: 'wistia',
video_id: wistia_id,
playlist_id: null,
start_time: extractWistiaStartTime(str),
passcode: null
};
}
return false;
}
/**
* Extracts id from Youtube url, else false
* @param {String} string - Youtube url
* @return {String}
*/
export function extractYoutubeId(str) {
str = str.trim();
var matches = str.match(/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i);
if (str.match(/^[A-Za-z0-9_-]{11}$/)) {
return str;
} else if (matches) {
return matches[1];
} else {
return false;
}
}
/**
* Extracts playlist id from Youtube url, else false
* @param {String} string - Youtube url
* @return {String}
*/
export function extractYoutubePlaylistId(str) {
str = str.trim();
var matches = str.match(/list=(PL[A-Za-z0-9_-]{16,32})/);
if (str.match(/^PL[A-Za-z0-9_-]{16,32}$/)) {
return str;
} else if (matches) {
return matches[1];
} else {
return false;
}
}
/**
* Extracts id from Vimeo url, else false
* @param {String} string - Vimeo url
* @return {String}
*/
export function extractVimeoId(str) {
str = str.trim();
var matches = str.match(/vimeo.com\/(video\/)?(\d+)/i);
if (str.match(/^\d+$/)) {
return str;
} else if (matches) {
return matches[2];
} else {
return false;
}
}
/**
* Extracts id from Wistia video embed
* @param {String} string - Wistia embed code
* @return {String}
*/
export function extractWistiaId(str) {
if (str.indexOf('/medias/') > 0) {
return str.split('/medias/')[1];
} else if (str.indexOf('iframe') > 0) {
var matches = str.match(/embed\/iframe\/([^\?]+)/i);
if (matches) return matches[1];
} else {
var _matches = str.match(/wistia_async_(.+?) /i);
if (_matches) return _matches[1];
}
return false;
}
/**
* Returns the start time of a wistia embed video (default is 0)
*
* @param {String} str
* @returns {Number}
*/
export function extractWistiaStartTime(str) {
var matches = str.match(/[\?&]w?time=(\d+)m(\d+)s/);
if (matches) {
return parseInt(matches[1], 10) * 60 + parseInt(matches[2], 10);
}
matches = str.match(/[\?&]w?time=(\d+)/);
if (matches) {
return parseInt(matches[1], 10);
}
return 0;
}
/**
* Returns the start time of a youtube embed video (default is 0)
*
* @param {String} str
* @returns {Number}
*/
export function extractYouTubeStartTime(str) {
var matches = str.match(/\bt=(\d+)/);
if (matches) {
return parseInt(matches[1], 10);
}
return 0;
}
/**
* Returns the start time of a vimeo embed video (default is 0)
*
* @param {String} str
* @returns {Number}
*/
export function extractVimeoStartTime(str) {
var matches = str.match(/#t=(\d+)m(\d+)s/);
if (matches) {
return parseInt(matches[1], 10) * 60 + parseInt(matches[2], 10);
}
matches = str.match(/#t=(\d+)/);
if (matches) {
return parseInt(matches[1], 10);
}
return 0;
}
/**
* Returns the passcode from a vimeo URL or embed code, false if not found
*
* @param {String} str
* @returns {String|false}
*/
export function extractVimeoPasscode(str) {
var matches = str.match(/\bh=([a-f0-9]{10,})/);
if (matches) {
return matches[1];
}
matches = str.match(/vimeo\.com\/(video\/)?\d+\/([a-f0-9]{10,})/);
if (matches) {
return matches[2];
}
return false;
}
/**
* Creates an embed url from an object of video settings
* @param {Object} props - Embed video props
* @param {String} props.type - vimeo or youtube
* @param {String} props.video_id
* @param {String} props.playlist_id
* @param {Number} props.start_time - seconds
* @param {String} props.passcode
* @return {String}
*/
export function buildEmbedUrl(_ref) {
var type = _ref.type,
video_id = _ref.video_id,
playlist_id = _ref.playlist_id,
start_time = _ref.start_time,
passcode = _ref.passcode;
if (type == 'vimeo' && video_id) {
return 'https://player.vimeo.com/video/' + video_id + (passcode ? '?h=' + passcode : '') + (start_time > 0 ? '#t=' + start_time : '');
}
if (type == 'youtube' && playlist_id && video_id) {
return 'https://www.youtube.com/embed/' + video_id + '?list=' + playlist_id + (start_time > 0 ? '&t=' + start_time : '');
}
if (type == 'youtube' && video_id) {
return 'https://www.youtube.com/embed/' + video_id + (start_time > 0 ? '?t=' + start_time : '');
}
if (type == 'youtube' && playlist_id) {
return 'https://www.youtube.com/embed?list=' + playlist_id;
}
if (type == 'wistia') {
return 'https://fast.wistia.net/embed/iframe/' + video_id + (start_time > 0 ? '?time=' + start_time : '');
}
return false;
}
/**
* Creates external url to Vimeo or Youtube from an object of video settings
* @param {Object} props - Embed video props
* @param {String} props.type - vimeo or youtube
* @param {String} props.video_id
* @param {String} props.playlist_id
* @param {Number} props.start_time - seconds
* @param {String} props.passcode
* @return {String}
*/
export function buildVideoUrl(_ref2) {
var type = _ref2.type,
video_id = _ref2.video_id,
playlist_id = _ref2.playlist_id,
start_time = _ref2.start_time,
passcode = _ref2.passcode;
if (type == 'vimeo' && video_id) {
return 'https://vimeo.com/' + video_id + (passcode ? '/' + passcode : '') + (start_time > 0 ? '#t=' + start_time : '');
}
if (type == 'youtube' && playlist_id && video_id) {
return 'https://www.youtube.com/watch?v=' + video_id + '&list=' + playlist_id + (start_time > 0 ? '&t=' + start_time : '');
}
if (type == 'youtube' && video_id) {
return 'https://www.youtube.com/watch?v=' + video_id + (start_time > 0 ? '&t=' + start_time : '');
}
if (type == 'youtube' && playlist_id) {
return 'https://www.youtube.com/playlist?list=' + playlist_id;
}
if (type == 'wistia') {
return 'https://fast.wistia.net/embed/iframe/' + video_id + (start_time > 0 ? '?time=' + start_time : '');
}
return false;
}