@capgo/capacitor-video-player 8.0.19 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/android/build.gradle +3 -3
- package/android/src/main/java/com/capgo/videoplayer/FullscreenExoPlayerFragment.java +74 -4
- package/android/src/main/java/com/capgo/videoplayer/VideoPlayer.java +3 -1
- package/android/src/main/java/com/capgo/videoplayer/VideoPlayerPlugin.java +15 -5
- package/dist/docs.json +100 -0
- package/dist/esm/definitions.d.ts +40 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/web-utils/videoplayer.js +6 -4
- package/dist/esm/web-utils/videoplayer.js.map +1 -1
- package/dist/esm/web.js +29 -12
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +35 -16
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +35 -16
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/VideoPlayerPlugin/FullscreenVideoPlayer.swift +89 -2
- package/ios/Sources/VideoPlayerPlugin/VideoPlayerPlugin.swift +10 -2
- package/package.json +1 -1
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web-utils/video-types.js","esm/web-utils/videoplayer.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst VideoPlayer = registerPlugin('VideoPlayer', {\n web: () => import('./web').then((m) => new m.VideoPlayerWeb()),\n});\nexport * from './definitions';\nexport { VideoPlayer };\n//# sourceMappingURL=index.js.map","export const possibleQueryParameterExtensions = ['file', 'extension', 'filetype', 'type', 'ext'];\nexport const videoTypes = {\n mp4: 'video/mp4',\n webm: 'video/mp4',\n cmaf: 'video/mp4',\n cmfv: 'video/mp4',\n m3u8: 'application/x-mpegURL',\n};\n//# sourceMappingURL=video-types.js.map","import Hls from 'hls.js';\nimport { videoTypes, possibleQueryParameterExtensions } from './video-types';\nexport class VideoPlayer {\n constructor(mode, url, playerId, rate, exitOnEnd, loopOnEnd, container, zIndex, width, height) {\n this.pipMode = false;\n this._videoType = null;\n this._videoContainer = null;\n this._firstReadyToPlay = true;\n this._isEnded = false;\n this._videoRate = 1.0;\n this._videoExitOnEnd = true;\n this._videoLoopOnEnd = false;\n this._url = url;\n this._container = container;\n this._mode = mode;\n this._width = width ? width : 320;\n this._height = height ? height : 180;\n this._mode = mode;\n this._videoRate = rate;\n this._zIndex = zIndex ? zIndex : 1;\n this._playerId = playerId;\n this._videoExitOnEnd = exitOnEnd;\n this._videoLoopOnEnd = loopOnEnd;\n }\n async initialize() {\n // get the video type\n const urlVideoType = this._getVideoType();\n if (urlVideoType) {\n // style the container\n if (this._mode === 'fullscreen') {\n this._container.style.position = 'absolute';\n this._container.style.width = '100vw';\n this._container.style.height = '100vh';\n }\n if (this._mode === 'embedded') {\n this._container.style.position = 'relative';\n this._container.style.width = this._width.toString() + 'px';\n this._container.style.height = this._height.toString() + 'px';\n }\n this._container.style.left = '0';\n this._container.style.top = '0';\n this._container.style.display = 'flex';\n this._container.style.alignItems = 'center';\n this._container.style.justifyContent = 'center';\n this._container.style.backgroundColor = '#000000';\n this._container.style.zIndex = this._zIndex.toString();\n const width = this._mode === 'fullscreen' ? window.innerWidth /*this._container.offsetWidth*/ : this._width;\n const height = this._mode === 'fullscreen' ? window.innerHeight /*this._container.offsetHeight*/ : this._height;\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n svg.setAttributeNS(null, 'width', width.toString());\n svg.setAttributeNS(null, 'height', height.toString());\n const viewbox = '0 0 ' + width.toString() + ' ' + height.toString();\n svg.setAttributeNS(null, 'viewBox', viewbox);\n svg.style.zIndex = (this._zIndex + 1).toString();\n const rect = document.createElementNS(xmlns, 'rect');\n rect.setAttributeNS(null, 'x', '0');\n rect.setAttributeNS(null, 'y', '0');\n rect.setAttributeNS(null, 'width', width.toString());\n rect.setAttributeNS(null, 'height', height.toString());\n rect.setAttributeNS(null, 'fill', '#000000');\n svg.appendChild(rect);\n this._container.appendChild(svg);\n const heightVideo = (width * this._height) / this._width;\n this._videoContainer = document.createElement('div');\n this._videoContainer.style.position = 'absolute';\n this._videoContainer.style.left = '0';\n this._videoContainer.style.width = width.toString() + 'px';\n this._videoContainer.style.height = heightVideo.toString() + 'px';\n this._videoContainer.style.zIndex = (this._zIndex + 2).toString();\n this._container.appendChild(this._videoContainer);\n /* Create Video Element */\n const isCreated = await this.createVideoElement(width, heightVideo);\n if (!isCreated) {\n this._createEvent('Exit', this._playerId, 'Video Error: failed to create the Video Element');\n }\n }\n else {\n this._createEvent('Exit', this._playerId, 'Url Error: type not supported');\n }\n return;\n }\n async createVideoElement(width, height) {\n this.videoEl = document.createElement('video');\n this.videoEl.controls = true;\n this.videoEl.style.zIndex = (this._zIndex + 3).toString();\n this.videoEl.style.width = `${width.toString()}px`;\n this.videoEl.style.height = `${height.toString()}px`;\n this.videoEl.playbackRate = this._videoRate;\n this._videoContainer.appendChild(this.videoEl);\n // set the player\n const isSet = await this._setPlayer();\n if (isSet) {\n this.videoEl.onended = async () => {\n this._isEnded = true;\n this.isPlaying = false;\n if (this.videoEl) {\n this.videoEl.currentTime = 0;\n }\n if (this._videoExitOnEnd) {\n if (this._mode === 'fullscreen') {\n this._closeFullscreen();\n }\n this._createEvent('Ended', this._playerId);\n }\n else {\n if (this._videoLoopOnEnd && this.videoEl != null) {\n await this.videoEl.play();\n }\n }\n };\n this.videoEl.oncanplay = async () => {\n if (this._firstReadyToPlay) {\n this._createEvent('Ready', this._playerId);\n if (this.videoEl != null) {\n this.videoEl.muted = false;\n if (this._mode === 'fullscreen')\n await this.videoEl.play();\n this._firstReadyToPlay = false;\n }\n }\n };\n this.videoEl.onplay = () => {\n this.isPlaying = true;\n if (this._firstReadyToPlay)\n this._firstReadyToPlay = false;\n this._createEvent('Play', this._playerId);\n };\n this.videoEl.onplaying = () => {\n this._createEvent('Playing', this._playerId);\n };\n this.videoEl.onpause = () => {\n this.isPlaying = false;\n this._createEvent('Pause', this._playerId);\n };\n if (this._mode === 'fullscreen') {\n // create the video player exit button\n const exitEl = document.createElement('button');\n exitEl.textContent = 'X';\n exitEl.style.position = 'absolute';\n exitEl.style.left = '1%';\n exitEl.style.top = '5%';\n exitEl.style.width = '5vmin';\n exitEl.style.padding = '0.5%';\n exitEl.style.fontSize = '1.2rem';\n exitEl.style.background = 'rgba(51,51,51,.4)';\n exitEl.style.color = '#fff';\n exitEl.style.visibility = 'hidden';\n exitEl.style.zIndex = (this._zIndex + 4).toString();\n exitEl.style.border = '1px solid rgba(51,51,51,.4)';\n exitEl.style.borderRadius = '20px';\n this._videoContainer.onclick = async () => {\n this._initial = await this._doHide(exitEl, 3000);\n };\n this._videoContainer.ontouchstart = async () => {\n this._initial = await this._doHide(exitEl, 3000);\n };\n this._videoContainer.onmousemove = async () => {\n this._initial = await this._doHide(exitEl, 3000);\n };\n exitEl.onclick = () => {\n this._createEvent('Exit', this._playerId);\n };\n exitEl.ontouchstart = () => {\n this._createEvent('Exit', this._playerId);\n };\n this._videoContainer.appendChild(exitEl);\n this._initial = await this._doHide(exitEl, 3000);\n this._goFullscreen();\n }\n }\n return isSet;\n }\n async _goFullscreen() {\n if (this._container.mozRequestFullScreen) {\n /* Firefox */\n this._container.mozRequestFullScreen();\n }\n else if (this._container.webkitRequestFullscreen) {\n /* Chrome, Safari & Opera */\n this._container.webkitRequestFullscreen();\n }\n else if (this._container.msRequestFullscreen) {\n /* IE/Edge */\n this._container.msRequestFullscreen();\n }\n else if (this._container.requestFullscreen) {\n this._container.requestFullscreen();\n }\n return;\n }\n async _setPlayer() {\n return new Promise((resolve) => {\n if (this.videoEl != null) {\n if (Hls.isSupported() && this._videoType === 'application/x-mpegURL') {\n const hls = new Hls();\n hls.loadSource(this._url);\n hls.attachMedia(this.videoEl);\n hls.once(Hls.Events.FRAG_PARSED, () => {\n if (this.videoEl != null) {\n this.videoEl.muted = true;\n this.videoEl.crossOrigin = 'anonymous';\n resolve(true);\n }\n else {\n resolve(false);\n }\n });\n }\n else if (this._videoType === 'video/mp4') {\n // CMAF (fMP4) && MP4\n this.videoEl.src = this._url;\n if (this._url.substring(0, 5) != 'https' && this._url.substring(0, 4) === 'http')\n this.videoEl.crossOrigin = 'anonymous';\n if (this._url.substring(0, 5) === 'https' || this._url.substring(0, 4) === 'http')\n this.videoEl.muted = true;\n resolve(true);\n }\n else {\n // Not Supported\n resolve(false);\n }\n this.videoEl.addEventListener('enterpictureinpicture', (event) => {\n this.pipWindow = event.pictureInPictureWindow;\n this.pipMode = true;\n this._closeFullscreen();\n });\n this.videoEl.addEventListener('leavepictureinpicture', () => {\n this.pipMode = false;\n if (!this._isEnded) {\n this._goFullscreen();\n if (this.videoEl != null)\n this.videoEl.play();\n }\n });\n }\n else {\n resolve(false);\n }\n });\n }\n _getVideoType() {\n const sUrl = this._url ? this._url : '';\n if (sUrl != null && sUrl.length > 0) {\n Object.entries(videoTypes).forEach(([extension, mimeType]) => {\n // we search for dot + extension (e.g. `.mp4`) for URLs that have the extension in the filename\n // e.g. https://vimeo.com/?file=my-video.mp4\n const hasDotExtension = sUrl.match(new RegExp(`.(${extension})`, 'i'));\n if (hasDotExtension) {\n return (this._videoType = mimeType);\n }\n // we search for the extension (e.g. `m3u8`) for URLs that might have the extension as a query parameter\n // e.g. https://youtube.com/?v=7894289374&type=m3u8\n const hasExtensionInUrl = sUrl.match(new RegExp(`(${extension})`, 'i'));\n if (hasExtensionInUrl) {\n return (this._videoType = mimeType);\n }\n });\n // we check for not supported extensions for URLs that have the extension in the filename\n // e.g. https://vimeo.com/?file=not-supported-extension-video.mkv\n const hasNotSupportedDotExtension = sUrl.match(/\\.(.*)/i);\n if (hasNotSupportedDotExtension) {\n return (this._videoType = null);\n }\n // we check for not supported extensions for URLs that might have the extension as a query parameter\n // e.g. https://youtube.com/?v=3982748927&filetype=mkv\n const hasNotSupportedExtensionInUrl = sUrl.match(new RegExp(`(${possibleQueryParameterExtensions.join('|')})=+(.*)&?(?=&|$))`, 'i'));\n if (hasNotSupportedExtensionInUrl) {\n return (this._videoType = null);\n }\n // No extension found, then we assume it's 'mp4' (Match case for '')\n return 'video/mp4';\n }\n // URL was not defined, we return null\n return null;\n }\n async _doHide(exitEl, duration) {\n clearTimeout(this._initial);\n exitEl.style.visibility = 'visible';\n const initial = setTimeout(() => {\n exitEl.style.visibility = 'hidden';\n }, duration);\n return initial;\n }\n _createEvent(ev, playerId, msg) {\n const message = msg ? msg : null;\n let event;\n if (message != null) {\n event = new CustomEvent(`videoPlayer${ev}`, {\n detail: { fromPlayerId: playerId, message: message },\n });\n }\n else {\n const currentTime = this.videoEl ? this.videoEl.currentTime : 0;\n event = new CustomEvent(`videoPlayer${ev}`, {\n detail: { fromPlayerId: playerId, currentTime: currentTime },\n });\n }\n document.dispatchEvent(event);\n }\n _closeFullscreen() {\n const mydoc = document;\n const isInFullScreen = (mydoc.fullscreenElement && mydoc.fullscreenElement !== null) ||\n (mydoc.webkitFullscreenElement && mydoc.webkitFullscreenElement !== null) ||\n (mydoc.mozFullScreenElement && mydoc.mozFullScreenElement !== null) ||\n (mydoc.msFullscreenElement && mydoc.msFullscreenElement !== null);\n if (isInFullScreen) {\n if (mydoc.mozCancelFullScreen) {\n mydoc.mozCancelFullScreen();\n }\n else if (mydoc.webkitExitFullscreen) {\n mydoc.webkitExitFullscreen();\n }\n else if (mydoc.msExitFullscreen) {\n mydoc.msExitFullscreen();\n }\n else if (mydoc.exitFullscreen) {\n mydoc.exitFullscreen();\n }\n }\n }\n}\n//# sourceMappingURL=videoplayer.js.map","import { WebPlugin } from '@capacitor/core';\nimport { VideoPlayer } from './web-utils/videoplayer';\nexport class VideoPlayerWeb extends WebPlugin {\n constructor() {\n super();\n this._players = [];\n this.addListeners();\n }\n /**\n * Player initialization\n *\n * @param options\n */\n async initPlayer(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a capVideoPlayerOptions object',\n });\n }\n this.mode = options.mode ? options.mode : '';\n if (this.mode == null || this.mode.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Mode (fullscreen/embedded)',\n });\n }\n if (this.mode === 'fullscreen' || this.mode === 'embedded') {\n const url = options.url ? options.url : '';\n if (url == null || url.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Video Url',\n });\n }\n if (url == 'internal') {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Internal Videos not supported on Web Platform',\n });\n }\n const playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Player Id',\n });\n }\n const rate = options.rate ? options.rate : 1.0;\n let exitOnEnd = true;\n if (Object.keys(options).includes('exitOnEnd')) {\n const exitRet = options.exitOnEnd;\n exitOnEnd = exitRet != null ? exitRet : true;\n }\n let loopOnEnd = false;\n if (Object.keys(options).includes('loopOnEnd') && !exitOnEnd) {\n const loopRet = options.loopOnEnd;\n loopOnEnd = loopRet != null ? loopRet : false;\n }\n const componentTag = options.componentTag ? options.componentTag : '';\n if (componentTag == null || componentTag.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Component Tag',\n });\n }\n let playerSize = null;\n if (this.mode === 'embedded') {\n playerSize = this.checkSize(options);\n }\n const result = await this._initializeVideoPlayer(url, playerId, this.mode, rate, exitOnEnd, loopOnEnd, componentTag, playerSize);\n return Promise.resolve({ result: result });\n }\n else {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Mode either fullscreen or embedded)',\n });\n }\n }\n /**\n * Return if a given playerId is playing\n *\n * @param options\n */\n async isPlaying(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'isPlaying',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const playing = this._players[playerId].isPlaying;\n return Promise.resolve({\n method: 'isPlaying',\n result: true,\n value: playing,\n });\n }\n else {\n return Promise.resolve({\n method: 'isPlaying',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Play the current video from a given playerId\n *\n * @param options\n */\n async play(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'play',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n await this._players[playerId].videoEl.play();\n return Promise.resolve({ method: 'play', result: true, value: true });\n }\n else {\n return Promise.resolve({\n method: 'play',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Pause the current video from a given playerId\n *\n * @param options\n */\n async pause(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'pause',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n if (this._players[playerId].isPlaying)\n await this._players[playerId].videoEl.pause();\n return Promise.resolve({ method: 'pause', result: true, value: true });\n }\n else {\n return Promise.resolve({\n method: 'pause',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the duration of the current video from a given playerId\n *\n * @param options\n */\n async getDuration(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getDuration',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const duration = this._players[playerId].videoEl.duration;\n return Promise.resolve({\n method: 'getDuration',\n result: true,\n value: duration,\n });\n }\n else {\n return Promise.resolve({\n method: 'getDuration',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the rate of the current video from a given playerId\n *\n * @param options\n */\n async setRate(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setRate',\n message: 'Must provide a capVideoRateOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n const rateList = [0.25, 0.5, 0.75, 1.0, 2.0, 4.0];\n const rate = options.rate && rateList.includes(options.rate) ? options.rate : 1.0;\n if (this._players[playerId]) {\n this._players[playerId].videoEl.playbackRate = rate;\n return Promise.resolve({\n method: 'setRate',\n result: true,\n value: rate,\n });\n }\n else {\n return Promise.resolve({\n method: 'setRate',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the volume of the current video from a given playerId\n *\n * @param options\n */\n async getRate(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getRate',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const rate = this._players[playerId].videoEl.playbackRate;\n return Promise.resolve({\n method: 'getRate',\n result: true,\n value: rate,\n });\n }\n else {\n return Promise.resolve({\n method: 'getRate',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the volume of the current video from a given playerId\n *\n * @param options\n */\n async setVolume(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setVolume',\n message: 'Must provide a capVideoVolumeOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n const volume = options.volume ? options.volume : 0.5;\n if (this._players[playerId]) {\n this._players[playerId].videoEl.volume = volume;\n return Promise.resolve({\n method: 'setVolume',\n result: true,\n value: volume,\n });\n }\n else {\n return Promise.resolve({\n method: 'setVolume',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the volume of the current video from a given playerId\n *\n * @param options\n */\n async getVolume(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getVolume',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const volume = this._players[playerId].videoEl.volume;\n return Promise.resolve({\n method: 'getVolume',\n result: true,\n value: volume,\n });\n }\n else {\n return Promise.resolve({\n method: 'getVolume',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the muted property of the current video from a given playerId\n *\n * @param options\n */\n async setMuted(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setMuted',\n message: 'Must provide a capVideoMutedOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n const muted = options.muted ? options.muted : false;\n if (this._players[playerId]) {\n this._players[playerId].videoEl.muted = muted;\n return Promise.resolve({\n method: 'setMuted',\n result: true,\n value: muted,\n });\n }\n else {\n return Promise.resolve({\n method: 'setMuted',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the muted property of the current video from a given playerId\n *\n * @param options\n */\n async getMuted(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getMuted',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const muted = this._players[playerId].videoEl.muted;\n return Promise.resolve({\n method: 'getMuted',\n result: true,\n value: muted,\n });\n }\n else {\n return Promise.resolve({\n method: 'getMuted',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the current time of the current video from a given playerId\n *\n * @param options\n */\n async setCurrentTime(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setCurrentTime',\n message: 'Must provide a capVideoTimeOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n let seekTime = options.seektime ? options.seektime : 0;\n if (this._players[playerId]) {\n const duration = this._players[playerId].videoEl.duration;\n seekTime = seekTime <= duration && seekTime >= 0 ? seekTime : duration / 2;\n this._players[playerId].videoEl.currentTime = seekTime;\n return Promise.resolve({\n method: 'setCurrentTime',\n result: true,\n value: seekTime,\n });\n }\n else {\n return Promise.resolve({\n method: 'setCurrentTime',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the current time of the current video from a given playerId\n *\n * @param options\n */\n async getCurrentTime(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getCurrentTime',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const seekTime = this._players[playerId].videoEl.currentTime;\n return Promise.resolve({\n method: 'getCurrentTime',\n result: true,\n value: seekTime,\n });\n }\n else {\n return Promise.resolve({\n method: 'getCurrentTime',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the current time of the current video from a given playerId\n *\n */\n async stopAllPlayers() {\n for (const i in this._players) {\n if (this._players[i].pipMode) {\n const doc = document;\n if (doc.pictureInPictureElement) {\n await doc.exitPictureInPicture();\n }\n }\n if (!this._players[i].videoEl.paused)\n this._players[i].videoEl.pause();\n }\n return Promise.resolve({\n method: 'stopAllPlayers',\n result: true,\n value: true,\n });\n }\n /**\n * Show controller\n *\n */\n async showController() {\n return Promise.resolve({\n method: 'showController',\n result: true,\n value: true,\n });\n }\n /**\n * isControllerIsFullyVisible\n *\n */\n async isControllerIsFullyVisible() {\n return Promise.resolve({\n method: 'isControllerIsFullyVisible',\n result: true,\n value: true,\n });\n }\n /**\n * Exit the current player\n *\n */\n async exitPlayer() {\n return Promise.resolve({\n method: 'exitPlayer',\n result: true,\n value: true,\n });\n }\n checkSize(options) {\n const playerSize = {\n width: options.width ? options.width : 320,\n height: options.height ? options.height : 180,\n };\n const ratio = playerSize.height / playerSize.width;\n if (playerSize.width > window.innerWidth) {\n playerSize.width = window.innerWidth;\n playerSize.height = Math.floor(playerSize.width * ratio);\n }\n if (playerSize.height > window.innerHeight) {\n playerSize.height = window.innerHeight;\n playerSize.width = Math.floor(playerSize.height / ratio);\n }\n return playerSize;\n }\n async _initializeVideoPlayer(url, playerId, mode, rate, exitOnEnd, loopOnEnd, componentTag, playerSize) {\n const videoURL = url ? (url.indexOf('%2F') == -1 ? encodeURI(url) : url) : null;\n if (videoURL === null)\n return Promise.resolve(false);\n this.videoContainer = await this._getContainerElement(playerId, componentTag);\n if (this.videoContainer === null)\n return Promise.resolve({\n method: 'initPlayer',\n result: false,\n message: 'componentTag or divContainerElement must be provided',\n });\n if (mode === 'embedded' && playerSize == null)\n return Promise.resolve({\n method: 'initPlayer',\n result: false,\n message: 'playerSize must be defined in embedded mode',\n });\n if (mode === 'embedded') {\n this._players[playerId] = new VideoPlayer('embedded', videoURL, playerId, rate, exitOnEnd, loopOnEnd, this.videoContainer, 2, playerSize.width, playerSize.height);\n await this._players[playerId].initialize();\n }\n else if (mode === 'fullscreen') {\n this._players['fullscreen'] = new VideoPlayer('fullscreen', videoURL, 'fullscreen', rate, exitOnEnd, loopOnEnd, this.videoContainer, 99995);\n await this._players['fullscreen'].initialize();\n }\n else {\n return Promise.resolve({\n method: 'initPlayer',\n result: false,\n message: 'mode not supported',\n });\n }\n return Promise.resolve({ method: 'initPlayer', result: true, value: true });\n }\n async _getContainerElement(playerId, componentTag) {\n const videoContainer = document.createElement('div');\n videoContainer.id = `vc_${playerId}`;\n if (componentTag != null && componentTag.length > 0) {\n const cmpTagEl = document.querySelector(`${componentTag}`);\n if (cmpTagEl === null)\n return Promise.resolve(null);\n let container = null;\n const shadowRoot = cmpTagEl.shadowRoot ? cmpTagEl.shadowRoot : null;\n if (shadowRoot != null) {\n container = shadowRoot.querySelector(`[id='${playerId}']`);\n }\n else {\n container = cmpTagEl.querySelector(`[id='${playerId}']`);\n }\n if (container != null)\n container.appendChild(videoContainer);\n return Promise.resolve(videoContainer);\n }\n else {\n return Promise.resolve(null);\n }\n }\n handlePlayerPlay(data) {\n this.notifyListeners('jeepCapVideoPlayerPlay', data);\n }\n handlePlayerPause(data) {\n this.notifyListeners('jeepCapVideoPlayerPause', data);\n }\n handlePlayerEnded(data) {\n var _a;\n if (this.mode === 'fullscreen') {\n (_a = this.videoContainer) === null || _a === void 0 ? void 0 : _a.remove();\n }\n this.removeListeners();\n this.notifyListeners('jeepCapVideoPlayerEnded', data);\n }\n handlePlayerExit() {\n var _a;\n if (this.mode === 'fullscreen') {\n (_a = this.videoContainer) === null || _a === void 0 ? void 0 : _a.remove();\n }\n const retData = { dismiss: true };\n this.removeListeners();\n this.notifyListeners('jeepCapVideoPlayerExit', retData);\n }\n handlePlayerReady(data) {\n this.notifyListeners('jeepCapVideoPlayerReady', data);\n }\n addListeners() {\n document.addEventListener('videoPlayerPlay', (ev) => {\n this.handlePlayerPlay(ev.detail);\n }, false);\n document.addEventListener('videoPlayerPause', (ev) => {\n this.handlePlayerPause(ev.detail);\n }, false);\n document.addEventListener('videoPlayerEnded', (ev) => {\n this.handlePlayerEnded(ev.detail);\n }, false);\n document.addEventListener('videoPlayerReady', (ev) => {\n this.handlePlayerReady(ev.detail);\n }, false);\n document.addEventListener('videoPlayerExit', () => {\n this.handlePlayerExit();\n }, false);\n }\n removeListeners() {\n document.removeEventListener('videoPlayerPlay', (ev) => {\n this.handlePlayerPlay(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerPause', (ev) => {\n this.handlePlayerPause(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerEnded', (ev) => {\n this.handlePlayerEnded(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerReady', (ev) => {\n this.handlePlayerReady(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerExit', () => {\n this.handlePlayerExit();\n }, false);\n }\n async getPluginVersion() {\n return { version: 'web' };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["VideoPlayer","registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web-utils/video-types.js","esm/web-utils/videoplayer.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst VideoPlayer = registerPlugin('VideoPlayer', {\n web: () => import('./web').then((m) => new m.VideoPlayerWeb()),\n});\nexport * from './definitions';\nexport { VideoPlayer };\n//# sourceMappingURL=index.js.map","export const possibleQueryParameterExtensions = ['file', 'extension', 'filetype', 'type', 'ext'];\nexport const videoTypes = {\n mp4: 'video/mp4',\n webm: 'video/mp4',\n cmaf: 'video/mp4',\n cmfv: 'video/mp4',\n m3u8: 'application/x-mpegURL',\n};\n//# sourceMappingURL=video-types.js.map","import Hls from 'hls.js';\nimport { videoTypes, possibleQueryParameterExtensions } from './video-types';\nexport class VideoPlayer {\n constructor(mode, url, playerId, rate, exitOnEnd, loopOnEnd, container, zIndex, width, height) {\n this.pipMode = false;\n this._videoType = null;\n this._videoContainer = null;\n this._firstReadyToPlay = true;\n this._isEnded = false;\n this._videoRate = 1.0;\n this._videoExitOnEnd = true;\n this._videoLoopOnEnd = false;\n this._url = url;\n this._container = container;\n this._mode = mode;\n this._width = width ? width : 320;\n this._height = height ? height : 180;\n this._mode = mode;\n this._videoRate = rate;\n this._zIndex = zIndex ? zIndex : 1;\n this._playerId = playerId;\n this._videoExitOnEnd = exitOnEnd;\n this._videoLoopOnEnd = loopOnEnd;\n }\n async initialize() {\n // get the video type\n const urlVideoType = this._getVideoType();\n if (urlVideoType) {\n // style the container\n if (this._mode === 'fullscreen') {\n this._container.style.position = 'absolute';\n this._container.style.width = '100vw';\n this._container.style.height = '100vh';\n }\n if (this._mode === 'embedded') {\n this._container.style.position = 'relative';\n this._container.style.width = this._width.toString() + 'px';\n this._container.style.height = this._height.toString() + 'px';\n }\n this._container.style.left = '0';\n this._container.style.top = '0';\n this._container.style.display = 'flex';\n this._container.style.alignItems = 'center';\n this._container.style.justifyContent = 'center';\n this._container.style.backgroundColor = '#000000';\n this._container.style.zIndex = this._zIndex.toString();\n const width = this._mode === 'fullscreen' ? window.innerWidth /*this._container.offsetWidth*/ : this._width;\n const height = this._mode === 'fullscreen' ? window.innerHeight /*this._container.offsetHeight*/ : this._height;\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n svg.setAttributeNS(null, 'width', width.toString());\n svg.setAttributeNS(null, 'height', height.toString());\n const viewbox = '0 0 ' + width.toString() + ' ' + height.toString();\n svg.setAttributeNS(null, 'viewBox', viewbox);\n svg.style.zIndex = (this._zIndex + 1).toString();\n const rect = document.createElementNS(xmlns, 'rect');\n rect.setAttributeNS(null, 'x', '0');\n rect.setAttributeNS(null, 'y', '0');\n rect.setAttributeNS(null, 'width', width.toString());\n rect.setAttributeNS(null, 'height', height.toString());\n rect.setAttributeNS(null, 'fill', '#000000');\n svg.appendChild(rect);\n this._container.appendChild(svg);\n const heightVideo = (width * this._height) / this._width;\n this._videoContainer = document.createElement('div');\n this._videoContainer.style.position = 'absolute';\n this._videoContainer.style.left = '0';\n this._videoContainer.style.width = width.toString() + 'px';\n this._videoContainer.style.height = heightVideo.toString() + 'px';\n this._videoContainer.style.zIndex = (this._zIndex + 2).toString();\n this._container.appendChild(this._videoContainer);\n /* Create Video Element */\n const isCreated = await this.createVideoElement(width, heightVideo);\n if (!isCreated) {\n this._createEvent('Exit', this._playerId, 'Video Error: failed to create the Video Element');\n }\n }\n else {\n this._createEvent('Exit', this._playerId, 'Url Error: type not supported');\n }\n return;\n }\n async createVideoElement(width, height) {\n this.videoEl = document.createElement('video');\n this.videoEl.controls = true;\n this.videoEl.style.zIndex = (this._zIndex + 3).toString();\n this.videoEl.style.width = `${width.toString()}px`;\n this.videoEl.style.height = `${height.toString()}px`;\n this.videoEl.playbackRate = this._videoRate;\n this._videoContainer.appendChild(this.videoEl);\n // set the player\n const isSet = await this._setPlayer();\n if (isSet) {\n this.videoEl.onended = async () => {\n this._isEnded = true;\n this.isPlaying = false;\n if (this.videoEl) {\n this.videoEl.currentTime = 0;\n }\n if (this._videoExitOnEnd) {\n if (this._mode === 'fullscreen') {\n this._closeFullscreen();\n }\n this._createEvent('Ended', this._playerId);\n }\n else {\n if (this._videoLoopOnEnd && this.videoEl != null) {\n await this.videoEl.play();\n }\n }\n };\n this.videoEl.oncanplay = async () => {\n if (this._firstReadyToPlay) {\n this._createEvent('Ready', this._playerId);\n if (this.videoEl != null) {\n this.videoEl.muted = false;\n if (this._mode === 'fullscreen')\n await this.videoEl.play();\n this._firstReadyToPlay = false;\n }\n }\n };\n this.videoEl.onplay = () => {\n this.isPlaying = true;\n if (this._firstReadyToPlay)\n this._firstReadyToPlay = false;\n this._createEvent('Play', this._playerId);\n };\n this.videoEl.onplaying = () => {\n this._createEvent('Playing', this._playerId);\n };\n this.videoEl.onpause = () => {\n this.isPlaying = false;\n this._createEvent('Pause', this._playerId);\n };\n if (this._mode === 'fullscreen') {\n // create the video player exit button\n const exitEl = document.createElement('button');\n exitEl.textContent = 'X';\n exitEl.style.position = 'absolute';\n exitEl.style.left = '1%';\n exitEl.style.top = '5%';\n exitEl.style.width = '5vmin';\n exitEl.style.padding = '0.5%';\n exitEl.style.fontSize = '1.2rem';\n exitEl.style.background = 'rgba(51,51,51,.4)';\n exitEl.style.color = '#fff';\n exitEl.style.visibility = 'hidden';\n exitEl.style.zIndex = (this._zIndex + 4).toString();\n exitEl.style.border = '1px solid rgba(51,51,51,.4)';\n exitEl.style.borderRadius = '20px';\n this._videoContainer.onclick = async () => {\n this._initial = await this._doHide(exitEl, 3000);\n };\n this._videoContainer.ontouchstart = async () => {\n this._initial = await this._doHide(exitEl, 3000);\n };\n this._videoContainer.onmousemove = async () => {\n this._initial = await this._doHide(exitEl, 3000);\n };\n exitEl.onclick = () => {\n this._createEvent('Exit', this._playerId);\n };\n exitEl.ontouchstart = () => {\n this._createEvent('Exit', this._playerId);\n };\n this._videoContainer.appendChild(exitEl);\n this._initial = await this._doHide(exitEl, 3000);\n this._goFullscreen();\n }\n }\n return isSet;\n }\n async _goFullscreen() {\n if (this._container.mozRequestFullScreen) {\n /* Firefox */\n this._container.mozRequestFullScreen();\n }\n else if (this._container.webkitRequestFullscreen) {\n /* Chrome, Safari & Opera */\n this._container.webkitRequestFullscreen();\n }\n else if (this._container.msRequestFullscreen) {\n /* IE/Edge */\n this._container.msRequestFullscreen();\n }\n else if (this._container.requestFullscreen) {\n this._container.requestFullscreen();\n }\n return;\n }\n async _setPlayer() {\n return new Promise((resolve) => {\n if (this.videoEl != null) {\n if (Hls.isSupported() && this._videoType === 'application/x-mpegURL') {\n const hls = new Hls();\n hls.loadSource(this._url);\n hls.attachMedia(this.videoEl);\n hls.once(Hls.Events.FRAG_PARSED, () => {\n if (this.videoEl != null) {\n this.videoEl.muted = true;\n this.videoEl.crossOrigin = 'anonymous';\n resolve(true);\n }\n else {\n resolve(false);\n }\n });\n }\n else if (this._videoType === 'video/mp4') {\n // CMAF (fMP4) && MP4\n this.videoEl.src = this._url;\n if (this._url.substring(0, 5) != 'https' && this._url.substring(0, 4) === 'http')\n this.videoEl.crossOrigin = 'anonymous';\n if (this._url.substring(0, 5) === 'https' || this._url.substring(0, 4) === 'http')\n this.videoEl.muted = true;\n resolve(true);\n }\n else {\n // Not Supported\n resolve(false);\n }\n this.videoEl.addEventListener('enterpictureinpicture', (event) => {\n this.pipWindow = event.pictureInPictureWindow;\n this.pipMode = true;\n this._closeFullscreen();\n });\n this.videoEl.addEventListener('leavepictureinpicture', () => {\n this.pipMode = false;\n if (!this._isEnded) {\n this._goFullscreen();\n if (this.videoEl != null)\n this.videoEl.play();\n }\n });\n }\n else {\n resolve(false);\n }\n });\n }\n _getVideoType() {\n const sUrl = this._url ? this._url : '';\n if (sUrl != null && sUrl.length > 0) {\n for (const [extension, mimeType] of Object.entries(videoTypes)) {\n // we search for dot + extension (e.g. `.mp4`) for URLs that have the extension in the filename\n // e.g. https://vimeo.com/?file=my-video.mp4\n const hasDotExtension = sUrl.match(new RegExp(`\\\\.(${extension})(?=[?&#]|$)`, 'i'));\n if (hasDotExtension) {\n return (this._videoType = mimeType);\n }\n }\n for (const [extension, mimeType] of Object.entries(videoTypes)) {\n // we search for the extension (e.g. `m3u8`) for URLs that might have the extension as a query parameter\n // e.g. https://youtube.com/?v=7894289374&type=m3u8\n const hasExtensionInUrl = sUrl.match(new RegExp(`(${extension})`, 'i'));\n if (hasExtensionInUrl) {\n return (this._videoType = mimeType);\n }\n }\n // we check for not supported extensions for URLs that have the extension in the filename\n // e.g. https://vimeo.com/?file=not-supported-extension-video.mkv\n const hasNotSupportedDotExtension = sUrl.match(/\\.(.*)/i);\n if (hasNotSupportedDotExtension) {\n return (this._videoType = null);\n }\n // we check for not supported extensions for URLs that might have the extension as a query parameter\n // e.g. https://youtube.com/?v=3982748927&filetype=mkv\n const hasNotSupportedExtensionInUrl = sUrl.match(new RegExp(`(${possibleQueryParameterExtensions.join('|')})=+(.*)&?(?=&|$)`, 'i'));\n if (hasNotSupportedExtensionInUrl) {\n return (this._videoType = null);\n }\n // No extension found, then we assume it's 'mp4' (Match case for '')\n return 'video/mp4';\n }\n // URL was not defined, we return null\n return null;\n }\n async _doHide(exitEl, duration) {\n clearTimeout(this._initial);\n exitEl.style.visibility = 'visible';\n const initial = setTimeout(() => {\n exitEl.style.visibility = 'hidden';\n }, duration);\n return initial;\n }\n _createEvent(ev, playerId, msg) {\n const message = msg ? msg : null;\n let event;\n if (message != null) {\n event = new CustomEvent(`videoPlayer${ev}`, {\n detail: { fromPlayerId: playerId, message: message },\n });\n }\n else {\n const currentTime = this.videoEl ? this.videoEl.currentTime : 0;\n event = new CustomEvent(`videoPlayer${ev}`, {\n detail: { fromPlayerId: playerId, currentTime: currentTime },\n });\n }\n document.dispatchEvent(event);\n }\n _closeFullscreen() {\n const mydoc = document;\n const isInFullScreen = (mydoc.fullscreenElement && mydoc.fullscreenElement !== null) ||\n (mydoc.webkitFullscreenElement && mydoc.webkitFullscreenElement !== null) ||\n (mydoc.mozFullScreenElement && mydoc.mozFullScreenElement !== null) ||\n (mydoc.msFullscreenElement && mydoc.msFullscreenElement !== null);\n if (isInFullScreen) {\n if (mydoc.mozCancelFullScreen) {\n mydoc.mozCancelFullScreen();\n }\n else if (mydoc.webkitExitFullscreen) {\n mydoc.webkitExitFullscreen();\n }\n else if (mydoc.msExitFullscreen) {\n mydoc.msExitFullscreen();\n }\n else if (mydoc.exitFullscreen) {\n mydoc.exitFullscreen();\n }\n }\n }\n}\n//# sourceMappingURL=videoplayer.js.map","import { WebPlugin } from '@capacitor/core';\nimport { VideoPlayer } from './web-utils/videoplayer';\nexport class VideoPlayerWeb extends WebPlugin {\n constructor() {\n super();\n this._players = [];\n this.addListeners();\n }\n /**\n * Player initialization\n *\n * @param options\n */\n async initPlayer(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a capVideoPlayerOptions object',\n });\n }\n this.mode = options.mode ? options.mode : '';\n if (this.mode == null || this.mode.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Mode (fullscreen/embedded)',\n });\n }\n if (this.mode === 'fullscreen' || this.mode === 'embedded') {\n const url = options.url ? options.url : '';\n if (url == null || url.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Video Url',\n });\n }\n if (url == 'internal') {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Internal Videos not supported on Web Platform',\n });\n }\n const playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Player Id',\n });\n }\n const rate = options.rate ? options.rate : 1.0;\n let exitOnEnd = true;\n if (Object.keys(options).includes('exitOnEnd')) {\n const exitRet = options.exitOnEnd;\n exitOnEnd = exitRet != null ? exitRet : true;\n }\n let loopOnEnd = false;\n if (Object.keys(options).includes('loopOnEnd') && !exitOnEnd) {\n const loopRet = options.loopOnEnd;\n loopOnEnd = loopRet != null ? loopRet : false;\n }\n const componentTag = options.componentTag ? options.componentTag : '';\n if (componentTag == null || componentTag.length === 0) {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Component Tag',\n });\n }\n let playerSize = null;\n if (this.mode === 'embedded') {\n playerSize = this.checkSize(options);\n }\n const result = await this._initializeVideoPlayer(url, playerId, this.mode, rate, exitOnEnd, loopOnEnd, componentTag, playerSize);\n return Promise.resolve({ result: result });\n }\n else {\n return Promise.resolve({\n result: false,\n method: 'initPlayer',\n message: 'Must provide a Mode either fullscreen or embedded)',\n });\n }\n }\n /**\n * Return if a given playerId is playing\n *\n * @param options\n */\n async isPlaying(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'isPlaying',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const playing = this._players[playerId].isPlaying;\n return Promise.resolve({\n method: 'isPlaying',\n result: true,\n value: playing,\n });\n }\n else {\n return Promise.resolve({\n method: 'isPlaying',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Play the current video from a given playerId\n *\n * @param options\n */\n async play(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'play',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n if (!this._players[playerId].videoEl) {\n return Promise.resolve({\n method: 'play',\n result: false,\n message: 'Video element is not initialized for given PlayerId',\n });\n }\n await this._players[playerId].videoEl.play();\n return Promise.resolve({ method: 'play', result: true, value: true });\n }\n else {\n return Promise.resolve({\n method: 'play',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Pause the current video from a given playerId\n *\n * @param options\n */\n async pause(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'pause',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n if (this._players[playerId].isPlaying && this._players[playerId].videoEl)\n await this._players[playerId].videoEl.pause();\n return Promise.resolve({ method: 'pause', result: true, value: true });\n }\n else {\n return Promise.resolve({\n method: 'pause',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the duration of the current video from a given playerId\n *\n * @param options\n */\n async getDuration(options) {\n var _a, _b;\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getDuration',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const duration = (_b = (_a = this._players[playerId].videoEl) === null || _a === void 0 ? void 0 : _a.duration) !== null && _b !== void 0 ? _b : 0;\n return Promise.resolve({\n method: 'getDuration',\n result: true,\n value: duration,\n });\n }\n else {\n return Promise.resolve({\n method: 'getDuration',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the rate of the current video from a given playerId\n *\n * @param options\n */\n async setRate(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setRate',\n message: 'Must provide a capVideoRateOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n const rateList = [0.25, 0.5, 0.75, 1.0, 2.0, 4.0];\n const rate = options.rate && rateList.includes(options.rate) ? options.rate : 1.0;\n if (this._players[playerId]) {\n if (this._players[playerId].videoEl)\n this._players[playerId].videoEl.playbackRate = rate;\n return Promise.resolve({\n method: 'setRate',\n result: true,\n value: rate,\n });\n }\n else {\n return Promise.resolve({\n method: 'setRate',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the volume of the current video from a given playerId\n *\n * @param options\n */\n async getRate(options) {\n var _a, _b;\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getRate',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const rate = (_b = (_a = this._players[playerId].videoEl) === null || _a === void 0 ? void 0 : _a.playbackRate) !== null && _b !== void 0 ? _b : 1.0;\n return Promise.resolve({\n method: 'getRate',\n result: true,\n value: rate,\n });\n }\n else {\n return Promise.resolve({\n method: 'getRate',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the volume of the current video from a given playerId\n *\n * @param options\n */\n async setVolume(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setVolume',\n message: 'Must provide a capVideoVolumeOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n const volume = options.volume ? options.volume : 0.5;\n if (this._players[playerId]) {\n if (this._players[playerId].videoEl)\n this._players[playerId].videoEl.volume = volume;\n return Promise.resolve({\n method: 'setVolume',\n result: true,\n value: volume,\n });\n }\n else {\n return Promise.resolve({\n method: 'setVolume',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the volume of the current video from a given playerId\n *\n * @param options\n */\n async getVolume(options) {\n var _a, _b;\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getVolume',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const volume = (_b = (_a = this._players[playerId].videoEl) === null || _a === void 0 ? void 0 : _a.volume) !== null && _b !== void 0 ? _b : 1.0;\n return Promise.resolve({\n method: 'getVolume',\n result: true,\n value: volume,\n });\n }\n else {\n return Promise.resolve({\n method: 'getVolume',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the muted property of the current video from a given playerId\n *\n * @param options\n */\n async setMuted(options) {\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setMuted',\n message: 'Must provide a capVideoMutedOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n const muted = options.muted ? options.muted : false;\n if (this._players[playerId]) {\n if (this._players[playerId].videoEl)\n this._players[playerId].videoEl.muted = muted;\n return Promise.resolve({\n method: 'setMuted',\n result: true,\n value: muted,\n });\n }\n else {\n return Promise.resolve({\n method: 'setMuted',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the muted property of the current video from a given playerId\n *\n * @param options\n */\n async getMuted(options) {\n var _a, _b;\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getMuted',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const muted = (_b = (_a = this._players[playerId].videoEl) === null || _a === void 0 ? void 0 : _a.muted) !== null && _b !== void 0 ? _b : false;\n return Promise.resolve({\n method: 'getMuted',\n result: true,\n value: muted,\n });\n }\n else {\n return Promise.resolve({\n method: 'getMuted',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Set the current time of the current video from a given playerId\n *\n * @param options\n */\n async setCurrentTime(options) {\n var _a, _b;\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'setCurrentTime',\n message: 'Must provide a capVideoTimeOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n let seekTime = options.seektime ? options.seektime : 0;\n if (this._players[playerId]) {\n const duration = (_b = (_a = this._players[playerId].videoEl) === null || _a === void 0 ? void 0 : _a.duration) !== null && _b !== void 0 ? _b : 0;\n seekTime = seekTime <= duration && seekTime >= 0 ? seekTime : duration / 2;\n if (this._players[playerId].videoEl)\n this._players[playerId].videoEl.currentTime = seekTime;\n return Promise.resolve({\n method: 'setCurrentTime',\n result: true,\n value: seekTime,\n });\n }\n else {\n return Promise.resolve({\n method: 'setCurrentTime',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the current time of the current video from a given playerId\n *\n * @param options\n */\n async getCurrentTime(options) {\n var _a, _b;\n if (options == null) {\n return Promise.resolve({\n result: false,\n method: 'getCurrentTime',\n message: 'Must provide a capVideoPlayerIdOptions object',\n });\n }\n let playerId = options.playerId ? options.playerId : '';\n if (playerId == null || playerId.length === 0) {\n playerId = 'fullscreen';\n }\n if (this._players[playerId]) {\n const seekTime = (_b = (_a = this._players[playerId].videoEl) === null || _a === void 0 ? void 0 : _a.currentTime) !== null && _b !== void 0 ? _b : 0;\n return Promise.resolve({\n method: 'getCurrentTime',\n result: true,\n value: seekTime,\n });\n }\n else {\n return Promise.resolve({\n method: 'getCurrentTime',\n result: false,\n message: 'Given PlayerId does not exist)',\n });\n }\n }\n /**\n * Get the current time of the current video from a given playerId\n *\n */\n async stopAllPlayers() {\n for (const i in this._players) {\n if (this._players[i].pipMode) {\n const doc = document;\n if (doc.pictureInPictureElement) {\n await doc.exitPictureInPicture();\n }\n }\n if (this._players[i].videoEl && !this._players[i].videoEl.paused)\n this._players[i].videoEl.pause();\n }\n return Promise.resolve({\n method: 'stopAllPlayers',\n result: true,\n value: true,\n });\n }\n /**\n * Show controller\n *\n */\n async showController() {\n return Promise.resolve({\n method: 'showController',\n result: true,\n value: true,\n });\n }\n /**\n * isControllerIsFullyVisible\n *\n */\n async isControllerIsFullyVisible() {\n return Promise.resolve({\n method: 'isControllerIsFullyVisible',\n result: true,\n value: true,\n });\n }\n /**\n * Exit the current player\n *\n */\n async exitPlayer() {\n return Promise.resolve({\n method: 'exitPlayer',\n result: true,\n value: true,\n });\n }\n checkSize(options) {\n const playerSize = {\n width: options.width ? options.width : 320,\n height: options.height ? options.height : 180,\n };\n const ratio = playerSize.height / playerSize.width;\n if (playerSize.width > window.innerWidth) {\n playerSize.width = window.innerWidth;\n playerSize.height = Math.floor(playerSize.width * ratio);\n }\n if (playerSize.height > window.innerHeight) {\n playerSize.height = window.innerHeight;\n playerSize.width = Math.floor(playerSize.height / ratio);\n }\n return playerSize;\n }\n async _initializeVideoPlayer(url, playerId, mode, rate, exitOnEnd, loopOnEnd, componentTag, playerSize) {\n const videoURL = url ? (url.indexOf('%2F') == -1 ? encodeURI(url) : url) : null;\n if (videoURL === null)\n return Promise.resolve(false);\n this.videoContainer = await this._getContainerElement(playerId, componentTag);\n if (this.videoContainer === null)\n return Promise.resolve({\n method: 'initPlayer',\n result: false,\n message: 'componentTag or divContainerElement must be provided',\n });\n if (mode === 'embedded' && playerSize == null)\n return Promise.resolve({\n method: 'initPlayer',\n result: false,\n message: 'playerSize must be defined in embedded mode',\n });\n if (mode === 'embedded') {\n this._players[playerId] = new VideoPlayer('embedded', videoURL, playerId, rate, exitOnEnd, loopOnEnd, this.videoContainer, 2, playerSize.width, playerSize.height);\n await this._players[playerId].initialize();\n }\n else if (mode === 'fullscreen') {\n this._players['fullscreen'] = new VideoPlayer('fullscreen', videoURL, 'fullscreen', rate, exitOnEnd, loopOnEnd, this.videoContainer, 99995);\n await this._players['fullscreen'].initialize();\n }\n else {\n return Promise.resolve({\n method: 'initPlayer',\n result: false,\n message: 'mode not supported',\n });\n }\n return Promise.resolve({ method: 'initPlayer', result: true, value: true });\n }\n async _getContainerElement(playerId, componentTag) {\n const videoContainer = document.createElement('div');\n videoContainer.id = `vc_${playerId}`;\n if (componentTag != null && componentTag.length > 0) {\n const cmpTagEl = document.querySelector(`${componentTag}`);\n if (cmpTagEl === null)\n return Promise.resolve(null);\n let container = null;\n const shadowRoot = cmpTagEl.shadowRoot ? cmpTagEl.shadowRoot : null;\n if (shadowRoot != null) {\n container = shadowRoot.querySelector(`[id='${playerId}']`);\n }\n else {\n container = cmpTagEl.querySelector(`[id='${playerId}']`);\n }\n if (container != null)\n container.appendChild(videoContainer);\n return Promise.resolve(videoContainer);\n }\n else {\n return Promise.resolve(null);\n }\n }\n handlePlayerPlay(data) {\n this.notifyListeners('jeepCapVideoPlayerPlay', data);\n }\n handlePlayerPause(data) {\n this.notifyListeners('jeepCapVideoPlayerPause', data);\n }\n handlePlayerEnded(data) {\n var _a;\n if (this.mode === 'fullscreen') {\n (_a = this.videoContainer) === null || _a === void 0 ? void 0 : _a.remove();\n }\n this.removeListeners();\n this.notifyListeners('jeepCapVideoPlayerEnded', data);\n }\n handlePlayerExit() {\n var _a;\n if (this.mode === 'fullscreen') {\n (_a = this.videoContainer) === null || _a === void 0 ? void 0 : _a.remove();\n }\n const retData = { dismiss: true };\n this.removeListeners();\n this.notifyListeners('jeepCapVideoPlayerExit', retData);\n }\n handlePlayerReady(data) {\n this.notifyListeners('jeepCapVideoPlayerReady', data);\n }\n addListeners() {\n document.addEventListener('videoPlayerPlay', (ev) => {\n this.handlePlayerPlay(ev.detail);\n }, false);\n document.addEventListener('videoPlayerPause', (ev) => {\n this.handlePlayerPause(ev.detail);\n }, false);\n document.addEventListener('videoPlayerEnded', (ev) => {\n this.handlePlayerEnded(ev.detail);\n }, false);\n document.addEventListener('videoPlayerReady', (ev) => {\n this.handlePlayerReady(ev.detail);\n }, false);\n document.addEventListener('videoPlayerExit', () => {\n this.handlePlayerExit();\n }, false);\n }\n removeListeners() {\n document.removeEventListener('videoPlayerPlay', (ev) => {\n this.handlePlayerPlay(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerPause', (ev) => {\n this.handlePlayerPause(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerEnded', (ev) => {\n this.handlePlayerEnded(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerReady', (ev) => {\n this.handlePlayerReady(ev.detail);\n }, false);\n document.removeEventListener('videoPlayerExit', () => {\n this.handlePlayerExit();\n }, false);\n }\n async getPluginVersion() {\n return { version: 'web' };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["VideoPlayer","registerPlugin","WebPlugin"],"mappings":"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"}
|
|
@@ -20,8 +20,11 @@ class FullscreenVideoPlayer: NSObject {
|
|
|
20
20
|
private var onReady: (() -> Void)?
|
|
21
21
|
private var onEnd: (() -> Void)?
|
|
22
22
|
private var onExit: ((Double) -> Void)?
|
|
23
|
+
private var fairplayCertificateUrl: String?
|
|
24
|
+
private var fairplayContentKeySpcUrl: String?
|
|
25
|
+
private var contentKeySession: AVContentKeySession?
|
|
23
26
|
|
|
24
|
-
init(playerId: String, url: String, rate: Float, exitOnEnd: Bool, loopOnEnd: Bool, pipEnabled: Bool, showControls: Bool) {
|
|
27
|
+
init(playerId: String, url: String, rate: Float, exitOnEnd: Bool, loopOnEnd: Bool, pipEnabled: Bool, showControls: Bool, fairplayCertificateUrl: String? = nil, fairplayContentKeySpcUrl: String? = nil) {
|
|
25
28
|
self.playerId = playerId
|
|
26
29
|
self.videoUrl = url
|
|
27
30
|
self.rate = rate
|
|
@@ -29,6 +32,8 @@ class FullscreenVideoPlayer: NSObject {
|
|
|
29
32
|
self.loopOnEnd = loopOnEnd
|
|
30
33
|
self.pipEnabled = pipEnabled
|
|
31
34
|
self.showControls = showControls
|
|
35
|
+
self.fairplayCertificateUrl = fairplayCertificateUrl
|
|
36
|
+
self.fairplayContentKeySpcUrl = fairplayContentKeySpcUrl
|
|
32
37
|
super.init()
|
|
33
38
|
}
|
|
34
39
|
|
|
@@ -37,8 +42,17 @@ class FullscreenVideoPlayer: NSObject {
|
|
|
37
42
|
return
|
|
38
43
|
}
|
|
39
44
|
|
|
45
|
+
let asset = AVURLAsset(url: url)
|
|
46
|
+
|
|
47
|
+
// Configure FairPlay DRM if certificate URL is provided
|
|
48
|
+
if let certUrl = fairplayCertificateUrl, !certUrl.isEmpty {
|
|
49
|
+
let session = AVContentKeySession(keySystem: .fairPlayStreaming)
|
|
50
|
+
session.setDelegate(self, queue: DispatchQueue.global(qos: .default))
|
|
51
|
+
session.addContentKeyRecipient(asset)
|
|
52
|
+
self.contentKeySession = session
|
|
53
|
+
}
|
|
54
|
+
|
|
40
55
|
// Create player item with asset
|
|
41
|
-
let asset = AVAsset(url: url)
|
|
42
56
|
playerItem = AVPlayerItem(asset: asset)
|
|
43
57
|
|
|
44
58
|
// Create player
|
|
@@ -235,3 +249,76 @@ class FullscreenVideoPlayer: NSObject {
|
|
|
235
249
|
cleanup()
|
|
236
250
|
}
|
|
237
251
|
}
|
|
252
|
+
|
|
253
|
+
// MARK: - AVContentKeySessionDelegate (FairPlay DRM)
|
|
254
|
+
|
|
255
|
+
extension FullscreenVideoPlayer: AVContentKeySessionDelegate {
|
|
256
|
+
func contentKeySession(_ session: AVContentKeySession, didProvide keyRequest: AVContentKeyRequest) {
|
|
257
|
+
handleFairPlayKeyRequest(keyRequest)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
func contentKeySession(_ session: AVContentKeySession, didProvideRenewingContentKeyRequest keyRequest: AVContentKeyRequest) {
|
|
261
|
+
handleFairPlayKeyRequest(keyRequest)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private func handleFairPlayKeyRequest(_ keyRequest: AVContentKeyRequest) {
|
|
265
|
+
guard let certUrlString = fairplayCertificateUrl,
|
|
266
|
+
let certUrl = URL(string: certUrlString),
|
|
267
|
+
let spcUrlString = fairplayContentKeySpcUrl,
|
|
268
|
+
let spcUrl = URL(string: spcUrlString) else {
|
|
269
|
+
keyRequest.processContentKeyResponseError(
|
|
270
|
+
NSError(domain: "VideoPlayer", code: -1,
|
|
271
|
+
userInfo: [NSLocalizedDescriptionKey: "Invalid FairPlay DRM configuration"])
|
|
272
|
+
)
|
|
273
|
+
return
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 1. Fetch the FairPlay certificate
|
|
277
|
+
URLSession.shared.dataTask(with: certUrl) { certData, _, certError in
|
|
278
|
+
guard let certData = certData else {
|
|
279
|
+
keyRequest.processContentKeyResponseError(
|
|
280
|
+
certError ?? NSError(domain: "VideoPlayer", code: -2,
|
|
281
|
+
userInfo: [NSLocalizedDescriptionKey: "Failed to fetch FairPlay certificate"])
|
|
282
|
+
)
|
|
283
|
+
return
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// 2. Create SPC (Server Playback Context) using the certificate
|
|
287
|
+
// contentIdentifier is nil here; override if your license server requires
|
|
288
|
+
// a specific content ID extracted from the asset URL scheme
|
|
289
|
+
keyRequest.makeStreamingContentKeyRequestData(
|
|
290
|
+
forApp: certData,
|
|
291
|
+
contentIdentifier: nil,
|
|
292
|
+
options: [AVContentKeyRequestProtocolVersionsKey: [1]]
|
|
293
|
+
) { spcData, spcError in
|
|
294
|
+
guard let spcData = spcData else {
|
|
295
|
+
keyRequest.processContentKeyResponseError(
|
|
296
|
+
spcError ?? NSError(domain: "VideoPlayer", code: -4,
|
|
297
|
+
userInfo: [NSLocalizedDescriptionKey: "Failed to create FairPlay SPC"])
|
|
298
|
+
)
|
|
299
|
+
return
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// 3. Send SPC to the license server and receive the CKC
|
|
303
|
+
var spcRequest = URLRequest(url: spcUrl)
|
|
304
|
+
spcRequest.httpMethod = "POST"
|
|
305
|
+
spcRequest.httpBody = spcData
|
|
306
|
+
spcRequest.setValue("application/octet-stream", forHTTPHeaderField: "Content-Type")
|
|
307
|
+
|
|
308
|
+
URLSession.shared.dataTask(with: spcRequest) { ckcData, _, ckcError in
|
|
309
|
+
guard let ckcData = ckcData else {
|
|
310
|
+
keyRequest.processContentKeyResponseError(
|
|
311
|
+
ckcError ?? NSError(domain: "VideoPlayer", code: -3,
|
|
312
|
+
userInfo: [NSLocalizedDescriptionKey: "Failed to obtain FairPlay CKC"])
|
|
313
|
+
)
|
|
314
|
+
return
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// 4. Provide the CKC to AVFoundation to decrypt the content
|
|
318
|
+
let keyResponse = AVContentKeyResponse(fairPlayStreamingKeyResponseData: ckcData)
|
|
319
|
+
keyRequest.processContentKeyResponse(keyResponse)
|
|
320
|
+
}.resume()
|
|
321
|
+
}
|
|
322
|
+
}.resume()
|
|
323
|
+
}
|
|
324
|
+
}
|
|
@@ -8,7 +8,7 @@ import AVKit
|
|
|
8
8
|
*/
|
|
9
9
|
@objc(VideoPlayerPlugin)
|
|
10
10
|
public class VideoPlayerPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
11
|
-
private let pluginVersion: String = "8.
|
|
11
|
+
private let pluginVersion: String = "8.1.1"
|
|
12
12
|
public let identifier = "VideoPlayerPlugin"
|
|
13
13
|
public let jsName = "VideoPlayer"
|
|
14
14
|
public let pluginMethods: [CAPPluginMethod] = [
|
|
@@ -74,6 +74,12 @@ public class VideoPlayerPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
74
74
|
let pipEnabled = call.getBool("pipEnabled") ?? true
|
|
75
75
|
let showControls = call.getBool("showControls") ?? true
|
|
76
76
|
|
|
77
|
+
// Extract FairPlay DRM options if provided
|
|
78
|
+
let drm = call.getObject("drm")
|
|
79
|
+
let fairplay = drm?["fairplay"] as? [String: Any]
|
|
80
|
+
let fairplayCertificateUrl = fairplay?["certificateUrl"] as? String
|
|
81
|
+
let fairplayContentKeySpcUrl = fairplay?["contentKeySpcUrl"] as? String
|
|
82
|
+
|
|
77
83
|
// Create video player
|
|
78
84
|
let player = FullscreenVideoPlayer(
|
|
79
85
|
playerId: playerId,
|
|
@@ -82,7 +88,9 @@ public class VideoPlayerPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
82
88
|
exitOnEnd: exitOnEnd,
|
|
83
89
|
loopOnEnd: loopOnEnd,
|
|
84
90
|
pipEnabled: pipEnabled,
|
|
85
|
-
showControls: showControls
|
|
91
|
+
showControls: showControls,
|
|
92
|
+
fairplayCertificateUrl: fairplayCertificateUrl,
|
|
93
|
+
fairplayContentKeySpcUrl: fairplayContentKeySpcUrl
|
|
86
94
|
)
|
|
87
95
|
|
|
88
96
|
player.setupPlayer()
|