expo-video 2.1.8 → 2.2.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.
Files changed (84) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/video/VideoModule.kt +21 -1
  4. package/android/src/main/java/expo/modules/video/VideoView.kt +7 -4
  5. package/android/src/main/java/expo/modules/video/player/FirstFrameEventGenerator.kt +3 -2
  6. package/android/src/main/java/expo/modules/video/player/PlayerEvent.kt +20 -2
  7. package/android/src/main/java/expo/modules/video/player/VideoPlayer.kt +16 -1
  8. package/android/src/main/java/expo/modules/video/player/VideoPlayerAudioTracks.kt +125 -0
  9. package/android/src/main/java/expo/modules/video/records/Tracks.kt +21 -0
  10. package/android/src/main/java/expo/modules/video/records/VideoEventPayloads.kt +12 -1
  11. package/build/VideoPlayer.types.d.ts +30 -0
  12. package/build/VideoPlayer.types.d.ts.map +1 -1
  13. package/build/VideoPlayer.types.js.map +1 -1
  14. package/build/VideoPlayer.web.d.ts +3 -1
  15. package/build/VideoPlayer.web.d.ts.map +1 -1
  16. package/build/VideoPlayer.web.js +2 -0
  17. package/build/VideoPlayer.web.js.map +1 -1
  18. package/build/VideoPlayerEvents.types.d.ts +34 -1
  19. package/build/VideoPlayerEvents.types.d.ts.map +1 -1
  20. package/build/VideoPlayerEvents.types.js.map +1 -1
  21. package/build/VideoView.types.d.ts +9 -1
  22. package/build/VideoView.types.d.ts.map +1 -1
  23. package/build/VideoView.types.js.map +1 -1
  24. package/build/VideoView.web.js +1 -1
  25. package/build/VideoView.web.js.map +1 -1
  26. package/build/index.d.ts +1 -1
  27. package/build/index.d.ts.map +1 -1
  28. package/build/index.js.map +1 -1
  29. package/expo-module.config.json +1 -1
  30. package/ios/Records/Tracks.swift +13 -0
  31. package/ios/Records/VideoEventPayloads.swift +11 -0
  32. package/ios/VideoModule.swift +11 -0
  33. package/ios/VideoPlayer.swift +20 -1
  34. package/ios/VideoPlayerAudioTracks.swift +72 -0
  35. package/ios/VideoPlayerObserver.swift +15 -0
  36. package/local-maven-repo/host/exp/exponent/expo.modules.video/{2.1.8/expo.modules.video-2.1.8-sources.jar → 2.2.0/expo.modules.video-2.2.0-sources.jar} +0 -0
  37. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0-sources.jar.md5 +1 -0
  38. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0-sources.jar.sha1 +1 -0
  39. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0-sources.jar.sha256 +1 -0
  40. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0-sources.jar.sha512 +1 -0
  41. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.aar +0 -0
  42. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.aar.md5 +1 -0
  43. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.aar.sha1 +1 -0
  44. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.aar.sha256 +1 -0
  45. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.aar.sha512 +1 -0
  46. package/local-maven-repo/host/exp/exponent/expo.modules.video/{2.1.8/expo.modules.video-2.1.8.module → 2.2.0/expo.modules.video-2.2.0.module} +22 -22
  47. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.module.md5 +1 -0
  48. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.module.sha1 +1 -0
  49. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.module.sha256 +1 -0
  50. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.module.sha512 +1 -0
  51. package/local-maven-repo/host/exp/exponent/expo.modules.video/{2.1.8/expo.modules.video-2.1.8.pom → 2.2.0/expo.modules.video-2.2.0.pom} +1 -1
  52. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.pom.md5 +1 -0
  53. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.pom.sha1 +1 -0
  54. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.pom.sha256 +1 -0
  55. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.2.0/expo.modules.video-2.2.0.pom.sha512 +1 -0
  56. package/local-maven-repo/host/exp/exponent/expo.modules.video/maven-metadata.xml +4 -4
  57. package/local-maven-repo/host/exp/exponent/expo.modules.video/maven-metadata.xml.md5 +1 -1
  58. package/local-maven-repo/host/exp/exponent/expo.modules.video/maven-metadata.xml.sha1 +1 -1
  59. package/local-maven-repo/host/exp/exponent/expo.modules.video/maven-metadata.xml.sha256 +1 -1
  60. package/local-maven-repo/host/exp/exponent/expo.modules.video/maven-metadata.xml.sha512 +1 -1
  61. package/package.json +3 -3
  62. package/src/VideoPlayer.types.ts +35 -0
  63. package/src/VideoPlayer.web.tsx +3 -0
  64. package/src/VideoPlayerEvents.types.ts +40 -0
  65. package/src/VideoView.types.ts +10 -1
  66. package/src/VideoView.web.tsx +1 -1
  67. package/src/index.ts +1 -0
  68. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8-sources.jar.md5 +0 -1
  69. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8-sources.jar.sha1 +0 -1
  70. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8-sources.jar.sha256 +0 -1
  71. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8-sources.jar.sha512 +0 -1
  72. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.aar +0 -0
  73. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.aar.md5 +0 -1
  74. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.aar.sha1 +0 -1
  75. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.aar.sha256 +0 -1
  76. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.aar.sha512 +0 -1
  77. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.module.md5 +0 -1
  78. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.module.sha1 +0 -1
  79. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.module.sha256 +0 -1
  80. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.module.sha512 +0 -1
  81. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.pom.md5 +0 -1
  82. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.pom.sha1 +0 -1
  83. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.pom.sha256 +0 -1
  84. package/local-maven-repo/host/exp/exponent/expo.modules.video/2.1.8/expo.modules.video-2.1.8.pom.sha512 +0 -1
