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 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: string \| null)` | Starts or stops recording the current media. Must be a valid string or `null` |
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 | |
@@ -1,7 +1,7 @@
1
1
  apply plugin: "com.android.library"
2
2
 
3
3
  group = "expo.modules.libvlcplayer"
4
- version = "2.4.0"
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.4.0"
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 "Invalid path, media could not be recorded")
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 or `null`
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: string | null) => Promise<void>;
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":"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"}
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 or `null`\n *\n * @returns A promise which resolves to `void`\n */\n readonly record: (path: string | null) => 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\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 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 `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
+ {"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,EASpB,MAAM,sBAAsB,CAAC;AAU9B,QAAA,MAAM,gBAAgB,uHAuFrB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
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":"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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 NativeEvent,\n type Error,\n type Time,\n type Position,\n type MediaTracks,\n type MediaInfo,\n type Dialog,\n type Recording,\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\n props.onEncounteredError(nativeEvent);\n }\n };\n\n const onTimeChanged = (event: NativeEvent<Time>) => {\n if (props.onTimeChanged) {\n const nativeEvent = converNativeEvent(event);\n\n props.onTimeChanged(nativeEvent);\n }\n };\n\n const onPositionChanged = (event: NativeEvent<Position>) => {\n if (props.onPositionChanged) {\n const nativeEvent = converNativeEvent(event);\n\n props.onPositionChanged(nativeEvent);\n }\n };\n\n const onESAdded = (event: NativeEvent<MediaTracks>) => {\n if (props.onESAdded) {\n const nativeEvent = converNativeEvent(event);\n\n props.onESAdded(nativeEvent);\n }\n };\n\n const onRecordChanged = (event: NativeEvent<Recording>) => {\n if (props.onRecordChanged) {\n const nativeEvent = converNativeEvent(event);\n\n props.onRecordChanged(nativeEvent);\n }\n };\n\n const onDialogDisplay = (event: NativeEvent<Dialog>) => {\n if (props.onDialogDisplay) {\n const nativeEvent = converNativeEvent(event);\n\n props.onDialogDisplay(nativeEvent);\n }\n };\n\n const onFirstPlay = (event: NativeEvent<MediaInfo>) => {\n if (props.onFirstPlay) {\n const nativeEvent = converNativeEvent(event);\n\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 onDialogDisplay={onDialogDisplay}\n onFirstPlay={onFirstPlay}\n />\n );\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,UAAU,EAAsB,MAAM,OAAO,CAAC;AAgBvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,UAAU,GACd,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;AAExC,IAAI,8BAA8B,GAAY,KAAK,CAAC;AAEpD,MAAM,gBAAgB,GAAG,UAAU,CACjC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACb,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE9C,mBAAmB;IACnB,IAAI,WAAW,CAAC,QAAQ,IAAI,CAAC,8BAA8B,EAAE,CAAC;QAC5D,OAAO,CAAC,IAAI,CACV,gNAAgN,CACjN,CAAC;QACF,8BAA8B,GAAG,IAAI,CAAC;IACxC,CAAC;IAED,MAAM,kBAAkB,GAAG,CAAC,KAAyB,EAAE,EAAE;QACvD,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAwB,EAAE,EAAE;QACjD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAA4B,EAAE,EAAE;QACzD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,KAA+B,EAAE,EAAE;QACpD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,KAA6B,EAAE,EAAE;QACxD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,EAAE;QACvD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,KAA0B,EAAE,EAAE;QACrD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAA6B,EAAE,EAAE;QACpD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,UAAU,CACT,IAAI,WAAW,CAAC,CAChB,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,MAAM,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAClC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpC,GAAG,KAAK;YACR,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAE;SACnC,CAAC,CAAC,CAAC,CACJ,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CACvC,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,eAAe,CAAC,CAAC,eAAe,CAAC,CACjC,WAAW,CAAC,CAAC,WAAW,CAAC,EACzB,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,gBAAgB,CAAC","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,CAI1E"}
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;IAErD,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\n return nativeEvent;\n}\n"]}
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": "Invalid path, media could not be recorded"]
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-libvlc-player",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "LibVLC Player for Expo",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -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 or `null`
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: string | null) => Promise<void>;
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
  */
@@ -5,14 +5,15 @@ import {
5
5
  LibVlcPlayerViewNativeProps,
6
6
  LibVlcPlayerViewProps,
7
7
  LibVlcPlayerViewRef,
8
- type NativeEvent,
8
+ type Dialog,
9
9
  type Error,
10
- type Time,
11
- type Position,
12
- type MediaTracks,
13
10
  type MediaInfo,
14
- type Dialog,
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
  />
@@ -2,6 +2,5 @@ import { LibVlcEvent, NativeEvent } from "../LibVlcPlayer.types";
2
2
 
3
3
  export function converNativeEvent<T>(event: NativeEvent<T>): LibVlcEvent<T> {
4
4
  const { target, ...nativeEvent } = event.nativeEvent;
5
-
6
5
  return nativeEvent;
7
6
  }