react-native-spalla-player 0.6.0 → 0.7.0
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/android/build.gradle +4 -3
- package/android/src/main/java/com/spallaplayer/SpallaPlayerModule.kt +44 -2
- package/android/src/main/java/com/spallaplayer/SpallaPlayerViewManager.kt +51 -2
- package/ios/RNSpallaPlayer.m +14 -0
- package/ios/SpallaPlayerWrapper.swift +16 -3
- 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 +10 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +10 -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 +22 -3
package/android/build.gradle
CHANGED
|
@@ -9,7 +9,7 @@ buildscript {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
dependencies {
|
|
12
|
-
classpath
|
|
12
|
+
classpath 'com.android.tools.build:gradle:8.7.3'
|
|
13
13
|
// noinspection DifferentKotlinGradleVersion
|
|
14
14
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
15
15
|
}
|
|
@@ -53,6 +53,7 @@ def supportsNamespace() {
|
|
|
53
53
|
return (major == 7 && minor >= 3) || major >= 8
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
|
|
56
57
|
android {
|
|
57
58
|
if (supportsNamespace()) {
|
|
58
59
|
namespace "com.spallaplayer"
|
|
@@ -69,7 +70,7 @@ android {
|
|
|
69
70
|
defaultConfig {
|
|
70
71
|
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
|
|
71
72
|
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
|
|
72
|
-
|
|
73
|
+
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
buildTypes {
|
|
@@ -103,7 +104,7 @@ dependencies {
|
|
|
103
104
|
implementation "com.facebook.react:react-native:+"
|
|
104
105
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
105
106
|
implementation "androidx.mediarouter:mediarouter:1.2.0"
|
|
106
|
-
implementation "stream.spalla:spalla-android-sdk:1.
|
|
107
|
+
implementation "stream.spalla:spalla-android-sdk:1.6.0"
|
|
107
108
|
implementation "com.google.android.gms:play-services-cast-framework:21.3.0"
|
|
108
109
|
}
|
|
109
110
|
|
|
@@ -4,11 +4,15 @@ import com.facebook.react.bridge.LifecycleEventListener
|
|
|
4
4
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
5
|
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
6
6
|
import com.facebook.react.bridge.ReactMethod
|
|
7
|
+
import com.facebook.react.bridge.UIManager
|
|
7
8
|
import com.facebook.react.uimanager.NativeViewHierarchyManager
|
|
9
|
+
import com.facebook.react.uimanager.UIManagerHelper
|
|
8
10
|
import com.facebook.react.uimanager.UIManagerModule
|
|
11
|
+
import com.facebook.react.uimanager.common.UIManagerType
|
|
9
12
|
import com.spalla.sdk.android.core.SpallaSDK
|
|
10
13
|
import com.spalla.sdk.android.core.player.view.SpallaPlayerView
|
|
11
14
|
|
|
15
|
+
|
|
12
16
|
class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
13
17
|
ReactContextBaseJavaModule(reactContext),
|
|
14
18
|
LifecycleEventListener {
|
|
@@ -27,6 +31,7 @@ class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
override fun onHostPause() {
|
|
34
|
+
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
override fun onHostDestroy() {
|
|
@@ -52,8 +57,24 @@ class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
|
52
57
|
|
|
53
58
|
@ReactMethod
|
|
54
59
|
fun pause(tag: Int) {
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
|
|
61
|
+
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
62
|
+
val uiManager = UIManagerHelper.getUIManager(_reactContext, UIManagerType.FABRIC)
|
|
63
|
+
if (uiManager is UIManager) {
|
|
64
|
+
uiManager.resolveView(tag)?.let { view ->
|
|
65
|
+
if (view is SpallaPlayerView) {
|
|
66
|
+
view.pause()
|
|
67
|
+
} else {
|
|
68
|
+
throw ClassCastException(
|
|
69
|
+
"Cannot pause: view with tag #$tag is not a SpallaPlayerView"
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
val uiManager: UIManagerModule? =
|
|
76
|
+
_reactContext.getNativeModule(UIManagerModule::class.java)
|
|
77
|
+
uiManager?.prependUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
|
|
57
78
|
val playerView = nativeViewHierarchyManager.resolveView(tag)
|
|
58
79
|
if (playerView is SpallaPlayerView) {
|
|
59
80
|
playerView.pause()
|
|
@@ -66,6 +87,9 @@ class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
|
66
87
|
)
|
|
67
88
|
}
|
|
68
89
|
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
69
93
|
}
|
|
70
94
|
|
|
71
95
|
@ReactMethod
|
|
@@ -86,6 +110,24 @@ class SpallaPlayerModule(reactContext: ReactApplicationContext) :
|
|
|
86
110
|
}
|
|
87
111
|
}
|
|
88
112
|
|
|
113
|
+
@ReactMethod
|
|
114
|
+
fun selectSubtitle(tag: Int, subtitle: String?) {
|
|
115
|
+
_reactContext.getNativeModule(UIManagerModule::class.java)!!
|
|
116
|
+
.prependUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
|
|
117
|
+
val playerView = nativeViewHierarchyManager.resolveView(tag)
|
|
118
|
+
if (playerView is SpallaPlayerView) {
|
|
119
|
+
playerView.selectSubtitle(subtitle)
|
|
120
|
+
} else {
|
|
121
|
+
throw ClassCastException(
|
|
122
|
+
String.format(
|
|
123
|
+
"Cannot play: view with tag #%d is not a SpallaPplayerView",
|
|
124
|
+
tag
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
89
131
|
@ReactMethod
|
|
90
132
|
fun initialize(token: String, applicationId: String?) {
|
|
91
133
|
SpallaSDK.initialize(_reactContext, token)
|
|
@@ -3,6 +3,9 @@ package com.spallaplayer
|
|
|
3
3
|
import android.util.Log
|
|
4
4
|
import com.facebook.react.bridge.Arguments
|
|
5
5
|
import com.facebook.react.bridge.ReactContext
|
|
6
|
+
import com.facebook.react.bridge.ReadableArray
|
|
7
|
+
import com.facebook.react.bridge.ReadableNativeArray
|
|
8
|
+
import com.facebook.react.bridge.WritableArray
|
|
6
9
|
import com.facebook.react.bridge.WritableMap
|
|
7
10
|
import com.facebook.react.common.MapBuilder
|
|
8
11
|
import com.facebook.react.uimanager.SimpleViewManager
|
|
@@ -13,6 +16,8 @@ import com.spalla.sdk.android.core.player.entities.SpallaPlayerEvent
|
|
|
13
16
|
import com.spalla.sdk.android.core.player.entities.SpallaPlayerEvent.*
|
|
14
17
|
import com.spalla.sdk.android.core.player.listeners.SpallaPlayerListener
|
|
15
18
|
import com.spalla.sdk.android.core.player.view.SpallaPlayerView
|
|
19
|
+
import java.util.Timer
|
|
20
|
+
import java.util.TimerTask
|
|
16
21
|
|
|
17
22
|
class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPlayerListener {
|
|
18
23
|
private var _playerView: SpallaPlayerView? = null
|
|
@@ -20,6 +25,8 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
20
25
|
|
|
21
26
|
private var contentId: String? = null
|
|
22
27
|
private var startTime: Double? = null
|
|
28
|
+
private var subtitle: String? = null
|
|
29
|
+
private var loadTimer: Timer? = null
|
|
23
30
|
|
|
24
31
|
override fun getName() = "RNSpallaPlayer"
|
|
25
32
|
|
|
@@ -69,7 +76,13 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
69
76
|
@ReactProp(name = "startTime")
|
|
70
77
|
fun setStartTime(view: SpallaPlayerView, startTime: Double) {
|
|
71
78
|
this.startTime = startTime
|
|
72
|
-
checkAndLoadPlayer(view)
|
|
79
|
+
//checkAndLoadPlayer(view)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@ReactProp(name = "subtitle")
|
|
83
|
+
fun setSubtitle(view: SpallaPlayerView, subtitle: String?) {
|
|
84
|
+
this.subtitle = subtitle
|
|
85
|
+
_playerView?.selectSubtitle(subtitle)
|
|
73
86
|
}
|
|
74
87
|
|
|
75
88
|
private fun checkAndLoadPlayer(view: SpallaPlayerView) {
|
|
@@ -78,6 +91,22 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
78
91
|
}
|
|
79
92
|
}
|
|
80
93
|
|
|
94
|
+
private fun startLoadTimer(view: SpallaPlayerView) {
|
|
95
|
+
// Cancel any existing timer
|
|
96
|
+
loadTimer?.cancel()
|
|
97
|
+
|
|
98
|
+
// Start a new timer to check if all required properties are set
|
|
99
|
+
loadTimer = Timer()
|
|
100
|
+
loadTimer?.schedule(object : TimerTask() {
|
|
101
|
+
override fun run() {
|
|
102
|
+
loadTimer?.cancel()
|
|
103
|
+
loadTimer = null
|
|
104
|
+
// Call view.load with the required properties
|
|
105
|
+
view.load(contentId!!, false, true, startTime!!, subtitle)
|
|
106
|
+
}
|
|
107
|
+
}, 300) // Delay of 200ms to allow all properties to be set
|
|
108
|
+
}
|
|
109
|
+
|
|
81
110
|
override fun onEvent( spallaPlayerEvent: SpallaPlayerEvent) {
|
|
82
111
|
val map: WritableMap = Arguments.createMap()
|
|
83
112
|
|
|
@@ -99,6 +128,19 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
99
128
|
map.putDouble("time", spallaPlayerEvent.currentTime)
|
|
100
129
|
}
|
|
101
130
|
Waiting -> map.putString("event", "buffering")
|
|
131
|
+
is SubtitlesAvailable -> {
|
|
132
|
+
map.putString("event", "subtitlesAvailable")
|
|
133
|
+
|
|
134
|
+
var subs = Arguments.createArray()
|
|
135
|
+
spallaPlayerEvent.subtitles.forEach {
|
|
136
|
+
subs.pushString(it)
|
|
137
|
+
}
|
|
138
|
+
map.putArray("subtitles", subs)
|
|
139
|
+
}
|
|
140
|
+
is SubtitleSelected -> {
|
|
141
|
+
map.putString("event", "subtitleSelected")
|
|
142
|
+
map.putString("subtitle", spallaPlayerEvent.subtitle)
|
|
143
|
+
}
|
|
102
144
|
}
|
|
103
145
|
_playerView?.let { player ->
|
|
104
146
|
_reactContext?.getJSModule(RCTEventEmitter::class.java)?.receiveEvent(
|
|
@@ -107,6 +149,13 @@ class RNSpallaPlayerManager() : SimpleViewManager<SpallaPlayerView>(), SpallaPla
|
|
|
107
149
|
map
|
|
108
150
|
)
|
|
109
151
|
}
|
|
110
|
-
|
|
111
152
|
}
|
|
153
|
+
|
|
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
|
+
}
|
|
112
161
|
}
|
package/ios/RNSpallaPlayer.m
CHANGED
|
@@ -13,6 +13,8 @@ RCT_EXPORT_VIEW_PROPERTY(hideUI, BOOL)
|
|
|
13
13
|
|
|
14
14
|
RCT_EXPORT_VIEW_PROPERTY(startTime, NSNumber)
|
|
15
15
|
|
|
16
|
+
RCT_EXPORT_VIEW_PROPERTY(subtitle, NSString)
|
|
17
|
+
|
|
16
18
|
RCT_EXPORT_METHOD(play: (nonnull NSNumber *) reactTag {
|
|
17
19
|
|
|
18
20
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
@@ -51,6 +53,18 @@ RCT_EXPORT_METHOD(seekTo: (nonnull NSNumber *) reactTag time:(float)time) {
|
|
|
51
53
|
}];
|
|
52
54
|
}
|
|
53
55
|
|
|
56
|
+
RCT_EXPORT_METHOD(selectSubtitle: (nonnull NSNumber *) reactTag subtitle:(NSString *)subtitle) {
|
|
57
|
+
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
58
|
+
UIView *view = viewRegistry[reactTag];
|
|
59
|
+
if (!view || ![view isKindOfClass:[SpallaPlayerWrapper class]]) {
|
|
60
|
+
RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
|
|
61
|
+
return;
|
|
62
|
+
} else {
|
|
63
|
+
[(SpallaPlayerWrapper *)view selectSubtitle: subtitle];
|
|
64
|
+
}
|
|
65
|
+
}];
|
|
66
|
+
}
|
|
67
|
+
|
|
54
68
|
RCT_EXPORT_METHOD(initialize: (nonnull NSString *) token: (NSString *) applicationId) {
|
|
55
69
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
56
70
|
[SpallaPlayerWrapper initializeWithToken: token applicationId: applicationId];
|
|
@@ -17,7 +17,6 @@ import SpallaSDK
|
|
|
17
17
|
didSet {
|
|
18
18
|
print("Content id: \(contentId ?? "nil")")
|
|
19
19
|
// hacky! this needs to be delayed a bit so hideUI and startTime can be set first when comming from RN
|
|
20
|
-
// ideally we should use a chromeless class
|
|
21
20
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [self] in
|
|
22
21
|
self.setupPlayer()
|
|
23
22
|
}
|
|
@@ -44,6 +43,13 @@ import SpallaSDK
|
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
45
|
|
|
46
|
+
@objc var subtitle: String? = nil {
|
|
47
|
+
didSet {
|
|
48
|
+
print("Subtitle set \(subtitle ?? "nil")")
|
|
49
|
+
viewController.selectSubtitle(subtitle: subtitle)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
47
53
|
@objc var onPlayerEvent: RCTBubblingEventBlock?
|
|
48
54
|
|
|
49
55
|
convenience public init() {
|
|
@@ -78,8 +84,7 @@ import SpallaSDK
|
|
|
78
84
|
|
|
79
85
|
func setupPlayer() {
|
|
80
86
|
if let contentId {
|
|
81
|
-
|
|
82
|
-
viewController.setup(with: contentId, isLive: false, hideUI: hideUI, startTime: startTime.doubleValue)
|
|
87
|
+
viewController.setup(with: contentId, isLive: false, hideUI: hideUI, startTime: startTime.doubleValue, subtitle: subtitle)
|
|
83
88
|
}
|
|
84
89
|
}
|
|
85
90
|
|
|
@@ -95,6 +100,10 @@ import SpallaSDK
|
|
|
95
100
|
viewController.seekTo(time: TimeInterval(time))
|
|
96
101
|
}
|
|
97
102
|
|
|
103
|
+
@objc public func selectSubtitle(_ subtitle: String?) {
|
|
104
|
+
viewController.selectSubtitle(subtitle: subtitle)
|
|
105
|
+
}
|
|
106
|
+
|
|
98
107
|
private func updateMutedState() {
|
|
99
108
|
viewController.mute()
|
|
100
109
|
if muted {
|
|
@@ -141,6 +150,10 @@ extension SpallaPlayerWrapper: SpallaPlayerListener {
|
|
|
141
150
|
onPlayerEvent(["event": "timeUpdate", "time": time])
|
|
142
151
|
case .waiting:
|
|
143
152
|
onPlayerEvent(["event": "buffering"])
|
|
153
|
+
case .subtitlesAvailable(let subtitles):
|
|
154
|
+
onPlayerEvent(["event": "subtitlesAvailable", "subtitles": subtitles])
|
|
155
|
+
case .subtitleSelected(let subtitle):
|
|
156
|
+
onPlayerEvent(["event": "subtitleSelected", "subtitle": subtitle != nil ? subtitle! : NSNull()])
|
|
144
157
|
@unknown default:
|
|
145
158
|
break
|
|
146
159
|
}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -41,12 +41,14 @@ class SpallaPlayer extends _react.default.Component {
|
|
|
41
41
|
};
|
|
42
42
|
render() {
|
|
43
43
|
const {
|
|
44
|
-
style
|
|
44
|
+
style,
|
|
45
|
+
startTime
|
|
45
46
|
} = this.props;
|
|
46
47
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(RNSpallaPlayer, {
|
|
47
48
|
...this.props,
|
|
48
49
|
ref: this._setRef,
|
|
49
50
|
style: style,
|
|
51
|
+
startTime: startTime ?? 0,
|
|
50
52
|
children: this.props.children
|
|
51
53
|
});
|
|
52
54
|
}
|
|
@@ -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","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","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;AAuHtB,IAAAG,WAAA,GAAAJ,sBAAA,CAAAC,OAAA;AAAsE,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AA7GtE,MAAMG,cAAc,GAClB,IAAAC,mCAAsB,EAAsB,gBAAgB,CAAC;AAE/D,MAAMC,oBAAoB,GAAGC,0BAAa,CAACH,cAAc;AAmDlD,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;IAAU,CAAC,GAAG,IAAI,CAACC,KAAK;IAEvC,oBACE,IAAAzB,WAAA,CAAA0B,GAAA,EAACrB,cAAc;MAAA,GACT,IAAI,CAACoB,KAAK;MACdf,GAAG,EAAE,IAAI,CAACW,OAAQ;MAClBE,KAAK,EAAEA,KAAM;MACbC,SAAS,EAAEA,SAAS,IAAI,CAAE;MAAAG,QAAA,EAEzB,IAAI,CAACF,KAAK,CAACE;IAAQ,CACN,CAAC;EAErB;EAEAlB,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,MAAMiB,UAAU,GAAGA,CAACC,KAAa,EAAEC,aAA4B,KAAK;EACzEvB,oBAAoB,CAACqB,UAAU,CAACC,KAAK,EAAEC,aAAa,CAAC;AACvD,CAAC;AAACjB,OAAA,CAAAe,UAAA,GAAAA,UAAA;AAAA,IAAAG,QAAA,GAAAlB,OAAA,CAAAT,OAAA,GAEaa,YAAY","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -27,12 +27,14 @@ class SpallaPlayer extends React.Component {
|
|
|
27
27
|
};
|
|
28
28
|
render() {
|
|
29
29
|
const {
|
|
30
|
-
style
|
|
30
|
+
style,
|
|
31
|
+
startTime
|
|
31
32
|
} = this.props;
|
|
32
33
|
return /*#__PURE__*/_jsx(RNSpallaPlayer, {
|
|
33
34
|
...this.props,
|
|
34
35
|
ref: this._setRef,
|
|
35
36
|
style: style,
|
|
37
|
+
startTime: startTime ?? 0,
|
|
36
38
|
children: this.props.children
|
|
37
39
|
});
|
|
38
40
|
}
|
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","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","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;AAUtB,MAAMC,cAAc,GAClBL,sBAAsB,CAAsB,gBAAgB,CAAC;AAE/D,MAAMM,oBAAoB,GAAGL,aAAa,CAACI,cAAc;AAmDzD,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;IAAU,CAAC,GAAG,IAAI,CAACC,KAAK;IAEvC,oBACEhB,IAAA,CAACC,cAAc;MAAA,GACT,IAAI,CAACe,KAAK;MACdZ,GAAG,EAAE,IAAI,CAACQ,OAAQ;MAClBE,KAAK,EAAEA,KAAM;MACbC,SAAS,EAAEA,SAAS,IAAI,CAAE;MAAAE,QAAA,EAEzB,IAAI,CAACD,KAAK,CAACC;IAAQ,CACN,CAAC;EAErB;EAEAd,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,MAAMa,UAAU,GAAGA,CAACC,KAAa,EAAEC,aAA4B,KAAK;EACzElB,oBAAoB,CAACgB,UAAU,CAACC,KAAK,EAAEC,aAAa,CAAC;AACvD,CAAC;AAED,eAAeX,YAAY;AAC3B,SAASY,OAAO,IAAIC,gBAAgB,QAAQ,4BAAyB","ignoreList":[]}
|
|
@@ -8,6 +8,14 @@ interface PlayerEventDurationUpdate {
|
|
|
8
8
|
event: 'durationUpdate';
|
|
9
9
|
duration: number;
|
|
10
10
|
}
|
|
11
|
+
interface PlayerEventSubtitlesAvailable {
|
|
12
|
+
event: 'subtitlesAvailable';
|
|
13
|
+
subtitles: Array<String>;
|
|
14
|
+
}
|
|
15
|
+
interface PlayerEventSubtitleSelected {
|
|
16
|
+
event: 'subtitleSelected';
|
|
17
|
+
subtitle: String;
|
|
18
|
+
}
|
|
11
19
|
interface PlayerEvent {
|
|
12
20
|
event: 'play' | 'pause' | 'ended' | 'muted' | 'unmuted' | 'buffering' | 'playing';
|
|
13
21
|
}
|
|
@@ -19,8 +27,9 @@ interface Props {
|
|
|
19
27
|
muted?: boolean;
|
|
20
28
|
autoplay?: boolean;
|
|
21
29
|
startTime?: number;
|
|
30
|
+
subtitle?: String | null;
|
|
22
31
|
onPlayerEvent?: (event: {
|
|
23
|
-
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate;
|
|
32
|
+
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate | PlayerEventSubtitlesAvailable | PlayerEventSubtitleSelected;
|
|
24
33
|
}) => void;
|
|
25
34
|
}
|
|
26
35
|
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,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;AACD,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,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,WAAW,EACP,qBAAqB,GACrB,WAAW,GACX,yBAAyB,GACzB,6BAA6B,GAC7B,2BAA2B,CAAC;KACjC,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;IAeN,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"}
|
|
@@ -8,6 +8,14 @@ interface PlayerEventDurationUpdate {
|
|
|
8
8
|
event: 'durationUpdate';
|
|
9
9
|
duration: number;
|
|
10
10
|
}
|
|
11
|
+
interface PlayerEventSubtitlesAvailable {
|
|
12
|
+
event: 'subtitlesAvailable';
|
|
13
|
+
subtitles: Array<String>;
|
|
14
|
+
}
|
|
15
|
+
interface PlayerEventSubtitleSelected {
|
|
16
|
+
event: 'subtitleSelected';
|
|
17
|
+
subtitle: String;
|
|
18
|
+
}
|
|
11
19
|
interface PlayerEvent {
|
|
12
20
|
event: 'play' | 'pause' | 'ended' | 'muted' | 'unmuted' | 'buffering' | 'playing';
|
|
13
21
|
}
|
|
@@ -19,8 +27,9 @@ interface Props {
|
|
|
19
27
|
muted?: boolean;
|
|
20
28
|
autoplay?: boolean;
|
|
21
29
|
startTime?: number;
|
|
30
|
+
subtitle?: String | null;
|
|
22
31
|
onPlayerEvent?: (event: {
|
|
23
|
-
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate;
|
|
32
|
+
nativeEvent: PlayerEventTimeUpdate | PlayerEvent | PlayerEventDurationUpdate | PlayerEventSubtitlesAvailable | PlayerEventSubtitleSelected;
|
|
24
33
|
}) => void;
|
|
25
34
|
}
|
|
26
35
|
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,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;AACD,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,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,WAAW,EACP,qBAAqB,GACrB,WAAW,GACX,yBAAyB,GACzB,6BAA6B,GAC7B,2BAA2B,CAAC;KACjC,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;IAeN,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", "~> 0.9.0"
|
|
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
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
interface RNSpallaPlayerProps {
|
|
10
10
|
children?: React.ReactNode;
|
|
11
11
|
style?: ViewStyle;
|
|
12
|
+
startTime: number;
|
|
13
|
+
subtitle?: String | null;
|
|
12
14
|
ref?: (ref: any) => void;
|
|
13
15
|
}
|
|
14
16
|
|
|
@@ -27,6 +29,15 @@ interface PlayerEventDurationUpdate {
|
|
|
27
29
|
duration: number;
|
|
28
30
|
}
|
|
29
31
|
|
|
32
|
+
interface PlayerEventSubtitlesAvailable {
|
|
33
|
+
event: 'subtitlesAvailable';
|
|
34
|
+
subtitles: Array<String>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface PlayerEventSubtitleSelected {
|
|
38
|
+
event: 'subtitleSelected';
|
|
39
|
+
subtitle: String;
|
|
40
|
+
}
|
|
30
41
|
interface PlayerEvent {
|
|
31
42
|
event:
|
|
32
43
|
| 'play'
|
|
@@ -46,11 +57,14 @@ interface Props {
|
|
|
46
57
|
muted?: boolean;
|
|
47
58
|
autoplay?: boolean;
|
|
48
59
|
startTime?: number;
|
|
60
|
+
subtitle?: String | null;
|
|
49
61
|
onPlayerEvent?: (event: {
|
|
50
62
|
nativeEvent:
|
|
51
63
|
| PlayerEventTimeUpdate
|
|
52
64
|
| PlayerEvent
|
|
53
|
-
| PlayerEventDurationUpdate
|
|
65
|
+
| PlayerEventDurationUpdate
|
|
66
|
+
| PlayerEventSubtitlesAvailable
|
|
67
|
+
| PlayerEventSubtitleSelected;
|
|
54
68
|
}) => void;
|
|
55
69
|
}
|
|
56
70
|
|
|
@@ -79,10 +93,15 @@ class SpallaPlayer extends React.Component<Props> {
|
|
|
79
93
|
};
|
|
80
94
|
|
|
81
95
|
render() {
|
|
82
|
-
const { style } = this.props;
|
|
96
|
+
const { style, startTime } = this.props;
|
|
83
97
|
|
|
84
98
|
return (
|
|
85
|
-
<RNSpallaPlayer
|
|
99
|
+
<RNSpallaPlayer
|
|
100
|
+
{...this.props}
|
|
101
|
+
ref={this._setRef}
|
|
102
|
+
style={style}
|
|
103
|
+
startTime={startTime ?? 0}
|
|
104
|
+
>
|
|
86
105
|
{this.props.children}
|
|
87
106
|
</RNSpallaPlayer>
|
|
88
107
|
);
|