@@ -0,0 +1,72 @@
1
+ import Foundation
2
+ import AVFoundation
3
+
4
+ class VideoPlayerAudioTracks {
5
+ weak var owner: VideoPlayer?
6
+ private(set) var availableAudioTracks: [AudioTrack] = []
7
+ private(set) var currentAudioTrack: AudioTrack?
8
+
9
+ init (owner: VideoPlayer) {
10
+ self.owner = owner
11
+ }
12
+
13
+ func onNewAudioTrackSelected(audioTrack: AudioTrack?) {
14
+ currentAudioTrack = audioTrack
15
+ }
16
+
17
+ func onNewPlayerItemLoaded(playerItem: AVPlayerItem?) {
18
+ availableAudioTracks = Self.findAvailableAudioTracks(for: playerItem)
19
+ }
20
+
21
+ func selectAudioTrack(audioTrack: AudioTrack?) {
22
+ guard let currentItem = self.owner?.ref.currentItem else {
23
+ return
24
+ }
25
+
26
+ if let group = currentItem.asset.mediaSelectionGroup(forMediaCharacteristic: .audible) {
27
+ let option = group.options.first {
28
+ $0.displayName == audioTrack?.label && $0.locale?.identifier == audioTrack?.language
29
+ }
30
+ currentItem.select(option, in: group)
31
+ }
32
+ }
33
+
34
+ static func findAvailableAudioTracks(for playerItem: AVPlayerItem?) -> [AudioTrack] {
35
+ var availableAudioTracks: [AudioTrack] = []
36
+
37
+ guard let asset = playerItem?.asset else {
38
+ return availableAudioTracks
39
+ }
40
+
41
+ let mediaSelectionCharacteristics = asset.availableMediaCharacteristicsWithMediaSelectionOptions
42
+
43
+ for characteristic in mediaSelectionCharacteristics {
44
+ guard characteristic == .audible else {
45
+ continue
46
+ }
47
+
48
+ if let group = asset.mediaSelectionGroup(forMediaCharacteristic: characteristic) {
49
+ for option in group.options {
50
+ guard let audioTrack = AudioTrack.from(mediaSelectionOption: option) else {
51
+ continue
52
+ }
53
+
54
+ availableAudioTracks.append(audioTrack)
55
+ }
56
+ }
57
+ }
58
+ return availableAudioTracks
59
+ }
60
+
61
+ static func findCurrentAudioTrack(for playerItem: AVPlayerItem?) -> AudioTrack? {
62
+ guard
63
+ let currentItem = playerItem,
64
+ let mediaSelectionGroup = currentItem.asset.mediaSelectionGroup(forMediaCharacteristic: .audible),
65
+ let selectedMediaOption = currentItem.currentMediaSelection.selectedMediaOption(in: mediaSelectionGroup)
66
+ else {
67
+ return nil
68
+ }
69
+
70
+ return AudioTrack.from(mediaSelectionOption: selectedMediaOption)
71
+ }
72
+ }
@@ -24,6 +24,7 @@ protocol VideoPlayerObserverDelegate: AnyObject {
24
24
  func onTimeUpdate(player: AVPlayer, timeUpdate: TimeUpdate)
25
25
  func onAudioMixingModeChanged(player: AVPlayer, oldAudioMixingMode: AudioMixingMode, newAudioMixingMode: AudioMixingMode)
26
26
  func onSubtitleSelectionChanged(player: AVPlayer, playerItem: AVPlayerItem?, subtitleTrack: SubtitleTrack?)
27
+ func onAudioTrackSelectionChanged(player: AVPlayer, playerItem: AVPlayerItem?, audioTrack: AudioTrack?)
27
28
  func onLoadedPlayerItem(player: AVPlayer, playerItem: AVPlayerItem?)
28
29
  func onVideoTrackChanged(player: AVPlayer, oldVideoTrack: VideoTrack?, newVideoTrack: VideoTrack?)
29
30
  }
