react-native-spalla-player 0.8.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/spallaplayer/SpallaPlayerModule.kt +36 -3
- package/android/src/main/java/com/spallaplayer/SpallaPlayerViewManager.kt +22 -7
- package/ios/RNSpallaPlayer.m +14 -0
- package/ios/SpallaPlayerWrapper.swift +15 -1
- package/lib/commonjs/index.js +3 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +3 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +12 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +12 -1
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native-spalla-player.podspec +1 -1
- package/src/index.tsx +21 -2
package/README.md
CHANGED
|
@@ -79,6 +79,16 @@ const [subtitle, setSubtitle] = React.useState<String | null>('pt-br');
|
|
|
79
79
|
case 'subtitlesAvailable':
|
|
80
80
|
console.log('subtitlesAvailable', nativeEvent.subtitles);
|
|
81
81
|
break;
|
|
82
|
+
case 'playbackRateSelected':
|
|
83
|
+
setPlaybackRate(nativeEvent.rate);
|
|
84
|
+
break;
|
|
85
|
+
case 'metadataLoaded':
|
|
86
|
+
console.log(
|
|
87
|
+
'metadataLoaded',
|
|
88
|
+
nativeEvent.isLive,
|
|
89
|
+
nativeEvent.duration
|
|
90
|
+
);
|
|
91
|
+
break;
|
|
82
92
|
default:
|
|
83
93
|
console.log('event', nativeEvent.event);
|
|
84
94
|
}
|
|
@@ -113,6 +123,7 @@ const [subtitle, setSubtitle] = React.useState<String | null>('pt-br');
|
|
|
113
123
|
| **`startTime`** | number | time to start the video in seconds (defaults to 0 = start of the video)
|
|
114
124
|
| **`onPlayerEvent`**| callback | Function that will be called with player events
|
|
115
125
|
| **`subtitle`** | string | subtitle to enable. Null will hide subtitles
|
|
126
|
+
| **`playbackRate`** | number | Playback speed. Allowed values are 0.5, 1.0, 1.5 and 2.0
|
|
116
127
|
|
|
117
128
|
## Imperative Methods
|
|
118
129
|
|
package/android/build.gradle
CHANGED
|
@@ -104,7 +104,7 @@ dependencies {
|
|
|
104
104
|
implementation "com.facebook.react:react-native:+"
|
|
105
105
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
106
106
|
implementation "androidx.mediarouter:mediarouter:1.2.0"
|
|
107
|
-
implementation "stream.spalla:spalla-android-sdk:1.
|
|
107
|
+
implementation "stream.spalla:spalla-android-sdk:1.8.0"
|
|
108
108
|
implementation "com.google.android.gms:play-services-cast-framework:21.3.0"
|
|
109
109
|
}
|
|
110
110
|
|
|
@@ -39,8 +39,23 @@ class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
|
39
39
|
|
|
40
40
|
@ReactMethod
|
|
41
41
|
fun play(tag: Int) {
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
43
|
+
val uiManager = UIManagerHelper.getUIManager(_reactContext, UIManagerType.FABRIC)
|
|
44
|
+
if (uiManager is UIManager) {
|
|
45
|
+
uiManager.resolveView(tag)?.let { view ->
|
|
46
|
+
if (view is SpallaPlayerView) {
|
|
47
|
+
view.play()
|
|
48
|
+
} else {
|
|
49
|
+
throw ClassCastException(
|
|
50
|
+
"Cannot play: view with tag #$tag is not a SpallaPlayerView"
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
val uiManager: UIManagerModule? =
|
|
57
|
+
_reactContext.getNativeModule(UIManagerModule::class.java)
|
|
58
|
+
uiManager?.prependUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
|
|
44
59
|
val playerView = nativeViewHierarchyManager.resolveView(tag)
|
|
45
60
|
if (playerView is SpallaPlayerView) {
|
|
46
61
|
playerView.play()
|
|
@@ -53,11 +68,11 @@ class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
|
53
68
|
)
|
|
54
69
|
}
|
|
55
70
|
}
|
|
71
|
+
}
|
|
56
72
|
}
|
|
57
73
|
|
|
58
74
|
@ReactMethod
|
|
59
75
|
fun pause(tag: Int) {
|
|
60
|
-
|
|
61
76
|
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
62
77
|
val uiManager = UIManagerHelper.getUIManager(_reactContext, UIManagerType.FABRIC)
|
|
63
78
|
if (uiManager is UIManager) {
|
|
@@ -128,6 +143,24 @@ class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
|
128
143
|
}
|
|
129
144
|
}
|
|
130
145
|
|
|
146
|
+
@ReactMethod
|
|
147
|
+
fun selectPlaybackRate(tag: Int, rate: Double) {
|
|
148
|
+
_reactContext.getNativeModule(UIManagerModule::class.java)!!
|
|
149
|
+
.prependUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
|
|
150
|
+
val playerView = nativeViewHierarchyManager.resolveView(tag)
|
|
151
|
+
if (playerView is SpallaPlayerView) {
|
|
152
|
+
playerView.selectPlaybackRate(rate)
|
|
153
|
+
} else {
|
|
154
|
+
throw ClassCastException(
|
|
155
|
+
String.format(
|
|
156
|
+
"Cannot play: view with tag #%d is not a SpallaPplayerView",
|
|
157
|
+
tag
|
|
158
|
+
)
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
131
164
|
@ReactMethod
|
|
132
165
|
fun initialize(token: String, applicationId: String?) {
|
|
133
166
|
SpallaSDK.initialize(_reactContext, token)
|
|
@@ -27,6 +27,7 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
27
27
|
private var startTime: Double? = null
|
|
28
28
|
private var subtitle: String? = null
|
|
29
29
|
private var loadTimer: Timer? = null
|
|
30
|
+
private var playbackRate: Double = 1.0
|
|
30
31
|
|
|
31
32
|
override fun getName() = "RNSpallaPlayer"
|
|
32
33
|
|
|
@@ -85,6 +86,14 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
85
86
|
_playerView?.selectSubtitle(subtitle)
|
|
86
87
|
}
|
|
87
88
|
|
|
89
|
+
@ReactProp(name = "playbackRate")
|
|
90
|
+
fun setPlaybackRate(view: SpallaPlayerView, playbackRate: Double) {
|
|
91
|
+
if(playbackRate > 0) {
|
|
92
|
+
this.playbackRate = playbackRate
|
|
93
|
+
_playerView?.selectPlaybackRate(playbackRate)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
88
97
|
private fun checkAndLoadPlayer(view: SpallaPlayerView) {
|
|
89
98
|
if (contentId != null && startTime != null) {
|
|
90
99
|
view.load(contentId!!, false, true, startTime!!)
|
|
@@ -141,6 +150,19 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
141
150
|
map.putString("event", "subtitleSelected")
|
|
142
151
|
map.putString("subtitle", spallaPlayerEvent.subtitle)
|
|
143
152
|
}
|
|
153
|
+
is MetadataLoaded -> {
|
|
154
|
+
map.putString("event", "metadataLoaded")
|
|
155
|
+
map.putBoolean("isLive", spallaPlayerEvent.metadata.isLive)
|
|
156
|
+
map.putDouble("duration", spallaPlayerEvent.metadata.duration)
|
|
157
|
+
|
|
158
|
+
// make sure current playback rate is applied if set initially
|
|
159
|
+
_playerView?.selectPlaybackRate(playbackRate)
|
|
160
|
+
}
|
|
161
|
+
is PlaybackRateSelected -> {
|
|
162
|
+
map.putString("event", "playbackRateSelected")
|
|
163
|
+
map.putDouble("rate", spallaPlayerEvent.rate)
|
|
164
|
+
}
|
|
165
|
+
|
|
144
166
|
}
|
|
145
167
|
_playerView?.let { player ->
|
|
146
168
|
_reactContext?.getJSModule(RCTEventEmitter::class.java)?.receiveEvent(
|
|
@@ -151,11 +173,4 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
151
173
|
}
|
|
152
174
|
}
|
|
153
175
|
|
|
154
|
-
|
|
155
|
-
// Expose a method to set the current subtitle track
|
|
156
|
-
fun setSubtitleTrack(view: SpallaPlayerView, trackId: String) {
|
|
157
|
-
//check if current trackId exists
|
|
158
|
-
|
|
159
|
-
//view.setSubtitleTrack(trackId)
|
|
160
|
-
}
|
|
161
176
|
}
|
package/ios/RNSpallaPlayer.m
CHANGED
|
@@ -15,6 +15,8 @@ RCT_EXPORT_VIEW_PROPERTY(startTime, NSNumber)
|
|
|
15
15
|
|
|
16
16
|
RCT_EXPORT_VIEW_PROPERTY(subtitle, NSString)
|
|
17
17
|
|
|
18
|
+
RCT_EXPORT_VIEW_PROPERTY(playbackRate, NSNumber)
|
|
19
|
+
|
|
18
20
|
RCT_EXPORT_METHOD(play: (nonnull NSNumber *) reactTag {
|
|
19
21
|
|
|
20
22
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
@@ -65,6 +67,18 @@ RCT_EXPORT_METHOD(selectSubtitle: (nonnull NSNumber *) reactTag subtitle:(NSStri
|
|
|
65
67
|
}];
|
|
66
68
|
}
|
|
67
69
|
|
|
70
|
+
RCT_EXPORT_METHOD(selectPlaybackRate: (nonnull NSNumber *) reactTag rate:(NSNumber *)rate) {
|
|
71
|
+
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
72
|
+
UIView *view = viewRegistry[reactTag];
|
|
73
|
+
if (!view || ![view isKindOfClass:[SpallaPlayerWrapper class]]) {
|
|
74
|
+
RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
|
|
75
|
+
return;
|
|
76
|
+
} else {
|
|
77
|
+
[(SpallaPlayerWrapper *)view selectPlaybackRate: rate.doubleValue];
|
|
78
|
+
}
|
|
79
|
+
}];
|
|
80
|
+
}
|
|
81
|
+
|
|
68
82
|
RCT_EXPORT_METHOD(initialize: (nonnull NSString *) token: (NSString *) applicationId) {
|
|
69
83
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
70
84
|
[SpallaPlayerWrapper initializeWithToken: token applicationId: applicationId];
|
|
@@ -49,6 +49,12 @@ import SpallaSDK
|
|
|
49
49
|
viewController.selectSubtitle(subtitle: subtitle)
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
+
|
|
53
|
+
@objc var playbackRate: NSNumber = 1.0 {
|
|
54
|
+
didSet {
|
|
55
|
+
viewController.setPlaybackRate(rate: playbackRate.doubleValue)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
52
58
|
|
|
53
59
|
@objc var onPlayerEvent: RCTBubblingEventBlock?
|
|
54
60
|
|
|
@@ -84,7 +90,7 @@ import SpallaSDK
|
|
|
84
90
|
|
|
85
91
|
func setupPlayer() {
|
|
86
92
|
if let contentId {
|
|
87
|
-
viewController.setup(with: contentId,
|
|
93
|
+
viewController.setup(with: contentId, hideUI: hideUI, startTime: startTime.doubleValue, subtitle: subtitle)
|
|
88
94
|
}
|
|
89
95
|
}
|
|
90
96
|
|
|
@@ -104,6 +110,10 @@ import SpallaSDK
|
|
|
104
110
|
viewController.selectSubtitle(subtitle: subtitle)
|
|
105
111
|
}
|
|
106
112
|
|
|
113
|
+
@objc public func selectPlaybackRate(_ rate: Double) {
|
|
114
|
+
viewController.setPlaybackRate(rate: rate)
|
|
115
|
+
}
|
|
116
|
+
|
|
107
117
|
private func updateMutedState() {
|
|
108
118
|
viewController.mute()
|
|
109
119
|
if muted {
|
|
@@ -154,6 +164,10 @@ extension SpallaPlayerWrapper: SpallaPlayerListener {
|
|
|
154
164
|
onPlayerEvent(["event": "subtitlesAvailable", "subtitles": subtitles])
|
|
155
165
|
case .subtitleSelected(let subtitle):
|
|
156
166
|
onPlayerEvent(["event": "subtitleSelected", "subtitle": subtitle != nil ? subtitle! : NSNull()])
|
|
167
|
+
case .metadataLoaded(let metadata):
|
|
168
|
+
onPlayerEvent(["event": "metadataLoaded", "isLive": metadata.isLive, "duration": metadata.duration])
|
|
169
|
+
case .playbackRateChanged(let rate):
|
|
170
|
+
onPlayerEvent(["event": "playbackRateSelected", "rate": rate])
|
|
157
171
|
@unknown default:
|
|
158
172
|
break
|
|
159
173
|
}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -42,13 +42,15 @@ class SpallaPlayer extends _react.default.Component {
|
|
|
42
42
|
render() {
|
|
43
43
|
const {
|
|
44
44
|
style,
|
|
45
|
-
startTime
|
|
45
|
+
startTime,
|
|
46
|
+
playbackRate
|
|
46
47
|
} = this.props;
|
|
47
48
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(RNSpallaPlayer, {
|
|
48
49
|
...this.props,
|
|
49
50
|
ref: this._setRef,
|
|
50
51
|
style: style,
|
|
51
52
|
startTime: startTime ?? 0,
|
|
53
|
+
playbackRate: playbackRate ?? 1.0,
|
|
52
54
|
children: this.props.children
|
|
53
55
|
});
|
|
54
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_jsxRuntime","_CastButton","e","__esModule","default","RNSpallaPlayer","requireNativeComponent","RNSpallaPlayerModule","NativeModules","play","ref","handle","findNodeHandle","exports","pause","seekTo","time","SpallaPlayer","React","Component","_player","_setRef","render","style","startTime","props","jsx","children","initialize","token","applicationId","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAKsB,IAAAE,WAAA,GAAAF,OAAA;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_jsxRuntime","_CastButton","e","__esModule","default","RNSpallaPlayer","requireNativeComponent","RNSpallaPlayerModule","NativeModules","play","ref","handle","findNodeHandle","exports","pause","seekTo","time","SpallaPlayer","React","Component","_player","_setRef","render","style","startTime","playbackRate","props","jsx","children","initialize","token","applicationId","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAKsB,IAAAE,WAAA,GAAAF,OAAA;AA0ItB,IAAAG,WAAA,GAAAJ,sBAAA,CAAAC,OAAA;AAAsE,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AA7HtE,MAAMG,cAAc,GAClB,IAAAC,mCAAsB,EAAsB,gBAAgB,CAAC;AAE/D,MAAMC,oBAAoB,GAAGC,0BAAa,CAACH,cAAc;AAkElD,MAAMI,IAAI,GAAIC,GAAQ,IAAK;EAChC,MAAMC,MAAM,GAAG,IAAAC,2BAAc,EAACF,GAAG,CAAC;EAClCH,oBAAoB,CAACE,IAAI,CAACE,MAAM,CAAC;AACnC,CAAC;AAACE,OAAA,CAAAJ,IAAA,GAAAA,IAAA;AAEK,MAAMK,KAAK,GAAIJ,GAAQ,IAAK;EACjC,MAAMC,MAAM,GAAG,IAAAC,2BAAc,EAACF,GAAG,CAAC;EAClCH,oBAAoB,CAACO,KAAK,CAACH,MAAM,CAAC;AACpC,CAAC;AAACE,OAAA,CAAAC,KAAA,GAAAA,KAAA;AAEK,MAAMC,MAAM,GAAGA,CAACL,GAAQ,EAAEM,IAAY,KAAK;EAChD,MAAML,MAAM,GAAG,IAAAC,2BAAc,EAACF,GAAG,CAAC;EAClCH,oBAAoB,CAACQ,MAAM,CAACJ,MAAM,EAAEK,IAAI,CAAC;AAC3C,CAAC;;AAED;AAAAH,OAAA,CAAAE,MAAA,GAAAA,MAAA;AAEA,MAAME,YAAY,SAASC,cAAK,CAACC,SAAS,CAAQ;EAChDC,OAAO,GAAG,IAAI;EAEdC,OAAO,GAAIX,GAAQ,IAAK;IACtB,IAAI,CAACU,OAAO,GAAGV,GAAG;EACpB,CAAC;EAEDY,MAAMA,CAAA,EAAG;IACP,MAAM;MAAEC,KAAK;MAAEC,SAAS;MAAEC;IAAa,CAAC,GAAG,IAAI,CAACC,KAAK;IAErD,oBACE,IAAA1B,WAAA,CAAA2B,GAAA,EAACtB,cAAc;MAAA,GACT,IAAI,CAACqB,KAAK;MACdhB,GAAG,EAAE,IAAI,CAACW,OAAQ;MAClBE,KAAK,EAAEA,KAAM;MACbC,SAAS,EAAEA,SAAS,IAAI,CAAE;MAC1BC,YAAY,EAAEA,YAAY,IAAI,GAAI;MAAAG,QAAA,EAEjC,IAAI,CAACF,KAAK,CAACE;IAAQ,CACN,CAAC;EAErB;EAEAnB,IAAI,GAAGA,CAAA,KAAM;IACX,MAAME,MAAM,GAAG,IAAAC,2BAAc,EAAC,IAAI,CAACQ,OAAO,CAAC;IAC3Cb,oBAAoB,CAACE,IAAI,CAACE,MAAM,CAAC;EACnC,CAAC;EAEDG,KAAK,GAAGA,CAAA,KAAM;IACZ,MAAMH,MAAM,GAAG,IAAAC,2BAAc,EAAC,IAAI,CAACQ,OAAO,CAAC;IAC3Cb,oBAAoB,CAACO,KAAK,CAACH,MAAM,CAAC;EACpC,CAAC;AACH;AAEO,MAAMkB,UAAU,GAAGA,CAACC,KAAa,EAAEC,aAA4B,KAAK;EACzExB,oBAAoB,CAACsB,UAAU,CAACC,KAAK,EAAEC,aAAa,CAAC;AACvD,CAAC;AAAClB,OAAA,CAAAgB,UAAA,GAAAA,UAAA;AAAA,IAAAG,QAAA,GAAAnB,OAAA,CAAAT,OAAA,GAEaa,YAAY","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -28,13 +28,15 @@ class SpallaPlayer extends React.Component {
|
|
|
28
28
|
render() {
|
|
29
29
|
const {
|
|
30
30
|
style,
|
|
31
|
-
startTime
|
|
31
|
+
startTime,
|
|
32
|
+
playbackRate
|
|
32
33
|
} = this.props;
|
|
33
34
|
return /*#__PURE__*/_jsx(RNSpallaPlayer, {
|
|
34
35
|
...this.props,
|
|
35
36
|
ref: this._setRef,
|
|
36
37
|
style: style,
|
|
37
38
|
startTime: startTime ?? 0,
|
|
39
|
+
playbackRate: playbackRate ?? 1.0,
|
|
38
40
|
children: this.props.children
|
|
39
41
|
});
|
|
40
42
|
}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","requireNativeComponent","NativeModules","findNodeHandle","jsx","_jsx","RNSpallaPlayer","RNSpallaPlayerModule","play","ref","handle","pause","seekTo","time","SpallaPlayer","Component","_player","_setRef","render","style","startTime","props","children","initialize","token","applicationId","default","SpallaCastButton"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,sBAAsB,EAEtBC,aAAa,EACbC,cAAc,QACT,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;
|
|
1
|
+
{"version":3,"names":["React","requireNativeComponent","NativeModules","findNodeHandle","jsx","_jsx","RNSpallaPlayer","RNSpallaPlayerModule","play","ref","handle","pause","seekTo","time","SpallaPlayer","Component","_player","_setRef","render","style","startTime","playbackRate","props","children","initialize","token","applicationId","default","SpallaCastButton"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,sBAAsB,EAEtBC,aAAa,EACbC,cAAc,QACT,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAatB,MAAMC,cAAc,GAClBL,sBAAsB,CAAsB,gBAAgB,CAAC;AAE/D,MAAMM,oBAAoB,GAAGL,aAAa,CAACI,cAAc;AAkEzD,OAAO,MAAME,IAAI,GAAIC,GAAQ,IAAK;EAChC,MAAMC,MAAM,GAAGP,cAAc,CAACM,GAAG,CAAC;EAClCF,oBAAoB,CAACC,IAAI,CAACE,MAAM,CAAC;AACnC,CAAC;AAED,OAAO,MAAMC,KAAK,GAAIF,GAAQ,IAAK;EACjC,MAAMC,MAAM,GAAGP,cAAc,CAACM,GAAG,CAAC;EAClCF,oBAAoB,CAACI,KAAK,CAACD,MAAM,CAAC;AACpC,CAAC;AAED,OAAO,MAAME,MAAM,GAAGA,CAACH,GAAQ,EAAEI,IAAY,KAAK;EAChD,MAAMH,MAAM,GAAGP,cAAc,CAACM,GAAG,CAAC;EAClCF,oBAAoB,CAACK,MAAM,CAACF,MAAM,EAAEG,IAAI,CAAC;AAC3C,CAAC;;AAED;;AAEA,MAAMC,YAAY,SAASd,KAAK,CAACe,SAAS,CAAQ;EAChDC,OAAO,GAAG,IAAI;EAEdC,OAAO,GAAIR,GAAQ,IAAK;IACtB,IAAI,CAACO,OAAO,GAAGP,GAAG;EACpB,CAAC;EAEDS,MAAMA,CAAA,EAAG;IACP,MAAM;MAAEC,KAAK;MAAEC,SAAS;MAAEC;IAAa,CAAC,GAAG,IAAI,CAACC,KAAK;IAErD,oBACEjB,IAAA,CAACC,cAAc;MAAA,GACT,IAAI,CAACgB,KAAK;MACdb,GAAG,EAAE,IAAI,CAACQ,OAAQ;MAClBE,KAAK,EAAEA,KAAM;MACbC,SAAS,EAAEA,SAAS,IAAI,CAAE;MAC1BC,YAAY,EAAEA,YAAY,IAAI,GAAI;MAAAE,QAAA,EAEjC,IAAI,CAACD,KAAK,CAACC;IAAQ,CACN,CAAC;EAErB;EAEAf,IAAI,GAAGA,CAAA,KAAM;IACX,MAAME,MAAM,GAAGP,cAAc,CAAC,IAAI,CAACa,OAAO,CAAC;IAC3CT,oBAAoB,CAACC,IAAI,CAACE,MAAM,CAAC;EACnC,CAAC;EAEDC,KAAK,GAAGA,CAAA,KAAM;IACZ,MAAMD,MAAM,GAAGP,cAAc,CAAC,IAAI,CAACa,OAAO,CAAC;IAC3CT,oBAAoB,CAACI,KAAK,CAACD,MAAM,CAAC;EACpC,CAAC;AACH;AAEA,OAAO,MAAMc,UAAU,GAAGA,CAACC,KAAa,EAAEC,aAA4B,KAAK;EACzEnB,oBAAoB,CAACiB,UAAU,CAACC,KAAK,EAAEC,aAAa,CAAC;AACvD,CAAC;AAED,eAAeZ,YAAY;AAC3B,SAASa,OAAO,IAAIC,gBAAgB,QAAQ,4BAAyB","ignoreList":[]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type ViewStyle } from 'react-native';
|
|
3
|
+
type allowedPlaybackRates = 0.25 | 0.5 | 1.0 | 1.25 | 1.5 | 2.0;
|
|
3
4
|
interface PlayerEventTimeUpdate {
|
|
4
5
|
event: 'timeUpdate';
|
|
5
6
|
time: number;
|
|
@@ -16,6 +17,15 @@ interface PlayerEventSubtitleSelected {
|
|
|
16
17
|
event: 'subtitleSelected';
|
|
17
18
|
subtitle: String;
|
|
18
19
|
}
|
|
20
|
+
interface PlayerEventPlaybackRateSelected {
|
|
21
|
+
event: 'playbackRateSelected';
|
|
22
|
+
rate: allowedPlaybackRates;
|
|
23
|
+
}
|
|
24
|
+
interface PlayerEventMedataLoaded {
|
|
25
|
+
event: 'metadataLoaded';
|
|
26
|
+
isLive: boolean;
|
|
27
|
+
duration: number;
|
|
28
|
+
}
|
|
19
29
|
interface PlayerEvent {
|
|
20
30
|
event: 'play' | 'pause' | 'ended' | 'muted' | 'unmuted' | 'buffering' | 'playing';
|
|
21
31
|
}
|
|
@@ -28,8 +38,9 @@ interface Props {
|
|
|
28
38
|
autoplay?: boolean;
|
|
29
39
|
startTime?: number;
|
|
30
40
|
subtitle?: String | null;
|
|
41
|
+
playbackRate?: 0.25 | 0.5 | 1.0 | 1.25 | 1.5 | 2.0;
|
|
31
42
|
onPlayerEvent?: (event: {
|
|
32
|
-
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate | PlayerEventSubtitlesAvailable | PlayerEventSubtitleSelected;
|
|
43
|
+
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate | PlayerEventSubtitlesAvailable | PlayerEventSubtitleSelected | PlayerEventPlaybackRateSelected | PlayerEventMedataLoaded;
|
|
33
44
|
}) => void;
|
|
34
45
|
}
|
|
35
46
|
export declare const play: (ref: any) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,cAAc,CAAC;AAEtB,KAAK,oBAAoB,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAgBhE,UAAU,qBAAqB;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,yBAAyB;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,6BAA6B;IACrC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,UAAU,2BAA2B;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,+BAA+B;IACvC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,IAAI,EAAE,oBAAoB,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,KAAK,EACD,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,WAAW,GACX,SAAS,CAAC;CACf;AAED,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACnD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,WAAW,EACP,qBAAqB,GACrB,WAAW,GACX,yBAAyB,GACzB,6BAA6B,GAC7B,2BAA2B,GAC3B,+BAA+B,GAC/B,uBAAuB,CAAC;KAC7B,KAAK,IAAI,CAAC;CACZ;AAED,eAAO,MAAM,IAAI,QAAS,GAAG,SAG5B,CAAC;AAEF,eAAO,MAAM,KAAK,QAAS,GAAG,SAG7B,CAAC;AAEF,eAAO,MAAM,MAAM,QAAS,GAAG,QAAQ,MAAM,SAG5C,CAAC;AAIF,cAAM,YAAa,SAAQ,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IAC/C,OAAO,OAAQ;IAEf,OAAO,QAAS,GAAG,UAEjB;IAEF,MAAM;IAgBN,IAAI,aAGF;IAEF,KAAK,aAGH;CACH;AAED,eAAO,MAAM,UAAU,UAAW,MAAM,iBAAiB,MAAM,GAAG,IAAI,SAErE,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type ViewStyle } from 'react-native';
|
|
3
|
+
type allowedPlaybackRates = 0.25 | 0.5 | 1.0 | 1.25 | 1.5 | 2.0;
|
|
3
4
|
interface PlayerEventTimeUpdate {
|
|
4
5
|
event: 'timeUpdate';
|
|
5
6
|
time: number;
|
|
@@ -16,6 +17,15 @@ interface PlayerEventSubtitleSelected {
|
|
|
16
17
|
event: 'subtitleSelected';
|
|
17
18
|
subtitle: String;
|
|
18
19
|
}
|
|
20
|
+
interface PlayerEventPlaybackRateSelected {
|
|
21
|
+
event: 'playbackRateSelected';
|
|
22
|
+
rate: allowedPlaybackRates;
|
|
23
|
+
}
|
|
24
|
+
interface PlayerEventMedataLoaded {
|
|
25
|
+
event: 'metadataLoaded';
|
|
26
|
+
isLive: boolean;
|
|
27
|
+
duration: number;
|
|
28
|
+
}
|
|
19
29
|
interface PlayerEvent {
|
|
20
30
|
event: 'play' | 'pause' | 'ended' | 'muted' | 'unmuted' | 'buffering' | 'playing';
|
|
21
31
|
}
|
|
@@ -28,8 +38,9 @@ interface Props {
|
|
|
28
38
|
autoplay?: boolean;
|
|
29
39
|
startTime?: number;
|
|
30
40
|
subtitle?: String | null;
|
|
41
|
+
playbackRate?: 0.25 | 0.5 | 1.0 | 1.25 | 1.5 | 2.0;
|
|
31
42
|
onPlayerEvent?: (event: {
|
|
32
|
-
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate | PlayerEventSubtitlesAvailable | PlayerEventSubtitleSelected;
|
|
43
|
+
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate | PlayerEventSubtitlesAvailable | PlayerEventSubtitleSelected | PlayerEventPlaybackRateSelected | PlayerEventMedataLoaded;
|
|
33
44
|
}) => void;
|
|
34
45
|
}
|
|
35
46
|
export declare const play: (ref: any) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,cAAc,CAAC;AAEtB,KAAK,oBAAoB,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAgBhE,UAAU,qBAAqB;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,yBAAyB;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,6BAA6B;IACrC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,UAAU,2BAA2B;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,+BAA+B;IACvC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,IAAI,EAAE,oBAAoB,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,KAAK,EACD,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,WAAW,GACX,SAAS,CAAC;CACf;AAED,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACnD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,WAAW,EACP,qBAAqB,GACrB,WAAW,GACX,yBAAyB,GACzB,6BAA6B,GAC7B,2BAA2B,GAC3B,+BAA+B,GAC/B,uBAAuB,CAAC;KAC7B,KAAK,IAAI,CAAC;CACZ;AAED,eAAO,MAAM,IAAI,QAAS,GAAG,SAG5B,CAAC;AAEF,eAAO,MAAM,KAAK,QAAS,GAAG,SAG7B,CAAC;AAEF,eAAO,MAAM,MAAM,QAAS,GAAG,QAAQ,MAAM,SAG5C,CAAC;AAIF,cAAM,YAAa,SAAQ,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IAC/C,OAAO,OAAQ;IAEf,OAAO,QAAS,GAAG,UAEjB;IAEF,MAAM;IAgBN,IAAI,aAGF;IAEF,KAAK,aAGH;CACH;AAED,eAAO,MAAM,UAAU,UAAW,MAAM,iBAAiB,MAAM,GAAG,IAAI,SAErE,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@ Pod::Spec.new do |s|
|
|
|
16
16
|
|
|
17
17
|
s.source_files = "ios/**/*.{h,m,mm,swift}"
|
|
18
18
|
|
|
19
|
-
s.dependency "SpallaSDK", "~> 0.
|
|
19
|
+
s.dependency "SpallaSDK", "~> 2.0.2"
|
|
20
20
|
|
|
21
21
|
# Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
|
|
22
22
|
# See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.
|
package/src/index.tsx
CHANGED
|
@@ -6,11 +6,14 @@ import {
|
|
|
6
6
|
findNodeHandle,
|
|
7
7
|
} from 'react-native';
|
|
8
8
|
|
|
9
|
+
type allowedPlaybackRates = 0.25 | 0.5 | 1.0 | 1.25 | 1.5 | 2.0;
|
|
10
|
+
|
|
9
11
|
interface RNSpallaPlayerProps {
|
|
10
12
|
children?: React.ReactNode;
|
|
11
13
|
style?: ViewStyle;
|
|
12
14
|
startTime: number;
|
|
13
15
|
subtitle?: String | null;
|
|
16
|
+
playbackRate?: allowedPlaybackRates;
|
|
14
17
|
ref?: (ref: any) => void;
|
|
15
18
|
}
|
|
16
19
|
|
|
@@ -38,6 +41,18 @@ interface PlayerEventSubtitleSelected {
|
|
|
38
41
|
event: 'subtitleSelected';
|
|
39
42
|
subtitle: String;
|
|
40
43
|
}
|
|
44
|
+
|
|
45
|
+
interface PlayerEventPlaybackRateSelected {
|
|
46
|
+
event: 'playbackRateSelected';
|
|
47
|
+
rate: allowedPlaybackRates;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface PlayerEventMedataLoaded {
|
|
51
|
+
event: 'metadataLoaded';
|
|
52
|
+
isLive: boolean;
|
|
53
|
+
duration: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
41
56
|
interface PlayerEvent {
|
|
42
57
|
event:
|
|
43
58
|
| 'play'
|
|
@@ -58,13 +73,16 @@ interface Props {
|
|
|
58
73
|
autoplay?: boolean;
|
|
59
74
|
startTime?: number;
|
|
60
75
|
subtitle?: String | null;
|
|
76
|
+
playbackRate?: 0.25 | 0.5 | 1.0 | 1.25 | 1.5 | 2.0;
|
|
61
77
|
onPlayerEvent?: (event: {
|
|
62
78
|
nativeEvent:
|
|
63
79
|
| PlayerEventTimeUpdate
|
|
64
80
|
| PlayerEvent
|
|
65
81
|
| PlayerEventDurationUpdate
|
|
66
82
|
| PlayerEventSubtitlesAvailable
|
|
67
|
-
| PlayerEventSubtitleSelected
|
|
83
|
+
| PlayerEventSubtitleSelected
|
|
84
|
+
| PlayerEventPlaybackRateSelected
|
|
85
|
+
| PlayerEventMedataLoaded;
|
|
68
86
|
}) => void;
|
|
69
87
|
}
|
|
70
88
|
|
|
@@ -93,7 +111,7 @@ class SpallaPlayer extends React.Component<Props> {
|
|
|
93
111
|
};
|
|
94
112
|
|
|
95
113
|
render() {
|
|
96
|
-
const { style, startTime } = this.props;
|
|
114
|
+
const { style, startTime, playbackRate } = this.props;
|
|
97
115
|
|
|
98
116
|
return (
|
|
99
117
|
<RNSpallaPlayer
|
|
@@ -101,6 +119,7 @@ class SpallaPlayer extends React.Component<Props> {
|
|
|
101
119
|
ref={this._setRef}
|
|
102
120
|
style={style}
|
|
103
121
|
startTime={startTime ?? 0}
|
|
122
|
+
playbackRate={playbackRate ?? 1.0}
|
|
104
123
|
>
|
|
105
124
|
{this.props.children}
|
|
106
125
|
</RNSpallaPlayer>
|