From 8cc935d53172e53e22befff03341adc95a3283cb Mon Sep 17 00:00:00 2001 From: Esteban Codes <33187126+3stbn@users.noreply.github.com> Date: Thu, 18 Jul 2024 17:44:30 -0500 Subject: [PATCH 01/10] spotify-support --- examples/react/src/App.js | 7 ++ package.json | 4 +- src/patterns.js | 4 +- src/players/Spotify.js | 137 ++++++++++++++++++++++++++++++++++++++ src/players/index.js | 6 ++ types/spotify.d.ts | 5 ++ 6 files changed, 160 insertions(+), 3 deletions(-) create mode 100644 src/players/Spotify.js create mode 100644 types/spotify.d.ts diff --git a/examples/react/src/App.js b/examples/react/src/App.js index 3ba82719..2c857109 100644 --- a/examples/react/src/App.js +++ b/examples/react/src/App.js @@ -356,6 +356,13 @@ class App extends Component { {this.renderLoadButton('https://cdnapisec.kaltura.com/p/2507381/sp/250738100/embedIframeJs/uiconf_id/44372392/partner_id/2507381?iframeembed=true&playerId=kaltura_player_1605622336&entry_id=1_i1jmzcn3', 'Test B')} + + Spotify + + {this.renderLoadButton('spotify:episode:7makk4oTQel546B0PZlDM5', 'Test A')} + {this.renderLoadButton('spotify:track:0KhB428j00T8lxKCpHweKw', 'Test B')} + + Files diff --git a/package.json b/package.json index 6892c42d..e1ce4aca 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "react-player", "version": "2.16.0", "description": "A React component for playing a variety of URLs, including file paths, YouTube, Facebook, Twitch, SoundCloud, Streamable, Vimeo, Wistia and DailyMotion", - "main": "lib/index.js", - "typings": "lib/index.d.ts", + "main": "src/index.js", + "typings": "types/lib/index.d.ts", "scripts": { "clean": "rimraf lib lazy demo coverage *.d.ts", "start": "cp -r examples/react/public/ demo & npm run build:lib --watch=forever & builder examples/react/src/index.js --format=iife --bundle --outdir=demo --watch --servedir=demo --livereload", diff --git a/src/patterns.js b/src/patterns.js index 6f82585b..f527f005 100644 --- a/src/patterns.js +++ b/src/patterns.js @@ -14,6 +14,7 @@ export const MATCH_URL_TWITCH_CHANNEL = /(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_ export const MATCH_URL_DAILYMOTION = /^(?:(?:https?):)?(?:\/\/)?(?:www\.)?(?:(?:dailymotion\.com(?:\/embed)?\/video)|dai\.ly)\/([a-zA-Z0-9]+)(?:_[\w_-]+)?(?:[\w.#_-]+)?/ export const MATCH_URL_MIXCLOUD = /mixcloud\.com\/([^/]+\/[^/]+)/ export const MATCH_URL_VIDYARD = /vidyard.com\/(?:watch\/)?([a-zA-Z0-9-_]+)/ +export const MATCH_URL_SPOTIFY = /spotify.+$/ export const MATCH_URL_KALTURA = /^https?:\/\/[a-zA-Z]+\.kaltura.(com|org)\/p\/([0-9]+)\/sp\/([0-9]+)00\/embedIframeJs\/uiconf_id\/([0-9]+)\/partner_id\/([0-9]+)(.*)entry_id.([a-zA-Z0-9-_].*)$/ export const AUDIO_EXTENSIONS = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i export const VIDEO_EXTENSIONS = /\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i @@ -63,5 +64,6 @@ export const canPlay = { mixcloud: url => MATCH_URL_MIXCLOUD.test(url), vidyard: url => MATCH_URL_VIDYARD.test(url), kaltura: url => MATCH_URL_KALTURA.test(url), - file: canPlayFile + file: canPlayFile, + spotify: url => MATCH_URL_SPOTIFY.test(url) } diff --git a/src/players/Spotify.js b/src/players/Spotify.js new file mode 100644 index 00000000..30a6ab3e --- /dev/null +++ b/src/players/Spotify.js @@ -0,0 +1,137 @@ +import React, { Component } from 'react' +import { getSDK, callPlayer } from '../utils' +import { canPlay } from '../patterns' + +const SDK_URL = 'https://open.spotify.com/embed/iframe-api/v1' +const SDK_GLOBAL = 'SpotifyIframeApi' +const SDK_GLOBAL_READY = 'SpotifyIframeApi' + +export default class Spotify extends Component { + static displayName = 'Spotify' + static loopOnEnded = true + static canPlay = canPlay.spotify + callPlayer = callPlayer + duration = null + currentTime = null + totalTime = null + player = null + + componentDidMount () { + this.props.onMount && this.props.onMount(this) + } + + load (url) { + if (window[SDK_GLOBAL] && !this.player) { + this.initializePlayer(window[SDK_GLOBAL], url) + return + } else if (this.player) { + this.callPlayer('loadUri', this.props.url) + return + } + + window.onSpotifyIframeApiReady = (IFrameAPI) => this.initializePlayer(IFrameAPI, url) + getSDK(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY) + } + + initializePlayer = (IFrameAPI, url) => { + if (!this.container) return + + const options = { + width: '100%', + height: '100%', + uri: url + } + const callback = (EmbedController) => { + this.player = EmbedController + this.player.addListener('playback_update', this.onStateChange) + this.player.addListener('ready', this.props.onReady) + } + IFrameAPI.createController(this.container, options, callback) + } + + onStateChange = (event) => { + const { data } = event + const { onPlay, onPause, onBuffer, onBufferEnd, onEnded } = this.props + + if (data.position >= data.duration && data.position && data.duration) { + onEnded() + } + if (data.isPaused === true) onPause() + if (data.isPaused === false && data.isBuffering === false) { + this.currentTime = data.position + this.totalTime = data.duration + onPlay() + onBufferEnd() + } + if (data.isBuffering === true) onBuffer() + } + + play () { + this.callPlayer('resume') + } + + pause () { + this.callPlayer('pause') + } + + stop () { + this.callPlayer('destroy') + } + + seekTo (amount) { + this.callPlayer('seek', amount) + if (!this.props.playing) { + this.pause() + } else { + this.play() + } + } + + setVolume (fraction) { + // No volume support + } + + mute () { + // No volume support + } + + unmute () { + // No volume support + } + + setPlaybackRate (rate) { + // No playback rate support + } + + setLoop (loop) { + // No loop support + } + + getDuration () { + return this.totalTime / 1000 + } + + getCurrentTime () { + return this.currentTime / 1000 + } + + getSecondsLoaded () { + // No seconds loaded support + } + + ref = container => { + this.container = container + } + + render () { + const style = { + width: '100%', + height: '100%' + } + return ( +
+
+
+ ) + } +} diff --git a/src/players/index.js b/src/players/index.js index ba2e25fe..18123087 100644 --- a/src/players/index.js +++ b/src/players/index.js @@ -74,6 +74,12 @@ export default [ canPlay: canPlay.kaltura, lazyPlayer: lazy(() => import(/* webpackChunkName: 'reactPlayerKaltura' */'./Kaltura')) }, + { + key: 'spotify', + name: 'Spotify', + canPlay: canPlay.spotify, + lazyPlayer: lazy(() => import(/* webpackChunkName: 'reactPlayerSpotify' */'./Spotify')) + }, { key: 'file', name: 'FilePlayer', diff --git a/types/spotify.d.ts b/types/spotify.d.ts new file mode 100644 index 00000000..0b6c0e37 --- /dev/null +++ b/types/spotify.d.ts @@ -0,0 +1,5 @@ +import BaseReactPlayer, { BaseReactPlayerProps } from './base' + +export interface SpotifyPlayerProps extends BaseReactPlayerProps {} + +export default class SpotifyPlayer extends BaseReactPlayer {} \ No newline at end of file From 6730494e191788b6753b5d0536c7f2b41a79633a Mon Sep 17 00:00:00 2001 From: Esteban Codes <33187126+3stbn@users.noreply.github.com> Date: Thu, 18 Jul 2024 17:50:57 -0500 Subject: [PATCH 02/10] include lib in git files --- .gitignore | 1 - lib/Player.js | 286 ++++++++++++++++++++++++++++ lib/Preview.js | 137 ++++++++++++++ lib/ReactPlayer.js | 204 ++++++++++++++++++++ lib/index.js | 36 ++++ lib/patterns.js | 101 ++++++++++ lib/players/DailyMotion.js | 142 ++++++++++++++ lib/players/Facebook.js | 143 ++++++++++++++ lib/players/FilePlayer.js | 372 +++++++++++++++++++++++++++++++++++++ lib/players/Kaltura.js | 140 ++++++++++++++ lib/players/Mixcloud.js | 128 +++++++++++++ lib/players/Mux.js | 228 +++++++++++++++++++++++ lib/players/SoundCloud.js | 145 +++++++++++++++ lib/players/Spotify.js | 147 +++++++++++++++ lib/players/Streamable.js | 138 ++++++++++++++ lib/players/Twitch.js | 132 +++++++++++++ lib/players/Vidyard.js | 136 ++++++++++++++ lib/players/Vimeo.js | 177 ++++++++++++++++++ lib/players/Wistia.js | 152 +++++++++++++++ lib/players/YouTube.js | 222 ++++++++++++++++++++++ lib/players/index.js | 165 ++++++++++++++++ lib/props.js | 255 +++++++++++++++++++++++++ lib/standalone.js | 38 ++++ lib/utils.js | 187 +++++++++++++++++++ package.json | 4 +- 25 files changed, 3813 insertions(+), 3 deletions(-) create mode 100644 lib/Player.js create mode 100644 lib/Preview.js create mode 100644 lib/ReactPlayer.js create mode 100644 lib/index.js create mode 100644 lib/patterns.js create mode 100644 lib/players/DailyMotion.js create mode 100644 lib/players/Facebook.js create mode 100644 lib/players/FilePlayer.js create mode 100644 lib/players/Kaltura.js create mode 100644 lib/players/Mixcloud.js create mode 100644 lib/players/Mux.js create mode 100644 lib/players/SoundCloud.js create mode 100644 lib/players/Spotify.js create mode 100644 lib/players/Streamable.js create mode 100644 lib/players/Twitch.js create mode 100644 lib/players/Vidyard.js create mode 100644 lib/players/Vimeo.js create mode 100644 lib/players/Wistia.js create mode 100644 lib/players/YouTube.js create mode 100644 lib/players/index.js create mode 100644 lib/props.js create mode 100644 lib/standalone.js create mode 100644 lib/utils.js diff --git a/.gitignore b/.gitignore index 9c251bfa..3b09dae3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ node_modules npm-debug.log yarn-error.log .DS_Store -/lib /lazy /demo /coverage diff --git a/lib/Player.js b/lib/Player.js new file mode 100644 index 00000000..00a772bf --- /dev/null +++ b/lib/Player.js @@ -0,0 +1,286 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Player_exports = {}; +__export(Player_exports, { + default: () => Player +}); +module.exports = __toCommonJS(Player_exports); +var import_react = __toESM(require("react")); +var import_react_fast_compare = __toESM(require("react-fast-compare")); +var import_props = require("./props"); +var import_utils = require("./utils"); +const SEEK_ON_PLAY_EXPIRY = 5e3; +class Player extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "mounted", false); + __publicField(this, "isReady", false); + __publicField(this, "isPlaying", false); + // Track playing state internally to prevent bugs + __publicField(this, "isLoading", true); + // Use isLoading to prevent onPause when switching URL + __publicField(this, "loadOnReady", null); + __publicField(this, "startOnPlay", true); + __publicField(this, "seekOnPlay", null); + __publicField(this, "onDurationCalled", false); + __publicField(this, "handlePlayerMount", (player) => { + if (this.player) { + this.progress(); + return; + } + this.player = player; + this.player.load(this.props.url); + this.progress(); + }); + __publicField(this, "getInternalPlayer", (key) => { + if (!this.player) + return null; + return this.player[key]; + }); + __publicField(this, "progress", () => { + if (this.props.url && this.player && this.isReady) { + const playedSeconds = this.getCurrentTime() || 0; + const loadedSeconds = this.getSecondsLoaded(); + const duration = this.getDuration(); + if (duration) { + const progress = { + playedSeconds, + played: playedSeconds / duration + }; + if (loadedSeconds !== null) { + progress.loadedSeconds = loadedSeconds; + progress.loaded = loadedSeconds / duration; + } + if (progress.playedSeconds !== this.prevPlayed || progress.loadedSeconds !== this.prevLoaded) { + this.props.onProgress(progress); + } + this.prevPlayed = progress.playedSeconds; + this.prevLoaded = progress.loadedSeconds; + } + } + this.progressTimeout = setTimeout(this.progress, this.props.progressFrequency || this.props.progressInterval); + }); + __publicField(this, "handleReady", () => { + if (!this.mounted) + return; + this.isReady = true; + this.isLoading = false; + const { onReady, playing, volume, muted } = this.props; + onReady(); + if (!muted && volume !== null) { + this.player.setVolume(volume); + } + if (this.loadOnReady) { + this.player.load(this.loadOnReady, true); + this.loadOnReady = null; + } else if (playing) { + this.player.play(); + } + this.handleDurationCheck(); + }); + __publicField(this, "handlePlay", () => { + this.isPlaying = true; + this.isLoading = false; + const { onStart, onPlay, playbackRate } = this.props; + if (this.startOnPlay) { + if (this.player.setPlaybackRate && playbackRate !== 1) { + this.player.setPlaybackRate(playbackRate); + } + onStart(); + this.startOnPlay = false; + } + onPlay(); + if (this.seekOnPlay) { + this.seekTo(this.seekOnPlay); + this.seekOnPlay = null; + } + this.handleDurationCheck(); + }); + __publicField(this, "handlePause", (e) => { + this.isPlaying = false; + if (!this.isLoading) { + this.props.onPause(e); + } + }); + __publicField(this, "handleEnded", () => { + const { activePlayer, loop, onEnded } = this.props; + if (activePlayer.loopOnEnded && loop) { + this.seekTo(0); + } + if (!loop) { + this.isPlaying = false; + onEnded(); + } + }); + __publicField(this, "handleError", (...args) => { + this.isLoading = false; + this.props.onError(...args); + }); + __publicField(this, "handleDurationCheck", () => { + clearTimeout(this.durationCheckTimeout); + const duration = this.getDuration(); + if (duration) { + if (!this.onDurationCalled) { + this.props.onDuration(duration); + this.onDurationCalled = true; + } + } else { + this.durationCheckTimeout = setTimeout(this.handleDurationCheck, 100); + } + }); + __publicField(this, "handleLoaded", () => { + this.isLoading = false; + }); + } + componentDidMount() { + this.mounted = true; + } + componentWillUnmount() { + clearTimeout(this.progressTimeout); + clearTimeout(this.durationCheckTimeout); + if (this.isReady && this.props.stopOnUnmount) { + this.player.stop(); + if (this.player.disablePIP) { + this.player.disablePIP(); + } + } + this.mounted = false; + } + componentDidUpdate(prevProps) { + if (!this.player) { + return; + } + const { url, playing, volume, muted, playbackRate, pip, loop, activePlayer, disableDeferredLoading } = this.props; + if (!(0, import_react_fast_compare.default)(prevProps.url, url)) { + if (this.isLoading && !activePlayer.forceLoad && !disableDeferredLoading && !(0, import_utils.isMediaStream)(url)) { + console.warn(`ReactPlayer: the attempt to load ${url} is being deferred until the player has loaded`); + this.loadOnReady = url; + return; + } + this.isLoading = true; + this.startOnPlay = true; + this.onDurationCalled = false; + this.player.load(url, this.isReady); + } + if (!prevProps.playing && playing && !this.isPlaying) { + this.player.play(); + } + if (prevProps.playing && !playing && this.isPlaying) { + this.player.pause(); + } + if (!prevProps.pip && pip && this.player.enablePIP) { + this.player.enablePIP(); + } + if (prevProps.pip && !pip && this.player.disablePIP) { + this.player.disablePIP(); + } + if (prevProps.volume !== volume && volume !== null) { + this.player.setVolume(volume); + } + if (prevProps.muted !== muted) { + if (muted) { + this.player.mute(); + } else { + this.player.unmute(); + if (volume !== null) { + setTimeout(() => this.player.setVolume(volume)); + } + } + } + if (prevProps.playbackRate !== playbackRate && this.player.setPlaybackRate) { + this.player.setPlaybackRate(playbackRate); + } + if (prevProps.loop !== loop && this.player.setLoop) { + this.player.setLoop(loop); + } + } + getDuration() { + if (!this.isReady) + return null; + return this.player.getDuration(); + } + getCurrentTime() { + if (!this.isReady) + return null; + return this.player.getCurrentTime(); + } + getSecondsLoaded() { + if (!this.isReady) + return null; + return this.player.getSecondsLoaded(); + } + seekTo(amount, type, keepPlaying) { + if (!this.isReady) { + if (amount !== 0) { + this.seekOnPlay = amount; + setTimeout(() => { + this.seekOnPlay = null; + }, SEEK_ON_PLAY_EXPIRY); + } + return; + } + const isFraction = !type ? amount > 0 && amount < 1 : type === "fraction"; + if (isFraction) { + const duration = this.player.getDuration(); + if (!duration) { + console.warn("ReactPlayer: could not seek using fraction \u2013\xA0duration not yet available"); + return; + } + this.player.seekTo(duration * amount, keepPlaying); + return; + } + this.player.seekTo(amount, keepPlaying); + } + render() { + const Player2 = this.props.activePlayer; + if (!Player2) { + return null; + } + return /* @__PURE__ */ import_react.default.createElement( + Player2, + { + ...this.props, + onMount: this.handlePlayerMount, + onReady: this.handleReady, + onPlay: this.handlePlay, + onPause: this.handlePause, + onEnded: this.handleEnded, + onLoaded: this.handleLoaded, + onError: this.handleError + } + ); + } +} +__publicField(Player, "displayName", "Player"); +__publicField(Player, "propTypes", import_props.propTypes); +__publicField(Player, "defaultProps", import_props.defaultProps); diff --git a/lib/Preview.js b/lib/Preview.js new file mode 100644 index 00000000..9ca492aa --- /dev/null +++ b/lib/Preview.js @@ -0,0 +1,137 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Preview_exports = {}; +__export(Preview_exports, { + default: () => Preview +}); +module.exports = __toCommonJS(Preview_exports); +var import_react = __toESM(require("react")); +const ICON_SIZE = "64px"; +const cache = {}; +class Preview extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "mounted", false); + __publicField(this, "state", { + image: null + }); + __publicField(this, "handleKeyPress", (e) => { + if (e.key === "Enter" || e.key === " ") { + this.props.onClick(); + } + }); + } + componentDidMount() { + this.mounted = true; + this.fetchImage(this.props); + } + componentDidUpdate(prevProps) { + const { url, light } = this.props; + if (prevProps.url !== url || prevProps.light !== light) { + this.fetchImage(this.props); + } + } + componentWillUnmount() { + this.mounted = false; + } + fetchImage({ url, light, oEmbedUrl }) { + if (import_react.default.isValidElement(light)) { + return; + } + if (typeof light === "string") { + this.setState({ image: light }); + return; + } + if (cache[url]) { + this.setState({ image: cache[url] }); + return; + } + this.setState({ image: null }); + return window.fetch(oEmbedUrl.replace("{url}", url)).then((response) => response.json()).then((data) => { + if (data.thumbnail_url && this.mounted) { + const image = data.thumbnail_url.replace("height=100", "height=480").replace("-d_295x166", "-d_640"); + this.setState({ image }); + cache[url] = image; + } + }); + } + render() { + const { light, onClick, playIcon, previewTabIndex, previewAriaLabel } = this.props; + const { image } = this.state; + const isElement = import_react.default.isValidElement(light); + const flexCenter = { + display: "flex", + alignItems: "center", + justifyContent: "center" + }; + const styles = { + preview: { + width: "100%", + height: "100%", + backgroundImage: image && !isElement ? `url(${image})` : void 0, + backgroundSize: "cover", + backgroundPosition: "center", + cursor: "pointer", + ...flexCenter + }, + shadow: { + background: "radial-gradient(rgb(0, 0, 0, 0.3), rgba(0, 0, 0, 0) 60%)", + borderRadius: ICON_SIZE, + width: ICON_SIZE, + height: ICON_SIZE, + position: isElement ? "absolute" : void 0, + ...flexCenter + }, + playIcon: { + borderStyle: "solid", + borderWidth: "16px 0 16px 26px", + borderColor: "transparent transparent transparent white", + marginLeft: "7px" + } + }; + const defaultPlayIcon = /* @__PURE__ */ import_react.default.createElement("div", { style: styles.shadow, className: "react-player__shadow" }, /* @__PURE__ */ import_react.default.createElement("div", { style: styles.playIcon, className: "react-player__play-icon" })); + return /* @__PURE__ */ import_react.default.createElement( + "div", + { + style: styles.preview, + className: "react-player__preview", + onClick, + tabIndex: previewTabIndex, + onKeyPress: this.handleKeyPress, + ...previewAriaLabel ? { "aria-label": previewAriaLabel } : {} + }, + isElement ? light : null, + playIcon || defaultPlayIcon + ); + } +} diff --git a/lib/ReactPlayer.js b/lib/ReactPlayer.js new file mode 100644 index 00000000..60bd539f --- /dev/null +++ b/lib/ReactPlayer.js @@ -0,0 +1,204 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var ReactPlayer_exports = {}; +__export(ReactPlayer_exports, { + createReactPlayer: () => createReactPlayer +}); +module.exports = __toCommonJS(ReactPlayer_exports); +var import_react = __toESM(require("react")); +var import_deepmerge = __toESM(require("deepmerge")); +var import_memoize_one = __toESM(require("memoize-one")); +var import_react_fast_compare = __toESM(require("react-fast-compare")); +var import_props = require("./props"); +var import_utils = require("./utils"); +var import_Player = __toESM(require("./Player")); +const Preview = (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerPreview' */ + "./Preview" +)); +const IS_BROWSER = typeof window !== "undefined" && window.document && typeof document !== "undefined"; +const IS_GLOBAL = typeof global !== "undefined" && global.window && global.window.document; +const SUPPORTED_PROPS = Object.keys(import_props.propTypes); +const UniversalSuspense = IS_BROWSER || IS_GLOBAL ? import_react.Suspense : () => null; +const customPlayers = []; +const createReactPlayer = (players, fallback) => { + var _a; + return _a = class extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "state", { + showPreview: !!this.props.light + }); + // Use references, as refs is used by React + __publicField(this, "references", { + wrapper: (wrapper) => { + this.wrapper = wrapper; + }, + player: (player) => { + this.player = player; + } + }); + __publicField(this, "handleClickPreview", (e) => { + this.setState({ showPreview: false }); + this.props.onClickPreview(e); + }); + __publicField(this, "showPreview", () => { + this.setState({ showPreview: true }); + }); + __publicField(this, "getDuration", () => { + if (!this.player) + return null; + return this.player.getDuration(); + }); + __publicField(this, "getCurrentTime", () => { + if (!this.player) + return null; + return this.player.getCurrentTime(); + }); + __publicField(this, "getSecondsLoaded", () => { + if (!this.player) + return null; + return this.player.getSecondsLoaded(); + }); + __publicField(this, "getInternalPlayer", (key = "player") => { + if (!this.player) + return null; + return this.player.getInternalPlayer(key); + }); + __publicField(this, "seekTo", (fraction, type, keepPlaying) => { + if (!this.player) + return null; + this.player.seekTo(fraction, type, keepPlaying); + }); + __publicField(this, "handleReady", () => { + this.props.onReady(this); + }); + __publicField(this, "getActivePlayer", (0, import_memoize_one.default)((url) => { + for (const player of [...customPlayers, ...players]) { + if (player.canPlay(url)) { + return player; + } + } + if (fallback) { + return fallback; + } + return null; + })); + __publicField(this, "getConfig", (0, import_memoize_one.default)((url, key) => { + const { config } = this.props; + return import_deepmerge.default.all([ + import_props.defaultProps.config, + import_props.defaultProps.config[key] || {}, + config, + config[key] || {} + ]); + })); + __publicField(this, "getAttributes", (0, import_memoize_one.default)((url) => { + return (0, import_utils.omit)(this.props, SUPPORTED_PROPS); + })); + __publicField(this, "renderActivePlayer", (url) => { + if (!url) + return null; + const player = this.getActivePlayer(url); + if (!player) + return null; + const config = this.getConfig(url, player.key); + return /* @__PURE__ */ import_react.default.createElement( + import_Player.default, + { + ...this.props, + key: player.key, + ref: this.references.player, + config, + activePlayer: player.lazyPlayer || player, + onReady: this.handleReady + } + ); + }); + } + shouldComponentUpdate(nextProps, nextState) { + return !(0, import_react_fast_compare.default)(this.props, nextProps) || !(0, import_react_fast_compare.default)(this.state, nextState); + } + componentDidUpdate(prevProps) { + const { light } = this.props; + if (!prevProps.light && light) { + this.setState({ showPreview: true }); + } + if (prevProps.light && !light) { + this.setState({ showPreview: false }); + } + } + renderPreview(url) { + if (!url) + return null; + const { light, playIcon, previewTabIndex, oEmbedUrl, previewAriaLabel } = this.props; + return /* @__PURE__ */ import_react.default.createElement( + Preview, + { + url, + light, + playIcon, + previewTabIndex, + previewAriaLabel, + oEmbedUrl, + onClick: this.handleClickPreview + } + ); + } + render() { + const { url, style, width, height, fallback: fallback2, wrapper: Wrapper } = this.props; + const { showPreview } = this.state; + const attributes = this.getAttributes(url); + const wrapperRef = typeof Wrapper === "string" ? this.references.wrapper : void 0; + return /* @__PURE__ */ import_react.default.createElement(Wrapper, { ref: wrapperRef, style: { ...style, width, height }, ...attributes }, /* @__PURE__ */ import_react.default.createElement(UniversalSuspense, { fallback: fallback2 }, showPreview ? this.renderPreview(url) : this.renderActivePlayer(url))); + } + }, __publicField(_a, "displayName", "ReactPlayer"), __publicField(_a, "propTypes", import_props.propTypes), __publicField(_a, "defaultProps", import_props.defaultProps), __publicField(_a, "addCustomPlayer", (player) => { + customPlayers.push(player); + }), __publicField(_a, "removeCustomPlayers", () => { + customPlayers.length = 0; + }), __publicField(_a, "canPlay", (url) => { + for (const Player2 of [...customPlayers, ...players]) { + if (Player2.canPlay(url)) { + return true; + } + } + return false; + }), __publicField(_a, "canEnablePIP", (url) => { + for (const Player2 of [...customPlayers, ...players]) { + if (Player2.canEnablePIP && Player2.canEnablePIP(url)) { + return true; + } + } + return false; + }), _a; +}; diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 00000000..6289942f --- /dev/null +++ b/lib/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var src_exports = {}; +__export(src_exports, { + default: () => src_default +}); +module.exports = __toCommonJS(src_exports); +var import_players = __toESM(require("./players")); +var import_ReactPlayer = require("./ReactPlayer"); +const fallback = import_players.default[import_players.default.length - 1]; +var src_default = (0, import_ReactPlayer.createReactPlayer)(import_players.default, fallback); diff --git a/lib/patterns.js b/lib/patterns.js new file mode 100644 index 00000000..5ecfde9e --- /dev/null +++ b/lib/patterns.js @@ -0,0 +1,101 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var patterns_exports = {}; +__export(patterns_exports, { + AUDIO_EXTENSIONS: () => AUDIO_EXTENSIONS, + DASH_EXTENSIONS: () => DASH_EXTENSIONS, + FLV_EXTENSIONS: () => FLV_EXTENSIONS, + HLS_EXTENSIONS: () => HLS_EXTENSIONS, + MATCH_URL_DAILYMOTION: () => MATCH_URL_DAILYMOTION, + MATCH_URL_FACEBOOK: () => MATCH_URL_FACEBOOK, + MATCH_URL_FACEBOOK_WATCH: () => MATCH_URL_FACEBOOK_WATCH, + MATCH_URL_KALTURA: () => MATCH_URL_KALTURA, + MATCH_URL_MIXCLOUD: () => MATCH_URL_MIXCLOUD, + MATCH_URL_MUX: () => MATCH_URL_MUX, + MATCH_URL_SOUNDCLOUD: () => MATCH_URL_SOUNDCLOUD, + MATCH_URL_SPOTIFY: () => MATCH_URL_SPOTIFY, + MATCH_URL_STREAMABLE: () => MATCH_URL_STREAMABLE, + MATCH_URL_TWITCH_CHANNEL: () => MATCH_URL_TWITCH_CHANNEL, + MATCH_URL_TWITCH_VIDEO: () => MATCH_URL_TWITCH_VIDEO, + MATCH_URL_VIDYARD: () => MATCH_URL_VIDYARD, + MATCH_URL_VIMEO: () => MATCH_URL_VIMEO, + MATCH_URL_WISTIA: () => MATCH_URL_WISTIA, + MATCH_URL_YOUTUBE: () => MATCH_URL_YOUTUBE, + VIDEO_EXTENSIONS: () => VIDEO_EXTENSIONS, + canPlay: () => canPlay +}); +module.exports = __toCommonJS(patterns_exports); +var import_utils = require("./utils"); +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_SOUNDCLOUD = /(?:soundcloud\.com|snd\.sc)\/[^.]+$/; +const MATCH_URL_VIMEO = /vimeo\.com\/(?!progressive_redirect).+/; +const MATCH_URL_MUX = /stream\.mux\.com\/(?!\w+\.m3u8)(\w+)/; +const MATCH_URL_FACEBOOK = /^https?:\/\/(www\.)?facebook\.com.*\/(video(s)?|watch|story)(\.php?|\/).+$/; +const MATCH_URL_FACEBOOK_WATCH = /^https?:\/\/fb\.watch\/.+$/; +const MATCH_URL_STREAMABLE = /streamable\.com\/([a-z0-9]+)$/; +const MATCH_URL_WISTIA = /(?:wistia\.(?:com|net)|wi\.st)\/(?:medias|embed)\/(?:iframe\/)?([^?]+)/; +const MATCH_URL_TWITCH_VIDEO = /(?:www\.|go\.)?twitch\.tv\/videos\/(\d+)($|\?)/; +const MATCH_URL_TWITCH_CHANNEL = /(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_]+)($|\?)/; +const MATCH_URL_DAILYMOTION = /^(?:(?:https?):)?(?:\/\/)?(?:www\.)?(?:(?:dailymotion\.com(?:\/embed)?\/video)|dai\.ly)\/([a-zA-Z0-9]+)(?:_[\w_-]+)?(?:[\w.#_-]+)?/; +const MATCH_URL_MIXCLOUD = /mixcloud\.com\/([^/]+\/[^/]+)/; +const MATCH_URL_VIDYARD = /vidyard.com\/(?:watch\/)?([a-zA-Z0-9-_]+)/; +const MATCH_URL_SPOTIFY = /spotify.+$/; +const MATCH_URL_KALTURA = /^https?:\/\/[a-zA-Z]+\.kaltura.(com|org)\/p\/([0-9]+)\/sp\/([0-9]+)00\/embedIframeJs\/uiconf_id\/([0-9]+)\/partner_id\/([0-9]+)(.*)entry_id.([a-zA-Z0-9-_].*)$/; +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 FLV_EXTENSIONS = /\.(flv)($|\?)/i; +const canPlayFile = (url) => { + if (url instanceof Array) { + for (const item of url) { + if (typeof item === "string" && canPlayFile(item)) { + return true; + } + if (canPlayFile(item.src)) { + return true; + } + } + return false; + } + if ((0, import_utils.isMediaStream)(url) || (0, import_utils.isBlobUrl)(url)) { + return true; + } + return AUDIO_EXTENSIONS.test(url) || VIDEO_EXTENSIONS.test(url) || HLS_EXTENSIONS.test(url) || DASH_EXTENSIONS.test(url) || FLV_EXTENSIONS.test(url); +}; +const canPlay = { + youtube: (url) => { + if (url instanceof Array) { + return url.every((item) => MATCH_URL_YOUTUBE.test(item)); + } + return MATCH_URL_YOUTUBE.test(url); + }, + soundcloud: (url) => MATCH_URL_SOUNDCLOUD.test(url) && !AUDIO_EXTENSIONS.test(url), + vimeo: (url) => MATCH_URL_VIMEO.test(url) && !VIDEO_EXTENSIONS.test(url) && !HLS_EXTENSIONS.test(url), + mux: (url) => MATCH_URL_MUX.test(url), + facebook: (url) => MATCH_URL_FACEBOOK.test(url) || MATCH_URL_FACEBOOK_WATCH.test(url), + streamable: (url) => MATCH_URL_STREAMABLE.test(url), + wistia: (url) => MATCH_URL_WISTIA.test(url), + twitch: (url) => MATCH_URL_TWITCH_VIDEO.test(url) || MATCH_URL_TWITCH_CHANNEL.test(url), + dailymotion: (url) => MATCH_URL_DAILYMOTION.test(url), + mixcloud: (url) => MATCH_URL_MIXCLOUD.test(url), + vidyard: (url) => MATCH_URL_VIDYARD.test(url), + kaltura: (url) => MATCH_URL_KALTURA.test(url), + file: canPlayFile, + spotify: (url) => MATCH_URL_SPOTIFY.test(url) +}; diff --git a/lib/players/DailyMotion.js b/lib/players/DailyMotion.js new file mode 100644 index 00000000..1e521161 --- /dev/null +++ b/lib/players/DailyMotion.js @@ -0,0 +1,142 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var DailyMotion_exports = {}; +__export(DailyMotion_exports, { + default: () => DailyMotion +}); +module.exports = __toCommonJS(DailyMotion_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://api.dmcdn.net/all.js"; +const SDK_GLOBAL = "DM"; +const SDK_GLOBAL_READY = "dmAsyncInit"; +class DailyMotion extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "onDurationChange", () => { + const duration = this.getDuration(); + this.props.onDuration(duration); + }); + __publicField(this, "mute", () => { + this.callPlayer("setMuted", true); + }); + __publicField(this, "unmute", () => { + this.callPlayer("setMuted", false); + }); + __publicField(this, "ref", (container) => { + this.container = container; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + const { controls, config, onError, playing } = this.props; + const [, id] = url.match(import_patterns.MATCH_URL_DAILYMOTION); + if (this.player) { + this.player.load(id, { + start: (0, import_utils.parseStartTime)(url), + autoplay: playing + }); + return; + } + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY, (DM) => DM.player).then((DM) => { + if (!this.container) + return; + const Player = DM.player; + this.player = new Player(this.container, { + width: "100%", + height: "100%", + video: id, + params: { + controls, + autoplay: this.props.playing, + mute: this.props.muted, + start: (0, import_utils.parseStartTime)(url), + origin: window.location.origin, + ...config.params + }, + events: { + apiready: this.props.onReady, + seeked: () => this.props.onSeek(this.player.currentTime), + video_end: this.props.onEnded, + durationchange: this.onDurationChange, + pause: this.props.onPause, + playing: this.props.onPlay, + waiting: this.props.onBuffer, + error: (event) => onError(event) + } + }); + }, onError); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("seek", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction); + } + getDuration() { + return this.player.duration || null; + } + getCurrentTime() { + return this.player.currentTime; + } + getSecondsLoaded() { + return this.player.bufferedTime; + } + render() { + const { display } = this.props; + const style = { + width: "100%", + height: "100%", + display + }; + return /* @__PURE__ */ import_react.default.createElement("div", { style }, /* @__PURE__ */ import_react.default.createElement("div", { ref: this.ref })); + } +} +__publicField(DailyMotion, "displayName", "DailyMotion"); +__publicField(DailyMotion, "canPlay", import_patterns.canPlay.dailymotion); +__publicField(DailyMotion, "loopOnEnded", true); diff --git a/lib/players/Facebook.js b/lib/players/Facebook.js new file mode 100644 index 00000000..70b4066d --- /dev/null +++ b/lib/players/Facebook.js @@ -0,0 +1,143 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Facebook_exports = {}; +__export(Facebook_exports, { + default: () => Facebook +}); +module.exports = __toCommonJS(Facebook_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://connect.facebook.net/en_US/sdk.js"; +const SDK_GLOBAL = "FB"; +const SDK_GLOBAL_READY = "fbAsyncInit"; +const PLAYER_ID_PREFIX = "facebook-player-"; +class Facebook extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "playerID", this.props.config.playerId || `${PLAYER_ID_PREFIX}${(0, import_utils.randomString)()}`); + __publicField(this, "mute", () => { + this.callPlayer("mute"); + }); + __publicField(this, "unmute", () => { + this.callPlayer("unmute"); + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url, isReady) { + if (isReady) { + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY).then((FB) => FB.XFBML.parse()); + return; + } + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY).then((FB) => { + FB.init({ + appId: this.props.config.appId, + xfbml: true, + version: this.props.config.version + }); + FB.Event.subscribe("xfbml.render", (msg) => { + this.props.onLoaded(); + }); + FB.Event.subscribe("xfbml.ready", (msg) => { + if (msg.type === "video" && msg.id === this.playerID) { + this.player = msg.instance; + this.player.subscribe("startedPlaying", this.props.onPlay); + this.player.subscribe("paused", this.props.onPause); + this.player.subscribe("finishedPlaying", this.props.onEnded); + this.player.subscribe("startedBuffering", this.props.onBuffer); + this.player.subscribe("finishedBuffering", this.props.onBufferEnd); + this.player.subscribe("error", this.props.onError); + if (this.props.muted) { + this.callPlayer("mute"); + } else { + this.callPlayer("unmute"); + } + this.props.onReady(); + document.getElementById(this.playerID).querySelector("iframe").style.visibility = "visible"; + } + }); + }); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("seek", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction); + } + getDuration() { + return this.callPlayer("getDuration"); + } + getCurrentTime() { + return this.callPlayer("getCurrentPosition"); + } + getSecondsLoaded() { + return null; + } + render() { + const { attributes } = this.props.config; + const style = { + width: "100%", + height: "100%" + }; + return /* @__PURE__ */ import_react.default.createElement( + "div", + { + style, + id: this.playerID, + className: "fb-video", + "data-href": this.props.url, + "data-autoplay": this.props.playing ? "true" : "false", + "data-allowfullscreen": "true", + "data-controls": this.props.controls ? "true" : "false", + ...attributes + } + ); + } +} +__publicField(Facebook, "displayName", "Facebook"); +__publicField(Facebook, "canPlay", import_patterns.canPlay.facebook); +__publicField(Facebook, "loopOnEnded", true); diff --git a/lib/players/FilePlayer.js b/lib/players/FilePlayer.js new file mode 100644 index 00000000..5d6a7bb0 --- /dev/null +++ b/lib/players/FilePlayer.js @@ -0,0 +1,372 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var FilePlayer_exports = {}; +__export(FilePlayer_exports, { + default: () => FilePlayer +}); +module.exports = __toCommonJS(FilePlayer_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const HAS_NAVIGATOR = typeof navigator !== "undefined"; +const IS_IPAD_PRO = HAS_NAVIGATOR && navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1; +const IS_IOS = HAS_NAVIGATOR && (/iPad|iPhone|iPod/.test(navigator.userAgent) || IS_IPAD_PRO) && !window.MSStream; +const IS_SAFARI = HAS_NAVIGATOR && /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && !window.MSStream; +const HLS_SDK_URL = "https://cdn.jsdelivr.net/npm/hls.js@VERSION/dist/hls.min.js"; +const HLS_GLOBAL = "Hls"; +const DASH_SDK_URL = "https://cdnjs.cloudflare.com/ajax/libs/dashjs/VERSION/dash.all.min.js"; +const DASH_GLOBAL = "dashjs"; +const FLV_SDK_URL = "https://cdn.jsdelivr.net/npm/flv.js@VERSION/dist/flv.min.js"; +const FLV_GLOBAL = "flvjs"; +const MATCH_DROPBOX_URL = /www\.dropbox\.com\/.+/; +const MATCH_CLOUDFLARE_STREAM = /https:\/\/watch\.cloudflarestream\.com\/([a-z0-9]+)/; +const REPLACE_CLOUDFLARE_STREAM = "https://videodelivery.net/{id}/manifest/video.m3u8"; +class FilePlayer extends import_react.Component { + constructor() { + super(...arguments); + // Proxy methods to prevent listener leaks + __publicField(this, "onReady", (...args) => this.props.onReady(...args)); + __publicField(this, "onPlay", (...args) => this.props.onPlay(...args)); + __publicField(this, "onBuffer", (...args) => this.props.onBuffer(...args)); + __publicField(this, "onBufferEnd", (...args) => this.props.onBufferEnd(...args)); + __publicField(this, "onPause", (...args) => this.props.onPause(...args)); + __publicField(this, "onEnded", (...args) => this.props.onEnded(...args)); + __publicField(this, "onError", (...args) => this.props.onError(...args)); + __publicField(this, "onPlayBackRateChange", (event) => this.props.onPlaybackRateChange(event.target.playbackRate)); + __publicField(this, "onEnablePIP", (...args) => this.props.onEnablePIP(...args)); + __publicField(this, "onDisablePIP", (e) => { + const { onDisablePIP, playing } = this.props; + onDisablePIP(e); + if (playing) { + this.play(); + } + }); + __publicField(this, "onPresentationModeChange", (e) => { + if (this.player && (0, import_utils.supportsWebKitPresentationMode)(this.player)) { + const { webkitPresentationMode } = this.player; + if (webkitPresentationMode === "picture-in-picture") { + this.onEnablePIP(e); + } else if (webkitPresentationMode === "inline") { + this.onDisablePIP(e); + } + } + }); + __publicField(this, "onSeek", (e) => { + this.props.onSeek(e.target.currentTime); + }); + __publicField(this, "mute", () => { + this.player.muted = true; + }); + __publicField(this, "unmute", () => { + this.player.muted = false; + }); + __publicField(this, "renderSourceElement", (source, index) => { + if (typeof source === "string") { + return /* @__PURE__ */ import_react.default.createElement("source", { key: index, src: source }); + } + return /* @__PURE__ */ import_react.default.createElement("source", { key: index, ...source }); + }); + __publicField(this, "renderTrack", (track, index) => { + return /* @__PURE__ */ import_react.default.createElement("track", { key: index, ...track }); + }); + __publicField(this, "ref", (player) => { + if (this.player) { + this.prevPlayer = this.player; + } + this.player = player; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + this.addListeners(this.player); + const src = this.getSource(this.props.url); + if (src) { + this.player.src = src; + } + if (IS_IOS || this.props.config.forceDisableHls) { + this.player.load(); + } + } + componentDidUpdate(prevProps) { + if (this.shouldUseAudio(this.props) !== this.shouldUseAudio(prevProps)) { + this.removeListeners(this.prevPlayer, prevProps.url); + this.addListeners(this.player); + } + if (this.props.url !== prevProps.url && !(0, import_utils.isMediaStream)(this.props.url) && !(this.props.url instanceof Array)) { + this.player.srcObject = null; + } + } + componentWillUnmount() { + this.player.removeAttribute("src"); + this.removeListeners(this.player); + if (this.hls) { + this.hls.destroy(); + } + } + addListeners(player) { + const { url, playsinline } = this.props; + player.addEventListener("play", this.onPlay); + player.addEventListener("waiting", this.onBuffer); + player.addEventListener("playing", this.onBufferEnd); + player.addEventListener("pause", this.onPause); + player.addEventListener("seeked", this.onSeek); + player.addEventListener("ended", this.onEnded); + player.addEventListener("error", this.onError); + player.addEventListener("ratechange", this.onPlayBackRateChange); + player.addEventListener("enterpictureinpicture", this.onEnablePIP); + player.addEventListener("leavepictureinpicture", this.onDisablePIP); + player.addEventListener("webkitpresentationmodechanged", this.onPresentationModeChange); + if (!this.shouldUseHLS(url)) { + player.addEventListener("canplay", this.onReady); + } + if (playsinline) { + player.setAttribute("playsinline", ""); + player.setAttribute("webkit-playsinline", ""); + player.setAttribute("x5-playsinline", ""); + } + } + removeListeners(player, url) { + player.removeEventListener("canplay", this.onReady); + player.removeEventListener("play", this.onPlay); + player.removeEventListener("waiting", this.onBuffer); + player.removeEventListener("playing", this.onBufferEnd); + player.removeEventListener("pause", this.onPause); + player.removeEventListener("seeked", this.onSeek); + player.removeEventListener("ended", this.onEnded); + player.removeEventListener("error", this.onError); + player.removeEventListener("ratechange", this.onPlayBackRateChange); + player.removeEventListener("enterpictureinpicture", this.onEnablePIP); + player.removeEventListener("leavepictureinpicture", this.onDisablePIP); + player.removeEventListener("webkitpresentationmodechanged", this.onPresentationModeChange); + if (!this.shouldUseHLS(url)) { + player.removeEventListener("canplay", this.onReady); + } + } + shouldUseAudio(props) { + if (props.config.forceVideo) { + return false; + } + if (props.config.attributes.poster) { + return false; + } + return import_patterns.AUDIO_EXTENSIONS.test(props.url) || props.config.forceAudio; + } + shouldUseHLS(url) { + if (IS_SAFARI && this.props.config.forceSafariHLS || this.props.config.forceHLS) { + return true; + } + if (IS_IOS || this.props.config.forceDisableHls) { + return false; + } + return import_patterns.HLS_EXTENSIONS.test(url) || MATCH_CLOUDFLARE_STREAM.test(url); + } + shouldUseDASH(url) { + return import_patterns.DASH_EXTENSIONS.test(url) || this.props.config.forceDASH; + } + shouldUseFLV(url) { + return import_patterns.FLV_EXTENSIONS.test(url) || this.props.config.forceFLV; + } + load(url) { + const { hlsVersion, hlsOptions, dashVersion, flvVersion } = this.props.config; + if (this.hls) { + this.hls.destroy(); + } + if (this.dash) { + this.dash.reset(); + } + if (this.shouldUseHLS(url)) { + (0, import_utils.getSDK)(HLS_SDK_URL.replace("VERSION", hlsVersion), HLS_GLOBAL).then((Hls) => { + this.hls = new Hls(hlsOptions); + this.hls.on(Hls.Events.MANIFEST_PARSED, () => { + this.props.onReady(); + }); + this.hls.on(Hls.Events.ERROR, (e, data) => { + this.props.onError(e, data, this.hls, Hls); + }); + if (MATCH_CLOUDFLARE_STREAM.test(url)) { + const id = url.match(MATCH_CLOUDFLARE_STREAM)[1]; + this.hls.loadSource(REPLACE_CLOUDFLARE_STREAM.replace("{id}", id)); + } else { + this.hls.loadSource(url); + } + this.hls.attachMedia(this.player); + this.props.onLoaded(); + }); + } + if (this.shouldUseDASH(url)) { + (0, import_utils.getSDK)(DASH_SDK_URL.replace("VERSION", dashVersion), DASH_GLOBAL).then((dashjs) => { + this.dash = dashjs.MediaPlayer().create(); + this.dash.initialize(this.player, url, this.props.playing); + this.dash.on("error", this.props.onError); + if (parseInt(dashVersion) < 3) { + this.dash.getDebug().setLogToBrowserConsole(false); + } else { + this.dash.updateSettings({ debug: { logLevel: dashjs.Debug.LOG_LEVEL_NONE } }); + } + this.props.onLoaded(); + }); + } + if (this.shouldUseFLV(url)) { + (0, import_utils.getSDK)(FLV_SDK_URL.replace("VERSION", flvVersion), FLV_GLOBAL).then((flvjs) => { + this.flv = flvjs.createPlayer({ type: "flv", url }); + this.flv.attachMediaElement(this.player); + this.flv.on(flvjs.Events.ERROR, (e, data) => { + this.props.onError(e, data, this.flv, flvjs); + }); + this.flv.load(); + this.props.onLoaded(); + }); + } + if (url instanceof Array) { + this.player.load(); + } else if ((0, import_utils.isMediaStream)(url)) { + try { + this.player.srcObject = url; + } catch (e) { + this.player.src = window.URL.createObjectURL(url); + } + } + } + play() { + const promise = this.player.play(); + if (promise) { + promise.catch(this.props.onError); + } + } + pause() { + this.player.pause(); + } + stop() { + this.player.removeAttribute("src"); + if (this.dash) { + this.dash.reset(); + } + } + seekTo(seconds, keepPlaying = true) { + this.player.currentTime = seconds; + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.player.volume = fraction; + } + enablePIP() { + if (this.player.requestPictureInPicture && document.pictureInPictureElement !== this.player) { + this.player.requestPictureInPicture(); + } else if ((0, import_utils.supportsWebKitPresentationMode)(this.player) && this.player.webkitPresentationMode !== "picture-in-picture") { + this.player.webkitSetPresentationMode("picture-in-picture"); + } + } + disablePIP() { + if (document.exitPictureInPicture && document.pictureInPictureElement === this.player) { + document.exitPictureInPicture(); + } else if ((0, import_utils.supportsWebKitPresentationMode)(this.player) && this.player.webkitPresentationMode !== "inline") { + this.player.webkitSetPresentationMode("inline"); + } + } + setPlaybackRate(rate) { + try { + this.player.playbackRate = rate; + } catch (error) { + this.props.onError(error); + } + } + getDuration() { + if (!this.player) + return null; + const { duration, seekable } = this.player; + if (duration === Infinity && seekable.length > 0) { + return seekable.end(seekable.length - 1); + } + return duration; + } + getCurrentTime() { + if (!this.player) + return null; + return this.player.currentTime; + } + getSecondsLoaded() { + if (!this.player) + return null; + const { buffered } = this.player; + if (buffered.length === 0) { + return 0; + } + const end = buffered.end(buffered.length - 1); + const duration = this.getDuration(); + if (end > duration) { + return duration; + } + return end; + } + getSource(url) { + const useHLS = this.shouldUseHLS(url); + const useDASH = this.shouldUseDASH(url); + const useFLV = this.shouldUseFLV(url); + if (url instanceof Array || (0, import_utils.isMediaStream)(url) || useHLS || useDASH || useFLV) { + return void 0; + } + if (MATCH_DROPBOX_URL.test(url)) { + return url.replace("www.dropbox.com", "dl.dropboxusercontent.com"); + } + return url; + } + render() { + const { url, playing, loop, controls, muted, config, width, height } = this.props; + const useAudio = this.shouldUseAudio(this.props); + const Element = useAudio ? "audio" : "video"; + const style = { + width: width === "auto" ? width : "100%", + height: height === "auto" ? height : "100%" + }; + return /* @__PURE__ */ import_react.default.createElement( + Element, + { + ref: this.ref, + src: this.getSource(url), + style, + preload: "auto", + autoPlay: playing || void 0, + controls, + muted, + loop, + ...config.attributes + }, + url instanceof Array && url.map(this.renderSourceElement), + config.tracks.map(this.renderTrack) + ); + } +} +__publicField(FilePlayer, "displayName", "FilePlayer"); +__publicField(FilePlayer, "canPlay", import_patterns.canPlay.file); diff --git a/lib/players/Kaltura.js b/lib/players/Kaltura.js new file mode 100644 index 00000000..867c5bab --- /dev/null +++ b/lib/players/Kaltura.js @@ -0,0 +1,140 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Kaltura_exports = {}; +__export(Kaltura_exports, { + default: () => Kaltura +}); +module.exports = __toCommonJS(Kaltura_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://cdn.embed.ly/player-0.1.0.min.js"; +const SDK_GLOBAL = "playerjs"; +class Kaltura extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "duration", null); + __publicField(this, "currentTime", null); + __publicField(this, "secondsLoaded", null); + __publicField(this, "mute", () => { + this.callPlayer("mute"); + }); + __publicField(this, "unmute", () => { + this.callPlayer("unmute"); + }); + __publicField(this, "ref", (iframe) => { + this.iframe = iframe; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL).then((playerjs) => { + if (!this.iframe) + return; + this.player = new playerjs.Player(this.iframe); + this.player.on("ready", () => { + setTimeout(() => { + this.player.isReady = true; + this.player.setLoop(this.props.loop); + if (this.props.muted) { + this.player.mute(); + } + this.addListeners(this.player, this.props); + this.props.onReady(); + }, 500); + }); + }, this.props.onError); + } + addListeners(player, props) { + player.on("play", props.onPlay); + player.on("pause", props.onPause); + player.on("ended", props.onEnded); + player.on("error", props.onError); + player.on("timeupdate", ({ duration, seconds }) => { + this.duration = duration; + this.currentTime = seconds; + }); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("setCurrentTime", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction); + } + setLoop(loop) { + this.callPlayer("setLoop", loop); + } + getDuration() { + return this.duration; + } + getCurrentTime() { + return this.currentTime; + } + getSecondsLoaded() { + return this.secondsLoaded; + } + render() { + const style = { + width: "100%", + height: "100%" + }; + return /* @__PURE__ */ import_react.default.createElement( + "iframe", + { + ref: this.ref, + src: this.props.url, + frameBorder: "0", + scrolling: "no", + style, + allow: "encrypted-media; autoplay; fullscreen;", + referrerPolicy: "no-referrer-when-downgrade" + } + ); + } +} +__publicField(Kaltura, "displayName", "Kaltura"); +__publicField(Kaltura, "canPlay", import_patterns.canPlay.kaltura); diff --git a/lib/players/Mixcloud.js b/lib/players/Mixcloud.js new file mode 100644 index 00000000..7a4a3d31 --- /dev/null +++ b/lib/players/Mixcloud.js @@ -0,0 +1,128 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Mixcloud_exports = {}; +__export(Mixcloud_exports, { + default: () => Mixcloud +}); +module.exports = __toCommonJS(Mixcloud_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://widget.mixcloud.com/media/js/widgetApi.js"; +const SDK_GLOBAL = "Mixcloud"; +class Mixcloud extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "duration", null); + __publicField(this, "currentTime", null); + __publicField(this, "secondsLoaded", null); + __publicField(this, "mute", () => { + }); + __publicField(this, "unmute", () => { + }); + __publicField(this, "ref", (iframe) => { + this.iframe = iframe; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL).then((Mixcloud2) => { + this.player = Mixcloud2.PlayerWidget(this.iframe); + this.player.ready.then(() => { + this.player.events.play.on(this.props.onPlay); + this.player.events.pause.on(this.props.onPause); + this.player.events.ended.on(this.props.onEnded); + this.player.events.error.on(this.props.error); + this.player.events.progress.on((seconds, duration) => { + this.currentTime = seconds; + this.duration = duration; + }); + this.props.onReady(); + }); + }, this.props.onError); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("seek", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + } + getDuration() { + return this.duration; + } + getCurrentTime() { + return this.currentTime; + } + getSecondsLoaded() { + return null; + } + render() { + const { url, config } = this.props; + const id = url.match(import_patterns.MATCH_URL_MIXCLOUD)[1]; + const style = { + width: "100%", + height: "100%" + }; + const query = (0, import_utils.queryString)({ + ...config.options, + feed: `/${id}/` + }); + return /* @__PURE__ */ import_react.default.createElement( + "iframe", + { + key: id, + ref: this.ref, + style, + src: `https://www.mixcloud.com/widget/iframe/?${query}`, + frameBorder: "0", + allow: "autoplay" + } + ); + } +} +__publicField(Mixcloud, "displayName", "Mixcloud"); +__publicField(Mixcloud, "canPlay", import_patterns.canPlay.mixcloud); +__publicField(Mixcloud, "loopOnEnded", true); diff --git a/lib/players/Mux.js b/lib/players/Mux.js new file mode 100644 index 00000000..4bff50f5 --- /dev/null +++ b/lib/players/Mux.js @@ -0,0 +1,228 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Mux_exports = {}; +__export(Mux_exports, { + default: () => Mux +}); +module.exports = __toCommonJS(Mux_exports); +var import_react = __toESM(require("react")); +var import_patterns = require("../patterns"); +const SDK_URL = "https://cdn.jsdelivr.net/npm/@mux/mux-player@VERSION/dist/mux-player.mjs"; +class Mux extends import_react.Component { + constructor() { + super(...arguments); + // Proxy methods to prevent listener leaks + __publicField(this, "onReady", (...args) => this.props.onReady(...args)); + __publicField(this, "onPlay", (...args) => this.props.onPlay(...args)); + __publicField(this, "onBuffer", (...args) => this.props.onBuffer(...args)); + __publicField(this, "onBufferEnd", (...args) => this.props.onBufferEnd(...args)); + __publicField(this, "onPause", (...args) => this.props.onPause(...args)); + __publicField(this, "onEnded", (...args) => this.props.onEnded(...args)); + __publicField(this, "onError", (...args) => this.props.onError(...args)); + __publicField(this, "onPlayBackRateChange", (event) => this.props.onPlaybackRateChange(event.target.playbackRate)); + __publicField(this, "onEnablePIP", (...args) => this.props.onEnablePIP(...args)); + __publicField(this, "onSeek", (e) => { + this.props.onSeek(e.target.currentTime); + }); + __publicField(this, "onDurationChange", () => { + const duration = this.getDuration(); + this.props.onDuration(duration); + }); + __publicField(this, "mute", () => { + this.player.muted = true; + }); + __publicField(this, "unmute", () => { + this.player.muted = false; + }); + __publicField(this, "ref", (player) => { + this.player = player; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + this.addListeners(this.player); + const playbackId = this.getPlaybackId(this.props.url); + if (playbackId) { + this.player.playbackId = playbackId; + } + } + componentWillUnmount() { + this.player.playbackId = null; + this.removeListeners(this.player); + } + addListeners(player) { + const { playsinline } = this.props; + player.addEventListener("play", this.onPlay); + player.addEventListener("waiting", this.onBuffer); + player.addEventListener("playing", this.onBufferEnd); + player.addEventListener("pause", this.onPause); + player.addEventListener("seeked", this.onSeek); + player.addEventListener("ended", this.onEnded); + player.addEventListener("error", this.onError); + player.addEventListener("ratechange", this.onPlayBackRateChange); + player.addEventListener("enterpictureinpicture", this.onEnablePIP); + player.addEventListener("leavepictureinpicture", this.onDisablePIP); + player.addEventListener("webkitpresentationmodechanged", this.onPresentationModeChange); + player.addEventListener("canplay", this.onReady); + if (playsinline) { + player.setAttribute("playsinline", ""); + } + } + removeListeners(player) { + player.removeEventListener("canplay", this.onReady); + player.removeEventListener("play", this.onPlay); + player.removeEventListener("waiting", this.onBuffer); + player.removeEventListener("playing", this.onBufferEnd); + player.removeEventListener("pause", this.onPause); + player.removeEventListener("seeked", this.onSeek); + player.removeEventListener("ended", this.onEnded); + player.removeEventListener("error", this.onError); + player.removeEventListener("ratechange", this.onPlayBackRateChange); + player.removeEventListener("enterpictureinpicture", this.onEnablePIP); + player.removeEventListener("leavepictureinpicture", this.onDisablePIP); + player.removeEventListener("canplay", this.onReady); + } + async load(url) { + var _a; + const { onError, config } = this.props; + if (!((_a = globalThis.customElements) == null ? void 0 : _a.get("mux-player"))) { + try { + const sdkUrl = SDK_URL.replace("VERSION", config.version); + await import( + /* webpackIgnore: true */ + `${sdkUrl}` + ); + this.props.onLoaded(); + } catch (error) { + onError(error); + } + } + const [, id] = url.match(import_patterns.MATCH_URL_MUX); + this.player.playbackId = id; + } + play() { + const promise = this.player.play(); + if (promise) { + promise.catch(this.props.onError); + } + } + pause() { + this.player.pause(); + } + stop() { + this.player.playbackId = null; + } + seekTo(seconds, keepPlaying = true) { + this.player.currentTime = seconds; + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.player.volume = fraction; + } + enablePIP() { + if (this.player.requestPictureInPicture && document.pictureInPictureElement !== this.player) { + this.player.requestPictureInPicture(); + } + } + disablePIP() { + if (document.exitPictureInPicture && document.pictureInPictureElement === this.player) { + document.exitPictureInPicture(); + } + } + setPlaybackRate(rate) { + try { + this.player.playbackRate = rate; + } catch (error) { + this.props.onError(error); + } + } + getDuration() { + if (!this.player) + return null; + const { duration, seekable } = this.player; + if (duration === Infinity && seekable.length > 0) { + return seekable.end(seekable.length - 1); + } + return duration; + } + getCurrentTime() { + if (!this.player) + return null; + return this.player.currentTime; + } + getSecondsLoaded() { + if (!this.player) + return null; + const { buffered } = this.player; + if (buffered.length === 0) { + return 0; + } + const end = buffered.end(buffered.length - 1); + const duration = this.getDuration(); + if (end > duration) { + return duration; + } + return end; + } + getPlaybackId(url) { + const [, id] = url.match(import_patterns.MATCH_URL_MUX); + return id; + } + render() { + const { url, playing, loop, controls, muted, config, width, height } = this.props; + const style = { + width: width === "auto" ? width : "100%", + height: height === "auto" ? height : "100%" + }; + if (controls === false) { + style["--controls"] = "none"; + } + return /* @__PURE__ */ import_react.default.createElement( + "mux-player", + { + ref: this.ref, + "playback-id": this.getPlaybackId(url), + style, + preload: "auto", + autoPlay: playing || void 0, + muted: muted ? "" : void 0, + loop: loop ? "" : void 0, + ...config.attributes + } + ); + } +} +__publicField(Mux, "displayName", "Mux"); +__publicField(Mux, "canPlay", import_patterns.canPlay.mux); diff --git a/lib/players/SoundCloud.js b/lib/players/SoundCloud.js new file mode 100644 index 00000000..cb267678 --- /dev/null +++ b/lib/players/SoundCloud.js @@ -0,0 +1,145 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var SoundCloud_exports = {}; +__export(SoundCloud_exports, { + default: () => SoundCloud +}); +module.exports = __toCommonJS(SoundCloud_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://w.soundcloud.com/player/api.js"; +const SDK_GLOBAL = "SC"; +class SoundCloud extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "duration", null); + __publicField(this, "currentTime", null); + __publicField(this, "fractionLoaded", null); + __publicField(this, "mute", () => { + this.setVolume(0); + }); + __publicField(this, "unmute", () => { + if (this.props.volume !== null) { + this.setVolume(this.props.volume); + } + }); + __publicField(this, "ref", (iframe) => { + this.iframe = iframe; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url, isReady) { + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL).then((SC) => { + if (!this.iframe) + return; + const { PLAY, PLAY_PROGRESS, PAUSE, FINISH, ERROR } = SC.Widget.Events; + if (!isReady) { + this.player = SC.Widget(this.iframe); + this.player.bind(PLAY, this.props.onPlay); + this.player.bind(PAUSE, () => { + const remaining = this.duration - this.currentTime; + if (remaining < 0.05) { + return; + } + this.props.onPause(); + }); + this.player.bind(PLAY_PROGRESS, (e) => { + this.currentTime = e.currentPosition / 1e3; + this.fractionLoaded = e.loadedProgress; + }); + this.player.bind(FINISH, () => this.props.onEnded()); + this.player.bind(ERROR, (e) => this.props.onError(e)); + } + this.player.load(url, { + ...this.props.config.options, + callback: () => { + this.player.getDuration((duration) => { + this.duration = duration / 1e3; + this.props.onReady(); + }); + } + }); + }); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("seekTo", seconds * 1e3); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction * 100); + } + getDuration() { + return this.duration; + } + getCurrentTime() { + return this.currentTime; + } + getSecondsLoaded() { + return this.fractionLoaded * this.duration; + } + render() { + const { display } = this.props; + const style = { + width: "100%", + height: "100%", + display + }; + return /* @__PURE__ */ import_react.default.createElement( + "iframe", + { + ref: this.ref, + src: `https://w.soundcloud.com/player/?url=${encodeURIComponent(this.props.url)}`, + style, + frameBorder: 0, + allow: "autoplay" + } + ); + } +} +__publicField(SoundCloud, "displayName", "SoundCloud"); +__publicField(SoundCloud, "canPlay", import_patterns.canPlay.soundcloud); +__publicField(SoundCloud, "loopOnEnded", true); diff --git a/lib/players/Spotify.js b/lib/players/Spotify.js new file mode 100644 index 00000000..754c8f24 --- /dev/null +++ b/lib/players/Spotify.js @@ -0,0 +1,147 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Spotify_exports = {}; +__export(Spotify_exports, { + default: () => Spotify +}); +module.exports = __toCommonJS(Spotify_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://open.spotify.com/embed/iframe-api/v1"; +const SDK_GLOBAL = "SpotifyIframeApi"; +const SDK_GLOBAL_READY = "SpotifyIframeApi"; +class Spotify extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "duration", null); + __publicField(this, "currentTime", null); + __publicField(this, "totalTime", null); + __publicField(this, "player", null); + __publicField(this, "initializePlayer", (IFrameAPI, url) => { + if (!this.container) + return; + const options = { + width: "100%", + height: "100%", + uri: url + }; + const callback = (EmbedController) => { + this.player = EmbedController; + this.player.addListener("playback_update", this.onStateChange); + this.player.addListener("ready", this.props.onReady); + }; + IFrameAPI.createController(this.container, options, callback); + }); + __publicField(this, "onStateChange", (event) => { + const { data } = event; + const { onPlay, onPause, onBuffer, onBufferEnd, onEnded } = this.props; + if (data.position >= data.duration && data.position && data.duration) { + onEnded(); + } + if (data.isPaused === true) + onPause(); + if (data.isPaused === false && data.isBuffering === false) { + this.currentTime = data.position; + this.totalTime = data.duration; + onPlay(); + onBufferEnd(); + } + if (data.isBuffering === true) + onBuffer(); + }); + __publicField(this, "ref", (container) => { + this.container = container; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + if (window[SDK_GLOBAL] && !this.player) { + this.initializePlayer(window[SDK_GLOBAL], url); + return; + } else if (this.player) { + this.callPlayer("loadUri", this.props.url); + return; + } + window.onSpotifyIframeApiReady = (IFrameAPI) => this.initializePlayer(IFrameAPI, url); + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY); + } + play() { + this.callPlayer("resume"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + this.callPlayer("destroy"); + } + seekTo(amount) { + this.callPlayer("seek", amount); + if (!this.props.playing) { + this.pause(); + } else { + this.play(); + } + } + setVolume(fraction) { + } + mute() { + } + unmute() { + } + setPlaybackRate(rate) { + } + setLoop(loop) { + } + getDuration() { + return this.totalTime / 1e3; + } + getCurrentTime() { + return this.currentTime / 1e3; + } + getSecondsLoaded() { + } + render() { + const style = { + width: "100%", + height: "100%" + }; + return /* @__PURE__ */ import_react.default.createElement("div", { style }, /* @__PURE__ */ import_react.default.createElement("div", { ref: this.ref })); + } +} +__publicField(Spotify, "displayName", "Spotify"); +__publicField(Spotify, "loopOnEnded", true); +__publicField(Spotify, "canPlay", import_patterns.canPlay.spotify); diff --git a/lib/players/Streamable.js b/lib/players/Streamable.js new file mode 100644 index 00000000..aafc2be2 --- /dev/null +++ b/lib/players/Streamable.js @@ -0,0 +1,138 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Streamable_exports = {}; +__export(Streamable_exports, { + default: () => Streamable +}); +module.exports = __toCommonJS(Streamable_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://cdn.embed.ly/player-0.1.0.min.js"; +const SDK_GLOBAL = "playerjs"; +class Streamable extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "duration", null); + __publicField(this, "currentTime", null); + __publicField(this, "secondsLoaded", null); + __publicField(this, "mute", () => { + this.callPlayer("mute"); + }); + __publicField(this, "unmute", () => { + this.callPlayer("unmute"); + }); + __publicField(this, "ref", (iframe) => { + this.iframe = iframe; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL).then((playerjs) => { + if (!this.iframe) + return; + this.player = new playerjs.Player(this.iframe); + this.player.setLoop(this.props.loop); + this.player.on("ready", this.props.onReady); + this.player.on("play", this.props.onPlay); + this.player.on("pause", this.props.onPause); + this.player.on("seeked", this.props.onSeek); + this.player.on("ended", this.props.onEnded); + this.player.on("error", this.props.onError); + this.player.on("timeupdate", ({ duration, seconds }) => { + this.duration = duration; + this.currentTime = seconds; + }); + this.player.on("buffered", ({ percent }) => { + if (this.duration) { + this.secondsLoaded = this.duration * percent; + } + }); + if (this.props.muted) { + this.player.mute(); + } + }, this.props.onError); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("setCurrentTime", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction * 100); + } + setLoop(loop) { + this.callPlayer("setLoop", loop); + } + getDuration() { + return this.duration; + } + getCurrentTime() { + return this.currentTime; + } + getSecondsLoaded() { + return this.secondsLoaded; + } + render() { + const id = this.props.url.match(import_patterns.MATCH_URL_STREAMABLE)[1]; + const style = { + width: "100%", + height: "100%" + }; + return /* @__PURE__ */ import_react.default.createElement( + "iframe", + { + ref: this.ref, + src: `https://streamable.com/o/${id}`, + frameBorder: "0", + scrolling: "no", + style, + allow: "encrypted-media; autoplay; fullscreen;" + } + ); + } +} +__publicField(Streamable, "displayName", "Streamable"); +__publicField(Streamable, "canPlay", import_patterns.canPlay.streamable); diff --git a/lib/players/Twitch.js b/lib/players/Twitch.js new file mode 100644 index 00000000..0f0c6a7e --- /dev/null +++ b/lib/players/Twitch.js @@ -0,0 +1,132 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Twitch_exports = {}; +__export(Twitch_exports, { + default: () => Twitch +}); +module.exports = __toCommonJS(Twitch_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://player.twitch.tv/js/embed/v1.js"; +const SDK_GLOBAL = "Twitch"; +const PLAYER_ID_PREFIX = "twitch-player-"; +class Twitch extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "playerID", this.props.config.playerId || `${PLAYER_ID_PREFIX}${(0, import_utils.randomString)()}`); + __publicField(this, "mute", () => { + this.callPlayer("setMuted", true); + }); + __publicField(this, "unmute", () => { + this.callPlayer("setMuted", false); + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url, isReady) { + const { playsinline, onError, config, controls } = this.props; + const isChannel = import_patterns.MATCH_URL_TWITCH_CHANNEL.test(url); + const id = isChannel ? url.match(import_patterns.MATCH_URL_TWITCH_CHANNEL)[1] : url.match(import_patterns.MATCH_URL_TWITCH_VIDEO)[1]; + if (isReady) { + if (isChannel) { + this.player.setChannel(id); + } else { + this.player.setVideo("v" + id); + } + return; + } + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL).then((Twitch2) => { + this.player = new Twitch2.Player(this.playerID, { + video: isChannel ? "" : id, + channel: isChannel ? id : "", + height: "100%", + width: "100%", + playsinline, + autoplay: this.props.playing, + muted: this.props.muted, + // https://github.com/CookPete/react-player/issues/733#issuecomment-549085859 + controls: isChannel ? true : controls, + time: (0, import_utils.parseStartTime)(url), + ...config.options + }); + const { READY, PLAYING, PAUSE, ENDED, ONLINE, OFFLINE, SEEK } = Twitch2.Player; + this.player.addEventListener(READY, this.props.onReady); + this.player.addEventListener(PLAYING, this.props.onPlay); + this.player.addEventListener(PAUSE, this.props.onPause); + this.player.addEventListener(ENDED, this.props.onEnded); + this.player.addEventListener(SEEK, this.props.onSeek); + this.player.addEventListener(ONLINE, this.props.onLoaded); + this.player.addEventListener(OFFLINE, this.props.onLoaded); + }, onError); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + this.callPlayer("pause"); + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("seek", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction); + } + getDuration() { + return this.callPlayer("getDuration"); + } + getCurrentTime() { + return this.callPlayer("getCurrentTime"); + } + getSecondsLoaded() { + return null; + } + render() { + const style = { + width: "100%", + height: "100%" + }; + return /* @__PURE__ */ import_react.default.createElement("div", { style, id: this.playerID }); + } +} +__publicField(Twitch, "displayName", "Twitch"); +__publicField(Twitch, "canPlay", import_patterns.canPlay.twitch); +__publicField(Twitch, "loopOnEnded", true); diff --git a/lib/players/Vidyard.js b/lib/players/Vidyard.js new file mode 100644 index 00000000..84b98725 --- /dev/null +++ b/lib/players/Vidyard.js @@ -0,0 +1,136 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Vidyard_exports = {}; +__export(Vidyard_exports, { + default: () => Vidyard +}); +module.exports = __toCommonJS(Vidyard_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://play.vidyard.com/embed/v4.js"; +const SDK_GLOBAL = "VidyardV4"; +const SDK_GLOBAL_READY = "onVidyardAPI"; +class Vidyard extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "mute", () => { + this.setVolume(0); + }); + __publicField(this, "unmute", () => { + if (this.props.volume !== null) { + this.setVolume(this.props.volume); + } + }); + __publicField(this, "ref", (container) => { + this.container = container; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + const { playing, config, onError, onDuration } = this.props; + const id = url && url.match(import_patterns.MATCH_URL_VIDYARD)[1]; + if (this.player) { + this.stop(); + } + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY).then((Vidyard2) => { + if (!this.container) + return; + Vidyard2.api.addReadyListener((data, player) => { + if (this.player) { + return; + } + this.player = player; + this.player.on("ready", this.props.onReady); + this.player.on("play", this.props.onPlay); + this.player.on("pause", this.props.onPause); + this.player.on("seek", this.props.onSeek); + this.player.on("playerComplete", this.props.onEnded); + }, id); + Vidyard2.api.renderPlayer({ + uuid: id, + container: this.container, + autoplay: playing ? 1 : 0, + ...config.options + }); + Vidyard2.api.getPlayerMetadata(id).then((meta) => { + this.duration = meta.length_in_seconds; + onDuration(meta.length_in_seconds); + }); + }, onError); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + window.VidyardV4.api.destroyPlayer(this.player); + } + seekTo(amount, keepPlaying = true) { + this.callPlayer("seek", amount); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction); + } + setPlaybackRate(rate) { + this.callPlayer("setPlaybackSpeed", rate); + } + getDuration() { + return this.duration; + } + getCurrentTime() { + return this.callPlayer("currentTime"); + } + getSecondsLoaded() { + return null; + } + render() { + const { display } = this.props; + const style = { + width: "100%", + height: "100%", + display + }; + return /* @__PURE__ */ import_react.default.createElement("div", { style }, /* @__PURE__ */ import_react.default.createElement("div", { ref: this.ref })); + } +} +__publicField(Vidyard, "displayName", "Vidyard"); +__publicField(Vidyard, "canPlay", import_patterns.canPlay.vidyard); diff --git a/lib/players/Vimeo.js b/lib/players/Vimeo.js new file mode 100644 index 00000000..30233436 --- /dev/null +++ b/lib/players/Vimeo.js @@ -0,0 +1,177 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Vimeo_exports = {}; +__export(Vimeo_exports, { + default: () => Vimeo +}); +module.exports = __toCommonJS(Vimeo_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://player.vimeo.com/api/player.js"; +const SDK_GLOBAL = "Vimeo"; +const cleanUrl = (url) => { + return url.replace("/manage/videos", ""); +}; +class Vimeo extends import_react.Component { + constructor() { + super(...arguments); + // Prevent checking isLoading when URL changes + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "duration", null); + __publicField(this, "currentTime", null); + __publicField(this, "secondsLoaded", null); + __publicField(this, "mute", () => { + this.setMuted(true); + }); + __publicField(this, "unmute", () => { + this.setMuted(false); + }); + __publicField(this, "ref", (container) => { + this.container = container; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + this.duration = null; + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL).then((Vimeo2) => { + if (!this.container) + return; + const { playerOptions, title } = this.props.config; + this.player = new Vimeo2.Player(this.container, { + url: cleanUrl(url), + autoplay: this.props.playing, + muted: this.props.muted, + loop: this.props.loop, + playsinline: this.props.playsinline, + controls: this.props.controls, + ...playerOptions + }); + this.player.ready().then(() => { + const iframe = this.container.querySelector("iframe"); + iframe.style.width = "100%"; + iframe.style.height = "100%"; + if (title) { + iframe.title = title; + } + }).catch(this.props.onError); + this.player.on("loaded", () => { + this.props.onReady(); + this.refreshDuration(); + }); + this.player.on("play", () => { + this.props.onPlay(); + this.refreshDuration(); + }); + this.player.on("pause", this.props.onPause); + this.player.on("seeked", (e) => this.props.onSeek(e.seconds)); + this.player.on("ended", this.props.onEnded); + this.player.on("error", this.props.onError); + this.player.on("timeupdate", ({ seconds }) => { + this.currentTime = seconds; + }); + this.player.on("progress", ({ seconds }) => { + this.secondsLoaded = seconds; + }); + this.player.on("bufferstart", this.props.onBuffer); + this.player.on("bufferend", this.props.onBufferEnd); + this.player.on("playbackratechange", (e) => this.props.onPlaybackRateChange(e.playbackRate)); + }, this.props.onError); + } + refreshDuration() { + this.player.getDuration().then((duration) => { + this.duration = duration; + }); + } + play() { + const promise = this.callPlayer("play"); + if (promise) { + promise.catch(this.props.onError); + } + } + pause() { + this.callPlayer("pause"); + } + stop() { + this.callPlayer("unload"); + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("setCurrentTime", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction); + } + setMuted(muted) { + this.callPlayer("setMuted", muted); + } + setLoop(loop) { + this.callPlayer("setLoop", loop); + } + setPlaybackRate(rate) { + this.callPlayer("setPlaybackRate", rate); + } + getDuration() { + return this.duration; + } + getCurrentTime() { + return this.currentTime; + } + getSecondsLoaded() { + return this.secondsLoaded; + } + render() { + const { display } = this.props; + const style = { + width: "100%", + height: "100%", + overflow: "hidden", + display + }; + return /* @__PURE__ */ import_react.default.createElement( + "div", + { + key: this.props.url, + ref: this.ref, + style + } + ); + } +} +__publicField(Vimeo, "displayName", "Vimeo"); +__publicField(Vimeo, "canPlay", import_patterns.canPlay.vimeo); +__publicField(Vimeo, "forceLoad", true); diff --git a/lib/players/Wistia.js b/lib/players/Wistia.js new file mode 100644 index 00000000..53ba633e --- /dev/null +++ b/lib/players/Wistia.js @@ -0,0 +1,152 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var Wistia_exports = {}; +__export(Wistia_exports, { + default: () => Wistia +}); +module.exports = __toCommonJS(Wistia_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://fast.wistia.com/assets/external/E-v1.js"; +const SDK_GLOBAL = "Wistia"; +const PLAYER_ID_PREFIX = "wistia-player-"; +class Wistia extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "playerID", this.props.config.playerId || `${PLAYER_ID_PREFIX}${(0, import_utils.randomString)()}`); + // Proxy methods to prevent listener leaks + __publicField(this, "onPlay", (...args) => this.props.onPlay(...args)); + __publicField(this, "onPause", (...args) => this.props.onPause(...args)); + __publicField(this, "onSeek", (...args) => this.props.onSeek(...args)); + __publicField(this, "onEnded", (...args) => this.props.onEnded(...args)); + __publicField(this, "onPlaybackRateChange", (...args) => this.props.onPlaybackRateChange(...args)); + __publicField(this, "mute", () => { + this.callPlayer("mute"); + }); + __publicField(this, "unmute", () => { + this.callPlayer("unmute"); + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + load(url) { + const { playing, muted, controls, onReady, config, onError } = this.props; + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL).then((Wistia2) => { + if (config.customControls) { + config.customControls.forEach((control) => Wistia2.defineControl(control)); + } + window._wq = window._wq || []; + window._wq.push({ + id: this.playerID, + options: { + autoPlay: playing, + silentAutoPlay: "allow", + muted, + controlsVisibleOnLoad: controls, + fullscreenButton: controls, + playbar: controls, + playbackRateControl: controls, + qualityControl: controls, + volumeControl: controls, + settingsControl: controls, + smallPlayButton: controls, + ...config.options + }, + onReady: (player) => { + this.player = player; + this.unbind(); + this.player.bind("play", this.onPlay); + this.player.bind("pause", this.onPause); + this.player.bind("seek", this.onSeek); + this.player.bind("end", this.onEnded); + this.player.bind("playbackratechange", this.onPlaybackRateChange); + onReady(); + } + }); + }, onError); + } + unbind() { + this.player.unbind("play", this.onPlay); + this.player.unbind("pause", this.onPause); + this.player.unbind("seek", this.onSeek); + this.player.unbind("end", this.onEnded); + this.player.unbind("playbackratechange", this.onPlaybackRateChange); + } + play() { + this.callPlayer("play"); + } + pause() { + this.callPlayer("pause"); + } + stop() { + this.unbind(); + this.callPlayer("remove"); + } + seekTo(seconds, keepPlaying = true) { + this.callPlayer("time", seconds); + if (!keepPlaying) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("volume", fraction); + } + setPlaybackRate(rate) { + this.callPlayer("playbackRate", rate); + } + getDuration() { + return this.callPlayer("duration"); + } + getCurrentTime() { + return this.callPlayer("time"); + } + getSecondsLoaded() { + return null; + } + render() { + const { url } = this.props; + const videoID = url && url.match(import_patterns.MATCH_URL_WISTIA)[1]; + const className = `wistia_embed wistia_async_${videoID}`; + const style = { + width: "100%", + height: "100%" + }; + return /* @__PURE__ */ import_react.default.createElement("div", { id: this.playerID, key: videoID, className, style }); + } +} +__publicField(Wistia, "displayName", "Wistia"); +__publicField(Wistia, "canPlay", import_patterns.canPlay.wistia); +__publicField(Wistia, "loopOnEnded", true); diff --git a/lib/players/YouTube.js b/lib/players/YouTube.js new file mode 100644 index 00000000..d4537cd5 --- /dev/null +++ b/lib/players/YouTube.js @@ -0,0 +1,222 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var YouTube_exports = {}; +__export(YouTube_exports, { + default: () => YouTube +}); +module.exports = __toCommonJS(YouTube_exports); +var import_react = __toESM(require("react")); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +const SDK_URL = "https://www.youtube.com/iframe_api"; +const SDK_GLOBAL = "YT"; +const SDK_GLOBAL_READY = "onYouTubeIframeAPIReady"; +const MATCH_PLAYLIST = /[?&](?:list|channel)=([a-zA-Z0-9_-]+)/; +const MATCH_USER_UPLOADS = /user\/([a-zA-Z0-9_-]+)\/?/; +const MATCH_NOCOOKIE = /youtube-nocookie\.com/; +const NOCOOKIE_HOST = "https://www.youtube-nocookie.com"; +class YouTube extends import_react.Component { + constructor() { + super(...arguments); + __publicField(this, "callPlayer", import_utils.callPlayer); + __publicField(this, "parsePlaylist", (url) => { + if (url instanceof Array) { + return { + listType: "playlist", + playlist: url.map(this.getID).join(",") + }; + } + if (MATCH_PLAYLIST.test(url)) { + const [, playlistId] = url.match(MATCH_PLAYLIST); + return { + listType: "playlist", + list: playlistId.replace(/^UC/, "UU") + }; + } + if (MATCH_USER_UPLOADS.test(url)) { + const [, username] = url.match(MATCH_USER_UPLOADS); + return { + listType: "user_uploads", + list: username + }; + } + return {}; + }); + __publicField(this, "onStateChange", (event) => { + const { data } = event; + const { onPlay, onPause, onBuffer, onBufferEnd, onEnded, onReady, loop, config: { playerVars, onUnstarted } } = this.props; + const { UNSTARTED, PLAYING, PAUSED, BUFFERING, ENDED, CUED } = window[SDK_GLOBAL].PlayerState; + if (data === UNSTARTED) + onUnstarted(); + if (data === PLAYING) { + onPlay(); + onBufferEnd(); + } + if (data === PAUSED) + onPause(); + if (data === BUFFERING) + onBuffer(); + if (data === ENDED) { + const isPlaylist = !!this.callPlayer("getPlaylist"); + if (loop && !isPlaylist) { + if (playerVars.start) { + this.seekTo(playerVars.start); + } else { + this.play(); + } + } + onEnded(); + } + if (data === CUED) + onReady(); + }); + __publicField(this, "mute", () => { + this.callPlayer("mute"); + }); + __publicField(this, "unmute", () => { + this.callPlayer("unMute"); + }); + __publicField(this, "ref", (container) => { + this.container = container; + }); + } + componentDidMount() { + this.props.onMount && this.props.onMount(this); + } + getID(url) { + if (!url || url instanceof Array || MATCH_PLAYLIST.test(url)) { + return null; + } + return url.match(import_patterns.MATCH_URL_YOUTUBE)[1]; + } + load(url, isReady) { + const { playing, muted, playsinline, controls, loop, config, onError } = this.props; + const { playerVars, embedOptions } = config; + const id = this.getID(url); + if (isReady) { + if (MATCH_PLAYLIST.test(url) || MATCH_USER_UPLOADS.test(url) || url instanceof Array) { + this.player.loadPlaylist(this.parsePlaylist(url)); + return; + } + this.player.cueVideoById({ + videoId: id, + startSeconds: (0, import_utils.parseStartTime)(url) || playerVars.start, + endSeconds: (0, import_utils.parseEndTime)(url) || playerVars.end + }); + return; + } + (0, import_utils.getSDK)(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY, (YT) => YT.loaded).then((YT) => { + if (!this.container) + return; + this.player = new YT.Player(this.container, { + width: "100%", + height: "100%", + videoId: id, + playerVars: { + autoplay: playing ? 1 : 0, + mute: muted ? 1 : 0, + controls: controls ? 1 : 0, + start: (0, import_utils.parseStartTime)(url), + end: (0, import_utils.parseEndTime)(url), + origin: window.location.origin, + playsinline: playsinline ? 1 : 0, + ...this.parsePlaylist(url), + ...playerVars + }, + events: { + onReady: () => { + if (loop) { + this.player.setLoop(true); + } + this.props.onReady(); + }, + onPlaybackRateChange: (event) => this.props.onPlaybackRateChange(event.data), + onPlaybackQualityChange: (event) => this.props.onPlaybackQualityChange(event), + onStateChange: this.onStateChange, + onError: (event) => onError(event.data) + }, + host: MATCH_NOCOOKIE.test(url) ? NOCOOKIE_HOST : void 0, + ...embedOptions + }); + }, onError); + if (embedOptions.events) { + console.warn("Using `embedOptions.events` will likely break things. Use ReactPlayer\u2019s callback props instead, eg onReady, onPlay, onPause"); + } + } + play() { + this.callPlayer("playVideo"); + } + pause() { + this.callPlayer("pauseVideo"); + } + stop() { + if (!document.body.contains(this.callPlayer("getIframe"))) + return; + this.callPlayer("stopVideo"); + } + seekTo(amount, keepPlaying = false) { + this.callPlayer("seekTo", amount); + if (!keepPlaying && !this.props.playing) { + this.pause(); + } + } + setVolume(fraction) { + this.callPlayer("setVolume", fraction * 100); + } + setPlaybackRate(rate) { + this.callPlayer("setPlaybackRate", rate); + } + setLoop(loop) { + this.callPlayer("setLoop", loop); + } + getDuration() { + return this.callPlayer("getDuration"); + } + getCurrentTime() { + return this.callPlayer("getCurrentTime"); + } + getSecondsLoaded() { + return this.callPlayer("getVideoLoadedFraction") * this.getDuration(); + } + render() { + const { display } = this.props; + const style = { + width: "100%", + height: "100%", + display + }; + return /* @__PURE__ */ import_react.default.createElement("div", { style }, /* @__PURE__ */ import_react.default.createElement("div", { ref: this.ref })); + } +} +__publicField(YouTube, "displayName", "YouTube"); +__publicField(YouTube, "canPlay", import_patterns.canPlay.youtube); diff --git a/lib/players/index.js b/lib/players/index.js new file mode 100644 index 00000000..853ee7ae --- /dev/null +++ b/lib/players/index.js @@ -0,0 +1,165 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var players_exports = {}; +__export(players_exports, { + default: () => players_default +}); +module.exports = __toCommonJS(players_exports); +var import_utils = require("../utils"); +var import_patterns = require("../patterns"); +var players_default = [ + { + key: "youtube", + name: "YouTube", + canPlay: import_patterns.canPlay.youtube, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerYouTube' */ + "./YouTube" + )) + }, + { + key: "soundcloud", + name: "SoundCloud", + canPlay: import_patterns.canPlay.soundcloud, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerSoundCloud' */ + "./SoundCloud" + )) + }, + { + key: "vimeo", + name: "Vimeo", + canPlay: import_patterns.canPlay.vimeo, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerVimeo' */ + "./Vimeo" + )) + }, + { + key: "mux", + name: "Mux", + canPlay: import_patterns.canPlay.mux, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerMux' */ + "./Mux" + )) + }, + { + key: "facebook", + name: "Facebook", + canPlay: import_patterns.canPlay.facebook, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerFacebook' */ + "./Facebook" + )) + }, + { + key: "streamable", + name: "Streamable", + canPlay: import_patterns.canPlay.streamable, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerStreamable' */ + "./Streamable" + )) + }, + { + key: "wistia", + name: "Wistia", + canPlay: import_patterns.canPlay.wistia, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerWistia' */ + "./Wistia" + )) + }, + { + key: "twitch", + name: "Twitch", + canPlay: import_patterns.canPlay.twitch, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerTwitch' */ + "./Twitch" + )) + }, + { + key: "dailymotion", + name: "DailyMotion", + canPlay: import_patterns.canPlay.dailymotion, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerDailyMotion' */ + "./DailyMotion" + )) + }, + { + key: "mixcloud", + name: "Mixcloud", + canPlay: import_patterns.canPlay.mixcloud, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerMixcloud' */ + "./Mixcloud" + )) + }, + { + key: "vidyard", + name: "Vidyard", + canPlay: import_patterns.canPlay.vidyard, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerVidyard' */ + "./Vidyard" + )) + }, + { + key: "kaltura", + name: "Kaltura", + canPlay: import_patterns.canPlay.kaltura, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerKaltura' */ + "./Kaltura" + )) + }, + { + key: "spotify", + name: "Spotify", + canPlay: import_patterns.canPlay.spotify, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerSpotify' */ + "./Spotify" + )) + }, + { + key: "file", + name: "FilePlayer", + canPlay: import_patterns.canPlay.file, + canEnablePIP: (url) => { + return import_patterns.canPlay.file(url) && (document.pictureInPictureEnabled || (0, import_utils.supportsWebKitPresentationMode)()) && !import_patterns.AUDIO_EXTENSIONS.test(url); + }, + lazyPlayer: (0, import_utils.lazy)(() => import( + /* webpackChunkName: 'reactPlayerFilePlayer' */ + "./FilePlayer" + )) + } +]; diff --git a/lib/props.js b/lib/props.js new file mode 100644 index 00000000..9681f4d4 --- /dev/null +++ b/lib/props.js @@ -0,0 +1,255 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var props_exports = {}; +__export(props_exports, { + defaultProps: () => defaultProps, + propTypes: () => propTypes +}); +module.exports = __toCommonJS(props_exports); +var import_prop_types = __toESM(require("prop-types")); +const { string, bool, number, array, oneOfType, shape, object, func, node } = import_prop_types.default; +const propTypes = { + url: oneOfType([string, array, object]), + playing: bool, + loop: bool, + controls: bool, + volume: number, + muted: bool, + playbackRate: number, + width: oneOfType([string, number]), + height: oneOfType([string, number]), + style: object, + progressInterval: number, + playsinline: bool, + pip: bool, + stopOnUnmount: bool, + light: oneOfType([bool, string, object]), + playIcon: node, + previewTabIndex: number, + previewAriaLabel: string, + fallback: node, + oEmbedUrl: string, + wrapper: oneOfType([ + string, + func, + shape({ render: func.isRequired }) + ]), + config: shape({ + soundcloud: shape({ + options: object + }), + youtube: shape({ + playerVars: object, + embedOptions: object, + onUnstarted: func + }), + facebook: shape({ + appId: string, + version: string, + playerId: string, + attributes: object + }), + dailymotion: shape({ + params: object + }), + vimeo: shape({ + playerOptions: object, + title: string + }), + mux: shape({ + attributes: object, + version: string + }), + file: shape({ + attributes: object, + tracks: array, + forceVideo: bool, + forceAudio: bool, + forceHLS: bool, + forceSafariHLS: bool, + forceDisableHls: bool, + forceDASH: bool, + forceFLV: bool, + hlsOptions: object, + hlsVersion: string, + dashVersion: string, + flvVersion: string + }), + wistia: shape({ + options: object, + playerId: string, + customControls: array + }), + mixcloud: shape({ + options: object + }), + twitch: shape({ + options: object, + playerId: string + }), + vidyard: shape({ + options: object + }) + }), + onReady: func, + onStart: func, + onPlay: func, + onPause: func, + onBuffer: func, + onBufferEnd: func, + onEnded: func, + onError: func, + onDuration: func, + onSeek: func, + onPlaybackRateChange: func, + onPlaybackQualityChange: func, + onProgress: func, + onClickPreview: func, + onEnablePIP: func, + onDisablePIP: func +}; +const noop = () => { +}; +const defaultProps = { + playing: false, + loop: false, + controls: false, + volume: null, + muted: false, + playbackRate: 1, + width: "640px", + height: "360px", + style: {}, + progressInterval: 1e3, + playsinline: false, + pip: false, + stopOnUnmount: true, + light: false, + fallback: null, + wrapper: "div", + previewTabIndex: 0, + previewAriaLabel: "", + oEmbedUrl: "https://noembed.com/embed?url={url}", + config: { + soundcloud: { + options: { + visual: true, + // Undocumented, but makes player fill container and look better + buying: false, + liking: false, + download: false, + sharing: false, + show_comments: false, + show_playcount: false + } + }, + youtube: { + playerVars: { + playsinline: 1, + showinfo: 0, + rel: 0, + iv_load_policy: 3, + modestbranding: 1 + }, + embedOptions: {}, + onUnstarted: noop + }, + facebook: { + appId: "1309697205772819", + version: "v3.3", + playerId: null, + attributes: {} + }, + dailymotion: { + params: { + api: 1, + "endscreen-enable": false + } + }, + vimeo: { + playerOptions: { + autopause: false, + byline: false, + portrait: false, + title: false + }, + title: null + }, + mux: { + attributes: {}, + version: "2" + }, + file: { + attributes: {}, + tracks: [], + forceVideo: false, + forceAudio: false, + forceHLS: false, + forceDASH: false, + forceFLV: false, + hlsOptions: {}, + hlsVersion: "1.1.4", + dashVersion: "3.1.3", + flvVersion: "1.5.0", + forceDisableHls: false + }, + wistia: { + options: {}, + playerId: null, + customControls: null + }, + mixcloud: { + options: { + hide_cover: 1 + } + }, + twitch: { + options: {}, + playerId: null + }, + vidyard: { + options: {} + } + }, + onReady: noop, + onStart: noop, + onPlay: noop, + onPause: noop, + onBuffer: noop, + onBufferEnd: noop, + onEnded: noop, + onError: noop, + onDuration: noop, + onSeek: noop, + onPlaybackRateChange: noop, + onPlaybackQualityChange: noop, + onProgress: noop, + onClickPreview: noop, + onEnablePIP: noop, + onDisablePIP: noop +}; diff --git a/lib/standalone.js b/lib/standalone.js new file mode 100644 index 00000000..393d6be6 --- /dev/null +++ b/lib/standalone.js @@ -0,0 +1,38 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var standalone_exports = {}; +__export(standalone_exports, { + default: () => renderReactPlayer +}); +module.exports = __toCommonJS(standalone_exports); +var import_react = __toESM(require("react")); +var import_react_dom = require("react-dom"); +var import_index = __toESM(require("./index")); +function renderReactPlayer(container, props) { + (0, import_react_dom.render)(/* @__PURE__ */ import_react.default.createElement(import_index.default, { ...props }), container); +} diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 00000000..6a765fc4 --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,187 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var utils_exports = {}; +__export(utils_exports, { + callPlayer: () => callPlayer, + getConfig: () => getConfig, + getSDK: () => getSDK, + isBlobUrl: () => isBlobUrl, + isMediaStream: () => isMediaStream, + lazy: () => lazy, + omit: () => omit, + parseEndTime: () => parseEndTime, + parseStartTime: () => parseStartTime, + queryString: () => queryString, + randomString: () => randomString, + supportsWebKitPresentationMode: () => supportsWebKitPresentationMode +}); +module.exports = __toCommonJS(utils_exports); +var import_react = __toESM(require("react")); +var import_load_script = __toESM(require("load-script")); +var import_deepmerge = __toESM(require("deepmerge")); +const lazy = (componentImportFn) => import_react.default.lazy(async () => { + const obj = await componentImportFn(); + return typeof obj.default === "function" ? obj : obj.default; +}); +const MATCH_START_QUERY = /[?&#](?:start|t)=([0-9hms]+)/; +const MATCH_END_QUERY = /[?&#]end=([0-9hms]+)/; +const MATCH_START_STAMP = /(\d+)(h|m|s)/g; +const MATCH_NUMERIC = /^\d+$/; +function parseTimeParam(url, pattern) { + if (url instanceof Array) { + return void 0; + } + const match = url.match(pattern); + if (match) { + const stamp = match[1]; + if (stamp.match(MATCH_START_STAMP)) { + return parseTimeString(stamp); + } + if (MATCH_NUMERIC.test(stamp)) { + return parseInt(stamp); + } + } + return void 0; +} +function parseTimeString(stamp) { + let seconds = 0; + let array = MATCH_START_STAMP.exec(stamp); + while (array !== null) { + const [, count, period] = array; + if (period === "h") + seconds += parseInt(count, 10) * 60 * 60; + if (period === "m") + seconds += parseInt(count, 10) * 60; + if (period === "s") + seconds += parseInt(count, 10); + array = MATCH_START_STAMP.exec(stamp); + } + return seconds; +} +function parseStartTime(url) { + return parseTimeParam(url, MATCH_START_QUERY); +} +function parseEndTime(url) { + return parseTimeParam(url, MATCH_END_QUERY); +} +function randomString() { + return Math.random().toString(36).substr(2, 5); +} +function queryString(object) { + return Object.keys(object).map((key) => `${key}=${object[key]}`).join("&"); +} +function getGlobal(key) { + if (window[key]) { + return window[key]; + } + if (window.exports && window.exports[key]) { + return window.exports[key]; + } + if (window.module && window.module.exports && window.module.exports[key]) { + return window.module.exports[key]; + } + return null; +} +const requests = {}; +const getSDK = enableStubOn(function getSDK2(url, sdkGlobal, sdkReady = null, isLoaded = () => true, fetchScript = import_load_script.default) { + const existingGlobal = getGlobal(sdkGlobal); + if (existingGlobal && isLoaded(existingGlobal)) { + return Promise.resolve(existingGlobal); + } + return new Promise((resolve, reject) => { + if (requests[url]) { + requests[url].push({ resolve, reject }); + return; + } + requests[url] = [{ resolve, reject }]; + const onLoaded = (sdk) => { + requests[url].forEach((request) => request.resolve(sdk)); + }; + if (sdkReady) { + const previousOnReady = window[sdkReady]; + window[sdkReady] = function() { + if (previousOnReady) + previousOnReady(); + onLoaded(getGlobal(sdkGlobal)); + }; + } + fetchScript(url, (err) => { + if (err) { + requests[url].forEach((request) => request.reject(err)); + requests[url] = null; + } else if (!sdkReady) { + onLoaded(getGlobal(sdkGlobal)); + } + }); + }); +}); +function getConfig(props, defaultProps) { + return (0, import_deepmerge.default)(defaultProps.config, props.config); +} +function omit(object, ...arrays) { + const omitKeys = [].concat(...arrays); + const output = {}; + const keys = Object.keys(object); + for (const key of keys) { + if (omitKeys.indexOf(key) === -1) { + output[key] = object[key]; + } + } + return output; +} +function callPlayer(method, ...args) { + if (!this.player || !this.player[method]) { + let message = `ReactPlayer: ${this.constructor.displayName} player could not call %c${method}%c \u2013 `; + if (!this.player) { + message += "The player was not available"; + } else if (!this.player[method]) { + message += "The method was not available"; + } + console.warn(message, "font-weight: bold", ""); + return null; + } + return this.player[method](...args); +} +function isMediaStream(url) { + return typeof window !== "undefined" && typeof window.MediaStream !== "undefined" && url instanceof window.MediaStream; +} +function isBlobUrl(url) { + return /^blob:/.test(url); +} +function supportsWebKitPresentationMode(video = document.createElement("video")) { + const notMobile = /iPhone|iPod/.test(navigator.userAgent) === false; + return video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === "function" && notMobile; +} +function enableStubOn(fn) { + if (false) { + const wrap = (...args) => wrap.stub(...args); + wrap.stub = fn; + return wrap; + } + return fn; +} diff --git a/package.json b/package.json index e1ce4aca..6892c42d 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "react-player", "version": "2.16.0", "description": "A React component for playing a variety of URLs, including file paths, YouTube, Facebook, Twitch, SoundCloud, Streamable, Vimeo, Wistia and DailyMotion", - "main": "src/index.js", - "typings": "types/lib/index.d.ts", + "main": "lib/index.js", + "typings": "lib/index.d.ts", "scripts": { "clean": "rimraf lib lazy demo coverage *.d.ts", "start": "cp -r examples/react/public/ demo & npm run build:lib --watch=forever & builder examples/react/src/index.js --format=iife --bundle --outdir=demo --watch --servedir=demo --livereload", From 64969a11374ed431680a4941b9ae8a0506b607ec Mon Sep 17 00:00:00 2001 From: Esteban Codes <33187126+3stbn@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:35:11 -0500 Subject: [PATCH 03/10] push new build --- dist/ReactPlayer.js | 2 +- dist/ReactPlayer.js.map | 8 ++-- dist/ReactPlayer.standalone.es6.js | 74 +++++++++++++++++------------- examples/react/src/App.js | 2 +- lib/players/Spotify.js | 3 +- package.json | 2 +- src/ReactPlayer.js | 2 +- src/players/Spotify.js | 3 +- 8 files changed, 54 insertions(+), 42 deletions(-) diff --git a/dist/ReactPlayer.js b/dist/ReactPlayer.js index f1b220bb..a5aba646 100644 --- a/dist/ReactPlayer.js +++ b/dist/ReactPlayer.js @@ -1,3 +1,3 @@ -var ReactPlayer=(()=>{var dr=Object.create;var oe=Object.defineProperty;var yr=Object.getOwnPropertyDescriptor;var fr=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,Pr=Object.prototype.hasOwnProperty;var gr=(t,n,e)=>n in t?oe(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e;var L=(t,n)=>()=>(t&&(n=t(t=0)),n);var V=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports),T=(t,n)=>{for(var e in n)oe(t,e,{get:n[e],enumerable:!0})},rt=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of fr(n))!Pr.call(t,o)&&o!==e&&oe(t,o,{get:()=>n[o],enumerable:!(r=yr(n,o))||r.enumerable});return t};var y=(t,n,e)=>(e=t!=null?dr(mr(t)):{},rt(n||!t||!t.__esModule?oe(e,"default",{value:t,enumerable:!0}):e,t)),br=t=>rt(oe({},"__esModule",{value:!0}),t);var s=(t,n,e)=>(gr(t,typeof n!="symbol"?n+"":n,e),e);var g=V((Ws,st)=>{st.exports=globalThis.React});var ot=V((Xs,it)=>{it.exports=function(n,e,r){var o=document.head||document.getElementsByTagName("head")[0],i=document.createElement("script");typeof e=="function"&&(r=e,e={}),e=e||{},r=r||function(){},i.type=e.type||"text/javascript",i.charset=e.charset||"utf8",i.async="async"in e?!!e.async:!0,i.src=n,e.attrs&&Er(i,e.attrs),e.text&&(i.text=""+e.text);var a="onload"in i?nt:vr;a(i,r),i.onload||nt(i,r),o.appendChild(i)};function Er(t,n){for(var e in n)t.setAttribute(e,n[e])}function nt(t,n){t.onload=function(){this.onerror=this.onload=null,n(null,t)},t.onerror=function(){this.onerror=this.onload=null,n(new Error("Failed to load "+this.src),t)}}function vr(t,n){t.onreadystatechange=function(){this.readyState!="complete"&&this.readyState!="loaded"||(this.onreadystatechange=null,n(null,t))}}});var Me=V((Zs,pt)=>{"use strict";var Lr=function(n){return wr(n)&&!Sr(n)};function wr(t){return!!t&&typeof t=="object"}function Sr(t){var n=Object.prototype.toString.call(t);return n==="[object RegExp]"||n==="[object Date]"||Ir(t)}var Tr=typeof Symbol=="function"&&Symbol.for,Rr=Tr?Symbol.for("react.element"):60103;function Ir(t){return t.$$typeof===Rr}function _r(t){return Array.isArray(t)?[]:{}}function ae(t,n){return n.clone!==!1&&n.isMergeableObject(t)?q(_r(t),t,n):t}function Dr(t,n,e){return t.concat(n).map(function(r){return ae(r,e)})}function Ar(t,n){if(!n.customMerge)return q;var e=n.customMerge(t);return typeof e=="function"?e:q}function kr(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(n){return Object.propertyIsEnumerable.call(t,n)}):[]}function at(t){return Object.keys(t).concat(kr(t))}function lt(t,n){try{return n in t}catch{return!1}}function Or(t,n){return lt(t,n)&&!(Object.hasOwnProperty.call(t,n)&&Object.propertyIsEnumerable.call(t,n))}function Cr(t,n,e){var r={};return e.isMergeableObject(t)&&at(t).forEach(function(o){r[o]=ae(t[o],e)}),at(n).forEach(function(o){Or(t,o)||(lt(t,o)&&e.isMergeableObject(n[o])?r[o]=Ar(o,e)(t[o],n[o],e):r[o]=ae(n[o],e))}),r}function q(t,n,e){e=e||{},e.arrayMerge=e.arrayMerge||Dr,e.isMergeableObject=e.isMergeableObject||Lr,e.cloneUnlessOtherwiseSpecified=ae;var r=Array.isArray(n),o=Array.isArray(t),i=r===o;return i?r?e.arrayMerge(t,n,e):Cr(t,n,e):ae(n,e)}q.all=function(n,e){if(!Array.isArray(n))throw new Error("first argument should be an array");return n.reduce(function(r,o){return q(r,o,e)},{})};var xr=q;pt.exports=xr});function ct(t,n){if(t instanceof Array)return;let e=t.match(n);if(e){let r=e[1];if(r.match(Ne))return Br(r);if(Vr.test(r))return parseInt(r)}}function Br(t){let n=0,e=Ne.exec(t);for(;e!==null;){let[,r,o]=e;o==="h"&&(n+=parseInt(r,10)*60*60),o==="m"&&(n+=parseInt(r,10)*60),o==="s"&&(n+=parseInt(r,10)),e=Ne.exec(t)}return n}function C(t){return ct(t,Ur)}function Ve(t){return ct(t,Nr)}function W(){return Math.random().toString(36).substr(2,5)}function dt(t){return Object.keys(t).map(n=>`${n}=${t[n]}`).join("&")}function Ue(t){return window[t]?window[t]:window.exports&&window.exports[t]?window.exports[t]:window.module&&window.module.exports&&window.module.exports[t]?window.module.exports[t]:null}function yt(t,...n){let e=[].concat(...n),r={},o=Object.keys(t);for(let i of o)e.indexOf(i)===-1&&(r[i]=t[i]);return r}function f(t,...n){if(!this.player||!this.player[t]){let e=`ReactPlayer: ${this.constructor.displayName} player could not call %c${t}%c \u2013 `;return this.player?this.player[t]||(e+="The method was not available"):e+="The player was not available",console.warn(e,"font-weight: bold",""),null}return this.player[t](...n)}function x(t){return typeof window!="undefined"&&typeof window.MediaStream!="undefined"&&t instanceof window.MediaStream}function ft(t){return/^blob:/.test(t)}function X(t=document.createElement("video")){let n=/iPhone|iPod/.test(navigator.userAgent)===!1;return t.webkitSupportsPresentationMode&&typeof t.webkitSetPresentationMode=="function"&&n}var ut,ht,Mr,w,Ur,Nr,Ne,Vr,G,d,b=L(()=>{ut=y(g()),ht=y(ot()),Mr=y(Me()),w=t=>ut.default.lazy(async()=>{let n=await t();return typeof n.default=="function"?n:n.default}),Ur=/[?&#](?:start|t)=([0-9hms]+)/,Nr=/[?&#]end=([0-9hms]+)/,Ne=/(\d+)(h|m|s)/g,Vr=/^\d+$/;G={},d=function(n,e,r=null,o=()=>!0,i=ht.default){let a=Ue(e);return a&&o(a)?Promise.resolve(a):new Promise((l,p)=>{if(G[n]){G[n].push({resolve:l,reject:p});return}G[n]=[{resolve:l,reject:p}];let h=u=>{G[n].forEach(m=>m.resolve(u))};if(r){let u=window[r];window[r]=function(){u&&u(),h(Ue(e))}}i(n,u=>{u?(G[n].forEach(m=>m.reject(u)),G[n]=null):r||h(Ue(e))})})}});var ye,Hr,jr,fe,Kr,zr,He,je,Ke,me,ze,$e,Fe,$r,Z,mt,Pe,Ye,qe,Be,c,R=L(()=>{b();ye=/(?:youtu\.be\/|youtube(?:-nocookie|education)?\.com\/(?:embed\/|v\/|watch\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((\w|-){11})|youtube\.com\/playlist\?list=|youtube\.com\/user\//,Hr=/(?:soundcloud\.com|snd\.sc)\/[^.]+$/,jr=/vimeo\.com\/(?!progressive_redirect).+/,fe=/stream\.mux\.com\/(?!\w+\.m3u8)(\w+)/,Kr=/^https?:\/\/(www\.)?facebook\.com.*\/(video(s)?|watch|story)(\.php?|\/).+$/,zr=/^https?:\/\/fb\.watch\/.+$/,He=/streamable\.com\/([a-z0-9]+)$/,je=/(?:wistia\.(?:com|net)|wi\.st)\/(?:medias|embed)\/(?:iframe\/)?([^?]+)/,Ke=/(?:www\.|go\.)?twitch\.tv\/videos\/(\d+)($|\?)/,me=/(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_]+)($|\?)/,ze=/^(?:(?:https?):)?(?:\/\/)?(?:www\.)?(?:(?:dailymotion\.com(?:\/embed)?\/video)|dai\.ly)\/([a-zA-Z0-9]+)(?:_[\w_-]+)?(?:[\w.#_-]+)?/,$e=/mixcloud\.com\/([^/]+\/[^/]+)/,Fe=/vidyard.com\/(?:watch\/)?([a-zA-Z0-9-_]+)/,$r=/^https?:\/\/[a-zA-Z]+\.kaltura.(com|org)\/p\/([0-9]+)\/sp\/([0-9]+)00\/embedIframeJs\/uiconf_id\/([0-9]+)\/partner_id\/([0-9]+)(.*)entry_id.([a-zA-Z0-9-_].*)$/,Z=/\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i,mt=/\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i,Pe=/\.(m3u8)($|\?)/i,Ye=/\.(mpd)($|\?)/i,qe=/\.(flv)($|\?)/i,Be=t=>{if(t instanceof Array){for(let n of t)if(typeof n=="string"&&Be(n)||Be(n.src))return!0;return!1}return x(t)||ft(t)?!0:Z.test(t)||mt.test(t)||Pe.test(t)||Ye.test(t)||qe.test(t)},c={youtube:t=>t instanceof Array?t.every(n=>ye.test(n)):ye.test(t),soundcloud:t=>Hr.test(t)&&!Z.test(t),vimeo:t=>jr.test(t)&&!mt.test(t)&&!Pe.test(t),mux:t=>fe.test(t),facebook:t=>Kr.test(t)||zr.test(t),streamable:t=>He.test(t),wistia:t=>je.test(t),twitch:t=>Ke.test(t)||me.test(t),dailymotion:t=>ze.test(t),mixcloud:t=>$e.test(t),vidyard:t=>Fe.test(t),kaltura:t=>$r.test(t),file:Be}});var gt={};T(gt,{default:()=>Q});var le,Fr,Pt,Yr,ge,Ge,qr,Gr,Q,bt=L(()=>{le=y(g());b();R();Fr="https://www.youtube.com/iframe_api",Pt="YT",Yr="onYouTubeIframeAPIReady",ge=/[?&](?:list|channel)=([a-zA-Z0-9_-]+)/,Ge=/user\/([a-zA-Z0-9_-]+)\/?/,qr=/youtube-nocookie\.com/,Gr="https://www.youtube-nocookie.com",Q=class extends le.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"parsePlaylist",e=>{if(e instanceof Array)return{listType:"playlist",playlist:e.map(this.getID).join(",")};if(ge.test(e)){let[,r]=e.match(ge);return{listType:"playlist",list:r.replace(/^UC/,"UU")}}if(Ge.test(e)){let[,r]=e.match(Ge);return{listType:"user_uploads",list:r}}return{}});s(this,"onStateChange",e=>{let{data:r}=e,{onPlay:o,onPause:i,onBuffer:a,onBufferEnd:l,onEnded:p,onReady:h,loop:u,config:{playerVars:m,onUnstarted:D}}=this.props,{UNSTARTED:O,PLAYING:N,PAUSED:A,BUFFERING:Ce,ENDED:xe,CUED:hr}=window[Pt].PlayerState;if(r===O&&D(),r===N&&(o(),l()),r===A&&i(),r===Ce&&a(),r===xe){let cr=!!this.callPlayer("getPlaylist");u&&!cr&&(m.start?this.seekTo(m.start):this.play()),p()}r===hr&&h()});s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unMute")});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}getID(e){return!e||e instanceof Array||ge.test(e)?null:e.match(ye)[1]}load(e,r){let{playing:o,muted:i,playsinline:a,controls:l,loop:p,config:h,onError:u}=this.props,{playerVars:m,embedOptions:D}=h,O=this.getID(e);if(r){if(ge.test(e)||Ge.test(e)||e instanceof Array){this.player.loadPlaylist(this.parsePlaylist(e));return}this.player.cueVideoById({videoId:O,startSeconds:C(e)||m.start,endSeconds:Ve(e)||m.end});return}d(Fr,Pt,Yr,N=>N.loaded).then(N=>{this.container&&(this.player=new N.Player(this.container,{width:"100%",height:"100%",videoId:O,playerVars:{autoplay:o?1:0,mute:i?1:0,controls:l?1:0,start:C(e),end:Ve(e),origin:window.location.origin,playsinline:a?1:0,...this.parsePlaylist(e),...m},events:{onReady:()=>{p&&this.player.setLoop(!0),this.props.onReady()},onPlaybackRateChange:A=>this.props.onPlaybackRateChange(A.data),onPlaybackQualityChange:A=>this.props.onPlaybackQualityChange(A),onStateChange:this.onStateChange,onError:A=>u(A.data)},host:qr.test(e)?Gr:void 0,...D}))},u),D.events&&console.warn("Using `embedOptions.events` will likely break things. Use ReactPlayer\u2019s callback props instead, eg onReady, onPlay, onPause")}play(){this.callPlayer("playVideo")}pause(){this.callPlayer("pauseVideo")}stop(){document.body.contains(this.callPlayer("getIframe"))&&this.callPlayer("stopVideo")}seekTo(e,r=!1){this.callPlayer("seekTo",e),!r&&!this.props.playing&&this.pause()}setVolume(e){this.callPlayer("setVolume",e*100)}setPlaybackRate(e){this.callPlayer("setPlaybackRate",e)}setLoop(e){this.callPlayer("setLoop",e)}getDuration(){return this.callPlayer("getDuration")}getCurrentTime(){return this.callPlayer("getCurrentTime")}getSecondsLoaded(){return this.callPlayer("getVideoLoadedFraction")*this.getDuration()}render(){let{display:e}=this.props;return le.default.createElement("div",{style:{width:"100%",height:"100%",display:e}},le.default.createElement("div",{ref:this.ref}))}};s(Q,"displayName","YouTube"),s(Q,"canPlay",c.youtube)});var Et={};T(Et,{default:()=>B});var be,Wr,Xr,B,vt=L(()=>{be=y(g());b();R();Wr="https://w.soundcloud.com/player/api.js",Xr="SC",B=class extends be.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"fractionLoaded",null);s(this,"mute",()=>{this.setVolume(0)});s(this,"unmute",()=>{this.props.volume!==null&&this.setVolume(this.props.volume)});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e,r){d(Wr,Xr).then(o=>{if(!this.iframe)return;let{PLAY:i,PLAY_PROGRESS:a,PAUSE:l,FINISH:p,ERROR:h}=o.Widget.Events;r||(this.player=o.Widget(this.iframe),this.player.bind(i,this.props.onPlay),this.player.bind(l,()=>{this.duration-this.currentTime<.05||this.props.onPause()}),this.player.bind(a,u=>{this.currentTime=u.currentPosition/1e3,this.fractionLoaded=u.loadedProgress}),this.player.bind(p,()=>this.props.onEnded()),this.player.bind(h,u=>this.props.onError(u))),this.player.load(e,{...this.props.config.options,callback:()=>{this.player.getDuration(u=>{this.duration=u/1e3,this.props.onReady()})}})})}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seekTo",e*1e3),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e*100)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.fractionLoaded*this.duration}render(){let{display:e}=this.props,r={width:"100%",height:"100%",display:e};return be.default.createElement("iframe",{ref:this.ref,src:`https://w.soundcloud.com/player/?url=${encodeURIComponent(this.props.url)}`,style:r,frameBorder:0,allow:"autoplay"})}};s(B,"displayName","SoundCloud"),s(B,"canPlay",c.soundcloud),s(B,"loopOnEnded",!0)});var Lt={};T(Lt,{default:()=>H});var Ee,Zr,Qr,Jr,H,wt=L(()=>{Ee=y(g());b();R();Zr="https://player.vimeo.com/api/player.js",Qr="Vimeo",Jr=t=>t.replace("/manage/videos",""),H=class extends Ee.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{this.setMuted(!0)});s(this,"unmute",()=>{this.setMuted(!1)});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){this.duration=null,d(Zr,Qr).then(r=>{if(!this.container)return;let{playerOptions:o,title:i}=this.props.config;this.player=new r.Player(this.container,{url:Jr(e),autoplay:this.props.playing,muted:this.props.muted,loop:this.props.loop,playsinline:this.props.playsinline,controls:this.props.controls,...o}),this.player.ready().then(()=>{let a=this.container.querySelector("iframe");a.style.width="100%",a.style.height="100%",i&&(a.title=i)}).catch(this.props.onError),this.player.on("loaded",()=>{this.props.onReady(),this.refreshDuration()}),this.player.on("play",()=>{this.props.onPlay(),this.refreshDuration()}),this.player.on("pause",this.props.onPause),this.player.on("seeked",a=>this.props.onSeek(a.seconds)),this.player.on("ended",this.props.onEnded),this.player.on("error",this.props.onError),this.player.on("timeupdate",({seconds:a})=>{this.currentTime=a}),this.player.on("progress",({seconds:a})=>{this.secondsLoaded=a}),this.player.on("bufferstart",this.props.onBuffer),this.player.on("bufferend",this.props.onBufferEnd),this.player.on("playbackratechange",a=>this.props.onPlaybackRateChange(a.playbackRate))},this.props.onError)}refreshDuration(){this.player.getDuration().then(e=>{this.duration=e})}play(){let e=this.callPlayer("play");e&&e.catch(this.props.onError)}pause(){this.callPlayer("pause")}stop(){this.callPlayer("unload")}seekTo(e,r=!0){this.callPlayer("setCurrentTime",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}setMuted(e){this.callPlayer("setMuted",e)}setLoop(e){this.callPlayer("setLoop",e)}setPlaybackRate(e){this.callPlayer("setPlaybackRate",e)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.secondsLoaded}render(){let{display:e}=this.props,r={width:"100%",height:"100%",overflow:"hidden",display:e};return Ee.default.createElement("div",{key:this.props.url,ref:this.ref,style:r})}};s(H,"displayName","Vimeo"),s(H,"canPlay",c.vimeo),s(H,"forceLoad",!0)});var St={};T(St,{default:()=>J});var ve,es,J,Tt=L(()=>{ve=y(g());R();es="https://cdn.jsdelivr.net/npm/@mux/mux-player@VERSION/dist/mux-player.mjs",J=class extends ve.Component{constructor(){super(...arguments);s(this,"onReady",(...e)=>this.props.onReady(...e));s(this,"onPlay",(...e)=>this.props.onPlay(...e));s(this,"onBuffer",(...e)=>this.props.onBuffer(...e));s(this,"onBufferEnd",(...e)=>this.props.onBufferEnd(...e));s(this,"onPause",(...e)=>this.props.onPause(...e));s(this,"onEnded",(...e)=>this.props.onEnded(...e));s(this,"onError",(...e)=>this.props.onError(...e));s(this,"onPlayBackRateChange",e=>this.props.onPlaybackRateChange(e.target.playbackRate));s(this,"onEnablePIP",(...e)=>this.props.onEnablePIP(...e));s(this,"onSeek",e=>{this.props.onSeek(e.target.currentTime)});s(this,"onDurationChange",()=>{let e=this.getDuration();this.props.onDuration(e)});s(this,"mute",()=>{this.player.muted=!0});s(this,"unmute",()=>{this.player.muted=!1});s(this,"ref",e=>{this.player=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this),this.addListeners(this.player);let e=this.getPlaybackId(this.props.url);e&&(this.player.playbackId=e)}componentWillUnmount(){this.player.playbackId=null,this.removeListeners(this.player)}addListeners(e){let{playsinline:r}=this.props;e.addEventListener("play",this.onPlay),e.addEventListener("waiting",this.onBuffer),e.addEventListener("playing",this.onBufferEnd),e.addEventListener("pause",this.onPause),e.addEventListener("seeked",this.onSeek),e.addEventListener("ended",this.onEnded),e.addEventListener("error",this.onError),e.addEventListener("ratechange",this.onPlayBackRateChange),e.addEventListener("enterpictureinpicture",this.onEnablePIP),e.addEventListener("leavepictureinpicture",this.onDisablePIP),e.addEventListener("webkitpresentationmodechanged",this.onPresentationModeChange),e.addEventListener("canplay",this.onReady),r&&e.setAttribute("playsinline","")}removeListeners(e){e.removeEventListener("canplay",this.onReady),e.removeEventListener("play",this.onPlay),e.removeEventListener("waiting",this.onBuffer),e.removeEventListener("playing",this.onBufferEnd),e.removeEventListener("pause",this.onPause),e.removeEventListener("seeked",this.onSeek),e.removeEventListener("ended",this.onEnded),e.removeEventListener("error",this.onError),e.removeEventListener("ratechange",this.onPlayBackRateChange),e.removeEventListener("enterpictureinpicture",this.onEnablePIP),e.removeEventListener("leavepictureinpicture",this.onDisablePIP),e.removeEventListener("canplay",this.onReady)}async load(e){var a;let{onError:r,config:o}=this.props;if(!((a=globalThis.customElements)!=null&&a.get("mux-player")))try{await import(`${es.replace("VERSION",o.version)}`),this.props.onLoaded()}catch(l){r(l)}let[,i]=e.match(fe);this.player.playbackId=i}play(){let e=this.player.play();e&&e.catch(this.props.onError)}pause(){this.player.pause()}stop(){this.player.playbackId=null}seekTo(e,r=!0){this.player.currentTime=e,r||this.pause()}setVolume(e){this.player.volume=e}enablePIP(){this.player.requestPictureInPicture&&document.pictureInPictureElement!==this.player&&this.player.requestPictureInPicture()}disablePIP(){document.exitPictureInPicture&&document.pictureInPictureElement===this.player&&document.exitPictureInPicture()}setPlaybackRate(e){try{this.player.playbackRate=e}catch(r){this.props.onError(r)}}getDuration(){if(!this.player)return null;let{duration:e,seekable:r}=this.player;return e===1/0&&r.length>0?r.end(r.length-1):e}getCurrentTime(){return this.player?this.player.currentTime:null}getSecondsLoaded(){if(!this.player)return null;let{buffered:e}=this.player;if(e.length===0)return 0;let r=e.end(e.length-1),o=this.getDuration();return r>o?o:r}getPlaybackId(e){let[,r]=e.match(fe);return r}render(){let{url:e,playing:r,loop:o,controls:i,muted:a,config:l,width:p,height:h}=this.props,u={width:p==="auto"?p:"100%",height:h==="auto"?h:"100%"};return i===!1&&(u["--controls"]="none"),ve.default.createElement("mux-player",{ref:this.ref,"playback-id":this.getPlaybackId(e),style:u,preload:"auto",autoPlay:r||void 0,muted:a?"":void 0,loop:o?"":void 0,...l.attributes})}};s(J,"displayName","Mux"),s(J,"canPlay",c.mux)});var Dt={};T(Dt,{default:()=>j});var Le,Rt,It,_t,ts,j,At=L(()=>{Le=y(g());b();R();Rt="https://connect.facebook.net/en_US/sdk.js",It="FB",_t="fbAsyncInit",ts="facebook-player-",j=class extends Le.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"playerID",this.props.config.playerId||`${ts}${W()}`);s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e,r){if(r){d(Rt,It,_t).then(o=>o.XFBML.parse());return}d(Rt,It,_t).then(o=>{o.init({appId:this.props.config.appId,xfbml:!0,version:this.props.config.version}),o.Event.subscribe("xfbml.render",i=>{this.props.onLoaded()}),o.Event.subscribe("xfbml.ready",i=>{i.type==="video"&&i.id===this.playerID&&(this.player=i.instance,this.player.subscribe("startedPlaying",this.props.onPlay),this.player.subscribe("paused",this.props.onPause),this.player.subscribe("finishedPlaying",this.props.onEnded),this.player.subscribe("startedBuffering",this.props.onBuffer),this.player.subscribe("finishedBuffering",this.props.onBufferEnd),this.player.subscribe("error",this.props.onError),this.props.muted?this.callPlayer("mute"):this.callPlayer("unmute"),this.props.onReady(),document.getElementById(this.playerID).querySelector("iframe").style.visibility="visible")})})}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}getDuration(){return this.callPlayer("getDuration")}getCurrentTime(){return this.callPlayer("getCurrentPosition")}getSecondsLoaded(){return null}render(){let{attributes:e}=this.props.config;return Le.default.createElement("div",{style:{width:"100%",height:"100%"},id:this.playerID,className:"fb-video","data-href":this.props.url,"data-autoplay":this.props.playing?"true":"false","data-allowfullscreen":"true","data-controls":this.props.controls?"true":"false",...e})}};s(j,"displayName","Facebook"),s(j,"canPlay",c.facebook),s(j,"loopOnEnded",!0)});var kt={};T(kt,{default:()=>ee});var we,rs,ss,ee,Ot=L(()=>{we=y(g());b();R();rs="https://cdn.embed.ly/player-0.1.0.min.js",ss="playerjs",ee=class extends we.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){d(rs,ss).then(r=>{this.iframe&&(this.player=new r.Player(this.iframe),this.player.setLoop(this.props.loop),this.player.on("ready",this.props.onReady),this.player.on("play",this.props.onPlay),this.player.on("pause",this.props.onPause),this.player.on("seeked",this.props.onSeek),this.player.on("ended",this.props.onEnded),this.player.on("error",this.props.onError),this.player.on("timeupdate",({duration:o,seconds:i})=>{this.duration=o,this.currentTime=i}),this.player.on("buffered",({percent:o})=>{this.duration&&(this.secondsLoaded=this.duration*o)}),this.props.muted&&this.player.mute())},this.props.onError)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("setCurrentTime",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e*100)}setLoop(e){this.callPlayer("setLoop",e)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.secondsLoaded}render(){let e=this.props.url.match(He)[1],r={width:"100%",height:"100%"};return we.default.createElement("iframe",{ref:this.ref,src:`https://streamable.com/o/${e}`,frameBorder:"0",scrolling:"no",style:r,allow:"encrypted-media; autoplay; fullscreen;"})}};s(ee,"displayName","Streamable"),s(ee,"canPlay",c.streamable)});var Ct={};T(Ct,{default:()=>K});var Se,ns,is,os,K,xt=L(()=>{Se=y(g());b();R();ns="https://fast.wistia.com/assets/external/E-v1.js",is="Wistia",os="wistia-player-",K=class extends Se.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"playerID",this.props.config.playerId||`${os}${W()}`);s(this,"onPlay",(...e)=>this.props.onPlay(...e));s(this,"onPause",(...e)=>this.props.onPause(...e));s(this,"onSeek",(...e)=>this.props.onSeek(...e));s(this,"onEnded",(...e)=>this.props.onEnded(...e));s(this,"onPlaybackRateChange",(...e)=>this.props.onPlaybackRateChange(...e));s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){let{playing:r,muted:o,controls:i,onReady:a,config:l,onError:p}=this.props;d(ns,is).then(h=>{l.customControls&&l.customControls.forEach(u=>h.defineControl(u)),window._wq=window._wq||[],window._wq.push({id:this.playerID,options:{autoPlay:r,silentAutoPlay:"allow",muted:o,controlsVisibleOnLoad:i,fullscreenButton:i,playbar:i,playbackRateControl:i,qualityControl:i,volumeControl:i,settingsControl:i,smallPlayButton:i,...l.options},onReady:u=>{this.player=u,this.unbind(),this.player.bind("play",this.onPlay),this.player.bind("pause",this.onPause),this.player.bind("seek",this.onSeek),this.player.bind("end",this.onEnded),this.player.bind("playbackratechange",this.onPlaybackRateChange),a()}})},p)}unbind(){this.player.unbind("play",this.onPlay),this.player.unbind("pause",this.onPause),this.player.unbind("seek",this.onSeek),this.player.unbind("end",this.onEnded),this.player.unbind("playbackratechange",this.onPlaybackRateChange)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){this.unbind(),this.callPlayer("remove")}seekTo(e,r=!0){this.callPlayer("time",e),r||this.pause()}setVolume(e){this.callPlayer("volume",e)}setPlaybackRate(e){this.callPlayer("playbackRate",e)}getDuration(){return this.callPlayer("duration")}getCurrentTime(){return this.callPlayer("time")}getSecondsLoaded(){return null}render(){let{url:e}=this.props,r=e&&e.match(je)[1],o=`wistia_embed wistia_async_${r}`,i={width:"100%",height:"100%"};return Se.default.createElement("div",{id:this.playerID,key:r,className:o,style:i})}};s(K,"displayName","Wistia"),s(K,"canPlay",c.wistia),s(K,"loopOnEnded",!0)});var Mt={};T(Mt,{default:()=>z});var Te,as,ls,ps,z,Ut=L(()=>{Te=y(g());b();R();as="https://player.twitch.tv/js/embed/v1.js",ls="Twitch",ps="twitch-player-",z=class extends Te.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"playerID",this.props.config.playerId||`${ps}${W()}`);s(this,"mute",()=>{this.callPlayer("setMuted",!0)});s(this,"unmute",()=>{this.callPlayer("setMuted",!1)})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e,r){let{playsinline:o,onError:i,config:a,controls:l}=this.props,p=me.test(e),h=p?e.match(me)[1]:e.match(Ke)[1];if(r){p?this.player.setChannel(h):this.player.setVideo("v"+h);return}d(as,ls).then(u=>{this.player=new u.Player(this.playerID,{video:p?"":h,channel:p?h:"",height:"100%",width:"100%",playsinline:o,autoplay:this.props.playing,muted:this.props.muted,controls:p?!0:l,time:C(e),...a.options});let{READY:m,PLAYING:D,PAUSE:O,ENDED:N,ONLINE:A,OFFLINE:Ce,SEEK:xe}=u.Player;this.player.addEventListener(m,this.props.onReady),this.player.addEventListener(D,this.props.onPlay),this.player.addEventListener(O,this.props.onPause),this.player.addEventListener(N,this.props.onEnded),this.player.addEventListener(xe,this.props.onSeek),this.player.addEventListener(A,this.props.onLoaded),this.player.addEventListener(Ce,this.props.onLoaded)},i)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){this.callPlayer("pause")}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}getDuration(){return this.callPlayer("getDuration")}getCurrentTime(){return this.callPlayer("getCurrentTime")}getSecondsLoaded(){return null}render(){return Te.default.createElement("div",{style:{width:"100%",height:"100%"},id:this.playerID})}};s(z,"displayName","Twitch"),s(z,"canPlay",c.twitch),s(z,"loopOnEnded",!0)});var Nt={};T(Nt,{default:()=>$});var pe,us,hs,cs,$,Vt=L(()=>{pe=y(g());b();R();us="https://api.dmcdn.net/all.js",hs="DM",cs="dmAsyncInit",$=class extends pe.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"onDurationChange",()=>{let e=this.getDuration();this.props.onDuration(e)});s(this,"mute",()=>{this.callPlayer("setMuted",!0)});s(this,"unmute",()=>{this.callPlayer("setMuted",!1)});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){let{controls:r,config:o,onError:i,playing:a}=this.props,[,l]=e.match(ze);if(this.player){this.player.load(l,{start:C(e),autoplay:a});return}d(us,hs,cs,p=>p.player).then(p=>{if(!this.container)return;let h=p.player;this.player=new h(this.container,{width:"100%",height:"100%",video:l,params:{controls:r,autoplay:this.props.playing,mute:this.props.muted,start:C(e),origin:window.location.origin,...o.params},events:{apiready:this.props.onReady,seeked:()=>this.props.onSeek(this.player.currentTime),video_end:this.props.onEnded,durationchange:this.onDurationChange,pause:this.props.onPause,playing:this.props.onPlay,waiting:this.props.onBuffer,error:u=>i(u)}})},i)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}getDuration(){return this.player.duration||null}getCurrentTime(){return this.player.currentTime}getSecondsLoaded(){return this.player.bufferedTime}render(){let{display:e}=this.props;return pe.default.createElement("div",{style:{width:"100%",height:"100%",display:e}},pe.default.createElement("div",{ref:this.ref}))}};s($,"displayName","DailyMotion"),s($,"canPlay",c.dailymotion),s($,"loopOnEnded",!0)});var Bt={};T(Bt,{default:()=>F});var Re,ds,ys,F,Ht=L(()=>{Re=y(g());b();R();ds="https://widget.mixcloud.com/media/js/widgetApi.js",ys="Mixcloud",F=class extends Re.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{});s(this,"unmute",()=>{});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){d(ds,ys).then(r=>{this.player=r.PlayerWidget(this.iframe),this.player.ready.then(()=>{this.player.events.play.on(this.props.onPlay),this.player.events.pause.on(this.props.onPause),this.player.events.ended.on(this.props.onEnded),this.player.events.error.on(this.props.error),this.player.events.progress.on((o,i)=>{this.currentTime=o,this.duration=i}),this.props.onReady()})},this.props.onError)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return null}render(){let{url:e,config:r}=this.props,o=e.match($e)[1],i={width:"100%",height:"100%"},a=dt({...r.options,feed:`/${o}/`});return Re.default.createElement("iframe",{key:o,ref:this.ref,style:i,src:`https://www.mixcloud.com/widget/iframe/?${a}`,frameBorder:"0",allow:"autoplay"})}};s(F,"displayName","Mixcloud"),s(F,"canPlay",c.mixcloud),s(F,"loopOnEnded",!0)});var jt={};T(jt,{default:()=>te});var ue,fs,ms,Ps,te,Kt=L(()=>{ue=y(g());b();R();fs="https://play.vidyard.com/embed/v4.js",ms="VidyardV4",Ps="onVidyardAPI",te=class extends ue.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"mute",()=>{this.setVolume(0)});s(this,"unmute",()=>{this.props.volume!==null&&this.setVolume(this.props.volume)});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){let{playing:r,config:o,onError:i,onDuration:a}=this.props,l=e&&e.match(Fe)[1];this.player&&this.stop(),d(fs,ms,Ps).then(p=>{this.container&&(p.api.addReadyListener((h,u)=>{this.player||(this.player=u,this.player.on("ready",this.props.onReady),this.player.on("play",this.props.onPlay),this.player.on("pause",this.props.onPause),this.player.on("seek",this.props.onSeek),this.player.on("playerComplete",this.props.onEnded))},l),p.api.renderPlayer({uuid:l,container:this.container,autoplay:r?1:0,...o.options}),p.api.getPlayerMetadata(l).then(h=>{this.duration=h.length_in_seconds,a(h.length_in_seconds)}))},i)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){window.VidyardV4.api.destroyPlayer(this.player)}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}setPlaybackRate(e){this.callPlayer("setPlaybackSpeed",e)}getDuration(){return this.duration}getCurrentTime(){return this.callPlayer("currentTime")}getSecondsLoaded(){return null}render(){let{display:e}=this.props;return ue.default.createElement("div",{style:{width:"100%",height:"100%",display:e}},ue.default.createElement("div",{ref:this.ref}))}};s(te,"displayName","Vidyard"),s(te,"canPlay",c.vidyard)});var zt={};T(zt,{default:()=>re});var Ie,gs,bs,re,$t=L(()=>{Ie=y(g());b();R();gs="https://cdn.embed.ly/player-0.1.0.min.js",bs="playerjs",re=class extends Ie.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){d(gs,bs).then(r=>{this.iframe&&(this.player=new r.Player(this.iframe),this.player.on("ready",()=>{setTimeout(()=>{this.player.isReady=!0,this.player.setLoop(this.props.loop),this.props.muted&&this.player.mute(),this.addListeners(this.player,this.props),this.props.onReady()},500)}))},this.props.onError)}addListeners(e,r){e.on("play",r.onPlay),e.on("pause",r.onPause),e.on("ended",r.onEnded),e.on("error",r.onError),e.on("timeupdate",({duration:o,seconds:i})=>{this.duration=o,this.currentTime=i})}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("setCurrentTime",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}setLoop(e){this.callPlayer("setLoop",e)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.secondsLoaded}render(){let e={width:"100%",height:"100%"};return Ie.default.createElement("iframe",{ref:this.ref,src:this.props.url,frameBorder:"0",scrolling:"no",style:e,allow:"encrypted-media; autoplay; fullscreen;",referrerPolicy:"no-referrer-when-downgrade"})}};s(re,"displayName","Kaltura"),s(re,"canPlay",c.kaltura)});var Yt={};T(Yt,{default:()=>se});var Y,Xe,Es,Ft,vs,Ls,ws,Ss,Ts,Rs,Is,_s,We,Ds,se,qt=L(()=>{Y=y(g());b();R();Xe=typeof navigator!="undefined",Es=Xe&&navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,Ft=Xe&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||Es)&&!window.MSStream,vs=Xe&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent)&&!window.MSStream,Ls="https://cdn.jsdelivr.net/npm/hls.js@VERSION/dist/hls.min.js",ws="Hls",Ss="https://cdnjs.cloudflare.com/ajax/libs/dashjs/VERSION/dash.all.min.js",Ts="dashjs",Rs="https://cdn.jsdelivr.net/npm/flv.js@VERSION/dist/flv.min.js",Is="flvjs",_s=/www\.dropbox\.com\/.+/,We=/https:\/\/watch\.cloudflarestream\.com\/([a-z0-9]+)/,Ds="https://videodelivery.net/{id}/manifest/video.m3u8",se=class extends Y.Component{constructor(){super(...arguments);s(this,"onReady",(...e)=>this.props.onReady(...e));s(this,"onPlay",(...e)=>this.props.onPlay(...e));s(this,"onBuffer",(...e)=>this.props.onBuffer(...e));s(this,"onBufferEnd",(...e)=>this.props.onBufferEnd(...e));s(this,"onPause",(...e)=>this.props.onPause(...e));s(this,"onEnded",(...e)=>this.props.onEnded(...e));s(this,"onError",(...e)=>this.props.onError(...e));s(this,"onPlayBackRateChange",e=>this.props.onPlaybackRateChange(e.target.playbackRate));s(this,"onEnablePIP",(...e)=>this.props.onEnablePIP(...e));s(this,"onDisablePIP",e=>{let{onDisablePIP:r,playing:o}=this.props;r(e),o&&this.play()});s(this,"onPresentationModeChange",e=>{if(this.player&&X(this.player)){let{webkitPresentationMode:r}=this.player;r==="picture-in-picture"?this.onEnablePIP(e):r==="inline"&&this.onDisablePIP(e)}});s(this,"onSeek",e=>{this.props.onSeek(e.target.currentTime)});s(this,"mute",()=>{this.player.muted=!0});s(this,"unmute",()=>{this.player.muted=!1});s(this,"renderSourceElement",(e,r)=>typeof e=="string"?Y.default.createElement("source",{key:r,src:e}):Y.default.createElement("source",{key:r,...e}));s(this,"renderTrack",(e,r)=>Y.default.createElement("track",{key:r,...e}));s(this,"ref",e=>{this.player&&(this.prevPlayer=this.player),this.player=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this),this.addListeners(this.player);let e=this.getSource(this.props.url);e&&(this.player.src=e),(Ft||this.props.config.forceDisableHls)&&this.player.load()}componentDidUpdate(e){this.shouldUseAudio(this.props)!==this.shouldUseAudio(e)&&(this.removeListeners(this.prevPlayer,e.url),this.addListeners(this.player)),this.props.url!==e.url&&!x(this.props.url)&&!(this.props.url instanceof Array)&&(this.player.srcObject=null)}componentWillUnmount(){this.player.removeAttribute("src"),this.removeListeners(this.player),this.hls&&this.hls.destroy()}addListeners(e){let{url:r,playsinline:o}=this.props;e.addEventListener("play",this.onPlay),e.addEventListener("waiting",this.onBuffer),e.addEventListener("playing",this.onBufferEnd),e.addEventListener("pause",this.onPause),e.addEventListener("seeked",this.onSeek),e.addEventListener("ended",this.onEnded),e.addEventListener("error",this.onError),e.addEventListener("ratechange",this.onPlayBackRateChange),e.addEventListener("enterpictureinpicture",this.onEnablePIP),e.addEventListener("leavepictureinpicture",this.onDisablePIP),e.addEventListener("webkitpresentationmodechanged",this.onPresentationModeChange),this.shouldUseHLS(r)||e.addEventListener("canplay",this.onReady),o&&(e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline",""),e.setAttribute("x5-playsinline",""))}removeListeners(e,r){e.removeEventListener("canplay",this.onReady),e.removeEventListener("play",this.onPlay),e.removeEventListener("waiting",this.onBuffer),e.removeEventListener("playing",this.onBufferEnd),e.removeEventListener("pause",this.onPause),e.removeEventListener("seeked",this.onSeek),e.removeEventListener("ended",this.onEnded),e.removeEventListener("error",this.onError),e.removeEventListener("ratechange",this.onPlayBackRateChange),e.removeEventListener("enterpictureinpicture",this.onEnablePIP),e.removeEventListener("leavepictureinpicture",this.onDisablePIP),e.removeEventListener("webkitpresentationmodechanged",this.onPresentationModeChange),this.shouldUseHLS(r)||e.removeEventListener("canplay",this.onReady)}shouldUseAudio(e){return e.config.forceVideo||e.config.attributes.poster?!1:Z.test(e.url)||e.config.forceAudio}shouldUseHLS(e){return vs&&this.props.config.forceSafariHLS||this.props.config.forceHLS?!0:Ft||this.props.config.forceDisableHls?!1:Pe.test(e)||We.test(e)}shouldUseDASH(e){return Ye.test(e)||this.props.config.forceDASH}shouldUseFLV(e){return qe.test(e)||this.props.config.forceFLV}load(e){let{hlsVersion:r,hlsOptions:o,dashVersion:i,flvVersion:a}=this.props.config;if(this.hls&&this.hls.destroy(),this.dash&&this.dash.reset(),this.shouldUseHLS(e)&&d(Ls.replace("VERSION",r),ws).then(l=>{if(this.hls=new l(o),this.hls.on(l.Events.MANIFEST_PARSED,()=>{this.props.onReady()}),this.hls.on(l.Events.ERROR,(p,h)=>{this.props.onError(p,h,this.hls,l)}),We.test(e)){let p=e.match(We)[1];this.hls.loadSource(Ds.replace("{id}",p))}else this.hls.loadSource(e);this.hls.attachMedia(this.player),this.props.onLoaded()}),this.shouldUseDASH(e)&&d(Ss.replace("VERSION",i),Ts).then(l=>{this.dash=l.MediaPlayer().create(),this.dash.initialize(this.player,e,this.props.playing),this.dash.on("error",this.props.onError),parseInt(i)<3?this.dash.getDebug().setLogToBrowserConsole(!1):this.dash.updateSettings({debug:{logLevel:l.Debug.LOG_LEVEL_NONE}}),this.props.onLoaded()}),this.shouldUseFLV(e)&&d(Rs.replace("VERSION",a),Is).then(l=>{this.flv=l.createPlayer({type:"flv",url:e}),this.flv.attachMediaElement(this.player),this.flv.on(l.Events.ERROR,(p,h)=>{this.props.onError(p,h,this.flv,l)}),this.flv.load(),this.props.onLoaded()}),e instanceof Array)this.player.load();else if(x(e))try{this.player.srcObject=e}catch{this.player.src=window.URL.createObjectURL(e)}}play(){let e=this.player.play();e&&e.catch(this.props.onError)}pause(){this.player.pause()}stop(){this.player.removeAttribute("src"),this.dash&&this.dash.reset()}seekTo(e,r=!0){this.player.currentTime=e,r||this.pause()}setVolume(e){this.player.volume=e}enablePIP(){this.player.requestPictureInPicture&&document.pictureInPictureElement!==this.player?this.player.requestPictureInPicture():X(this.player)&&this.player.webkitPresentationMode!=="picture-in-picture"&&this.player.webkitSetPresentationMode("picture-in-picture")}disablePIP(){document.exitPictureInPicture&&document.pictureInPictureElement===this.player?document.exitPictureInPicture():X(this.player)&&this.player.webkitPresentationMode!=="inline"&&this.player.webkitSetPresentationMode("inline")}setPlaybackRate(e){try{this.player.playbackRate=e}catch(r){this.props.onError(r)}}getDuration(){if(!this.player)return null;let{duration:e,seekable:r}=this.player;return e===1/0&&r.length>0?r.end(r.length-1):e}getCurrentTime(){return this.player?this.player.currentTime:null}getSecondsLoaded(){if(!this.player)return null;let{buffered:e}=this.player;if(e.length===0)return 0;let r=e.end(e.length-1),o=this.getDuration();return r>o?o:r}getSource(e){let r=this.shouldUseHLS(e),o=this.shouldUseDASH(e),i=this.shouldUseFLV(e);if(!(e instanceof Array||x(e)||r||o||i))return _s.test(e)?e.replace("www.dropbox.com","dl.dropboxusercontent.com"):e}render(){let{url:e,playing:r,loop:o,controls:i,muted:a,config:l,width:p,height:h}=this.props,m=this.shouldUseAudio(this.props)?"audio":"video",D={width:p==="auto"?p:"100%",height:h==="auto"?h:"100%"};return Y.default.createElement(m,{ref:this.ref,src:this.getSource(e),style:D,preload:"auto",autoPlay:r||void 0,controls:i,muted:a,loop:o,...l.attributes},e instanceof Array&&e.map(this.renderSourceElement),l.tracks.map(this.renderTrack))}};s(se,"displayName","FilePlayer"),s(se,"canPlay",c.file)});var Ze=V(($n,Wt)=>{var Cs=typeof Element!="undefined",xs=typeof Map=="function",Ms=typeof Set=="function",Us=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function Ae(t,n){if(t===n)return!0;if(t&&n&&typeof t=="object"&&typeof n=="object"){if(t.constructor!==n.constructor)return!1;var e,r,o;if(Array.isArray(t)){if(e=t.length,e!=n.length)return!1;for(r=e;r--!==0;)if(!Ae(t[r],n[r]))return!1;return!0}var i;if(xs&&t instanceof Map&&n instanceof Map){if(t.size!==n.size)return!1;for(i=t.entries();!(r=i.next()).done;)if(!n.has(r.value[0]))return!1;for(i=t.entries();!(r=i.next()).done;)if(!Ae(r.value[1],n.get(r.value[0])))return!1;return!0}if(Ms&&t instanceof Set&&n instanceof Set){if(t.size!==n.size)return!1;for(i=t.entries();!(r=i.next()).done;)if(!n.has(r.value[0]))return!1;return!0}if(Us&&ArrayBuffer.isView(t)&&ArrayBuffer.isView(n)){if(e=t.length,e!=n.length)return!1;for(r=e;r--!==0;)if(t[r]!==n[r])return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf&&typeof t.valueOf=="function"&&typeof n.valueOf=="function")return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString&&typeof t.toString=="function"&&typeof n.toString=="function")return t.toString()===n.toString();if(o=Object.keys(t),e=o.length,e!==Object.keys(n).length)return!1;for(r=e;r--!==0;)if(!Object.prototype.hasOwnProperty.call(n,o[r]))return!1;if(Cs&&t instanceof Element)return!1;for(r=e;r--!==0;)if(!((o[r]==="_owner"||o[r]==="__v"||o[r]==="__o")&&t.$$typeof)&&!Ae(t[o[r]],n[o[r]]))return!1;return!0}return t!==t&&n!==n}Wt.exports=function(n,e){try{return Ae(n,e)}catch(r){if((r.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw r}}});var Zt=V((Fn,Xt)=>{"use strict";var Ns="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";Xt.exports=Ns});var tr=V((Yn,er)=>{"use strict";var Vs=Zt();function Qt(){}function Jt(){}Jt.resetWarningCache=Qt;er.exports=function(){function t(r,o,i,a,l,p){if(p!==Vs){var h=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw h.name="Invariant Violation",h}}t.isRequired=t;function n(){return t}var e={array:t,bigint:t,bool:t,func:t,number:t,object:t,string:t,symbol:t,any:t,arrayOf:n,element:t,elementType:t,instanceOf:n,node:t,objectOf:n,oneOf:n,oneOfType:n,shape:n,exact:n,checkPropTypes:Jt,resetWarningCache:Qt};return e.PropTypes=e,e}});var sr=V((Wn,rr)=>{rr.exports=tr()();var qn,Gn});var ar={};T(ar,{default:()=>Oe});var U,Je,et,Oe,lr=L(()=>{U=y(g()),Je="64px",et={},Oe=class extends U.Component{constructor(){super(...arguments);s(this,"mounted",!1);s(this,"state",{image:null});s(this,"handleKeyPress",e=>{(e.key==="Enter"||e.key===" ")&&this.props.onClick()})}componentDidMount(){this.mounted=!0,this.fetchImage(this.props)}componentDidUpdate(e){let{url:r,light:o}=this.props;(e.url!==r||e.light!==o)&&this.fetchImage(this.props)}componentWillUnmount(){this.mounted=!1}fetchImage({url:e,light:r,oEmbedUrl:o}){if(!U.default.isValidElement(r)){if(typeof r=="string"){this.setState({image:r});return}if(et[e]){this.setState({image:et[e]});return}return this.setState({image:null}),window.fetch(o.replace("{url}",e)).then(i=>i.json()).then(i=>{if(i.thumbnail_url&&this.mounted){let a=i.thumbnail_url.replace("height=100","height=480").replace("-d_295x166","-d_640");this.setState({image:a}),et[e]=a}})}}render(){let{light:e,onClick:r,playIcon:o,previewTabIndex:i,previewAriaLabel:a}=this.props,{image:l}=this.state,p=U.default.isValidElement(e),h={display:"flex",alignItems:"center",justifyContent:"center"},u={preview:{width:"100%",height:"100%",backgroundImage:l&&!p?`url(${l})`:void 0,backgroundSize:"cover",backgroundPosition:"center",cursor:"pointer",...h},shadow:{background:"radial-gradient(rgb(0, 0, 0, 0.3), rgba(0, 0, 0, 0) 60%)",borderRadius:Je,width:Je,height:Je,position:p?"absolute":void 0,...h},playIcon:{borderStyle:"solid",borderWidth:"16px 0 16px 26px",borderColor:"transparent transparent transparent white",marginLeft:"7px"}},m=U.default.createElement("div",{style:u.shadow,className:"react-player__shadow"},U.default.createElement("div",{style:u.playIcon,className:"react-player__play-icon"}));return U.default.createElement("div",{style:u.preview,className:"react-player__preview",onClick:r,tabIndex:i,onKeyPress:this.handleKeyPress,...a?{"aria-label":a}:{}},p?e:null,o||m)}}});var qs={};T(qs,{default:()=>Ys});b();R();var _e=[{key:"youtube",name:"YouTube",canPlay:c.youtube,lazyPlayer:w(()=>Promise.resolve().then(()=>(bt(),gt)))},{key:"soundcloud",name:"SoundCloud",canPlay:c.soundcloud,lazyPlayer:w(()=>Promise.resolve().then(()=>(vt(),Et)))},{key:"vimeo",name:"Vimeo",canPlay:c.vimeo,lazyPlayer:w(()=>Promise.resolve().then(()=>(wt(),Lt)))},{key:"mux",name:"Mux",canPlay:c.mux,lazyPlayer:w(()=>Promise.resolve().then(()=>(Tt(),St)))},{key:"facebook",name:"Facebook",canPlay:c.facebook,lazyPlayer:w(()=>Promise.resolve().then(()=>(At(),Dt)))},{key:"streamable",name:"Streamable",canPlay:c.streamable,lazyPlayer:w(()=>Promise.resolve().then(()=>(Ot(),kt)))},{key:"wistia",name:"Wistia",canPlay:c.wistia,lazyPlayer:w(()=>Promise.resolve().then(()=>(xt(),Ct)))},{key:"twitch",name:"Twitch",canPlay:c.twitch,lazyPlayer:w(()=>Promise.resolve().then(()=>(Ut(),Mt)))},{key:"dailymotion",name:"DailyMotion",canPlay:c.dailymotion,lazyPlayer:w(()=>Promise.resolve().then(()=>(Vt(),Nt)))},{key:"mixcloud",name:"Mixcloud",canPlay:c.mixcloud,lazyPlayer:w(()=>Promise.resolve().then(()=>(Ht(),Bt)))},{key:"vidyard",name:"Vidyard",canPlay:c.vidyard,lazyPlayer:w(()=>Promise.resolve().then(()=>(Kt(),jt)))},{key:"kaltura",name:"Kaltura",canPlay:c.kaltura,lazyPlayer:w(()=>Promise.resolve().then(()=>($t(),zt)))},{key:"file",name:"FilePlayer",canPlay:c.file,canEnablePIP:t=>c.file(t)&&(document.pictureInPictureEnabled||X())&&!Z.test(t),lazyPlayer:w(()=>Promise.resolve().then(()=>(qt(),Yt)))}];var k=y(g()),pr=y(Me());var Gt=Number.isNaN||function(n){return typeof n=="number"&&n!==n};function As(t,n){return!!(t===n||Gt(t)&&Gt(n))}function ks(t,n){if(t.length!==n.length)return!1;for(var e=0;e{},ie={playing:!1,loop:!1,controls:!1,volume:null,muted:!1,playbackRate:1,width:"640px",height:"360px",style:{},progressInterval:1e3,playsinline:!1,pip:!1,stopOnUnmount:!0,light:!1,fallback:null,wrapper:"div",previewTabIndex:0,previewAriaLabel:"",oEmbedUrl:"https://noembed.com/embed?url={url}",config:{soundcloud:{options:{visual:!0,buying:!1,liking:!1,download:!1,sharing:!1,show_comments:!1,show_playcount:!1}},youtube:{playerVars:{playsinline:1,showinfo:0,rel:0,iv_load_policy:3,modestbranding:1},embedOptions:{},onUnstarted:v},facebook:{appId:"1309697205772819",version:"v3.3",playerId:null,attributes:{}},dailymotion:{params:{api:1,"endscreen-enable":!1}},vimeo:{playerOptions:{autopause:!1,byline:!1,portrait:!1,title:!1},title:null},mux:{attributes:{},version:"2"},file:{attributes:{},tracks:[],forceVideo:!1,forceAudio:!1,forceHLS:!1,forceDASH:!1,forceFLV:!1,hlsOptions:{},hlsVersion:"1.1.4",dashVersion:"3.1.3",flvVersion:"1.5.0",forceDisableHls:!1},wistia:{options:{},playerId:null,customControls:null},mixcloud:{options:{hide_cover:1}},twitch:{options:{},playerId:null},vidyard:{options:{}}},onReady:v,onStart:v,onPlay:v,onPause:v,onBuffer:v,onBufferEnd:v,onEnded:v,onError:v,onDuration:v,onSeek:v,onPlaybackRateChange:v,onPlaybackQualityChange:v,onProgress:v,onClickPreview:v,onEnablePIP:v,onDisablePIP:v};b();var ke=y(g()),or=y(Ze());b();var Bs=5e3,M=class extends ke.Component{constructor(){super(...arguments);s(this,"mounted",!1);s(this,"isReady",!1);s(this,"isPlaying",!1);s(this,"isLoading",!0);s(this,"loadOnReady",null);s(this,"startOnPlay",!0);s(this,"seekOnPlay",null);s(this,"onDurationCalled",!1);s(this,"handlePlayerMount",e=>{if(this.player){this.progress();return}this.player=e,this.player.load(this.props.url),this.progress()});s(this,"getInternalPlayer",e=>this.player?this.player[e]:null);s(this,"progress",()=>{if(this.props.url&&this.player&&this.isReady){let e=this.getCurrentTime()||0,r=this.getSecondsLoaded(),o=this.getDuration();if(o){let i={playedSeconds:e,played:e/o};r!==null&&(i.loadedSeconds=r,i.loaded=r/o),(i.playedSeconds!==this.prevPlayed||i.loadedSeconds!==this.prevLoaded)&&this.props.onProgress(i),this.prevPlayed=i.playedSeconds,this.prevLoaded=i.loadedSeconds}}this.progressTimeout=setTimeout(this.progress,this.props.progressFrequency||this.props.progressInterval)});s(this,"handleReady",()=>{if(!this.mounted)return;this.isReady=!0,this.isLoading=!1;let{onReady:e,playing:r,volume:o,muted:i}=this.props;e(),!i&&o!==null&&this.player.setVolume(o),this.loadOnReady?(this.player.load(this.loadOnReady,!0),this.loadOnReady=null):r&&this.player.play(),this.handleDurationCheck()});s(this,"handlePlay",()=>{this.isPlaying=!0,this.isLoading=!1;let{onStart:e,onPlay:r,playbackRate:o}=this.props;this.startOnPlay&&(this.player.setPlaybackRate&&o!==1&&this.player.setPlaybackRate(o),e(),this.startOnPlay=!1),r(),this.seekOnPlay&&(this.seekTo(this.seekOnPlay),this.seekOnPlay=null),this.handleDurationCheck()});s(this,"handlePause",e=>{this.isPlaying=!1,this.isLoading||this.props.onPause(e)});s(this,"handleEnded",()=>{let{activePlayer:e,loop:r,onEnded:o}=this.props;e.loopOnEnded&&r&&this.seekTo(0),r||(this.isPlaying=!1,o())});s(this,"handleError",(...e)=>{this.isLoading=!1,this.props.onError(...e)});s(this,"handleDurationCheck",()=>{clearTimeout(this.durationCheckTimeout);let e=this.getDuration();e?this.onDurationCalled||(this.props.onDuration(e),this.onDurationCalled=!0):this.durationCheckTimeout=setTimeout(this.handleDurationCheck,100)});s(this,"handleLoaded",()=>{this.isLoading=!1})}componentDidMount(){this.mounted=!0}componentWillUnmount(){clearTimeout(this.progressTimeout),clearTimeout(this.durationCheckTimeout),this.isReady&&this.props.stopOnUnmount&&(this.player.stop(),this.player.disablePIP&&this.player.disablePIP()),this.mounted=!1}componentDidUpdate(e){if(!this.player)return;let{url:r,playing:o,volume:i,muted:a,playbackRate:l,pip:p,loop:h,activePlayer:u,disableDeferredLoading:m}=this.props;if(!(0,or.default)(e.url,r)){if(this.isLoading&&!u.forceLoad&&!m&&!x(r)){console.warn(`ReactPlayer: the attempt to load ${r} is being deferred until the player has loaded`),this.loadOnReady=r;return}this.isLoading=!0,this.startOnPlay=!0,this.onDurationCalled=!1,this.player.load(r,this.isReady)}!e.playing&&o&&!this.isPlaying&&this.player.play(),e.playing&&!o&&this.isPlaying&&this.player.pause(),!e.pip&&p&&this.player.enablePIP&&this.player.enablePIP(),e.pip&&!p&&this.player.disablePIP&&this.player.disablePIP(),e.volume!==i&&i!==null&&this.player.setVolume(i),e.muted!==a&&(a?this.player.mute():(this.player.unmute(),i!==null&&setTimeout(()=>this.player.setVolume(i)))),e.playbackRate!==l&&this.player.setPlaybackRate&&this.player.setPlaybackRate(l),e.loop!==h&&this.player.setLoop&&this.player.setLoop(h)}getDuration(){return this.isReady?this.player.getDuration():null}getCurrentTime(){return this.isReady?this.player.getCurrentTime():null}getSecondsLoaded(){return this.isReady?this.player.getSecondsLoaded():null}seekTo(e,r,o){if(!this.isReady){e!==0&&(this.seekOnPlay=e,setTimeout(()=>{this.seekOnPlay=null},Bs));return}if(r?r==="fraction":e>0&&e<1){let a=this.player.getDuration();if(!a){console.warn("ReactPlayer: could not seek using fraction \u2013\xA0duration not yet available");return}this.player.seekTo(a*e,o);return}this.player.seekTo(e,o)}render(){let e=this.props.activePlayer;return e?ke.default.createElement(e,{...this.props,onMount:this.handlePlayerMount,onReady:this.handleReady,onPlay:this.handlePlay,onPause:this.handlePause,onEnded:this.handleEnded,onLoaded:this.handleLoaded,onError:this.handleError}):null}};s(M,"displayName","Player"),s(M,"propTypes",ce),s(M,"defaultProps",ie);var Hs=w(()=>Promise.resolve().then(()=>(lr(),ar))),js=typeof window!="undefined"&&window.document&&typeof document!="undefined",Ks=typeof global!="undefined"&&global.window&&global.window.document,zs=Object.keys(ce),$s=js||Ks?k.Suspense:()=>null,de=[],ur=(t,n)=>{var e;return e=class extends k.Component{constructor(){super(...arguments);s(this,"state",{showPreview:!!this.props.light});s(this,"references",{wrapper:i=>{this.wrapper=i},player:i=>{this.player=i}});s(this,"handleClickPreview",i=>{this.setState({showPreview:!1}),this.props.onClickPreview(i)});s(this,"showPreview",()=>{this.setState({showPreview:!0})});s(this,"getDuration",()=>this.player?this.player.getDuration():null);s(this,"getCurrentTime",()=>this.player?this.player.getCurrentTime():null);s(this,"getSecondsLoaded",()=>this.player?this.player.getSecondsLoaded():null);s(this,"getInternalPlayer",(i="player")=>this.player?this.player.getInternalPlayer(i):null);s(this,"seekTo",(i,a,l)=>{if(!this.player)return null;this.player.seekTo(i,a,l)});s(this,"handleReady",()=>{this.props.onReady(this)});s(this,"getActivePlayer",De(i=>{for(let a of[...de,...t])if(a.canPlay(i))return a;return n||null}));s(this,"getConfig",De((i,a)=>{let{config:l}=this.props;return pr.default.all([ie.config,ie.config[a]||{},l,l[a]||{}])}));s(this,"getAttributes",De(i=>yt(this.props,zs)));s(this,"renderActivePlayer",i=>{if(!i)return null;let a=this.getActivePlayer(i);if(!a)return null;let l=this.getConfig(i,a.key);return k.default.createElement(M,{...this.props,key:a.key,ref:this.references.player,config:l,activePlayer:a.lazyPlayer||a,onReady:this.handleReady})})}shouldComponentUpdate(i,a){return!(0,tt.default)(this.props,i)||!(0,tt.default)(this.state,a)}componentDidUpdate(i){let{light:a}=this.props;!i.light&&a&&this.setState({showPreview:!0}),i.light&&!a&&this.setState({showPreview:!1})}renderPreview(i){if(!i)return null;let{light:a,playIcon:l,previewTabIndex:p,oEmbedUrl:h,previewAriaLabel:u}=this.props;return k.default.createElement(Hs,{url:i,light:a,playIcon:l,previewTabIndex:p,previewAriaLabel:u,oEmbedUrl:h,onClick:this.handleClickPreview})}render(){let{url:i,style:a,width:l,height:p,fallback:h,wrapper:u}=this.props,{showPreview:m}=this.state,D=this.getAttributes(i),O=typeof u=="string"?this.references.wrapper:void 0;return k.default.createElement(u,{ref:O,style:{...a,width:l,height:p},...D},k.default.createElement($s,{fallback:h},m?this.renderPreview(i):this.renderActivePlayer(i)))}},s(e,"displayName","ReactPlayer"),s(e,"propTypes",ce),s(e,"defaultProps",ie),s(e,"addCustomPlayer",i=>{de.push(i)}),s(e,"removeCustomPlayers",()=>{de.length=0}),s(e,"canPlay",i=>{for(let a of[...de,...t])if(a.canPlay(i))return!0;return!1}),s(e,"canEnablePIP",i=>{for(let a of[...de,...t])if(a.canEnablePIP&&a.canEnablePIP(i))return!0;return!1}),e};var Fs=_e[_e.length-1],Ys=ur(_e,Fs);return br(qs);})(); +var ReactPlayer=(()=>{var gr=Object.create;var ae=Object.defineProperty;var br=Object.getOwnPropertyDescriptor;var Er=Object.getOwnPropertyNames;var vr=Object.getPrototypeOf,Lr=Object.prototype.hasOwnProperty;var wr=(t,n,e)=>n in t?ae(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e;var E=(t,n)=>()=>(t&&(n=t(t=0)),n);var V=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports),S=(t,n)=>{for(var e in n)ae(t,e,{get:n[e],enumerable:!0})},it=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Er(n))!Lr.call(t,o)&&o!==e&&ae(t,o,{get:()=>n[o],enumerable:!(r=br(n,o))||r.enumerable});return t};var y=(t,n,e)=>(e=t!=null?gr(vr(t)):{},it(n||!t||!t.__esModule?ae(e,"default",{value:t,enumerable:!0}):e,t)),Sr=t=>it(ae({},"__esModule",{value:!0}),t);var s=(t,n,e)=>(wr(t,typeof n!="symbol"?n+"":n,e),e);var P=V((sn,ot)=>{ot.exports=globalThis.React});var pt=V((nn,lt)=>{lt.exports=function(n,e,r){var o=document.head||document.getElementsByTagName("head")[0],i=document.createElement("script");typeof e=="function"&&(r=e,e={}),e=e||{},r=r||function(){},i.type=e.type||"text/javascript",i.charset=e.charset||"utf8",i.async="async"in e?!!e.async:!0,i.src=n,e.attrs&&Tr(i,e.attrs),e.text&&(i.text=""+e.text);var a="onload"in i?at:Rr;a(i,r),i.onload||at(i,r),o.appendChild(i)};function Tr(t,n){for(var e in n)t.setAttribute(e,n[e])}function at(t,n){t.onload=function(){this.onerror=this.onload=null,n(null,t)},t.onerror=function(){this.onerror=this.onload=null,n(new Error("Failed to load "+this.src),t)}}function Rr(t,n){t.onreadystatechange=function(){this.readyState!="complete"&&this.readyState!="loaded"||(this.onreadystatechange=null,n(null,t))}}});var Ve=V((on,ct)=>{"use strict";var Ir=function(n){return _r(n)&&!Dr(n)};function _r(t){return!!t&&typeof t=="object"}function Dr(t){var n=Object.prototype.toString.call(t);return n==="[object RegExp]"||n==="[object Date]"||Or(t)}var Ar=typeof Symbol=="function"&&Symbol.for,kr=Ar?Symbol.for("react.element"):60103;function Or(t){return t.$$typeof===kr}function Cr(t){return Array.isArray(t)?[]:{}}function le(t,n){return n.clone!==!1&&n.isMergeableObject(t)?q(Cr(t),t,n):t}function Mr(t,n,e){return t.concat(n).map(function(r){return le(r,e)})}function xr(t,n){if(!n.customMerge)return q;var e=n.customMerge(t);return typeof e=="function"?e:q}function Ur(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(n){return Object.propertyIsEnumerable.call(t,n)}):[]}function ut(t){return Object.keys(t).concat(Ur(t))}function ht(t,n){try{return n in t}catch{return!1}}function Nr(t,n){return ht(t,n)&&!(Object.hasOwnProperty.call(t,n)&&Object.propertyIsEnumerable.call(t,n))}function Vr(t,n,e){var r={};return e.isMergeableObject(t)&&ut(t).forEach(function(o){r[o]=le(t[o],e)}),ut(n).forEach(function(o){Nr(t,o)||(ht(t,o)&&e.isMergeableObject(n[o])?r[o]=xr(o,e)(t[o],n[o],e):r[o]=le(n[o],e))}),r}function q(t,n,e){e=e||{},e.arrayMerge=e.arrayMerge||Mr,e.isMergeableObject=e.isMergeableObject||Ir,e.cloneUnlessOtherwiseSpecified=le;var r=Array.isArray(n),o=Array.isArray(t),i=r===o;return i?r?e.arrayMerge(t,n,e):Vr(t,n,e):le(n,e)}q.all=function(n,e){if(!Array.isArray(n))throw new Error("first argument should be an array");return n.reduce(function(r,o){return q(r,o,e)},{})};var Br=q;ct.exports=Br});function ft(t,n){if(t instanceof Array)return;let e=t.match(n);if(e){let r=e[1];if(r.match(He))return $r(r);if(zr.test(r))return parseInt(r)}}function $r(t){let n=0,e=He.exec(t);for(;e!==null;){let[,r,o]=e;o==="h"&&(n+=parseInt(r,10)*60*60),o==="m"&&(n+=parseInt(r,10)*60),o==="s"&&(n+=parseInt(r,10)),e=He.exec(t)}return n}function C(t){return ft(t,jr)}function je(t){return ft(t,Kr)}function X(){return Math.random().toString(36).substr(2,5)}function mt(t){return Object.keys(t).map(n=>`${n}=${t[n]}`).join("&")}function Be(t){return window[t]?window[t]:window.exports&&window.exports[t]?window.exports[t]:window.module&&window.module.exports&&window.module.exports[t]?window.module.exports[t]:null}function Pt(t,...n){let e=[].concat(...n),r={},o=Object.keys(t);for(let i of o)e.indexOf(i)===-1&&(r[i]=t[i]);return r}function f(t,...n){if(!this.player||!this.player[t]){let e=`ReactPlayer: ${this.constructor.displayName} player could not call %c${t}%c \u2013 `;return this.player?this.player[t]||(e+="The method was not available"):e+="The player was not available",console.warn(e,"font-weight: bold",""),null}return this.player[t](...n)}function M(t){return typeof window!="undefined"&&typeof window.MediaStream!="undefined"&&t instanceof window.MediaStream}function gt(t){return/^blob:/.test(t)}function Z(t=document.createElement("video")){let n=/iPhone|iPod/.test(navigator.userAgent)===!1;return t.webkitSupportsPresentationMode&&typeof t.webkitSetPresentationMode=="function"&&n}var dt,yt,Hr,v,jr,Kr,He,zr,W,d,b=E(()=>{dt=y(P()),yt=y(pt()),Hr=y(Ve()),v=t=>dt.default.lazy(async()=>{let n=await t();return typeof n.default=="function"?n:n.default}),jr=/[?&#](?:start|t)=([0-9hms]+)/,Kr=/[?&#]end=([0-9hms]+)/,He=/(\d+)(h|m|s)/g,zr=/^\d+$/;W={},d=function(n,e,r=null,o=()=>!0,i=yt.default){let a=Be(e);return a&&o(a)?Promise.resolve(a):new Promise((l,p)=>{if(W[n]){W[n].push({resolve:l,reject:p});return}W[n]=[{resolve:l,reject:p}];let h=u=>{W[n].forEach(m=>m.resolve(u))};if(r){let u=window[r];window[r]=function(){u&&u(),h(Be(e))}}i(n,u=>{u?(W[n].forEach(m=>m.reject(u)),W[n]=null):r||h(Be(e))})})}});var Pe,Fr,Yr,ge,Gr,qr,ze,$e,Fe,be,Ye,Ge,qe,Wr,Xr,Q,bt,Ee,We,Xe,Ke,c,T=E(()=>{b();Pe=/(?:youtu\.be\/|youtube(?:-nocookie|education)?\.com\/(?:embed\/|v\/|watch\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((\w|-){11})|youtube\.com\/playlist\?list=|youtube\.com\/user\//,Fr=/(?:soundcloud\.com|snd\.sc)\/[^.]+$/,Yr=/vimeo\.com\/(?!progressive_redirect).+/,ge=/stream\.mux\.com\/(?!\w+\.m3u8)(\w+)/,Gr=/^https?:\/\/(www\.)?facebook\.com.*\/(video(s)?|watch|story)(\.php?|\/).+$/,qr=/^https?:\/\/fb\.watch\/.+$/,ze=/streamable\.com\/([a-z0-9]+)$/,$e=/(?:wistia\.(?:com|net)|wi\.st)\/(?:medias|embed)\/(?:iframe\/)?([^?]+)/,Fe=/(?:www\.|go\.)?twitch\.tv\/videos\/(\d+)($|\?)/,be=/(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_]+)($|\?)/,Ye=/^(?:(?:https?):)?(?:\/\/)?(?:www\.)?(?:(?:dailymotion\.com(?:\/embed)?\/video)|dai\.ly)\/([a-zA-Z0-9]+)(?:_[\w_-]+)?(?:[\w.#_-]+)?/,Ge=/mixcloud\.com\/([^/]+\/[^/]+)/,qe=/vidyard.com\/(?:watch\/)?([a-zA-Z0-9-_]+)/,Wr=/spotify.+$/,Xr=/^https?:\/\/[a-zA-Z]+\.kaltura.(com|org)\/p\/([0-9]+)\/sp\/([0-9]+)00\/embedIframeJs\/uiconf_id\/([0-9]+)\/partner_id\/([0-9]+)(.*)entry_id.([a-zA-Z0-9-_].*)$/,Q=/\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i,bt=/\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i,Ee=/\.(m3u8)($|\?)/i,We=/\.(mpd)($|\?)/i,Xe=/\.(flv)($|\?)/i,Ke=t=>{if(t instanceof Array){for(let n of t)if(typeof n=="string"&&Ke(n)||Ke(n.src))return!0;return!1}return M(t)||gt(t)?!0:Q.test(t)||bt.test(t)||Ee.test(t)||We.test(t)||Xe.test(t)},c={youtube:t=>t instanceof Array?t.every(n=>Pe.test(n)):Pe.test(t),soundcloud:t=>Fr.test(t)&&!Q.test(t),vimeo:t=>Yr.test(t)&&!bt.test(t)&&!Ee.test(t),mux:t=>ge.test(t),facebook:t=>Gr.test(t)||qr.test(t),streamable:t=>ze.test(t),wistia:t=>$e.test(t),twitch:t=>Fe.test(t)||be.test(t),dailymotion:t=>Ye.test(t),mixcloud:t=>Ge.test(t),vidyard:t=>qe.test(t),kaltura:t=>Xr.test(t),file:Ke,spotify:t=>Wr.test(t)}});var vt={};S(vt,{default:()=>J});var pe,Zr,Et,Qr,ve,Ze,Jr,es,J,Lt=E(()=>{pe=y(P());b();T();Zr="https://www.youtube.com/iframe_api",Et="YT",Qr="onYouTubeIframeAPIReady",ve=/[?&](?:list|channel)=([a-zA-Z0-9_-]+)/,Ze=/user\/([a-zA-Z0-9_-]+)\/?/,Jr=/youtube-nocookie\.com/,es="https://www.youtube-nocookie.com",J=class extends pe.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"parsePlaylist",e=>{if(e instanceof Array)return{listType:"playlist",playlist:e.map(this.getID).join(",")};if(ve.test(e)){let[,r]=e.match(ve);return{listType:"playlist",list:r.replace(/^UC/,"UU")}}if(Ze.test(e)){let[,r]=e.match(Ze);return{listType:"user_uploads",list:r}}return{}});s(this,"onStateChange",e=>{let{data:r}=e,{onPlay:o,onPause:i,onBuffer:a,onBufferEnd:l,onEnded:p,onReady:h,loop:u,config:{playerVars:m,onUnstarted:D}}=this.props,{UNSTARTED:O,PLAYING:N,PAUSED:A,BUFFERING:Ue,ENDED:Ne,CUED:mr}=window[Et].PlayerState;if(r===O&&D(),r===N&&(o(),l()),r===A&&i(),r===Ue&&a(),r===Ne){let Pr=!!this.callPlayer("getPlaylist");u&&!Pr&&(m.start?this.seekTo(m.start):this.play()),p()}r===mr&&h()});s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unMute")});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}getID(e){return!e||e instanceof Array||ve.test(e)?null:e.match(Pe)[1]}load(e,r){let{playing:o,muted:i,playsinline:a,controls:l,loop:p,config:h,onError:u}=this.props,{playerVars:m,embedOptions:D}=h,O=this.getID(e);if(r){if(ve.test(e)||Ze.test(e)||e instanceof Array){this.player.loadPlaylist(this.parsePlaylist(e));return}this.player.cueVideoById({videoId:O,startSeconds:C(e)||m.start,endSeconds:je(e)||m.end});return}d(Zr,Et,Qr,N=>N.loaded).then(N=>{this.container&&(this.player=new N.Player(this.container,{width:"100%",height:"100%",videoId:O,playerVars:{autoplay:o?1:0,mute:i?1:0,controls:l?1:0,start:C(e),end:je(e),origin:window.location.origin,playsinline:a?1:0,...this.parsePlaylist(e),...m},events:{onReady:()=>{p&&this.player.setLoop(!0),this.props.onReady()},onPlaybackRateChange:A=>this.props.onPlaybackRateChange(A.data),onPlaybackQualityChange:A=>this.props.onPlaybackQualityChange(A),onStateChange:this.onStateChange,onError:A=>u(A.data)},host:Jr.test(e)?es:void 0,...D}))},u),D.events&&console.warn("Using `embedOptions.events` will likely break things. Use ReactPlayer\u2019s callback props instead, eg onReady, onPlay, onPause")}play(){this.callPlayer("playVideo")}pause(){this.callPlayer("pauseVideo")}stop(){document.body.contains(this.callPlayer("getIframe"))&&this.callPlayer("stopVideo")}seekTo(e,r=!1){this.callPlayer("seekTo",e),!r&&!this.props.playing&&this.pause()}setVolume(e){this.callPlayer("setVolume",e*100)}setPlaybackRate(e){this.callPlayer("setPlaybackRate",e)}setLoop(e){this.callPlayer("setLoop",e)}getDuration(){return this.callPlayer("getDuration")}getCurrentTime(){return this.callPlayer("getCurrentTime")}getSecondsLoaded(){return this.callPlayer("getVideoLoadedFraction")*this.getDuration()}render(){let{display:e}=this.props;return pe.default.createElement("div",{style:{width:"100%",height:"100%",display:e}},pe.default.createElement("div",{ref:this.ref}))}};s(J,"displayName","YouTube"),s(J,"canPlay",c.youtube)});var wt={};S(wt,{default:()=>B});var Le,ts,rs,B,St=E(()=>{Le=y(P());b();T();ts="https://w.soundcloud.com/player/api.js",rs="SC",B=class extends Le.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"fractionLoaded",null);s(this,"mute",()=>{this.setVolume(0)});s(this,"unmute",()=>{this.props.volume!==null&&this.setVolume(this.props.volume)});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e,r){d(ts,rs).then(o=>{if(!this.iframe)return;let{PLAY:i,PLAY_PROGRESS:a,PAUSE:l,FINISH:p,ERROR:h}=o.Widget.Events;r||(this.player=o.Widget(this.iframe),this.player.bind(i,this.props.onPlay),this.player.bind(l,()=>{this.duration-this.currentTime<.05||this.props.onPause()}),this.player.bind(a,u=>{this.currentTime=u.currentPosition/1e3,this.fractionLoaded=u.loadedProgress}),this.player.bind(p,()=>this.props.onEnded()),this.player.bind(h,u=>this.props.onError(u))),this.player.load(e,{...this.props.config.options,callback:()=>{this.player.getDuration(u=>{this.duration=u/1e3,this.props.onReady()})}})})}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seekTo",e*1e3),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e*100)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.fractionLoaded*this.duration}render(){let{display:e}=this.props,r={width:"100%",height:"100%",display:e};return Le.default.createElement("iframe",{ref:this.ref,src:`https://w.soundcloud.com/player/?url=${encodeURIComponent(this.props.url)}`,style:r,frameBorder:0,allow:"autoplay"})}};s(B,"displayName","SoundCloud"),s(B,"canPlay",c.soundcloud),s(B,"loopOnEnded",!0)});var Tt={};S(Tt,{default:()=>H});var we,ss,ns,is,H,Rt=E(()=>{we=y(P());b();T();ss="https://player.vimeo.com/api/player.js",ns="Vimeo",is=t=>t.replace("/manage/videos",""),H=class extends we.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{this.setMuted(!0)});s(this,"unmute",()=>{this.setMuted(!1)});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){this.duration=null,d(ss,ns).then(r=>{if(!this.container)return;let{playerOptions:o,title:i}=this.props.config;this.player=new r.Player(this.container,{url:is(e),autoplay:this.props.playing,muted:this.props.muted,loop:this.props.loop,playsinline:this.props.playsinline,controls:this.props.controls,...o}),this.player.ready().then(()=>{let a=this.container.querySelector("iframe");a.style.width="100%",a.style.height="100%",i&&(a.title=i)}).catch(this.props.onError),this.player.on("loaded",()=>{this.props.onReady(),this.refreshDuration()}),this.player.on("play",()=>{this.props.onPlay(),this.refreshDuration()}),this.player.on("pause",this.props.onPause),this.player.on("seeked",a=>this.props.onSeek(a.seconds)),this.player.on("ended",this.props.onEnded),this.player.on("error",this.props.onError),this.player.on("timeupdate",({seconds:a})=>{this.currentTime=a}),this.player.on("progress",({seconds:a})=>{this.secondsLoaded=a}),this.player.on("bufferstart",this.props.onBuffer),this.player.on("bufferend",this.props.onBufferEnd),this.player.on("playbackratechange",a=>this.props.onPlaybackRateChange(a.playbackRate))},this.props.onError)}refreshDuration(){this.player.getDuration().then(e=>{this.duration=e})}play(){let e=this.callPlayer("play");e&&e.catch(this.props.onError)}pause(){this.callPlayer("pause")}stop(){this.callPlayer("unload")}seekTo(e,r=!0){this.callPlayer("setCurrentTime",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}setMuted(e){this.callPlayer("setMuted",e)}setLoop(e){this.callPlayer("setLoop",e)}setPlaybackRate(e){this.callPlayer("setPlaybackRate",e)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.secondsLoaded}render(){let{display:e}=this.props,r={width:"100%",height:"100%",overflow:"hidden",display:e};return we.default.createElement("div",{key:this.props.url,ref:this.ref,style:r})}};s(H,"displayName","Vimeo"),s(H,"canPlay",c.vimeo),s(H,"forceLoad",!0)});var It={};S(It,{default:()=>ee});var Se,os,ee,_t=E(()=>{Se=y(P());T();os="https://cdn.jsdelivr.net/npm/@mux/mux-player@VERSION/dist/mux-player.mjs",ee=class extends Se.Component{constructor(){super(...arguments);s(this,"onReady",(...e)=>this.props.onReady(...e));s(this,"onPlay",(...e)=>this.props.onPlay(...e));s(this,"onBuffer",(...e)=>this.props.onBuffer(...e));s(this,"onBufferEnd",(...e)=>this.props.onBufferEnd(...e));s(this,"onPause",(...e)=>this.props.onPause(...e));s(this,"onEnded",(...e)=>this.props.onEnded(...e));s(this,"onError",(...e)=>this.props.onError(...e));s(this,"onPlayBackRateChange",e=>this.props.onPlaybackRateChange(e.target.playbackRate));s(this,"onEnablePIP",(...e)=>this.props.onEnablePIP(...e));s(this,"onSeek",e=>{this.props.onSeek(e.target.currentTime)});s(this,"onDurationChange",()=>{let e=this.getDuration();this.props.onDuration(e)});s(this,"mute",()=>{this.player.muted=!0});s(this,"unmute",()=>{this.player.muted=!1});s(this,"ref",e=>{this.player=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this),this.addListeners(this.player);let e=this.getPlaybackId(this.props.url);e&&(this.player.playbackId=e)}componentWillUnmount(){this.player.playbackId=null,this.removeListeners(this.player)}addListeners(e){let{playsinline:r}=this.props;e.addEventListener("play",this.onPlay),e.addEventListener("waiting",this.onBuffer),e.addEventListener("playing",this.onBufferEnd),e.addEventListener("pause",this.onPause),e.addEventListener("seeked",this.onSeek),e.addEventListener("ended",this.onEnded),e.addEventListener("error",this.onError),e.addEventListener("ratechange",this.onPlayBackRateChange),e.addEventListener("enterpictureinpicture",this.onEnablePIP),e.addEventListener("leavepictureinpicture",this.onDisablePIP),e.addEventListener("webkitpresentationmodechanged",this.onPresentationModeChange),e.addEventListener("canplay",this.onReady),r&&e.setAttribute("playsinline","")}removeListeners(e){e.removeEventListener("canplay",this.onReady),e.removeEventListener("play",this.onPlay),e.removeEventListener("waiting",this.onBuffer),e.removeEventListener("playing",this.onBufferEnd),e.removeEventListener("pause",this.onPause),e.removeEventListener("seeked",this.onSeek),e.removeEventListener("ended",this.onEnded),e.removeEventListener("error",this.onError),e.removeEventListener("ratechange",this.onPlayBackRateChange),e.removeEventListener("enterpictureinpicture",this.onEnablePIP),e.removeEventListener("leavepictureinpicture",this.onDisablePIP),e.removeEventListener("canplay",this.onReady)}async load(e){var a;let{onError:r,config:o}=this.props;if(!((a=globalThis.customElements)!=null&&a.get("mux-player")))try{await import(`${os.replace("VERSION",o.version)}`),this.props.onLoaded()}catch(l){r(l)}let[,i]=e.match(ge);this.player.playbackId=i}play(){let e=this.player.play();e&&e.catch(this.props.onError)}pause(){this.player.pause()}stop(){this.player.playbackId=null}seekTo(e,r=!0){this.player.currentTime=e,r||this.pause()}setVolume(e){this.player.volume=e}enablePIP(){this.player.requestPictureInPicture&&document.pictureInPictureElement!==this.player&&this.player.requestPictureInPicture()}disablePIP(){document.exitPictureInPicture&&document.pictureInPictureElement===this.player&&document.exitPictureInPicture()}setPlaybackRate(e){try{this.player.playbackRate=e}catch(r){this.props.onError(r)}}getDuration(){if(!this.player)return null;let{duration:e,seekable:r}=this.player;return e===1/0&&r.length>0?r.end(r.length-1):e}getCurrentTime(){return this.player?this.player.currentTime:null}getSecondsLoaded(){if(!this.player)return null;let{buffered:e}=this.player;if(e.length===0)return 0;let r=e.end(e.length-1),o=this.getDuration();return r>o?o:r}getPlaybackId(e){let[,r]=e.match(ge);return r}render(){let{url:e,playing:r,loop:o,controls:i,muted:a,config:l,width:p,height:h}=this.props,u={width:p==="auto"?p:"100%",height:h==="auto"?h:"100%"};return i===!1&&(u["--controls"]="none"),Se.default.createElement("mux-player",{ref:this.ref,"playback-id":this.getPlaybackId(e),style:u,preload:"auto",autoPlay:r||void 0,muted:a?"":void 0,loop:o?"":void 0,...l.attributes})}};s(ee,"displayName","Mux"),s(ee,"canPlay",c.mux)});var Ot={};S(Ot,{default:()=>j});var Te,Dt,At,kt,as,j,Ct=E(()=>{Te=y(P());b();T();Dt="https://connect.facebook.net/en_US/sdk.js",At="FB",kt="fbAsyncInit",as="facebook-player-",j=class extends Te.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"playerID",this.props.config.playerId||`${as}${X()}`);s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e,r){if(r){d(Dt,At,kt).then(o=>o.XFBML.parse());return}d(Dt,At,kt).then(o=>{o.init({appId:this.props.config.appId,xfbml:!0,version:this.props.config.version}),o.Event.subscribe("xfbml.render",i=>{this.props.onLoaded()}),o.Event.subscribe("xfbml.ready",i=>{i.type==="video"&&i.id===this.playerID&&(this.player=i.instance,this.player.subscribe("startedPlaying",this.props.onPlay),this.player.subscribe("paused",this.props.onPause),this.player.subscribe("finishedPlaying",this.props.onEnded),this.player.subscribe("startedBuffering",this.props.onBuffer),this.player.subscribe("finishedBuffering",this.props.onBufferEnd),this.player.subscribe("error",this.props.onError),this.props.muted?this.callPlayer("mute"):this.callPlayer("unmute"),this.props.onReady(),document.getElementById(this.playerID).querySelector("iframe").style.visibility="visible")})})}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}getDuration(){return this.callPlayer("getDuration")}getCurrentTime(){return this.callPlayer("getCurrentPosition")}getSecondsLoaded(){return null}render(){let{attributes:e}=this.props.config;return Te.default.createElement("div",{style:{width:"100%",height:"100%"},id:this.playerID,className:"fb-video","data-href":this.props.url,"data-autoplay":this.props.playing?"true":"false","data-allowfullscreen":"true","data-controls":this.props.controls?"true":"false",...e})}};s(j,"displayName","Facebook"),s(j,"canPlay",c.facebook),s(j,"loopOnEnded",!0)});var Mt={};S(Mt,{default:()=>te});var Re,ls,ps,te,xt=E(()=>{Re=y(P());b();T();ls="https://cdn.embed.ly/player-0.1.0.min.js",ps="playerjs",te=class extends Re.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){d(ls,ps).then(r=>{this.iframe&&(this.player=new r.Player(this.iframe),this.player.setLoop(this.props.loop),this.player.on("ready",this.props.onReady),this.player.on("play",this.props.onPlay),this.player.on("pause",this.props.onPause),this.player.on("seeked",this.props.onSeek),this.player.on("ended",this.props.onEnded),this.player.on("error",this.props.onError),this.player.on("timeupdate",({duration:o,seconds:i})=>{this.duration=o,this.currentTime=i}),this.player.on("buffered",({percent:o})=>{this.duration&&(this.secondsLoaded=this.duration*o)}),this.props.muted&&this.player.mute())},this.props.onError)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("setCurrentTime",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e*100)}setLoop(e){this.callPlayer("setLoop",e)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.secondsLoaded}render(){let e=this.props.url.match(ze)[1],r={width:"100%",height:"100%"};return Re.default.createElement("iframe",{ref:this.ref,src:`https://streamable.com/o/${e}`,frameBorder:"0",scrolling:"no",style:r,allow:"encrypted-media; autoplay; fullscreen;"})}};s(te,"displayName","Streamable"),s(te,"canPlay",c.streamable)});var Ut={};S(Ut,{default:()=>K});var Ie,us,hs,cs,K,Nt=E(()=>{Ie=y(P());b();T();us="https://fast.wistia.com/assets/external/E-v1.js",hs="Wistia",cs="wistia-player-",K=class extends Ie.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"playerID",this.props.config.playerId||`${cs}${X()}`);s(this,"onPlay",(...e)=>this.props.onPlay(...e));s(this,"onPause",(...e)=>this.props.onPause(...e));s(this,"onSeek",(...e)=>this.props.onSeek(...e));s(this,"onEnded",(...e)=>this.props.onEnded(...e));s(this,"onPlaybackRateChange",(...e)=>this.props.onPlaybackRateChange(...e));s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){let{playing:r,muted:o,controls:i,onReady:a,config:l,onError:p}=this.props;d(us,hs).then(h=>{l.customControls&&l.customControls.forEach(u=>h.defineControl(u)),window._wq=window._wq||[],window._wq.push({id:this.playerID,options:{autoPlay:r,silentAutoPlay:"allow",muted:o,controlsVisibleOnLoad:i,fullscreenButton:i,playbar:i,playbackRateControl:i,qualityControl:i,volumeControl:i,settingsControl:i,smallPlayButton:i,...l.options},onReady:u=>{this.player=u,this.unbind(),this.player.bind("play",this.onPlay),this.player.bind("pause",this.onPause),this.player.bind("seek",this.onSeek),this.player.bind("end",this.onEnded),this.player.bind("playbackratechange",this.onPlaybackRateChange),a()}})},p)}unbind(){this.player.unbind("play",this.onPlay),this.player.unbind("pause",this.onPause),this.player.unbind("seek",this.onSeek),this.player.unbind("end",this.onEnded),this.player.unbind("playbackratechange",this.onPlaybackRateChange)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){this.unbind(),this.callPlayer("remove")}seekTo(e,r=!0){this.callPlayer("time",e),r||this.pause()}setVolume(e){this.callPlayer("volume",e)}setPlaybackRate(e){this.callPlayer("playbackRate",e)}getDuration(){return this.callPlayer("duration")}getCurrentTime(){return this.callPlayer("time")}getSecondsLoaded(){return null}render(){let{url:e}=this.props,r=e&&e.match($e)[1],o=`wistia_embed wistia_async_${r}`,i={width:"100%",height:"100%"};return Ie.default.createElement("div",{id:this.playerID,key:r,className:o,style:i})}};s(K,"displayName","Wistia"),s(K,"canPlay",c.wistia),s(K,"loopOnEnded",!0)});var Vt={};S(Vt,{default:()=>z});var _e,ds,ys,fs,z,Bt=E(()=>{_e=y(P());b();T();ds="https://player.twitch.tv/js/embed/v1.js",ys="Twitch",fs="twitch-player-",z=class extends _e.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"playerID",this.props.config.playerId||`${fs}${X()}`);s(this,"mute",()=>{this.callPlayer("setMuted",!0)});s(this,"unmute",()=>{this.callPlayer("setMuted",!1)})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e,r){let{playsinline:o,onError:i,config:a,controls:l}=this.props,p=be.test(e),h=p?e.match(be)[1]:e.match(Fe)[1];if(r){p?this.player.setChannel(h):this.player.setVideo("v"+h);return}d(ds,ys).then(u=>{this.player=new u.Player(this.playerID,{video:p?"":h,channel:p?h:"",height:"100%",width:"100%",playsinline:o,autoplay:this.props.playing,muted:this.props.muted,controls:p?!0:l,time:C(e),...a.options});let{READY:m,PLAYING:D,PAUSE:O,ENDED:N,ONLINE:A,OFFLINE:Ue,SEEK:Ne}=u.Player;this.player.addEventListener(m,this.props.onReady),this.player.addEventListener(D,this.props.onPlay),this.player.addEventListener(O,this.props.onPause),this.player.addEventListener(N,this.props.onEnded),this.player.addEventListener(Ne,this.props.onSeek),this.player.addEventListener(A,this.props.onLoaded),this.player.addEventListener(Ue,this.props.onLoaded)},i)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){this.callPlayer("pause")}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}getDuration(){return this.callPlayer("getDuration")}getCurrentTime(){return this.callPlayer("getCurrentTime")}getSecondsLoaded(){return null}render(){return _e.default.createElement("div",{style:{width:"100%",height:"100%"},id:this.playerID})}};s(z,"displayName","Twitch"),s(z,"canPlay",c.twitch),s(z,"loopOnEnded",!0)});var Ht={};S(Ht,{default:()=>$});var ue,ms,Ps,gs,$,jt=E(()=>{ue=y(P());b();T();ms="https://api.dmcdn.net/all.js",Ps="DM",gs="dmAsyncInit",$=class extends ue.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"onDurationChange",()=>{let e=this.getDuration();this.props.onDuration(e)});s(this,"mute",()=>{this.callPlayer("setMuted",!0)});s(this,"unmute",()=>{this.callPlayer("setMuted",!1)});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){let{controls:r,config:o,onError:i,playing:a}=this.props,[,l]=e.match(Ye);if(this.player){this.player.load(l,{start:C(e),autoplay:a});return}d(ms,Ps,gs,p=>p.player).then(p=>{if(!this.container)return;let h=p.player;this.player=new h(this.container,{width:"100%",height:"100%",video:l,params:{controls:r,autoplay:this.props.playing,mute:this.props.muted,start:C(e),origin:window.location.origin,...o.params},events:{apiready:this.props.onReady,seeked:()=>this.props.onSeek(this.player.currentTime),video_end:this.props.onEnded,durationchange:this.onDurationChange,pause:this.props.onPause,playing:this.props.onPlay,waiting:this.props.onBuffer,error:u=>i(u)}})},i)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}getDuration(){return this.player.duration||null}getCurrentTime(){return this.player.currentTime}getSecondsLoaded(){return this.player.bufferedTime}render(){let{display:e}=this.props;return ue.default.createElement("div",{style:{width:"100%",height:"100%",display:e}},ue.default.createElement("div",{ref:this.ref}))}};s($,"displayName","DailyMotion"),s($,"canPlay",c.dailymotion),s($,"loopOnEnded",!0)});var Kt={};S(Kt,{default:()=>F});var De,bs,Es,F,zt=E(()=>{De=y(P());b();T();bs="https://widget.mixcloud.com/media/js/widgetApi.js",Es="Mixcloud",F=class extends De.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{});s(this,"unmute",()=>{});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){d(bs,Es).then(r=>{this.player=r.PlayerWidget(this.iframe),this.player.ready.then(()=>{this.player.events.play.on(this.props.onPlay),this.player.events.pause.on(this.props.onPause),this.player.events.ended.on(this.props.onEnded),this.player.events.error.on(this.props.error),this.player.events.progress.on((o,i)=>{this.currentTime=o,this.duration=i}),this.props.onReady()})},this.props.onError)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return null}render(){let{url:e,config:r}=this.props,o=e.match(Ge)[1],i={width:"100%",height:"100%"},a=mt({...r.options,feed:`/${o}/`});return De.default.createElement("iframe",{key:o,ref:this.ref,style:i,src:`https://www.mixcloud.com/widget/iframe/?${a}`,frameBorder:"0",allow:"autoplay"})}};s(F,"displayName","Mixcloud"),s(F,"canPlay",c.mixcloud),s(F,"loopOnEnded",!0)});var $t={};S($t,{default:()=>re});var he,vs,Ls,ws,re,Ft=E(()=>{he=y(P());b();T();vs="https://play.vidyard.com/embed/v4.js",Ls="VidyardV4",ws="onVidyardAPI",re=class extends he.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"mute",()=>{this.setVolume(0)});s(this,"unmute",()=>{this.props.volume!==null&&this.setVolume(this.props.volume)});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){let{playing:r,config:o,onError:i,onDuration:a}=this.props,l=e&&e.match(qe)[1];this.player&&this.stop(),d(vs,Ls,ws).then(p=>{this.container&&(p.api.addReadyListener((h,u)=>{this.player||(this.player=u,this.player.on("ready",this.props.onReady),this.player.on("play",this.props.onPlay),this.player.on("pause",this.props.onPause),this.player.on("seek",this.props.onSeek),this.player.on("playerComplete",this.props.onEnded))},l),p.api.renderPlayer({uuid:l,container:this.container,autoplay:r?1:0,...o.options}),p.api.getPlayerMetadata(l).then(h=>{this.duration=h.length_in_seconds,a(h.length_in_seconds)}))},i)}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){window.VidyardV4.api.destroyPlayer(this.player)}seekTo(e,r=!0){this.callPlayer("seek",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}setPlaybackRate(e){this.callPlayer("setPlaybackSpeed",e)}getDuration(){return this.duration}getCurrentTime(){return this.callPlayer("currentTime")}getSecondsLoaded(){return null}render(){let{display:e}=this.props;return he.default.createElement("div",{style:{width:"100%",height:"100%",display:e}},he.default.createElement("div",{ref:this.ref}))}};s(re,"displayName","Vidyard"),s(re,"canPlay",c.vidyard)});var Yt={};S(Yt,{default:()=>se});var Ae,Ss,Ts,se,Gt=E(()=>{Ae=y(P());b();T();Ss="https://cdn.embed.ly/player-0.1.0.min.js",Ts="playerjs",se=class extends Ae.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"secondsLoaded",null);s(this,"mute",()=>{this.callPlayer("mute")});s(this,"unmute",()=>{this.callPlayer("unmute")});s(this,"ref",e=>{this.iframe=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){d(Ss,Ts).then(r=>{this.iframe&&(this.player=new r.Player(this.iframe),this.player.on("ready",()=>{setTimeout(()=>{this.player.isReady=!0,this.player.setLoop(this.props.loop),this.props.muted&&this.player.mute(),this.addListeners(this.player,this.props),this.props.onReady()},500)}))},this.props.onError)}addListeners(e,r){e.on("play",r.onPlay),e.on("pause",r.onPause),e.on("ended",r.onEnded),e.on("error",r.onError),e.on("timeupdate",({duration:o,seconds:i})=>{this.duration=o,this.currentTime=i})}play(){this.callPlayer("play")}pause(){this.callPlayer("pause")}stop(){}seekTo(e,r=!0){this.callPlayer("setCurrentTime",e),r||this.pause()}setVolume(e){this.callPlayer("setVolume",e)}setLoop(e){this.callPlayer("setLoop",e)}getDuration(){return this.duration}getCurrentTime(){return this.currentTime}getSecondsLoaded(){return this.secondsLoaded}render(){let e={width:"100%",height:"100%"};return Ae.default.createElement("iframe",{ref:this.ref,src:this.props.url,frameBorder:"0",scrolling:"no",style:e,allow:"encrypted-media; autoplay; fullscreen;",referrerPolicy:"no-referrer-when-downgrade"})}};s(se,"displayName","Kaltura"),s(se,"canPlay",c.kaltura)});var qt={};S(qt,{default:()=>Y});var de,Rs,ce,Is,Y,Wt=E(()=>{de=y(P());b();T();Rs="https://open.spotify.com/embed/iframe-api/v1",ce="SpotifyIframeApi",Is="SpotifyIframeApi",Y=class extends de.Component{constructor(){super(...arguments);s(this,"callPlayer",f);s(this,"duration",null);s(this,"currentTime",null);s(this,"totalTime",null);s(this,"player",null);s(this,"initializePlayer",(e,r)=>{if(!this.container)return;let o={width:"100%",height:"100%",uri:r},i=a=>{this.player=a,this.player.addListener("playback_update",this.onStateChange),this.player.addListener("ready",this.props.onReady)};e.createController(this.container,o,i)});s(this,"onStateChange",e=>{let{data:r}=e,{onPlay:o,onPause:i,onBuffer:a,onBufferEnd:l,onEnded:p}=this.props;r.position>=r.duration&&r.position&&r.duration&&p(),r.isPaused===!0&&i(),r.isPaused===!1&&r.isBuffering===!1&&(this.currentTime=r.position,this.totalTime=r.duration,o(),l()),r.isBuffering===!0&&a()});s(this,"ref",e=>{this.container=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this)}load(e){if(window[ce]&&!this.player&&window[ce].createController&&typeof window[ce].createController=="function"){this.initializePlayer(window[ce],e);return}else if(this.player){this.callPlayer("loadUri",this.props.url);return}window.onSpotifyIframeApiReady=o=>this.initializePlayer(o,e),d(Rs,ce,Is)}play(){this.callPlayer("resume")}pause(){this.callPlayer("pause")}stop(){this.callPlayer("destroy")}seekTo(e){this.callPlayer("seek",e),this.props.playing?this.play():this.pause()}setVolume(e){}mute(){}unmute(){}setPlaybackRate(e){}setLoop(e){}getDuration(){return this.totalTime/1e3}getCurrentTime(){return this.currentTime/1e3}getSecondsLoaded(){}render(){return de.default.createElement("div",{style:{width:"100%",height:"100%"}},de.default.createElement("div",{ref:this.ref}))}};s(Y,"displayName","Spotify"),s(Y,"loopOnEnded",!0),s(Y,"canPlay",c.spotify)});var Zt={};S(Zt,{default:()=>ne});var G,Je,_s,Xt,Ds,As,ks,Os,Cs,Ms,xs,Us,Qe,Ns,ne,Qt=E(()=>{G=y(P());b();T();Je=typeof navigator!="undefined",_s=Je&&navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,Xt=Je&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||_s)&&!window.MSStream,Ds=Je&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent)&&!window.MSStream,As="https://cdn.jsdelivr.net/npm/hls.js@VERSION/dist/hls.min.js",ks="Hls",Os="https://cdnjs.cloudflare.com/ajax/libs/dashjs/VERSION/dash.all.min.js",Cs="dashjs",Ms="https://cdn.jsdelivr.net/npm/flv.js@VERSION/dist/flv.min.js",xs="flvjs",Us=/www\.dropbox\.com\/.+/,Qe=/https:\/\/watch\.cloudflarestream\.com\/([a-z0-9]+)/,Ns="https://videodelivery.net/{id}/manifest/video.m3u8",ne=class extends G.Component{constructor(){super(...arguments);s(this,"onReady",(...e)=>this.props.onReady(...e));s(this,"onPlay",(...e)=>this.props.onPlay(...e));s(this,"onBuffer",(...e)=>this.props.onBuffer(...e));s(this,"onBufferEnd",(...e)=>this.props.onBufferEnd(...e));s(this,"onPause",(...e)=>this.props.onPause(...e));s(this,"onEnded",(...e)=>this.props.onEnded(...e));s(this,"onError",(...e)=>this.props.onError(...e));s(this,"onPlayBackRateChange",e=>this.props.onPlaybackRateChange(e.target.playbackRate));s(this,"onEnablePIP",(...e)=>this.props.onEnablePIP(...e));s(this,"onDisablePIP",e=>{let{onDisablePIP:r,playing:o}=this.props;r(e),o&&this.play()});s(this,"onPresentationModeChange",e=>{if(this.player&&Z(this.player)){let{webkitPresentationMode:r}=this.player;r==="picture-in-picture"?this.onEnablePIP(e):r==="inline"&&this.onDisablePIP(e)}});s(this,"onSeek",e=>{this.props.onSeek(e.target.currentTime)});s(this,"mute",()=>{this.player.muted=!0});s(this,"unmute",()=>{this.player.muted=!1});s(this,"renderSourceElement",(e,r)=>typeof e=="string"?G.default.createElement("source",{key:r,src:e}):G.default.createElement("source",{key:r,...e}));s(this,"renderTrack",(e,r)=>G.default.createElement("track",{key:r,...e}));s(this,"ref",e=>{this.player&&(this.prevPlayer=this.player),this.player=e})}componentDidMount(){this.props.onMount&&this.props.onMount(this),this.addListeners(this.player);let e=this.getSource(this.props.url);e&&(this.player.src=e),(Xt||this.props.config.forceDisableHls)&&this.player.load()}componentDidUpdate(e){this.shouldUseAudio(this.props)!==this.shouldUseAudio(e)&&(this.removeListeners(this.prevPlayer,e.url),this.addListeners(this.player)),this.props.url!==e.url&&!M(this.props.url)&&!(this.props.url instanceof Array)&&(this.player.srcObject=null)}componentWillUnmount(){this.player.removeAttribute("src"),this.removeListeners(this.player),this.hls&&this.hls.destroy()}addListeners(e){let{url:r,playsinline:o}=this.props;e.addEventListener("play",this.onPlay),e.addEventListener("waiting",this.onBuffer),e.addEventListener("playing",this.onBufferEnd),e.addEventListener("pause",this.onPause),e.addEventListener("seeked",this.onSeek),e.addEventListener("ended",this.onEnded),e.addEventListener("error",this.onError),e.addEventListener("ratechange",this.onPlayBackRateChange),e.addEventListener("enterpictureinpicture",this.onEnablePIP),e.addEventListener("leavepictureinpicture",this.onDisablePIP),e.addEventListener("webkitpresentationmodechanged",this.onPresentationModeChange),this.shouldUseHLS(r)||e.addEventListener("canplay",this.onReady),o&&(e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline",""),e.setAttribute("x5-playsinline",""))}removeListeners(e,r){e.removeEventListener("canplay",this.onReady),e.removeEventListener("play",this.onPlay),e.removeEventListener("waiting",this.onBuffer),e.removeEventListener("playing",this.onBufferEnd),e.removeEventListener("pause",this.onPause),e.removeEventListener("seeked",this.onSeek),e.removeEventListener("ended",this.onEnded),e.removeEventListener("error",this.onError),e.removeEventListener("ratechange",this.onPlayBackRateChange),e.removeEventListener("enterpictureinpicture",this.onEnablePIP),e.removeEventListener("leavepictureinpicture",this.onDisablePIP),e.removeEventListener("webkitpresentationmodechanged",this.onPresentationModeChange),this.shouldUseHLS(r)||e.removeEventListener("canplay",this.onReady)}shouldUseAudio(e){return e.config.forceVideo||e.config.attributes.poster?!1:Q.test(e.url)||e.config.forceAudio}shouldUseHLS(e){return Ds&&this.props.config.forceSafariHLS||this.props.config.forceHLS?!0:Xt||this.props.config.forceDisableHls?!1:Ee.test(e)||Qe.test(e)}shouldUseDASH(e){return We.test(e)||this.props.config.forceDASH}shouldUseFLV(e){return Xe.test(e)||this.props.config.forceFLV}load(e){let{hlsVersion:r,hlsOptions:o,dashVersion:i,flvVersion:a}=this.props.config;if(this.hls&&this.hls.destroy(),this.dash&&this.dash.reset(),this.shouldUseHLS(e)&&d(As.replace("VERSION",r),ks).then(l=>{if(this.hls=new l(o),this.hls.on(l.Events.MANIFEST_PARSED,()=>{this.props.onReady()}),this.hls.on(l.Events.ERROR,(p,h)=>{this.props.onError(p,h,this.hls,l)}),Qe.test(e)){let p=e.match(Qe)[1];this.hls.loadSource(Ns.replace("{id}",p))}else this.hls.loadSource(e);this.hls.attachMedia(this.player),this.props.onLoaded()}),this.shouldUseDASH(e)&&d(Os.replace("VERSION",i),Cs).then(l=>{this.dash=l.MediaPlayer().create(),this.dash.initialize(this.player,e,this.props.playing),this.dash.on("error",this.props.onError),parseInt(i)<3?this.dash.getDebug().setLogToBrowserConsole(!1):this.dash.updateSettings({debug:{logLevel:l.Debug.LOG_LEVEL_NONE}}),this.props.onLoaded()}),this.shouldUseFLV(e)&&d(Ms.replace("VERSION",a),xs).then(l=>{this.flv=l.createPlayer({type:"flv",url:e}),this.flv.attachMediaElement(this.player),this.flv.on(l.Events.ERROR,(p,h)=>{this.props.onError(p,h,this.flv,l)}),this.flv.load(),this.props.onLoaded()}),e instanceof Array)this.player.load();else if(M(e))try{this.player.srcObject=e}catch{this.player.src=window.URL.createObjectURL(e)}}play(){let e=this.player.play();e&&e.catch(this.props.onError)}pause(){this.player.pause()}stop(){this.player.removeAttribute("src"),this.dash&&this.dash.reset()}seekTo(e,r=!0){this.player.currentTime=e,r||this.pause()}setVolume(e){this.player.volume=e}enablePIP(){this.player.requestPictureInPicture&&document.pictureInPictureElement!==this.player?this.player.requestPictureInPicture():Z(this.player)&&this.player.webkitPresentationMode!=="picture-in-picture"&&this.player.webkitSetPresentationMode("picture-in-picture")}disablePIP(){document.exitPictureInPicture&&document.pictureInPictureElement===this.player?document.exitPictureInPicture():Z(this.player)&&this.player.webkitPresentationMode!=="inline"&&this.player.webkitSetPresentationMode("inline")}setPlaybackRate(e){try{this.player.playbackRate=e}catch(r){this.props.onError(r)}}getDuration(){if(!this.player)return null;let{duration:e,seekable:r}=this.player;return e===1/0&&r.length>0?r.end(r.length-1):e}getCurrentTime(){return this.player?this.player.currentTime:null}getSecondsLoaded(){if(!this.player)return null;let{buffered:e}=this.player;if(e.length===0)return 0;let r=e.end(e.length-1),o=this.getDuration();return r>o?o:r}getSource(e){let r=this.shouldUseHLS(e),o=this.shouldUseDASH(e),i=this.shouldUseFLV(e);if(!(e instanceof Array||M(e)||r||o||i))return Us.test(e)?e.replace("www.dropbox.com","dl.dropboxusercontent.com"):e}render(){let{url:e,playing:r,loop:o,controls:i,muted:a,config:l,width:p,height:h}=this.props,m=this.shouldUseAudio(this.props)?"audio":"video",D={width:p==="auto"?p:"100%",height:h==="auto"?h:"100%"};return G.default.createElement(m,{ref:this.ref,src:this.getSource(e),style:D,preload:"auto",autoPlay:r||void 0,controls:i,muted:a,loop:o,...l.attributes},e instanceof Array&&e.map(this.renderSourceElement),l.tracks.map(this.renderTrack))}};s(ne,"displayName","FilePlayer"),s(ne,"canPlay",c.file)});var et=V((ti,er)=>{var js=typeof Element!="undefined",Ks=typeof Map=="function",zs=typeof Set=="function",$s=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function Ce(t,n){if(t===n)return!0;if(t&&n&&typeof t=="object"&&typeof n=="object"){if(t.constructor!==n.constructor)return!1;var e,r,o;if(Array.isArray(t)){if(e=t.length,e!=n.length)return!1;for(r=e;r--!==0;)if(!Ce(t[r],n[r]))return!1;return!0}var i;if(Ks&&t instanceof Map&&n instanceof Map){if(t.size!==n.size)return!1;for(i=t.entries();!(r=i.next()).done;)if(!n.has(r.value[0]))return!1;for(i=t.entries();!(r=i.next()).done;)if(!Ce(r.value[1],n.get(r.value[0])))return!1;return!0}if(zs&&t instanceof Set&&n instanceof Set){if(t.size!==n.size)return!1;for(i=t.entries();!(r=i.next()).done;)if(!n.has(r.value[0]))return!1;return!0}if($s&&ArrayBuffer.isView(t)&&ArrayBuffer.isView(n)){if(e=t.length,e!=n.length)return!1;for(r=e;r--!==0;)if(t[r]!==n[r])return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf&&typeof t.valueOf=="function"&&typeof n.valueOf=="function")return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString&&typeof t.toString=="function"&&typeof n.toString=="function")return t.toString()===n.toString();if(o=Object.keys(t),e=o.length,e!==Object.keys(n).length)return!1;for(r=e;r--!==0;)if(!Object.prototype.hasOwnProperty.call(n,o[r]))return!1;if(js&&t instanceof Element)return!1;for(r=e;r--!==0;)if(!((o[r]==="_owner"||o[r]==="__v"||o[r]==="__o")&&t.$$typeof)&&!Ce(t[o[r]],n[o[r]]))return!1;return!0}return t!==t&&n!==n}er.exports=function(n,e){try{return Ce(n,e)}catch(r){if((r.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw r}}});var rr=V((ri,tr)=>{"use strict";var Fs="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";tr.exports=Fs});var or=V((si,ir)=>{"use strict";var Ys=rr();function sr(){}function nr(){}nr.resetWarningCache=sr;ir.exports=function(){function t(r,o,i,a,l,p){if(p!==Ys){var h=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw h.name="Invariant Violation",h}}t.isRequired=t;function n(){return t}var e={array:t,bigint:t,bool:t,func:t,number:t,object:t,string:t,symbol:t,any:t,arrayOf:n,element:t,elementType:t,instanceOf:n,node:t,objectOf:n,oneOf:n,oneOfType:n,shape:n,exact:n,checkPropTypes:nr,resetWarningCache:sr};return e.PropTypes=e,e}});var lr=V((oi,ar)=>{ar.exports=or()();var ni,ii});var cr={};S(cr,{default:()=>xe});var U,rt,st,xe,dr=E(()=>{U=y(P()),rt="64px",st={},xe=class extends U.Component{constructor(){super(...arguments);s(this,"mounted",!1);s(this,"state",{image:null});s(this,"handleKeyPress",e=>{(e.key==="Enter"||e.key===" ")&&this.props.onClick()})}componentDidMount(){this.mounted=!0,this.fetchImage(this.props)}componentDidUpdate(e){let{url:r,light:o}=this.props;(e.url!==r||e.light!==o)&&this.fetchImage(this.props)}componentWillUnmount(){this.mounted=!1}fetchImage({url:e,light:r,oEmbedUrl:o}){if(!U.default.isValidElement(r)){if(typeof r=="string"){this.setState({image:r});return}if(st[e]){this.setState({image:st[e]});return}return this.setState({image:null}),window.fetch(o.replace("{url}",e)).then(i=>i.json()).then(i=>{if(i.thumbnail_url&&this.mounted){let a=i.thumbnail_url.replace("height=100","height=480").replace("-d_295x166","-d_640");this.setState({image:a}),st[e]=a}})}}render(){let{light:e,onClick:r,playIcon:o,previewTabIndex:i,previewAriaLabel:a}=this.props,{image:l}=this.state,p=U.default.isValidElement(e),h={display:"flex",alignItems:"center",justifyContent:"center"},u={preview:{width:"100%",height:"100%",backgroundImage:l&&!p?`url(${l})`:void 0,backgroundSize:"cover",backgroundPosition:"center",cursor:"pointer",...h},shadow:{background:"radial-gradient(rgb(0, 0, 0, 0.3), rgba(0, 0, 0, 0) 60%)",borderRadius:rt,width:rt,height:rt,position:p?"absolute":void 0,...h},playIcon:{borderStyle:"solid",borderWidth:"16px 0 16px 26px",borderColor:"transparent transparent transparent white",marginLeft:"7px"}},m=U.default.createElement("div",{style:u.shadow,className:"react-player__shadow"},U.default.createElement("div",{style:u.playIcon,className:"react-player__play-icon"}));return U.default.createElement("div",{style:u.preview,className:"react-player__preview",onClick:r,tabIndex:i,onKeyPress:this.handleKeyPress,...a?{"aria-label":a}:{}},p?e:null,o||m)}}});var tn={};S(tn,{default:()=>en});b();T();var ke=[{key:"youtube",name:"YouTube",canPlay:c.youtube,lazyPlayer:v(()=>Promise.resolve().then(()=>(Lt(),vt)))},{key:"soundcloud",name:"SoundCloud",canPlay:c.soundcloud,lazyPlayer:v(()=>Promise.resolve().then(()=>(St(),wt)))},{key:"vimeo",name:"Vimeo",canPlay:c.vimeo,lazyPlayer:v(()=>Promise.resolve().then(()=>(Rt(),Tt)))},{key:"mux",name:"Mux",canPlay:c.mux,lazyPlayer:v(()=>Promise.resolve().then(()=>(_t(),It)))},{key:"facebook",name:"Facebook",canPlay:c.facebook,lazyPlayer:v(()=>Promise.resolve().then(()=>(Ct(),Ot)))},{key:"streamable",name:"Streamable",canPlay:c.streamable,lazyPlayer:v(()=>Promise.resolve().then(()=>(xt(),Mt)))},{key:"wistia",name:"Wistia",canPlay:c.wistia,lazyPlayer:v(()=>Promise.resolve().then(()=>(Nt(),Ut)))},{key:"twitch",name:"Twitch",canPlay:c.twitch,lazyPlayer:v(()=>Promise.resolve().then(()=>(Bt(),Vt)))},{key:"dailymotion",name:"DailyMotion",canPlay:c.dailymotion,lazyPlayer:v(()=>Promise.resolve().then(()=>(jt(),Ht)))},{key:"mixcloud",name:"Mixcloud",canPlay:c.mixcloud,lazyPlayer:v(()=>Promise.resolve().then(()=>(zt(),Kt)))},{key:"vidyard",name:"Vidyard",canPlay:c.vidyard,lazyPlayer:v(()=>Promise.resolve().then(()=>(Ft(),$t)))},{key:"kaltura",name:"Kaltura",canPlay:c.kaltura,lazyPlayer:v(()=>Promise.resolve().then(()=>(Gt(),Yt)))},{key:"spotify",name:"Spotify",canPlay:c.spotify,lazyPlayer:v(()=>Promise.resolve().then(()=>(Wt(),qt)))},{key:"file",name:"FilePlayer",canPlay:c.file,canEnablePIP:t=>c.file(t)&&(document.pictureInPictureEnabled||Z())&&!Q.test(t),lazyPlayer:v(()=>Promise.resolve().then(()=>(Qt(),Zt)))}];var k=y(P()),yr=y(Ve());var Jt=Number.isNaN||function(n){return typeof n=="number"&&n!==n};function Vs(t,n){return!!(t===n||Jt(t)&&Jt(n))}function Bs(t,n){if(t.length!==n.length)return!1;for(var e=0;e{},oe={playing:!1,loop:!1,controls:!1,volume:null,muted:!1,playbackRate:1,width:"640px",height:"360px",style:{},progressInterval:1e3,playsinline:!1,pip:!1,stopOnUnmount:!0,light:!1,fallback:null,wrapper:"div",previewTabIndex:0,previewAriaLabel:"",oEmbedUrl:"https://noembed.com/embed?url={url}",config:{soundcloud:{options:{visual:!0,buying:!1,liking:!1,download:!1,sharing:!1,show_comments:!1,show_playcount:!1}},youtube:{playerVars:{playsinline:1,showinfo:0,rel:0,iv_load_policy:3,modestbranding:1},embedOptions:{},onUnstarted:w},facebook:{appId:"1309697205772819",version:"v3.3",playerId:null,attributes:{}},dailymotion:{params:{api:1,"endscreen-enable":!1}},vimeo:{playerOptions:{autopause:!1,byline:!1,portrait:!1,title:!1},title:null},mux:{attributes:{},version:"2"},file:{attributes:{},tracks:[],forceVideo:!1,forceAudio:!1,forceHLS:!1,forceDASH:!1,forceFLV:!1,hlsOptions:{},hlsVersion:"1.1.4",dashVersion:"3.1.3",flvVersion:"1.5.0",forceDisableHls:!1},wistia:{options:{},playerId:null,customControls:null},mixcloud:{options:{hide_cover:1}},twitch:{options:{},playerId:null},vidyard:{options:{}}},onReady:w,onStart:w,onPlay:w,onPause:w,onBuffer:w,onBufferEnd:w,onEnded:w,onError:w,onDuration:w,onSeek:w,onPlaybackRateChange:w,onPlaybackQualityChange:w,onProgress:w,onClickPreview:w,onEnablePIP:w,onDisablePIP:w};b();var Me=y(P()),hr=y(et());b();var Gs=5e3,x=class extends Me.Component{constructor(){super(...arguments);s(this,"mounted",!1);s(this,"isReady",!1);s(this,"isPlaying",!1);s(this,"isLoading",!0);s(this,"loadOnReady",null);s(this,"startOnPlay",!0);s(this,"seekOnPlay",null);s(this,"onDurationCalled",!1);s(this,"handlePlayerMount",e=>{if(this.player){this.progress();return}this.player=e,this.player.load(this.props.url),this.progress()});s(this,"getInternalPlayer",e=>this.player?this.player[e]:null);s(this,"progress",()=>{if(this.props.url&&this.player&&this.isReady){let e=this.getCurrentTime()||0,r=this.getSecondsLoaded(),o=this.getDuration();if(o){let i={playedSeconds:e,played:e/o};r!==null&&(i.loadedSeconds=r,i.loaded=r/o),(i.playedSeconds!==this.prevPlayed||i.loadedSeconds!==this.prevLoaded)&&this.props.onProgress(i),this.prevPlayed=i.playedSeconds,this.prevLoaded=i.loadedSeconds}}this.progressTimeout=setTimeout(this.progress,this.props.progressFrequency||this.props.progressInterval)});s(this,"handleReady",()=>{if(!this.mounted)return;this.isReady=!0,this.isLoading=!1;let{onReady:e,playing:r,volume:o,muted:i}=this.props;e(),!i&&o!==null&&this.player.setVolume(o),this.loadOnReady?(this.player.load(this.loadOnReady,!0),this.loadOnReady=null):r&&this.player.play(),this.handleDurationCheck()});s(this,"handlePlay",()=>{this.isPlaying=!0,this.isLoading=!1;let{onStart:e,onPlay:r,playbackRate:o}=this.props;this.startOnPlay&&(this.player.setPlaybackRate&&o!==1&&this.player.setPlaybackRate(o),e(),this.startOnPlay=!1),r(),this.seekOnPlay&&(this.seekTo(this.seekOnPlay),this.seekOnPlay=null),this.handleDurationCheck()});s(this,"handlePause",e=>{this.isPlaying=!1,this.isLoading||this.props.onPause(e)});s(this,"handleEnded",()=>{let{activePlayer:e,loop:r,onEnded:o}=this.props;e.loopOnEnded&&r&&this.seekTo(0),r||(this.isPlaying=!1,o())});s(this,"handleError",(...e)=>{this.isLoading=!1,this.props.onError(...e)});s(this,"handleDurationCheck",()=>{clearTimeout(this.durationCheckTimeout);let e=this.getDuration();e?this.onDurationCalled||(this.props.onDuration(e),this.onDurationCalled=!0):this.durationCheckTimeout=setTimeout(this.handleDurationCheck,100)});s(this,"handleLoaded",()=>{this.isLoading=!1})}componentDidMount(){this.mounted=!0}componentWillUnmount(){clearTimeout(this.progressTimeout),clearTimeout(this.durationCheckTimeout),this.isReady&&this.props.stopOnUnmount&&(this.player.stop(),this.player.disablePIP&&this.player.disablePIP()),this.mounted=!1}componentDidUpdate(e){if(!this.player)return;let{url:r,playing:o,volume:i,muted:a,playbackRate:l,pip:p,loop:h,activePlayer:u,disableDeferredLoading:m}=this.props;if(!(0,hr.default)(e.url,r)){if(this.isLoading&&!u.forceLoad&&!m&&!M(r)){console.warn(`ReactPlayer: the attempt to load ${r} is being deferred until the player has loaded`),this.loadOnReady=r;return}this.isLoading=!0,this.startOnPlay=!0,this.onDurationCalled=!1,this.player.load(r,this.isReady)}!e.playing&&o&&!this.isPlaying&&this.player.play(),e.playing&&!o&&this.isPlaying&&this.player.pause(),!e.pip&&p&&this.player.enablePIP&&this.player.enablePIP(),e.pip&&!p&&this.player.disablePIP&&this.player.disablePIP(),e.volume!==i&&i!==null&&this.player.setVolume(i),e.muted!==a&&(a?this.player.mute():(this.player.unmute(),i!==null&&setTimeout(()=>this.player.setVolume(i)))),e.playbackRate!==l&&this.player.setPlaybackRate&&this.player.setPlaybackRate(l),e.loop!==h&&this.player.setLoop&&this.player.setLoop(h)}getDuration(){return this.isReady?this.player.getDuration():null}getCurrentTime(){return this.isReady?this.player.getCurrentTime():null}getSecondsLoaded(){return this.isReady?this.player.getSecondsLoaded():null}seekTo(e,r,o){if(!this.isReady){e!==0&&(this.seekOnPlay=e,setTimeout(()=>{this.seekOnPlay=null},Gs));return}if(r?r==="fraction":e>0&&e<1){let a=this.player.getDuration();if(!a){console.warn("ReactPlayer: could not seek using fraction \u2013\xA0duration not yet available");return}this.player.seekTo(a*e,o);return}this.player.seekTo(e,o)}render(){let e=this.props.activePlayer;return e?Me.default.createElement(e,{...this.props,onMount:this.handlePlayerMount,onReady:this.handleReady,onPlay:this.handlePlay,onPause:this.handlePause,onEnded:this.handleEnded,onLoaded:this.handleLoaded,onError:this.handleError}):null}};s(x,"displayName","Player"),s(x,"propTypes",fe),s(x,"defaultProps",oe);var qs=v(()=>Promise.resolve().then(()=>(dr(),cr))),Ws=typeof window!="undefined"&&window.document&&typeof document!="undefined",Xs=typeof global!="undefined"&&global.window&&global.window.document,Zs=Object.keys(fe),Qs=Ws||Xs?k.Suspense:()=>null,me=[],fr=(t,n)=>{var e;return e=class extends k.Component{constructor(){super(...arguments);s(this,"state",{showPreview:!!this.props.light});s(this,"references",{wrapper:i=>{this.wrapper=i},player:i=>{this.player=i}});s(this,"handleClickPreview",i=>{this.setState({showPreview:!1}),this.props.onClickPreview(i)});s(this,"showPreview",()=>{this.setState({showPreview:!0})});s(this,"getDuration",()=>this.player?this.player.getDuration():null);s(this,"getCurrentTime",()=>this.player?this.player.getCurrentTime():null);s(this,"getSecondsLoaded",()=>this.player?this.player.getSecondsLoaded():null);s(this,"getInternalPlayer",(i="player")=>this.player?this.player.getInternalPlayer(i):null);s(this,"seekTo",(i,a,l)=>{if(!this.player)return null;this.player.seekTo(i,a,l)});s(this,"handleReady",()=>{this.props.onReady(this)});s(this,"getActivePlayer",Oe(i=>{for(let a of[...me,...t])if(a.canPlay(i))return a;return n||null}));s(this,"getConfig",Oe((i,a)=>{let{config:l}=this.props;return yr.default.all([oe.config,oe.config[a]||{},l,l[a]||{}])}));s(this,"getAttributes",Oe(i=>Pt(this.props,Zs)));s(this,"renderActivePlayer",i=>{if(!i)return null;let a=this.getActivePlayer(i);if(!a)return null;let l=this.getConfig(i,a.key);return k.default.createElement(x,{...this.props,key:a.key,ref:this.references.player,config:l,activePlayer:a.lazyPlayer||a,onReady:this.handleReady})})}shouldComponentUpdate(i,a){return!(0,nt.default)(this.props,i)||!(0,nt.default)(this.state,a)}componentDidUpdate(i){let{light:a}=this.props;!i.light&&a&&this.setState({showPreview:!0}),i.light&&!a&&this.setState({showPreview:!1})}renderPreview(i){if(!i)return null;let{light:a,playIcon:l,previewTabIndex:p,oEmbedUrl:h,previewAriaLabel:u}=this.props;return k.default.createElement(qs,{url:i,light:a,playIcon:l,previewTabIndex:p,previewAriaLabel:u,oEmbedUrl:h,onClick:this.handleClickPreview})}render(){let{url:i,style:a,width:l,height:p,fallback:h,wrapper:u}=this.props,{showPreview:m}=this.state,D=this.getAttributes(i),O=typeof u=="string"?this.references.wrapper:void 0;return k.default.createElement(u,{ref:O,style:{...a,width:l,height:p},...D},k.default.createElement(Qs,{fallback:h},m?this.renderPreview(i):this.renderActivePlayer(i)))}},s(e,"displayName","ReactPlayer"),s(e,"propTypes",fe),s(e,"defaultProps",oe),s(e,"addCustomPlayer",i=>{me.push(i)}),s(e,"removeCustomPlayers",()=>{me.length=0}),s(e,"canPlay",i=>{for(let a of[...me,...t])if(a.canPlay(i))return!0;return!1}),s(e,"canEnablePIP",i=>{for(let a of[...me,...t])if(a.canEnablePIP&&a.canEnablePIP(i))return!0;return!1}),e};var Js=ke[ke.length-1],en=fr(ke,Js);return Sr(tn);})(); ReactPlayer = ReactPlayer.default; //# sourceMappingURL=ReactPlayer.js.map diff --git a/dist/ReactPlayer.js.map b/dist/ReactPlayer.js.map index fdce6fd3..e5a5d42f 100644 --- a/dist/ReactPlayer.js.map +++ b/dist/ReactPlayer.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["global-externals-plugin:react", "../node_modules/load-script/index.js", "../node_modules/deepmerge/dist/cjs.js", "../src/utils.js", "../src/patterns.js", "../src/players/YouTube.js", "../src/players/SoundCloud.js", "../src/players/Vimeo.js", "../src/players/Mux.js", "../src/players/Facebook.js", "../src/players/Streamable.js", "../src/players/Wistia.js", "../src/players/Twitch.js", "../src/players/DailyMotion.js", "../src/players/Mixcloud.js", "../src/players/Vidyard.js", "../src/players/Kaltura.js", "../src/players/FilePlayer.js", "../node_modules/react-fast-compare/index.js", "../node_modules/prop-types/lib/ReactPropTypesSecret.js", "../node_modules/prop-types/factoryWithThrowingShims.js", "../node_modules/prop-types/index.js", "../src/Preview.js", "../src/index.js", "../src/players/index.js", "../src/ReactPlayer.js", "../node_modules/memoize-one/dist/memoize-one.esm.js", "../src/props.js", "../src/Player.js"], - "sourcesContent": ["module.exports = globalThis.React", "\nmodule.exports = function load (src, opts, cb) {\n var head = document.head || document.getElementsByTagName('head')[0]\n var script = document.createElement('script')\n\n if (typeof opts === 'function') {\n cb = opts\n opts = {}\n }\n\n opts = opts || {}\n cb = cb || function() {}\n\n script.type = opts.type || 'text/javascript'\n script.charset = opts.charset || 'utf8';\n script.async = 'async' in opts ? !!opts.async : true\n script.src = src\n\n if (opts.attrs) {\n setAttributes(script, opts.attrs)\n }\n\n if (opts.text) {\n script.text = '' + opts.text\n }\n\n var onend = 'onload' in script ? stdOnEnd : ieOnEnd\n onend(script, cb)\n\n // some good legacy browsers (firefox) fail the 'in' detection above\n // so as a fallback we always set onload\n // old IE will ignore this and new IE will set onload\n if (!script.onload) {\n stdOnEnd(script, cb);\n }\n\n head.appendChild(script)\n}\n\nfunction setAttributes(script, attrs) {\n for (var attr in attrs) {\n script.setAttribute(attr, attrs[attr]);\n }\n}\n\nfunction stdOnEnd (script, cb) {\n script.onload = function () {\n this.onerror = this.onload = null\n cb(null, script)\n }\n script.onerror = function () {\n // this.onload = null here is necessary\n // because even IE9 works not like others\n this.onerror = this.onload = null\n cb(new Error('Failed to load ' + this.src), script)\n }\n}\n\nfunction ieOnEnd (script, cb) {\n script.onreadystatechange = function () {\n if (this.readyState != 'complete' && this.readyState != 'loaded') return\n this.onreadystatechange = null\n cb(null, script) // there is no way to catch loading errors in IE8\n }\n}\n", "'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n", "import React from 'react'\nimport loadScript from 'load-script'\nimport merge from 'deepmerge'\n\n/**\n * Dynamic import is supported in CJS modules but needs interop require default logic.\n */\nexport const lazy = (componentImportFn) => React.lazy(async () => {\n const obj = await componentImportFn()\n return typeof obj.default === 'function' ? obj : obj.default\n})\n\nconst MATCH_START_QUERY = /[?&#](?:start|t)=([0-9hms]+)/\nconst MATCH_END_QUERY = /[?&#]end=([0-9hms]+)/\nconst MATCH_START_STAMP = /(\\d+)(h|m|s)/g\nconst MATCH_NUMERIC = /^\\d+$/\n\n// Parse YouTube URL for a start time param, ie ?t=1h14m30s\n// and return the start time in seconds\nfunction parseTimeParam (url, pattern) {\n if (url instanceof Array) {\n return undefined\n }\n const match = url.match(pattern)\n if (match) {\n const stamp = match[1]\n if (stamp.match(MATCH_START_STAMP)) {\n return parseTimeString(stamp)\n }\n if (MATCH_NUMERIC.test(stamp)) {\n return parseInt(stamp)\n }\n }\n return undefined\n}\n\nfunction parseTimeString (stamp) {\n let seconds = 0\n let array = MATCH_START_STAMP.exec(stamp)\n while (array !== null) {\n const [, count, period] = array\n if (period === 'h') seconds += parseInt(count, 10) * 60 * 60\n if (period === 'm') seconds += parseInt(count, 10) * 60\n if (period === 's') seconds += parseInt(count, 10)\n array = MATCH_START_STAMP.exec(stamp)\n }\n return seconds\n}\n\nexport function parseStartTime (url) {\n return parseTimeParam(url, MATCH_START_QUERY)\n}\n\nexport function parseEndTime (url) {\n return parseTimeParam(url, MATCH_END_QUERY)\n}\n\n// http://stackoverflow.com/a/38622545\nexport function randomString () {\n return Math.random().toString(36).substr(2, 5)\n}\n\nexport function queryString (object) {\n return Object\n .keys(object)\n .map(key => `${key}=${object[key]}`)\n .join('&')\n}\n\nfunction getGlobal (key) {\n if (window[key]) {\n return window[key]\n }\n if (window.exports && window.exports[key]) {\n return window.exports[key]\n }\n if (window.module && window.module.exports && window.module.exports[key]) {\n return window.module.exports[key]\n }\n return null\n}\n\n// Util function to load an external SDK\n// or return the SDK if it is already loaded\nconst requests = {}\nexport const getSDK = enableStubOn(function getSDK (url, sdkGlobal, sdkReady = null, isLoaded = () => true, fetchScript = loadScript) {\n const existingGlobal = getGlobal(sdkGlobal)\n if (existingGlobal && isLoaded(existingGlobal)) {\n return Promise.resolve(existingGlobal)\n }\n return new Promise((resolve, reject) => {\n // If we are already loading the SDK, add the resolve and reject\n // functions to the existing array of requests\n if (requests[url]) {\n requests[url].push({ resolve, reject })\n return\n }\n requests[url] = [{ resolve, reject }]\n const onLoaded = sdk => {\n // When loaded, resolve all pending request promises\n requests[url].forEach(request => request.resolve(sdk))\n }\n if (sdkReady) {\n const previousOnReady = window[sdkReady]\n window[sdkReady] = function () {\n if (previousOnReady) previousOnReady()\n onLoaded(getGlobal(sdkGlobal))\n }\n }\n fetchScript(url, err => {\n if (err) {\n // Loading the SDK failed \u2013 reject all requests and\n // reset the array of requests for this SDK\n requests[url].forEach(request => request.reject(err))\n requests[url] = null\n } else if (!sdkReady) {\n onLoaded(getGlobal(sdkGlobal))\n }\n })\n })\n})\n\nexport function getConfig (props, defaultProps) {\n return merge(defaultProps.config, props.config)\n}\n\nexport function omit (object, ...arrays) {\n const omitKeys = [].concat(...arrays)\n const output = {}\n const keys = Object.keys(object)\n for (const key of keys) {\n if (omitKeys.indexOf(key) === -1) {\n output[key] = object[key]\n }\n }\n return output\n}\n\nexport function callPlayer (method, ...args) {\n // Util method for calling a method on this.player\n // but guard against errors and console.warn instead\n if (!this.player || !this.player[method]) {\n let message = `ReactPlayer: ${this.constructor.displayName} player could not call %c${method}%c \u2013 `\n if (!this.player) {\n message += 'The player was not available'\n } else if (!this.player[method]) {\n message += 'The method was not available'\n }\n console.warn(message, 'font-weight: bold', '')\n return null\n }\n return this.player[method](...args)\n}\n\nexport function isMediaStream (url) {\n return (\n typeof window !== 'undefined' &&\n typeof window.MediaStream !== 'undefined' &&\n url instanceof window.MediaStream\n )\n}\n\nexport function isBlobUrl (url) {\n return /^blob:/.test(url)\n}\n\nexport function supportsWebKitPresentationMode (video = document.createElement('video')) {\n // Check if Safari supports PiP, and is not on mobile (other than iPad)\n // iPhone safari appears to \"support\" PiP through the check, however PiP does not function\n const notMobile = /iPhone|iPod/.test(navigator.userAgent) === false\n return video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function' && notMobile\n}\n\n// Workaround for being able to stub out functions in ESM exports.\n// https://github.com/evanw/esbuild/issues/412#issuecomment-723047255\nfunction enableStubOn (fn) {\n if (globalThis.__TEST__) {\n const wrap = (...args) => wrap.stub(...args)\n wrap.stub = fn\n return wrap\n }\n return fn\n}\n", "import { isMediaStream, isBlobUrl } from './utils'\n\nexport 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\\//\nexport const MATCH_URL_SOUNDCLOUD = /(?:soundcloud\\.com|snd\\.sc)\\/[^.]+$/\nexport const MATCH_URL_VIMEO = /vimeo\\.com\\/(?!progressive_redirect).+/\n// Match Mux m3u8 URLs without the extension so users can use hls.js with Mux by adding the `.m3u8` extension. https://regexr.com/7um5f\nexport const MATCH_URL_MUX = /stream\\.mux\\.com\\/(?!\\w+\\.m3u8)(\\w+)/\nexport const MATCH_URL_FACEBOOK = /^https?:\\/\\/(www\\.)?facebook\\.com.*\\/(video(s)?|watch|story)(\\.php?|\\/).+$/\nexport const MATCH_URL_FACEBOOK_WATCH = /^https?:\\/\\/fb\\.watch\\/.+$/\nexport const MATCH_URL_STREAMABLE = /streamable\\.com\\/([a-z0-9]+)$/\nexport const MATCH_URL_WISTIA = /(?:wistia\\.(?:com|net)|wi\\.st)\\/(?:medias|embed)\\/(?:iframe\\/)?([^?]+)/\nexport const MATCH_URL_TWITCH_VIDEO = /(?:www\\.|go\\.)?twitch\\.tv\\/videos\\/(\\d+)($|\\?)/\nexport const MATCH_URL_TWITCH_CHANNEL = /(?:www\\.|go\\.)?twitch\\.tv\\/([a-zA-Z0-9_]+)($|\\?)/\nexport const MATCH_URL_DAILYMOTION = /^(?:(?:https?):)?(?:\\/\\/)?(?:www\\.)?(?:(?:dailymotion\\.com(?:\\/embed)?\\/video)|dai\\.ly)\\/([a-zA-Z0-9]+)(?:_[\\w_-]+)?(?:[\\w.#_-]+)?/\nexport const MATCH_URL_MIXCLOUD = /mixcloud\\.com\\/([^/]+\\/[^/]+)/\nexport const MATCH_URL_VIDYARD = /vidyard.com\\/(?:watch\\/)?([a-zA-Z0-9-_]+)/\nexport const MATCH_URL_KALTURA = /^https?:\\/\\/[a-zA-Z]+\\.kaltura.(com|org)\\/p\\/([0-9]+)\\/sp\\/([0-9]+)00\\/embedIframeJs\\/uiconf_id\\/([0-9]+)\\/partner_id\\/([0-9]+)(.*)entry_id.([a-zA-Z0-9-_].*)$/\nexport const AUDIO_EXTENSIONS = /\\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\\?)/i\nexport const VIDEO_EXTENSIONS = /\\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\\d+]+)?($|\\?)/i\nexport const HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i\nexport const DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i\nexport const FLV_EXTENSIONS = /\\.(flv)($|\\?)/i\n\nconst canPlayFile = url => {\n if (url instanceof Array) {\n for (const item of url) {\n if (typeof item === 'string' && canPlayFile(item)) {\n return true\n }\n if (canPlayFile(item.src)) {\n return true\n }\n }\n return false\n }\n if (isMediaStream(url) || isBlobUrl(url)) {\n return true\n }\n return (\n AUDIO_EXTENSIONS.test(url) ||\n VIDEO_EXTENSIONS.test(url) ||\n HLS_EXTENSIONS.test(url) ||\n DASH_EXTENSIONS.test(url) ||\n FLV_EXTENSIONS.test(url)\n )\n}\n\nexport const canPlay = {\n youtube: url => {\n if (url instanceof Array) {\n return url.every(item => MATCH_URL_YOUTUBE.test(item))\n }\n return MATCH_URL_YOUTUBE.test(url)\n },\n soundcloud: url => MATCH_URL_SOUNDCLOUD.test(url) && !AUDIO_EXTENSIONS.test(url),\n vimeo: url => MATCH_URL_VIMEO.test(url) && !VIDEO_EXTENSIONS.test(url) && !HLS_EXTENSIONS.test(url),\n mux: url => MATCH_URL_MUX.test(url),\n facebook: url => MATCH_URL_FACEBOOK.test(url) || MATCH_URL_FACEBOOK_WATCH.test(url),\n streamable: url => MATCH_URL_STREAMABLE.test(url),\n wistia: url => MATCH_URL_WISTIA.test(url),\n twitch: url => MATCH_URL_TWITCH_VIDEO.test(url) || MATCH_URL_TWITCH_CHANNEL.test(url),\n dailymotion: url => MATCH_URL_DAILYMOTION.test(url),\n mixcloud: url => MATCH_URL_MIXCLOUD.test(url),\n vidyard: url => MATCH_URL_VIDYARD.test(url),\n kaltura: url => MATCH_URL_KALTURA.test(url),\n file: canPlayFile\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK, parseStartTime, parseEndTime } from '../utils'\nimport { canPlay, MATCH_URL_YOUTUBE } from '../patterns'\n\nconst SDK_URL = 'https://www.youtube.com/iframe_api'\nconst SDK_GLOBAL = 'YT'\nconst SDK_GLOBAL_READY = 'onYouTubeIframeAPIReady'\nconst MATCH_PLAYLIST = /[?&](?:list|channel)=([a-zA-Z0-9_-]+)/\nconst MATCH_USER_UPLOADS = /user\\/([a-zA-Z0-9_-]+)\\/?/\nconst MATCH_NOCOOKIE = /youtube-nocookie\\.com/\nconst NOCOOKIE_HOST = 'https://www.youtube-nocookie.com'\n\nexport default class YouTube extends Component {\n static displayName = 'YouTube'\n static canPlay = canPlay.youtube\n callPlayer = callPlayer\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n getID (url) {\n if (!url || url instanceof Array || MATCH_PLAYLIST.test(url)) {\n return null\n }\n return url.match(MATCH_URL_YOUTUBE)[1]\n }\n\n load (url, isReady) {\n const { playing, muted, playsinline, controls, loop, config, onError } = this.props\n const { playerVars, embedOptions } = config\n const id = this.getID(url)\n if (isReady) {\n if (MATCH_PLAYLIST.test(url) || MATCH_USER_UPLOADS.test(url) || url instanceof Array) {\n this.player.loadPlaylist(this.parsePlaylist(url))\n return\n }\n this.player.cueVideoById({\n videoId: id,\n startSeconds: parseStartTime(url) || playerVars.start,\n endSeconds: parseEndTime(url) || playerVars.end\n })\n return\n }\n getSDK(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY, YT => YT.loaded).then(YT => {\n if (!this.container) return\n this.player = new YT.Player(this.container, {\n width: '100%',\n height: '100%',\n videoId: id,\n playerVars: {\n autoplay: playing ? 1 : 0,\n mute: muted ? 1 : 0,\n controls: controls ? 1 : 0,\n start: parseStartTime(url),\n end: parseEndTime(url),\n origin: window.location.origin,\n playsinline: playsinline ? 1 : 0,\n ...this.parsePlaylist(url),\n ...playerVars\n },\n events: {\n onReady: () => {\n if (loop) {\n this.player.setLoop(true) // Enable playlist looping\n }\n this.props.onReady()\n },\n onPlaybackRateChange: event => this.props.onPlaybackRateChange(event.data),\n onPlaybackQualityChange: event => this.props.onPlaybackQualityChange(event),\n onStateChange: this.onStateChange,\n onError: event => onError(event.data)\n },\n host: MATCH_NOCOOKIE.test(url) ? NOCOOKIE_HOST : undefined,\n ...embedOptions\n })\n }, onError)\n if (embedOptions.events) {\n console.warn('Using `embedOptions.events` will likely break things. Use ReactPlayer\u2019s callback props instead, eg onReady, onPlay, onPause')\n }\n }\n\n parsePlaylist = (url) => {\n if (url instanceof Array) {\n return {\n listType: 'playlist',\n playlist: url.map(this.getID).join(',')\n }\n }\n if (MATCH_PLAYLIST.test(url)) {\n const [, playlistId] = url.match(MATCH_PLAYLIST)\n return {\n listType: 'playlist',\n list: playlistId.replace(/^UC/, 'UU')\n }\n }\n if (MATCH_USER_UPLOADS.test(url)) {\n const [, username] = url.match(MATCH_USER_UPLOADS)\n return {\n listType: 'user_uploads',\n list: username\n }\n }\n return {}\n }\n\n onStateChange = (event) => {\n const { data } = event\n const { onPlay, onPause, onBuffer, onBufferEnd, onEnded, onReady, loop, config: { playerVars, onUnstarted } } = this.props\n const { UNSTARTED, PLAYING, PAUSED, BUFFERING, ENDED, CUED } = window[SDK_GLOBAL].PlayerState\n if (data === UNSTARTED) onUnstarted()\n if (data === PLAYING) {\n onPlay()\n onBufferEnd()\n }\n if (data === PAUSED) onPause()\n if (data === BUFFERING) onBuffer()\n if (data === ENDED) {\n const isPlaylist = !!this.callPlayer('getPlaylist')\n // Only loop manually if not playing a playlist\n if (loop && !isPlaylist) {\n if (playerVars.start) {\n this.seekTo(playerVars.start)\n } else {\n this.play()\n }\n }\n onEnded()\n }\n if (data === CUED) onReady()\n }\n\n play () {\n this.callPlayer('playVideo')\n }\n\n pause () {\n this.callPlayer('pauseVideo')\n }\n\n stop () {\n if (!document.body.contains(this.callPlayer('getIframe'))) return\n this.callPlayer('stopVideo')\n }\n\n seekTo (amount, keepPlaying = false) {\n this.callPlayer('seekTo', amount)\n if (!keepPlaying && !this.props.playing) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction * 100)\n }\n\n mute = () => {\n this.callPlayer('mute')\n }\n\n unmute = () => {\n this.callPlayer('unMute')\n }\n\n setPlaybackRate (rate) {\n this.callPlayer('setPlaybackRate', rate)\n }\n\n setLoop (loop) {\n this.callPlayer('setLoop', loop)\n }\n\n getDuration () {\n return this.callPlayer('getDuration')\n }\n\n getCurrentTime () {\n return this.callPlayer('getCurrentTime')\n }\n\n getSecondsLoaded () {\n return this.callPlayer('getVideoLoadedFraction') * this.getDuration()\n }\n\n ref = container => {\n this.container = container\n }\n\n render () {\n const { display } = this.props\n const style = {\n width: '100%',\n height: '100%',\n display\n }\n return (\n
\n
\n
\n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK } from '../utils'\nimport { canPlay } from '../patterns'\n\nconst SDK_URL = 'https://w.soundcloud.com/player/api.js'\nconst SDK_GLOBAL = 'SC'\n\nexport default class SoundCloud extends Component {\n static displayName = 'SoundCloud'\n static canPlay = canPlay.soundcloud\n static loopOnEnded = true\n callPlayer = callPlayer\n duration = null\n currentTime = null\n fractionLoaded = null\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url, isReady) {\n getSDK(SDK_URL, SDK_GLOBAL).then(SC => {\n if (!this.iframe) return\n const { PLAY, PLAY_PROGRESS, PAUSE, FINISH, ERROR } = SC.Widget.Events\n if (!isReady) {\n this.player = SC.Widget(this.iframe)\n this.player.bind(PLAY, this.props.onPlay)\n this.player.bind(PAUSE, () => {\n const remaining = this.duration - this.currentTime\n if (remaining < 0.05) {\n // Prevent onPause firing right before onEnded\n return\n }\n this.props.onPause()\n })\n this.player.bind(PLAY_PROGRESS, e => {\n this.currentTime = e.currentPosition / 1000\n this.fractionLoaded = e.loadedProgress\n })\n this.player.bind(FINISH, () => this.props.onEnded())\n this.player.bind(ERROR, e => this.props.onError(e))\n }\n this.player.load(url, {\n ...this.props.config.options,\n callback: () => {\n this.player.getDuration(duration => {\n this.duration = duration / 1000\n this.props.onReady()\n })\n }\n })\n })\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n // Nothing to do\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('seekTo', seconds * 1000)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction * 100)\n }\n\n mute = () => {\n this.setVolume(0)\n }\n\n unmute = () => {\n if (this.props.volume !== null) {\n this.setVolume(this.props.volume)\n }\n }\n\n getDuration () {\n return this.duration\n }\n\n getCurrentTime () {\n return this.currentTime\n }\n\n getSecondsLoaded () {\n return this.fractionLoaded * this.duration\n }\n\n ref = iframe => {\n this.iframe = iframe\n }\n\n render () {\n const { display } = this.props\n const style = {\n width: '100%',\n height: '100%',\n display\n }\n return (\n \n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK } from '../utils'\nimport { canPlay } from '../patterns'\n\nconst SDK_URL = 'https://player.vimeo.com/api/player.js'\nconst SDK_GLOBAL = 'Vimeo'\n\nconst cleanUrl = url => {\n return url.replace('/manage/videos', '')\n}\n\nexport default class Vimeo extends Component {\n static displayName = 'Vimeo'\n static canPlay = canPlay.vimeo\n static forceLoad = true // Prevent checking isLoading when URL changes\n callPlayer = callPlayer\n duration = null\n currentTime = null\n secondsLoaded = null\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url) {\n this.duration = null\n getSDK(SDK_URL, SDK_GLOBAL).then(Vimeo => {\n if (!this.container) return\n const { playerOptions, title } = this.props.config\n this.player = new Vimeo.Player(this.container, {\n url: cleanUrl(url),\n autoplay: this.props.playing,\n muted: this.props.muted,\n loop: this.props.loop,\n playsinline: this.props.playsinline,\n controls: this.props.controls,\n ...playerOptions\n })\n this.player.ready().then(() => {\n const iframe = this.container.querySelector('iframe')\n iframe.style.width = '100%'\n iframe.style.height = '100%'\n if (title) {\n iframe.title = title\n }\n }).catch(this.props.onError)\n this.player.on('loaded', () => {\n this.props.onReady()\n this.refreshDuration()\n })\n this.player.on('play', () => {\n this.props.onPlay()\n this.refreshDuration()\n })\n this.player.on('pause', this.props.onPause)\n this.player.on('seeked', e => this.props.onSeek(e.seconds))\n this.player.on('ended', this.props.onEnded)\n this.player.on('error', this.props.onError)\n this.player.on('timeupdate', ({ seconds }) => {\n this.currentTime = seconds\n })\n this.player.on('progress', ({ seconds }) => {\n this.secondsLoaded = seconds\n })\n this.player.on('bufferstart', this.props.onBuffer)\n this.player.on('bufferend', this.props.onBufferEnd)\n this.player.on('playbackratechange', e => this.props.onPlaybackRateChange(e.playbackRate))\n }, this.props.onError)\n }\n\n refreshDuration () {\n this.player.getDuration().then(duration => {\n this.duration = duration\n })\n }\n\n play () {\n const promise = this.callPlayer('play')\n if (promise) {\n promise.catch(this.props.onError)\n }\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n this.callPlayer('unload')\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('setCurrentTime', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction)\n }\n\n setMuted (muted) {\n this.callPlayer('setMuted', muted)\n }\n\n setLoop (loop) {\n this.callPlayer('setLoop', loop)\n }\n\n setPlaybackRate (rate) {\n this.callPlayer('setPlaybackRate', rate)\n }\n\n mute = () => {\n this.setMuted(true)\n }\n\n unmute = () => {\n this.setMuted(false)\n }\n\n getDuration () {\n return this.duration\n }\n\n getCurrentTime () {\n return this.currentTime\n }\n\n getSecondsLoaded () {\n return this.secondsLoaded\n }\n\n ref = container => {\n this.container = container\n }\n\n render () {\n const { display } = this.props\n const style = {\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n display\n }\n return (\n \n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { canPlay, MATCH_URL_MUX } from '../patterns'\n\nconst SDK_URL = 'https://cdn.jsdelivr.net/npm/@mux/mux-player@VERSION/dist/mux-player.mjs'\n\nexport default class Mux extends Component {\n static displayName = 'Mux'\n static canPlay = canPlay.mux\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n this.addListeners(this.player)\n const playbackId = this.getPlaybackId(this.props.url) // Ensure src is set in strict mode\n if (playbackId) {\n this.player.playbackId = playbackId\n }\n }\n\n componentWillUnmount () {\n this.player.playbackId = null\n this.removeListeners(this.player)\n }\n\n addListeners (player) {\n const { playsinline } = this.props\n player.addEventListener('play', this.onPlay)\n player.addEventListener('waiting', this.onBuffer)\n player.addEventListener('playing', this.onBufferEnd)\n player.addEventListener('pause', this.onPause)\n player.addEventListener('seeked', this.onSeek)\n player.addEventListener('ended', this.onEnded)\n player.addEventListener('error', this.onError)\n player.addEventListener('ratechange', this.onPlayBackRateChange)\n player.addEventListener('enterpictureinpicture', this.onEnablePIP)\n player.addEventListener('leavepictureinpicture', this.onDisablePIP)\n player.addEventListener('webkitpresentationmodechanged', this.onPresentationModeChange)\n player.addEventListener('canplay', this.onReady)\n if (playsinline) {\n player.setAttribute('playsinline', '')\n }\n }\n\n removeListeners (player) {\n player.removeEventListener('canplay', this.onReady)\n player.removeEventListener('play', this.onPlay)\n player.removeEventListener('waiting', this.onBuffer)\n player.removeEventListener('playing', this.onBufferEnd)\n player.removeEventListener('pause', this.onPause)\n player.removeEventListener('seeked', this.onSeek)\n player.removeEventListener('ended', this.onEnded)\n player.removeEventListener('error', this.onError)\n player.removeEventListener('ratechange', this.onPlayBackRateChange)\n player.removeEventListener('enterpictureinpicture', this.onEnablePIP)\n player.removeEventListener('leavepictureinpicture', this.onDisablePIP)\n player.removeEventListener('canplay', this.onReady)\n }\n\n // Proxy methods to prevent listener leaks\n onReady = (...args) => this.props.onReady(...args)\n onPlay = (...args) => this.props.onPlay(...args)\n onBuffer = (...args) => this.props.onBuffer(...args)\n onBufferEnd = (...args) => this.props.onBufferEnd(...args)\n onPause = (...args) => this.props.onPause(...args)\n onEnded = (...args) => this.props.onEnded(...args)\n onError = (...args) => this.props.onError(...args)\n onPlayBackRateChange = (event) => this.props.onPlaybackRateChange(event.target.playbackRate)\n onEnablePIP = (...args) => this.props.onEnablePIP(...args)\n\n onSeek = e => {\n this.props.onSeek(e.target.currentTime)\n }\n\n async load (url) {\n const { onError, config } = this.props\n\n if (!globalThis.customElements?.get('mux-player')) {\n try {\n const sdkUrl = SDK_URL.replace('VERSION', config.version)\n await import(/* webpackIgnore: true */ `${sdkUrl}`)\n this.props.onLoaded()\n } catch (error) {\n onError(error)\n }\n }\n\n const [, id] = url.match(MATCH_URL_MUX)\n this.player.playbackId = id\n }\n\n onDurationChange = () => {\n const duration = this.getDuration()\n this.props.onDuration(duration)\n }\n\n play () {\n const promise = this.player.play()\n if (promise) {\n promise.catch(this.props.onError)\n }\n }\n\n pause () {\n this.player.pause()\n }\n\n stop () {\n this.player.playbackId = null\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.player.currentTime = seconds\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.player.volume = fraction\n }\n\n mute = () => {\n this.player.muted = true\n }\n\n unmute = () => {\n this.player.muted = false\n }\n\n enablePIP () {\n if (this.player.requestPictureInPicture && document.pictureInPictureElement !== this.player) {\n this.player.requestPictureInPicture()\n }\n }\n\n disablePIP () {\n if (document.exitPictureInPicture && document.pictureInPictureElement === this.player) {\n document.exitPictureInPicture()\n }\n }\n\n setPlaybackRate (rate) {\n try {\n this.player.playbackRate = rate\n } catch (error) {\n this.props.onError(error)\n }\n }\n\n getDuration () {\n if (!this.player) return null\n const { duration, seekable } = this.player\n // on iOS, live streams return Infinity for the duration\n // so instead we use the end of the seekable timerange\n if (duration === Infinity && seekable.length > 0) {\n return seekable.end(seekable.length - 1)\n }\n return duration\n }\n\n getCurrentTime () {\n if (!this.player) return null\n return this.player.currentTime\n }\n\n getSecondsLoaded () {\n if (!this.player) return null\n const { buffered } = this.player\n if (buffered.length === 0) {\n return 0\n }\n const end = buffered.end(buffered.length - 1)\n const duration = this.getDuration()\n if (end > duration) {\n return duration\n }\n return end\n }\n\n getPlaybackId (url) {\n const [, id] = url.match(MATCH_URL_MUX)\n return id\n }\n\n ref = player => {\n this.player = player\n }\n\n render () {\n const { url, playing, loop, controls, muted, config, width, height } = this.props\n const style = {\n width: width === 'auto' ? width : '100%',\n height: height === 'auto' ? height : '100%'\n }\n if (controls === false) {\n style['--controls'] = 'none'\n }\n return (\n \n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK, randomString } from '../utils'\nimport { canPlay } from '../patterns'\n\nconst SDK_URL = 'https://connect.facebook.net/en_US/sdk.js'\nconst SDK_GLOBAL = 'FB'\nconst SDK_GLOBAL_READY = 'fbAsyncInit'\nconst PLAYER_ID_PREFIX = 'facebook-player-'\n\nexport default class Facebook extends Component {\n static displayName = 'Facebook'\n static canPlay = canPlay.facebook\n static loopOnEnded = true\n callPlayer = callPlayer\n playerID = this.props.config.playerId || `${PLAYER_ID_PREFIX}${randomString()}`\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url, isReady) {\n if (isReady) {\n getSDK(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY).then(FB => FB.XFBML.parse())\n return\n }\n getSDK(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY).then(FB => {\n FB.init({\n appId: this.props.config.appId,\n xfbml: true,\n version: this.props.config.version\n })\n FB.Event.subscribe('xfbml.render', msg => {\n // Here we know the SDK has loaded, even if onReady/onPlay\n // is not called due to a video that cannot be embedded\n this.props.onLoaded()\n })\n FB.Event.subscribe('xfbml.ready', msg => {\n if (msg.type === 'video' && msg.id === this.playerID) {\n this.player = msg.instance\n this.player.subscribe('startedPlaying', this.props.onPlay)\n this.player.subscribe('paused', this.props.onPause)\n this.player.subscribe('finishedPlaying', this.props.onEnded)\n this.player.subscribe('startedBuffering', this.props.onBuffer)\n this.player.subscribe('finishedBuffering', this.props.onBufferEnd)\n this.player.subscribe('error', this.props.onError)\n if (this.props.muted) {\n this.callPlayer('mute')\n } else {\n this.callPlayer('unmute')\n }\n this.props.onReady()\n\n // For some reason Facebook have added `visibility: hidden`\n // to the iframe when autoplay fails, so here we set it back\n document.getElementById(this.playerID).querySelector('iframe').style.visibility = 'visible'\n }\n })\n })\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n // Nothing to do\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('seek', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction)\n }\n\n mute = () => {\n this.callPlayer('mute')\n }\n\n unmute = () => {\n this.callPlayer('unmute')\n }\n\n getDuration () {\n return this.callPlayer('getDuration')\n }\n\n getCurrentTime () {\n return this.callPlayer('getCurrentPosition')\n }\n\n getSecondsLoaded () {\n return null\n }\n\n render () {\n const { attributes } = this.props.config\n const style = {\n width: '100%',\n height: '100%'\n }\n return (\n \n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK } from '../utils'\nimport { canPlay, MATCH_URL_STREAMABLE } from '../patterns'\n\nconst SDK_URL = 'https://cdn.embed.ly/player-0.1.0.min.js'\nconst SDK_GLOBAL = 'playerjs'\n\nexport default class Streamable extends Component {\n static displayName = 'Streamable'\n static canPlay = canPlay.streamable\n callPlayer = callPlayer\n duration = null\n currentTime = null\n secondsLoaded = null\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url) {\n getSDK(SDK_URL, SDK_GLOBAL).then(playerjs => {\n if (!this.iframe) return\n this.player = new playerjs.Player(this.iframe)\n this.player.setLoop(this.props.loop)\n this.player.on('ready', this.props.onReady)\n this.player.on('play', this.props.onPlay)\n this.player.on('pause', this.props.onPause)\n this.player.on('seeked', this.props.onSeek)\n this.player.on('ended', this.props.onEnded)\n this.player.on('error', this.props.onError)\n this.player.on('timeupdate', ({ duration, seconds }) => {\n this.duration = duration\n this.currentTime = seconds\n })\n this.player.on('buffered', ({ percent }) => {\n if (this.duration) {\n this.secondsLoaded = this.duration * percent\n }\n })\n if (this.props.muted) {\n this.player.mute()\n }\n }, this.props.onError)\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n // Nothing to do\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('setCurrentTime', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction * 100)\n }\n\n setLoop (loop) {\n this.callPlayer('setLoop', loop)\n }\n\n mute = () => {\n this.callPlayer('mute')\n }\n\n unmute = () => {\n this.callPlayer('unmute')\n }\n\n getDuration () {\n return this.duration\n }\n\n getCurrentTime () {\n return this.currentTime\n }\n\n getSecondsLoaded () {\n return this.secondsLoaded\n }\n\n ref = iframe => {\n this.iframe = iframe\n }\n\n render () {\n const id = this.props.url.match(MATCH_URL_STREAMABLE)[1]\n const style = {\n width: '100%',\n height: '100%'\n }\n return (\n \n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK, randomString } from '../utils'\nimport { canPlay, MATCH_URL_WISTIA } from '../patterns'\n\nconst SDK_URL = 'https://fast.wistia.com/assets/external/E-v1.js'\nconst SDK_GLOBAL = 'Wistia'\nconst PLAYER_ID_PREFIX = 'wistia-player-'\n\nexport default class Wistia extends Component {\n static displayName = 'Wistia'\n static canPlay = canPlay.wistia\n static loopOnEnded = true\n callPlayer = callPlayer\n playerID = this.props.config.playerId || `${PLAYER_ID_PREFIX}${randomString()}`\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url) {\n const { playing, muted, controls, onReady, config, onError } = this.props\n getSDK(SDK_URL, SDK_GLOBAL).then(Wistia => {\n if (config.customControls) {\n config.customControls.forEach(control => Wistia.defineControl(control))\n }\n window._wq = window._wq || []\n window._wq.push({\n id: this.playerID,\n options: {\n autoPlay: playing,\n silentAutoPlay: 'allow',\n muted,\n controlsVisibleOnLoad: controls,\n fullscreenButton: controls,\n playbar: controls,\n playbackRateControl: controls,\n qualityControl: controls,\n volumeControl: controls,\n settingsControl: controls,\n smallPlayButton: controls,\n ...config.options\n },\n onReady: player => {\n this.player = player\n this.unbind()\n this.player.bind('play', this.onPlay)\n this.player.bind('pause', this.onPause)\n this.player.bind('seek', this.onSeek)\n this.player.bind('end', this.onEnded)\n this.player.bind('playbackratechange', this.onPlaybackRateChange)\n onReady()\n }\n })\n }, onError)\n }\n\n unbind () {\n this.player.unbind('play', this.onPlay)\n this.player.unbind('pause', this.onPause)\n this.player.unbind('seek', this.onSeek)\n this.player.unbind('end', this.onEnded)\n this.player.unbind('playbackratechange', this.onPlaybackRateChange)\n }\n\n // Proxy methods to prevent listener leaks\n onPlay = (...args) => this.props.onPlay(...args)\n onPause = (...args) => this.props.onPause(...args)\n onSeek = (...args) => this.props.onSeek(...args)\n onEnded = (...args) => this.props.onEnded(...args)\n onPlaybackRateChange = (...args) => this.props.onPlaybackRateChange(...args)\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n this.unbind()\n this.callPlayer('remove')\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('time', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('volume', fraction)\n }\n\n mute = () => {\n this.callPlayer('mute')\n }\n\n unmute = () => {\n this.callPlayer('unmute')\n }\n\n setPlaybackRate (rate) {\n this.callPlayer('playbackRate', rate)\n }\n\n getDuration () {\n return this.callPlayer('duration')\n }\n\n getCurrentTime () {\n return this.callPlayer('time')\n }\n\n getSecondsLoaded () {\n return null\n }\n\n render () {\n const { url } = this.props\n const videoID = url && url.match(MATCH_URL_WISTIA)[1]\n const className = `wistia_embed wistia_async_${videoID}`\n const style = {\n width: '100%',\n height: '100%'\n }\n return (\n
\n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK, parseStartTime, randomString } from '../utils'\nimport { canPlay, MATCH_URL_TWITCH_CHANNEL, MATCH_URL_TWITCH_VIDEO } from '../patterns'\n\nconst SDK_URL = 'https://player.twitch.tv/js/embed/v1.js'\nconst SDK_GLOBAL = 'Twitch'\nconst PLAYER_ID_PREFIX = 'twitch-player-'\n\nexport default class Twitch extends Component {\n static displayName = 'Twitch'\n static canPlay = canPlay.twitch\n static loopOnEnded = true\n callPlayer = callPlayer\n playerID = this.props.config.playerId || `${PLAYER_ID_PREFIX}${randomString()}`\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url, isReady) {\n const { playsinline, onError, config, controls } = this.props\n const isChannel = MATCH_URL_TWITCH_CHANNEL.test(url)\n const id = isChannel ? url.match(MATCH_URL_TWITCH_CHANNEL)[1] : url.match(MATCH_URL_TWITCH_VIDEO)[1]\n if (isReady) {\n if (isChannel) {\n this.player.setChannel(id)\n } else {\n this.player.setVideo('v' + id)\n }\n return\n }\n getSDK(SDK_URL, SDK_GLOBAL).then(Twitch => {\n this.player = new Twitch.Player(this.playerID, {\n video: isChannel ? '' : id,\n channel: isChannel ? id : '',\n height: '100%',\n width: '100%',\n playsinline,\n autoplay: this.props.playing,\n muted: this.props.muted,\n // https://github.com/CookPete/react-player/issues/733#issuecomment-549085859\n controls: isChannel ? true : controls,\n time: parseStartTime(url),\n ...config.options\n })\n const { READY, PLAYING, PAUSE, ENDED, ONLINE, OFFLINE, SEEK } = Twitch.Player\n this.player.addEventListener(READY, this.props.onReady)\n this.player.addEventListener(PLAYING, this.props.onPlay)\n this.player.addEventListener(PAUSE, this.props.onPause)\n this.player.addEventListener(ENDED, this.props.onEnded)\n this.player.addEventListener(SEEK, this.props.onSeek)\n\n // Prevent weird isLoading behaviour when streams are offline\n this.player.addEventListener(ONLINE, this.props.onLoaded)\n this.player.addEventListener(OFFLINE, this.props.onLoaded)\n }, onError)\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n this.callPlayer('pause')\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('seek', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction)\n }\n\n mute = () => {\n this.callPlayer('setMuted', true)\n }\n\n unmute = () => {\n this.callPlayer('setMuted', false)\n }\n\n getDuration () {\n return this.callPlayer('getDuration')\n }\n\n getCurrentTime () {\n return this.callPlayer('getCurrentTime')\n }\n\n getSecondsLoaded () {\n return null\n }\n\n render () {\n const style = {\n width: '100%',\n height: '100%'\n }\n return (\n
\n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK, parseStartTime } from '../utils'\nimport { canPlay, MATCH_URL_DAILYMOTION } from '../patterns'\n\nconst SDK_URL = 'https://api.dmcdn.net/all.js'\nconst SDK_GLOBAL = 'DM'\nconst SDK_GLOBAL_READY = 'dmAsyncInit'\n\nexport default class DailyMotion extends Component {\n static displayName = 'DailyMotion'\n static canPlay = canPlay.dailymotion\n static loopOnEnded = true\n callPlayer = callPlayer\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url) {\n const { controls, config, onError, playing } = this.props\n const [, id] = url.match(MATCH_URL_DAILYMOTION)\n if (this.player) {\n this.player.load(id, {\n start: parseStartTime(url),\n autoplay: playing\n })\n return\n }\n getSDK(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY, DM => DM.player).then(DM => {\n if (!this.container) return\n const Player = DM.player\n this.player = new Player(this.container, {\n width: '100%',\n height: '100%',\n video: id,\n params: {\n controls,\n autoplay: this.props.playing,\n mute: this.props.muted,\n start: parseStartTime(url),\n origin: window.location.origin,\n ...config.params\n },\n events: {\n apiready: this.props.onReady,\n seeked: () => this.props.onSeek(this.player.currentTime),\n video_end: this.props.onEnded,\n durationchange: this.onDurationChange,\n pause: this.props.onPause,\n playing: this.props.onPlay,\n waiting: this.props.onBuffer,\n error: event => onError(event)\n }\n })\n }, onError)\n }\n\n onDurationChange = () => {\n const duration = this.getDuration()\n this.props.onDuration(duration)\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n // Nothing to do\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('seek', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction)\n }\n\n mute = () => {\n this.callPlayer('setMuted', true)\n }\n\n unmute = () => {\n this.callPlayer('setMuted', false)\n }\n\n getDuration () {\n return this.player.duration || null\n }\n\n getCurrentTime () {\n return this.player.currentTime\n }\n\n getSecondsLoaded () {\n return this.player.bufferedTime\n }\n\n ref = container => {\n this.container = container\n }\n\n render () {\n const { display } = this.props\n const style = {\n width: '100%',\n height: '100%',\n display\n }\n return (\n
\n
\n
\n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK, queryString } from '../utils'\nimport { canPlay, MATCH_URL_MIXCLOUD } from '../patterns'\n\nconst SDK_URL = 'https://widget.mixcloud.com/media/js/widgetApi.js'\nconst SDK_GLOBAL = 'Mixcloud'\n\nexport default class Mixcloud extends Component {\n static displayName = 'Mixcloud'\n static canPlay = canPlay.mixcloud\n static loopOnEnded = true\n callPlayer = callPlayer\n duration = null\n currentTime = null\n secondsLoaded = null\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url) {\n getSDK(SDK_URL, SDK_GLOBAL).then(Mixcloud => {\n this.player = Mixcloud.PlayerWidget(this.iframe)\n this.player.ready.then(() => {\n this.player.events.play.on(this.props.onPlay)\n this.player.events.pause.on(this.props.onPause)\n this.player.events.ended.on(this.props.onEnded)\n this.player.events.error.on(this.props.error)\n this.player.events.progress.on((seconds, duration) => {\n this.currentTime = seconds\n this.duration = duration\n })\n this.props.onReady()\n })\n }, this.props.onError)\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n // Nothing to do\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('seek', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n // No volume support\n }\n\n mute = () => {\n // No volume support\n }\n\n unmute = () => {\n // No volume support\n }\n\n getDuration () {\n return this.duration\n }\n\n getCurrentTime () {\n return this.currentTime\n }\n\n getSecondsLoaded () {\n return null\n }\n\n ref = iframe => {\n this.iframe = iframe\n }\n\n render () {\n const { url, config } = this.props\n const id = url.match(MATCH_URL_MIXCLOUD)[1]\n const style = {\n width: '100%',\n height: '100%'\n }\n const query = queryString({\n ...config.options,\n feed: `/${id}/`\n })\n // We have to give the iframe a key here to prevent a\n // weird dialog appearing when loading a new track\n return (\n \n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK } from '../utils'\nimport { canPlay, MATCH_URL_VIDYARD } from '../patterns'\n\nconst SDK_URL = 'https://play.vidyard.com/embed/v4.js'\nconst SDK_GLOBAL = 'VidyardV4'\nconst SDK_GLOBAL_READY = 'onVidyardAPI'\n\nexport default class Vidyard extends Component {\n static displayName = 'Vidyard'\n static canPlay = canPlay.vidyard\n callPlayer = callPlayer\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url) {\n const { playing, config, onError, onDuration } = this.props\n const id = url && url.match(MATCH_URL_VIDYARD)[1]\n if (this.player) {\n this.stop()\n }\n getSDK(SDK_URL, SDK_GLOBAL, SDK_GLOBAL_READY).then(Vidyard => {\n if (!this.container) return\n Vidyard.api.addReadyListener((data, player) => {\n if (this.player) {\n return\n }\n this.player = player\n this.player.on('ready', this.props.onReady)\n this.player.on('play', this.props.onPlay)\n this.player.on('pause', this.props.onPause)\n this.player.on('seek', this.props.onSeek)\n this.player.on('playerComplete', this.props.onEnded)\n }, id)\n Vidyard.api.renderPlayer({\n uuid: id,\n container: this.container,\n autoplay: playing ? 1 : 0,\n ...config.options\n })\n Vidyard.api.getPlayerMetadata(id).then(meta => {\n this.duration = meta.length_in_seconds\n onDuration(meta.length_in_seconds)\n })\n }, onError)\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n window.VidyardV4.api.destroyPlayer(this.player)\n }\n\n seekTo (amount, keepPlaying = true) {\n this.callPlayer('seek', amount)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction)\n }\n\n mute = () => {\n this.setVolume(0)\n }\n\n unmute = () => {\n if (this.props.volume !== null) {\n this.setVolume(this.props.volume)\n }\n }\n\n setPlaybackRate (rate) {\n this.callPlayer('setPlaybackSpeed', rate)\n }\n\n getDuration () {\n return this.duration\n }\n\n getCurrentTime () {\n return this.callPlayer('currentTime')\n }\n\n getSecondsLoaded () {\n return null\n }\n\n ref = container => {\n this.container = container\n }\n\n render () {\n const { display } = this.props\n const style = {\n width: '100%',\n height: '100%',\n display\n }\n return (\n
\n
\n
\n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { callPlayer, getSDK } from '../utils'\nimport { canPlay } from '../patterns'\n\nconst SDK_URL = 'https://cdn.embed.ly/player-0.1.0.min.js'\nconst SDK_GLOBAL = 'playerjs'\n\nexport default class Kaltura extends Component {\n static displayName = 'Kaltura'\n static canPlay = canPlay.kaltura\n callPlayer = callPlayer\n duration = null\n currentTime = null\n secondsLoaded = null\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n }\n\n load (url) {\n getSDK(SDK_URL, SDK_GLOBAL).then(playerjs => {\n if (!this.iframe) return\n this.player = new playerjs.Player(this.iframe)\n this.player.on('ready', () => {\n // An arbitrary timeout is required otherwise\n // the event listeners won\u2019t work\n setTimeout(() => {\n this.player.isReady = true\n this.player.setLoop(this.props.loop)\n if (this.props.muted) {\n this.player.mute()\n }\n this.addListeners(this.player, this.props)\n this.props.onReady()\n }, 500)\n })\n }, this.props.onError)\n }\n\n addListeners (player, props) {\n player.on('play', props.onPlay)\n player.on('pause', props.onPause)\n player.on('ended', props.onEnded)\n player.on('error', props.onError)\n player.on('timeupdate', ({ duration, seconds }) => {\n this.duration = duration\n this.currentTime = seconds\n })\n }\n\n play () {\n this.callPlayer('play')\n }\n\n pause () {\n this.callPlayer('pause')\n }\n\n stop () {\n // Nothing to do\n }\n\n seekTo (seconds, keepPlaying = true) {\n this.callPlayer('setCurrentTime', seconds)\n if (!keepPlaying) {\n this.pause()\n }\n }\n\n setVolume (fraction) {\n this.callPlayer('setVolume', fraction)\n }\n\n setLoop (loop) {\n this.callPlayer('setLoop', loop)\n }\n\n mute = () => {\n this.callPlayer('mute')\n }\n\n unmute = () => {\n this.callPlayer('unmute')\n }\n\n getDuration () {\n return this.duration\n }\n\n getCurrentTime () {\n return this.currentTime\n }\n\n getSecondsLoaded () {\n return this.secondsLoaded\n }\n\n ref = iframe => {\n this.iframe = iframe\n }\n\n render () {\n const style = {\n width: '100%',\n height: '100%'\n }\n return (\n \n )\n }\n}\n", "import React, { Component } from 'react'\n\nimport { getSDK, isMediaStream, supportsWebKitPresentationMode } from '../utils'\nimport { canPlay, AUDIO_EXTENSIONS, HLS_EXTENSIONS, DASH_EXTENSIONS, FLV_EXTENSIONS } from '../patterns'\n\nconst HAS_NAVIGATOR = typeof navigator !== 'undefined'\nconst IS_IPAD_PRO = HAS_NAVIGATOR && navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1\nconst IS_IOS = HAS_NAVIGATOR && (/iPad|iPhone|iPod/.test(navigator.userAgent) || IS_IPAD_PRO) && !window.MSStream\nconst IS_SAFARI = HAS_NAVIGATOR && (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) && !window.MSStream\nconst HLS_SDK_URL = 'https://cdn.jsdelivr.net/npm/hls.js@VERSION/dist/hls.min.js'\nconst HLS_GLOBAL = 'Hls'\nconst DASH_SDK_URL = 'https://cdnjs.cloudflare.com/ajax/libs/dashjs/VERSION/dash.all.min.js'\nconst DASH_GLOBAL = 'dashjs'\nconst FLV_SDK_URL = 'https://cdn.jsdelivr.net/npm/flv.js@VERSION/dist/flv.min.js'\nconst FLV_GLOBAL = 'flvjs'\nconst MATCH_DROPBOX_URL = /www\\.dropbox\\.com\\/.+/\nconst MATCH_CLOUDFLARE_STREAM = /https:\\/\\/watch\\.cloudflarestream\\.com\\/([a-z0-9]+)/\nconst REPLACE_CLOUDFLARE_STREAM = 'https://videodelivery.net/{id}/manifest/video.m3u8'\n\nexport default class FilePlayer extends Component {\n static displayName = 'FilePlayer'\n static canPlay = canPlay.file\n\n componentDidMount () {\n this.props.onMount && this.props.onMount(this)\n this.addListeners(this.player)\n const src = this.getSource(this.props.url) // Ensure src is set in strict mode\n if (src) {\n this.player.src = src\n }\n if (IS_IOS || this.props.config.forceDisableHls) {\n this.player.load()\n }\n }\n\n componentDidUpdate (prevProps) {\n if (this.shouldUseAudio(this.props) !== this.shouldUseAudio(prevProps)) {\n this.removeListeners(this.prevPlayer, prevProps.url)\n this.addListeners(this.player)\n }\n\n if (\n this.props.url !== prevProps.url &&\n !isMediaStream(this.props.url) &&\n !(this.props.url instanceof Array) // Avoid infinite loop\n ) {\n this.player.srcObject = null\n }\n }\n\n componentWillUnmount () {\n this.player.removeAttribute('src')\n this.removeListeners(this.player)\n if (this.hls) {\n this.hls.destroy()\n }\n }\n\n addListeners (player) {\n const { url, playsinline } = this.props\n player.addEventListener('play', this.onPlay)\n player.addEventListener('waiting', this.onBuffer)\n player.addEventListener('playing', this.onBufferEnd)\n player.addEventListener('pause', this.onPause)\n player.addEventListener('seeked', this.onSeek)\n player.addEventListener('ended', this.onEnded)\n player.addEventListener('error', this.onError)\n player.addEventListener('ratechange', this.onPlayBackRateChange)\n player.addEventListener('enterpictureinpicture', this.onEnablePIP)\n player.addEventListener('leavepictureinpicture', this.onDisablePIP)\n player.addEventListener('webkitpresentationmodechanged', this.onPresentationModeChange)\n if (!this.shouldUseHLS(url)) { // onReady is handled by hls.js\n player.addEventListener('canplay', this.onReady)\n }\n if (playsinline) {\n player.setAttribute('playsinline', '')\n player.setAttribute('webkit-playsinline', '')\n player.setAttribute('x5-playsinline', '')\n }\n }\n\n removeListeners (player, url) {\n player.removeEventListener('canplay', this.onReady)\n player.removeEventListener('play', this.onPlay)\n player.removeEventListener('waiting', this.onBuffer)\n player.removeEventListener('playing', this.onBufferEnd)\n player.removeEventListener('pause', this.onPause)\n player.removeEventListener('seeked', this.onSeek)\n player.removeEventListener('ended', this.onEnded)\n player.removeEventListener('error', this.onError)\n player.removeEventListener('ratechange', this.onPlayBackRateChange)\n player.removeEventListener('enterpictureinpicture', this.onEnablePIP)\n player.removeEventListener('leavepictureinpicture', this.onDisablePIP)\n player.removeEventListener('webkitpresentationmodechanged', this.onPresentationModeChange)\n if (!this.shouldUseHLS(url)) { // onReady is handled by hls.js\n player.removeEventListener('canplay', this.onReady)\n }\n }\n\n // Proxy methods to prevent listener leaks\n onReady = (...args) => this.props.onReady(...args)\n onPlay = (...args) => this.props.onPlay(...args)\n onBuffer = (...args) => this.props.onBuffer(...args)\n onBufferEnd = (...args) => this.props.onBufferEnd(...args)\n onPause = (...args) => this.props.onPause(...args)\n onEnded = (...args) => this.props.onEnded(...args)\n onError = (...args) => this.props.onError(...args)\n onPlayBackRateChange = (event) => this.props.onPlaybackRateChange(event.target.playbackRate)\n onEnablePIP = (...args) => this.props.onEnablePIP(...args)\n\n onDisablePIP = e => {\n const { onDisablePIP, playing } = this.props\n onDisablePIP(e)\n if (playing) {\n this.play()\n }\n }\n\n onPresentationModeChange = e => {\n if (this.player && supportsWebKitPresentationMode(this.player)) {\n const { webkitPresentationMode } = this.player\n if (webkitPresentationMode === 'picture-in-picture') {\n this.onEnablePIP(e)\n } else if (webkitPresentationMode === 'inline') {\n this.onDisablePIP(e)\n }\n }\n }\n\n onSeek = e => {\n this.props.onSeek(e.target.currentTime)\n }\n\n shouldUseAudio (props) {\n if (props.config.forceVideo) {\n return false\n }\n if (props.config.attributes.poster) {\n return false // Use