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.
- package/android/src/main/java/expo/modules/libvlcplayer/LibVlcPlayerView.kt +23 -59
- package/android/src/main/java/expo/modules/libvlcplayer/records/MediaTracks.kt +3 -3
- package/build/LibVlcPlayerView.d.ts.map +1 -1
- package/build/LibVlcPlayerView.js +7 -7
- package/build/LibVlcPlayerView.js.map +1 -1
- package/ios/LibVlcPlayerView.swift +24 -48
- package/package.json +1 -1
- package/src/LibVlcPlayerView.tsx +7 -8
|
@@ -359,55 +359,24 @@ class LibVlcPlayerView(
|
|
|
359
359
|
}
|
|
360
360
|
|
|
361
361
|
fun getMediaTracks(): MediaTracks {
|
|
362
|
-
|
|
362
|
+
val player = mediaPlayer ?: return MediaTracks()
|
|
363
363
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
374
|
-
|
|
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
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
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
|
|
405
|
+
val hasMediaLength: Boolean
|
|
438
406
|
get() {
|
|
439
|
-
val tracks = getMediaTracks()
|
|
440
407
|
val length = getMediaLength()
|
|
441
|
-
|
|
442
|
-
return hasVideo && hasVideoSize && length > 0
|
|
408
|
+
return length > 0
|
|
443
409
|
}
|
|
444
410
|
|
|
445
|
-
val
|
|
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
|
|
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 (
|
|
718
|
+
if (hasMediaLength || isLastAttempt) {
|
|
755
719
|
onFirstPlay(getMediaInfo())
|
|
756
720
|
}
|
|
757
721
|
|
|
758
|
-
return@retryUntil
|
|
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 (
|
|
735
|
+
if (hasMediaVolume) {
|
|
772
736
|
MediaPlayerManager.audioFocusManager.updateAudioFocus()
|
|
773
737
|
}
|
|
774
738
|
|
|
775
|
-
return@retryUntil
|
|
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:
|
|
10
|
-
@Field var video:
|
|
11
|
-
@Field var subtitle:
|
|
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;
|
|
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 {
|
|
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 =
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
65
|
+
setDefaultRatio(mediaRatio || FALLBACK_RATIO);
|
|
66
66
|
};
|
|
67
67
|
const propRatio = props.aspectRatio;
|
|
68
|
-
const aspectRatio = propRatio === "auto" ? defaultRatio
|
|
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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,
|
|
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
|
-
|
|
238
|
+
guard let player = mediaPlayer else { return MediaTracks() }
|
|
239
239
|
|
|
240
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
|
250
|
+
return MediaTracks(
|
|
251
|
+
audio: audio,
|
|
252
|
+
video: video,
|
|
253
|
+
subtitle: subtitle
|
|
254
|
+
)
|
|
267
255
|
}
|
|
268
256
|
|
|
269
257
|
func getMediaLength() -> Int {
|
|
270
|
-
|
|
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
|
-
|
|
296
|
-
return
|
|
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
|
|
317
|
-
let tracks = getMediaTracks()
|
|
296
|
+
var hasMediaLength: Bool {
|
|
318
297
|
let length = getMediaLength()
|
|
319
|
-
|
|
320
|
-
return hasVideo && hasVideoSize && length > 0
|
|
298
|
+
return length > 0
|
|
321
299
|
}
|
|
322
300
|
|
|
323
|
-
var
|
|
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
|
|
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
|
|
557
|
+
if hasMediaLength || isLastAttempt {
|
|
582
558
|
onFirstPlay(getMediaInfo())
|
|
583
559
|
}
|
|
584
560
|
|
|
585
|
-
return
|
|
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
|
|
578
|
+
if hasMediaVolume {
|
|
603
579
|
MediaPlayerManager.shared.audioSessionManager.setAppropriateAudioSession()
|
|
604
580
|
}
|
|
605
581
|
|
|
606
|
-
return
|
|
582
|
+
return hasMediaVolume
|
|
607
583
|
}
|
|
608
584
|
|
|
609
585
|
firstPlay = false
|
package/package.json
CHANGED
package/src/LibVlcPlayerView.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { requireNativeView } from "expo";
|
|
2
|
-
import {
|
|
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 =
|
|
32
|
+
const [defaultRatio, setDefaultRatio] = useState<VideoAspectRatio>(FALLBACK_RATIO);
|
|
33
|
+
const [loggedWarning, setLoggedWarning] = useState<boolean>(false);
|
|
35
34
|
|
|
36
|
-
if (props.children && !
|
|
35
|
+
if (props.children && !loggedWarning) {
|
|
37
36
|
console.warn(RENDERING_CHILDREN_WARNING);
|
|
38
|
-
|
|
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
|
-
|
|
104
|
+
setDefaultRatio(mediaRatio || FALLBACK_RATIO);
|
|
106
105
|
};
|
|
107
106
|
|
|
108
107
|
const propRatio = props.aspectRatio;
|
|
109
|
-
const aspectRatio = propRatio === "auto" ? defaultRatio
|
|
108
|
+
const aspectRatio = propRatio === "auto" ? defaultRatio : propRatio;
|
|
110
109
|
const nativeRatio = convertAspectRatio(aspectRatio);
|
|
111
110
|
|
|
112
111
|
return (
|