@@ -41,6 +42,7 @@ extension VideoPlayerObserverDelegate {
41
42
  func onTimeUpdate(player: AVPlayer, timeUpdate: TimeUpdate) {}
42
43
  func onAudioMixingModeChanged(player: AVPlayer, oldAudioMixingMode: AudioMixingMode, newAudioMixingMode: AudioMixingMode) {}
43
44
  func onSubtitleSelectionChanged(player: AVPlayer, playerItem: AVPlayerItem?, subtitleTrack: SubtitleTrack?) {}
45
+ func onAudioTrackSelectionChanged(player: AVPlayer, playerItem: AVPlayerItem?, audioTrack: AudioTrack?) {}
44
46
  func onLoadedPlayerItem(player: AVPlayer, playerItem: AVPlayerItem?) {}
45
47
  func onVideoTrackChanged(player: AVPlayer, oldVideoTrack: VideoTrack?, newVideoTrack: VideoTrack?) {}
46
48
  }
@@ -123,6 +125,7 @@ class VideoPlayerObserver {
123
125
  private var playerItemStatusObserver: NSKeyValueObservation?
124
126
  private var playbackLikelyToKeepUpObserver: NSKeyValueObservation?
125
127
  private var currentSubtitlesObserver: NSObjectProtocol?
128
+ private var currentAudioTracksObserver: NSObjectProtocol?
126
129
 
127
130
  init(owner: VideoPlayer) {
128
131
  self.owner = owner
@@ -241,6 +244,17 @@ class VideoPlayerObserver {
241
244
  delegate.value?.onSubtitleSelectionChanged(player: player, playerItem: playerItem, subtitleTrack: subtitleTrack)
242
245
  }
243
246
  }
247
+
248
+ currentAudioTracksObserver = NotificationCenter.default.addObserver(
249
+ forName: AVPlayerItem.mediaSelectionDidChangeNotification,
250
+ object: playerItem,
251
+ queue: nil
252
+ ) { [weak self] _ in
253
+ self?.delegates.forEach { delegate in
254
+ let audioTrack = VideoPlayerAudioTracks.findCurrentAudioTrack(for: playerItem)
255
+ delegate.value?.onAudioTrackSelectionChanged(player: player, playerItem: playerItem, audioTrack: audioTrack)
256
+ }
257
+ }
244
258
  }
245
259
 
