amazon-ivs-react-native-player 1.3.0 → 1.4.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/amazon-ivs-react-native-player.podspec +2 -2
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/amazonaws/ivs/reactnative/player/AmazonIvsView.kt +21 -10
- package/android/src/main/java/com/amazonaws/ivs/reactnative/player/AmazonIvsViewManager.kt +16 -2
- package/ios/.gitignore +1 -0
- package/ios/AmazonIvsManager.m +2 -0
- package/ios/AmazonIvsManager.swift +7 -0
- package/ios/AmazonIvsView.swift +12 -0
- package/lib/commonjs/IVSPlayer.js +10 -5
- package/lib/commonjs/IVSPlayer.js.flow +1 -0
- package/lib/commonjs/IVSPlayer.js.map +1 -1
- package/lib/commonjs/types.js.flow +1 -0
- package/lib/module/IVSPlayer.js +11 -6
- package/lib/module/IVSPlayer.js.flow +1 -0
- package/lib/module/IVSPlayer.js.map +1 -1
- package/lib/module/types.js.flow +1 -0
- package/lib/typescript/IVSPlayer.d.ts +1 -0
- package/lib/typescript/types.d.ts +1 -0
- package/package.json +32 -15
- package/src/IVSPlayer.js.flow +1 -0
- package/src/IVSPlayer.tsx +19 -5
- package/src/__tests__/index.test.tsx +13 -1
- package/src/types.js.flow +1 -0
- package/src/types.ts +1 -0
|
@@ -19,7 +19,7 @@ Pod::Spec.new do |s|
|
|
|
19
19
|
s.license = package["license"]
|
|
20
20
|
s.authors = package["author"]
|
|
21
21
|
|
|
22
|
-
s.platforms = { :ios => "
|
|
22
|
+
s.platforms = { :ios => "12.4" }
|
|
23
23
|
s.source = { :git => "https://github.com/aws/amazon-ivs-react-native-player.git", :tag => "#{s.version}" }
|
|
24
24
|
|
|
25
25
|
|
|
@@ -27,5 +27,5 @@ Pod::Spec.new do |s|
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
s.dependency "React-Core"
|
|
30
|
-
s.dependency "AmazonIVSPlayer", "~> 1.
|
|
30
|
+
s.dependency "AmazonIVSPlayer", "~> 1.18.0"
|
|
31
31
|
end
|
|
@@ -93,7 +93,7 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
override fun onError(e: PlayerException) {
|
|
96
|
-
onError(e.
|
|
96
|
+
onError(e.getErrorMessage())
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
@@ -130,6 +130,10 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
130
130
|
player?.isMuted = muted
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
fun setLooping(shouldLoop: Boolean) {
|
|
134
|
+
player?.setLooping(shouldLoop)
|
|
135
|
+
}
|
|
136
|
+
|
|
133
137
|
fun setVolume(volume: Double) {
|
|
134
138
|
player?.setVolume(volume.toFloat())
|
|
135
139
|
}
|
|
@@ -257,19 +261,21 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
257
261
|
fun onSeek(position: Long) {
|
|
258
262
|
val reactContext = context as ReactContext
|
|
259
263
|
val data = Arguments.createMap()
|
|
260
|
-
data.
|
|
261
|
-
|
|
264
|
+
data.putDouble("position", convertMilliSecondsToSeconds(position))
|
|
262
265
|
reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.SEEK.toString(), data)
|
|
263
266
|
}
|
|
264
267
|
|
|
265
268
|
fun onProgress(position: Long) {
|
|
266
269
|
val reactContext = context as ReactContext
|
|
267
270
|
val data = Arguments.createMap()
|
|
268
|
-
data.
|
|
269
|
-
|
|
271
|
+
data.putDouble("position", convertMilliSecondsToSeconds(position))
|
|
270
272
|
reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.PROGRESS.toString(), data)
|
|
271
273
|
}
|
|
272
274
|
|
|
275
|
+
private fun convertMilliSecondsToSeconds (milliSeconds: Long): Double {
|
|
276
|
+
return milliSeconds / 1000.0
|
|
277
|
+
}
|
|
278
|
+
|
|
273
279
|
private val mLayoutRunnable = Runnable {
|
|
274
280
|
measure(
|
|
275
281
|
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
|
@@ -285,8 +291,13 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
285
291
|
player?.pause()
|
|
286
292
|
}
|
|
287
293
|
|
|
288
|
-
fun seekTo(position:
|
|
289
|
-
|
|
294
|
+
fun seekTo(position: Double) {
|
|
295
|
+
val milliseconds = (position * 1000.0).toLong()
|
|
296
|
+
player?.seekTo(milliseconds)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
fun setOrigin(origin: String) {
|
|
300
|
+
player?.setOrigin(origin)
|
|
290
301
|
}
|
|
291
302
|
|
|
292
303
|
|
|
@@ -326,7 +337,8 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
326
337
|
data.putMap("playerData", playerData)
|
|
327
338
|
|
|
328
339
|
reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, Events.DATA.toString(), data)
|
|
329
|
-
}
|
|
340
|
+
}
|
|
341
|
+
else -> {}
|
|
330
342
|
}
|
|
331
343
|
|
|
332
344
|
val onStateChangeData = Arguments.createMap()
|
|
@@ -404,8 +416,7 @@ class AmazonIvsView(private val context: ThemedReactContext) : FrameLayout(conte
|
|
|
404
416
|
}
|
|
405
417
|
|
|
406
418
|
private fun getDuration(duration: Long): Double {
|
|
407
|
-
|
|
408
|
-
return durationInSeconds.toDouble()
|
|
419
|
+
return convertMilliSecondsToSeconds(duration)
|
|
409
420
|
}
|
|
410
421
|
|
|
411
422
|
private fun mapPlayerState(state: Player.State): String {
|
|
@@ -12,6 +12,7 @@ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
|
|
|
12
12
|
PLAY,
|
|
13
13
|
PAUSE,
|
|
14
14
|
SEEK_TO,
|
|
15
|
+
SET_ORIGIN,
|
|
15
16
|
TOGGLE_PIP
|
|
16
17
|
}
|
|
17
18
|
|
|
@@ -31,6 +32,8 @@ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
|
|
|
31
32
|
Commands.PLAY.ordinal,
|
|
32
33
|
"pause",
|
|
33
34
|
Commands.PAUSE.ordinal,
|
|
35
|
+
"setOrigin",
|
|
36
|
+
Commands.SET_ORIGIN.ordinal,
|
|
34
37
|
"seekTo",
|
|
35
38
|
Commands.SEEK_TO.ordinal,
|
|
36
39
|
"togglePip",
|
|
@@ -43,9 +46,15 @@ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
|
|
|
43
46
|
Commands.PLAY.ordinal -> view.play()
|
|
44
47
|
Commands.PAUSE.ordinal -> view.pause()
|
|
45
48
|
Commands.TOGGLE_PIP.ordinal -> view.togglePip()
|
|
49
|
+
Commands.SET_ORIGIN.ordinal -> {
|
|
50
|
+
args?.getString(0)?.let {
|
|
51
|
+
origin ->
|
|
52
|
+
view.setOrigin(origin)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
46
55
|
Commands.SEEK_TO.ordinal -> {
|
|
47
|
-
args?.
|
|
48
|
-
view.seekTo(position
|
|
56
|
+
args?.getDouble(0)?.let { position ->
|
|
57
|
+
view.seekTo(position)
|
|
49
58
|
}
|
|
50
59
|
}
|
|
51
60
|
else -> {
|
|
@@ -58,6 +67,11 @@ class AmazonIvsViewManager : SimpleViewManager<AmazonIvsView>() {
|
|
|
58
67
|
view.setStreamUrl(streamUrl);
|
|
59
68
|
}
|
|
60
69
|
|
|
70
|
+
@ReactProp(name = "loop")
|
|
71
|
+
fun setLooping(view: AmazonIvsView, shouldLoop: Boolean){
|
|
72
|
+
view.setLooping(shouldLoop);
|
|
73
|
+
}
|
|
74
|
+
|
|
61
75
|
@ReactProp(name = "resizeMode")
|
|
62
76
|
fun setResizeMode(view: AmazonIvsView, mode: String) {
|
|
63
77
|
view.setResizeMode(mode);
|
package/ios/.gitignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
AmazonIvsManager+Framework.swift
|
package/ios/AmazonIvsManager.m
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
@interface RCT_EXTERN_MODULE(AmazonIvsManager, RCTViewManager)
|
|
5
5
|
RCT_EXPORT_VIEW_PROPERTY(resizeMode, NSString)
|
|
6
6
|
RCT_EXPORT_VIEW_PROPERTY(muted, BOOL)
|
|
7
|
+
RCT_EXPORT_VIEW_PROPERTY(loop, BOOL)
|
|
7
8
|
RCT_EXPORT_VIEW_PROPERTY(liveLowLatency, BOOL)
|
|
8
9
|
RCT_EXPORT_VIEW_PROPERTY(quality, NSDictionary)
|
|
9
10
|
RCT_EXPORT_VIEW_PROPERTY(initialBufferDuration, double)
|
|
@@ -18,6 +19,7 @@ RCT_EXTERN_METHOD(play:(nonnull NSNumber *)node)
|
|
|
18
19
|
RCT_EXTERN_METHOD(pause:(nonnull NSNumber *)node)
|
|
19
20
|
RCT_EXPORT_VIEW_PROPERTY(streamUrl, NSString)
|
|
20
21
|
RCT_EXTERN_METHOD(seekTo:(nonnull NSNumber *)node position:(double)position)
|
|
22
|
+
RCT_EXTERN_METHOD(setOrigin:(nonnull NSNumber *)node origin:(NSString *)origin)
|
|
21
23
|
RCT_EXTERN_METHOD(togglePip:(nonnull NSNumber *)node)
|
|
22
24
|
RCT_EXPORT_VIEW_PROPERTY(onSeek, RCTDirectEventBlock)
|
|
23
25
|
RCT_EXPORT_VIEW_PROPERTY(onData, RCTDirectEventBlock)
|
|
@@ -27,6 +27,13 @@ class AmazonIvsManager: RCTViewManager {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
@objc func setOrigin(_ node: NSNumber, origin: NSString) {
|
|
31
|
+
DispatchQueue.main.async {
|
|
32
|
+
let component = self.bridge.uiManager.view(forReactTag: node) as! AmazonIvsView
|
|
33
|
+
component.setOrigin(origin: origin)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
30
37
|
@objc func togglePip(_ node: NSNumber) {
|
|
31
38
|
DispatchQueue.main.async {
|
|
32
39
|
let component = self.bridge.uiManager.view(forReactTag: node) as! AmazonIvsView
|
package/ios/AmazonIvsView.swift
CHANGED
|
@@ -51,6 +51,7 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
51
51
|
|
|
52
52
|
override init(frame: CGRect) {
|
|
53
53
|
self.muted = player.muted
|
|
54
|
+
self.loop = player.looping
|
|
54
55
|
self.liveLowLatency = player.isLiveLowLatency
|
|
55
56
|
self.autoQualityMode = player.autoQualityMode
|
|
56
57
|
self.playbackRate = Double(player.playbackRate)
|
|
@@ -100,6 +101,12 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
100
101
|
self.addProgressObserver()
|
|
101
102
|
}
|
|
102
103
|
}
|
|
104
|
+
|
|
105
|
+
@objc var loop: Bool {
|
|
106
|
+
didSet {
|
|
107
|
+
player.looping = loop
|
|
108
|
+
}
|
|
109
|
+
}
|
|
103
110
|
|
|
104
111
|
@objc var muted: Bool {
|
|
105
112
|
didSet {
|
|
@@ -238,6 +245,11 @@ class AmazonIvsView: UIView, IVSPlayer.Delegate {
|
|
|
238
245
|
let parsedTime = CMTimeMakeWithSeconds(position, preferredTimescale: 1000000)
|
|
239
246
|
player.seek(to: parsedTime)
|
|
240
247
|
}
|
|
248
|
+
|
|
249
|
+
@objc func setOrigin(origin: NSString){
|
|
250
|
+
let url = URL(string: origin as String)
|
|
251
|
+
player.setOrigin(url)
|
|
252
|
+
}
|
|
241
253
|
|
|
242
254
|
|
|
243
255
|
|
|
@@ -30,6 +30,7 @@ const IVSPlayerContainer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
|
|
|
30
30
|
streamUrl,
|
|
31
31
|
paused,
|
|
32
32
|
muted,
|
|
33
|
+
loop = false,
|
|
33
34
|
resizeMode,
|
|
34
35
|
autoplay = true,
|
|
35
36
|
liveLowLatency,
|
|
@@ -71,6 +72,9 @@ const IVSPlayerContainer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
|
|
|
71
72
|
const seekTo = (0, _react.useCallback)(value => {
|
|
72
73
|
_reactNative.UIManager.dispatchViewManagerCommand((0, _reactNative.findNodeHandle)(mediaPlayerRef.current), _reactNative.UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo, [value]);
|
|
73
74
|
}, []);
|
|
75
|
+
const setOrigin = (0, _react.useCallback)(value => {
|
|
76
|
+
_reactNative.UIManager.dispatchViewManagerCommand((0, _reactNative.findNodeHandle)(mediaPlayerRef.current), _reactNative.UIManager.getViewManagerConfig(VIEW_NAME).Commands.setOrigin, [value]);
|
|
77
|
+
}, []);
|
|
74
78
|
const togglePip = (0, _react.useCallback)(() => {
|
|
75
79
|
_reactNative.UIManager.dispatchViewManagerCommand((0, _reactNative.findNodeHandle)(mediaPlayerRef.current), _reactNative.UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip, []);
|
|
76
80
|
}, []);
|
|
@@ -89,8 +93,9 @@ const IVSPlayerContainer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
|
|
|
89
93
|
play,
|
|
90
94
|
pause,
|
|
91
95
|
seekTo,
|
|
96
|
+
setOrigin,
|
|
92
97
|
togglePip
|
|
93
|
-
}), [play, pause, seekTo, togglePip]);
|
|
98
|
+
}), [play, pause, seekTo, setOrigin, togglePip]);
|
|
94
99
|
|
|
95
100
|
const onSeekHandler = event => {
|
|
96
101
|
const {
|
|
@@ -121,10 +126,9 @@ const IVSPlayerContainer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
|
|
|
121
126
|
};
|
|
122
127
|
|
|
123
128
|
const onLoadHandler = event => {
|
|
124
|
-
if (
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
pause();
|
|
129
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
130
|
+
const shouldAutoPlay = autoplay && !paused;
|
|
131
|
+
shouldAutoPlay ? play() : pause();
|
|
128
132
|
}
|
|
129
133
|
|
|
130
134
|
const {
|
|
@@ -198,6 +202,7 @@ const IVSPlayerContainer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) =>
|
|
|
198
202
|
}, /*#__PURE__*/_react.default.createElement(IVSPlayer, {
|
|
199
203
|
testID: "IVSPlayer",
|
|
200
204
|
muted: muted,
|
|
205
|
+
loop: loop,
|
|
201
206
|
liveLowLatency: liveLowLatency,
|
|
202
207
|
style: styles.mediaPlayer,
|
|
203
208
|
ref: mediaPlayerRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["IVSPlayer.tsx"],"names":["VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","React","forwardRef","ref","style","streamUrl","paused","muted","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","UIManager","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","togglePip","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","StyleSheet","create","flex","width","height"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n const togglePip = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip,\n []\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n togglePip,\n }),\n [play, pause, seekTo, togglePip]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (!paused) {\n play();\n } else {\n pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
|
1
|
+
{"version":3,"sources":["IVSPlayer.tsx"],"names":["VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","React","forwardRef","ref","style","streamUrl","paused","muted","loop","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","UIManager","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","setOrigin","togglePip","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","Platform","OS","shouldAutoPlay","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","StyleSheet","create","flex","width","height"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n Platform,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n loop?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n loop?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n loop = false,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n const setOrigin = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.setOrigin,\n [value]\n );\n }, []);\n\n const togglePip = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip,\n []\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n setOrigin,\n togglePip,\n }),\n [play, pause, seekTo, setOrigin, togglePip]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (Platform.OS === 'android') {\n const shouldAutoPlay = autoplay && !paused;\n shouldAutoPlay ? play() : pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n loop={loop}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
package/lib/module/IVSPlayer.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useCallback, useEffect, useImperativeHandle, useRef } from 'react';
|
|
2
|
-
import { requireNativeComponent, StyleSheet, UIManager, findNodeHandle, View } from 'react-native';
|
|
2
|
+
import { requireNativeComponent, StyleSheet, UIManager, findNodeHandle, View, Platform } from 'react-native';
|
|
3
3
|
const VIEW_NAME = 'AmazonIvs';
|
|
4
4
|
const IVSPlayer = requireNativeComponent(VIEW_NAME);
|
|
5
5
|
|
|
@@ -17,6 +17,7 @@ const IVSPlayerContainer = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
17
17
|
streamUrl,
|
|
18
18
|
paused,
|
|
19
19
|
muted,
|
|
20
|
+
loop = false,
|
|
20
21
|
resizeMode,
|
|
21
22
|
autoplay = true,
|
|
22
23
|
liveLowLatency,
|
|
@@ -58,6 +59,9 @@ const IVSPlayerContainer = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
58
59
|
const seekTo = useCallback(value => {
|
|
59
60
|
UIManager.dispatchViewManagerCommand(findNodeHandle(mediaPlayerRef.current), UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo, [value]);
|
|
60
61
|
}, []);
|
|
62
|
+
const setOrigin = useCallback(value => {
|
|
63
|
+
UIManager.dispatchViewManagerCommand(findNodeHandle(mediaPlayerRef.current), UIManager.getViewManagerConfig(VIEW_NAME).Commands.setOrigin, [value]);
|
|
64
|
+
}, []);
|
|
61
65
|
const togglePip = useCallback(() => {
|
|
62
66
|
UIManager.dispatchViewManagerCommand(findNodeHandle(mediaPlayerRef.current), UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip, []);
|
|
63
67
|
}, []);
|
|
@@ -76,8 +80,9 @@ const IVSPlayerContainer = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
76
80
|
play,
|
|
77
81
|
pause,
|
|
78
82
|
seekTo,
|
|
83
|
+
setOrigin,
|
|
79
84
|
togglePip
|
|
80
|
-
}), [play, pause, seekTo, togglePip]);
|
|
85
|
+
}), [play, pause, seekTo, setOrigin, togglePip]);
|
|
81
86
|
|
|
82
87
|
const onSeekHandler = event => {
|
|
83
88
|
const {
|
|
@@ -108,10 +113,9 @@ const IVSPlayerContainer = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
108
113
|
};
|
|
109
114
|
|
|
110
115
|
const onLoadHandler = event => {
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
pause();
|
|
116
|
+
if (Platform.OS === 'android') {
|
|
117
|
+
const shouldAutoPlay = autoplay && !paused;
|
|
118
|
+
shouldAutoPlay ? play() : pause();
|
|
115
119
|
}
|
|
116
120
|
|
|
117
121
|
const {
|
|
@@ -185,6 +189,7 @@ const IVSPlayerContainer = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
185
189
|
}, /*#__PURE__*/React.createElement(IVSPlayer, {
|
|
186
190
|
testID: "IVSPlayer",
|
|
187
191
|
muted: muted,
|
|
192
|
+
loop: loop,
|
|
188
193
|
liveLowLatency: liveLowLatency,
|
|
189
194
|
style: styles.mediaPlayer,
|
|
190
195
|
ref: mediaPlayerRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["IVSPlayer.tsx"],"names":["React","useCallback","useEffect","useImperativeHandle","useRef","requireNativeComponent","StyleSheet","UIManager","findNodeHandle","View","VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","forwardRef","ref","style","streamUrl","paused","muted","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","togglePip","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","create","flex","width","height"],"mappings":"AAAA,OAAOA,KAAP,IACEC,WADF,EAEEC,SAFF,EAGEC,mBAHF,EAIEC,MAJF,QAKO,OALP;AAMA,SACEC,sBADF,EAGEC,UAHF,EAIEC,SAJF,EAKEC,cALF,EAMEC,IANF,QAQO,cARP;AAiEA,MAAMC,SAAS,GAAG,WAAlB;AAEA,MAAMC,SAAS,GAAGN,sBAAsB,CAAiBK,SAAjB,CAAxC;;AAuCA,SAASE,aAAT,CAAuBC,QAAvB,EAAgD;AAC9C,MAAIA,QAAQ,IAAI,IAAhB,EAAsB;AACpB,WAAOA,QAAP;AACD;;AACD,SAAOA,QAAQ,GAAG,CAAX,GAAeA,QAAf,GAA0BC,QAAjC;AACD;;AAED,MAAMC,kBAAkB,gBAAGf,KAAK,CAACgB,UAAN,CACzB,OAoCEC,GApCF,KAqCK;AAAA,MApCH;AACEC,IAAAA,KADF;AAEEC,IAAAA,SAFF;AAGEC,IAAAA,MAHF;AAIEC,IAAAA,KAJF;AAKEC,IAAAA,UALF;AAMEC,IAAAA,QAAQ,GAAG,IANb;AAOEC,IAAAA,cAPF;AAQEC,IAAAA,YARF;AASEC,IAAAA,QATF;AAUEC,IAAAA,gBAVF;AAWEC,IAAAA,MAXF;AAYEC,IAAAA,OAZF;AAaEC,IAAAA,cAbF;AAcEC,IAAAA,eAdF;AAeEC,IAAAA,WAAW,GAAG,EAfhB;AAgBEC,IAAAA,UAhBF;AAiBEC,IAAAA,qBAjBF;AAkBEC,IAAAA,MAlBF;AAmBEC,IAAAA,MAnBF;AAoBEC,IAAAA,iBApBF;AAqBEC,IAAAA,mBArBF;AAsBEC,IAAAA,gBAtBF;AAuBEC,IAAAA,eAvBF;AAwBEC,IAAAA,aAxBF;AAyBEC,IAAAA,WAzBF;AA0BEC,IAAAA,MA1BF;AA2BEC,IAAAA,mBA3BF;AA4BEC,IAAAA,SA5BF;AA6BEC,IAAAA,iBA7BF;AA8BEC,IAAAA,UA9BF;AA+BEC,IAAAA,OA/BF;AAgCEC,IAAAA,WAhCF;AAiCEC,IAAAA;AAjCF,GAoCG;AACH,QAAMC,cAAc,GAAG/C,MAAM,CAAC,IAAD,CAA7B;AACA,QAAMgD,WAAW,GAAGhD,MAAM,CAAC,KAAD,CAA1B;AAEA,QAAMiD,IAAI,GAAGpD,WAAW,CAAC,MAAM;AAC7BM,IAAAA,SAAS,CAAC+C,0BAAV,CACE9C,cAAc,CAAC2C,cAAc,CAACI,OAAhB,CADhB,EAEEhD,SAAS,CAACiD,oBAAV,CAA+B9C,SAA/B,EAA0C+C,QAA1C,CAAmDJ,IAFrD,EAGE,EAHF;AAKD,GANuB,EAMrB,EANqB,CAAxB;AAQA,QAAMK,KAAK,GAAGzD,WAAW,CAAC,MAAM;AAC9BM,IAAAA,SAAS,CAAC+C,0BAAV,CACE9C,cAAc,CAAC2C,cAAc,CAACI,OAAhB,CADhB,EAEEhD,SAAS,CAACiD,oBAAV,CAA+B9C,SAA/B,EAA0C+C,QAA1C,CAAmDC,KAFrD,EAGE,EAHF;AAKD,GANwB,EAMtB,EANsB,CAAzB;AAQA,QAAMC,MAAM,GAAG1D,WAAW,CAAE2D,KAAD,IAAW;AACpCrD,IAAAA,SAAS,CAAC+C,0BAAV,CACE9C,cAAc,CAAC2C,cAAc,CAACI,OAAhB,CADhB,EAGEhD,SAAS,CAACiD,oBAAV,CAA+B9C,SAA/B,EAA0C+C,QAA1C,CAAmDE,MAHrD,EAIE,CAACC,KAAD,CAJF;AAMD,GAPyB,EAOvB,EAPuB,CAA1B;AASA,QAAMC,SAAS,GAAG5D,WAAW,CAAC,MAAM;AAClCM,IAAAA,SAAS,CAAC+C,0BAAV,CACE9C,cAAc,CAAC2C,cAAc,CAACI,OAAhB,CADhB,EAGEhD,SAAS,CAACiD,oBAAV,CAA+B9C,SAA/B,EAA0C+C,QAA1C,CAAmDI,SAHrD,EAIE,EAJF;AAMD,GAP4B,EAO1B,EAP0B,CAA7B;AASA3D,EAAAA,SAAS,CAAC,MAAM;AACd,QAAIkD,WAAW,CAACG,OAAZ,IAAuBhC,QAA3B,EAAqC;AACnC,UAAIH,MAAJ,EAAY;AACVsC,QAAAA,KAAK;AACN,OAFD,MAEO;AACLL,QAAAA,IAAI;AACL;AACF;;AACDD,IAAAA,WAAW,CAACG,OAAZ,GAAsB,IAAtB;AACD,GATQ,EASN,CAACG,KAAD,EAAQtC,MAAR,EAAgBiC,IAAhB,EAAsB9B,QAAtB,CATM,CAAT;AAWApB,EAAAA,mBAAmB,CACjBc,GADiB,EAEjB,OAAO;AACLoC,IAAAA,IADK;AAELK,IAAAA,KAFK;AAGLC,IAAAA,MAHK;AAILE,IAAAA;AAJK,GAAP,CAFiB,EAQjB,CAACR,IAAD,EAAOK,KAAP,EAAcC,MAAd,EAAsBE,SAAtB,CARiB,CAAnB;;AAWA,QAAMC,aAAa,GACjBC,KADoB,IAEjB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACA9B,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAG6B,QAAH,CAAN;AACD,GALD;;AAOA,QAAME,0BAA0B,GAC9BH,KADiC,IAE9B;AACH,UAAM;AAAEI,MAAAA;AAAF,QAAYJ,KAAK,CAACE,WAAxB;AACA3B,IAAAA,mBAAmB,SAAnB,IAAAA,mBAAmB,WAAnB,YAAAA,mBAAmB,CAAG6B,KAAH,CAAnB;AACD,GALD;;AAOA,QAAMC,uBAAuB,GAC3BL,KAD8B,IAE3B;AACH,UAAM;AAAElD,MAAAA;AAAF,QAAekD,KAAK,CAACE,WAA3B;AAEA1B,IAAAA,gBAAgB,SAAhB,IAAAA,gBAAgB,WAAhB,YAAAA,gBAAgB,CAAG3B,aAAa,CAACC,QAAD,CAAhB,CAAhB;AACD,GAND;;AAQA,QAAMwD,sBAAsB,GAC1BN,KAD6B,IAE1B;AACH,UAAM;AAAElC,MAAAA,OAAO,EAAEyC;AAAX,QAA0BP,KAAK,CAACE,WAAtC;AACAzB,IAAAA,eAAe,SAAf,IAAAA,eAAe,WAAf,YAAAA,eAAe,CAAG8B,UAAH,CAAf;AACD,GALD;;AAOA,QAAMC,aAAa,GACjBR,KADoB,IAIjB;AACH,QAAI,CAAC3C,MAAL,EAAa;AACXiC,MAAAA,IAAI;AACL,KAFD,MAEO;AACLK,MAAAA,KAAK;AACN;;AAED,UAAM;AAAE7C,MAAAA;AAAF,QAAekD,KAAK,CAACE,WAA3B;AAEAtB,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAG/B,aAAa,CAACC,QAAD,CAAhB,CAAN;AACD,GAdD;;AAgBA,QAAM2D,0BAA0B,GAC9BT,KADiC,IAE9B;AACH,UAAM;AAAEU,MAAAA;AAAF,QAAkBV,KAAK,CAACE,WAA9B;AACArB,IAAAA,mBAAmB,SAAnB,IAAAA,mBAAmB,WAAnB,YAAAA,mBAAmB,CAAG6B,WAAH,CAAnB;AACD,GALD;;AAOA,QAAMC,aAAa,GACjBX,KADoB,IAEjB;AACH,UAAM;AAAEY,MAAAA;AAAF,QAAiBZ,KAAK,CAACE,WAA7B;AACA7B,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAGuC,UAAH,CAAN;AACD,GALD;;AAOA,QAAMC,gBAAgB,GACpBb,KADuB,IAEpB;AACH,UAAM;AAAEc,MAAAA;AAAF,QAAcd,KAAK,CAACE,WAA1B;AACApB,IAAAA,SAAS,SAAT,IAAAA,SAAS,WAAT,YAAAA,SAAS,CAAGgC,OAAH,CAAT;AACD,GALD;;AAOA,QAAMC,wBAAwB,GAC5Bf,KAD+B,IAE5B;AACH,UAAM;AAAEgB,MAAAA;AAAF,QAAgBhB,KAAK,CAACE,WAA5B;AACA,UAAMe,UAAqB,GAAG,EAC5B,GAAGD,SADyB;AAE5BlE,MAAAA,QAAQ,EAAED,aAAa,CAACmE,SAAS,CAAClE,QAAX;AAFK,KAA9B;AAIAwB,IAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAG2C,UAAH,CAAjB;AACD,GATD;;AAWA,QAAMC,wBAAwB,GAC5BlB,KAD+B,IAE5B;AACH,UAAM;AAAEmB,MAAAA;AAAF,QAAsBnB,KAAK,CAACE,WAAlC;AACAnB,IAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAGoC,eAAH,CAAjB;AACD,GALD;;AAOA,QAAMC,iBAAiB,GACrBpB,KADwB,IAErB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACAlB,IAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAGiB,QAAH,CAAV;AACD,GALD;;AAOA,QAAMoB,cAAc,GAAIrB,KAAD,IAAoD;AACzE,UAAM;AAAEsB,MAAAA;AAAF,QAAYtB,KAAK,CAACE,WAAxB;AACAjB,IAAAA,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAGqC,KAAH,CAAP;AACD,GAHD;;AAKA,QAAMC,kBAAkB,GACtBvB,KADyB,IAEtB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACAhB,IAAAA,WAAW,SAAX,IAAAA,WAAW,WAAX,YAAAA,WAAW,CAAGe,QAAH,CAAX;AACD,GALD;;AAOA,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE,CAACuB,MAAM,CAACC,SAAR,EAAmBtE,KAAnB,CAAb;AAAwC,IAAA,GAAG,EAAED;AAA7C,kBACE,oBAAC,SAAD;AACE,IAAA,MAAM,EAAC,WADT;AAEE,IAAA,KAAK,EAAEI,KAFT;AAGE,IAAA,cAAc,EAAEG,cAHlB;AAIE,IAAA,KAAK,EAAE+D,MAAM,CAACE,WAJhB;AAKE,IAAA,GAAG,EAAEtC,cALP;AAME,IAAA,YAAY,EAAE1B,YANhB;AAOE,IAAA,SAAS,EAAEN,SAPb;AAQE,IAAA,QAAQ,EAAEO,QARZ;AASE,IAAA,UAAU,EAAEJ,UATd;AAUE,IAAA,gBAAgB,EAAEK,gBAVpB;AAWE,IAAA,MAAM,EAAEC,MAXV;AAYE,IAAA,OAAO,EAAEC,OAZX;AAaE,IAAA,qBAAqB,EAAEK,qBAbzB;AAcE,IAAA,cAAc,EAAEJ,cAdlB;AAeE,IAAA,eAAe,EAAEC,eAfnB;AAgBE,IAAA,WAAW,EAAEC,WAhBf;AAiBE,IAAA,UAAU,EAAEC,UAjBd;AAkBE,IAAA,iBAAiB,EACfI,iBAAiB,GAAGyC,wBAAH,GAA8BY,SAnBnD;AAqBE,IAAA,MAAM,EAAEhB,aArBV;AAsBE,IAAA,MAAM,EAAEZ,aAtBV;AAuBE,IAAA,eAAe,EAAEO,sBAvBnB;AAwBE,IAAA,mBAAmB,EAAEH,0BAxBvB;AAyBE,IAAA,gBAAgB,EAAEE,uBAzBpB;AA0BE,IAAA,aAAa,EAAE3B,aA1BjB;AA2BE,IAAA,WAAW,EAAEC,WA3Bf;AA4BE,IAAA,MAAM,EAAE6B,aA5BV;AA6BE,IAAA,SAAS,EAAEK,gBA7Bb;AA8BE,IAAA,iBAAiB,EAAEK,wBA9BrB;AA+BE,IAAA,UAAU,EAAEE,iBA/Bd;AAgCE,IAAA,mBAAmB,EACjBvC,mBAAmB,GAAG4B,0BAAH,GAAgCkB,SAjCvD;AAmCE,IAAA,OAAO,EAAEN,cAnCX;AAoCE,IAAA,WAAW,EAAEE;AApCf,IADF,eAuCE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEC,MAAM,CAACrC;AAApB,KAA+BA,QAA/B,CAvCF,CADF;AA2CD,CApPwB,CAA3B;AAuPA,MAAMqC,MAAM,GAAGjF,UAAU,CAACqF,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE;AACTI,IAAAA,IAAI,EAAE;AADG,GADoB;AAI/BH,EAAAA,WAAW,EAAE;AACXG,IAAAA,IAAI,EAAE;AADK,GAJkB;AAO/B1C,EAAAA,QAAQ,EAAE;AACRc,IAAAA,QAAQ,EAAE,UADF;AAER6B,IAAAA,KAAK,EAAE,MAFC;AAGRC,IAAAA,MAAM,EAAE;AAHA;AAPqB,CAAlB,CAAf;AAcA,eAAe/E,kBAAf","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n const togglePip = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip,\n []\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n togglePip,\n }),\n [play, pause, seekTo, togglePip]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (!paused) {\n play();\n } else {\n pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
|
1
|
+
{"version":3,"sources":["IVSPlayer.tsx"],"names":["React","useCallback","useEffect","useImperativeHandle","useRef","requireNativeComponent","StyleSheet","UIManager","findNodeHandle","View","Platform","VIEW_NAME","IVSPlayer","parseDuration","duration","Infinity","IVSPlayerContainer","forwardRef","ref","style","streamUrl","paused","muted","loop","resizeMode","autoplay","liveLowLatency","playbackRate","logLevel","progressInterval","volume","quality","autoMaxQuality","autoQualityMode","breakpoints","maxBitrate","initialBufferDuration","onSeek","onData","onVideoStatistics","onPlayerStateChange","onDurationChange","onQualityChange","onRebuffering","onLoadStart","onLoad","onLiveLatencyChange","onTextCue","onTextMetadataCue","onProgress","onError","onTimePoint","children","mediaPlayerRef","initialized","play","dispatchViewManagerCommand","current","getViewManagerConfig","Commands","pause","seekTo","value","setOrigin","togglePip","onSeekHandler","event","position","nativeEvent","onPlayerStateChangeHandler","state","onDurationChangeHandler","onQualityChangeHandler","newQuality","onLoadHandler","OS","shouldAutoPlay","onLiveLatencyChangeHandler","liveLatency","onDataHandler","playerData","onTextCueHandler","textCue","onVideoStatisticsHandler","videoData","statistics","onTextMetadataCueHandler","textMetadataCue","onProgressHandler","onErrorHandler","error","onTimePointHandler","styles","container","mediaPlayer","undefined","create","flex","width","height"],"mappings":"AAAA,OAAOA,KAAP,IACEC,WADF,EAEEC,SAFF,EAGEC,mBAHF,EAIEC,MAJF,QAKO,OALP;AAMA,SACEC,sBADF,EAGEC,UAHF,EAIEC,SAJF,EAKEC,cALF,EAMEC,IANF,EAQEC,QARF,QASO,cATP;AAmEA,MAAMC,SAAS,GAAG,WAAlB;AAEA,MAAMC,SAAS,GAAGP,sBAAsB,CAAiBM,SAAjB,CAAxC;;AAwCA,SAASE,aAAT,CAAuBC,QAAvB,EAAgD;AAC9C,MAAIA,QAAQ,IAAI,IAAhB,EAAsB;AACpB,WAAOA,QAAP;AACD;;AACD,SAAOA,QAAQ,GAAG,CAAX,GAAeA,QAAf,GAA0BC,QAAjC;AACD;;AAED,MAAMC,kBAAkB,gBAAGhB,KAAK,CAACiB,UAAN,CACzB,OAqCEC,GArCF,KAsCK;AAAA,MArCH;AACEC,IAAAA,KADF;AAEEC,IAAAA,SAFF;AAGEC,IAAAA,MAHF;AAIEC,IAAAA,KAJF;AAKEC,IAAAA,IAAI,GAAG,KALT;AAMEC,IAAAA,UANF;AAOEC,IAAAA,QAAQ,GAAG,IAPb;AAQEC,IAAAA,cARF;AASEC,IAAAA,YATF;AAUEC,IAAAA,QAVF;AAWEC,IAAAA,gBAXF;AAYEC,IAAAA,MAZF;AAaEC,IAAAA,OAbF;AAcEC,IAAAA,cAdF;AAeEC,IAAAA,eAfF;AAgBEC,IAAAA,WAAW,GAAG,EAhBhB;AAiBEC,IAAAA,UAjBF;AAkBEC,IAAAA,qBAlBF;AAmBEC,IAAAA,MAnBF;AAoBEC,IAAAA,MApBF;AAqBEC,IAAAA,iBArBF;AAsBEC,IAAAA,mBAtBF;AAuBEC,IAAAA,gBAvBF;AAwBEC,IAAAA,eAxBF;AAyBEC,IAAAA,aAzBF;AA0BEC,IAAAA,WA1BF;AA2BEC,IAAAA,MA3BF;AA4BEC,IAAAA,mBA5BF;AA6BEC,IAAAA,SA7BF;AA8BEC,IAAAA,iBA9BF;AA+BEC,IAAAA,UA/BF;AAgCEC,IAAAA,OAhCF;AAiCEC,IAAAA,WAjCF;AAkCEC,IAAAA;AAlCF,GAqCG;AACH,QAAMC,cAAc,GAAGjD,MAAM,CAAC,IAAD,CAA7B;AACA,QAAMkD,WAAW,GAAGlD,MAAM,CAAC,KAAD,CAA1B;AAEA,QAAMmD,IAAI,GAAGtD,WAAW,CAAC,MAAM;AAC7BM,IAAAA,SAAS,CAACiD,0BAAV,CACEhD,cAAc,CAAC6C,cAAc,CAACI,OAAhB,CADhB,EAEElD,SAAS,CAACmD,oBAAV,CAA+B/C,SAA/B,EAA0CgD,QAA1C,CAAmDJ,IAFrD,EAGE,EAHF;AAKD,GANuB,EAMrB,EANqB,CAAxB;AAQA,QAAMK,KAAK,GAAG3D,WAAW,CAAC,MAAM;AAC9BM,IAAAA,SAAS,CAACiD,0BAAV,CACEhD,cAAc,CAAC6C,cAAc,CAACI,OAAhB,CADhB,EAEElD,SAAS,CAACmD,oBAAV,CAA+B/C,SAA/B,EAA0CgD,QAA1C,CAAmDC,KAFrD,EAGE,EAHF;AAKD,GANwB,EAMtB,EANsB,CAAzB;AAQA,QAAMC,MAAM,GAAG5D,WAAW,CAAE6D,KAAD,IAAW;AACpCvD,IAAAA,SAAS,CAACiD,0BAAV,CACEhD,cAAc,CAAC6C,cAAc,CAACI,OAAhB,CADhB,EAGElD,SAAS,CAACmD,oBAAV,CAA+B/C,SAA/B,EAA0CgD,QAA1C,CAAmDE,MAHrD,EAIE,CAACC,KAAD,CAJF;AAMD,GAPyB,EAOvB,EAPuB,CAA1B;AASA,QAAMC,SAAS,GAAG9D,WAAW,CAAE6D,KAAD,IAAW;AACvCvD,IAAAA,SAAS,CAACiD,0BAAV,CACEhD,cAAc,CAAC6C,cAAc,CAACI,OAAhB,CADhB,EAGElD,SAAS,CAACmD,oBAAV,CAA+B/C,SAA/B,EAA0CgD,QAA1C,CAAmDI,SAHrD,EAIE,CAACD,KAAD,CAJF;AAMD,GAP4B,EAO1B,EAP0B,CAA7B;AASA,QAAME,SAAS,GAAG/D,WAAW,CAAC,MAAM;AAClCM,IAAAA,SAAS,CAACiD,0BAAV,CACEhD,cAAc,CAAC6C,cAAc,CAACI,OAAhB,CADhB,EAGElD,SAAS,CAACmD,oBAAV,CAA+B/C,SAA/B,EAA0CgD,QAA1C,CAAmDK,SAHrD,EAIE,EAJF;AAMD,GAP4B,EAO1B,EAP0B,CAA7B;AASA9D,EAAAA,SAAS,CAAC,MAAM;AACd,QAAIoD,WAAW,CAACG,OAAZ,IAAuBhC,QAA3B,EAAqC;AACnC,UAAIJ,MAAJ,EAAY;AACVuC,QAAAA,KAAK;AACN,OAFD,MAEO;AACLL,QAAAA,IAAI;AACL;AACF;;AACDD,IAAAA,WAAW,CAACG,OAAZ,GAAsB,IAAtB;AACD,GATQ,EASN,CAACG,KAAD,EAAQvC,MAAR,EAAgBkC,IAAhB,EAAsB9B,QAAtB,CATM,CAAT;AAWAtB,EAAAA,mBAAmB,CACjBe,GADiB,EAEjB,OAAO;AACLqC,IAAAA,IADK;AAELK,IAAAA,KAFK;AAGLC,IAAAA,MAHK;AAILE,IAAAA,SAJK;AAKLC,IAAAA;AALK,GAAP,CAFiB,EASjB,CAACT,IAAD,EAAOK,KAAP,EAAcC,MAAd,EAAsBE,SAAtB,EAAiCC,SAAjC,CATiB,CAAnB;;AAYA,QAAMC,aAAa,GACjBC,KADoB,IAEjB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACA/B,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAG8B,QAAH,CAAN;AACD,GALD;;AAOA,QAAME,0BAA0B,GAC9BH,KADiC,IAE9B;AACH,UAAM;AAAEI,MAAAA;AAAF,QAAYJ,KAAK,CAACE,WAAxB;AACA5B,IAAAA,mBAAmB,SAAnB,IAAAA,mBAAmB,WAAnB,YAAAA,mBAAmB,CAAG8B,KAAH,CAAnB;AACD,GALD;;AAOA,QAAMC,uBAAuB,GAC3BL,KAD8B,IAE3B;AACH,UAAM;AAAEpD,MAAAA;AAAF,QAAeoD,KAAK,CAACE,WAA3B;AAEA3B,IAAAA,gBAAgB,SAAhB,IAAAA,gBAAgB,WAAhB,YAAAA,gBAAgB,CAAG5B,aAAa,CAACC,QAAD,CAAhB,CAAhB;AACD,GAND;;AAQA,QAAM0D,sBAAsB,GAC1BN,KAD6B,IAE1B;AACH,UAAM;AAAEnC,MAAAA,OAAO,EAAE0C;AAAX,QAA0BP,KAAK,CAACE,WAAtC;AACA1B,IAAAA,eAAe,SAAf,IAAAA,eAAe,WAAf,YAAAA,eAAe,CAAG+B,UAAH,CAAf;AACD,GALD;;AAOA,QAAMC,aAAa,GACjBR,KADoB,IAIjB;AACH,QAAIxD,QAAQ,CAACiE,EAAT,KAAgB,SAApB,EAA+B;AAC7B,YAAMC,cAAc,GAAGnD,QAAQ,IAAI,CAACJ,MAApC;AACAuD,MAAAA,cAAc,GAAGrB,IAAI,EAAP,GAAYK,KAAK,EAA/B;AACD;;AAED,UAAM;AAAE9C,MAAAA;AAAF,QAAeoD,KAAK,CAACE,WAA3B;AAEAvB,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAGhC,aAAa,CAACC,QAAD,CAAhB,CAAN;AACD,GAbD;;AAeA,QAAM+D,0BAA0B,GAC9BX,KADiC,IAE9B;AACH,UAAM;AAAEY,MAAAA;AAAF,QAAkBZ,KAAK,CAACE,WAA9B;AACAtB,IAAAA,mBAAmB,SAAnB,IAAAA,mBAAmB,WAAnB,YAAAA,mBAAmB,CAAGgC,WAAH,CAAnB;AACD,GALD;;AAOA,QAAMC,aAAa,GACjBb,KADoB,IAEjB;AACH,UAAM;AAAEc,MAAAA;AAAF,QAAiBd,KAAK,CAACE,WAA7B;AACA9B,IAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAG0C,UAAH,CAAN;AACD,GALD;;AAOA,QAAMC,gBAAgB,GACpBf,KADuB,IAEpB;AACH,UAAM;AAAEgB,MAAAA;AAAF,QAAchB,KAAK,CAACE,WAA1B;AACArB,IAAAA,SAAS,SAAT,IAAAA,SAAS,WAAT,YAAAA,SAAS,CAAGmC,OAAH,CAAT;AACD,GALD;;AAOA,QAAMC,wBAAwB,GAC5BjB,KAD+B,IAE5B;AACH,UAAM;AAAEkB,MAAAA;AAAF,QAAgBlB,KAAK,CAACE,WAA5B;AACA,UAAMiB,UAAqB,GAAG,EAC5B,GAAGD,SADyB;AAE5BtE,MAAAA,QAAQ,EAAED,aAAa,CAACuE,SAAS,CAACtE,QAAX;AAFK,KAA9B;AAIAyB,IAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAG8C,UAAH,CAAjB;AACD,GATD;;AAWA,QAAMC,wBAAwB,GAC5BpB,KAD+B,IAE5B;AACH,UAAM;AAAEqB,MAAAA;AAAF,QAAsBrB,KAAK,CAACE,WAAlC;AACApB,IAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAGuC,eAAH,CAAjB;AACD,GALD;;AAOA,QAAMC,iBAAiB,GACrBtB,KADwB,IAErB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACAnB,IAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAGkB,QAAH,CAAV;AACD,GALD;;AAOA,QAAMsB,cAAc,GAAIvB,KAAD,IAAoD;AACzE,UAAM;AAAEwB,MAAAA;AAAF,QAAYxB,KAAK,CAACE,WAAxB;AACAlB,IAAAA,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAGwC,KAAH,CAAP;AACD,GAHD;;AAKA,QAAMC,kBAAkB,GACtBzB,KADyB,IAEtB;AACH,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAAK,CAACE,WAA3B;AACAjB,IAAAA,WAAW,SAAX,IAAAA,WAAW,WAAX,YAAAA,WAAW,CAAGgB,QAAH,CAAX;AACD,GALD;;AAOA,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE,CAACyB,MAAM,CAACC,SAAR,EAAmB1E,KAAnB,CAAb;AAAwC,IAAA,GAAG,EAAED;AAA7C,kBACE,oBAAC,SAAD;AACE,IAAA,MAAM,EAAC,WADT;AAEE,IAAA,KAAK,EAAEI,KAFT;AAGE,IAAA,IAAI,EAAEC,IAHR;AAIE,IAAA,cAAc,EAAEG,cAJlB;AAKE,IAAA,KAAK,EAAEkE,MAAM,CAACE,WALhB;AAME,IAAA,GAAG,EAAEzC,cANP;AAOE,IAAA,YAAY,EAAE1B,YAPhB;AAQE,IAAA,SAAS,EAAEP,SARb;AASE,IAAA,QAAQ,EAAEQ,QATZ;AAUE,IAAA,UAAU,EAAEJ,UAVd;AAWE,IAAA,gBAAgB,EAAEK,gBAXpB;AAYE,IAAA,MAAM,EAAEC,MAZV;AAaE,IAAA,OAAO,EAAEC,OAbX;AAcE,IAAA,qBAAqB,EAAEK,qBAdzB;AAeE,IAAA,cAAc,EAAEJ,cAflB;AAgBE,IAAA,eAAe,EAAEC,eAhBnB;AAiBE,IAAA,WAAW,EAAEC,WAjBf;AAkBE,IAAA,UAAU,EAAEC,UAlBd;AAmBE,IAAA,iBAAiB,EACfI,iBAAiB,GAAG4C,wBAAH,GAA8BY,SApBnD;AAsBE,IAAA,MAAM,EAAEhB,aAtBV;AAuBE,IAAA,MAAM,EAAEd,aAvBV;AAwBE,IAAA,eAAe,EAAEO,sBAxBnB;AAyBE,IAAA,mBAAmB,EAAEH,0BAzBvB;AA0BE,IAAA,gBAAgB,EAAEE,uBA1BpB;AA2BE,IAAA,aAAa,EAAE5B,aA3BjB;AA4BE,IAAA,WAAW,EAAEC,WA5Bf;AA6BE,IAAA,MAAM,EAAE8B,aA7BV;AA8BE,IAAA,SAAS,EAAEO,gBA9Bb;AA+BE,IAAA,iBAAiB,EAAEK,wBA/BrB;AAgCE,IAAA,UAAU,EAAEE,iBAhCd;AAiCE,IAAA,mBAAmB,EACjB1C,mBAAmB,GAAG+B,0BAAH,GAAgCkB,SAlCvD;AAoCE,IAAA,OAAO,EAAEN,cApCX;AAqCE,IAAA,WAAW,EAAEE;AArCf,IADF,eAwCE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEC,MAAM,CAACxC;AAApB,KAA+BA,QAA/B,CAxCF,CADF;AA4CD,CA/PwB,CAA3B;AAkQA,MAAMwC,MAAM,GAAGtF,UAAU,CAAC0F,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE;AACTI,IAAAA,IAAI,EAAE;AADG,GADoB;AAI/BH,EAAAA,WAAW,EAAE;AACXG,IAAAA,IAAI,EAAE;AADK,GAJkB;AAO/B7C,EAAAA,QAAQ,EAAE;AACRe,IAAAA,QAAQ,EAAE,UADF;AAER+B,IAAAA,KAAK,EAAE,MAFC;AAGRC,IAAAA,MAAM,EAAE;AAHA;AAPqB,CAAlB,CAAf;AAcA,eAAenF,kBAAf","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport {\n requireNativeComponent,\n ViewStyle,\n StyleSheet,\n UIManager,\n findNodeHandle,\n View,\n NativeSyntheticEvent,\n Platform,\n} from 'react-native';\nimport type { LogLevel, PlayerState } from './enums';\nimport type {\n Quality,\n PlayerData,\n TextCue,\n TextMetadataCue,\n VideoData,\n IVSPlayerRef,\n ResizeMode,\n} from './types';\n\ntype IVSPlayerProps = {\n style?: ViewStyle;\n testID?: string;\n ref: any;\n muted?: boolean;\n loop?: boolean;\n liveLowLatency?: boolean;\n playbackRate?: number;\n streamUrl?: string;\n resizeMode?: ResizeMode;\n logLevel?: LogLevel;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(event: NativeSyntheticEvent<{ position: number }>): void;\n onData?(event: NativeSyntheticEvent<{ playerData: PlayerData }>): void;\n onVideoStatistics?(\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ): void;\n onPlayerStateChange?(\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ): void;\n onDurationChange?(\n event: NativeSyntheticEvent<{ duration: number | null }>\n ): void;\n onQualityChange?(event: NativeSyntheticEvent<{ quality: Quality }>): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(event: NativeSyntheticEvent<{ duration: number | null }>): void;\n onLiveLatencyChange?(\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ): void;\n onTextCue?(event: NativeSyntheticEvent<{ textCue: TextCue }>): void;\n onTextMetadataCue?(\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ): void;\n onProgress?(event: NativeSyntheticEvent<{ position: number }>): void;\n onError?(event: NativeSyntheticEvent<{ error: string }>): void;\n onTimePoint?(event: NativeSyntheticEvent<{ position: number }>): void;\n};\n\nconst VIEW_NAME = 'AmazonIvs';\n\nconst IVSPlayer = requireNativeComponent<IVSPlayerProps>(VIEW_NAME);\n\ntype Props = {\n style?: ViewStyle;\n testID?: string;\n paused?: boolean;\n muted?: boolean;\n loop?: boolean;\n autoplay?: boolean;\n streamUrl?: string;\n liveLowLatency?: boolean;\n playbackRate?: number;\n logLevel?: LogLevel;\n resizeMode?: ResizeMode;\n progressInterval?: number;\n volume?: number;\n quality?: Quality | null;\n autoMaxQuality?: Quality | null;\n autoQualityMode?: boolean;\n breakpoints?: number[];\n maxBitrate?: number;\n initialBufferDuration?: number;\n onSeek?(position: number): void;\n onData?(data: PlayerData): void;\n onVideoStatistics?(data: VideoData): void;\n onPlayerStateChange?(state: PlayerState): void;\n onDurationChange?(duration: number | null): void;\n onQualityChange?(quality: Quality | null): void;\n onRebuffering?(): void;\n onLoadStart?(): void;\n onLoad?(duration: number | null): void;\n onLiveLatencyChange?(liveLatency: number): void;\n onTextCue?(textCue: TextCue): void;\n onTextMetadataCue?(textMetadataCue: TextMetadataCue): void;\n onProgress?(progress: number): void;\n onError?(error: string): void;\n onTimePoint?(position: number): void;\n children?: React.ReactNode;\n};\n\nfunction parseDuration(duration: number | null) {\n if (duration == null) {\n return duration;\n }\n return duration > 0 ? duration : Infinity;\n}\n\nconst IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(\n (\n {\n style,\n streamUrl,\n paused,\n muted,\n loop = false,\n resizeMode,\n autoplay = true,\n liveLowLatency,\n playbackRate,\n logLevel,\n progressInterval,\n volume,\n quality,\n autoMaxQuality,\n autoQualityMode,\n breakpoints = [],\n maxBitrate,\n initialBufferDuration,\n onSeek,\n onData,\n onVideoStatistics,\n onPlayerStateChange,\n onDurationChange,\n onQualityChange,\n onRebuffering,\n onLoadStart,\n onLoad,\n onLiveLatencyChange,\n onTextCue,\n onTextMetadataCue,\n onProgress,\n onError,\n onTimePoint,\n children,\n },\n ref\n ) => {\n const mediaPlayerRef = useRef(null);\n const initialized = useRef(false);\n\n const play = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.play,\n []\n );\n }, []);\n\n const pause = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.pause,\n []\n );\n }, []);\n\n const seekTo = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.seekTo,\n [value]\n );\n }, []);\n\n const setOrigin = useCallback((value) => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.setOrigin,\n [value]\n );\n }, []);\n\n const togglePip = useCallback(() => {\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(mediaPlayerRef.current),\n\n UIManager.getViewManagerConfig(VIEW_NAME).Commands.togglePip,\n []\n );\n }, []);\n\n useEffect(() => {\n if (initialized.current || autoplay) {\n if (paused) {\n pause();\n } else {\n play();\n }\n }\n initialized.current = true;\n }, [pause, paused, play, autoplay]);\n\n useImperativeHandle(\n ref,\n () => ({\n play,\n pause,\n seekTo,\n setOrigin,\n togglePip,\n }),\n [play, pause, seekTo, setOrigin, togglePip]\n );\n\n const onSeekHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onSeek?.(position);\n };\n\n const onPlayerStateChangeHandler = (\n event: NativeSyntheticEvent<{ state: PlayerState }>\n ) => {\n const { state } = event.nativeEvent;\n onPlayerStateChange?.(state);\n };\n\n const onDurationChangeHandler = (\n event: NativeSyntheticEvent<{ duration: number | null }>\n ) => {\n const { duration } = event.nativeEvent;\n\n onDurationChange?.(parseDuration(duration));\n };\n\n const onQualityChangeHandler = (\n event: NativeSyntheticEvent<{ quality: Quality }>\n ) => {\n const { quality: newQuality } = event.nativeEvent;\n onQualityChange?.(newQuality);\n };\n\n const onLoadHandler = (\n event: NativeSyntheticEvent<{\n duration: number | null;\n }>\n ) => {\n if (Platform.OS === 'android') {\n const shouldAutoPlay = autoplay && !paused;\n shouldAutoPlay ? play() : pause();\n }\n\n const { duration } = event.nativeEvent;\n\n onLoad?.(parseDuration(duration));\n };\n\n const onLiveLatencyChangeHandler = (\n event: NativeSyntheticEvent<{ liveLatency: number }>\n ) => {\n const { liveLatency } = event.nativeEvent;\n onLiveLatencyChange?.(liveLatency);\n };\n\n const onDataHandler = (\n event: NativeSyntheticEvent<{ playerData: PlayerData }>\n ) => {\n const { playerData } = event.nativeEvent;\n onData?.(playerData);\n };\n\n const onTextCueHandler = (\n event: NativeSyntheticEvent<{ textCue: TextCue }>\n ) => {\n const { textCue } = event.nativeEvent;\n onTextCue?.(textCue);\n };\n\n const onVideoStatisticsHandler = (\n event: NativeSyntheticEvent<{ videoData: VideoData }>\n ) => {\n const { videoData } = event.nativeEvent;\n const statistics: VideoData = {\n ...videoData,\n duration: parseDuration(videoData.duration),\n };\n onVideoStatistics?.(statistics);\n };\n\n const onTextMetadataCueHandler = (\n event: NativeSyntheticEvent<{ textMetadataCue: TextMetadataCue }>\n ) => {\n const { textMetadataCue } = event.nativeEvent;\n onTextMetadataCue?.(textMetadataCue);\n };\n\n const onProgressHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onProgress?.(position);\n };\n\n const onErrorHandler = (event: NativeSyntheticEvent<{ error: string }>) => {\n const { error } = event.nativeEvent;\n onError?.(error);\n };\n\n const onTimePointHandler = (\n event: NativeSyntheticEvent<{ position: number }>\n ) => {\n const { position } = event.nativeEvent;\n onTimePoint?.(position);\n };\n\n return (\n <View style={[styles.container, style]} ref={ref as any}>\n <IVSPlayer\n testID=\"IVSPlayer\"\n muted={muted}\n loop={loop}\n liveLowLatency={liveLowLatency}\n style={styles.mediaPlayer}\n ref={mediaPlayerRef}\n playbackRate={playbackRate}\n streamUrl={streamUrl}\n logLevel={logLevel}\n resizeMode={resizeMode}\n progressInterval={progressInterval}\n volume={volume}\n quality={quality}\n initialBufferDuration={initialBufferDuration}\n autoMaxQuality={autoMaxQuality}\n autoQualityMode={autoQualityMode}\n breakpoints={breakpoints}\n maxBitrate={maxBitrate}\n onVideoStatistics={\n onVideoStatistics ? onVideoStatisticsHandler : undefined\n }\n onData={onDataHandler}\n onSeek={onSeekHandler}\n onQualityChange={onQualityChangeHandler}\n onPlayerStateChange={onPlayerStateChangeHandler}\n onDurationChange={onDurationChangeHandler}\n onRebuffering={onRebuffering}\n onLoadStart={onLoadStart}\n onLoad={onLoadHandler}\n onTextCue={onTextCueHandler}\n onTextMetadataCue={onTextMetadataCueHandler}\n onProgress={onProgressHandler}\n onLiveLatencyChange={\n onLiveLatencyChange ? onLiveLatencyChangeHandler : undefined\n }\n onError={onErrorHandler}\n onTimePoint={onTimePointHandler}\n />\n <View style={styles.children}>{children}</View>\n </View>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n mediaPlayer: {\n flex: 1,\n },\n children: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n});\n\nexport default IVSPlayerContainer;\n"]}
|
package/lib/module/types.js.flow
CHANGED
|
@@ -34,6 +34,7 @@ export declare type IVSPlayerRef = {
|
|
|
34
34
|
play: () => void;
|
|
35
35
|
pause: () => void;
|
|
36
36
|
seekTo: (position: number) => void;
|
|
37
|
+
setOrigin: (origin: string) => void;
|
|
37
38
|
togglePip: () => void;
|
|
38
39
|
};
|
|
39
40
|
export declare type ResizeMode = 'aspectFill' | 'aspectFit' | 'aspectZoom';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "amazon-ivs-react-native-player",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "amazon-ivs-react-native-player",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -16,22 +16,28 @@
|
|
|
16
16
|
"amazon-ivs-react-native-player.podspec"
|
|
17
17
|
],
|
|
18
18
|
"scripts": {
|
|
19
|
+
"commit": "commit",
|
|
19
20
|
"test": "jest",
|
|
20
21
|
"typescript": "tsc --noEmit",
|
|
21
22
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
22
|
-
"
|
|
23
|
+
"reset": "git clean -xdfe .vscode && yarn && yarn prepare",
|
|
24
|
+
"markbuild": "tsx ./scripts/example-dot-env.ts",
|
|
25
|
+
"prepare": "bob build && yarn markbuild",
|
|
23
26
|
"example": "yarn --cwd example",
|
|
24
27
|
"pods": "cd example && pod-install --quiet",
|
|
25
28
|
"bootstrap": "yarn example && yarn && yarn pods",
|
|
29
|
+
"e2e:reset": "detox clean-framework-cache && detox build-framework-cache",
|
|
26
30
|
"e2e:build:android": "detox build --configuration android",
|
|
27
31
|
"e2e:build:ios": "detox build --configuration ios",
|
|
28
32
|
"e2e:test:android": "yarn get:testbutler && detox test --configuration android --take-screenshots failing --loglevel verbose",
|
|
29
33
|
"e2e:test:ios": "detox test --configuration ios --take-screenshots failing --loglevel verbose",
|
|
30
34
|
"e2e:build:android:release": "detox build --configuration android.emu.release",
|
|
31
35
|
"e2e:build:ios:release": "detox build --configuration ios.sim.release",
|
|
32
|
-
"e2e:test:android:release": "yarn get:testbutler && detox test --configuration android.emu.release --
|
|
33
|
-
"e2e:test:ios:release": "detox test --configuration ios.sim.release --take-screenshots failing",
|
|
34
|
-
"get:testbutler": "curl -f -o ./test-butler-app.apk https://repo1.maven.org/maven2/com/linkedin/testbutler/test-butler-app/2.2.1/test-butler-app-2.2.1.apk"
|
|
36
|
+
"e2e:test:android:release": "yarn get:testbutler && detox test --configuration android.emu.release --headless --take-screenshots failing",
|
|
37
|
+
"e2e:test:ios:release": "detox test --configuration ios.sim.release --headless --take-screenshots failing",
|
|
38
|
+
"get:testbutler": "curl -f -o ./test-butler-app.apk https://repo1.maven.org/maven2/com/linkedin/testbutler/test-butler-app/2.2.1/test-butler-app-2.2.1.apk",
|
|
39
|
+
"release:create": "tsx ./scripts/release-create.ts",
|
|
40
|
+
"release:verify": "tsx ./scripts/release-verify.ts"
|
|
35
41
|
},
|
|
36
42
|
"keywords": [
|
|
37
43
|
"react-native",
|
|
@@ -52,27 +58,36 @@
|
|
|
52
58
|
"@babel/runtime": "^7.16.7",
|
|
53
59
|
"@callstack/eslint-config": "^11.0.0",
|
|
54
60
|
"@commitlint/config-conventional": "^13.1.0",
|
|
61
|
+
"@commitlint/prompt-cli": "^17.6.6",
|
|
55
62
|
"@react-native-community/eslint-config": "^2.0.0",
|
|
56
63
|
"@testing-library/jest-native": "^4.0.1",
|
|
57
|
-
"@testing-library/react-native": "^
|
|
64
|
+
"@testing-library/react-native": "^10.1.0",
|
|
65
|
+
"@types/inquirer": "^9.0.3",
|
|
58
66
|
"@types/jest": "^26.0.0",
|
|
67
|
+
"@types/node": "^20.4.1",
|
|
59
68
|
"@types/react": "^17.0.38",
|
|
60
|
-
"@types/react-native": "0.
|
|
69
|
+
"@types/react-native": "0.69.9",
|
|
70
|
+
"@types/semver": "^7.5.0",
|
|
71
|
+
"chalk": "^5.3.0",
|
|
61
72
|
"commitlint": "^13.1.0",
|
|
62
|
-
"detox": "^
|
|
73
|
+
"detox": "^20.1.0",
|
|
63
74
|
"eslint": "^7.32.0",
|
|
64
75
|
"eslint-config-prettier": "^7.0.0",
|
|
65
76
|
"eslint-plugin-detox": "^1.0.0",
|
|
66
77
|
"eslint-plugin-prettier": "^3.1.3",
|
|
67
78
|
"husky": "^4.2.5",
|
|
68
|
-
"
|
|
69
|
-
"jest
|
|
79
|
+
"inquirer": "^9.2.7",
|
|
80
|
+
"jest": "^29.3.1",
|
|
81
|
+
"jest-circus": "^29.3.1",
|
|
70
82
|
"pod-install": "^0.1.0",
|
|
71
83
|
"prettier": "^2.0.5",
|
|
72
|
-
"react": "
|
|
73
|
-
"react-native": "0.
|
|
84
|
+
"react": "18.0.0",
|
|
85
|
+
"react-native": "0.69.9",
|
|
74
86
|
"react-native-builder-bob": "^0.18.1",
|
|
75
|
-
"react-test-renderer": "
|
|
87
|
+
"react-test-renderer": "18.0.0",
|
|
88
|
+
"semver": "^7.5.4",
|
|
89
|
+
"simple-git": "^3.19.1",
|
|
90
|
+
"tsx": "^3.12.7",
|
|
76
91
|
"typescript": "^4.1.3"
|
|
77
92
|
},
|
|
78
93
|
"peerDependencies": {
|
|
@@ -92,7 +107,8 @@
|
|
|
92
107
|
"husky": {
|
|
93
108
|
"hooks": {
|
|
94
109
|
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
|
|
95
|
-
"pre-commit": "yarn lint && yarn typescript"
|
|
110
|
+
"pre-commit": "yarn lint && yarn typescript",
|
|
111
|
+
"post-commit": "yarn markbuild"
|
|
96
112
|
}
|
|
97
113
|
},
|
|
98
114
|
"commitlint": {
|
|
@@ -145,5 +161,6 @@
|
|
|
145
161
|
}
|
|
146
162
|
]
|
|
147
163
|
]
|
|
148
|
-
}
|
|
164
|
+
},
|
|
165
|
+
"dependencies": {}
|
|
149
166
|
}
|
package/src/IVSPlayer.js.flow
CHANGED
package/src/IVSPlayer.tsx
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
findNodeHandle,
|
|
13
13
|
View,
|
|
14
14
|
NativeSyntheticEvent,
|
|
15
|
+
Platform,
|
|
15
16
|
} from 'react-native';
|
|
16
17
|
import type { LogLevel, PlayerState } from './enums';
|
|
17
18
|
import type {
|
|
@@ -29,6 +30,7 @@ type IVSPlayerProps = {
|
|
|
29
30
|
testID?: string;
|
|
30
31
|
ref: any;
|
|
31
32
|
muted?: boolean;
|
|
33
|
+
loop?: boolean;
|
|
32
34
|
liveLowLatency?: boolean;
|
|
33
35
|
playbackRate?: number;
|
|
34
36
|
streamUrl?: string;
|
|
@@ -78,6 +80,7 @@ type Props = {
|
|
|
78
80
|
testID?: string;
|
|
79
81
|
paused?: boolean;
|
|
80
82
|
muted?: boolean;
|
|
83
|
+
loop?: boolean;
|
|
81
84
|
autoplay?: boolean;
|
|
82
85
|
streamUrl?: string;
|
|
83
86
|
liveLowLatency?: boolean;
|
|
@@ -124,6 +127,7 @@ const IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(
|
|
|
124
127
|
streamUrl,
|
|
125
128
|
paused,
|
|
126
129
|
muted,
|
|
130
|
+
loop = false,
|
|
127
131
|
resizeMode,
|
|
128
132
|
autoplay = true,
|
|
129
133
|
liveLowLatency,
|
|
@@ -184,6 +188,15 @@ const IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(
|
|
|
184
188
|
);
|
|
185
189
|
}, []);
|
|
186
190
|
|
|
191
|
+
const setOrigin = useCallback((value) => {
|
|
192
|
+
UIManager.dispatchViewManagerCommand(
|
|
193
|
+
findNodeHandle(mediaPlayerRef.current),
|
|
194
|
+
|
|
195
|
+
UIManager.getViewManagerConfig(VIEW_NAME).Commands.setOrigin,
|
|
196
|
+
[value]
|
|
197
|
+
);
|
|
198
|
+
}, []);
|
|
199
|
+
|
|
187
200
|
const togglePip = useCallback(() => {
|
|
188
201
|
UIManager.dispatchViewManagerCommand(
|
|
189
202
|
findNodeHandle(mediaPlayerRef.current),
|
|
@@ -210,9 +223,10 @@ const IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(
|
|
|
210
223
|
play,
|
|
211
224
|
pause,
|
|
212
225
|
seekTo,
|
|
226
|
+
setOrigin,
|
|
213
227
|
togglePip,
|
|
214
228
|
}),
|
|
215
|
-
[play, pause, seekTo, togglePip]
|
|
229
|
+
[play, pause, seekTo, setOrigin, togglePip]
|
|
216
230
|
);
|
|
217
231
|
|
|
218
232
|
const onSeekHandler = (
|
|
@@ -249,10 +263,9 @@ const IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(
|
|
|
249
263
|
duration: number | null;
|
|
250
264
|
}>
|
|
251
265
|
) => {
|
|
252
|
-
if (
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
pause();
|
|
266
|
+
if (Platform.OS === 'android') {
|
|
267
|
+
const shouldAutoPlay = autoplay && !paused;
|
|
268
|
+
shouldAutoPlay ? play() : pause();
|
|
256
269
|
}
|
|
257
270
|
|
|
258
271
|
const { duration } = event.nativeEvent;
|
|
@@ -323,6 +336,7 @@ const IVSPlayerContainer = React.forwardRef<IVSPlayerRef, Props>(
|
|
|
323
336
|
<IVSPlayer
|
|
324
337
|
testID="IVSPlayer"
|
|
325
338
|
muted={muted}
|
|
339
|
+
loop={loop}
|
|
326
340
|
liveLowLatency={liveLowLatency}
|
|
327
341
|
style={styles.mediaPlayer}
|
|
328
342
|
ref={mediaPlayerRef}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { render, fireEvent } from '@testing-library/react-native';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { UIManager } from 'react-native';
|
|
3
|
+
import { Platform, UIManager } from 'react-native';
|
|
4
4
|
import type { IVSPlayerRef } from '../types';
|
|
5
5
|
|
|
6
6
|
import IVSPlayer from '../IVSPlayer';
|
|
@@ -18,6 +18,7 @@ jest.mock('react-native', () => {
|
|
|
18
18
|
play: 1,
|
|
19
19
|
pause: 2,
|
|
20
20
|
seekTo: 3,
|
|
21
|
+
setOrigin: 4,
|
|
21
22
|
togglePip: undefined,
|
|
22
23
|
},
|
|
23
24
|
};
|
|
@@ -226,8 +227,19 @@ test('Using togglePip on ref calls togglePip on native component', async () => {
|
|
|
226
227
|
expect(mockCommandFn).toHaveBeenCalledTimes(2);
|
|
227
228
|
});
|
|
228
229
|
|
|
230
|
+
test('Using setOrigin on ref calls setOrigin on native component', async () => {
|
|
231
|
+
const mockCommandFn = jest.fn();
|
|
232
|
+
const ref = React.createRef<IVSPlayerRef>();
|
|
233
|
+
|
|
234
|
+
render(<IVSPlayer streamUrl={URL} ref={ref} />);
|
|
235
|
+
|
|
236
|
+
UIManager.dispatchViewManagerCommand = mockCommandFn;
|
|
237
|
+
ref.current?.setOrigin('Access-Control-Allow-Origin');
|
|
238
|
+
});
|
|
239
|
+
|
|
229
240
|
test('Autoplay when onLoad', async () => {
|
|
230
241
|
const mockCommandFn = jest.fn();
|
|
242
|
+
Platform.OS = 'android';
|
|
231
243
|
|
|
232
244
|
const { findByTestId } = render(<IVSPlayer streamUrl={URL} />);
|
|
233
245
|
UIManager.dispatchViewManagerCommand = mockCommandFn;
|
package/src/types.js.flow
CHANGED