@plusscommunities/pluss-core-app 1.5.1 → 1.5.2
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.
|
@@ -8,7 +8,7 @@ import * as ScreenOrientation from 'expo-screen-orientation';
|
|
|
8
8
|
import { DeviceMotion } from 'expo-sensors';
|
|
9
9
|
import YoutubePlayer, { getYoutubeMeta } from 'react-native-youtube-iframe';
|
|
10
10
|
import { Vimeo } from 'react-native-vimeo-iframe';
|
|
11
|
-
import WebView from 'react-native-webview';
|
|
11
|
+
import { WebView } from 'react-native-webview';
|
|
12
12
|
import { Video } from 'expo-av';
|
|
13
13
|
import VideoPlayer from 'expo-video-player';
|
|
14
14
|
import { Spinner } from './Spinner';
|
|
@@ -273,13 +273,16 @@ class MediaPlayer extends Component {
|
|
|
273
273
|
time: '0m0s'
|
|
274
274
|
})));
|
|
275
275
|
|
|
276
|
-
_defineProperty(this, "getWebviewPlayer", embedUrl => /*#__PURE__*/React.createElement(WebView, {
|
|
276
|
+
_defineProperty(this, "getWebviewPlayer", (embedUrl, width, height) => /*#__PURE__*/React.createElement(WebView, {
|
|
277
277
|
startInLoadingState: true,
|
|
278
278
|
javaScriptEnabled: true,
|
|
279
279
|
scrollEnabled: false,
|
|
280
280
|
automaticallyAdjustContentInsets: false,
|
|
281
281
|
mediaPlaybackRequiresUserAction: true,
|
|
282
|
-
style: styles.webView,
|
|
282
|
+
style: [styles.webView, {
|
|
283
|
+
width,
|
|
284
|
+
height
|
|
285
|
+
}],
|
|
283
286
|
source: {
|
|
284
287
|
uri: embedUrl
|
|
285
288
|
}
|
|
@@ -375,25 +378,30 @@ class MediaPlayer extends Component {
|
|
|
375
378
|
if (!forceWebview) {
|
|
376
379
|
if (isYoutube) {
|
|
377
380
|
const youtubeId = this.getYoutubeVideoId(source);
|
|
378
|
-
embedUrl = youtubeId ? `https://www.youtube.com/embed/${youtubeId}` : source;
|
|
381
|
+
embedUrl = youtubeId ? `https://www.youtube.com/embed/${youtubeId}` : source; // console.log('getYoutubePlayer', youtubeId, width, height, autoPlay);
|
|
382
|
+
|
|
379
383
|
player = this.getYoutubePlayer(youtubeId, width, height, autoPlay);
|
|
380
384
|
} else if (isVimeo) {
|
|
381
385
|
const vimeoId = this.getVimeoId(source);
|
|
382
|
-
embedUrl = source;
|
|
386
|
+
embedUrl = source; // console.log('getVimeoPlayer', vimeoId, width, height, autoPlay);
|
|
387
|
+
|
|
383
388
|
player = this.getVimeoPlayer(vimeoId, width, height, autoPlay);
|
|
384
389
|
} else if (playbackId) {
|
|
385
|
-
embedUrl = this.getStreamPlaybackUrl();
|
|
390
|
+
embedUrl = this.getStreamPlaybackUrl(); // console.log('getStreamPlayer', embedUrl, width, height, autoPlay);
|
|
391
|
+
|
|
386
392
|
player = this.getStreamPlayer(embedUrl, width, height, autoPlay);
|
|
387
393
|
showLoading = true;
|
|
388
394
|
} else if (useVideoPlayer) {
|
|
389
|
-
embedUrl = source;
|
|
395
|
+
embedUrl = source; // console.log('getVideoPlayer', embedUrl, width, height, autoPlay);
|
|
396
|
+
|
|
390
397
|
player = this.getVideoPlayer(embedUrl, width, height, autoPlay);
|
|
391
398
|
}
|
|
392
399
|
}
|
|
393
400
|
|
|
394
401
|
if (!player && isUrlLink) {
|
|
395
402
|
embedUrl = source;
|
|
396
|
-
|
|
403
|
+
console.log('getWebviewPlayer', embedUrl, width, height);
|
|
404
|
+
player = this.getWebviewPlayer(embedUrl, width, height);
|
|
397
405
|
} // console.log({
|
|
398
406
|
// Streaming: embedUrl,
|
|
399
407
|
// Landscape: isLandscape,
|
|
@@ -403,6 +411,10 @@ class MediaPlayer extends Component {
|
|
|
403
411
|
// Width: width,
|
|
404
412
|
// Height: height,
|
|
405
413
|
// HeightFactor: heightFactor,
|
|
414
|
+
// isYoutube,
|
|
415
|
+
// isVimeo,
|
|
416
|
+
// playbackId,
|
|
417
|
+
// useVideoPlayer,
|
|
406
418
|
// });
|
|
407
419
|
|
|
408
420
|
|
|
@@ -419,6 +431,7 @@ class MediaPlayer extends Component {
|
|
|
419
431
|
|
|
420
432
|
const styles = StyleSheet.create({
|
|
421
433
|
container: {
|
|
434
|
+
flex: 1,
|
|
422
435
|
backgroundColor: '#000',
|
|
423
436
|
alignItems: 'center',
|
|
424
437
|
justifyContent: 'center'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["MediaPlayer.js"],"names":["React","Component","Platform","View","StyleSheet","Dimensions","ScreenOrientation","DeviceMotion","YoutubePlayer","getYoutubeMeta","Vimeo","WebView","Video","VideoPlayer","Spinner","SCREEN_HEIGHT","get","height","SCREEN_WIDTH","width","EXPO_VIDEO_PROPS","rate","isMuted","volume","RETRY_RECOVER","RETRY_LOADING","MediaPlayer","constructor","props","setupForPlaying","lockAsync","OS","OrientationLock","DEFAULT","ALL","motionAvailalble","isAvailableAsync","setUpdateInterval","addListener","onMotionChange","checkStreamLoaded","clearInterval","removeAllListeners","PORTRAIT_UP","url","replace","split","undefined","ids","result","match","source","useVideoPlayer","isUrlLink","startsWith","isYoutube","includes","isVimeo","heightFactor","metadata","getYoutubeVideoId","setState","playbackLoaded","readyToRender","playbackId","wait","force","retryLoading","console","log","setTimeout","playbackBuffering","state","videoPlayer","loadAsync","uri","getStreamPlaybackUrl","overrideFileExtensionAndroid","deviceRotation","beta","gamma","absGamma","Math","abs","absBeta","isGammaNegative","sign","changeEvent","rotation","deviceOrientation","orientation","isLandscape","orientationQueue","push","length","slice","every","i","orientationChanged","setInterval","checkReloadStream","status","isLoaded","isBuffering","isPlaying","error","playbackPlaying","shouldPlay","e","forceWebview","youtubeId","autoPlay","ref","youtubePlayer","onYoutubeReady","onYoutubeError","cc_lang_pref","showClosedCaptions","vimeoId","marginLeft","marginRight","embedUrl","styles","webView","vp","RESIZE_MODE_CONTAIN","onStreamLoadStart","onStreamLoaded","onStreamError","onStreamStatusUpdate","resizeMode","onVideoPlayError","onVideoPlayStatusUpdate","render","player","showLoading","getYoutubePlayer","getVimeoId","getVimeoPlayer","getStreamPlayer","getVideoPlayer","getWebviewPlayer","container","loadingContainer","create","backgroundColor","alignItems","justifyContent","flex","position","top","left","right","bottom"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { Platform, View, StyleSheet, Dimensions } from 'react-native';\nimport * as ScreenOrientation from 'expo-screen-orientation';\nimport { DeviceMotion } from 'expo-sensors';\nimport YoutubePlayer, { getYoutubeMeta } from 'react-native-youtube-iframe';\nimport { Vimeo } from 'react-native-vimeo-iframe';\nimport WebView from 'react-native-webview';\nimport { Video } from 'expo-av';\nimport VideoPlayer from 'expo-video-player';\nimport { Spinner } from './Spinner';\n\nconst SCREEN_HEIGHT = Dimensions.get('window').height;\nconst SCREEN_WIDTH = Dimensions.get('window').width;\nconst EXPO_VIDEO_PROPS = { rate: 1, isMuted: false, volume: 1 };\nconst RETRY_RECOVER = 30000;\nconst RETRY_LOADING = 10000;\n\nclass MediaPlayer extends Component {\n constructor(props) {\n super(props);\n this.state = {\n deviceOrientation: null,\n isLandscape: false,\n isUrlLink: true,\n isYoutube: false,\n isVimeo: false,\n forceWebview: false,\n heightFactor: 0,\n playbackLoaded: false,\n playbackBuffering: false,\n playbackPlaying: false,\n readyToRender: false,\n };\n this.youtubePlayer = null;\n this.videoPlayer = null;\n this.checkStreamLoaded = null;\n this.retryLoading = false;\n this.orientationQueue = [];\n }\n\n componentDidMount = async () => {\n await this.setupForPlaying();\n\n ScreenOrientation.lockAsync(Platform.OS === 'ios' ? ScreenOrientation.OrientationLock.DEFAULT : ScreenOrientation.OrientationLock.ALL);\n const motionAvailalble = await DeviceMotion.isAvailableAsync();\n // console.log('motionAvailalble', motionAvailalble);\n if (motionAvailalble) {\n DeviceMotion.setUpdateInterval(500);\n DeviceMotion.addListener(this.onMotionChange);\n }\n };\n\n componentWillUnmount = () => {\n if (this.checkStreamLoaded) clearInterval(this.checkStreamLoaded);\n DeviceMotion.removeAllListeners();\n ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP);\n };\n\n getYoutubeVideoId = url => {\n url = url.replace(/(>|<)/gi, '').split(/(vi\\/|v=|\\/v\\/|youtu\\.be\\/|\\/embed\\/)/);\n if (url[2] !== undefined) {\n const ids = url[2].split(/[^0-9a-z_\\-]/i);\n return ids[0];\n } else {\n return '';\n }\n };\n\n getVimeoId = url => {\n const result = url.match(\n /(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/(?:[^\\/]*)\\/videos\\/|album\\/(?:\\d+)\\/video\\/|video\\/|)(\\d+)(?:[a-zA-Z0-9_\\-]+)?/i,\n );\n return result[1];\n };\n\n setupForPlaying = async () => {\n // Extract live stream info\n const { source, useVideoPlayer } = this.props;\n const isUrlLink = source && source.startsWith('http');\n const isYoutube = source && (source.includes('youtube.com/watch?v=') || source.includes('youtu.be/'));\n const isVimeo = source && source.includes('vimeo.com/');\n let heightFactor = 0;\n\n if (isYoutube) {\n const metadata = await getYoutubeMeta(this.getYoutubeVideoId(source));\n heightFactor = metadata.height / metadata.width;\n } else if (useVideoPlayer) {\n heightFactor = 0;\n } else {\n heightFactor = 0.565;\n }\n\n this.setState({ isUrlLink, isYoutube, isVimeo, playbackLoaded: isYoutube || isVimeo, heightFactor, readyToRender: true });\n };\n\n getStreamPlaybackUrl = () => {\n // return 'https://stream.mux.com/Ym4nKktRpGuZNBBBlzhxpyRwZLpvMlPRchcu01x6Ur600.m3u8';\n return `https://stream.mux.com/${this.props.playbackId}.m3u8`;\n };\n\n checkReloadStream = (wait = RETRY_LOADING, force = false) => {\n if (!force && this.retryLoading) return;\n\n console.log(`Check loading in ${wait} milliseconds...`);\n this.retryLoading = true;\n setTimeout(async () => {\n const { playbackLoaded, playbackBuffering } = this.state;\n try {\n if (playbackLoaded === false || playbackBuffering === true) {\n console.log('Reloading started');\n await this.videoPlayer.loadAsync(\n { uri: this.getStreamPlaybackUrl(), overrideFileExtensionAndroid: 'm3u8' },\n EXPO_VIDEO_PROPS,\n false,\n );\n } else {\n console.log('Already loaded - not reloading');\n }\n this.retryLoading = false;\n } catch {}\n }, wait);\n };\n\n isLandscape = deviceRotation => {\n const { beta, gamma } = deviceRotation;\n const absGamma = Math.abs(gamma);\n const absBeta = Math.abs(beta);\n const isGammaNegative = Math.sign(gamma) === -1;\n\n if (absGamma <= 0.04 && absBeta <= 0.24) {\n //Portrait mode, on a flat surface.\n return false;\n } else if ((absGamma <= 1.0 || absGamma >= 2.3) && absBeta >= 0.5) {\n //General Portrait mode, accounting for forward and back tilt on the top of the phone.\n return false;\n } else {\n if (isGammaNegative) {\n //Landscape mode with the top of the phone to the left.\n return true;\n } else {\n //Landscape mode with the top of the phone to the right.\n return true;\n }\n }\n };\n\n onMotionChange = async changeEvent => {\n const deviceRotation = changeEvent.rotation;\n const deviceOrientation = changeEvent.orientation;\n const isLandscape = this.isLandscape(deviceRotation);\n this.orientationQueue.push(isLandscape);\n if (this.orientationQueue.length > 2) this.orientationQueue = this.orientationQueue.slice(-2);\n // console.log('onMotionChange - orientationQueue', this.orientationQueue);\n if (\n isLandscape !== this.state.isLandscape &&\n isLandscape === (Math.abs(deviceOrientation) === 90) &&\n this.orientationQueue.every(i => i === isLandscape)\n ) {\n this.setState({ isLandscape }, () => {\n // console.log('isLandscape', this.state.isLandscape);\n if (this.props.orientationChanged) this.props.orientationChanged(this.state.isLandscape);\n });\n }\n };\n\n onStreamLoadStart = () => {\n console.log('Stream load started');\n this.checkStreamLoaded = setInterval(() => {\n const { playbackLoaded } = this.state;\n if (playbackLoaded === false) {\n console.log('Stream loading failed unexpectedly');\n this.checkReloadStream(1000, true);\n } else {\n clearInterval(this.checkStreamLoaded);\n }\n }, RETRY_RECOVER);\n };\n\n onStreamLoaded = status => {\n console.log(`Stream loaded - isLoaded:${status.isLoaded}, isBuffering:${status.isBuffering}, isPlaying:${status.isPlaying}`);\n };\n\n onStreamError = error => {\n console.log('Stream error', error);\n };\n\n onStreamStatusUpdate = status => {\n this.setState(\n {\n playbackLoaded: status.isLoaded,\n playbackBuffering: status.isBuffering,\n playbackPlaying: status.isPlaying,\n },\n () => {\n const { playbackLoaded, playbackBuffering, playbackPlaying, shouldPlay } = this.state;\n // console.log(`Status updated - isLoaded:${playbackLoaded}, isBuffering:${playbackBuffering}, isPlaying:${playbackPlaying}`);\n if (playbackLoaded === false && playbackBuffering === undefined && playbackPlaying === undefined) {\n this.checkReloadStream();\n } else if (playbackLoaded === true && playbackBuffering === true) {\n this.checkReloadStream(RETRY_RECOVER);\n }\n },\n );\n };\n\n onYoutubeError = e => {\n // console.log('onYoutubeError', e);\n this.setState({ forceWebview: true });\n };\n\n onYoutubeReady = () => {\n // console.log('onYoutubeReady');\n };\n\n onVideoPlayStatusUpdate = status => {\n // console.log('onVideoPlayStatusUpdate', status);\n };\n\n onVideoPlayError = error => {\n // console.log('onVideoPlayError', error);\n this.setState({ forceWebview: true });\n };\n\n getYoutubePlayer = (youtubeId, width, height, autoPlay) => (\n <YoutubePlayer\n ref={ref => (this.youtubePlayer = ref)}\n height={height}\n width={width}\n videoId={youtubeId}\n play={autoPlay}\n // onChangeState={event => console.log('onChangeState', event)}\n onReady={this.onYoutubeReady}\n onError={this.onYoutubeError}\n // onPlaybackQualityChange={q => console.log('onPlaybackQualityChange', q)}\n volume={50}\n playbackRate={1}\n playerParams={{\n cc_lang_pref: 'us',\n showClosedCaptions: true,\n }}\n />\n );\n\n getVimeoPlayer = (vimeoId, width, height, autoPlay) => (\n <View style={{ width, height }}>\n <Vimeo\n style={{ marginLeft: -8, marginRight: -5 }}\n videoId={vimeoId}\n // onReady={() => console.log('Video is ready')}\n // onPlay={() => console.log('Video is playing')}\n // onPlayProgress={data => console.log('Video progress data:', data)}\n // onFinish={() => console.log('Video is finished')}\n loop={false}\n autoPlay={autoPlay}\n controls={true}\n speed={true}\n time={'0m0s'}\n />\n </View>\n );\n\n getWebviewPlayer = embedUrl => (\n <WebView\n startInLoadingState\n javaScriptEnabled\n scrollEnabled={false}\n automaticallyAdjustContentInsets={false}\n mediaPlaybackRequiresUserAction\n style={styles.webView}\n source={{ uri: embedUrl }}\n />\n );\n\n getStreamPlayer = (embedUrl, width, height, autoPlay) => (\n <Video\n ref={vp => {\n this.videoPlayer = vp;\n }}\n source={{ uri: embedUrl }}\n {...EXPO_VIDEO_PROPS}\n shouldPlay={autoPlay}\n resizeMode={Video.RESIZE_MODE_CONTAIN}\n useNativeControls\n style={{ width, height }}\n onLoadStart={this.onStreamLoadStart}\n onLoad={this.onStreamLoaded}\n onError={this.onStreamError}\n onPlaybackStatusUpdate={this.onStreamStatusUpdate}\n />\n );\n\n getVideoPlayer = (embedUrl, width, height, autoPlay) => (\n <VideoPlayer\n videoProps={{\n shouldPlay: autoPlay,\n resizeMode: Video.RESIZE_MODE_CONTAIN,\n source: { uri: embedUrl },\n }}\n showFullscreenButton={false}\n errorCallback={this.onVideoPlayError}\n playbackCallback={this.onVideoPlayStatusUpdate}\n height={height}\n width={width}\n />\n );\n\n render() {\n let width, height;\n const { playbackId, source, autoPlay, useVideoPlayer } = this.props;\n const {\n readyToRender,\n isLandscape,\n heightFactor,\n isUrlLink,\n isYoutube,\n isVimeo,\n forceWebview,\n playbackLoaded,\n playbackBuffering,\n } = this.state;\n if (!readyToRender) return null;\n\n if (isLandscape) {\n width = SCREEN_HEIGHT;\n height = SCREEN_WIDTH;\n } else {\n width = SCREEN_WIDTH;\n height = heightFactor ? SCREEN_WIDTH * heightFactor : SCREEN_HEIGHT;\n }\n\n let embedUrl, player, showLoading;\n if (!forceWebview) {\n if (isYoutube) {\n const youtubeId = this.getYoutubeVideoId(source);\n embedUrl = youtubeId ? `https://www.youtube.com/embed/${youtubeId}` : source;\n player = this.getYoutubePlayer(youtubeId, width, height, autoPlay);\n } else if (isVimeo) {\n const vimeoId = this.getVimeoId(source);\n embedUrl = source;\n player = this.getVimeoPlayer(vimeoId, width, height, autoPlay);\n } else if (playbackId) {\n embedUrl = this.getStreamPlaybackUrl();\n player = this.getStreamPlayer(embedUrl, width, height, autoPlay);\n showLoading = true;\n } else if (useVideoPlayer) {\n embedUrl = source;\n player = this.getVideoPlayer(embedUrl, width, height, autoPlay);\n }\n }\n if (!player && isUrlLink) {\n embedUrl = source;\n player = this.getWebviewPlayer(embedUrl);\n }\n\n // console.log({\n // Streaming: embedUrl,\n // Landscape: isLandscape,\n // Loaded: playbackLoaded,\n // Buffering: playbackBuffering,\n // LoadingIndicator: showLoading,\n // Width: width,\n // Height: height,\n // HeightFactor: heightFactor,\n // });\n return (\n <View style={styles.container}>\n {player}\n {showLoading && (!playbackLoaded || playbackBuffering) && (\n <View style={styles.loadingContainer}>\n <Spinner color={'#fff'} />\n </View>\n )}\n </View>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: '#000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n webView: {\n flex: 1,\n },\n loadingContainer: {\n position: 'absolute',\n top: 50,\n left: 0,\n right: 0,\n bottom: 50,\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n\nexport default MediaPlayer;\n"]}
|
|
1
|
+
{"version":3,"sources":["MediaPlayer.js"],"names":["React","Component","Platform","View","StyleSheet","Dimensions","ScreenOrientation","DeviceMotion","YoutubePlayer","getYoutubeMeta","Vimeo","WebView","Video","VideoPlayer","Spinner","SCREEN_HEIGHT","get","height","SCREEN_WIDTH","width","EXPO_VIDEO_PROPS","rate","isMuted","volume","RETRY_RECOVER","RETRY_LOADING","MediaPlayer","constructor","props","setupForPlaying","lockAsync","OS","OrientationLock","DEFAULT","ALL","motionAvailalble","isAvailableAsync","setUpdateInterval","addListener","onMotionChange","checkStreamLoaded","clearInterval","removeAllListeners","PORTRAIT_UP","url","replace","split","undefined","ids","result","match","source","useVideoPlayer","isUrlLink","startsWith","isYoutube","includes","isVimeo","heightFactor","metadata","getYoutubeVideoId","setState","playbackLoaded","readyToRender","playbackId","wait","force","retryLoading","console","log","setTimeout","playbackBuffering","state","videoPlayer","loadAsync","uri","getStreamPlaybackUrl","overrideFileExtensionAndroid","deviceRotation","beta","gamma","absGamma","Math","abs","absBeta","isGammaNegative","sign","changeEvent","rotation","deviceOrientation","orientation","isLandscape","orientationQueue","push","length","slice","every","i","orientationChanged","setInterval","checkReloadStream","status","isLoaded","isBuffering","isPlaying","error","playbackPlaying","shouldPlay","e","forceWebview","youtubeId","autoPlay","ref","youtubePlayer","onYoutubeReady","onYoutubeError","cc_lang_pref","showClosedCaptions","vimeoId","marginLeft","marginRight","embedUrl","styles","webView","vp","RESIZE_MODE_CONTAIN","onStreamLoadStart","onStreamLoaded","onStreamError","onStreamStatusUpdate","resizeMode","onVideoPlayError","onVideoPlayStatusUpdate","render","player","showLoading","getYoutubePlayer","getVimeoId","getVimeoPlayer","getStreamPlayer","getVideoPlayer","getWebviewPlayer","container","loadingContainer","create","flex","backgroundColor","alignItems","justifyContent","position","top","left","right","bottom"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { Platform, View, StyleSheet, Dimensions } from 'react-native';\nimport * as ScreenOrientation from 'expo-screen-orientation';\nimport { DeviceMotion } from 'expo-sensors';\nimport YoutubePlayer, { getYoutubeMeta } from 'react-native-youtube-iframe';\nimport { Vimeo } from 'react-native-vimeo-iframe';\nimport { WebView } from 'react-native-webview';\nimport { Video } from 'expo-av';\nimport VideoPlayer from 'expo-video-player';\nimport { Spinner } from './Spinner';\n\nconst SCREEN_HEIGHT = Dimensions.get('window').height;\nconst SCREEN_WIDTH = Dimensions.get('window').width;\nconst EXPO_VIDEO_PROPS = { rate: 1, isMuted: false, volume: 1 };\nconst RETRY_RECOVER = 30000;\nconst RETRY_LOADING = 10000;\n\nclass MediaPlayer extends Component {\n constructor(props) {\n super(props);\n this.state = {\n deviceOrientation: null,\n isLandscape: false,\n isUrlLink: true,\n isYoutube: false,\n isVimeo: false,\n forceWebview: false,\n heightFactor: 0,\n playbackLoaded: false,\n playbackBuffering: false,\n playbackPlaying: false,\n readyToRender: false,\n };\n this.youtubePlayer = null;\n this.videoPlayer = null;\n this.checkStreamLoaded = null;\n this.retryLoading = false;\n this.orientationQueue = [];\n }\n\n componentDidMount = async () => {\n await this.setupForPlaying();\n\n ScreenOrientation.lockAsync(Platform.OS === 'ios' ? ScreenOrientation.OrientationLock.DEFAULT : ScreenOrientation.OrientationLock.ALL);\n const motionAvailalble = await DeviceMotion.isAvailableAsync();\n // console.log('motionAvailalble', motionAvailalble);\n if (motionAvailalble) {\n DeviceMotion.setUpdateInterval(500);\n DeviceMotion.addListener(this.onMotionChange);\n }\n };\n\n componentWillUnmount = () => {\n if (this.checkStreamLoaded) clearInterval(this.checkStreamLoaded);\n DeviceMotion.removeAllListeners();\n ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP);\n };\n\n getYoutubeVideoId = url => {\n url = url.replace(/(>|<)/gi, '').split(/(vi\\/|v=|\\/v\\/|youtu\\.be\\/|\\/embed\\/)/);\n if (url[2] !== undefined) {\n const ids = url[2].split(/[^0-9a-z_\\-]/i);\n return ids[0];\n } else {\n return '';\n }\n };\n\n getVimeoId = url => {\n const result = url.match(\n /(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/(?:[^\\/]*)\\/videos\\/|album\\/(?:\\d+)\\/video\\/|video\\/|)(\\d+)(?:[a-zA-Z0-9_\\-]+)?/i,\n );\n return result[1];\n };\n\n setupForPlaying = async () => {\n // Extract live stream info\n const { source, useVideoPlayer } = this.props;\n const isUrlLink = source && source.startsWith('http');\n const isYoutube = source && (source.includes('youtube.com/watch?v=') || source.includes('youtu.be/'));\n const isVimeo = source && source.includes('vimeo.com/');\n let heightFactor = 0;\n\n if (isYoutube) {\n const metadata = await getYoutubeMeta(this.getYoutubeVideoId(source));\n heightFactor = metadata.height / metadata.width;\n } else if (useVideoPlayer) {\n heightFactor = 0;\n } else {\n heightFactor = 0.565;\n }\n\n this.setState({ isUrlLink, isYoutube, isVimeo, playbackLoaded: isYoutube || isVimeo, heightFactor, readyToRender: true });\n };\n\n getStreamPlaybackUrl = () => {\n // return 'https://stream.mux.com/Ym4nKktRpGuZNBBBlzhxpyRwZLpvMlPRchcu01x6Ur600.m3u8';\n return `https://stream.mux.com/${this.props.playbackId}.m3u8`;\n };\n\n checkReloadStream = (wait = RETRY_LOADING, force = false) => {\n if (!force && this.retryLoading) return;\n\n console.log(`Check loading in ${wait} milliseconds...`);\n this.retryLoading = true;\n setTimeout(async () => {\n const { playbackLoaded, playbackBuffering } = this.state;\n try {\n if (playbackLoaded === false || playbackBuffering === true) {\n console.log('Reloading started');\n await this.videoPlayer.loadAsync(\n { uri: this.getStreamPlaybackUrl(), overrideFileExtensionAndroid: 'm3u8' },\n EXPO_VIDEO_PROPS,\n false,\n );\n } else {\n console.log('Already loaded - not reloading');\n }\n this.retryLoading = false;\n } catch {}\n }, wait);\n };\n\n isLandscape = deviceRotation => {\n const { beta, gamma } = deviceRotation;\n const absGamma = Math.abs(gamma);\n const absBeta = Math.abs(beta);\n const isGammaNegative = Math.sign(gamma) === -1;\n\n if (absGamma <= 0.04 && absBeta <= 0.24) {\n //Portrait mode, on a flat surface.\n return false;\n } else if ((absGamma <= 1.0 || absGamma >= 2.3) && absBeta >= 0.5) {\n //General Portrait mode, accounting for forward and back tilt on the top of the phone.\n return false;\n } else {\n if (isGammaNegative) {\n //Landscape mode with the top of the phone to the left.\n return true;\n } else {\n //Landscape mode with the top of the phone to the right.\n return true;\n }\n }\n };\n\n onMotionChange = async changeEvent => {\n const deviceRotation = changeEvent.rotation;\n const deviceOrientation = changeEvent.orientation;\n const isLandscape = this.isLandscape(deviceRotation);\n this.orientationQueue.push(isLandscape);\n if (this.orientationQueue.length > 2) this.orientationQueue = this.orientationQueue.slice(-2);\n // console.log('onMotionChange - orientationQueue', this.orientationQueue);\n if (\n isLandscape !== this.state.isLandscape &&\n isLandscape === (Math.abs(deviceOrientation) === 90) &&\n this.orientationQueue.every(i => i === isLandscape)\n ) {\n this.setState({ isLandscape }, () => {\n // console.log('isLandscape', this.state.isLandscape);\n if (this.props.orientationChanged) this.props.orientationChanged(this.state.isLandscape);\n });\n }\n };\n\n onStreamLoadStart = () => {\n console.log('Stream load started');\n this.checkStreamLoaded = setInterval(() => {\n const { playbackLoaded } = this.state;\n if (playbackLoaded === false) {\n console.log('Stream loading failed unexpectedly');\n this.checkReloadStream(1000, true);\n } else {\n clearInterval(this.checkStreamLoaded);\n }\n }, RETRY_RECOVER);\n };\n\n onStreamLoaded = status => {\n console.log(`Stream loaded - isLoaded:${status.isLoaded}, isBuffering:${status.isBuffering}, isPlaying:${status.isPlaying}`);\n };\n\n onStreamError = error => {\n console.log('Stream error', error);\n };\n\n onStreamStatusUpdate = status => {\n this.setState(\n {\n playbackLoaded: status.isLoaded,\n playbackBuffering: status.isBuffering,\n playbackPlaying: status.isPlaying,\n },\n () => {\n const { playbackLoaded, playbackBuffering, playbackPlaying, shouldPlay } = this.state;\n // console.log(`Status updated - isLoaded:${playbackLoaded}, isBuffering:${playbackBuffering}, isPlaying:${playbackPlaying}`);\n if (playbackLoaded === false && playbackBuffering === undefined && playbackPlaying === undefined) {\n this.checkReloadStream();\n } else if (playbackLoaded === true && playbackBuffering === true) {\n this.checkReloadStream(RETRY_RECOVER);\n }\n },\n );\n };\n\n onYoutubeError = e => {\n // console.log('onYoutubeError', e);\n this.setState({ forceWebview: true });\n };\n\n onYoutubeReady = () => {\n // console.log('onYoutubeReady');\n };\n\n onVideoPlayStatusUpdate = status => {\n // console.log('onVideoPlayStatusUpdate', status);\n };\n\n onVideoPlayError = error => {\n // console.log('onVideoPlayError', error);\n this.setState({ forceWebview: true });\n };\n\n getYoutubePlayer = (youtubeId, width, height, autoPlay) => (\n <YoutubePlayer\n ref={ref => (this.youtubePlayer = ref)}\n height={height}\n width={width}\n videoId={youtubeId}\n play={autoPlay}\n // onChangeState={event => console.log('onChangeState', event)}\n onReady={this.onYoutubeReady}\n onError={this.onYoutubeError}\n // onPlaybackQualityChange={q => console.log('onPlaybackQualityChange', q)}\n volume={50}\n playbackRate={1}\n playerParams={{\n cc_lang_pref: 'us',\n showClosedCaptions: true,\n }}\n />\n );\n\n getVimeoPlayer = (vimeoId, width, height, autoPlay) => (\n <View style={{ width, height }}>\n <Vimeo\n style={{ marginLeft: -8, marginRight: -5 }}\n videoId={vimeoId}\n // onReady={() => console.log('Video is ready')}\n // onPlay={() => console.log('Video is playing')}\n // onPlayProgress={data => console.log('Video progress data:', data)}\n // onFinish={() => console.log('Video is finished')}\n loop={false}\n autoPlay={autoPlay}\n controls={true}\n speed={true}\n time={'0m0s'}\n />\n </View>\n );\n\n getWebviewPlayer = (embedUrl, width, height) => (\n <WebView\n startInLoadingState\n javaScriptEnabled\n scrollEnabled={false}\n automaticallyAdjustContentInsets={false}\n mediaPlaybackRequiresUserAction\n style={[styles.webView, { width, height }]}\n source={{ uri: embedUrl }}\n />\n );\n\n getStreamPlayer = (embedUrl, width, height, autoPlay) => (\n <Video\n ref={vp => {\n this.videoPlayer = vp;\n }}\n source={{ uri: embedUrl }}\n {...EXPO_VIDEO_PROPS}\n shouldPlay={autoPlay}\n resizeMode={Video.RESIZE_MODE_CONTAIN}\n useNativeControls\n style={{ width, height }}\n onLoadStart={this.onStreamLoadStart}\n onLoad={this.onStreamLoaded}\n onError={this.onStreamError}\n onPlaybackStatusUpdate={this.onStreamStatusUpdate}\n />\n );\n\n getVideoPlayer = (embedUrl, width, height, autoPlay) => (\n <VideoPlayer\n videoProps={{\n shouldPlay: autoPlay,\n resizeMode: Video.RESIZE_MODE_CONTAIN,\n source: { uri: embedUrl },\n }}\n showFullscreenButton={false}\n errorCallback={this.onVideoPlayError}\n playbackCallback={this.onVideoPlayStatusUpdate}\n height={height}\n width={width}\n />\n );\n\n render() {\n let width, height;\n const { playbackId, source, autoPlay, useVideoPlayer } = this.props;\n const {\n readyToRender,\n isLandscape,\n heightFactor,\n isUrlLink,\n isYoutube,\n isVimeo,\n forceWebview,\n playbackLoaded,\n playbackBuffering,\n } = this.state;\n if (!readyToRender) return null;\n\n if (isLandscape) {\n width = SCREEN_HEIGHT;\n height = SCREEN_WIDTH;\n } else {\n width = SCREEN_WIDTH;\n height = heightFactor ? SCREEN_WIDTH * heightFactor : SCREEN_HEIGHT;\n }\n\n let embedUrl, player, showLoading;\n if (!forceWebview) {\n if (isYoutube) {\n const youtubeId = this.getYoutubeVideoId(source);\n embedUrl = youtubeId ? `https://www.youtube.com/embed/${youtubeId}` : source;\n // console.log('getYoutubePlayer', youtubeId, width, height, autoPlay);\n player = this.getYoutubePlayer(youtubeId, width, height, autoPlay);\n } else if (isVimeo) {\n const vimeoId = this.getVimeoId(source);\n embedUrl = source;\n // console.log('getVimeoPlayer', vimeoId, width, height, autoPlay);\n player = this.getVimeoPlayer(vimeoId, width, height, autoPlay);\n } else if (playbackId) {\n embedUrl = this.getStreamPlaybackUrl();\n // console.log('getStreamPlayer', embedUrl, width, height, autoPlay);\n player = this.getStreamPlayer(embedUrl, width, height, autoPlay);\n showLoading = true;\n } else if (useVideoPlayer) {\n embedUrl = source;\n // console.log('getVideoPlayer', embedUrl, width, height, autoPlay);\n player = this.getVideoPlayer(embedUrl, width, height, autoPlay);\n }\n }\n if (!player && isUrlLink) {\n embedUrl = source;\n console.log('getWebviewPlayer', embedUrl, width, height);\n player = this.getWebviewPlayer(embedUrl, width, height);\n }\n\n // console.log({\n // Streaming: embedUrl,\n // Landscape: isLandscape,\n // Loaded: playbackLoaded,\n // Buffering: playbackBuffering,\n // LoadingIndicator: showLoading,\n // Width: width,\n // Height: height,\n // HeightFactor: heightFactor,\n // isYoutube,\n // isVimeo,\n // playbackId,\n // useVideoPlayer,\n // });\n return (\n <View style={styles.container}>\n {player}\n {showLoading && (!playbackLoaded || playbackBuffering) && (\n <View style={styles.loadingContainer}>\n <Spinner color={'#fff'} />\n </View>\n )}\n </View>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n webView: {\n flex: 1,\n },\n loadingContainer: {\n position: 'absolute',\n top: 50,\n left: 0,\n right: 0,\n bottom: 50,\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n\nexport default MediaPlayer;\n"]}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ import * as ScreenOrientation from 'expo-screen-orientation';
|
|
|
4
4
|
import { DeviceMotion } from 'expo-sensors';
|
|
5
5
|
import YoutubePlayer, { getYoutubeMeta } from 'react-native-youtube-iframe';
|
|
6
6
|
import { Vimeo } from 'react-native-vimeo-iframe';
|
|
7
|
-
import WebView from 'react-native-webview';
|
|
7
|
+
import { WebView } from 'react-native-webview';
|
|
8
8
|
import { Video } from 'expo-av';
|
|
9
9
|
import VideoPlayer from 'expo-video-player';
|
|
10
10
|
import { Spinner } from './Spinner';
|
|
@@ -259,14 +259,14 @@ class MediaPlayer extends Component {
|
|
|
259
259
|
</View>
|
|
260
260
|
);
|
|
261
261
|
|
|
262
|
-
getWebviewPlayer = embedUrl => (
|
|
262
|
+
getWebviewPlayer = (embedUrl, width, height) => (
|
|
263
263
|
<WebView
|
|
264
264
|
startInLoadingState
|
|
265
265
|
javaScriptEnabled
|
|
266
266
|
scrollEnabled={false}
|
|
267
267
|
automaticallyAdjustContentInsets={false}
|
|
268
268
|
mediaPlaybackRequiresUserAction
|
|
269
|
-
style={styles.webView}
|
|
269
|
+
style={[styles.webView, { width, height }]}
|
|
270
270
|
source={{ uri: embedUrl }}
|
|
271
271
|
/>
|
|
272
272
|
);
|
|
@@ -333,23 +333,28 @@ class MediaPlayer extends Component {
|
|
|
333
333
|
if (isYoutube) {
|
|
334
334
|
const youtubeId = this.getYoutubeVideoId(source);
|
|
335
335
|
embedUrl = youtubeId ? `https://www.youtube.com/embed/${youtubeId}` : source;
|
|
336
|
+
// console.log('getYoutubePlayer', youtubeId, width, height, autoPlay);
|
|
336
337
|
player = this.getYoutubePlayer(youtubeId, width, height, autoPlay);
|
|
337
338
|
} else if (isVimeo) {
|
|
338
339
|
const vimeoId = this.getVimeoId(source);
|
|
339
340
|
embedUrl = source;
|
|
341
|
+
// console.log('getVimeoPlayer', vimeoId, width, height, autoPlay);
|
|
340
342
|
player = this.getVimeoPlayer(vimeoId, width, height, autoPlay);
|
|
341
343
|
} else if (playbackId) {
|
|
342
344
|
embedUrl = this.getStreamPlaybackUrl();
|
|
345
|
+
// console.log('getStreamPlayer', embedUrl, width, height, autoPlay);
|
|
343
346
|
player = this.getStreamPlayer(embedUrl, width, height, autoPlay);
|
|
344
347
|
showLoading = true;
|
|
345
348
|
} else if (useVideoPlayer) {
|
|
346
349
|
embedUrl = source;
|
|
350
|
+
// console.log('getVideoPlayer', embedUrl, width, height, autoPlay);
|
|
347
351
|
player = this.getVideoPlayer(embedUrl, width, height, autoPlay);
|
|
348
352
|
}
|
|
349
353
|
}
|
|
350
354
|
if (!player && isUrlLink) {
|
|
351
355
|
embedUrl = source;
|
|
352
|
-
|
|
356
|
+
console.log('getWebviewPlayer', embedUrl, width, height);
|
|
357
|
+
player = this.getWebviewPlayer(embedUrl, width, height);
|
|
353
358
|
}
|
|
354
359
|
|
|
355
360
|
// console.log({
|
|
@@ -361,6 +366,10 @@ class MediaPlayer extends Component {
|
|
|
361
366
|
// Width: width,
|
|
362
367
|
// Height: height,
|
|
363
368
|
// HeightFactor: heightFactor,
|
|
369
|
+
// isYoutube,
|
|
370
|
+
// isVimeo,
|
|
371
|
+
// playbackId,
|
|
372
|
+
// useVideoPlayer,
|
|
364
373
|
// });
|
|
365
374
|
return (
|
|
366
375
|
<View style={styles.container}>
|
|
@@ -377,6 +386,7 @@ class MediaPlayer extends Component {
|
|
|
377
386
|
|
|
378
387
|
const styles = StyleSheet.create({
|
|
379
388
|
container: {
|
|
389
|
+
flex: 1,
|
|
380
390
|
backgroundColor: '#000',
|
|
381
391
|
alignItems: 'center',
|
|
382
392
|
justifyContent: 'center',
|