246
260
  private func invalidateCurrentPlayerItemObservers() {
@@ -250,6 +264,7 @@ class VideoPlayerObserver {
250
264
  tracksObserver?.invalidate()
251
265
  NotificationCenter.default.removeObserver(playerItemObserver as Any)
252
266
  NotificationCenter.default.removeObserver(currentSubtitlesObserver as Any)
267
+ NotificationCenter.default.removeObserver(currentAudioTracksObserver as Any)
253
268
  }
254
269
 
255
270
  func startOrUpdateTimeUpdates(forInterval interval: Double) {
@@ -0,0 +1 @@
1
+ ff54e2221752092ebdece914b77e4504b2864fc94504c8a1887ea67a2afa5ea0
@@ -0,0 +1 @@
1
+ c7c374ab88183e831ed5a80a5e7a6f9ef2d29d4157c7b9496e30a9f87b14c4952b1e867b29f8feedbab21badccdf1b751f3a20367d1970a5e814311d96618f0e
@@ -0,0 +1 @@
1
+ 06203802abf1c39df7bef9bddb6cf7dda03e6300
@@ -0,0 +1 @@
1
+ 0022fab08b59c4346e67a4bf573af546f4f0e7eb322aee1115335e035318fa2c
@@ -0,0 +1 @@
1
+ a1501f7e947680eba85a049cf0520518bca4feca64832fbdc41383cb2c483f6253ecf8d429ad936966fcce1b0494175035399894dbce9c50f4765bd099edebf1
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "host.exp.exponent",
5
5
  "module": "expo.modules.video",
6
- "version": "2.1.8",
6
+ "version": "2.2.0",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,13 +24,13 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.video-2.1.8.aar",
28
- "url": "expo.modules.video-2.1.8.aar",
29
- "size": 418866,
30
- "sha512": "e8f0c2ae00533df951287a196987118b44cfb32b69dab44c9a88bb989f94f5e33eaa75f57cfc854966667c40c5494f94fd73f0d532cf1f0cda76080ba7565360",
31
- "sha256": "c1aecf05d8f15c1b3d7db08bcada63c446788206519e3dfd11d94fd84c45ae0b",
32
- "sha1": "900945ef879b8381ba2a3e28bf3f5306241fdd4d",
33
- "md5": "895bf3e66f666fe4356f66b27b028d1f"
27
+ "name": "expo.modules.video-2.2.0.aar",
28
+ "url": "expo.modules.video-2.2.0.aar",
29
+ "size": 444322,
30
+ "sha512": "a1501f7e947680eba85a049cf0520518bca4feca64832fbdc41383cb2c483f6253ecf8d429ad936966fcce1b0494175035399894dbce9c50f4765bd099edebf1",
31
+ "sha256": "0022fab08b59c4346e67a4bf573af546f4f0e7eb322aee1115335e035318fa2c",
32
+ "sha1": "06203802abf1c39df7bef9bddb6cf7dda03e6300",
33
+ "md5": "b87e04623a8bc68b39b0d628a278460d"
34
34
  }
35
35
  ]
36
36
  },
@@ -113,13 +113,13 @@
113
113
  ],
114
114
  "files": [
115
115
  {
116
- "name": "expo.modules.video-2.1.8.aar",
117
- "url": "expo.modules.video-2.1.8.aar",
118
- "size": 418866,
119
- "sha512": "e8f0c2ae00533df951287a196987118b44cfb32b69dab44c9a88bb989f94f5e33eaa75f57cfc854966667c40c5494f94fd73f0d532cf1f0cda76080ba7565360",
120
- "sha256": "c1aecf05d8f15c1b3d7db08bcada63c446788206519e3dfd11d94fd84c45ae0b",
121
- "sha1": "900945ef879b8381ba2a3e28bf3f5306241fdd4d",
122
- "md5": "895bf3e66f666fe4356f66b27b028d1f"
116
+ "name": "expo.modules.video-2.2.0.aar",
117
+ "url": "expo.modules.video-2.2.0.aar",
118
+ "size": 444322,
119
+ "sha512": "a1501f7e947680eba85a049cf0520518bca4feca64832fbdc41383cb2c483f6253ecf8d429ad936966fcce1b0494175035399894dbce9c50f4765bd099edebf1",
120
+ "sha256": "0022fab08b59c4346e67a4bf573af546f4f0e7eb322aee1115335e035318fa2c",
121
+ "sha1": "06203802abf1c39df7bef9bddb6cf7dda03e6300",
122
+ "md5": "b87e04623a8bc68b39b0d628a278460d"
123
123
  }
124
124
  ]
125
125
  },
@@ -133,13 +133,13 @@
133
133
  },
