expo-libvlc-player 7.0.38 → 7.0.40

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.
@@ -359,55 +359,24 @@ class LibVlcPlayerView(
359
359
  }
360
360
 
361
361
  fun getMediaTracks(): MediaTracks {
362
- var mediaTracks = MediaTracks()
362
+ val player = mediaPlayer ?: return MediaTracks()
363
363
 
364
- mediaPlayer?.let { player ->
365
- val audioTracks = mutableListOf<Track>()
366
- val audios = player.getAudioTracks()
367
-
368
- audios?.forEach { track ->
369
- val trackObj = Track(id = track.id, name = track.name)
370
- audioTracks.add(trackObj)
371
- }
364
+ val audios = player.getAudioTracks()?.map { track -> Track(id = track.id, name = track.name) }
365
+ val videos = player.getVideoTracks()?.map { track -> Track(id = track.id, name = track.name) }
366
+ val subtitles = player.getSpuTracks()?.map { track -> Track(id = track.id, name = track.name) }
372
367
 
373
- val videoTracks = mutableListOf<Track>()
374
- val videos = player.getVideoTracks()
375
-
376
- videos?.forEach { track ->
377
- val trackObj = Track(id = track.id, name = track.name)
378
- videoTracks.add(trackObj)
379
- }
368
+ val audio = audios ?: emptyList()
369
+ val video = videos ?: emptyList()
370
+ val subtitle = subtitles ?: emptyList()
380
371
 
381
- val subtitleTracks = mutableListOf<Track>()
382
- val subtitles = player.getSpuTracks()
383
-
384
- subtitles?.forEach { track ->
385
- val trackObj = Track(id = track.id, name = track.name)
386
- subtitleTracks.add(trackObj)
387
- }
388
-
389
- mediaTracks =
390
- MediaTracks(
391
- audio = audioTracks,
392
- video = videoTracks,
393
- subtitle = subtitleTracks,
394
- )
395
- }
396
-
397
- return mediaTracks
372
+ return MediaTracks(
373
+ audio = audio,
374
+ video = video,
375
+ subtitle = subtitle,
376
+ )
398
377
  }
399
378
 
400
- fun getMediaLength(): Int {
401
- var length = 0
402
-
403
- val duration = mediaPlayer?.getLength()?.toInt() ?: 0
404
-
405
- if (duration > 0) {
406
- length = duration
407
- }
408
-
409
- return length
410
- }
379
+ fun getMediaLength(): Int = (mediaPlayer?.getLength() ?: 0).toInt()
411
380
 
