react-player
Version:
A React component for playing a variety of URLs, including file paths, Mux, YouTube, Vimeo, and Wistia
52 lines (51 loc) • 2.14 kB
JavaScript
const AUDIO_EXTENSIONS = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i;
const VIDEO_EXTENSIONS = /\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i;
const HLS_EXTENSIONS = /\.(m3u8)($|\?)/i;
const DASH_EXTENSIONS = /\.(mpd)($|\?)/i;
const MATCH_URL_MUX = /stream\.mux\.com\/(?!\w+\.m3u8)(\w+)/;
const MATCH_URL_YOUTUBE = /(?:youtu\.be\/|youtube(?:-nocookie|education)?\.com\/(?:embed\/|v\/|watch\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((\w|-){11})|youtube\.com\/playlist\?list=|youtube\.com\/user\//;
const MATCH_URL_VIMEO = /vimeo\.com\/(?!progressive_redirect).+/;
const MATCH_URL_WISTIA = /(?:wistia\.(?:com|net)|wi\.st)\/(?:medias|embed)\/(?:iframe\/)?([^?]+)/;
const MATCH_URL_SPOTIFY = /open\.spotify\.com\/(\w+)\/(\w+)/i;
const MATCH_URL_TWITCH = /(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_]+|(videos?\/|\?video=)\d+)($|\?)/;
const MATCH_URL_TIKTOK = /tiktok\.com\/(?:player\/v1\/|share\/video\/|@[^/]+\/video\/)([0-9]+)/;
const canPlayFile = (url, test) => {
if (Array.isArray(url)) {
for (const item of url) {
if (typeof item === "string" && canPlayFile(item, test)) {
return true;
}
if (canPlayFile(item.src, test)) {
return true;
}
}
return false;
}
return test(url);
};
const canPlay = {
html: (url) => canPlayFile(url, (u) => AUDIO_EXTENSIONS.test(u) || VIDEO_EXTENSIONS.test(u)),
hls: (url) => canPlayFile(url, (u) => HLS_EXTENSIONS.test(u)),
dash: (url) => canPlayFile(url, (u) => DASH_EXTENSIONS.test(u)),
mux: (url) => MATCH_URL_MUX.test(url),
youtube: (url) => MATCH_URL_YOUTUBE.test(url),
vimeo: (url) => MATCH_URL_VIMEO.test(url) && !VIDEO_EXTENSIONS.test(url) && !HLS_EXTENSIONS.test(url),
wistia: (url) => MATCH_URL_WISTIA.test(url),
spotify: (url) => MATCH_URL_SPOTIFY.test(url),
twitch: (url) => MATCH_URL_TWITCH.test(url),
tiktok: (url) => MATCH_URL_TIKTOK.test(url)
};
export {
AUDIO_EXTENSIONS,
DASH_EXTENSIONS,
HLS_EXTENSIONS,
MATCH_URL_MUX,
MATCH_URL_SPOTIFY,
MATCH_URL_TIKTOK,
MATCH_URL_TWITCH,
MATCH_URL_VIMEO,
MATCH_URL_WISTIA,
MATCH_URL_YOUTUBE,
VIDEO_EXTENSIONS,
canPlay
};