134
134
  "files": [
135
135
  {
136
- "name": "expo.modules.video-2.1.8-sources.jar",
137
- "url": "expo.modules.video-2.1.8-sources.jar",
138
- "size": 50672,
139
- "sha512": "1cf1f4000a799fa1ec2a2269a3a9e543acb0be0525aeb3c43636e676bb5e2f3f429138501d9c872af062e2396c0b6244d033fd47888dad7dea387f5c5dd6f9f0",
140
- "sha256": "61564c98d4114378d4bf1d04c1c75323bccebf4c5249b7dfd5892f424f4ac85f",
141
- "sha1": "28868b01957eb865b99fbd21768e0a6e0ec82b12",
142
- "md5": "f04f5b0977c4bd9196d03db94c1ce682"
136
+ "name": "expo.modules.video-2.2.0-sources.jar",
137
+ "url": "expo.modules.video-2.2.0-sources.jar",
138
+ "size": 52499,
139
+ "sha512": "c7c374ab88183e831ed5a80a5e7a6f9ef2d29d4157c7b9496e30a9f87b14c4952b1e867b29f8feedbab21badccdf1b751f3a20367d1970a5e814311d96618f0e",
140
+ "sha256": "ff54e2221752092ebdece914b77e4504b2864fc94504c8a1887ea67a2afa5ea0",
141
+ "sha1": "f26b20423aa775f88468456856f576c24bc8149b",
142
+ "md5": "6e1f79fc8674bec45f35f95a4f8933f3"
143
143
  }
144
144
  ]
145
145
  }
@@ -0,0 +1 @@
1
+ dc4736ff81e3bdb761a88697e35d0a7612f679f84daab0b6f4147510254413f2
@@ -0,0 +1 @@
1
+ 8e05e96b0ea1f0b9c965ea20642b5654d498a8be3dadfe985675d0b0dbccb06b35dae83f2a0dde27019b678f7c73a8b1cb1dab61503a658150f6a4f55560348b
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>host.exp.exponent</groupId>
11
11
  <artifactId>expo.modules.video</artifactId>
12
- <version>2.1.8</version>
12
+ <version>2.2.0</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.video</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ 49d5a63d0c4fbfb5dc9f9d45ea1512c281f2a5a2
@@ -0,0 +1 @@
1
+ af02050cf8898237faf34bc624abff592a33c4a86a34352ea485a4c3d00361f3
@@ -0,0 +1 @@
1
+ 6354cc8b4f6fc7cdb027d5c6302584ed0d5f8c79c61b77921dd6ffe0f751a1465eae20c7ae3f505a19070ea5f57edcbaff7a6af19934124f740461e734dc0f96
@@ -3,11 +3,11 @@
3
3
  <groupId>host.exp.exponent</groupId>
4
4
  <artifactId>expo.modules.video</artifactId>
5
5
  <versioning>
6
- <latest>2.1.8</latest>
7
- <release>2.1.8</release>
6
+ <latest>2.2.0</latest>
7
+ <release>2.2.0</release>
8
8
  <versions>
9
- <version>2.1.8</version>
9
+ <version>2.2.0</version>
10
10
  </versions>
11
- <lastUpdated>20250430154129</lastUpdated>
11
+ <lastUpdated>20250604230414</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- b92d9034bc621a1f4e27eaf96b4bf4f3
1
+ d7576712c099005e0070a39cce656ca6
@@ -1 +1 @@
1
- 7bfef76d4a82a0dc6fd46a65c1696e957fda80fd
1
+ 52a901eebefa6fac0c034b76185f5386b9113588
@@ -1 +1 @@
1
- abb66ae4604621ec6b7bebf13d2e9572ca6d5d3a8bc47f458b900a2c55bec304
1
+ 28ab1754acdffea060d818f3e54d1bfc0823de6c803276cf828c4371524eb793
@@ -1 +1 @@
1
- 0baa18e9fb69e4f94f9776b2b8473110f8f29adcf243b766a67c8dfb773ce91384439315ddb38dd61446d972a6c91463242c0e315f7c98f730d8e6ce8727e194
1
+ 1eb28fa579897d17888ae6f4f6dc0f996daf6c967f6dba0e239386c00c42e399b4dce3b2a8274364679e4c562ccd3b619c4e3271b0a4ed695c29b5097711c710
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "expo-video",
3
3
  "title": "Expo Video",
4
- "version": "2.1.8",
4
+ "version": "2.2.0",
5
5
  "description": "A cross-platform, performant video component for React Native and Expo with Web support",
6
6
  "main": "build/index.js",
7
7
  "types": "build/index.d.ts",
@@ -31,12 +31,12 @@
31
31
  "license": "MIT",
32
32
  "dependencies": {},
