expo-libvlc-player 2.4.0 → 2.5.0
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 +3 -1
- package/android/build.gradle +2 -2
- package/android/src/main/java/expo/modules/libvlcplayer/LibVlcPlayerModule.kt +6 -0
- package/android/src/main/java/expo/modules/libvlcplayer/LibVlcPlayerView.kt +53 -5
- package/android/src/main/java/expo/modules/libvlcplayer/MediaPlayerListener.kt +0 -4
- package/build/LibVlcPlayer.types.d.ts +22 -2
- package/build/LibVlcPlayer.types.d.ts.map +1 -1
- package/build/LibVlcPlayer.types.js.map +1 -1
- package/build/LibVlcPlayerView.d.ts.map +1 -1
- package/build/LibVlcPlayerView.js +7 -1
- package/build/LibVlcPlayerView.js.map +1 -1
- package/build/utils/events.d.ts.map +1 -1
- package/build/utils/events.js.map +1 -1
- package/ios/LibVlcPlayerModule.swift +6 -0
- package/ios/LibVlcPlayerView.swift +22 -5
- package/ios/MediaPlayerDelegate.swift +0 -4
- package/package.json +1 -1
- package/src/LibVlcPlayer.types.ts +22 -2
- package/src/LibVlcPlayerView.tsx +14 -12
- package/src/utils/events.ts +0 -1
package/README.md
CHANGED
|
@@ -133,7 +133,8 @@ See the [Example App](example/components/PlayerView.tsx) for additional usage.
|
|
|
133
133
|
| `pause()` | Pauses playback of the current player |
|
|
134
134
|
| `stop()` | Stops playback of the current player |
|
|
135
135
|
| `seek(value: number, type?: "position" \| "time")` | Sets the position or time of the current player. Must be a number equal or greater than `0` and type defaults to `"position"` |
|
|
136
|
-
| `record(path
|
|
136
|
+
| `record(path?: string)` | Starts or stops recording the current media. Must be a valid string |
|
|
137
|
+
| `snapshot(path: string)` | Takes a snapshot of the current media. Must be a valid string |
|
|
137
138
|
| `postAction(action: number)` | Posts an answer to a [`Dialog`](#dialog). Must be an integer of `1` or `2` |
|
|
138
139
|
| `dismiss()` | Dismisses a [`Dialog`](#dialog) |
|
|
139
140
|
|
|
@@ -172,6 +173,7 @@ The `LibVlcPlayerView` extends React Native `ViewProps` and implements the follo
|
|
|
172
173
|
| `onPositionChanged` | Called after the `PositionChanged` player event | `{ position: number }` |
|
|
173
174
|
| `onESAdded` | Called after the `ESAdded` player event | [`MediaTracks`](#mediatracks) |
|
|
174
175
|
| `onRecordChanged` | Called after the `RecordChanged` player event | [`Recording`](#recording) |
|
|
176
|
+
| `onSnapshotTaken` | Called after a media snapshot is taken | `{ path: string }` |
|
|
175
177
|
| `onDialogDisplay` | Called after a `Dialog` needs to be displayed | [`Dialog`](#dialog) |
|
|
176
178
|
| `onFirstPlay` | Called after the player first playing event | [`MediaInfo`](#mediainfo) |
|
|
177
179
|
| `onBackground` | Called after the player enters the background | |
|
package/android/build.gradle
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
apply plugin: "com.android.library"
|
|
2
2
|
|
|
3
3
|
group = "expo.modules.libvlcplayer"
|
|
4
|
-
version = "2.
|
|
4
|
+
version = "2.5.0"
|
|
5
5
|
|
|
6
6
|
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
|
|
7
7
|
apply from: expoModulesCorePlugin
|
|
@@ -27,7 +27,7 @@ android {
|
|
|
27
27
|
namespace "expo.modules.libvlcplayer"
|
|
28
28
|
defaultConfig {
|
|
29
29
|
versionCode 1
|
|
30
|
-
versionName "2.
|
|
30
|
+
versionName "2.5.0"
|
|
31
31
|
consumerProguardFiles("proguard-rules.pro")
|
|
32
32
|
}
|
|
33
33
|
lintOptions {
|
|
@@ -16,6 +16,7 @@ private const val TIME_CHANGED_EVENT = "onTimeChanged"
|
|
|
16
16
|
private const val POSITION_CHANGED_EVENT = "onPositionChanged"
|
|
17
17
|
private const val ES_ADDED_EVENT = "onESAdded"
|
|
18
18
|
private const val RECORD_CHANGED_EVENT = "onRecordChanged"
|
|
19
|
+
private const val SNAPSHOT_TAKEN_EVENT = "onSnapshotTaken"
|
|
19
20
|
private const val DIALOG_DISPLAY_EVENT = "onDialogDisplay"
|
|
20
21
|
private const val FIRST_PLAY_EVENT = "onFirstPlay"
|
|
21
22
|
private const val BACKGROUND_EVENT = "onBackground"
|
|
@@ -32,6 +33,7 @@ val playerEvents =
|
|
|
32
33
|
POSITION_CHANGED_EVENT,
|
|
33
34
|
ES_ADDED_EVENT,
|
|
34
35
|
RECORD_CHANGED_EVENT,
|
|
36
|
+
SNAPSHOT_TAKEN_EVENT,
|
|
35
37
|
DIALOG_DISPLAY_EVENT,
|
|
36
38
|
FIRST_PLAY_EVENT,
|
|
37
39
|
BACKGROUND_EVENT,
|
|
@@ -138,6 +140,10 @@ class LibVlcPlayerModule : Module() {
|
|
|
138
140
|
view.record(path)
|
|
139
141
|
}
|
|
140
142
|
|
|
143
|
+
AsyncFunction("snapshot") { view: LibVlcPlayerView, path: String ->
|
|
144
|
+
view.snapshot(path)
|
|
145
|
+
}
|
|
146
|
+
|
|
141
147
|
AsyncFunction("postAction") { view: LibVlcPlayerView, action: Int ->
|
|
142
148
|
view.postAction(action)
|
|
143
149
|
}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
package expo.modules.libvlcplayer
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
|
+
import android.graphics.Bitmap
|
|
4
5
|
import android.net.Uri
|
|
6
|
+
import android.os.Handler
|
|
7
|
+
import android.os.Looper
|
|
8
|
+
import android.view.PixelCopy
|
|
9
|
+
import android.view.Surface
|
|
10
|
+
import android.view.TextureView
|
|
5
11
|
import expo.modules.kotlin.AppContext
|
|
6
12
|
import expo.modules.kotlin.viewevent.EventDispatcher
|
|
7
13
|
import expo.modules.kotlin.views.ExpoView
|
|
@@ -19,7 +25,11 @@ import org.videolan.libvlc.MediaPlayer
|
|
|
19
25
|
import org.videolan.libvlc.interfaces.IMedia
|
|
20
26
|
import org.videolan.libvlc.util.DisplayManager
|
|
21
27
|
import org.videolan.libvlc.util.VLCVideoLayout
|
|
28
|
+
import java.io.File
|
|
29
|
+
import java.io.FileOutputStream
|
|
22
30
|
import java.net.URI
|
|
31
|
+
import java.text.SimpleDateFormat
|
|
32
|
+
import java.util.Calendar
|
|
23
33
|
import org.videolan.libvlc.Dialog as VLCDialog
|
|
24
34
|
|
|
25
35
|
const val DEFAULT_PLAYER_RATE: Float = 1f
|
|
@@ -65,6 +75,7 @@ class LibVlcPlayerView(
|
|
|
65
75
|
internal val onPositionChanged by EventDispatcher()
|
|
66
76
|
internal val onESAdded by EventDispatcher<MediaTracks>()
|
|
67
77
|
internal val onRecordChanged by EventDispatcher<Recording>()
|
|
78
|
+
internal val onSnapshotTaken by EventDispatcher()
|
|
68
79
|
internal val onDialogDisplay by EventDispatcher<Dialog>()
|
|
69
80
|
internal val onFirstPlay by EventDispatcher<MediaInfo>()
|
|
70
81
|
internal val onBackground by EventDispatcher<Unit>()
|
|
@@ -349,7 +360,6 @@ class LibVlcPlayerView(
|
|
|
349
360
|
|
|
350
361
|
if (options.hasAudioOption()) {
|
|
351
362
|
val error = mapOf("error" to "Audio disabled via options")
|
|
352
|
-
|
|
353
363
|
onEncounteredError(error)
|
|
354
364
|
}
|
|
355
365
|
|
|
@@ -367,7 +377,6 @@ class LibVlcPlayerView(
|
|
|
367
377
|
|
|
368
378
|
if (options.hasAudioOption()) {
|
|
369
379
|
val error = mapOf("error" to "Audio disabled via options")
|
|
370
|
-
|
|
371
380
|
onEncounteredError(error)
|
|
372
381
|
}
|
|
373
382
|
|
|
@@ -394,7 +403,6 @@ class LibVlcPlayerView(
|
|
|
394
403
|
|
|
395
404
|
if (options.hasRepeatOption()) {
|
|
396
405
|
val error = mapOf("error" to "Repeat enabled via options")
|
|
397
|
-
|
|
398
406
|
onEncounteredError(error)
|
|
399
407
|
}
|
|
400
408
|
}
|
|
@@ -463,8 +471,7 @@ class LibVlcPlayerView(
|
|
|
463
471
|
val success = player.record(path)
|
|
464
472
|
|
|
465
473
|
if (!success) {
|
|
466
|
-
val error = mapOf("error" to "
|
|
467
|
-
|
|
474
|
+
val error = mapOf("error" to "Media could not be recorded")
|
|
468
475
|
onEncounteredError(error)
|
|
469
476
|
|
|
470
477
|
player.record(null)
|
|
@@ -475,6 +482,47 @@ class LibVlcPlayerView(
|
|
|
475
482
|
}
|
|
476
483
|
}
|
|
477
484
|
|
|
485
|
+
fun snapshot(path: String) {
|
|
486
|
+
mediaPlayer?.let { player ->
|
|
487
|
+
try {
|
|
488
|
+
val textureView = playerView.findViewById<TextureView>(org.videolan.R.id.texture_video) ?: throw Exception()
|
|
489
|
+
|
|
490
|
+
val video = player.getCurrentVideoTrack()
|
|
491
|
+
val width = video.width ?: 0
|
|
492
|
+
val height = video.height ?: 0
|
|
493
|
+
|
|
494
|
+
val surface = Surface(textureView.surfaceTexture)
|
|
495
|
+
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
|
496
|
+
|
|
497
|
+
PixelCopy.request(
|
|
498
|
+
surface,
|
|
499
|
+
bitmap,
|
|
500
|
+
{ copyResult ->
|
|
501
|
+
if (copyResult != PixelCopy.SUCCESS) {
|
|
502
|
+
throw Exception()
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd-HH'h'mm'm'ss's'")
|
|
506
|
+
val timestamp = Calendar.getInstance().time
|
|
507
|
+
val snapshotPath = path + "/vlc-snapshot-${simpleDateFormat.format(timestamp)}.jpg"
|
|
508
|
+
val file = File(snapshotPath)
|
|
509
|
+
|
|
510
|
+
FileOutputStream(file).use { stream ->
|
|
511
|
+
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
val path = mapOf("path" to snapshotPath)
|
|
515
|
+
onSnapshotTaken(path)
|
|
516
|
+
},
|
|
517
|
+
Handler(Looper.getMainLooper()),
|
|
518
|
+
)
|
|
519
|
+
} catch (_: Exception) {
|
|
520
|
+
val error = mapOf("error" to "Media snapshot could not be taken")
|
|
521
|
+
onEncounteredError(error)
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
478
526
|
fun postAction(action: Int) {
|
|
479
527
|
vlcDialog?.let { dialog ->
|
|
480
528
|
when (dialog) {
|
|
@@ -60,7 +60,6 @@ fun LibVlcPlayerView.setMediaPlayerListener() {
|
|
|
60
60
|
|
|
61
61
|
Event.EncounteredError -> {
|
|
62
62
|
val error = mapOf("error" to "Media player encountered an error")
|
|
63
|
-
|
|
64
63
|
onEncounteredError(error)
|
|
65
64
|
|
|
66
65
|
firstPlay = true
|
|
@@ -69,7 +68,6 @@ fun LibVlcPlayerView.setMediaPlayerListener() {
|
|
|
69
68
|
|
|
70
69
|
Event.TimeChanged -> {
|
|
71
70
|
val time = mapOf("time" to player.getTime().toInt())
|
|
72
|
-
|
|
73
71
|
onTimeChanged(time)
|
|
74
72
|
|
|
75
73
|
if (firstTime) {
|
|
@@ -86,13 +84,11 @@ fun LibVlcPlayerView.setMediaPlayerListener() {
|
|
|
86
84
|
|
|
87
85
|
Event.PositionChanged -> {
|
|
88
86
|
val position = mapOf("position" to player.getPosition())
|
|
89
|
-
|
|
90
87
|
onPositionChanged(position)
|
|
91
88
|
}
|
|
92
89
|
|
|
93
90
|
Event.ESAdded -> {
|
|
94
91
|
val mediaTracks = getMediaTracks()
|
|
95
|
-
|
|
96
92
|
onESAdded(mediaTracks)
|
|
97
93
|
}
|
|
98
94
|
|
|
@@ -30,11 +30,19 @@ export interface LibVlcPlayerViewRef {
|
|
|
30
30
|
/**
|
|
31
31
|
* Starts or stops recording the current media
|
|
32
32
|
*
|
|
33
|
-
* @param path - Must be a valid string
|
|
33
|
+
* @param path - Must be a valid string
|
|
34
34
|
*
|
|
35
35
|
* @returns A promise which resolves to `void`
|
|
36
36
|
*/
|
|
37
|
-
readonly record: (path
|
|
37
|
+
readonly record: (path?: string) => Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Takes a snapshot of the current media
|
|
40
|
+
*
|
|
41
|
+
* @param path - Must be a valid string
|
|
42
|
+
*
|
|
43
|
+
* @returns A promise which resolves to `void`
|
|
44
|
+
*/
|
|
45
|
+
readonly snapshot: (path: string) => Promise<void>;
|
|
38
46
|
/**
|
|
39
47
|
* Posts an answer to a `Dialog`
|
|
40
48
|
*
|
|
@@ -145,6 +153,13 @@ type ESAddedListener = (event: NativeEvent<MediaTracks>) => void;
|
|
|
145
153
|
* @hidden
|
|
146
154
|
*/
|
|
147
155
|
type RecordChangedListener = (event: NativeEvent<Recording>) => void;
|
|
156
|
+
export type Snapshot = {
|
|
157
|
+
path: string;
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* @hidden
|
|
161
|
+
*/
|
|
162
|
+
type SnapshotTakenListener = (event: NativeEvent<Snapshot>) => void;
|
|
148
163
|
/**
|
|
149
164
|
* @hidden
|
|
150
165
|
*/
|
|
@@ -186,6 +201,7 @@ export interface LibVlcPlayerViewNativeProps {
|
|
|
186
201
|
onPositionChanged?: PositionChangedListener;
|
|
187
202
|
onESAdded?: ESAddedListener;
|
|
188
203
|
onRecordChanged?: RecordChangedListener;
|
|
204
|
+
onSnapshotTaken?: SnapshotTakenListener;
|
|
189
205
|
onDialogDisplay?: DialogDisplayListener;
|
|
190
206
|
onFirstPlay?: FirstPlayListener;
|
|
191
207
|
onBackground?: BackgroundListener;
|
|
@@ -343,6 +359,10 @@ export interface LibVlcPlayerViewProps extends ViewProps {
|
|
|
343
359
|
* Called after the `RecordChanged` player event
|
|
344
360
|
*/
|
|
345
361
|
onRecordChanged?: (event: Recording) => void;
|
|
362
|
+
/**
|
|
363
|
+
* Called after a media snapshot is taken
|
|
364
|
+
*/
|
|
365
|
+
onSnapshotTaken?: (event: Snapshot) => void;
|
|
346
366
|
/**
|
|
347
367
|
* Called after a `Dialog` needs to be displayed
|
|
348
368
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LibVlcPlayer.types.d.ts","sourceRoot":"","sources":["../src/LibVlcPlayer.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"LibVlcPlayer.types.d.ts","sourceRoot":"","sources":["../src/LibVlcPlayer.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LibVlcPlayer.types.js","sourceRoot":"","sources":["../src/LibVlcPlayer.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ViewProps } from \"react-native\";\n\nexport interface LibVlcPlayerViewRef {\n /**\n * Starts playback of the current player\n *\n * @returns A promise which resolves to `void`\n */\n readonly play: () => Promise<void>;\n /**\n * Pauses playback of the current player\n *\n * @returns A promise which resolves to `void`\n */\n readonly pause: () => Promise<void>;\n /**\n * Stops playback of the current player\n *\n * @returns A promise which resolves to `void`\n */\n readonly stop: () => Promise<void>;\n /**\n * Sets the position or time of the current player\n *\n * @param value - Must be a number equal or greater than `0`\n * @param type - Defaults to `\"position\"`\n *\n * @returns A promise which resolves to `void`\n */\n readonly seek: (value: number, type?: \"position\" | \"time\") => Promise<void>;\n /**\n * Starts or stops recording the current media\n *\n * @param path - Must be a valid string
|
|
1
|
+
{"version":3,"file":"LibVlcPlayer.types.js","sourceRoot":"","sources":["../src/LibVlcPlayer.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ViewProps } from \"react-native\";\n\nexport interface LibVlcPlayerViewRef {\n /**\n * Starts playback of the current player\n *\n * @returns A promise which resolves to `void`\n */\n readonly play: () => Promise<void>;\n /**\n * Pauses playback of the current player\n *\n * @returns A promise which resolves to `void`\n */\n readonly pause: () => Promise<void>;\n /**\n * Stops playback of the current player\n *\n * @returns A promise which resolves to `void`\n */\n readonly stop: () => Promise<void>;\n /**\n * Sets the position or time of the current player\n *\n * @param value - Must be a number equal or greater than `0`\n * @param type - Defaults to `\"position\"`\n *\n * @returns A promise which resolves to `void`\n */\n readonly seek: (value: number, type?: \"position\" | \"time\") => Promise<void>;\n /**\n * Starts or stops recording the current media\n *\n * @param path - Must be a valid string\n *\n * @returns A promise which resolves to `void`\n */\n readonly record: (path?: string) => Promise<void>;\n /**\n * Takes a snapshot of the current media\n *\n * @param path - Must be a valid string\n *\n * @returns A promise which resolves to `void`\n */\n readonly snapshot: (path: string) => Promise<void>;\n /**\n * Posts an answer to a `Dialog`\n *\n * @param action - Must be an integer of `1` or `2`\n *\n * @returns A promise which resolves to `void`\n */\n readonly postAction: (action: 1 | 2) => Promise<void>;\n /**\n * Dismisses a `Dialog`\n *\n * @returns A promise which resolves to `void`\n */\n readonly dismiss: () => Promise<void>;\n}\n\nexport type LibVlcSource = string | number | null;\n\nexport interface Tracks {\n audio?: number;\n video?: number;\n subtitle?: number;\n}\n\nexport interface Slave {\n source: NonNullable<LibVlcSource>;\n type: \"audio\" | \"subtitle\";\n selected?: boolean;\n}\n\nexport type AudioMixingMode =\n | \"mixWithOthers\"\n | \"duckOthers\"\n | \"auto\"\n | \"doNotMix\";\n\nexport interface NativeEventProps {\n target: number;\n}\n\nexport interface NativeEvent<T> {\n nativeEvent: T & NativeEventProps;\n}\n\nexport type LibVlcEvent<T> = Omit<T & NativeEventProps, \"target\">;\n\nexport interface Track {\n id: number;\n name: string;\n}\n\nexport interface MediaTracks {\n audio: Track[];\n video: Track[];\n subtitle: Track[];\n}\n\nexport interface MediaInfo {\n width: number;\n height: number;\n length: number;\n seekable: boolean;\n tracks: MediaTracks;\n}\n\nexport interface Recording {\n path: string | null;\n isRecording: boolean;\n}\n\nexport interface Dialog {\n title: string;\n text: string;\n cancelText?: string;\n action1Text?: string;\n action2Text?: string;\n}\n\n/**\n * @hidden\n */\ntype BufferingListener = () => void;\n\n/**\n * @hidden\n */\ntype PlayingListener = () => void;\n\n/**\n * @hidden\n */\ntype PausedListener = () => void;\n\n/**\n * @hidden\n */\ntype StoppedListener = () => void;\n\n/**\n * @hidden\n */\ntype EndReachedListener = () => void;\n\nexport type Error = { error: string };\n\n/**\n * @hidden\n */\ntype EncounteredErrorListener = (event: NativeEvent<Error>) => void;\n\nexport type Time = { time: number };\n\n/**\n * @hidden\n */\ntype TimeChangedListener = (event: NativeEvent<Time>) => void;\n\nexport type Position = { position: number };\n\n/**\n * @hidden\n */\ntype PositionChangedListener = (event: NativeEvent<Position>) => void;\n\n/**\n * @hidden\n */\ntype ESAddedListener = (event: NativeEvent<MediaTracks>) => void;\n\n/**\n * @hidden\n */\ntype RecordChangedListener = (event: NativeEvent<Recording>) => void;\n\nexport type Snapshot = { path: string };\n\n/**\n * @hidden\n */\ntype SnapshotTakenListener = (event: NativeEvent<Snapshot>) => void;\n\n/**\n * @hidden\n */\ntype DialogDisplayListener = (event: NativeEvent<Dialog>) => void;\n\n/**\n * @hidden\n */\ntype FirstPlayListener = (event: NativeEvent<MediaInfo>) => void;\n\n/**\n * @hidden\n */\ntype BackgroundListener = () => void;\n\n/**\n * @hidden\n */\nexport interface LibVlcPlayerViewNativeProps {\n ref?: React.Ref<LibVlcPlayerViewRef>;\n source?: LibVlcSource;\n options?: string[];\n tracks?: Tracks;\n slaves?: Slave[];\n scale?: number;\n aspectRatio?: string | null;\n rate?: number;\n time?: number;\n volume?: number;\n mute?: boolean;\n audioMixingMode?: AudioMixingMode;\n repeat?: boolean;\n playInBackground?: boolean;\n autoplay?: boolean;\n onBuffering?: BufferingListener;\n onPlaying?: PlayingListener;\n onPaused?: PausedListener;\n onStopped?: StoppedListener;\n onEndReached?: EndReachedListener;\n onEncounteredError?: EncounteredErrorListener;\n onTimeChanged?: TimeChangedListener;\n onPositionChanged?: PositionChangedListener;\n onESAdded?: ESAddedListener;\n onRecordChanged?: RecordChangedListener;\n onSnapshotTaken?: SnapshotTakenListener;\n onDialogDisplay?: DialogDisplayListener;\n onFirstPlay?: FirstPlayListener;\n onBackground?: BackgroundListener;\n}\n\nexport interface LibVlcPlayerViewProps extends ViewProps {\n /**\n * Sets the source of the media to be played. Set to `null` to release the player\n */\n source: LibVlcSource;\n /**\n * Sets the VLC options to initialize the player with\n *\n * https://wiki.videolan.org/VLC_command-line_help/\n *\n * @example [\"--network-caching=1000\"]\n *\n * @default []\n */\n options?: string[];\n /**\n * Sets the player audio, video and subtitle tracks\n *\n * @example\n * ```tsx\n * <LibVlcPlayerView\n * tracks={{\n * audio: 0,\n * video: 1,\n * subtitle: 2,\n * }}\n * />\n * ```\n *\n * @default undefined\n */\n tracks?: Tracks;\n /**\n * Sets the player audio and subtitle slaves\n *\n * @example\n * ```tsx\n * <LibVlcPlayerView\n * slaves={[\n * {\n * source: \"file://path/to/subtitle.srt\",\n * type: \"subtitle\",\n * selected: true\n * },\n * ]}\n * />\n * ```\n *\n * @default []\n */\n slaves?: Slave[];\n /**\n * Sets the player scaling factor. Must be a float equal or greater than `0`\n *\n * @default 0\n */\n scale?: number;\n /**\n * Sets the player aspect ratio. Must be a valid string or `null` for default\n *\n * @example \"16:9\"\n *\n * @default undefined\n */\n aspectRatio?: string | null;\n /**\n * Sets the player rate. Must be a float equal or greater than `1`\n *\n * @default 1\n */\n rate?: number;\n /**\n * Sets the initial player time. Must be an integer in milliseconds\n *\n * @default 0\n */\n time?: number;\n /**\n * Sets the player volume. Must be an integer between `0` and `100`\n *\n * @default 100\n */\n volume?: number;\n /**\n * Sets the player volume to `0` when `true`. Previous value is set when `false`\n *\n * @default false\n */\n mute?: boolean;\n /**\n * Determines how the player will interact with other audio playing in the system\n *\n * @default \"auto\"\n */\n audioMixingMode?: AudioMixingMode;\n /**\n * Determines whether the media should repeat once ended\n *\n * @default false\n */\n repeat?: boolean;\n /**\n * Determines whether the media should continue playing in the background\n *\n * @default false\n */\n playInBackground?: boolean;\n /**\n * Determines whether the media should autoplay once created\n *\n * @default true\n */\n autoplay?: boolean;\n /**\n * Called after the `Buffering` player event\n */\n onBuffering?: () => void;\n /**\n * Called after the `Playing` player event\n */\n onPlaying?: () => void;\n /**\n * Called after the `Paused` player event\n */\n onPaused?: () => void;\n /**\n * Called after the `Stopped` player event\n */\n onStopped?: () => void;\n /**\n * Called after the `EndReached` player event\n */\n onEndReached?: () => void;\n /**\n * Called after the `EncounteredError` player event\n */\n onEncounteredError?: (event: Error) => void;\n /**\n * Called after the `TimeChanged` player event\n */\n onTimeChanged?: (event: Time) => void;\n /**\n * Called after the `PositionChanged` player event\n */\n onPositionChanged?: (event: Position) => void;\n /**\n * Called after the `ESAdded` player event\n */\n onESAdded?: (event: MediaTracks) => void;\n /**\n * Called after the `RecordChanged` player event\n */\n onRecordChanged?: (event: Recording) => void;\n /**\n * Called after a media snapshot is taken\n */\n onSnapshotTaken?: (event: Snapshot) => void;\n /**\n * Called after a `Dialog` needs to be displayed\n */\n onDialogDisplay?: (event: Dialog) => void;\n /**\n * Called after the player first playing event\n */\n onFirstPlay?: (event: MediaInfo) => void;\n /**\n * Called after the player enters the background\n */\n onBackground?: () => void;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LibVlcPlayerView.d.ts","sourceRoot":"","sources":["../src/LibVlcPlayerView.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,qBAAqB,EACrB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"LibVlcPlayerView.d.ts","sourceRoot":"","sources":["../src/LibVlcPlayerView.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,qBAAqB,EACrB,mBAAmB,EAUpB,MAAM,sBAAsB,CAAC;AAU9B,QAAA,MAAM,gBAAgB,uHAwFrB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -42,6 +42,12 @@ const LibVlcPlayerView = forwardRef((props, ref) => {
|
|
|
42
42
|
props.onRecordChanged(nativeEvent);
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
|
+
const onSnapshotTaken = (event) => {
|
|
46
|
+
if (props.onSnapshotTaken) {
|
|
47
|
+
const nativeEvent = converNativeEvent(event);
|
|
48
|
+
props.onSnapshotTaken(nativeEvent);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
45
51
|
const onDialogDisplay = (event) => {
|
|
46
52
|
if (props.onDialogDisplay) {
|
|
47
53
|
const nativeEvent = converNativeEvent(event);
|
|
@@ -57,7 +63,7 @@ const LibVlcPlayerView = forwardRef((props, ref) => {
|
|
|
57
63
|
return (<NativeView {...nativeProps} ref={ref} source={parseSource(props.source)} slaves={props.slaves?.map((slave) => ({
|
|
58
64
|
...slave,
|
|
59
65
|
source: parseSource(slave.source),
|
|
60
|
-
}))} onEncounteredError={onEncounteredError} onTimeChanged={onTimeChanged} onPositionChanged={onPositionChanged} onESAdded={onESAdded} onRecordChanged={onRecordChanged} onDialogDisplay={onDialogDisplay} onFirstPlay={onFirstPlay}/>);
|
|
66
|
+
}))} onEncounteredError={onEncounteredError} onTimeChanged={onTimeChanged} onPositionChanged={onPositionChanged} onESAdded={onESAdded} onRecordChanged={onRecordChanged} onSnapshotTaken={onSnapshotTaken} onDialogDisplay={onDialogDisplay} onFirstPlay={onFirstPlay}/>);
|
|
61
67
|
});
|
|
62
68
|
export default LibVlcPlayerView;
|
|
63
69
|
//# sourceMappingURL=LibVlcPlayerView.js.map
|
|
@@ -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,UAAU,EAAsB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"LibVlcPlayerView.js","sourceRoot":"","sources":["../src/LibVlcPlayerView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeView } from \"expo\";\nimport { forwardRef, type ComponentType } from \"react\";\n\nimport {\n LibVlcPlayerViewNativeProps,\n LibVlcPlayerViewProps,\n LibVlcPlayerViewRef,\n type Dialog,\n type Error,\n type MediaInfo,\n type MediaTracks,\n type NativeEvent,\n type Position,\n type Recording,\n type Snapshot,\n type Time,\n} from \"./LibVlcPlayer.types\";\nimport { parseSource } from \"./utils/assets\";\nimport { converNativeEvent } from \"./utils/events\";\nimport { convertNativeProps } from \"./utils/props\";\n\nconst NativeView: ComponentType<LibVlcPlayerViewNativeProps> =\n requireNativeView(\"ExpoLibVlcPlayer\");\n\nlet loggedRenderingChildrenWarning: boolean = false;\n\nconst LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(\n (props, ref) => {\n const nativeProps = convertNativeProps(props);\n\n // @ts-expect-error\n if (nativeProps.children && !loggedRenderingChildrenWarning) {\n console.warn(\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 );\n loggedRenderingChildrenWarning = true;\n }\n\n const onEncounteredError = (event: NativeEvent<Error>) => {\n if (props.onEncounteredError) {\n const nativeEvent = converNativeEvent(event);\n props.onEncounteredError(nativeEvent);\n }\n };\n\n const onTimeChanged = (event: NativeEvent<Time>) => {\n if (props.onTimeChanged) {\n const nativeEvent = converNativeEvent(event);\n props.onTimeChanged(nativeEvent);\n }\n };\n\n const onPositionChanged = (event: NativeEvent<Position>) => {\n if (props.onPositionChanged) {\n const nativeEvent = converNativeEvent(event);\n props.onPositionChanged(nativeEvent);\n }\n };\n\n const onESAdded = (event: NativeEvent<MediaTracks>) => {\n if (props.onESAdded) {\n const nativeEvent = converNativeEvent(event);\n props.onESAdded(nativeEvent);\n }\n };\n\n const onRecordChanged = (event: NativeEvent<Recording>) => {\n if (props.onRecordChanged) {\n const nativeEvent = converNativeEvent(event);\n props.onRecordChanged(nativeEvent);\n }\n };\n\n const onSnapshotTaken = (event: NativeEvent<Snapshot>) => {\n if (props.onSnapshotTaken) {\n const nativeEvent = converNativeEvent(event);\n props.onSnapshotTaken(nativeEvent);\n }\n };\n\n const onDialogDisplay = (event: NativeEvent<Dialog>) => {\n if (props.onDialogDisplay) {\n const nativeEvent = converNativeEvent(event);\n props.onDialogDisplay(nativeEvent);\n }\n };\n\n const onFirstPlay = (event: NativeEvent<MediaInfo>) => {\n if (props.onFirstPlay) {\n const nativeEvent = converNativeEvent(event);\n props.onFirstPlay(nativeEvent);\n }\n };\n\n return (\n <NativeView\n {...nativeProps}\n ref={ref}\n source={parseSource(props.source)}\n slaves={props.slaves?.map((slave) => ({\n ...slave,\n source: parseSource(slave.source)!,\n }))}\n onEncounteredError={onEncounteredError}\n onTimeChanged={onTimeChanged}\n onPositionChanged={onPositionChanged}\n onESAdded={onESAdded}\n onRecordChanged={onRecordChanged}\n onSnapshotTaken={onSnapshotTaken}\n onDialogDisplay={onDialogDisplay}\n onFirstPlay={onFirstPlay}\n />\n );\n },\n);\n\nexport default LibVlcPlayerView;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAG1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAI,KAAqB;IACxD,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAI,KAAqB;IACxD,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;IACrD,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { LibVlcEvent, NativeEvent } from \"../LibVlcPlayer.types\";\n\nexport function converNativeEvent<T>(event: NativeEvent<T>): LibVlcEvent<T> {\n const { target, ...nativeEvent } = event.nativeEvent;\n return nativeEvent;\n}\n"]}
|
|
@@ -10,6 +10,7 @@ private let timeChangedEvent = "onTimeChanged"
|
|
|
10
10
|
private let positionChangedEvent = "onPositionChanged"
|
|
11
11
|
private let esAddedEvent = "onESAdded"
|
|
12
12
|
private let recordChangedEvent = "onRecordChanged"
|
|
13
|
+
private let snapshotTakenEvent = "onSnapshotTaken"
|
|
13
14
|
private let dialogDisplayEvent = "onDialogDisplay"
|
|
14
15
|
private let firstPlayEvent = "onFirstPlay"
|
|
15
16
|
private let backgroundEvent = "onBackground"
|
|
@@ -25,6 +26,7 @@ let playerEvents = [
|
|
|
25
26
|
positionChangedEvent,
|
|
26
27
|
esAddedEvent,
|
|
27
28
|
recordChangedEvent,
|
|
29
|
+
snapshotTakenEvent,
|
|
28
30
|
dialogDisplayEvent,
|
|
29
31
|
firstPlayEvent,
|
|
30
32
|
backgroundEvent,
|
|
@@ -121,6 +123,10 @@ public class LibVlcPlayerModule: Module {
|
|
|
121
123
|
view.record(path)
|
|
122
124
|
}
|
|
123
125
|
|
|
126
|
+
AsyncFunction("snapshot") { (view: LibVlcPlayerView, path: String) in
|
|
127
|
+
view.snapshot(path)
|
|
128
|
+
}
|
|
129
|
+
|
|
124
130
|
AsyncFunction("postAction") { (view: LibVlcPlayerView, action: Int) in
|
|
125
131
|
view.postAction(action)
|
|
126
132
|
}
|
|
@@ -40,6 +40,7 @@ class LibVlcPlayerView: ExpoView {
|
|
|
40
40
|
let onPositionChanged = EventDispatcher()
|
|
41
41
|
let onESAdded = EventDispatcher()
|
|
42
42
|
let onRecordChanged = EventDispatcher()
|
|
43
|
+
let onSnapshotTaken = EventDispatcher()
|
|
43
44
|
let onDialogDisplay = EventDispatcher()
|
|
44
45
|
let onFirstPlay = EventDispatcher()
|
|
45
46
|
let onBackground = EventDispatcher()
|
|
@@ -309,7 +310,6 @@ class LibVlcPlayerView: ExpoView {
|
|
|
309
310
|
didSet {
|
|
310
311
|
if options.hasAudioOption() {
|
|
311
312
|
let error = ["error": "Audio disabled via options"]
|
|
312
|
-
|
|
313
313
|
onEncounteredError(error)
|
|
314
314
|
}
|
|
315
315
|
|
|
@@ -326,7 +326,6 @@ class LibVlcPlayerView: ExpoView {
|
|
|
326
326
|
didSet {
|
|
327
327
|
if options.hasAudioOption() {
|
|
328
328
|
let error = ["error": "Audio disabled via options"]
|
|
329
|
-
|
|
330
329
|
onEncounteredError(error)
|
|
331
330
|
}
|
|
332
331
|
|
|
@@ -349,7 +348,6 @@ class LibVlcPlayerView: ExpoView {
|
|
|
349
348
|
didSet {
|
|
350
349
|
if options.hasRepeatOption() {
|
|
351
350
|
let error = ["error": "Repeat enabled via options"]
|
|
352
|
-
|
|
353
351
|
onEncounteredError(error)
|
|
354
352
|
}
|
|
355
353
|
}
|
|
@@ -412,8 +410,7 @@ class LibVlcPlayerView: ExpoView {
|
|
|
412
410
|
let success = !player.startRecording(atPath: path)
|
|
413
411
|
|
|
414
412
|
if !success {
|
|
415
|
-
let error = ["error": "
|
|
416
|
-
|
|
413
|
+
let error = ["error": "Media could not be recorded"]
|
|
417
414
|
onEncounteredError(error)
|
|
418
415
|
|
|
419
416
|
player.stopRecording()
|
|
@@ -424,6 +421,26 @@ class LibVlcPlayerView: ExpoView {
|
|
|
424
421
|
}
|
|
425
422
|
}
|
|
426
423
|
|
|
424
|
+
func snapshot(_ path: String) {
|
|
425
|
+
if let player = mediaPlayer {
|
|
426
|
+
let dateFormatter = DateFormatter()
|
|
427
|
+
dateFormatter.dateFormat = "yyyy-MM-dd-HH'h'mm'm'ss's'"
|
|
428
|
+
let snapshotPath = path + "/vlc-snapshot-\(dateFormatter.string(from: Date())).jpg"
|
|
429
|
+
|
|
430
|
+
let video = player.videoSize
|
|
431
|
+
let width = Int32(video.width)
|
|
432
|
+
let height = Int32(video.height)
|
|
433
|
+
|
|
434
|
+
player.saveVideoSnapshot(at: snapshotPath, withWidth: width, andHeight: height)
|
|
435
|
+
|
|
436
|
+
let path = ["path": snapshotPath]
|
|
437
|
+
onSnapshotTaken(path)
|
|
438
|
+
} else {
|
|
439
|
+
let error = ["error": "Media snapshot could not be taken"]
|
|
440
|
+
onEncounteredError(error)
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
427
444
|
func postAction(_ action: Int) {
|
|
428
445
|
if let dialog = vlcDialog, let reference = vlcDialogRef {
|
|
429
446
|
dialog.postAction(Int32(action), forDialogReference: reference)
|
|
@@ -45,14 +45,12 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
|
|
|
45
45
|
}
|
|
46
46
|
case .error:
|
|
47
47
|
let error = ["error": "Media player encountered an error"]
|
|
48
|
-
|
|
49
48
|
onEncounteredError(error)
|
|
50
49
|
|
|
51
50
|
firstPlay = true
|
|
52
51
|
firstTime = true
|
|
53
52
|
case .esAdded:
|
|
54
53
|
let mediaTracks = getMediaTracks()
|
|
55
|
-
|
|
56
54
|
onESAdded(mediaTracks)
|
|
57
55
|
default:
|
|
58
56
|
break
|
|
@@ -63,7 +61,6 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
|
|
|
63
61
|
func mediaPlayerTimeChanged(_: Notification) {
|
|
64
62
|
if let player = mediaPlayer {
|
|
65
63
|
let time = ["time": player.time.intValue]
|
|
66
|
-
|
|
67
64
|
onTimeChanged(time)
|
|
68
65
|
|
|
69
66
|
if firstTime {
|
|
@@ -78,7 +75,6 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
|
|
|
78
75
|
}
|
|
79
76
|
|
|
80
77
|
let position = ["position": player.position]
|
|
81
|
-
|
|
82
78
|
onPositionChanged(position)
|
|
83
79
|
}
|
|
84
80
|
}
|
package/package.json
CHANGED
|
@@ -31,11 +31,19 @@ export interface LibVlcPlayerViewRef {
|
|
|
31
31
|
/**
|
|
32
32
|
* Starts or stops recording the current media
|
|
33
33
|
*
|
|
34
|
-
* @param path - Must be a valid string
|
|
34
|
+
* @param path - Must be a valid string
|
|
35
35
|
*
|
|
36
36
|
* @returns A promise which resolves to `void`
|
|
37
37
|
*/
|
|
38
|
-
readonly record: (path
|
|
38
|
+
readonly record: (path?: string) => Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Takes a snapshot of the current media
|
|
41
|
+
*
|
|
42
|
+
* @param path - Must be a valid string
|
|
43
|
+
*
|
|
44
|
+
* @returns A promise which resolves to `void`
|
|
45
|
+
*/
|
|
46
|
+
readonly snapshot: (path: string) => Promise<void>;
|
|
39
47
|
/**
|
|
40
48
|
* Posts an answer to a `Dialog`
|
|
41
49
|
*
|
|
@@ -170,6 +178,13 @@ type ESAddedListener = (event: NativeEvent<MediaTracks>) => void;
|
|
|
170
178
|
*/
|
|
171
179
|
type RecordChangedListener = (event: NativeEvent<Recording>) => void;
|
|
172
180
|
|
|
181
|
+
export type Snapshot = { path: string };
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* @hidden
|
|
185
|
+
*/
|
|
186
|
+
type SnapshotTakenListener = (event: NativeEvent<Snapshot>) => void;
|
|
187
|
+
|
|
173
188
|
/**
|
|
174
189
|
* @hidden
|
|
175
190
|
*/
|
|
@@ -214,6 +229,7 @@ export interface LibVlcPlayerViewNativeProps {
|
|
|
214
229
|
onPositionChanged?: PositionChangedListener;
|
|
215
230
|
onESAdded?: ESAddedListener;
|
|
216
231
|
onRecordChanged?: RecordChangedListener;
|
|
232
|
+
onSnapshotTaken?: SnapshotTakenListener;
|
|
217
233
|
onDialogDisplay?: DialogDisplayListener;
|
|
218
234
|
onFirstPlay?: FirstPlayListener;
|
|
219
235
|
onBackground?: BackgroundListener;
|
|
@@ -372,6 +388,10 @@ export interface LibVlcPlayerViewProps extends ViewProps {
|
|
|
372
388
|
* Called after the `RecordChanged` player event
|
|
373
389
|
*/
|
|
374
390
|
onRecordChanged?: (event: Recording) => void;
|
|
391
|
+
/**
|
|
392
|
+
* Called after a media snapshot is taken
|
|
393
|
+
*/
|
|
394
|
+
onSnapshotTaken?: (event: Snapshot) => void;
|
|
375
395
|
/**
|
|
376
396
|
* Called after a `Dialog` needs to be displayed
|
|
377
397
|
*/
|
package/src/LibVlcPlayerView.tsx
CHANGED
|
@@ -5,14 +5,15 @@ import {
|
|
|
5
5
|
LibVlcPlayerViewNativeProps,
|
|
6
6
|
LibVlcPlayerViewProps,
|
|
7
7
|
LibVlcPlayerViewRef,
|
|
8
|
-
type
|
|
8
|
+
type Dialog,
|
|
9
9
|
type Error,
|
|
10
|
-
type Time,
|
|
11
|
-
type Position,
|
|
12
|
-
type MediaTracks,
|
|
13
10
|
type MediaInfo,
|
|
14
|
-
type
|
|
11
|
+
type MediaTracks,
|
|
12
|
+
type NativeEvent,
|
|
13
|
+
type Position,
|
|
15
14
|
type Recording,
|
|
15
|
+
type Snapshot,
|
|
16
|
+
type Time,
|
|
16
17
|
} from "./LibVlcPlayer.types";
|
|
17
18
|
import { parseSource } from "./utils/assets";
|
|
18
19
|
import { converNativeEvent } from "./utils/events";
|
|
@@ -38,7 +39,6 @@ const LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(
|
|
|
38
39
|
const onEncounteredError = (event: NativeEvent<Error>) => {
|
|
39
40
|
if (props.onEncounteredError) {
|
|
40
41
|
const nativeEvent = converNativeEvent(event);
|
|
41
|
-
|
|
42
42
|
props.onEncounteredError(nativeEvent);
|
|
43
43
|
}
|
|
44
44
|
};
|
|
@@ -46,7 +46,6 @@ const LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(
|
|
|
46
46
|
const onTimeChanged = (event: NativeEvent<Time>) => {
|
|
47
47
|
if (props.onTimeChanged) {
|
|
48
48
|
const nativeEvent = converNativeEvent(event);
|
|
49
|
-
|
|
50
49
|
props.onTimeChanged(nativeEvent);
|
|
51
50
|
}
|
|
52
51
|
};
|
|
@@ -54,7 +53,6 @@ const LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(
|
|
|
54
53
|
const onPositionChanged = (event: NativeEvent<Position>) => {
|
|
55
54
|
if (props.onPositionChanged) {
|
|
56
55
|
const nativeEvent = converNativeEvent(event);
|
|
57
|
-
|
|
58
56
|
props.onPositionChanged(nativeEvent);
|
|
59
57
|
}
|
|
60
58
|
};
|
|
@@ -62,7 +60,6 @@ const LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(
|
|
|
62
60
|
const onESAdded = (event: NativeEvent<MediaTracks>) => {
|
|
63
61
|
if (props.onESAdded) {
|
|
64
62
|
const nativeEvent = converNativeEvent(event);
|
|
65
|
-
|
|
66
63
|
props.onESAdded(nativeEvent);
|
|
67
64
|
}
|
|
68
65
|
};
|
|
@@ -70,15 +67,20 @@ const LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(
|
|
|
70
67
|
const onRecordChanged = (event: NativeEvent<Recording>) => {
|
|
71
68
|
if (props.onRecordChanged) {
|
|
72
69
|
const nativeEvent = converNativeEvent(event);
|
|
73
|
-
|
|
74
70
|
props.onRecordChanged(nativeEvent);
|
|
75
71
|
}
|
|
76
72
|
};
|
|
77
73
|
|
|
74
|
+
const onSnapshotTaken = (event: NativeEvent<Snapshot>) => {
|
|
75
|
+
if (props.onSnapshotTaken) {
|
|
76
|
+
const nativeEvent = converNativeEvent(event);
|
|
77
|
+
props.onSnapshotTaken(nativeEvent);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
78
81
|
const onDialogDisplay = (event: NativeEvent<Dialog>) => {
|
|
79
82
|
if (props.onDialogDisplay) {
|
|
80
83
|
const nativeEvent = converNativeEvent(event);
|
|
81
|
-
|
|
82
84
|
props.onDialogDisplay(nativeEvent);
|
|
83
85
|
}
|
|
84
86
|
};
|
|
@@ -86,7 +88,6 @@ const LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(
|
|
|
86
88
|
const onFirstPlay = (event: NativeEvent<MediaInfo>) => {
|
|
87
89
|
if (props.onFirstPlay) {
|
|
88
90
|
const nativeEvent = converNativeEvent(event);
|
|
89
|
-
|
|
90
91
|
props.onFirstPlay(nativeEvent);
|
|
91
92
|
}
|
|
92
93
|
};
|
|
@@ -105,6 +106,7 @@ const LibVlcPlayerView = forwardRef<LibVlcPlayerViewRef, LibVlcPlayerViewProps>(
|
|
|
105
106
|
onPositionChanged={onPositionChanged}
|
|
106
107
|
onESAdded={onESAdded}
|
|
107
108
|
onRecordChanged={onRecordChanged}
|
|
109
|
+
onSnapshotTaken={onSnapshotTaken}
|
|
108
110
|
onDialogDisplay={onDialogDisplay}
|
|
109
111
|
onFirstPlay={onFirstPlay}
|
|
110
112
|
/>
|