@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, source: HybridVideoPlayerSourceSpec): Array<PlayerTrack> {
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 = finalTrackId,
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
- val isExternal = currentTrackId.startsWith("external-") == true
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 = finalTrackId,
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 = finalId,
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 = finalId,
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 = finalId,
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.bufferConfig
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
- val startPosition = hybridSource.config.startPosition
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
- player.prepare()
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
- player.prepare()
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
- val startPosition = hybridSource.config.startPosition
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
- player.prepare()
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
- player.prepare()
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, source)
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pigeonmal/react-native-video",
3
- "version": "7.0.0-beta.11",
3
+ "version": "7.0.0-beta.13",
4
4
  "description": "<Video /> Component for React Native",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/commonjs/index.js",