33
33
  "devDependencies": {
34
- "expo-module-scripts": "^4.1.6"
34
+ "expo-module-scripts": "^4.1.7"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "expo": "*",
38
38
  "react": "*",
39
39
  "react-native": "*"
40
40
  },
41
- "gitHead": "2055b46ab64df8f8f0211b9557d1c5f65a8e15d5"
41
+ "gitHead": "7638c800b57fe78f57cc7f129022f58e84a523c5"
42
42
  }
@@ -165,6 +165,23 @@ export declare class VideoPlayer extends SharedObject<VideoPlayerEvents> {
165
165
  */
166
166
  subtitleTrack: SubtitleTrack | null;
167
167
 
168
+ /**
169
+ * Specifies the audio track currently played by the player. `null` when no audio is played.
170
+ *
171
+ * @default null
172
+ * @platform android
173
+ * @platform ios
174
+ */
175
+ audioTrack: AudioTrack | null;
176
+
177
+ /**
178
+ * An array of audio tracks available for the current video.
179
+ *
180
+ * @platform android
181
+ * @platform ios
182
+ */
183
+ readonly availableAudioTracks: AudioTrack[];
184
+
168
185
  /**
169
186
  * An array of subtitle tracks available for the current video.
170
187
  *
@@ -576,3 +593,21 @@ export type VideoSize = {
576
593
  */
577
594
  height: number;
578
595
  };
596
+
597
+ export type AudioTrack = {
598
+ /**
599
+ * A string used by expo-video to identify the audio track.
600
+ * @platform android
601
+ */
602
+ id: string;
603
+
604
+ /**
605
+ * Language of the audio track. For example, 'en', 'pl', 'de'.
606
+ */
607
+ language: string;
608
+
609
+ /**
610
+ * Label of the audio track in the language of the device.
611
+ */
612
+ label: string;
613
+ };
@@ -9,6 +9,7 @@ import type {
9
9
  SubtitleTrack,
10
10
  AudioMixingMode,
11
11
  VideoTrack,
12
+ AudioTrack,
12
13
  } from './VideoPlayer.types';
13
14
  import type { VideoPlayerEvents } from './VideoPlayerEvents.types';
14
15
  import { VideoThumbnail } from './VideoThumbnail';
@@ -80,6 +81,8 @@ export default class VideoPlayerWeb
80
81
  bufferOptions: BufferOptions = {} as BufferOptions; // Not supported on web. Dummy to match the interface.
81
82
  subtitleTrack: SubtitleTrack | null = null; // Embedded subtitles are not supported by the html web player. Dummy to match the interface.
82
83
  availableSubtitleTracks: SubtitleTrack[] = []; // Embedded subtitles are not supported by the html web player. Dummy to match the interface.
84
+ audioTrack: AudioTrack | null = null; // Not supported on web. Dummy to match the interface.
85
+ availableAudioTracks: AudioTrack[] = []; // Not supported on web. Dummy to match the interface.
83
86
  videoTrack: VideoTrack | null = null; // Not supported on web. Dummy to match the interface.
84
87
  availableVideoTracks: VideoTrack[] = []; // Not supported on web. Dummy to match the interface.
85
88
 
@@ -4,6 +4,7 @@ import {
4
4
  VideoPlayerStatus,
5
5
  VideoSource,
6
6
  VideoTrack,
7
+ AudioTrack,
7
8
  } from './VideoPlayer.types';
8
9
 
9
10
  /**
@@ -60,6 +61,16 @@ export type VideoPlayerEvents = {
60
61
  */
61
62
  subtitleTrackChange(payload: SubtitleTrackChangeEventPayload): void;
62
63
 
64
+ /**
65
+ * Handler for an event emitted when the available audio tracks change.
66
+ */
67
+ availableAudioTracksChange(payload: AvailableAudioTracksChangeEventPayload): void;
68
+
69
+ /**
70
+ * Handler for an event emitted when the current audio track changes.
71
+ */
72
+ audioTrackChange(payload: AudioTrackChangeEventPayload): void;
73
+
63
74
  /**
64
75
  * Handler for an event emitted when the current video track changes.
65
76
  */
