expo-libvlc-player 7.0.2 → 7.0.3
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.
|
@@ -174,14 +174,11 @@ class LibVlcPlayerView(
|
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
fun createPlayer() {
|
|
177
|
-
var args = options
|
|
178
|
-
args.toggleStartPausedOption(autoplay)
|
|
179
|
-
|
|
180
177
|
if (pictureInPicture) {
|
|
181
178
|
MediaPlayerManager.pictureInPictureManager.setupPipView(this)
|
|
182
179
|
}
|
|
183
180
|
|
|
184
|
-
libVLC = LibVLC(context
|
|
181
|
+
libVLC = LibVLC(context)
|
|
185
182
|
setDialogCallbacks(libVLC!!)
|
|
186
183
|
|
|
187
184
|
mediaPlayer = MediaPlayer(libVLC!!)
|
|
@@ -196,7 +193,12 @@ class LibVlcPlayerView(
|
|
|
196
193
|
return
|
|
197
194
|
}
|
|
198
195
|
|
|
196
|
+
var args = options
|
|
197
|
+
args.normalizeOptions()
|
|
198
|
+
args.toggleStartPausedOption(autoplay)
|
|
199
|
+
|
|
199
200
|
val media = Media(libVLC!!, Uri.parse(source!!))
|
|
201
|
+
args.forEach { arg -> media!!.addOption(arg) }
|
|
200
202
|
mediaPlayer!!.setMedia(media)
|
|
201
203
|
media.release()
|
|
202
204
|
mediaPlayer!!.play()
|
|
@@ -216,26 +218,10 @@ class LibVlcPlayerView(
|
|
|
216
218
|
}
|
|
217
219
|
|
|
218
220
|
fun selectTrack(
|
|
219
|
-
|
|
221
|
+
index: Int,
|
|
220
222
|
type: Int,
|
|
221
223
|
) {
|
|
222
224
|
mediaPlayer?.let { player ->
|
|
223
|
-
val tracks =
|
|
224
|
-
when (type) {
|
|
225
|
-
IMedia.Track.Type.Audio -> player.getAudioTracks()
|
|
226
|
-
IMedia.Track.Type.Video -> player.getVideoTracks()
|
|
227
|
-
IMedia.Track.Type.Text -> player.getSpuTracks()
|
|
228
|
-
else -> null
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
if (tracks == null) return
|
|
232
|
-
|
|
233
|
-
val firstTrack = tracks.firstOrNull { track -> track.id != -1 }
|
|
234
|
-
val firstTrackId = firstTrack?.id
|
|
235
|
-
val index = trackId ?: firstTrackId
|
|
236
|
-
|
|
237
|
-
if (index == null) return
|
|
238
|
-
|
|
239
225
|
when (type) {
|
|
240
226
|
IMedia.Track.Type.Audio -> {
|
|
241
227
|
player.setAudioTrack(index)
|
|
@@ -257,9 +243,9 @@ class LibVlcPlayerView(
|
|
|
257
243
|
val videoTrack = tracks?.video
|
|
258
244
|
val spuTrack = tracks?.subtitle
|
|
259
245
|
|
|
260
|
-
selectTrack(audioTrack, IMedia.Track.Type.Audio)
|
|
261
|
-
selectTrack(videoTrack, IMedia.Track.Type.Video)
|
|
262
|
-
selectTrack(spuTrack, IMedia.Track.Type.Text)
|
|
246
|
+
audioTrack?.let { audioTrack -> selectTrack(audioTrack, IMedia.Track.Type.Audio) }
|
|
247
|
+
videoTrack?.let { videoTrack -> selectTrack(videoTrack, IMedia.Track.Type.Video) }
|
|
248
|
+
spuTrack?.let { spuTrack -> selectTrack(spuTrack, IMedia.Track.Type.Text) }
|
|
263
249
|
}
|
|
264
250
|
|
|
265
251
|
fun addPlayerSlaves(slaves: List<Slave>) {
|
|
@@ -914,16 +900,25 @@ fun LibVlcPlayerView.setDialogCallbacks(ILibVLC: LibVLC?) {
|
|
|
914
900
|
}
|
|
915
901
|
}
|
|
916
902
|
|
|
917
|
-
private fun MutableList<String>.
|
|
918
|
-
val
|
|
919
|
-
|
|
920
|
-
"
|
|
921
|
-
|
|
922
|
-
|
|
903
|
+
private fun MutableList<String>.normalizeOptions() {
|
|
904
|
+
val normalized =
|
|
905
|
+
map { option ->
|
|
906
|
+
if (!option.startsWith(":")) {
|
|
907
|
+
":" + option.dropWhile { character -> character == '-' }
|
|
908
|
+
} else {
|
|
909
|
+
option
|
|
910
|
+
}
|
|
911
|
+
}
|
|
923
912
|
|
|
924
|
-
|
|
913
|
+
for (i in indices) {
|
|
914
|
+
this[i] = normalized[i]
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
private fun MutableList<String>.toggleStartPausedOption(autoplay: Boolean) {
|
|
919
|
+
val hasOption = contains(":start-paused")
|
|
925
920
|
|
|
926
|
-
if (!autoplay) {
|
|
927
|
-
add("
|
|
921
|
+
if (!autoplay && !hasOption) {
|
|
922
|
+
add(":start-paused")
|
|
928
923
|
}
|
|
929
924
|
}
|
|
@@ -8,6 +8,7 @@ class LibVlcPlayerView: ExpoView {
|
|
|
8
8
|
private let playerDrawable: MediaPlayerDrawable = .init()
|
|
9
9
|
private var pictureDrawable: PictureInPictureDrawable!
|
|
10
10
|
|
|
11
|
+
var library: VLCLibrary?
|
|
11
12
|
var mediaPlayer: VLCMediaPlayer?
|
|
12
13
|
var vlcDialog: VLCDialogProvider?
|
|
13
14
|
var vlcDialogRef: NSValue?
|
|
@@ -72,10 +73,6 @@ class LibVlcPlayerView: ExpoView {
|
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
func createPlayer() {
|
|
75
|
-
var args = options
|
|
76
|
-
args.toggleStartPausedOption(autoplay)
|
|
77
|
-
|
|
78
|
-
let library = VLCLibrary(options: args)
|
|
79
76
|
var drawable: MediaPlayerDrawable
|
|
80
77
|
|
|
81
78
|
if pictureInPicture {
|
|
@@ -86,12 +83,13 @@ class LibVlcPlayerView: ExpoView {
|
|
|
86
83
|
drawable = playerDrawable
|
|
87
84
|
}
|
|
88
85
|
|
|
89
|
-
|
|
86
|
+
library = VLCLibrary()
|
|
87
|
+
mediaPlayer = VLCMediaPlayer(library: library!)
|
|
90
88
|
mediaPlayer!.drawable = drawable
|
|
91
89
|
mediaPlayer!.delegate = self
|
|
92
90
|
setupPlayer()
|
|
93
91
|
|
|
94
|
-
vlcDialog = VLCDialogProvider(library: library
|
|
92
|
+
vlcDialog = VLCDialogProvider(library: library!, customUI: dialogCustomUI)
|
|
95
93
|
vlcDialog!.customRenderer = self
|
|
96
94
|
|
|
97
95
|
guard let source, let url = URL(string: source) else {
|
|
@@ -99,7 +97,13 @@ class LibVlcPlayerView: ExpoView {
|
|
|
99
97
|
return
|
|
100
98
|
}
|
|
101
99
|
|
|
102
|
-
|
|
100
|
+
var args = options
|
|
101
|
+
args.normalizeOptions()
|
|
102
|
+
args.toggleStartPausedOption(autoplay)
|
|
103
|
+
|
|
104
|
+
let media = VLCMedia(url: url)
|
|
105
|
+
args.forEach { arg in media!.addOption(arg) }
|
|
106
|
+
mediaPlayer!.media = media
|
|
103
107
|
mediaPlayer!.play()
|
|
104
108
|
|
|
105
109
|
firstPlay = true
|
|
@@ -109,41 +113,25 @@ class LibVlcPlayerView: ExpoView {
|
|
|
109
113
|
}
|
|
110
114
|
|
|
111
115
|
func destroyPlayer() {
|
|
116
|
+
library = nil
|
|
112
117
|
mediaPlayer?.stop()
|
|
113
118
|
mediaPlayer = nil
|
|
114
119
|
vlcDialog?.customRenderer = nil
|
|
115
120
|
vlcDialog = nil
|
|
116
121
|
}
|
|
117
122
|
|
|
118
|
-
func selectTrack(_
|
|
123
|
+
func selectTrack(_ index: Int, _ type: VLCMedia.TrackType) {
|
|
119
124
|
if let player = mediaPlayer {
|
|
120
|
-
if
|
|
125
|
+
if index == -1 {
|
|
121
126
|
switch type {
|
|
122
127
|
case .audio: player.deselectAllAudioTracks()
|
|
123
128
|
case .video: player.deselectAllVideoTracks()
|
|
124
129
|
case .text: player.deselectAllTextTracks()
|
|
125
130
|
default: break
|
|
126
131
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
let tracks: [VLCMediaPlayer.Track]? = switch type {
|
|
131
|
-
case .audio: player.audioTracks
|
|
132
|
-
case .video: player.videoTracks
|
|
133
|
-
case .text: player.textTracks
|
|
134
|
-
default: nil
|
|
132
|
+
} else {
|
|
133
|
+
player.selectTrack(at: index, type: type)
|
|
135
134
|
}
|
|
136
|
-
|
|
137
|
-
guard let tracks else { return }
|
|
138
|
-
|
|
139
|
-
let firstTrack = tracks.first?.trackId
|
|
140
|
-
let firstTrackInt = firstTrack.map { id in (id as NSString).intValue }
|
|
141
|
-
let firstTrackId = firstTrackInt.map { id in Int(id) }
|
|
142
|
-
let index = trackId ?? firstTrackId
|
|
143
|
-
|
|
144
|
-
guard let index else { return }
|
|
145
|
-
|
|
146
|
-
player.selectTrack(at: index, type: type)
|
|
147
135
|
}
|
|
148
136
|
}
|
|
149
137
|
|
|
@@ -152,9 +140,9 @@ class LibVlcPlayerView: ExpoView {
|
|
|
152
140
|
let videoTrack = tracks?.video
|
|
153
141
|
let textTrack = tracks?.subtitle
|
|
154
142
|
|
|
155
|
-
selectTrack(audioTrack, .audio)
|
|
156
|
-
selectTrack(videoTrack, .video)
|
|
157
|
-
selectTrack(textTrack, .text)
|
|
143
|
+
if let audioTrack { selectTrack(audioTrack, .audio) }
|
|
144
|
+
if let videoTrack { selectTrack(videoTrack, .video) }
|
|
145
|
+
if let textTrack { selectTrack(textTrack, .text) }
|
|
158
146
|
}
|
|
159
147
|
|
|
160
148
|
func addPlayerSlaves(_ slaves: [Slave]) {
|
|
@@ -770,16 +758,23 @@ extension LibVlcPlayerView: VLCCustomDialogRendererProtocol {
|
|
|
770
758
|
}
|
|
771
759
|
|
|
772
760
|
private extension [String] {
|
|
773
|
-
mutating func
|
|
774
|
-
|
|
775
|
-
"
|
|
776
|
-
|
|
777
|
-
|
|
761
|
+
mutating func normalizeOptions() {
|
|
762
|
+
self = map { option in
|
|
763
|
+
if !option.hasPrefix(":") {
|
|
764
|
+
":" + option.drop { character in character == "-" }
|
|
765
|
+
} else {
|
|
766
|
+
option
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
778
771
|
|
|
779
|
-
|
|
772
|
+
private extension [String] {
|
|
773
|
+
mutating func toggleStartPausedOption(_ autoplay: Bool) {
|
|
774
|
+
let hasOption = self.contains(":start-paused")
|
|
780
775
|
|
|
781
|
-
if !autoplay {
|
|
782
|
-
append("
|
|
776
|
+
if !autoplay, !hasOption {
|
|
777
|
+
append(":start-paused")
|
|
783
778
|
}
|
|
784
779
|
}
|
|
785
780
|
}
|