@pigeonmal/react-native-video 7.0.0-beta.11 → 7.0.0-beta.13
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
CHANGED
|
@@ -31,6 +31,8 @@ Features:
|
|
|
31
31
|
- player.resetForReuse() stop playback and clear tracks
|
|
32
32
|
- player.progressEventInterval change the progress event interval
|
|
33
33
|
- bugfix: external subtitles in hls/dash
|
|
34
|
+
- bugfix: add langs to external subs
|
|
35
|
+
- bugfix: onloadstart
|
|
34
36
|
- nullable video player source : new VideoPlayer(undefined);
|
|
35
37
|
- TextTrack type replaced to PlayerTrack
|
|
36
38
|
- removed onTrackChange event
|
|
@@ -92,6 +92,7 @@ fun getSubtitlesConfiguration(
|
|
|
92
92
|
.setSelectionFlags(0) // C.SELECTION_FLAG_DEFAULT
|
|
93
93
|
.setRoleFlags(C.ROLE_FLAG_SUBTITLE)
|
|
94
94
|
.setLabel(subtitle.label)
|
|
95
|
+
.setLanguage(subtitle.language)
|
|
95
96
|
.build()
|
|
96
97
|
subtitlesConfiguration.add(subtitleConfig)
|
|
97
98
|
} catch (e: Exception) {
|
|
@@ -5,14 +5,13 @@ import androidx.media3.common.C
|
|
|
5
5
|
import androidx.media3.common.TrackSelectionOverride
|
|
6
6
|
import androidx.media3.common.util.UnstableApi
|
|
7
7
|
import androidx.media3.exoplayer.ExoPlayer
|
|
8
|
-
import com.margelo.nitro.video.HybridVideoPlayerSourceSpec
|
|
9
8
|
import com.margelo.nitro.video.PlayerTrack
|
|
10
9
|
import com.margelo.nitro.video.AllPlayerTracks
|
|
11
10
|
import com.margelo.nitro.video.VideoPlayerTrack
|
|
12
11
|
|
|
13
12
|
@UnstableApi
|
|
14
13
|
object TrackUtils {
|
|
15
|
-
fun getAvailableTextTracks(player: ExoPlayer
|
|
14
|
+
fun getAvailableTextTracks(player: ExoPlayer): Array<PlayerTrack> {
|
|
16
15
|
return Threading.runOnMainThreadSync {
|
|
17
16
|
val tracks = mutableListOf<PlayerTrack>()
|
|
18
17
|
val currentTracks = player.currentTracks
|
|
@@ -28,13 +27,9 @@ object TrackUtils {
|
|
|
28
27
|
val language = format.language
|
|
29
28
|
val isSelected = trackGroup.isTrackSelected(trackIndex)
|
|
30
29
|
|
|
31
|
-
val isExternal = trackId.startsWith("external-") == true
|
|
32
|
-
|
|
33
|
-
val finalTrackId = if (isExternal) "external-$globalTrackIndex" else trackId
|
|
34
|
-
|
|
35
30
|
tracks.add(
|
|
36
31
|
PlayerTrack(
|
|
37
|
-
id =
|
|
32
|
+
id = trackId,
|
|
38
33
|
label = label,
|
|
39
34
|
language = language,
|
|
40
35
|
selected = isSelected
|
|
@@ -75,12 +70,7 @@ object TrackUtils {
|
|
|
75
70
|
val currentTrackId = format.id ?: "track-$type-$globalTrackIndex"
|
|
76
71
|
//val label = format.label ?: "Unknown ${globalTrackIndex + 1}"
|
|
77
72
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
val finalTrackId =
|
|
81
|
-
if (isExternal) "external-$globalTrackIndex" else currentTrackId
|
|
82
|
-
|
|
83
|
-
if (finalTrackId == id) {
|
|
73
|
+
if (currentTrackId == id) {
|
|
84
74
|
// Enable this specific track
|
|
85
75
|
trackSelector.setTrackTypeDisabled(type, false)
|
|
86
76
|
trackSelector.setOverrideForType(
|
|
@@ -170,12 +160,8 @@ object TrackUtils {
|
|
|
170
160
|
val label = format.label ?: "Unknown ${globalTrackIndex + 1}"
|
|
171
161
|
val language = format.language
|
|
172
162
|
|
|
173
|
-
val isExternal = trackId.startsWith("external-") == true
|
|
174
|
-
|
|
175
|
-
val finalTrackId = if (isExternal) "external-$globalTrackIndex" else trackId
|
|
176
|
-
|
|
177
163
|
return@runOnMainThreadSync PlayerTrack(
|
|
178
|
-
id =
|
|
164
|
+
id = trackId,
|
|
179
165
|
label = label,
|
|
180
166
|
language = language,
|
|
181
167
|
selected = true
|
|
@@ -211,8 +197,6 @@ object TrackUtils {
|
|
|
211
197
|
val format = trackGroup.getTrackFormat(trackIndex)
|
|
212
198
|
|
|
213
199
|
val rawId = format.id ?: "track-${C.TRACK_TYPE_AUDIO}-$globalAudioIndex"
|
|
214
|
-
val isExternal = rawId.startsWith("external-")
|
|
215
|
-
val finalId = if (isExternal) "external-$globalAudioIndex" else rawId
|
|
216
200
|
|
|
217
201
|
val label = format.label ?: "Unknown ${globalAudioIndex + 1}"
|
|
218
202
|
val language = format.language
|
|
@@ -220,7 +204,7 @@ object TrackUtils {
|
|
|
220
204
|
|
|
221
205
|
audioTracks.add(
|
|
222
206
|
PlayerTrack(
|
|
223
|
-
id =
|
|
207
|
+
id = rawId,
|
|
224
208
|
label = label,
|
|
225
209
|
language = language,
|
|
226
210
|
selected = isSelected
|
|
@@ -235,8 +219,6 @@ object TrackUtils {
|
|
|
235
219
|
val format = trackGroup.getTrackFormat(trackIndex)
|
|
236
220
|
|
|
237
221
|
val rawId = format.id ?: "track-${C.TRACK_TYPE_TEXT}-$globalTextIndex"
|
|
238
|
-
val isExternal = rawId.startsWith("external-")
|
|
239
|
-
val finalId = if (isExternal) "external-$globalTextIndex" else rawId
|
|
240
222
|
|
|
241
223
|
val label = format.label ?: "Unknown ${globalTextIndex + 1}"
|
|
242
224
|
val language = format.language
|
|
@@ -244,7 +226,7 @@ object TrackUtils {
|
|
|
244
226
|
|
|
245
227
|
textTracks.add(
|
|
246
228
|
PlayerTrack(
|
|
247
|
-
id =
|
|
229
|
+
id = rawId,
|
|
248
230
|
label = label,
|
|
249
231
|
language = language,
|
|
250
232
|
selected = isSelected
|
|
@@ -260,8 +242,6 @@ object TrackUtils {
|
|
|
260
242
|
val format = trackGroup.getTrackFormat(trackIndex)
|
|
261
243
|
|
|
262
244
|
val rawId = format.id ?: "track-${C.TRACK_TYPE_VIDEO}-$globalVideoIndex"
|
|
263
|
-
val isExternal = rawId.startsWith("external-")
|
|
264
|
-
val finalId = if (isExternal) "external-$globalVideoIndex" else rawId
|
|
265
245
|
|
|
266
246
|
val label = format.label ?: "Unknown ${globalVideoIndex + 1}"
|
|
267
247
|
val language = format.language
|
|
@@ -274,7 +254,7 @@ object TrackUtils {
|
|
|
274
254
|
VideoPlayerTrack(
|
|
275
255
|
width = width,
|
|
276
256
|
height = height,
|
|
277
|
-
id =
|
|
257
|
+
id = rawId,
|
|
278
258
|
label = label,
|
|
279
259
|
language = language,
|
|
280
260
|
selected = isSelected
|
|
@@ -44,7 +44,7 @@ import kotlin.math.max
|
|
|
44
44
|
@UnstableApi
|
|
45
45
|
@DoNotStrip
|
|
46
46
|
class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
47
|
-
override var source: HybridVideoPlayerSourceSpec?
|
|
47
|
+
override var source: HybridVideoPlayerSourceSpec? = null
|
|
48
48
|
override var eventEmitter = HybridVideoPlayerEventEmitter()
|
|
49
49
|
set(value) {
|
|
50
50
|
if (field != value) {
|
|
@@ -74,7 +74,7 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
74
74
|
|
|
75
75
|
// Buffer Config
|
|
76
76
|
private var bufferConfig: BufferConfig? = null
|
|
77
|
-
get() = source?.config
|
|
77
|
+
get() = source?.config?.bufferConfig
|
|
78
78
|
|
|
79
79
|
// Time updates
|
|
80
80
|
private val progressHandler = Handler(Looper.getMainLooper())
|
|
@@ -261,18 +261,27 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
261
261
|
.setRenderersFactory(renderersFactory!!)
|
|
262
262
|
.build()
|
|
263
263
|
|
|
264
|
+
currentPlayerView?.get()?.player = player
|
|
265
|
+
|
|
264
266
|
loadedWithSource = true
|
|
265
267
|
|
|
266
268
|
player.addListener(playerListener)
|
|
267
269
|
player.addAnalyticsListener(analyticsListener)
|
|
268
270
|
|
|
269
|
-
|
|
271
|
+
setPlayerMediaSource(hybridSource)
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
fun setPlayerMediaSource(hybridSource: HybridVideoPlayerSource) {
|
|
275
|
+
val startPosition = hybridSource.config.startPosition
|
|
270
276
|
if (startPosition != null && startPosition > 0L) {
|
|
271
277
|
player.setMediaSource(hybridSource.mediaSource, startPosition)
|
|
272
278
|
} else {
|
|
273
279
|
player.setMediaSource(hybridSource.mediaSource)
|
|
274
280
|
}
|
|
281
|
+
}
|
|
275
282
|
|
|
283
|
+
fun preparePlayer(hybridSource: HybridVideoPlayerSource) {
|
|
284
|
+
player.prepare()
|
|
276
285
|
// Emit onLoadStart
|
|
277
286
|
val sourceType = if (hybridSource.uri.startsWith("http")) SourceType.NETWORK else SourceType.LOCAL
|
|
278
287
|
eventEmitter.onLoadStart(onLoadStartData(sourceType = sourceType, source = hybridSource))
|
|
@@ -282,9 +291,10 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
282
291
|
|
|
283
292
|
override fun initialize(): Promise<Unit> {
|
|
284
293
|
return Promise.async {
|
|
294
|
+
val hybridSource = source as? HybridVideoPlayerSource ?: throw PlayerError.InvalidSource
|
|
285
295
|
return@async runOnMainThreadSync {
|
|
286
296
|
initializePlayer()
|
|
287
|
-
|
|
297
|
+
preparePlayer(hybridSource)
|
|
288
298
|
}
|
|
289
299
|
}
|
|
290
300
|
}
|
|
@@ -295,7 +305,7 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
295
305
|
runOnMainThread {
|
|
296
306
|
if (source.config.initializeOnCreation == true) {
|
|
297
307
|
initializePlayer()
|
|
298
|
-
|
|
308
|
+
preparePlayer(source)
|
|
299
309
|
}
|
|
300
310
|
}
|
|
301
311
|
}
|
|
@@ -343,22 +353,19 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
343
353
|
initializePlayer()
|
|
344
354
|
} else {
|
|
345
355
|
renderersFactory?.setTextOffset((hybridSource.config.initialSubtitleDelay ?: 0L) * 1_000L)
|
|
346
|
-
|
|
347
|
-
if (startPosition != null && startPosition > 0L) {
|
|
348
|
-
player.setMediaSource(hybridSource.mediaSource, startPosition)
|
|
349
|
-
} else {
|
|
350
|
-
player.setMediaSource(hybridSource.mediaSource)
|
|
351
|
-
}
|
|
356
|
+
setPlayerMediaSource(hybridSource)
|
|
352
357
|
}
|
|
353
358
|
|
|
354
359
|
// Prepare player
|
|
355
|
-
|
|
360
|
+
preparePlayer(hybridSource)
|
|
356
361
|
}
|
|
357
362
|
}
|
|
358
363
|
}
|
|
359
364
|
|
|
360
365
|
override fun preload(): Promise<Unit> {
|
|
361
366
|
return Promise.async {
|
|
367
|
+
val hybridSource = source as? HybridVideoPlayerSource ?: throw PlayerError.InvalidSource
|
|
368
|
+
|
|
362
369
|
runOnMainThreadSync {
|
|
363
370
|
if (!loadedWithSource) {
|
|
364
371
|
initializePlayer()
|
|
@@ -368,7 +375,7 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
368
375
|
return@runOnMainThreadSync
|
|
369
376
|
}
|
|
370
377
|
|
|
371
|
-
|
|
378
|
+
preparePlayer(hybridSource)
|
|
372
379
|
}
|
|
373
380
|
}
|
|
374
381
|
}
|
|
@@ -492,9 +499,7 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
492
499
|
eventEmitter.onBuffer(false)
|
|
493
500
|
|
|
494
501
|
val allTracks = TrackUtils.getAllPlayerTracksInternal(player)
|
|
495
|
-
val selectedVideo: VideoPlayerTrack? =
|
|
496
|
-
allTracks.videos.firstOrNull { it.selected }
|
|
497
|
-
?: player.videoFormat?.let { format ->
|
|
502
|
+
val selectedVideo: VideoPlayerTrack? = player.videoFormat?.let { format ->
|
|
498
503
|
VideoPlayerTrack(
|
|
499
504
|
width = format.width.toDouble(),
|
|
500
505
|
height = format.height.toDouble(),
|
|
@@ -504,7 +509,7 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
504
509
|
selected = true,
|
|
505
510
|
language = null
|
|
506
511
|
)
|
|
507
|
-
}
|
|
512
|
+
} ?: allTracks.videos.firstOrNull { it.selected }
|
|
508
513
|
val width = selectedVideo?.width ?: 0.0
|
|
509
514
|
val height = selectedVideo?.height ?: 0.0
|
|
510
515
|
// val rotationDegrees = selectedVideoTrackFormat?.rotationDegrees ?: generalVideoFormat?.rotationDegrees
|
|
@@ -636,7 +641,7 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
636
641
|
// MARK: - Text Track Management
|
|
637
642
|
|
|
638
643
|
override fun getAvailableTextTracks(): Array<PlayerTrack> {
|
|
639
|
-
return TrackUtils.getAvailableTextTracks(player
|
|
644
|
+
return TrackUtils.getAvailableTextTracks(player)
|
|
640
645
|
}
|
|
641
646
|
|
|
642
647
|
override fun getAllPlayerTracks(): AllPlayerTracks {
|
|
@@ -653,6 +658,8 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
|
|
|
653
658
|
|
|
654
659
|
override fun resetForReuse() {
|
|
655
660
|
runOnMainThread {
|
|
661
|
+
stopProgressUpdates()
|
|
662
|
+
this.source = null
|
|
656
663
|
if (player.playbackState != Player.STATE_IDLE) {
|
|
657
664
|
player.stop()
|
|
658
665
|
}
|