@@ -270,4 +281,33 @@ export type SourceLoadEventPayload = {
270
281
  * Subtitle tracks available for the loaded video source.
271
282
  */
272
283
  availableSubtitleTracks: SubtitleTrack[];
284
+
285
+ /**
286
+ * Audio tracks available for the loaded video source.
287
+ */
288
+ availableAudioTracks: AudioTrack[];
289
+ };
290
+
291
+ type AudioTrackChangeEventPayload = {
292
+ /**
293
+ * New audio track of the player.
294
+ */
295
+ audioTrack: AudioTrack | null;
296
+
297
+ /**
298
+ * Previous audio track of the player.
299
+ */
300
+ oldAudioTrack?: AudioTrack | null;
301
+ };
302
+
303
+ type AvailableAudioTracksChangeEventPayload = {
304
+ /**
305
+ * Array of available audio tracks.
306
+ */
307
+ availableAudioTracks: AudioTrack[];
308
+
309
+ /**
310
+ * Previous array of available audio tracks.
311
+ */
312
+ oldAvailableAudioTracks?: AudioTrack[];
273
313
  };
@@ -150,7 +150,16 @@ export interface VideoViewProps extends ViewProps {
150
150
  * Setting this property to `false` makes the Android behavior the same as iOS.
151
151
  *
152
152
  * @platform android
153
- * @default true
153
+ * @default false
154
154
  */
155
155
  useExoShutter?: boolean;
156
+
157
+ /**
158
+ * Determines the [cross origin policy](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/crossorigin) used by the underlying native view on web.
159
+ * If undefined, does not use CORS at all.
160
+ *
161
+ * @platform web
162
+ * @default undefined
163
+ */
164
+ crossOrigin?: 'anonymous' | 'use-credentials';
156
165
  }
@@ -183,7 +183,7 @@ export const VideoView = forwardRef((props: { player?: VideoPlayer } & VideoView
183
183
  <video
184
184
  controls={props.nativeControls ?? true}
185
185
  controlsList={props.allowsFullscreen ? undefined : 'nofullscreen'}
186
- crossOrigin="anonymous"
186
+ crossOrigin={props.crossOrigin}
187
187
  style={{
188
188
  ...mapStyles(props.style),
189
189
  objectFit: props.contentFit,
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ export {
25
25
  VideoThumbnailOptions,
26
26
  VideoSize,
27
27
  SubtitleTrack,
28
+ AudioTrack,
28
29
  VideoTrack,
29
30
  ContentType,
30
31
  } from './VideoPlayer.types';
@@ -1 +0,0 @@
1
- 61564c98d4114378d4bf1d04c1c75323bccebf4c5249b7dfd5892f424f4ac85f
@@ -1 +0,0 @@
1
- 1cf1f4000a799fa1ec2a2269a3a9e543acb0be0525aeb3c43636e676bb5e2f3f429138501d9c872af062e2396c0b6244d033fd47888dad7dea387f5c5dd6f9f0
@@ -1 +0,0 @@
1
- 900945ef879b8381ba2a3e28bf3f5306241fdd4d
@@ -1 +0,0 @@
1
- c1aecf05d8f15c1b3d7db08bcada63c446788206519e3dfd11d94fd84c45ae0b
@@ -1 +0,0 @@
1
- e8f0c2ae00533df951287a196987118b44cfb32b69dab44c9a88bb989f94f5e33eaa75f57cfc854966667c40c5494f94fd73f0d532cf1f0cda76080ba7565360
@@ -1 +0,0 @@
1
- ceba79c6f72700f8f7ee6dccf108fc8b90226043
@@ -1 +0,0 @@
1
- 096e3382fc3ebb4398cc11dd580e701d50ff51fd305fa1786d3d67cca9d238ce
@@ -1 +0,0 @@
1
- e76eb37642c26db67b90c0ac847ae96ffaf56cb2b6b40abbfa16f192f51861638991d745c76b6cdaa109de8e724ec59096ac7a1daca0829b4e6eb34cef7b2d6c
@@ -1 +0,0 @@
1
- a7b9fba84389db7c9cffb21c3ce259a62aa5a0a5
@@ -1 +0,0 @@
1
- 7ca323ffad0084944fa5ae7d586157f3df5a4cafaa3507fbf0dff8388b9e0ca5
@@ -1 +0,0 @@
1
- 6e8147a80e1d6e80e91b1b79b5aa00d506f470f8f2a4ade9c0981b07d3bab502d60e51270642459626bcb0064990086561454dc1df6fa04712953c7a440b66e6