react-native-unified-player 1.0.0 → 1.0.1
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 +432 -130
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/index.tsx +3 -0
- package/nitrogen/generated/android/UnifiedPlayer+autolinking.cmake +0 -95
- package/nitrogen/generated/android/UnifiedPlayer+autolinking.gradle +0 -27
- package/nitrogen/generated/android/UnifiedPlayerOnLoad.cpp +0 -100
- package/nitrogen/generated/android/UnifiedPlayerOnLoad.hpp +0 -25
- package/nitrogen/generated/android/c++/JBandwidthData.hpp +0 -65
- package/nitrogen/generated/android/c++/JBufferConfig.hpp +0 -101
- package/nitrogen/generated/android/c++/JCustomVideoMetadata.hpp +0 -74
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.hpp +0 -126
- package/nitrogen/generated/android/c++/JFunc_void.hpp +0 -75
- package/nitrogen/generated/android/c++/JFunc_void_BandwidthData.hpp +0 -78
- package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +0 -81
- package/nitrogen/generated/android/c++/JFunc_void_VideoPlayerStatus.hpp +0 -77
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +0 -75
- package/nitrogen/generated/android/c++/JFunc_void_double.hpp +0 -75
- package/nitrogen/generated/android/c++/JFunc_void_onLoadData.hpp +0 -79
- package/nitrogen/generated/android/c++/JFunc_void_onLoadStartData.hpp +0 -82
- package/nitrogen/generated/android/c++/JFunc_void_onPlaybackStateChangeData.hpp +0 -77
- package/nitrogen/generated/android/c++/JFunc_void_onProgressData.hpp +0 -77
- package/nitrogen/generated/android/c++/JFunc_void_onVolumeChangeData.hpp +0 -77
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack__.hpp +0 -83
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_std__string_.hpp +0 -95
- package/nitrogen/generated/android/c++/JHybridVideoPlayerEventEmitterSpec.cpp +0 -223
- package/nitrogen/generated/android/c++/JHybridVideoPlayerEventEmitterSpec.hpp +0 -84
- package/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp +0 -59
- package/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp +0 -65
- package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.cpp +0 -105
- package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.hpp +0 -66
- package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.cpp +0 -123
- package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.hpp +0 -66
- package/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp +0 -298
- package/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.hpp +0 -100
- package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp +0 -55
- package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.hpp +0 -65
- package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.cpp +0 -184
- package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.hpp +0 -89
- package/nitrogen/generated/android/c++/JIgnoreSilentSwitchMode.hpp +0 -62
- package/nitrogen/generated/android/c++/JListenerSubscription.hpp +0 -67
- package/nitrogen/generated/android/c++/JLivePlaybackParams.hpp +0 -73
- package/nitrogen/generated/android/c++/JMixAudioMode.hpp +0 -65
- package/nitrogen/generated/android/c++/JNativeDrmParams.hpp +0 -111
- package/nitrogen/generated/android/c++/JNativeExternalSubtitle.hpp +0 -71
- package/nitrogen/generated/android/c++/JNativeVideoConfig.hpp +0 -136
- package/nitrogen/generated/android/c++/JOnGetLicensePayload.hpp +0 -69
- package/nitrogen/generated/android/c++/JResizeMode.hpp +0 -65
- package/nitrogen/generated/android/c++/JResolution.hpp +0 -61
- package/nitrogen/generated/android/c++/JSourceType.hpp +0 -59
- package/nitrogen/generated/android/c++/JSubtitleType.hpp +0 -68
- package/nitrogen/generated/android/c++/JSurfaceType.hpp +0 -59
- package/nitrogen/generated/android/c++/JTextTrack.hpp +0 -70
- package/nitrogen/generated/android/c++/JTimedMetadata.hpp +0 -78
- package/nitrogen/generated/android/c++/JTimedMetadataObject.hpp +0 -61
- package/nitrogen/generated/android/c++/JVariant_NullType_HybridVideoPlayerSourceSpec.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_NullType_HybridVideoPlayerSourceSpec.hpp +0 -72
- package/nitrogen/generated/android/c++/JVariant_NullType_TextTrack.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_NullType_TextTrack.hpp +0 -73
- package/nitrogen/generated/android/c++/JVideoInformation.hpp +0 -86
- package/nitrogen/generated/android/c++/JVideoOrientation.hpp +0 -74
- package/nitrogen/generated/android/c++/JVideoPlayerStatus.hpp +0 -65
- package/nitrogen/generated/android/c++/JonLoadData.hpp +0 -74
- package/nitrogen/generated/android/c++/JonLoadStartData.hpp +0 -65
- package/nitrogen/generated/android/c++/JonPlaybackStateChangeData.hpp +0 -61
- package/nitrogen/generated/android/c++/JonProgressData.hpp +0 -65
- package/nitrogen/generated/android/c++/JonVolumeChangeData.hpp +0 -61
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/BandwidthData.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/BufferConfig.kt +0 -68
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/CustomVideoMetadata.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_BandwidthData.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_TimedMetadata.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_VideoPlayerStatus.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_bool.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_double.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onLoadData.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onLoadStartData.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onPlaybackStateChangeData.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onProgressData.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onVolumeChangeData.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_std__vector_std__string_.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerEventEmitterSpec.kt +0 -229
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerFactorySpec.kt +0 -57
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerSourceFactorySpec.kt +0 -61
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerSourceSpec.kt +0 -64
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerSpec.kt +0 -181
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoViewViewManagerFactorySpec.kt +0 -57
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoViewViewManagerSpec.kt +0 -171
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/IgnoreSilentSwitchMode.kt +0 -22
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/ListenerSubscription.kt +0 -42
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/LivePlaybackParams.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/MixAudioMode.kt +0 -23
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/NativeDrmParams.kt +0 -60
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/NativeExternalSubtitle.kt +0 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/NativeVideoConfig.kt +0 -56
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/OnGetLicensePayload.kt +0 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/ResizeMode.kt +0 -23
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Resolution.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/SourceType.kt +0 -21
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/SubtitleType.kt +0 -24
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/SurfaceType.kt +0 -21
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/TextTrack.kt +0 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/TimedMetadata.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/TimedMetadataObject.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/UnifiedPlayerOnLoad.kt +0 -35
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Variant_NullType_HybridVideoPlayerSourceSpec.kt +0 -59
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Variant_NullType_TextTrack.kt +0 -59
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/VideoInformation.kt +0 -59
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/VideoOrientation.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/VideoPlayerStatus.kt +0 -23
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onLoadData.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onLoadStartData.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onPlaybackStateChangeData.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onProgressData.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onVolumeChangeData.kt +0 -41
- package/nitrogen/generated/ios/UnifiedPlayer+autolinking.rb +0 -60
- package/nitrogen/generated/ios/UnifiedPlayer-Swift-Cxx-Bridge.cpp +0 -280
- package/nitrogen/generated/ios/UnifiedPlayer-Swift-Cxx-Bridge.hpp +0 -1106
- package/nitrogen/generated/ios/UnifiedPlayer-Swift-Cxx-Umbrella.hpp +0 -162
- package/nitrogen/generated/ios/UnifiedPlayerAutolinking.mm +0 -49
- package/nitrogen/generated/ios/UnifiedPlayerAutolinking.swift +0 -55
- package/nitrogen/generated/ios/c++/HybridVideoPlayerEventEmitterSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridVideoPlayerEventEmitterSpecSwift.hpp +0 -273
- package/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.hpp +0 -81
- package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.hpp +0 -119
- package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.hpp +0 -119
- package/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.hpp +0 -250
- package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.hpp +0 -78
- package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.hpp +0 -211
- package/nitrogen/generated/ios/swift/BandwidthData.swift +0 -82
- package/nitrogen/generated/ios/swift/BufferConfig.swift +0 -278
- package/nitrogen/generated/ios/swift/CustomVideoMetadata.swift +0 -175
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.swift +0 -62
- package/nitrogen/generated/ios/swift/Func_void.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_BandwidthData.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_VideoInformation.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_VideoPlayerStatus.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_double.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_onLoadData.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_onLoadStartData.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_onPlaybackStateChangeData.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_onProgressData.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_onVolumeChangeData.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.swift +0 -66
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__string__.swift +0 -67
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +0 -47
- package/nitrogen/generated/ios/swift/HybridVideoPlayerEventEmitterSpec.swift +0 -75
- package/nitrogen/generated/ios/swift/HybridVideoPlayerEventEmitterSpec_cxx.swift +0 -472
- package/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec.swift +0 -56
- package/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec_cxx.swift +0 -138
- package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec.swift +0 -57
- package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec_cxx.swift +0 -149
- package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec.swift +0 -57
- package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec_cxx.swift +0 -150
- package/nitrogen/generated/ios/swift/HybridVideoPlayerSpec.swift +0 -81
- package/nitrogen/generated/ios/swift/HybridVideoPlayerSpec_cxx.swift +0 -483
- package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec.swift +0 -56
- package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec_cxx.swift +0 -134
- package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec.swift +0 -73
- package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec_cxx.swift +0 -383
- package/nitrogen/generated/ios/swift/IgnoreSilentSwitchMode.swift +0 -44
- package/nitrogen/generated/ios/swift/ListenerSubscription.swift +0 -47
- package/nitrogen/generated/ios/swift/LivePlaybackParams.swift +0 -140
- package/nitrogen/generated/ios/swift/MixAudioMode.swift +0 -48
- package/nitrogen/generated/ios/swift/NativeDrmParams.swift +0 -287
- package/nitrogen/generated/ios/swift/NativeExternalSubtitle.swift +0 -69
- package/nitrogen/generated/ios/swift/NativeVideoConfig.swift +0 -227
- package/nitrogen/generated/ios/swift/OnGetLicensePayload.swift +0 -69
- package/nitrogen/generated/ios/swift/ResizeMode.swift +0 -48
- package/nitrogen/generated/ios/swift/Resolution.swift +0 -47
- package/nitrogen/generated/ios/swift/SourceType.swift +0 -40
- package/nitrogen/generated/ios/swift/SubtitleType.swift +0 -52
- package/nitrogen/generated/ios/swift/SurfaceType.swift +0 -40
- package/nitrogen/generated/ios/swift/TextTrack.swift +0 -88
- package/nitrogen/generated/ios/swift/TimedMetadata.swift +0 -48
- package/nitrogen/generated/ios/swift/TimedMetadataObject.swift +0 -47
- package/nitrogen/generated/ios/swift/Variant_NullType_TextTrack.swift +0 -18
- package/nitrogen/generated/ios/swift/Variant_NullType__any_HybridVideoPlayerSourceSpec_.swift +0 -18
- package/nitrogen/generated/ios/swift/VideoInformation.swift +0 -113
- package/nitrogen/generated/ios/swift/VideoOrientation.swift +0 -60
- package/nitrogen/generated/ios/swift/VideoPlayerStatus.swift +0 -48
- package/nitrogen/generated/ios/swift/onLoadData.swift +0 -80
- package/nitrogen/generated/ios/swift/onLoadStartData.swift +0 -57
- package/nitrogen/generated/ios/swift/onPlaybackStateChangeData.swift +0 -47
- package/nitrogen/generated/ios/swift/onProgressData.swift +0 -58
- package/nitrogen/generated/ios/swift/onVolumeChangeData.swift +0 -47
- package/nitrogen/generated/shared/c++/BandwidthData.hpp +0 -83
- package/nitrogen/generated/shared/c++/BufferConfig.hpp +0 -120
- package/nitrogen/generated/shared/c++/CustomVideoMetadata.hpp +0 -92
- package/nitrogen/generated/shared/c++/HybridVideoPlayerEventEmitterSpec.cpp +0 -40
- package/nitrogen/generated/shared/c++/HybridVideoPlayerEventEmitterSpec.hpp +0 -115
- package/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.cpp +0 -21
- package/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.hpp +0 -67
- package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.cpp +0 -22
- package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.hpp +0 -69
- package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.cpp +0 -23
- package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.hpp +0 -69
- package/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.cpp +0 -57
- package/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.hpp +0 -120
- package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.cpp +0 -21
- package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.hpp +0 -64
- package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.cpp +0 -46
- package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.hpp +0 -99
- package/nitrogen/generated/shared/c++/IgnoreSilentSwitchMode.hpp +0 -80
- package/nitrogen/generated/shared/c++/ListenerSubscription.hpp +0 -75
- package/nitrogen/generated/shared/c++/LivePlaybackParams.hpp +0 -91
- package/nitrogen/generated/shared/c++/MixAudioMode.hpp +0 -84
- package/nitrogen/generated/shared/c++/NativeDrmParams.hpp +0 -105
- package/nitrogen/generated/shared/c++/NativeExternalSubtitle.hpp +0 -89
- package/nitrogen/generated/shared/c++/NativeVideoConfig.hpp +0 -113
- package/nitrogen/generated/shared/c++/OnGetLicensePayload.hpp +0 -87
- package/nitrogen/generated/shared/c++/ResizeMode.hpp +0 -84
- package/nitrogen/generated/shared/c++/Resolution.hpp +0 -79
- package/nitrogen/generated/shared/c++/SourceType.hpp +0 -76
- package/nitrogen/generated/shared/c++/SubtitleType.hpp +0 -88
- package/nitrogen/generated/shared/c++/SurfaceType.hpp +0 -76
- package/nitrogen/generated/shared/c++/TextTrack.hpp +0 -88
- package/nitrogen/generated/shared/c++/TimedMetadata.hpp +0 -77
- package/nitrogen/generated/shared/c++/TimedMetadataObject.hpp +0 -79
- package/nitrogen/generated/shared/c++/VideoInformation.hpp +0 -104
- package/nitrogen/generated/shared/c++/VideoOrientation.hpp +0 -96
- package/nitrogen/generated/shared/c++/VideoPlayerStatus.hpp +0 -84
- package/nitrogen/generated/shared/c++/onLoadData.hpp +0 -92
- package/nitrogen/generated/shared/c++/onLoadStartData.hpp +0 -84
- package/nitrogen/generated/shared/c++/onPlaybackStateChangeData.hpp +0 -79
- package/nitrogen/generated/shared/c++/onProgressData.hpp +0 -83
- package/nitrogen/generated/shared/c++/onVolumeChangeData.hpp +0 -79
package/README.md
CHANGED
|
@@ -1,172 +1,474 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://img.shields.io/npm/v/react-native-unified-player?style=flat-square&color=blue" alt="npm version" />
|
|
3
|
+
<img src="https://img.shields.io/npm/dm/react-native-unified-player?style=flat-square&color=green" alt="npm downloads" />
|
|
4
|
+
<img src="https://img.shields.io/badge/platforms-iOS%20%7C%20Android-lightgrey?style=flat-square" alt="platforms" />
|
|
5
|
+
<img src="https://img.shields.io/github/license/blueromans/react-native-unified-player?style=flat-square" alt="license" />
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<h1 align="center">React Native Unified Player</h1>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<b>A high-performance video player for React Native</b><br/>
|
|
12
|
+
Built with <a href="https://github.com/mrousavy/nitro">Nitro Modules</a> for blazing-fast native performance
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="#features">Features</a> •
|
|
17
|
+
<a href="#installation">Installation</a> •
|
|
18
|
+
<a href="#quick-start">Quick Start</a> •
|
|
19
|
+
<a href="#api-reference">API</a> •
|
|
20
|
+
<a href="#examples">Examples</a>
|
|
21
|
+
</p>
|
|
2
22
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
A React Native component for playing videos via URL, built with Fabric.
|
|
23
|
+
---
|
|
6
24
|
|
|
7
25
|
## Features
|
|
8
26
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
27
|
+
| Feature | iOS | Android |
|
|
28
|
+
|---------|:---:|:-------:|
|
|
29
|
+
| HLS / DASH Streaming | ✅ | ✅ |
|
|
30
|
+
| Local & Remote Files | ✅ | ✅ |
|
|
31
|
+
| Fullscreen Mode | ✅ | ✅ |
|
|
32
|
+
| Picture-in-Picture | ✅ | ✅ |
|
|
33
|
+
| Background Playback | ✅ | ✅ |
|
|
34
|
+
| Notification Controls | ✅ | ✅ |
|
|
35
|
+
| Subtitles / Text Tracks | ✅ | ✅ |
|
|
36
|
+
| Playback Speed Control | ✅ | ✅ |
|
|
37
|
+
| Frame Capture | ✅ | ✅ |
|
|
38
|
+
| DRM Support | 🔜 | 🔜 |
|
|
39
|
+
|
|
40
|
+
**Why Unified Player?**
|
|
41
|
+
|
|
42
|
+
- **Nitro Modules** - Direct native calls without bridge overhead
|
|
43
|
+
- **AVPlayer & ExoPlayer** - Industry-standard players under the hood
|
|
44
|
+
- **Declarative API** - Modern React hooks-based architecture
|
|
45
|
+
- **TypeScript First** - Full type safety out of the box
|
|
46
|
+
|
|
47
|
+
---
|
|
14
48
|
|
|
15
49
|
## Installation
|
|
16
50
|
|
|
17
51
|
```bash
|
|
18
|
-
|
|
52
|
+
# Using yarn
|
|
53
|
+
yarn add react-native-unified-player react-native-nitro-modules
|
|
54
|
+
|
|
55
|
+
# Using npm
|
|
56
|
+
npm install react-native-unified-player react-native-nitro-modules
|
|
19
57
|
```
|
|
20
58
|
|
|
21
|
-
|
|
59
|
+
### iOS Setup
|
|
22
60
|
|
|
23
61
|
```bash
|
|
24
|
-
|
|
62
|
+
cd ios && pod install
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Android Setup
|
|
66
|
+
|
|
67
|
+
No additional configuration required.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Quick Start
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
import React from 'react';
|
|
75
|
+
import { View, StyleSheet } from 'react-native';
|
|
76
|
+
import { UnifiedPlayerView, useVideoPlayer } from 'react-native-unified-player';
|
|
77
|
+
|
|
78
|
+
export default function App() {
|
|
79
|
+
const player = useVideoPlayer({
|
|
80
|
+
uri: 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<View style={styles.container}>
|
|
85
|
+
<UnifiedPlayerView
|
|
86
|
+
player={player}
|
|
87
|
+
style={styles.video}
|
|
88
|
+
controls
|
|
89
|
+
/>
|
|
90
|
+
</View>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const styles = StyleSheet.create({
|
|
95
|
+
container: { flex: 1, backgroundColor: '#000' },
|
|
96
|
+
video: { width: '100%', aspectRatio: 16 / 9 },
|
|
97
|
+
});
|
|
25
98
|
```
|
|
26
99
|
|
|
27
|
-
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Examples
|
|
103
|
+
|
|
104
|
+
<details>
|
|
105
|
+
<summary><b>🎮 With Playback Controls</b></summary>
|
|
28
106
|
|
|
29
|
-
|
|
107
|
+
```tsx
|
|
108
|
+
import React, { useState } from 'react';
|
|
109
|
+
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
|
|
110
|
+
import { UnifiedPlayerView, useVideoPlayer } from 'react-native-unified-player';
|
|
30
111
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
import { View } from 'react-native';
|
|
112
|
+
export default function PlayerWithControls() {
|
|
113
|
+
const [isPlaying, setIsPlaying] = useState(false);
|
|
114
|
+
const [progress, setProgress] = useState({ current: 0, duration: 0 });
|
|
35
115
|
|
|
36
|
-
const
|
|
37
|
-
|
|
116
|
+
const player = useVideoPlayer({ uri: 'https://example.com/video.mp4' }, (p) => {
|
|
117
|
+
p.loop = true;
|
|
38
118
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const readyListener = UnifiedPlayerEvents.addListener(UnifiedPlayerEventTypes.READY, () => {
|
|
42
|
-
console.log('Player is ready to play');
|
|
43
|
-
// You can call UnifiedPlayer methods here, e.g., UnifiedPlayer.play(playerRef.current.getNativeTag());
|
|
119
|
+
p.addEventListener('onPlaybackStateChange', ({ isPlaying }) => {
|
|
120
|
+
setIsPlaying(isPlaying);
|
|
44
121
|
});
|
|
45
122
|
|
|
46
|
-
|
|
47
|
-
|
|
123
|
+
p.addEventListener('onProgress', ({ currentTime, duration }) => {
|
|
124
|
+
setProgress({ current: currentTime, duration });
|
|
48
125
|
});
|
|
126
|
+
});
|
|
49
127
|
|
|
50
|
-
|
|
128
|
+
const formatTime = (seconds: number) => {
|
|
129
|
+
const mins = Math.floor(seconds / 60);
|
|
130
|
+
const secs = Math.floor(seconds % 60);
|
|
131
|
+
return `${mins}:${secs.toString().padStart(2, '0')}`;
|
|
132
|
+
};
|
|
51
133
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
134
|
+
return (
|
|
135
|
+
<View style={styles.container}>
|
|
136
|
+
<UnifiedPlayerView player={player} style={styles.video} />
|
|
137
|
+
|
|
138
|
+
<View style={styles.controls}>
|
|
139
|
+
<TouchableOpacity onPress={() => player.seekBy(-10)}>
|
|
140
|
+
<Text style={styles.button}>-10s</Text>
|
|
141
|
+
</TouchableOpacity>
|
|
142
|
+
|
|
143
|
+
<TouchableOpacity onPress={() => isPlaying ? player.pause() : player.play()}>
|
|
144
|
+
<Text style={styles.button}>{isPlaying ? '⏸️' : '▶️'}</Text>
|
|
145
|
+
</TouchableOpacity>
|
|
146
|
+
|
|
147
|
+
<TouchableOpacity onPress={() => player.seekBy(10)}>
|
|
148
|
+
<Text style={styles.button}>+10s</Text>
|
|
149
|
+
</TouchableOpacity>
|
|
150
|
+
</View>
|
|
151
|
+
|
|
152
|
+
<Text style={styles.time}>
|
|
153
|
+
{formatTime(progress.current)} / {formatTime(progress.duration)}
|
|
154
|
+
</Text>
|
|
155
|
+
</View>
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
</details>
|
|
161
|
+
|
|
162
|
+
<details>
|
|
163
|
+
<summary><b>📺 Fullscreen Mode</b></summary>
|
|
164
|
+
|
|
165
|
+
```tsx
|
|
166
|
+
import React, { useState } from 'react';
|
|
167
|
+
import { View, Button } from 'react-native';
|
|
168
|
+
import { UnifiedPlayerView, useVideoPlayer } from 'react-native-unified-player';
|
|
169
|
+
|
|
170
|
+
export default function FullscreenExample() {
|
|
171
|
+
const [isFullscreen, setIsFullscreen] = useState(false);
|
|
172
|
+
const player = useVideoPlayer({ uri: 'https://example.com/video.mp4' });
|
|
59
173
|
|
|
60
174
|
return (
|
|
61
175
|
<View style={{ flex: 1 }}>
|
|
62
176
|
<UnifiedPlayerView
|
|
63
|
-
|
|
64
|
-
style={{ width: '100%',
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// onProgress={(data) => console.log('View prop: Progress', data)}
|
|
177
|
+
player={player}
|
|
178
|
+
style={{ width: '100%', aspectRatio: 16 / 9 }}
|
|
179
|
+
fullscreen={isFullscreen}
|
|
180
|
+
onFullscreenChange={setIsFullscreen}
|
|
181
|
+
/>
|
|
182
|
+
|
|
183
|
+
<Button
|
|
184
|
+
title={isFullscreen ? 'Exit Fullscreen' : 'Enter Fullscreen'}
|
|
185
|
+
onPress={() => setIsFullscreen(!isFullscreen)}
|
|
73
186
|
/>
|
|
74
187
|
</View>
|
|
75
188
|
);
|
|
76
|
-
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
</details>
|
|
193
|
+
|
|
194
|
+
<details>
|
|
195
|
+
<summary><b>📸 Capture Video Frame</b></summary>
|
|
196
|
+
|
|
197
|
+
```tsx
|
|
198
|
+
import React, { useState } from 'react';
|
|
199
|
+
import { View, Button, Image } from 'react-native';
|
|
200
|
+
import { UnifiedPlayerView, useVideoPlayer } from 'react-native-unified-player';
|
|
201
|
+
|
|
202
|
+
export default function FrameCaptureExample() {
|
|
203
|
+
const [thumbnail, setThumbnail] = useState<string | null>(null);
|
|
204
|
+
const player = useVideoPlayer({ uri: 'https://example.com/video.mp4' });
|
|
205
|
+
|
|
206
|
+
const captureFrame = async () => {
|
|
207
|
+
try {
|
|
208
|
+
const base64 = await player.captureFrame();
|
|
209
|
+
setThumbnail(`data:image/png;base64,${base64}`);
|
|
210
|
+
} catch (error) {
|
|
211
|
+
console.error('Capture failed:', error);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
77
214
|
|
|
78
|
-
|
|
215
|
+
return (
|
|
216
|
+
<View style={{ flex: 1 }}>
|
|
217
|
+
<UnifiedPlayerView
|
|
218
|
+
player={player}
|
|
219
|
+
style={{ width: '100%', aspectRatio: 16 / 9 }}
|
|
220
|
+
/>
|
|
221
|
+
|
|
222
|
+
<Button title="Capture Frame" onPress={captureFrame} />
|
|
223
|
+
|
|
224
|
+
{thumbnail && (
|
|
225
|
+
<Image
|
|
226
|
+
source={{ uri: thumbnail }}
|
|
227
|
+
style={{ width: 200, height: 112, marginTop: 20 }}
|
|
228
|
+
/>
|
|
229
|
+
)}
|
|
230
|
+
</View>
|
|
231
|
+
);
|
|
232
|
+
}
|
|
79
233
|
```
|
|
80
234
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
| Prop | Type | Required | Description |
|
|
84
|
-
|------|------|----------|-------------|
|
|
85
|
-
| `videoUrl` | `string` \| `string[]` | Yes | Video source URL or an array of URLs for a playlist. |
|
|
86
|
-
| `style` | `ViewStyle` | Yes | Apply custom styling |
|
|
87
|
-
| `autoplay` | `boolean` | No | Autoplay video when loaded |
|
|
88
|
-
| `loop` | `boolean` | No | Should the video/playlist loop when finished. **Note:** Playlist advancement and looping are handled in the JavaScript layer via the `onPlaybackComplete` callback. The native player only loops single videos based on this prop. |
|
|
89
|
-
| `onLoadStart` | `(event: { nativeEvent?: { index?: number } }) => void` | No | Callback when video begins loading. The `event.nativeEvent` may contain an `index` property on Android when playing a playlist. |
|
|
90
|
-
| `onReadyToPlay` | `() => void` | No | Callback when video is ready to play |
|
|
91
|
-
| `onError` | `(error: any) => void` | No | Callback when an error occurs |
|
|
92
|
-
| `onPlaybackComplete` | `() => void` | No | Callback when video playback finishes. Use this callback to implement playlist advancement logic in your JavaScript code. |
|
|
93
|
-
| `onProgress` | `(data: { currentTime: number; duration: number }) => void` | No | Callback for playback progress |
|
|
94
|
-
|
|
95
|
-
## Events
|
|
96
|
-
|
|
97
|
-
Events can be listened to using `UnifiedPlayerEvents.addListener(eventType, listener)`. The available event types are defined in `UnifiedPlayerEventTypes`.
|
|
98
|
-
|
|
99
|
-
- `UnifiedPlayerEventTypes.READY` ('onReadyToPlay'): Fired when the player is ready to play.
|
|
100
|
-
- `UnifiedPlayerEventTypes.ERROR` ('onError'): Fired when an error occurs.
|
|
101
|
-
- `UnifiedPlayerEventTypes.PROGRESS` ('onProgress'): Fired during playback with current time and duration (`{ currentTime: number; duration: number }`).
|
|
102
|
-
- `UnifiedPlayerEventTypes.COMPLETE` ('onPlaybackComplete'): Fired when video playback finishes.
|
|
103
|
-
- `UnifiedPlayerEventTypes.STALLED` ('onPlaybackStalled'): Fired when playback stalls.
|
|
104
|
-
- `UnifiedPlayerEventTypes.RESUMED` ('onPlaybackResumed'): Fired when playback resumes after stalling.
|
|
105
|
-
|
|
106
|
-
## Methods
|
|
107
|
-
|
|
108
|
-
Control playback using the `UnifiedPlayer` object and the native tag of the `UnifiedPlayerView` instance (obtained via `ref.current.getNativeTag()`).
|
|
109
|
-
|
|
110
|
-
- `UnifiedPlayer.play(viewTag: number)`: Starts video playback.
|
|
111
|
-
- `UnifiedPlayer.pause(viewTag: number)`: Pauses video playback.
|
|
112
|
-
- `UnifiedPlayer.seekTo(viewTag: number, time: number)`: Seeks to a specific time in seconds.
|
|
113
|
-
- `UnifiedPlayer.getCurrentTime(viewTag: number): Promise<number>`: Gets the current playback time in seconds.
|
|
114
|
-
- `UnifiedPlayer.getDuration(viewTag: number): Promise<number>`: Gets the duration of the video in seconds.
|
|
115
|
-
|
|
116
|
-
## Development
|
|
117
|
-
|
|
118
|
-
### Prerequisites
|
|
119
|
-
|
|
120
|
-
- Node.js >= 16
|
|
121
|
-
- Yarn >= 1.22
|
|
122
|
-
- React Native >= 0.79.0
|
|
123
|
-
- iOS: Xcode >= 14.0
|
|
124
|
-
- Android: Android Studio >= 2022.3
|
|
125
|
-
|
|
126
|
-
### Setup
|
|
127
|
-
|
|
128
|
-
1. Clone the repository
|
|
129
|
-
2. Install dependencies:
|
|
130
|
-
```bash
|
|
131
|
-
yarn install
|
|
132
|
-
```
|
|
133
|
-
3. Build the project:
|
|
134
|
-
```bash
|
|
135
|
-
yarn prepare
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Running the Example App
|
|
139
|
-
|
|
140
|
-
1. Navigate to the example directory:
|
|
141
|
-
```bash
|
|
142
|
-
cd example
|
|
143
|
-
```
|
|
144
|
-
2. Install dependencies:
|
|
145
|
-
```bash
|
|
146
|
-
yarn install
|
|
147
|
-
```
|
|
148
|
-
3. Run the app:
|
|
149
|
-
```bash
|
|
150
|
-
yarn ios # for iOS
|
|
151
|
-
yarn android # for Android
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Publishing
|
|
155
|
-
|
|
156
|
-
This package is automatically published to npm when changes are pushed to the `main` or `master` branch. See [PUBLISHING.md](.github/PUBLISHING.md) for setup instructions and details about npm's new authentication system (granular access tokens).
|
|
235
|
+
</details>
|
|
157
236
|
|
|
158
|
-
|
|
237
|
+
<details>
|
|
238
|
+
<summary><b>🎚️ Playback Speed Control</b></summary>
|
|
159
239
|
|
|
160
|
-
|
|
240
|
+
```tsx
|
|
241
|
+
import React, { useState } from 'react';
|
|
242
|
+
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
|
|
243
|
+
import { UnifiedPlayerView, useVideoPlayer } from 'react-native-unified-player';
|
|
161
244
|
|
|
162
|
-
|
|
245
|
+
const SPEEDS = [0.5, 1.0, 1.25, 1.5, 2.0];
|
|
246
|
+
|
|
247
|
+
export default function SpeedControlExample() {
|
|
248
|
+
const [speed, setSpeed] = useState(1.0);
|
|
249
|
+
const player = useVideoPlayer({ uri: 'https://example.com/video.mp4' });
|
|
163
250
|
|
|
164
|
-
|
|
251
|
+
const changeSpeed = (newSpeed: number) => {
|
|
252
|
+
player.rate = newSpeed;
|
|
253
|
+
setSpeed(newSpeed);
|
|
254
|
+
};
|
|
165
255
|
|
|
166
|
-
|
|
256
|
+
return (
|
|
257
|
+
<View style={{ flex: 1 }}>
|
|
258
|
+
<UnifiedPlayerView
|
|
259
|
+
player={player}
|
|
260
|
+
style={{ width: '100%', aspectRatio: 16 / 9 }}
|
|
261
|
+
/>
|
|
262
|
+
|
|
263
|
+
<View style={styles.speedButtons}>
|
|
264
|
+
{SPEEDS.map((s) => (
|
|
265
|
+
<TouchableOpacity
|
|
266
|
+
key={s}
|
|
267
|
+
onPress={() => changeSpeed(s)}
|
|
268
|
+
style={[styles.speedBtn, speed === s && styles.activeSpeed]}
|
|
269
|
+
>
|
|
270
|
+
<Text>{s}x</Text>
|
|
271
|
+
</TouchableOpacity>
|
|
272
|
+
))}
|
|
273
|
+
</View>
|
|
274
|
+
</View>
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
</details>
|
|
280
|
+
|
|
281
|
+
<details>
|
|
282
|
+
<summary><b>📝 Subtitles / Text Tracks</b></summary>
|
|
283
|
+
|
|
284
|
+
```tsx
|
|
285
|
+
const player = useVideoPlayer({
|
|
286
|
+
uri: 'https://example.com/video.mp4',
|
|
287
|
+
externalSubtitles: [
|
|
288
|
+
{
|
|
289
|
+
label: 'English',
|
|
290
|
+
language: 'en',
|
|
291
|
+
uri: 'https://example.com/subs-en.vtt',
|
|
292
|
+
type: 'vtt',
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
label: 'Spanish',
|
|
296
|
+
language: 'es',
|
|
297
|
+
uri: 'https://example.com/subs-es.vtt',
|
|
298
|
+
type: 'vtt',
|
|
299
|
+
},
|
|
300
|
+
],
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
// Get available tracks
|
|
304
|
+
const tracks = player.getAvailableTextTracks();
|
|
305
|
+
|
|
306
|
+
// Select a track
|
|
307
|
+
player.selectTextTrack(tracks[0]);
|
|
308
|
+
|
|
309
|
+
// Disable subtitles
|
|
310
|
+
player.selectTextTrack(null);
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
</details>
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## API Reference
|
|
318
|
+
|
|
319
|
+
### `useVideoPlayer(source, setup?)`
|
|
320
|
+
|
|
321
|
+
Creates a video player instance.
|
|
322
|
+
|
|
323
|
+
```tsx
|
|
324
|
+
const player = useVideoPlayer(
|
|
325
|
+
{ uri: 'https://example.com/video.mp4' },
|
|
326
|
+
(player) => {
|
|
327
|
+
// Optional setup callback
|
|
328
|
+
player.loop = true;
|
|
329
|
+
player.volume = 0.8;
|
|
330
|
+
}
|
|
331
|
+
);
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
#### Source Options
|
|
335
|
+
|
|
336
|
+
| Property | Type | Description |
|
|
337
|
+
|----------|------|-------------|
|
|
338
|
+
| `uri` | `string` | Video URL (required) |
|
|
339
|
+
| `headers` | `Record<string, string>` | HTTP headers for the request |
|
|
340
|
+
| `bufferConfig` | `BufferConfig` | Buffer configuration |
|
|
341
|
+
| `externalSubtitles` | `ExternalSubtitle[]` | External subtitle tracks |
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
### `<UnifiedPlayerView />`
|
|
346
|
+
|
|
347
|
+
Video player component.
|
|
348
|
+
|
|
349
|
+
#### Props
|
|
350
|
+
|
|
351
|
+
| Prop | Type | Default | Description |
|
|
352
|
+
|------|------|---------|-------------|
|
|
353
|
+
| `player` | `VideoPlayer` | *required* | Player instance from `useVideoPlayer` |
|
|
354
|
+
| `style` | `ViewStyle` | - | View styling |
|
|
355
|
+
| `controls` | `boolean` | `false` | Show native controls |
|
|
356
|
+
| `fullscreen` | `boolean` | `false` | Fullscreen mode |
|
|
357
|
+
| `autoplay` | `boolean` | `true` | Auto-start playback |
|
|
358
|
+
| `resizeMode` | `ResizeMode` | `'none'` | `'contain'` \| `'cover'` \| `'stretch'` \| `'none'` |
|
|
359
|
+
| `pictureInPicture` | `boolean` | `false` | Enable PiP button |
|
|
360
|
+
| `autoEnterPictureInPicture` | `boolean` | `false` | Auto-enter PiP on background |
|
|
361
|
+
| `keepScreenAwake` | `boolean` | `true` | Prevent screen sleep |
|
|
362
|
+
| `surfaceType` | `SurfaceType` | `'surface'` | Android: `'surface'` \| `'texture'` |
|
|
363
|
+
|
|
364
|
+
#### Events
|
|
365
|
+
|
|
366
|
+
| Event | Callback |
|
|
367
|
+
|-------|----------|
|
|
368
|
+
| `onFullscreenChange` | `(isFullscreen: boolean) => void` |
|
|
369
|
+
| `onPictureInPictureChange` | `(isInPiP: boolean) => void` |
|
|
370
|
+
| `willEnterFullscreen` | `() => void` |
|
|
371
|
+
| `willExitFullscreen` | `() => void` |
|
|
372
|
+
| `willEnterPictureInPicture` | `() => void` |
|
|
373
|
+
| `willExitPictureInPicture` | `() => void` |
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
### VideoPlayer Instance
|
|
378
|
+
|
|
379
|
+
#### Properties
|
|
380
|
+
|
|
381
|
+
| Property | Type | Description |
|
|
382
|
+
|----------|------|-------------|
|
|
383
|
+
| `currentTime` | `number` | Current position (seconds) |
|
|
384
|
+
| `duration` | `number` | Total duration (seconds) |
|
|
385
|
+
| `volume` | `number` | Volume (0.0 - 1.0) |
|
|
386
|
+
| `muted` | `boolean` | Mute state |
|
|
387
|
+
| `rate` | `number` | Playback speed (1.0 = normal) |
|
|
388
|
+
| `loop` | `boolean` | Loop playback |
|
|
389
|
+
| `isPlaying` | `boolean` | Playing state |
|
|
390
|
+
| `status` | `VideoPlayerStatus` | `'idle'` \| `'loading'` \| `'readyToPlay'` \| `'error'` |
|
|
391
|
+
|
|
392
|
+
#### Methods
|
|
393
|
+
|
|
394
|
+
| Method | Returns | Description |
|
|
395
|
+
|--------|---------|-------------|
|
|
396
|
+
| `play()` | `void` | Start playback |
|
|
397
|
+
| `pause()` | `void` | Pause playback |
|
|
398
|
+
| `seekTo(seconds)` | `void` | Seek to position |
|
|
399
|
+
| `seekBy(seconds)` | `void` | Seek relative |
|
|
400
|
+
| `captureFrame()` | `Promise<string>` | Capture frame as base64 PNG |
|
|
401
|
+
| `getAvailableTextTracks()` | `TextTrack[]` | Get subtitle tracks |
|
|
402
|
+
| `selectTextTrack(track)` | `void` | Select subtitle track |
|
|
403
|
+
| `release()` | `void` | Release resources |
|
|
404
|
+
|
|
405
|
+
#### Events
|
|
406
|
+
|
|
407
|
+
Subscribe with `player.addEventListener(event, callback)`:
|
|
408
|
+
|
|
409
|
+
| Event | Payload |
|
|
410
|
+
|-------|---------|
|
|
411
|
+
| `onLoad` | `{ currentTime, duration, width, height, orientation }` |
|
|
412
|
+
| `onProgress` | `{ currentTime, duration, bufferDuration }` |
|
|
413
|
+
| `onPlaybackStateChange` | `{ isPlaying, isBuffering }` |
|
|
414
|
+
| `onStatusChange` | `VideoPlayerStatus` |
|
|
415
|
+
| `onEnd` | - |
|
|
416
|
+
| `onError` | `VideoRuntimeError` |
|
|
417
|
+
| `onBuffer` | `boolean` |
|
|
418
|
+
| `onSeek` | `number` |
|
|
419
|
+
| `onPlaybackRateChange` | `number` |
|
|
420
|
+
| `onVolumeChange` | `{ volume, muted }` |
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## Requirements
|
|
425
|
+
|
|
426
|
+
| Platform | Minimum Version |
|
|
427
|
+
|----------|-----------------|
|
|
428
|
+
| React Native | 0.76.0 |
|
|
429
|
+
| iOS | 15.1 |
|
|
430
|
+
| Android | SDK 24 (Android 7.0) |
|
|
431
|
+
| Nitro Modules | 0.27.2 |
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
## Migration from v0.x
|
|
436
|
+
|
|
437
|
+
Version 1.0.0 introduces a new architecture. Here's how to migrate:
|
|
438
|
+
|
|
439
|
+
```diff
|
|
440
|
+
- import { UnifiedPlayerView, UnifiedPlayer } from 'react-native-unified-player';
|
|
441
|
+
+ import { UnifiedPlayerView, useVideoPlayer } from 'react-native-unified-player';
|
|
442
|
+
|
|
443
|
+
- const playerRef = useRef(null);
|
|
444
|
+
+ const player = useVideoPlayer({ uri: videoUrl });
|
|
445
|
+
|
|
446
|
+
- <UnifiedPlayerView
|
|
447
|
+
- ref={playerRef}
|
|
448
|
+
- videoUrl={videoUrl}
|
|
449
|
+
- onReadyToPlay={() => console.log('Ready')}
|
|
450
|
+
- />
|
|
451
|
+
+ <UnifiedPlayerView
|
|
452
|
+
+ player={player}
|
|
453
|
+
+ controls
|
|
454
|
+
+ />
|
|
455
|
+
|
|
456
|
+
- UnifiedPlayer.play(playerRef.current.getNativeTag());
|
|
457
|
+
+ player.play();
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## Contributing
|
|
463
|
+
|
|
464
|
+
Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) before submitting a PR.
|
|
465
|
+
|
|
466
|
+
## License
|
|
167
467
|
|
|
168
|
-
Yaşar Özyurt
|
|
468
|
+
MIT © [Yaşar Özyurt](https://github.com/blueromans)
|
|
169
469
|
|
|
170
470
|
---
|
|
171
471
|
|
|
172
|
-
|
|
472
|
+
<p align="center">
|
|
473
|
+
<sub>Built with ❤️ using <a href="https://github.com/mrousavy/nitro">Nitro Modules</a></sub>
|
|
474
|
+
</p>
|
package/lib/module/index.js
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
export { useEvent } from "./core/hooks/useEvent.js";
|
|
4
4
|
export { useVideoPlayer } from "./core/hooks/useVideoPlayer.js";
|
|
5
5
|
export * from "./core/types/Events.js";
|
|
6
|
-
export { default as VideoView } from "./core/video-view/VideoView.js";
|
|
6
|
+
export { default as VideoView, default as UnifiedPlayerView } from "./core/video-view/VideoView.js";
|
|
7
7
|
export { VideoPlayer } from "./core/VideoPlayer.js";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEvent","useVideoPlayer","default","VideoView","VideoPlayer"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,0BAAuB;AAChD,SAASC,cAAc,QAAQ,gCAA6B;AAC5D,cAAc,wBAAqB;AAkBnC,SACEC,OAAO,IAAIC,SAAS,
|
|
1
|
+
{"version":3,"names":["useEvent","useVideoPlayer","default","VideoView","UnifiedPlayerView","VideoPlayer"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,0BAAuB;AAChD,SAASC,cAAc,QAAQ,gCAA6B;AAC5D,cAAc,wBAAqB;AAkBnC,SACEC,OAAO,IAAIC,SAAS,EACpBD,OAAO,IAAIE,iBAAiB,QAKvB,gCAA6B;AACpC,SAASC,WAAW,QAAQ,uBAAoB","ignoreList":[]}
|
|
@@ -8,6 +8,6 @@ export type { TextTrack } from './core/types/TextTrack';
|
|
|
8
8
|
export type { VideoConfig, VideoSource } from './core/types/VideoConfig';
|
|
9
9
|
export { type LibraryError, type PlayerError, type SourceError, type UnknownError, type VideoComponentError, type VideoError, type VideoErrorCode, type VideoRuntimeError, type VideoViewError, } from './core/types/VideoError';
|
|
10
10
|
export type { VideoPlayerStatus } from './core/types/VideoPlayerStatus';
|
|
11
|
-
export { default as VideoView, type VideoViewProps, type VideoViewRef, } from './core/video-view/VideoView';
|
|
11
|
+
export { default as VideoView, default as UnifiedPlayerView, type VideoViewProps, type VideoViewProps as UnifiedPlayerViewProps, type VideoViewRef, type VideoViewRef as UnifiedPlayerViewRef, } from './core/video-view/VideoView';
|
|
12
12
|
export { VideoPlayer } from './core/VideoPlayer';
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,cAAc,qBAAqB,CAAC;AACpC,YAAY,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,cAAc,qBAAqB,CAAC;AACpC,YAAY,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,OAAO,IAAI,iBAAiB,EAC5B,KAAK,cAAc,EACnB,KAAK,cAAc,IAAI,sBAAsB,EAC7C,KAAK,YAAY,EACjB,KAAK,YAAY,IAAI,oBAAoB,GAC1C,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-unified-player",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Unified Player",
|
|
5
5
|
"source": "./src/index.tsx",
|
|
6
6
|
"main": "./lib/module/index.js",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"@eslint/eslintrc": "^3.3.0",
|
|
69
69
|
"@eslint/js": "^9.22.0",
|
|
70
70
|
"@evilmartians/lefthook": "^1.5.0",
|
|
71
|
+
"@expo/config-plugins": "^54.0.4",
|
|
71
72
|
"@react-native/eslint-config": "^0.78.0",
|
|
72
73
|
"@release-it/conventional-changelog": "^8.0.0",
|
|
73
74
|
"@types/jest": "^29.5.5",
|
|
@@ -131,7 +132,8 @@
|
|
|
131
132
|
"@release-it/conventional-changelog": {
|
|
132
133
|
"preset": {
|
|
133
134
|
"name": "angular"
|
|
134
|
-
}
|
|
135
|
+
},
|
|
136
|
+
"ignoreRecommendedBump": true
|
|
135
137
|
}
|
|
136
138
|
},
|
|
137
139
|
"hooks": {
|
package/src/index.tsx
CHANGED
|
@@ -20,7 +20,10 @@ export {
|
|
|
20
20
|
export type { VideoPlayerStatus } from './core/types/VideoPlayerStatus';
|
|
21
21
|
export {
|
|
22
22
|
default as VideoView,
|
|
23
|
+
default as UnifiedPlayerView,
|
|
23
24
|
type VideoViewProps,
|
|
25
|
+
type VideoViewProps as UnifiedPlayerViewProps,
|
|
24
26
|
type VideoViewRef,
|
|
27
|
+
type VideoViewRef as UnifiedPlayerViewRef,
|
|
25
28
|
} from './core/video-view/VideoView';
|
|
26
29
|
export { VideoPlayer } from './core/VideoPlayer';
|