412
381
  fun getMediaInfo(): MediaInfo {
413
382
  val video = getVideoSize()
@@ -423,9 +392,8 @@ class LibVlcPlayerView(
423
392
  }
424
393
 
425
394
  fun getVideoSize(): Size {
426
- val video = mediaPlayer?.getCurrentVideoTrack()
427
- if (video != null) return Size(video.width, video.height)
428
- return Size(0, 0)
395
+ val video = mediaPlayer?.getCurrentVideoTrack() ?: return Size(0, 0)
396
+ return Size(video.width, video.height)
429
397
  }
430
398
 
431
399
  val hasVideoSize: Boolean
@@ -434,20 +402,16 @@ class LibVlcPlayerView(
434
402
  return video.width > 0 && video.height > 0
435
403
  }
436
404
 
437
- val hasVideoOut: Boolean
405
+ val hasMediaLength: Boolean
438
406
  get() {
439
- val tracks = getMediaTracks()
440
407
  val length = getMediaLength()
441
- val hasVideo = tracks.video.any { track -> track.id != -1 }
442
- return hasVideo && hasVideoSize && length > 0
408
+ return length > 0
443
409
  }
444
410
 
445
- val hasAudioOut: Boolean
411
+ val hasMediaVolume: Boolean
446
412
  get() {
447
- val tracks = getMediaTracks()
448
- val hasAudio = tracks.audio.any { track -> track.id != -1 }
449
413
  val volume = mediaPlayer?.getVolume() ?: MediaPlayerConstants.MIN_PLAYER_VOLUME
450
- return hasAudio && volume > MediaPlayerConstants.MIN_PLAYER_VOLUME
414
+ return volume > MediaPlayerConstants.MIN_PLAYER_VOLUME
451
415
  }
452
416
 
453
417
  var source: String? = null
@@ -751,11 +715,11 @@ fun LibVlcPlayerView.setPlayerListener(mediaPlayer: MediaPlayer?) {
751
715
  setPlayerTracks()
752
716
 
753
717
  retryUntil { isLastAttempt ->
754
- if (hasVideoOut || isLastAttempt) {
718
+ if (hasMediaLength || isLastAttempt) {
755
719
  onFirstPlay(getMediaInfo())
756
720
  }
757
721
 
758
- return@retryUntil hasVideoOut
722
+ return@retryUntil hasMediaLength
759
723
  }
760
724
 
761
725
  retryUntil {
@@ -768,11 +732,11 @@ fun LibVlcPlayerView.setPlayerListener(mediaPlayer: MediaPlayer?) {
768
732
  }
769
733
 
770
734
  retryUntil {
771
- if (hasAudioOut) {
735
+ if (hasMediaVolume) {
772
736
  MediaPlayerManager.audioFocusManager.updateAudioFocus()
773
737
  }
774
738
 
775
- return@retryUntil hasAudioOut
739
+ return@retryUntil hasMediaVolume
776
740
  }
777
741
 
778
742
  firstPlay = false
@@ -6,8 +6,8 @@ import expo.modules.libvlcplayer.records.Track
6
6
  import java.io.Serializable
7
7
 
8
8
  class MediaTracks(
9
- @Field var audio: MutableList<Track> = mutableListOf(),
10
- @Field var video: MutableList<Track> = mutableListOf(),
11
- @Field var subtitle: MutableList<Track> = mutableListOf(),
9
+ @Field var audio: List<Track> = emptyList(),
10
+ @Field var video: List<Track> = emptyList(),
11
+ @Field var subtitle: List<Track> = emptyList(),
12
12
  ) : Record,
13
13
  Serializable
@@ -1 +1 @@
1
- {"version":3,"file":"LibVlcPlayerView.d.ts","sourceRoot":"","sources":["../src/LibVlcPlayerView.tsx"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,qBAAqB,EAW3B,MAAM,sBAAsB,CAAC;AAe9B,QAAA,MAAM,gBAAgB,GAAI,mBAAmB,qBAAqB,gCAqGjE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"LibVlcPlayerView.d.ts","sourceRoot":"","sources":["../src/LibVlcPlayerView.tsx"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,qBAAqB,EAW3B,MAAM,sBAAsB,CAAC;AAa9B,QAAA,MAAM,gBAAgB,GAAI,mBAAmB,qBAAqB,gCAsGjE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,18 +1,18 @@
1
1
  import { requireNativeView } from "expo";
2
- import { useRef } from "react";
2
+ import { useState } from "react";
3
3
  import { View } from "react-native";
4
4
  import { convertAspectRatio } from "./utils/aspect";
5
5
  import { parseNativeSource } from "./utils/assets";
6
6
  import { convertNativeEvent } from "./utils/events";
7
7
  const NativeView = requireNativeView("ExpoLibVlcPlayer");
8
8
  const RENDERING_CHILDREN_WARNING = "The <LibVlcPlayerView> component does not support children. This may lead to inconsistent behaviour or crashes. If you want to render content on top of the LibVlcPlayer, consider using absolute positioning.";
9
- let loggedRenderingChildrenWarning = false;
10
9
  const FALLBACK_RATIO = 16 / 9;
11
10
  const LibVlcPlayerView = ({ ref, ...props }) => {
12
- const defaultRatio = useRef(FALLBACK_RATIO);
13
- if (props.children && !loggedRenderingChildrenWarning) {
11
+ const [defaultRatio, setDefaultRatio] = useState(FALLBACK_RATIO);
12
+ const [loggedWarning, setLoggedWarning] = useState(false);
13
+ if (props.children && !loggedWarning) {
14
14
  console.warn(RENDERING_CHILDREN_WARNING);
15
- loggedRenderingChildrenWarning = true;
15
+ setLoggedWarning(true);
16
16
  }
17
17
  const onEncounteredError = (event) => {
18
18
  const nativeEvent = convertNativeEvent(event);
@@ -62,10 +62,10 @@ const LibVlcPlayerView = ({ ref, ...props }) => {
62
62
  if (props.onFirstPlay) {
63
63
  props.onFirstPlay(nativeEvent);
64
64
  }
65
- defaultRatio.current = mediaRatio || FALLBACK_RATIO;
65
+ setDefaultRatio(mediaRatio || FALLBACK_RATIO);
66
66
  };
67
67
  const propRatio = props.aspectRatio;
68
- const aspectRatio = propRatio === "auto" ? defaultRatio.current : propRatio;
68
+ const aspectRatio = propRatio === "auto" ? defaultRatio : propRatio;
69
69
  const nativeRatio = convertAspectRatio(aspectRatio);
70
70
  return (<View style={[props.style, { aspectRatio: nativeRatio }]}>
71
71
  <NativeView {...props} ref={ref} style={[props.style, { height: "100%" }]} source={parseNativeSource(props.source)} slaves={props.slaves?.map((slave) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"LibVlcPlayerView.js","sourceRoot":"","sources":["../src/LibVlcPlayerView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeView } from \"expo\";\nimport { useRef, type ComponentType } from \"react\";\nimport { View } from \"react-native\";\n\nimport {\n type LibVlcPlayerViewNativeProps,\n type LibVlcPlayerViewProps,\n type VideoAspectRatio,\n type NativeEvent,\n type Error,\n type Dialog,\n type Time,\n type Position,\n type MediaTracks,\n type Recording,\n type Snapshot,\n type MediaInfo,\n} from \"./LibVlcPlayer.types\";\nimport { convertAspectRatio } from \"./utils/aspect\";\nimport { parseNativeSource } from \"./utils/assets\";\nimport { convertNativeEvent } from \"./utils/events\";\n\nconst NativeView: ComponentType<LibVlcPlayerViewNativeProps> =\n requireNativeView(\"ExpoLibVlcPlayer\");\n\nconst RENDERING_CHILDREN_WARNING =\n \"The <LibVlcPlayerView> component does not support children. This may lead to inconsistent behaviour or crashes. If you want to render content on top of the LibVlcPlayer, consider using absolute positioning.\";\n\nlet loggedRenderingChildrenWarning = false;\n\nconst FALLBACK_RATIO = 16 / 9;\n\nconst LibVlcPlayerView = ({ ref, ...props }: LibVlcPlayerViewProps) => {\n const defaultRatio = useRef<VideoAspectRatio>(FALLBACK_RATIO);\n\n if (props.children && !loggedRenderingChildrenWarning) {\n console.warn(RENDERING_CHILDREN_WARNING);\n loggedRenderingChildrenWarning = true;\n }\n\n const onEncounteredError = (event: NativeEvent<Error>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onEncounteredError) {\n props.onEncounteredError(nativeEvent);\n }\n };\n\n const onDialogDisplay = (event: NativeEvent<Dialog>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onDialogDisplay) {\n props.onDialogDisplay(nativeEvent);\n }\n };\n\n const onTimeChanged = (event: NativeEvent<Time>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onTimeChanged) {\n props.onTimeChanged(nativeEvent);\n }\n };\n\n const onPositionChanged = (event: NativeEvent<Position>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onPositionChanged) {\n props.onPositionChanged(nativeEvent);\n }\n };\n\n const onESAdded = (event: NativeEvent<MediaTracks>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onESAdded) {\n props.onESAdded(nativeEvent);\n }\n };\n\n const onRecordChanged = (event: NativeEvent<Recording>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onRecordChanged) {\n props.onRecordChanged(nativeEvent);\n }\n };\n\n const onSnapshotTaken = (event: NativeEvent<Snapshot>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onSnapshotTaken) {\n props.onSnapshotTaken(nativeEvent);\n }\n };\n\n const onFirstPlay = (event: NativeEvent<MediaInfo>) => {\n const nativeEvent = convertNativeEvent(event);\n const mediaRatio = nativeEvent.width / nativeEvent.height;\n\n if (props.onFirstPlay) {\n props.onFirstPlay(nativeEvent);\n }\n\n defaultRatio.current = mediaRatio || FALLBACK_RATIO;\n };\n\n const propRatio = props.aspectRatio;\n const aspectRatio = propRatio === \"auto\" ? defaultRatio.current : propRatio;\n const nativeRatio = convertAspectRatio(aspectRatio);\n\n return (\n <View style={[props.style, { aspectRatio: nativeRatio }]}>\n <NativeView\n {...props}\n ref={ref}\n style={[props.style, { height: \"100%\" }]}\n source={parseNativeSource(props.source)}\n slaves={props.slaves?.map((slave) => ({\n ...slave,\n source: parseNativeSource(slave.source),\n }))}\n onEncounteredError={onEncounteredError}\n onDialogDisplay={onDialogDisplay}\n onTimeChanged={onTimeChanged}\n onPositionChanged={onPositionChanged}\n onESAdded={onESAdded}\n onRecordChanged={onRecordChanged}\n onSnapshotTaken={onSnapshotTaken}\n onFirstPlay={onFirstPlay}\n />\n </View>\n );\n};\n\nexport default LibVlcPlayerView;\n"]}
1
+ {"version":3,"file":"LibVlcPlayerView.js","sourceRoot":"","sources":["../src/LibVlcPlayerView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAgBpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,UAAU,GACd,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;AAExC,MAAM,0BAA0B,GAC9B,gNAAgN,CAAC;AAEnN,MAAM,cAAc,GAAG,EAAE,GAAG,CAAC,CAAC;AAE9B,MAAM,gBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,EAAyB,EAAE,EAAE;IACpE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAmB,cAAc,CAAC,CAAC;IACnF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAEnE,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,kBAAkB,GAAG,CAAC,KAAyB,EAAE,EAAE;QACvD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAC7B,KAAK,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,KAA0B,EAAE,EAAE;QACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAwB,EAAE,EAAE;QACjD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAA4B,EAAE,EAAE;QACzD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,KAA+B,EAAE,EAAE;QACpD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,KAA6B,EAAE,EAAE;QACxD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,EAAE;QACvD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAA6B,EAAE,EAAE;QACpD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;QAE1D,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,eAAe,CAAC,UAAU,IAAI,cAAc,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;IACpC,MAAM,WAAW,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAEpD,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,CACvD;MAAA,CAAC,UAAU,CACT,IAAI,KAAK,CAAC,CACV,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CACzC,MAAM,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CACxC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpC,GAAG,KAAK;YACR,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC;SACxC,CAAC,CAAC,CAAC,CACJ,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CACvC,eAAe,CAAC,CAAC,eAAe,CAAC,CACjC,aAAa,CAAC,CAAC,aAAa,CAAC,CAC7B,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,CACrC,SAAS,CAAC,CAAC,SAAS,CAAC,CACrB,eAAe,CAAC,CAAC,eAAe,CAAC,CACjC,eAAe,CAAC,CAAC,eAAe,CAAC,CACjC,WAAW,CAAC,CAAC,WAAW,CAAC,EAE7B;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import { requireNativeView } from \"expo\";\nimport { useState, type ComponentType } from \"react\";\nimport { View } from \"react-native\";\n\nimport {\n type LibVlcPlayerViewNativeProps,\n type LibVlcPlayerViewProps,\n type VideoAspectRatio,\n type NativeEvent,\n type Error,\n type Dialog,\n type Time,\n type Position,\n type MediaTracks,\n type Recording,\n type Snapshot,\n type MediaInfo,\n} from \"./LibVlcPlayer.types\";\nimport { convertAspectRatio } from \"./utils/aspect\";\nimport { parseNativeSource } from \"./utils/assets\";\nimport { convertNativeEvent } from \"./utils/events\";\n\nconst NativeView: ComponentType<LibVlcPlayerViewNativeProps> =\n requireNativeView(\"ExpoLibVlcPlayer\");\n\nconst RENDERING_CHILDREN_WARNING =\n \"The <LibVlcPlayerView> component does not support children. This may lead to inconsistent behaviour or crashes. If you want to render content on top of the LibVlcPlayer, consider using absolute positioning.\";\n\nconst FALLBACK_RATIO = 16 / 9;\n\nconst LibVlcPlayerView = ({ ref, ...props }: LibVlcPlayerViewProps) => {\n const [defaultRatio, setDefaultRatio] = useState<VideoAspectRatio>(FALLBACK_RATIO);\n const [loggedWarning, setLoggedWarning] = useState<boolean>(false);\n\n if (props.children && !loggedWarning) {\n console.warn(RENDERING_CHILDREN_WARNING);\n setLoggedWarning(true);\n }\n\n const onEncounteredError = (event: NativeEvent<Error>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onEncounteredError) {\n props.onEncounteredError(nativeEvent);\n }\n };\n\n const onDialogDisplay = (event: NativeEvent<Dialog>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onDialogDisplay) {\n props.onDialogDisplay(nativeEvent);\n }\n };\n\n const onTimeChanged = (event: NativeEvent<Time>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onTimeChanged) {\n props.onTimeChanged(nativeEvent);\n }\n };\n\n const onPositionChanged = (event: NativeEvent<Position>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onPositionChanged) {\n props.onPositionChanged(nativeEvent);\n }\n };\n\n const onESAdded = (event: NativeEvent<MediaTracks>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onESAdded) {\n props.onESAdded(nativeEvent);\n }\n };\n\n const onRecordChanged = (event: NativeEvent<Recording>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onRecordChanged) {\n props.onRecordChanged(nativeEvent);\n }\n };\n\n const onSnapshotTaken = (event: NativeEvent<Snapshot>) => {\n const nativeEvent = convertNativeEvent(event);\n\n if (props.onSnapshotTaken) {\n props.onSnapshotTaken(nativeEvent);\n }\n };\n\n const onFirstPlay = (event: NativeEvent<MediaInfo>) => {\n const nativeEvent = convertNativeEvent(event);\n const mediaRatio = nativeEvent.width / nativeEvent.height;\n\n if (props.onFirstPlay) {\n props.onFirstPlay(nativeEvent);\n }\n\n setDefaultRatio(mediaRatio || FALLBACK_RATIO);\n };\n\n const propRatio = props.aspectRatio;\n const aspectRatio = propRatio === \"auto\" ? defaultRatio : propRatio;\n const nativeRatio = convertAspectRatio(aspectRatio);\n\n return (\n <View style={[props.style, { aspectRatio: nativeRatio }]}>\n <NativeView\n {...props}\n ref={ref}\n style={[props.style, { height: \"100%\" }]}\n source={parseNativeSource(props.source)}\n slaves={props.slaves?.map((slave) => ({\n ...slave,\n source: parseNativeSource(slave.source),\n }))}\n onEncounteredError={onEncounteredError}\n onDialogDisplay={onDialogDisplay}\n onTimeChanged={onTimeChanged}\n onPositionChanged={onPositionChanged}\n onESAdded={onESAdded}\n onRecordChanged={onRecordChanged}\n onSnapshotTaken={onSnapshotTaken}\n onFirstPlay={onFirstPlay}\n />\n </View>\n );\n};\n\nexport default LibVlcPlayerView;\n"]}
@@ -235,47 +235,27 @@ class LibVlcPlayerView: ExpoView {
235
235
  }
236
236
 
237
237
  func getMediaTracks() -> MediaTracks {
238
- var mediaTracks = MediaTracks()
238
+ guard let player = mediaPlayer else { return MediaTracks() }
239
239
 
240
- if let player = mediaPlayer {
241
- let audioTracks: [Track] = player.audioTracks.map { audio in
242
- let id = (audio.trackId as NSString).intValue
243
- let name = audio.trackName
244
- return Track(id: Int(id), name: name)
245
- }
246
-
247
- let videoTracks: [Track] = player.videoTracks.map { video in
248
- let id = (video.trackId as NSString).intValue
249
- let name = video.trackName
250
- return Track(id: Int(id), name: name)
251
- }
240
+ let disableTrack = Track(id: -1, name: "Disable")
252
241
 
253
- let subtitleTracks: [Track] = player.textTracks.map { subtitle in
254
- let id = (subtitle.trackId as NSString).intValue
255
- let name = subtitle.trackName
256
- return Track(id: Int(id), name: name)
257
- }
242
+ let audios = player.audioTracks.enumerated()
243
+ let videos = player.videoTracks.enumerated()
244
+ let subtitles = player.textTracks.enumerated()
258
245
 
259
- mediaTracks = MediaTracks(
260
- audio: audioTracks,
261
- video: videoTracks,
262
- subtitle: subtitleTracks
263
- )
264
- }
246
+ let audio = [disableTrack] + audios.map { index, audio in Track(id: index, name: audio.trackName) }
247
+ let video = [disableTrack] + videos.map { index, video in Track(id: index, name: video.trackName) }
248
+ let subtitle = [disableTrack] + subtitles.map { index, subtitle in Track(id: index, name: subtitle.trackName) }
265
249
 
266
- return mediaTracks
250
+ return MediaTracks(
251
+ audio: audio,
252
+ video: video,
253
+ subtitle: subtitle
254
+ )
267
255
  }
268
256
 
269
257
  func getMediaLength() -> Int {
270
- var length = 0
271
-
272
- let duration = Int(mediaPlayer?.media?.length.intValue ?? 0)
273
-
274
- if duration > 0 {
275
- length = duration
276
- }
277
-
278
- return length
258
+ Int(mediaPlayer?.media?.length.intValue ?? 0)
279
259
  }
280
260
 
281
261
  func getMediaInfo() -> MediaInfo {
@@ -292,8 +272,8 @@ class LibVlcPlayerView: ExpoView {
292
272
  }
293
273
 
294
274
  func getVideoSize() -> CGSize {
295
- if let size = mediaPlayer?.videoSize { return size }
296
- return CGSize(width: 0, height: 0)
275
+ guard let size = mediaPlayer?.videoSize else { return CGSize(width: 0, height: 0) }
276
+ return size
297
277
  }
298
278
 
299
279
  func resetVideoTrack() {
@@ -313,18 +293,14 @@ class LibVlcPlayerView: ExpoView {
313
293
  return video.width > 0 && video.height > 0
314
294
  }
315
295
 
316
- var hasVideoOut: Bool {
317
- let tracks = getMediaTracks()
296
+ var hasMediaLength: Bool {
318
297
  let length = getMediaLength()
319
- let hasVideo = tracks.video.count > 0
320
- return hasVideo && hasVideoSize && length > 0
298
+ return length > 0
321
299
  }
322
300
 
323
- var hasAudioOut: Bool {
324
- let tracks = getMediaTracks()
325
- let hasAudio = tracks.audio.count > 0
301
+ var hasMediaVolume: Bool {
326
302
  let volume = mediaPlayer?.audio?.volume ?? Int32(MediaPlayerConstants.minPlayerVolume)
327
- return hasAudio && volume > MediaPlayerConstants.minPlayerVolume
303
+ return volume > MediaPlayerConstants.minPlayerVolume
328
304
  }
329
305
 
330
306
  var source: String? {
@@ -578,11 +554,11 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
578
554
  retryUntil { [weak self] isLastAttempt in
579
555
  guard let self else { return true }
580
556
 
581
- if hasVideoOut || isLastAttempt {
557
+ if hasMediaLength || isLastAttempt {
582
558
  onFirstPlay(getMediaInfo())
583
559
  }
584
560
 
585
- return hasVideoOut
561
+ return hasMediaLength
586
562
  }
587
563
 
588
564
  retryUntil { [weak self] _ in
@@ -599,11 +575,11 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
599
575
  retryUntil { [weak self] _ in
600
576
  guard let self else { return true }
601
577
 
602
- if hasAudioOut {
578
+ if hasMediaVolume {
603
579
  MediaPlayerManager.shared.audioSessionManager.setAppropriateAudioSession()
604
580
  }
605
581
 
606
- return hasAudioOut
582
+ return hasMediaVolume
607
583
  }
608
584
 
609
585
  firstPlay = false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-libvlc-player",
3
- "version": "7.0.38",
3
+ "version": "7.0.40",
4
4
  "description": "LibVLC Player for Expo",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -1,5 +1,5 @@
1
1
  import { requireNativeView } from "expo";
2
- import { useRef, type ComponentType } from "react";
2
+ import { useState, type ComponentType } from "react";
3
3
  import { View } from "react-native";
4
4
 
5
5
  import {
@@ -26,16 +26,15 @@ const NativeView: ComponentType<LibVlcPlayerViewNativeProps> =
26
26
  const RENDERING_CHILDREN_WARNING =
27
27
  "The <LibVlcPlayerView> component does not support children. This may lead to inconsistent behaviour or crashes. If you want to render content on top of the LibVlcPlayer, consider using absolute positioning.";
28
28
 
29
- let loggedRenderingChildrenWarning = false;
30
-
31
29
  const FALLBACK_RATIO = 16 / 9;
32
30
 
33
31
  const LibVlcPlayerView = ({ ref, ...props }: LibVlcPlayerViewProps) => {
34
- const defaultRatio = useRef<VideoAspectRatio>(FALLBACK_RATIO);
32
+ const [defaultRatio, setDefaultRatio] = useState<VideoAspectRatio>(FALLBACK_RATIO);
33
+ const [loggedWarning, setLoggedWarning] = useState<boolean>(false);
35
34
 
36
- if (props.children && !loggedRenderingChildrenWarning) {
35
+ if (props.children && !loggedWarning) {
37
36
  console.warn(RENDERING_CHILDREN_WARNING);
38
- loggedRenderingChildrenWarning = true;
37
+ setLoggedWarning(true);
39
38
  }
40
39
 
41
40
  const onEncounteredError = (event: NativeEvent<Error>) => {
@@ -102,11 +101,11 @@ const LibVlcPlayerView = ({ ref, ...props }: LibVlcPlayerViewProps) => {
102
101
  props.onFirstPlay(nativeEvent);
103
102
  }
104
103
 
105
- defaultRatio.current = mediaRatio || FALLBACK_RATIO;
104
+ setDefaultRatio(mediaRatio || FALLBACK_RATIO);
106
105
  };
107
106
 
108
107
  const propRatio = props.aspectRatio;
109
- const aspectRatio = propRatio === "auto" ? defaultRatio.current : propRatio;
108
+ const aspectRatio = propRatio === "auto" ? defaultRatio : propRatio;
110
109
  const nativeRatio = convertAspectRatio(aspectRatio);
111
110
 
112
111
  return (