master a01d203bcbaf cached
616 files
1.7 MB
444.2k tokens
1610 symbols
1 requests
Download .txt
Showing preview only (1,882K chars total). Download the full file or copy to clipboard to get everything.
Repository: TheWidlarzGroup/react-native-video
Branch: master
Commit: a01d203bcbaf
Files: 616
Total size: 1.7 MB

Directory structure:
gitextract_c7gy42g0/

├── .github/
│   ├── actions/
│   │   └── setup-bun/
│   │       └── action.yml
│   └── workflows/
│       ├── deploy-docs.yml
│       └── test-docs-build.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── bunfig.toml
├── config/
│   ├── .editorconfig
│   ├── .eslintrc.js
│   └── tsconfig.json
├── docs/
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── README.md
│   ├── docs/
│   │   ├── fundamentals/
│   │   │   ├── _category_.json
│   │   │   ├── configuration/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── with-expo.md
│   │   │   │   └── without-expo.md
│   │   │   ├── installation.md
│   │   │   └── intro.mdx
│   │   ├── offer.mdx
│   │   ├── player/
│   │   │   ├── _category_.json
│   │   │   ├── analytics/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── manual.md
│   │   │   │   └── simple.md
│   │   │   ├── downloading/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── downloading.md
│   │   │   │   ├── drm-downloading.md
│   │   │   │   ├── events-downloading.md
│   │   │   │   ├── getting-started.md
│   │   │   │   └── track-selection.md
│   │   │   ├── drm.md
│   │   │   ├── events.md
│   │   │   ├── player.md
│   │   │   ├── use-video-player.md
│   │   │   └── video-player.md
│   │   ├── plugins/
│   │   │   ├── _category_.json
│   │   │   ├── ask-for-plugin.md
│   │   │   ├── examples.md
│   │   │   ├── interface.md
│   │   │   ├── plugins.mdx
│   │   │   ├── registry.md
│   │   │   └── use-in-third-party-library.md
│   │   ├── projects.md
│   │   ├── updating.md
│   │   └── video-view/
│   │       ├── _category_.json
│   │       ├── chapters.md
│   │       ├── events.md
│   │       ├── methods.md
│   │       ├── props.md
│   │       └── video-view.md
│   ├── docusaurus.config.ts
│   ├── package.json
│   ├── sidebars.ts
│   ├── src/
│   │   ├── components/
│   │   │   ├── Homepage/
│   │   │   │   ├── Enterprise/
│   │   │   │   │   ├── Enterprise.module.css
│   │   │   │   │   ├── Enterprise.tsx
│   │   │   │   │   └── FeatureCard/
│   │   │   │   │       ├── FeatureCard.module.css
│   │   │   │   │       └── FeatureCard.tsx
│   │   │   │   ├── Features/
│   │   │   │   │   ├── Feature/
│   │   │   │   │   │   ├── Feature.module.css
│   │   │   │   │   │   └── Feature.tsx
│   │   │   │   │   ├── Features.module.css
│   │   │   │   │   └── Features.tsx
│   │   │   │   └── Hero/
│   │   │   │       ├── Badge/
│   │   │   │       │   ├── Badge.module.css
│   │   │   │       │   └── Badge.tsx
│   │   │   │       ├── Buttons/
│   │   │   │       │   ├── Buttons.module.css
│   │   │   │       │   └── Buttons.tsx
│   │   │   │       ├── Hero.module.css
│   │   │   │       ├── Hero.tsx
│   │   │   │       ├── ScrollIndicator/
│   │   │   │       │   ├── ScrollIndicator.module.css
│   │   │   │       │   └── ScrollIndicator.tsx
│   │   │   │       └── Stats/
│   │   │   │           ├── Stats.module.css
│   │   │   │           └── Stats.tsx
│   │   │   ├── Intro/
│   │   │   │   ├── V7ApiModel/
│   │   │   │   │   ├── V7ApiModel.module.css
│   │   │   │   │   └── V7ApiModel.tsx
│   │   │   │   ├── V7FeatureCards/
│   │   │   │   │   ├── V7FeatureCards.module.css
│   │   │   │   │   └── V7FeatureCards.tsx
│   │   │   │   ├── V7Lead/
│   │   │   │   │   ├── V7Lead.module.css
│   │   │   │   │   └── V7Lead.tsx
│   │   │   │   ├── V7NitroSection/
│   │   │   │   │   ├── V7NitroSection.module.css
│   │   │   │   │   └── V7NitroSection.tsx
│   │   │   │   ├── V7OpenSource/
│   │   │   │   │   ├── V7OpenSource.module.css
│   │   │   │   │   └── V7OpenSource.tsx
│   │   │   │   ├── V7ProPlugins/
│   │   │   │   │   ├── V7ProPlugins.module.css
│   │   │   │   │   └── V7ProPlugins.tsx
│   │   │   │   ├── V7StatusTimeline/
│   │   │   │   │   ├── V7StatusTimeline.module.css
│   │   │   │   │   └── V7StatusTimeline.tsx
│   │   │   │   └── index.ts
│   │   │   ├── Offer/
│   │   │   │   ├── Contact/
│   │   │   │   │   ├── Contact.module.css
│   │   │   │   │   └── Contact.tsx
│   │   │   │   ├── DecisionTable/
│   │   │   │   │   ├── DecisionTable.module.css
│   │   │   │   │   └── DecisionTable.tsx
│   │   │   │   ├── Extensions/
│   │   │   │   │   ├── Extensions.module.css
│   │   │   │   │   └── Extensions.tsx
│   │   │   │   ├── Hero/
│   │   │   │   │   ├── IntroHero.module.css
│   │   │   │   │   └── IntroHero.tsx
│   │   │   │   ├── HowItWorks/
│   │   │   │   │   ├── HowItWorks.module.css
│   │   │   │   │   └── HowItWorks.tsx
│   │   │   │   ├── Migration/
│   │   │   │   │   ├── Migration.module.css
│   │   │   │   │   └── Migration.tsx
│   │   │   │   ├── OfferCards/
│   │   │   │   │   ├── OfferCards.module.css
│   │   │   │   │   └── OfferCards.tsx
│   │   │   │   ├── Services/
│   │   │   │   │   ├── Services.module.css
│   │   │   │   │   └── Services.tsx
│   │   │   │   └── index.ts
│   │   │   └── PlatformsList/
│   │   │       ├── PlatformsList.module.css
│   │   │       └── PlatformsList.tsx
│   │   ├── css/
│   │   │   └── custom.css
│   │   └── pages/
│   │       ├── index.module.css
│   │       └── index.tsx
│   ├── static/
│   │   └── .nojekyll
│   ├── tsconfig.json
│   ├── versioned_docs/
│   │   └── version-6.x/
│   │       ├── component/
│   │       │   ├── _category_.json
│   │       │   ├── ads.md
│   │       │   ├── drm.mdx
│   │       │   ├── events.mdx
│   │       │   ├── methods.mdx
│   │       │   └── props.mdx
│   │       ├── installation.md
│   │       ├── intro.md
│   │       ├── other/
│   │       │   ├── _category_.json
│   │       │   ├── caching.md
│   │       │   ├── debug.md
│   │       │   ├── downloading.md
│   │       │   ├── expo.md
│   │       │   ├── misc.md
│   │       │   ├── new-arch.md
│   │       │   └── plugin.md
│   │       ├── projects.md
│   │       └── updating.md
│   ├── versioned_sidebars/
│   │   └── version-6.x-sidebars.json
│   └── versions.json
├── example/
│   ├── .bundle/
│   │   └── config
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .watchmanconfig
│   ├── Gemfile
│   ├── android/
│   │   ├── app/
│   │   │   ├── build.gradle
│   │   │   ├── debug.keystore
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── debug/
│   │   │       │   └── AndroidManifest.xml
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── videoexample/
│   │   │           │           ├── MainActivity.kt
│   │   │           │           └── MainApplication.kt
│   │   │           └── res/
│   │   │               ├── drawable/
│   │   │               │   └── rn_edit_text_material.xml
│   │   │               └── values/
│   │   │                   ├── strings.xml
│   │   │                   └── styles.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   ├── app.json
│   ├── babel.config.js
│   ├── index.js
│   ├── ios/
│   │   ├── .xcode.env
│   │   ├── Podfile
│   │   ├── VideoExample/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Images.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── Contents.json
│   │   │   ├── Info.plist
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── PrivacyInfo.xcprivacy
│   │   ├── VideoExample-Bridging-Header.h
│   │   ├── VideoExample.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── VideoExample.xcscheme
│   │   ├── VideoExample.xcworkspace/
│   │   │   └── contents.xcworkspacedata
│   │   └── VideoExampleTests/
│   │       ├── Info.plist
│   │       └── VideoExampleTests.m
│   ├── metro.config.js
│   ├── package.json
│   ├── src/
│   │   ├── App.tsx
│   │   ├── components/
│   │   │   ├── Controls.tsx
│   │   │   └── TextTrackManager.tsx
│   │   ├── styles.ts
│   │   ├── types/
│   │   │   └── videoSettings.ts
│   │   └── utils/
│   │       ├── time.ts
│   │       └── videoSource.ts
│   └── tsconfig.json
├── lefthook.yml
├── package.json
├── packages/
│   ├── drm-plugin/
│   │   ├── .eslintrc.js
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── .watchmanconfig
│   │   ├── README.md
│   │   ├── ReactNativeVideoDrm.podspec
│   │   ├── android/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── build.gradle
│   │   │   ├── gradle.properties
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── cpp/
│   │   │           │   └── cpp-adapter.cpp
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── twg/
│   │   │                       └── videodrm/
│   │   │                           ├── DRMManager/
│   │   │                           │   └── DRMManager.kt
│   │   │                           ├── DRMPlugin.kt
│   │   │                           ├── PluginManager.kt
│   │   │                           └── VideoDrmPackage.kt
│   │   ├── babel.config.js
│   │   ├── ios/
│   │   │   ├── DRMManager/
│   │   │   │   ├── DRMManager+AVContentKeySessionDelegate.swift
│   │   │   │   └── DRMManager.swift
│   │   │   ├── DRMPlugin.swift
│   │   │   └── PluginManager.swift
│   │   ├── nitro.json
│   │   ├── nitrogen/
│   │   │   └── generated/
│   │   │       ├── .gitattributes
│   │   │       ├── android/
│   │   │       │   ├── ReactNativeVideoDrm+autolinking.cmake
│   │   │       │   ├── ReactNativeVideoDrm+autolinking.gradle
│   │   │       │   ├── ReactNativeVideoDrmOnLoad.cpp
│   │   │       │   ├── ReactNativeVideoDrmOnLoad.hpp
│   │   │       │   ├── c++/
│   │   │       │   │   ├── JHybridPluginManagerSpec.cpp
│   │   │       │   │   └── JHybridPluginManagerSpec.hpp
│   │   │       │   └── kotlin/
│   │   │       │       └── com/
│   │   │       │           └── margelo/
│   │   │       │               └── nitro/
│   │   │       │                   └── videodrm/
│   │   │       │                       ├── HybridPluginManagerSpec.kt
│   │   │       │                       └── ReactNativeVideoDrmOnLoad.kt
│   │   │       ├── ios/
│   │   │       │   ├── ReactNativeVideoDrm+autolinking.rb
│   │   │       │   ├── ReactNativeVideoDrm-Swift-Cxx-Bridge.cpp
│   │   │       │   ├── ReactNativeVideoDrm-Swift-Cxx-Bridge.hpp
│   │   │       │   ├── ReactNativeVideoDrm-Swift-Cxx-Umbrella.hpp
│   │   │       │   ├── ReactNativeVideoDrmAutolinking.mm
│   │   │       │   ├── ReactNativeVideoDrmAutolinking.swift
│   │   │       │   ├── c++/
│   │   │       │   │   ├── HybridPluginManagerSpecSwift.cpp
│   │   │       │   │   └── HybridPluginManagerSpecSwift.hpp
│   │   │       │   └── swift/
│   │   │       │       ├── HybridPluginManagerSpec.swift
│   │   │       │       └── HybridPluginManagerSpec_cxx.swift
│   │   │       └── shared/
│   │   │           └── c++/
│   │   │               ├── HybridPluginManagerSpec.cpp
│   │   │               └── HybridPluginManagerSpec.hpp
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── PluginManager.nitro.ts
│   │   │   └── index.tsx
│   │   ├── tsconfig.build.json
│   │   └── tsconfig.json
│   └── react-native-video/
│       ├── .eslintrc.js
│       ├── .gitignore
│       ├── .watchmanconfig
│       ├── ReactNativeVideo.podspec
│       ├── android/
│       │   ├── CMakeLists.txt
│       │   ├── build.gradle
│       │   ├── fix-prefab.gradle
│       │   ├── gradle.properties
│       │   └── src/
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── AndroidManifestNew.xml
│       │       │   ├── cpp/
│       │       │   │   └── cpp-adapter.cpp
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── twg/
│       │       │   │           └── video/
│       │       │   │               ├── core/
│       │       │   │               │   ├── AudioFocusManager.kt
│       │       │   │               │   ├── VideoError.kt
│       │       │   │               │   ├── VideoManager.kt
│       │       │   │               │   ├── extensions/
│       │       │   │               │   │   ├── ResizeMode+AspectRatioFrameLayout.kt
│       │       │   │               │   │   ├── SubtitleType+toString.kt
│       │       │   │               │   │   └── VideoPlaybackService+ServiceManagment.kt
│       │       │   │               │   ├── fragments/
│       │       │   │               │   │   ├── FullscreenVideoFragment.kt
│       │       │   │               │   │   └── PictureInPictureHelperFragment.kt
│       │       │   │               │   ├── player/
│       │       │   │               │   │   ├── DRMManagerSpec.kt
│       │       │   │               │   │   ├── DataSourceFactoryUtils.kt
│       │       │   │               │   │   ├── MediaItemUtils.kt
│       │       │   │               │   │   ├── MediaSourceUtils.kt
│       │       │   │               │   │   └── OnAudioFocusChangedListener.kt
│       │       │   │               │   ├── plugins/
│       │       │   │               │   │   ├── PluginsRegistry.kt
│       │       │   │               │   │   └── ReactNativeVideoPlugin.kt
│       │       │   │               │   ├── recivers/
│       │       │   │               │   │   └── AudioBecomingNoisyReceiver.kt
│       │       │   │               │   ├── services/
│       │       │   │               │   │   └── playback/
│       │       │   │               │   │       ├── CustomMediaNotificationProvider.kt
│       │       │   │               │   │       ├── VideoPlaybackCallback.kt
│       │       │   │               │   │       ├── VideoPlaybackService.kt
│       │       │   │               │   │       └── VideoPlaybackServiceConnection.kt
│       │       │   │               │   └── utils/
│       │       │   │               │       ├── PictureInPictureUtils.kt
│       │       │   │               │       ├── SmallVideoPlayerOptimizer.kt
│       │       │   │               │       ├── SourceLoader.kt
│       │       │   │               │       ├── TextTrackUtils.kt
│       │       │   │               │       ├── Threading.kt
│       │       │   │               │       ├── VideoFileHelper.kt
│       │       │   │               │       ├── VideoInformationUtils.kt
│       │       │   │               │       └── VideoOrientationUtils.kt
│       │       │   │               ├── hybrids/
│       │       │   │               │   ├── videoplayer/
│       │       │   │               │   │   ├── HybridVideoPlayer.kt
│       │       │   │               │   │   └── HybridVideoPlayerFactory.kt
│       │       │   │               │   ├── videoplayereventemitter/
│       │       │   │               │   │   └── HybridVideoPlayerEventEmitter.kt
│       │       │   │               │   ├── videoplayersource/
│       │       │   │               │   │   ├── HybridVideoPlayerSource.kt
│       │       │   │               │   │   └── HybridVideoPlayerSourceFactory.kt
│       │       │   │               │   └── videoviewviewmanager/
│       │       │   │               │       ├── HybridVideoViewViewManager.kt
│       │       │   │               │       └── HybridVideoViewViewManagerFactory.kt
│       │       │   │               ├── react/
│       │       │   │               │   ├── VideoPackage.kt
│       │       │   │               │   └── VideoViewViewManager.kt
│       │       │   │               └── view/
│       │       │   │                   └── VideoView.kt
│       │       │   └── res/
│       │       │       └── layout/
│       │       │           ├── player_view_surface.xml
│       │       │           └── player_view_texture.xml
│       │       ├── paper/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── facebook/
│       │       │               └── react/
│       │       │                   └── viewmanagers/
│       │       │                       ├── RNCVideoViewManagerDelegate.java
│       │       │                       └── RNCVideoViewManagerInterface.java
│       │       └── stubs/
│       │           ├── dash/
│       │           │   └── androidx/
│       │           │       └── media3/
│       │           │           └── exoplayer/
│       │           │               └── dash/
│       │           │                   ├── DashMediaSource.kt
│       │           │                   ├── DashUtil.kt
│       │           │                   └── manifest/
│       │           │                       ├── AdaptationSet.kt
│       │           │                       ├── DashManifest.kt
│       │           │                       ├── Period.kt
│       │           │                       └── Representation.kt
│       │           └── hls/
│       │               └── androidx/
│       │                   └── media3/
│       │                       └── exoplayer/
│       │                           └── hls/
│       │                               └── HlsMediaSource.kt
│       ├── app.plugin.js
│       ├── babel.config.js
│       ├── ios/
│       │   ├── Video-Bridging-Header.h
│       │   ├── core/
│       │   │   ├── Extensions/
│       │   │   │   ├── AVAsset+estimatedMemoryUsage.swift
│       │   │   │   ├── AVAssetTrack+orientation.swift
│       │   │   │   ├── AVMetadataItem+make.swift
│       │   │   │   ├── AVPlayerItem+externalSubtitles.swift
│       │   │   │   ├── AVPlayerItem+getBufferedDurration.swift
│       │   │   │   ├── AVPlayerItem+setBufferConfig.swift
│       │   │   │   ├── AVPlayerViewController+Fullscreen.swift
│       │   │   │   ├── AVPlayerViewController+PictureInPicture.swift
│       │   │   │   ├── AVURLAsset+getAssetInformation.swift
│       │   │   │   ├── NSObject+PerformIfResponds.swift
│       │   │   │   └── ResizeMode+VideoGravity.swift
│       │   │   ├── HLSSubtitleInjector.swift
│       │   │   ├── NowPlayingInfoCenterManager.swift
│       │   │   ├── Plugins/
│       │   │   │   ├── PluginsRegistry.swift
│       │   │   │   └── ReactNativeVideoPlugin.swift
│       │   │   ├── Spec/
│       │   │   │   ├── DRMManagerSpec.swift
│       │   │   │   ├── NativeVideoPlayerSourceSpec.swift
│       │   │   │   └── NativeVideoPlayerSpec.swift
│       │   │   ├── Utils/
│       │   │   │   ├── ExternalSubtitlesUtils.swift
│       │   │   │   ├── HLSManifestParser.swift
│       │   │   │   └── Weak.swift
│       │   │   ├── VideoError.swift
│       │   │   ├── VideoFileHelper.swift
│       │   │   ├── VideoManager.swift
│       │   │   └── VideoPlayerObserver.swift
│       │   ├── hybrids/
│       │   │   ├── VideoPlayer/
│       │   │   │   ├── HybridVideoPlayer+Events.swift
│       │   │   │   ├── HybridVideoPlayer.swift
│       │   │   │   └── HybridVideoPlayerFactory.swift
│       │   │   ├── VideoPlayerEmitter/
│       │   │   │   └── HybridVideoPlayerEventEmitter.swift
│       │   │   ├── VideoPlayerSource/
│       │   │   │   ├── HybridVideoPlayerSource.swift
│       │   │   │   ├── HybridVideoPlayerSourceFactory.swift
│       │   │   │   └── SourceLoader.swift
│       │   │   └── VideoViewViewManager/
│       │   │       ├── HybridVideoViewViewManager.swift
│       │   │       └── HybridVideoViewViewManagerFactory.swift
│       │   └── view/
│       │       ├── VideoComponentView.swift
│       │       ├── VideoComponentViewObserver.swift
│       │       ├── fabric/
│       │       │   ├── RCTVideoViewComponentView.h
│       │       │   ├── RCTVideoViewComponentView.mm
│       │       │   └── RCTVideoViewViewManager.mm
│       │       └── paper/
│       │           ├── RCTVideoViewComponentView.h
│       │           ├── RCTVideoViewComponentView.mm
│       │           └── RCTVideoViewViewManager.m
│       ├── nitro.json
│       ├── nitrogen/
│       │   └── generated/
│       │       ├── .gitattributes
│       │       ├── android/
│       │       │   ├── ReactNativeVideo+autolinking.cmake
│       │       │   ├── ReactNativeVideo+autolinking.gradle
│       │       │   ├── ReactNativeVideoOnLoad.cpp
│       │       │   ├── ReactNativeVideoOnLoad.hpp
│       │       │   ├── c++/
│       │       │   │   ├── JBandwidthData.hpp
│       │       │   │   ├── JBufferConfig.hpp
│       │       │   │   ├── JCustomVideoMetadata.hpp
│       │       │   │   ├── JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.hpp
│       │       │   │   ├── JFunc_void.hpp
│       │       │   │   ├── JFunc_void_BandwidthData.hpp
│       │       │   │   ├── JFunc_void_TimedMetadata.hpp
│       │       │   │   ├── JFunc_void_VideoPlayerStatus.hpp
│       │       │   │   ├── JFunc_void_bool.hpp
│       │       │   │   ├── JFunc_void_double.hpp
│       │       │   │   ├── JFunc_void_onLoadData.hpp
│       │       │   │   ├── JFunc_void_onLoadStartData.hpp
│       │       │   │   ├── JFunc_void_onPlaybackStateChangeData.hpp
│       │       │   │   ├── JFunc_void_onProgressData.hpp
│       │       │   │   ├── JFunc_void_onVolumeChangeData.hpp
│       │       │   │   ├── JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack__.hpp
│       │       │   │   ├── JFunc_void_std__vector_std__string_.hpp
│       │       │   │   ├── JHybridVideoPlayerEventEmitterSpec.cpp
│       │       │   │   ├── JHybridVideoPlayerEventEmitterSpec.hpp
│       │       │   │   ├── JHybridVideoPlayerFactorySpec.cpp
│       │       │   │   ├── JHybridVideoPlayerFactorySpec.hpp
│       │       │   │   ├── JHybridVideoPlayerSourceFactorySpec.cpp
│       │       │   │   ├── JHybridVideoPlayerSourceFactorySpec.hpp
│       │       │   │   ├── JHybridVideoPlayerSourceSpec.cpp
│       │       │   │   ├── JHybridVideoPlayerSourceSpec.hpp
│       │       │   │   ├── JHybridVideoPlayerSpec.cpp
│       │       │   │   ├── JHybridVideoPlayerSpec.hpp
│       │       │   │   ├── JHybridVideoViewViewManagerFactorySpec.cpp
│       │       │   │   ├── JHybridVideoViewViewManagerFactorySpec.hpp
│       │       │   │   ├── JHybridVideoViewViewManagerSpec.cpp
│       │       │   │   ├── JHybridVideoViewViewManagerSpec.hpp
│       │       │   │   ├── JIgnoreSilentSwitchMode.hpp
│       │       │   │   ├── JListenerSubscription.hpp
│       │       │   │   ├── JLivePlaybackParams.hpp
│       │       │   │   ├── JMixAudioMode.hpp
│       │       │   │   ├── JNativeDrmParams.hpp
│       │       │   │   ├── JNativeExternalSubtitle.hpp
│       │       │   │   ├── JNativeVideoConfig.hpp
│       │       │   │   ├── JOnGetLicensePayload.hpp
│       │       │   │   ├── JResizeMode.hpp
│       │       │   │   ├── JResolution.hpp
│       │       │   │   ├── JSourceType.hpp
│       │       │   │   ├── JSubtitleType.hpp
│       │       │   │   ├── JSurfaceType.hpp
│       │       │   │   ├── JTextTrack.hpp
│       │       │   │   ├── JTimedMetadata.hpp
│       │       │   │   ├── JTimedMetadataObject.hpp
│       │       │   │   ├── JVariant_NullType_HybridVideoPlayerSourceSpec.cpp
│       │       │   │   ├── JVariant_NullType_HybridVideoPlayerSourceSpec.hpp
│       │       │   │   ├── JVariant_NullType_TextTrack.cpp
│       │       │   │   ├── JVariant_NullType_TextTrack.hpp
│       │       │   │   ├── JVideoInformation.hpp
│       │       │   │   ├── JVideoOrientation.hpp
│       │       │   │   ├── JVideoPlayerStatus.hpp
│       │       │   │   ├── JonLoadData.hpp
│       │       │   │   ├── JonLoadStartData.hpp
│       │       │   │   ├── JonPlaybackStateChangeData.hpp
│       │       │   │   ├── JonProgressData.hpp
│       │       │   │   └── JonVolumeChangeData.hpp
│       │       │   └── kotlin/
│       │       │       └── com/
│       │       │           └── margelo/
│       │       │               └── nitro/
│       │       │                   └── video/
│       │       │                       ├── BandwidthData.kt
│       │       │                       ├── BufferConfig.kt
│       │       │                       ├── CustomVideoMetadata.kt
│       │       │                       ├── Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.kt
│       │       │                       ├── Func_void.kt
│       │       │                       ├── Func_void_BandwidthData.kt
│       │       │                       ├── Func_void_TimedMetadata.kt
│       │       │                       ├── Func_void_VideoPlayerStatus.kt
│       │       │                       ├── Func_void_bool.kt
│       │       │                       ├── Func_void_double.kt
│       │       │                       ├── Func_void_onLoadData.kt
│       │       │                       ├── Func_void_onLoadStartData.kt
│       │       │                       ├── Func_void_onPlaybackStateChangeData.kt
│       │       │                       ├── Func_void_onProgressData.kt
│       │       │                       ├── Func_void_onVolumeChangeData.kt
│       │       │                       ├── Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.kt
│       │       │                       ├── Func_void_std__vector_std__string_.kt
│       │       │                       ├── HybridVideoPlayerEventEmitterSpec.kt
│       │       │                       ├── HybridVideoPlayerFactorySpec.kt
│       │       │                       ├── HybridVideoPlayerSourceFactorySpec.kt
│       │       │                       ├── HybridVideoPlayerSourceSpec.kt
│       │       │                       ├── HybridVideoPlayerSpec.kt
│       │       │                       ├── HybridVideoViewViewManagerFactorySpec.kt
│       │       │                       ├── HybridVideoViewViewManagerSpec.kt
│       │       │                       ├── IgnoreSilentSwitchMode.kt
│       │       │                       ├── ListenerSubscription.kt
│       │       │                       ├── LivePlaybackParams.kt
│       │       │                       ├── MixAudioMode.kt
│       │       │                       ├── NativeDrmParams.kt
│       │       │                       ├── NativeExternalSubtitle.kt
│       │       │                       ├── NativeVideoConfig.kt
│       │       │                       ├── OnGetLicensePayload.kt
│       │       │                       ├── ReactNativeVideoOnLoad.kt
│       │       │                       ├── ResizeMode.kt
│       │       │                       ├── Resolution.kt
│       │       │                       ├── SourceType.kt
│       │       │                       ├── SubtitleType.kt
│       │       │                       ├── SurfaceType.kt
│       │       │                       ├── TextTrack.kt
│       │       │                       ├── TimedMetadata.kt
│       │       │                       ├── TimedMetadataObject.kt
│       │       │                       ├── Variant_NullType_HybridVideoPlayerSourceSpec.kt
│       │       │                       ├── Variant_NullType_TextTrack.kt
│       │       │                       ├── VideoInformation.kt
│       │       │                       ├── VideoOrientation.kt
│       │       │                       ├── VideoPlayerStatus.kt
│       │       │                       ├── onLoadData.kt
│       │       │                       ├── onLoadStartData.kt
│       │       │                       ├── onPlaybackStateChangeData.kt
│       │       │                       ├── onProgressData.kt
│       │       │                       └── onVolumeChangeData.kt
│       │       ├── ios/
│       │       │   ├── ReactNativeVideo+autolinking.rb
│       │       │   ├── ReactNativeVideo-Swift-Cxx-Bridge.cpp
│       │       │   ├── ReactNativeVideo-Swift-Cxx-Bridge.hpp
│       │       │   ├── ReactNativeVideo-Swift-Cxx-Umbrella.hpp
│       │       │   ├── ReactNativeVideoAutolinking.mm
│       │       │   ├── ReactNativeVideoAutolinking.swift
│       │       │   ├── c++/
│       │       │   │   ├── HybridVideoPlayerEventEmitterSpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerEventEmitterSpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerFactorySpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerFactorySpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerSourceFactorySpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerSourceFactorySpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerSourceSpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerSourceSpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerSpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerSpecSwift.hpp
│       │       │   │   ├── HybridVideoViewViewManagerFactorySpecSwift.cpp
│       │       │   │   ├── HybridVideoViewViewManagerFactorySpecSwift.hpp
│       │       │   │   ├── HybridVideoViewViewManagerSpecSwift.cpp
│       │       │   │   └── HybridVideoViewViewManagerSpecSwift.hpp
│       │       │   └── swift/
│       │       │       ├── BandwidthData.swift
│       │       │       ├── BufferConfig.swift
│       │       │       ├── CustomVideoMetadata.swift
│       │       │       ├── Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.swift
│       │       │       ├── Func_void.swift
│       │       │       ├── Func_void_BandwidthData.swift
│       │       │       ├── Func_void_TimedMetadata.swift
│       │       │       ├── Func_void_VideoInformation.swift
│       │       │       ├── Func_void_VideoPlayerStatus.swift
│       │       │       ├── Func_void_bool.swift
│       │       │       ├── Func_void_double.swift
│       │       │       ├── Func_void_onLoadData.swift
│       │       │       ├── Func_void_onLoadStartData.swift
│       │       │       ├── Func_void_onPlaybackStateChangeData.swift
│       │       │       ├── Func_void_onProgressData.swift
│       │       │       ├── Func_void_onVolumeChangeData.swift
│       │       │       ├── Func_void_std__exception_ptr.swift
│       │       │       ├── Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.swift
│       │       │       ├── Func_void_std__shared_ptr_Promise_std__string__.swift
│       │       │       ├── Func_void_std__string.swift
│       │       │       ├── Func_void_std__vector_std__string_.swift
│       │       │       ├── HybridVideoPlayerEventEmitterSpec.swift
│       │       │       ├── HybridVideoPlayerEventEmitterSpec_cxx.swift
│       │       │       ├── HybridVideoPlayerFactorySpec.swift
│       │       │       ├── HybridVideoPlayerFactorySpec_cxx.swift
│       │       │       ├── HybridVideoPlayerSourceFactorySpec.swift
│       │       │       ├── HybridVideoPlayerSourceFactorySpec_cxx.swift
│       │       │       ├── HybridVideoPlayerSourceSpec.swift
│       │       │       ├── HybridVideoPlayerSourceSpec_cxx.swift
│       │       │       ├── HybridVideoPlayerSpec.swift
│       │       │       ├── HybridVideoPlayerSpec_cxx.swift
│       │       │       ├── HybridVideoViewViewManagerFactorySpec.swift
│       │       │       ├── HybridVideoViewViewManagerFactorySpec_cxx.swift
│       │       │       ├── HybridVideoViewViewManagerSpec.swift
│       │       │       ├── HybridVideoViewViewManagerSpec_cxx.swift
│       │       │       ├── IgnoreSilentSwitchMode.swift
│       │       │       ├── ListenerSubscription.swift
│       │       │       ├── LivePlaybackParams.swift
│       │       │       ├── MixAudioMode.swift
│       │       │       ├── NativeDrmParams.swift
│       │       │       ├── NativeExternalSubtitle.swift
│       │       │       ├── NativeVideoConfig.swift
│       │       │       ├── OnGetLicensePayload.swift
│       │       │       ├── ResizeMode.swift
│       │       │       ├── Resolution.swift
│       │       │       ├── SourceType.swift
│       │       │       ├── SubtitleType.swift
│       │       │       ├── SurfaceType.swift
│       │       │       ├── TextTrack.swift
│       │       │       ├── TimedMetadata.swift
│       │       │       ├── TimedMetadataObject.swift
│       │       │       ├── Variant_NullType_TextTrack.swift
│       │       │       ├── Variant_NullType__any_HybridVideoPlayerSourceSpec_.swift
│       │       │       ├── VideoInformation.swift
│       │       │       ├── VideoOrientation.swift
│       │       │       ├── VideoPlayerStatus.swift
│       │       │       ├── onLoadData.swift
│       │       │       ├── onLoadStartData.swift
│       │       │       ├── onPlaybackStateChangeData.swift
│       │       │       ├── onProgressData.swift
│       │       │       └── onVolumeChangeData.swift
│       │       └── shared/
│       │           └── c++/
│       │               ├── BandwidthData.hpp
│       │               ├── BufferConfig.hpp
│       │               ├── CustomVideoMetadata.hpp
│       │               ├── HybridVideoPlayerEventEmitterSpec.cpp
│       │               ├── HybridVideoPlayerEventEmitterSpec.hpp
│       │               ├── HybridVideoPlayerFactorySpec.cpp
│       │               ├── HybridVideoPlayerFactorySpec.hpp
│       │               ├── HybridVideoPlayerSourceFactorySpec.cpp
│       │               ├── HybridVideoPlayerSourceFactorySpec.hpp
│       │               ├── HybridVideoPlayerSourceSpec.cpp
│       │               ├── HybridVideoPlayerSourceSpec.hpp
│       │               ├── HybridVideoPlayerSpec.cpp
│       │               ├── HybridVideoPlayerSpec.hpp
│       │               ├── HybridVideoViewViewManagerFactorySpec.cpp
│       │               ├── HybridVideoViewViewManagerFactorySpec.hpp
│       │               ├── HybridVideoViewViewManagerSpec.cpp
│       │               ├── HybridVideoViewViewManagerSpec.hpp
│       │               ├── IgnoreSilentSwitchMode.hpp
│       │               ├── ListenerSubscription.hpp
│       │               ├── LivePlaybackParams.hpp
│       │               ├── MixAudioMode.hpp
│       │               ├── NativeDrmParams.hpp
│       │               ├── NativeExternalSubtitle.hpp
│       │               ├── NativeVideoConfig.hpp
│       │               ├── OnGetLicensePayload.hpp
│       │               ├── ResizeMode.hpp
│       │               ├── Resolution.hpp
│       │               ├── SourceType.hpp
│       │               ├── SubtitleType.hpp
│       │               ├── SurfaceType.hpp
│       │               ├── TextTrack.hpp
│       │               ├── TimedMetadata.hpp
│       │               ├── TimedMetadataObject.hpp
│       │               ├── VideoInformation.hpp
│       │               ├── VideoOrientation.hpp
│       │               ├── VideoPlayerStatus.hpp
│       │               ├── onLoadData.hpp
│       │               ├── onLoadStartData.hpp
│       │               ├── onPlaybackStateChangeData.hpp
│       │               ├── onProgressData.hpp
│       │               └── onVolumeChangeData.hpp
│       ├── package.json
│       ├── react-native.config.js
│       ├── src/
│       │   ├── core/
│       │   │   ├── VideoPlayer.ts
│       │   │   ├── VideoPlayerEvents.ts
│       │   │   ├── hooks/
│       │   │   │   ├── useEvent.ts
│       │   │   │   ├── useManagedInstance.ts
│       │   │   │   └── useVideoPlayer.ts
│       │   │   ├── types/
│       │   │   │   ├── BufferConfig.ts
│       │   │   │   ├── DrmParams.ts
│       │   │   │   ├── Events.ts
│       │   │   │   ├── IgnoreSilentSwitchMode.ts
│       │   │   │   ├── MixAudioMode.ts
│       │   │   │   ├── ResizeMode.ts
│       │   │   │   ├── TextTrack.ts
│       │   │   │   ├── Utils.ts
│       │   │   │   ├── VideoConfig.ts
│       │   │   │   ├── VideoError.ts
│       │   │   │   ├── VideoInformation.ts
│       │   │   │   ├── VideoOrientation.ts
│       │   │   │   ├── VideoPlayerBase.ts
│       │   │   │   ├── VideoPlayerSourceBase.ts
│       │   │   │   └── VideoPlayerStatus.ts
│       │   │   ├── utils/
│       │   │   │   ├── playerFactory.ts
│       │   │   │   └── sourceFactory.ts
│       │   │   └── video-view/
│       │   │       ├── NativeVideoView.tsx
│       │   │       └── VideoView.tsx
│       │   ├── expo-plugins/
│       │   │   ├── @types.ts
│       │   │   ├── getPackageInfo.ts
│       │   │   ├── withAndroidExtensions.ts
│       │   │   ├── withAndroidNotificationControls.ts
│       │   │   ├── withAndroidPictureInPicture.ts
│       │   │   ├── withBackgroundAudio.ts
│       │   │   ├── withReactNativeVideo.ts
│       │   │   └── writeToPodfile.ts
│       │   ├── index.tsx
│       │   └── spec/
│       │       ├── fabric/
│       │       │   └── VideoViewNativeComponent.ts
│       │       └── nitro/
│       │           ├── VideoPlayer.nitro.ts
│       │           ├── VideoPlayerEventEmitter.nitro.ts
│       │           ├── VideoPlayerSource.nitro.ts
│       │           └── VideoViewViewManager.nitro.ts
│       ├── tsconfig.build.json
│       └── tsconfig.json
└── scripts/
    └── release.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/actions/setup-bun/action.yml
================================================
name: setup bun
description: Setup bun and install dependencies

inputs:
  working-directory:
    description: 'working directory for bun install'
    default: ./
    required: false

runs:
  using: composite
  steps:
    - name: Setup Bun
      uses: oven-sh/setup-bun@v2
      with:
        bun-version: 1.3.1
    
    - name: Cache dependencies
      id: bun-cache
      uses: actions/cache@v4
      with:
        path: |
          **/node_modules
        key: ${{ runner.os }}-v7-bun-${{ hashFiles('**/bun.lock') }}-${{ hashFiles('**/package.json') }}
        restore-keys: |
          ${{ runner.os }}-v7-bun-${{ hashFiles('**/bun.lock') }}
          ${{ runner.os }}-v7-bun-

    - name: Install dependencies
      working-directory: ${{ inputs.working-directory }}
      run: bun install
      shell: bash
      

================================================
FILE: .github/workflows/deploy-docs.yml
================================================
name: Deploy Documentation

on:
  workflow_dispatch:
  push:
    branches:
      - master
    paths:
      # Update on workflow change
      - ".github/workflows/deploy-docs.yml"
      # Update on docs change
      - "docs/**"
      # Update on code change (Api Reference)
      - "packages/react-native-video/src/**"

jobs:
  build:
    name: Build Documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: ./.github/actions/setup-bun

      - name: Build Documentation
        run: bun run --cwd docs build

      - name: Upload Build Artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: docs/build

  deploy:
    name: Deploy Documentation to GitHub Pages
    needs: build

    permissions:
      pages: write
      id-token: write

    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4


================================================
FILE: .github/workflows/test-docs-build.yml
================================================
name: Test Documentation Build

on:
  pull_request:
    branches:
      - master
    paths:
      # Update on workflow change
      - ".github/workflows/test-docs-build.yml"
      # Update on docs change
      - "docs/**"
      # Update on code change (Api Reference)
      - "packages/react-native-video/src/**"

jobs:
  test-docs-deploy:
    name: Test Documentation Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: ./.github/actions/setup-bun

      - name: Test build website
        run: bun run --cwd docs build


================================================
FILE: .gitignore
================================================
# OSX
#
.DS_Store

**/.xcode.env.local

# XDE
.expo/

# VSCode
.vscode/
jsconfig.json

# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace

# Android/IJ
#
.classpath
.cxx
.gradle
.idea
.project
.settings
local.properties
android.iml

# Cocoapods
#
example/ios/Pods

# Ruby
example/vendor/

# node.js
#
node_modules/
npm-debug.log
yarn-debug.log
yarn-error.log

# Bun
package-lock.json
**/*.bun

# BUCK
buck-out/
\.buckd/
android/app/libs
android/keystores/debug.keystore

# Yarn
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions

# Expo
.expo/

# Turborepo
.turbo/

# generated by bob
lib/

# TypeScript
tsconfig.tsbuildinfo

================================================
FILE: CODE_OF_CONDUCT.md
================================================

# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
  community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or advances of
  any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
  without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[INSERT CONTACT METHOD].
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series of
actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the
community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].

Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].

For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].

[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Contributions are always welcome, no matter how large or small!

We want this community to be friendly and respectful to each other. Please follow it in all your interactions with the project. Before contributing, please read the [code of conduct](./CODE_OF_CONDUCT.md).

## Development workflow

This project is a monorepo managed using [Bun workspaces](https://bun.sh/docs/install/workspaces). It contains the following packages:

- An Library package in the `packages/react-native-video` directory.
- An example app in the `example/` directory.

To get started with the project, run `bun install` in the root directory to install the required dependencies for each package:

```sh
bun install
```

> Since the project relies on Bun workspaces, you cannot use [`npm`](https://github.com/npm/cli) or [`yarn`](https://yarnpkg.com/) for development.

The [example app](/example/) demonstrates usage of the library. You need to run it to test any changes you make.

It is configured to use the local version of the library, so any changes you make to the library's source code will be reflected in the example app. Changes to the library's JavaScript code will be reflected in the example app without a rebuild, but native code changes will require a rebuild of the example app.

If you want to use Android Studio or XCode to edit the native code, you can open the `example/android` or `example/ios` directories respectively in those editors. To edit the Objective-C or Swift files, open `example/ios/VideoExample.xcworkspace` in XCode and find the source files at `Pods > Development Pods > react-native-video`.

To edit the Java or Kotlin files, open `example/android` in Android studio and find the source files at `react-native-video` under `Android`.

You can use various commands from the root directory to work with the project.

To start the packager:

```sh
bun example start
```

To run the example app on Android:

```sh
bun example android
```

To run the example app on iOS:

```sh
bun example ios
```

Make sure your code passes TypeScript and ESLint. Run the following to verify:

```sh
bun typecheck
bun lint
```

To fix formatting errors, run the following:

```sh
bun lint --fix
```

### Commit message convention

We follow the [conventional commits specification](https://www.conventionalcommits.org/en) for our commit messages:

- `fix`: bug fixes, e.g. fix crash due to deprecated method.
- `feat`: new features, e.g. add new method to the module.
- `refactor`: code refactor, e.g. migrate from class components to hooks.
- `docs`: changes into documentation, e.g. add usage example for the module..
- `test`: adding or updating tests, e.g. add integration tests using detox.
- `chore`: tooling changes, e.g. change CI config.

Our pre-commit hooks verify that your commit message matches this format when committing.

### Linting and tests

[ESLint](https://eslint.org/), [Prettier](https://prettier.io/), [TypeScript](https://www.typescriptlang.org/)

We use [TypeScript](https://www.typescriptlang.org/) for type checking, [ESLint](https://eslint.org/) with [Prettier](https://prettier.io/) for linting and formatting the code, and [Jest](https://jestjs.io/) for testing.

Our pre-commit hooks verify that the linter and tests pass when committing.

### Publishing to npm

We use [release-it](https://github.com/release-it/release-it) to make it easier to publish new versions. It handles common tasks like bumping version based on semver, creating tags and releases etc.

To publish new versions, run the following:

```sh
bun release
```

### Scripts

The `package.json` file contains various scripts for common tasks:

- `bun install`: setup project by installing dependencies.
- `bun typecheck`: type-check files with TypeScript.
- `bun lint`: lint files with ESLint.
- `bun example start`: start the Metro server for the example app.
- `bun example android`: run the example app on Android.
- `bun example ios`: run the example app on iOS.

### Sending a pull request

> **Working on your first pull request?** You can learn how from this _free_ series: [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/playlists/how-to-contribute-to-an-open-source-project-on-github).

When you're sending a pull request:

- Prefer small pull requests focused on one change.
- Verify that linters and tests are passing.
- Review the documentation to make sure it looks good.
- Follow the pull request template when opening a pull request.
- For pull requests that change the API or implementation, discuss with maintainers first by opening an issue.

### License

By contributing to this project, you agree that your contributions will be licensed under the [MIT License](LICENSE).


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2024-2025 TheWidlarzGroup
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
[![React Native Video Component](./docs/static/baners/rnv-banner.png)](https://thewidlarzgroup.com/?utm_source=rnv&utm_medium=readme&utm_id=banner)

The most battle-tested open-source video player component for React Native with support for DRM, offline playback, HLS/DASH streaming, and more.

> [!IMPORTANT]
> This is a new version (v7) of `react-native-video` that is currently in active development.
> You can expect breaking changes and missing features.
> 
> If you have any questions, please contact us at [hi@thewidlarzgroup.com](mailto:hi@thewidlarzgroup.com).

## 🔍 Features

| Feature | Status |
|---------|--------|
| 📱 Plays all video formats natively supported by iOS/Android | ✅ Available |
| ▶️ Local and remote playback | ✅ Available |
| 🔁 Streaming: HLS • DASH • SmoothStreaming | ✅ Available |
| 🧩 Expo plugin support | ✅ Available |
| 📴 Offline playback, video download, support for side-tracks and side-captions (via [optional SDK](https://docs.thewidlarzgroup.com/offline-video-sdk?utm_source=rnv&utm_medium=readme&utm_id=features-text)) | ✅ Available |
| 📱 Picture in Picture | ✅ Available |
| 🎚️ Fine-grained control over tracks, buffering & events | 🏗️ In Development |
| 🧠 Advanced control over playback and buffering | ✅ Available |
| 🔐 DRM: Widevine & FairPlay ([See free DRM stream example](https://www.thewidlarzgroup.com/services/free-drm-token-generator-for-video?utm_source=rnv&utm_medium=readme&utm_id=free-drm)) | ✅ Available |
| 🌐 Basic Web Support | 📝 [TODO](https://github.com/TheWidlarzGroup/react-native-video/issues/4605) |
| 📺 TV Support | 📝 [TODO](https://github.com/TheWidlarzGroup/react-native-video/issues/4607) |
| 🥽 VisionOS Support | 📝 [TODO](https://github.com/TheWidlarzGroup/react-native-video/issues/4608) |



## ✨ Project Status

| Version | State | Architecture |
|---------|-------|--------------|
| **v5 and lower** | ❌ End-of-life [Commercial Support Available](https://www.thewidlarzgroup.com/blog/react-native-video-upgrade-challenges-custom-maintenance-support#how-we-can-help?utm_source=rnv&utm_medium=readme&utm_id=upgradev5) | Old Architecture |
| **v6** | 🛠 Maintained (community + TWG) | Old + New (Interop Layer) |
| **v7** | 🚀 Active Development | Old + New (Full Support) |

`react-native-video` v7 introduces full support for the new React Native architecture, unlocking better performance, improved consistency, and modern native modules.

---

## 📚 Documentation & Examples

- 📖 [Documentation](https://docs.thewidlarzgroup.com/react-native-video/docs/v7/intro)
- 📦 [Example: Basic Usage](https://github.com/TheWidlarzGroup/react-native-video/tree/v7/example)
- 📦 [Example: Free DRM Stream](https://www.thewidlarzgroup.com/services/free-drm-token-generator-for-video?utm_source=rnv&utm_medium=readme&utm_id=free-drm)

## 🚀 Quick Start

### Requirements

- React Native 0.75 or higher
- `react-native-nitro-modules` (>=0.31.10) - Please see [nitro requirements](https://nitro.margelo.com/docs/minimum-requirements)

### Install

`react-native-video` requires `react-native-nitro-modules` (>=0.31.10) in your project.
```bash
npm install react-native-nitro-modules
```

Then install `react-native-video`

```bash
# Install the beta version of react-native-video v7
npm install react-native-video@beta

# Install pods
cd ios && pod install
```

<details>
<summary>For react-native < 0.80</summary>
`react-native` < 0.80 have bug that prevents to properly handle errors by nitro modules on Android.
We highly recommend to apply bellow patch for `react-native-nitro-modules` to fix this issue.
You can apply it using `patch-package`.

Without this patch you won't be able "recognize" errors, all will be thrown as unknown errors.

see [installation guide](https://docs.thewidlarzgroup.com/react-native-video/docs/v7/installation#patch-for-react-native--080)
</details>

### Usage
```tsx
import { useVideoPlayer, VideoView } from 'react-native-video';

export default () => (
  const player = useVideoPlayer(
    'https://www.w3schools.com/html/mov_bbb.mp4',
    (_player) => {
      _player.play();
    }
  );

  <VideoView
    player={player}
    style={{ width: '100%', aspectRatio: 16 / 9 }}
    controls
  />
);
```

---

## :inbox_tray: We're building a Pro Player!

<a href="https://sdk.thewidlarzgroup.com">
  <img src="./docs/static/baners/rnv-pro-player-banner.png" alt="Offline SDK Preview" width="40%" align="right" />
</a>

We see the need for a more feature-rich video player. There is a gap between open source and commercial players, and we want to fill that gap with plugins.

**Are you using a commercial player just for 1-2 features?** Maybe you are paying for a license just to get **Caching**, **Ads**, or **Analytics**? Let us know. We want to identify these missing pieces and build them, so you can switch back to open source.

**This is what we have already. Check out!**

* [Offline Video](https://sdk.thewidlarzgroup.com/offline-video): Logic for downloading streams (HLS/DASH) and standard video files to enable offline playback.
* [Background Uploader](https://sdk.thewidlarzgroup.com/background-uploader): Handles uploads even if the app is minimized (not strictly a player plugin, but super useful).
* [Chapter Markers](https://sdk.thewidlarzgroup.com/chapters): Visual markers on the timeline to navigate content.

<br/>
<br/>

[-> Tell us what to build next ←](https://sdk.thewidlarzgroup.com/ask-for-plugin) or reach out to us sdk@thewidlarzgroup.com

<br/>

---

## 💼 TWG Services & Products

| Offering | Description |
|----------|-------------|
| [**Professional Support Packages**](https://www.thewidlarzgroup.com/issue-boost?utm_source=rnv&utm_medium=readme&utm_campaign=professional-support-packages#Contact) | Priority bug-fixes, guaranteed SLAs, [roadmap influence](https://github.com/orgs/TheWidlarzGroup/projects/6) |
| [**Issue Booster**](https://www.thewidlarzgroup.com/issue-boost?utm_source=rnv&utm_medium=readme) | Fast-track urgent fixes with a pay‑per‑issue model |
| [**Offline Video SDK**](https://www.thewidlarzgroup.com/offline-video-sdk/?utm_source=rnv&utm_medium=readme&utm_campaign=downloading&utm_id=offline-video-sdk-link) | Plug‑and‑play secure download solution for iOS & Android |
| [**Integration Support**](https://www.thewidlarzgroup.com/?utm_source=rnv&utm_medium=readme&utm_campaign=integration-support#Contact) | Hands‑on help integrating video, DRM & offline into your app |
| [**Free DRM Token Generator**](https://www.thewidlarzgroup.com/services/free-drm-token-generator-for-video?utm_source=rnv&utm_medium=readme&utm_id=free-drm) | Generate Widevine / FairPlay tokens for testing |
| [**Ready Boilerplates**](https://www.thewidlarzgroup.com/showcases?utm_source=rnv&utm_medium=readme) | Ready-to-use apps with offline HLS/DASH DRM, video frame scrubbing, TikTok-style video feed, background uploads, Skia-based frame processor (R&D phase), and more |
| [**React Native Video Upgrade Guide**](https://www.thewidlarzgroup.com/blog/react-native-video-upgrade-challenges-custom-maintenance-support?utm_source=rnv&utm_medium=readme&utm_id=upgrade-blog&utm_campaign=v7) | Common upgrade pitfalls & how to solve them |

*See how [TWG](https://www.thewidlarzgroup.com/?utm_source=rnv&utm_medium=readme&utm_id=services-text) helped **Learnn** ship a world‑class player in record time -  [case study](https://gitnation.com/contents/a-4-year-retrospective-lessons-learned-from-building-a-video-player-from-scratch-with-react-native).*

Contact us at [hi@thewidlarzgroup.com](mailto:hi@thewidlarzgroup.com)

## 🌍 Social

- 🐦 **X / Twitter** - [follow product & release updates](https://x.com/TheWidlarzGroup)
- 💬 **Discord** - [talk to the community and us](https://discord.gg/9WPq6Yx)
- 💼 **LinkedIn** - [see TWG flexing](https://linkedin.com/company/the-widlarz-group)

## 📰 Community & Media

- 🗽 **React Summit US** – How TWG helped Learnn boost video performance on React Native.  
[Watch the talk »](https://gitnation.com/contents/a-4-year-retrospective-lessons-learned-from-building-a-video-player-from-scratch-with-react-native)

- 🧨 **v7 deep dive** – Why we’re building v7 with Nitro Modules
[Watch on X »](https://x.com/krzysztof_moch/status/1854162551946478051)

- 🛠️ **Well-maintained open-source library** - What does it truly mean? - Bart's talk for React Native Warsaw
[Watch here »](https://www.youtube.com/watch?v=RAQQwGCQNqY)

- 📺 **“Over the Top” Panel** - Building Streaming Apps for Mobile, Web, and Smart TVs - Bart giving his insights on the industry
[Watch here »](https://youtu.be/j2b_bG-32JI)


================================================
FILE: bunfig.toml
================================================
[install]
linker = "hoisted"

================================================
FILE: config/.editorconfig
================================================
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org

root = true

[*]

indent_style = space
indent_size = 2

end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
quote_type = single


================================================
FILE: config/.eslintrc.js
================================================
module.exports = {
  root: true,
  extends: ['@react-native', 'plugin:prettier/recommended'],
  ignorePatterns: [
    '**/node_modules',
    '**/lib',
    '**/build',
    '**/.eslintrc.js',
    '**/.prettierrc.js',
    '**/jest.config.js',
    '**/babel.config.js',
    '**/metro.config.js',
    '**/react-native.config.js',
    '**/tsconfig.json',
  ],
  plugins: ['@typescript-eslint', 'prettier'],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: true,
    tsconfigRootDir: __dirname,
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 2020,
    sourceType: 'module',
  },
  rules: {
    'prettier/prettier': [
      'error',
      {
        quoteProps: 'consistent',
        singleQuote: true,
        tabWidth: 2,
        trailingComma: 'es5',
        useTabs: false,
      },
    ],
    quotes: [
      'error',
      'single',
      { avoidEscape: true, allowTemplateLiterals: true },
    ],
    '@react-native/no-deep-imports': 'off',
  },
};


================================================
FILE: config/tsconfig.json
================================================
{
  "exclude": [
    "**/node_modules",
    "**/lib",
    "**/.eslintrc.js",
    "**/.prettierrc.js",
    "**/jest.config.js",
    "**/babel.config.js",
    "**/metro.config.js",
    "**/react-native.config.js",
    "**/tsconfig.json"
  ],
  "compilerOptions": {
    "composite": true,
    "allowUnreachableCode": false,
    "allowUnusedLabels": false,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "lib": ["ESNext"],
    "module": "ESNext",
    "moduleResolution": "bundler",
    "noEmit": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noImplicitUseStrict": false,
    "noStrictGenericChecks": false,
    "noUncheckedIndexedAccess": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "strict": true,
    "target": "ESNext",
    "verbatimModuleSyntax": true
  }
}

================================================
FILE: docs/.eslintrc.js
================================================
module.exports = {
  root: true,
  extends: ["../config/.eslintrc.js"],
  parserOptions: {
    tsconfigRootDir: __dirname,
    project: true,
  },
  plugins: ['@widlarzgroup/docusaurus'],
  settings: {
    '@widlarzgroup/docusaurus': {
      extend: ['src/css/custom.css'],
    },
  },
  overrides: [
    {
      files: ['**/*.css'],
      processor: '@widlarzgroup/docusaurus/.css',
    },
  ],
};


================================================
FILE: docs/.gitignore
================================================
# Dependencies
/node_modules

# Production
/build

# Generated files
.docusaurus
.cache-loader

# API Reference generated files
docs/api-reference/

# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*


================================================
FILE: docs/README.md
================================================
### Instalation

To install the dependencies, run at the root of the repository:

```
$ bun install
```

### Development

To start a local development server with hot-reloading, run:

```
$ bun run start
```

### Deployment

Deployment is handled via GitHub Actions. Upon pushing to the `master` branch content from the `docs` directory is automatically deployed to GitHub Pages.

### Custom Props

Custom props are provided by the `@widlarzgroup/docusaurus-ui` package and allow you to display badges and other UI elements. Custom props can be defined in three places:

#### 1. In `_category_.json` (for entire categories)

```json
{
  "label": "Analytics",
  "position": 7,
  "customProps": {
    "badgeType": "new"
  }
}
```

#### 2. In markdown frontmatter (for individual pages)

```md
---
sidebar_position: 5
sidebar_label: Chapters
customProps:
  plan: pro
---
```

#### 3. In `sidebars.ts` (for sidebar items)

```ts
{
  type: 'doc',
  id: 'some-doc',
  customProps: {
    badgeType: 'new'
  }
}
```

#### Available Custom Props

| Prop | Values | Description |
|------|--------|-------------|
| `badgeType` | `"new"`, `"preview"` | Displays a "NEW" or "PREVIEW" badge next to the item |
| `plan` | `"pro"` | Displays a "PRO" badge indicating premium/commercial feature |


================================================
FILE: docs/docs/fundamentals/_category_.json
================================================
{
  "label": "Fundamentals",
  "position": 1,
  "collapsed": false
}


================================================
FILE: docs/docs/fundamentals/configuration/_category_.json
================================================
{
  "label": "Configuration",
  "position": 3,
  "collapsed": false
}


================================================
FILE: docs/docs/fundamentals/configuration/with-expo.md
================================================
---
sidebar_position: 1
sidebar_label: With Expo
description: Expo plugin for react-native-video configuration
---

# Expo Plugin

The `react-native-video` library provides an Expo plugin to simplify the integration and configuration of specific features into your Expo project.

## Installation

To use the Expo plugin, you need to add it to your app's configuration file (`app.json` or `app.config.js`).

```json title="app.json"
{
  "expo": {
    "plugins": [
      [
        "react-native-video",
        {
          "enableAndroidPictureInPicture": true,
          "enableBackgroundAudio": true,
          "androidExtensions": {
            "useExoplayerDash": true,
            "useExoplayerHls": true
          }
        }
      ]
    ]
  }
}
```

```javascript title="app.config.js"
export default {
  plugins: [
    [
      'react-native-video',
      {
        enableAndroidPictureInPicture: true,
        enableBackgroundAudio: true,
        androidExtensions: {
          useExoplayerDash: true,
          useExoplayerHls: true,
        },
      },
    ],
  ],
};
```

## Configuration Options

The plugin accepts an optional configuration object with the following properties:

### `enableAndroidPictureInPicture` (optional)

-   **Type:** `boolean`
-   **Default:** `false`
-   **Description:** Enables Picture-in-Picture (PiP) mode on Android. This will apply the necessary configurations to your Android project.

### `enableBackgroundAudio` (optional)

-   **Type:** `boolean`
-   **Default:** `false`
-   **Description:** Enables audio playback to continue when the app is in the background on Android. Ensure you have also configured the necessary background modes capabilities in your app if required by the operating system.

### `androidExtensions` (optional)

-   **Type:** `object`
-   **Default:** `{ useExoplayerDash: true, useExoplayerHls: true }`
-   **Description:** Allows you to specify which Android ExoPlayer extensions to include. This can help reduce the size of your app by only including the extensions you need.
    -   `useExoplayerDash` (boolean, default: `true`): Whether to include ExoPlayer's Dash extension.
    -   `useExoplayerHls` (boolean, default: `true`): Whether to include ExoPlayer's HLS extension.

### `reactNativeTestApp` (optional)

-   **Type:** `boolean`
-   **Default:** `false`
-   **Description:** Whether to use `react-native-test-app` compatible mode.

## Usage

Once configured in your `app.json` or `app.config.js`, the plugin will automatically apply the necessary native project changes during the prebuild process (e.g., when running `npx expo prebuild`). No further manual setup is typically required for these features. 

================================================
FILE: docs/docs/fundamentals/configuration/without-expo.md
================================================
---
sidebar_position: 2
sidebar_label: Without Expo
description: Manual configuration of react-native-video
---

# Manual Configuration

If you prefer not to use the Expo plugin you can configure **react-native-video** manually by editing the native project files directly.  The steps below show the exact changes performed by the plugin so you can reproduce them in a plain React Native or bare Expo project.

---

## iOS

### Enable Background Audio
To allow video sound to continue when the app goes to the background add the `audio` mode to `Info.plist`:

```xml title="ios/YourApp/Info.plist"
<key>UIBackgroundModes</key>
<array>
  <string>audio</string>
</array>
```

## Android

### Configure ExoPlayer extensions
By default the library enables DASH & HLS extensions.  You can fine-tune this by adding properties to **gradle.properties**:

```properties title="android/gradle.properties"
# Enable / disable ExoPlayer extensions used by react-native-video
RNVideo_useExoplayerDash=true   # DASH playback support
RNVideo_useExoplayerHls=true    # HLS  playback support
```
Set a value to `false` to exclude the corresponding extension and reduce APK size.

### Enable Picture-in-Picture (PiP)
Add the `android:supportsPictureInPicture` flag to your *main* activity in **AndroidManifest.xml**:

```xml title="android/app/src/main/AndroidManifest.xml"
<application>
  <activity
    android:name=".MainActivity"
    android:supportsPictureInPicture="true"
    ...>
    <!-- other attributes -->
  </activity>
</application>
```

PiP requires **API 26+** (Android 8.0). Make sure `minSdkVersion` is at least `26` when enabling this feature.

## Verification
After the modifications:

1. **iOS** – run `cd ios && pod install` then build the app from Xcode or via `npx react-native run-ios` / `npx expo run:ios`.
2. **Android** – clean & rebuild the project: `./gradlew clean && ./gradlew :app:assembleDebug` or simply run `npx react-native run-android` / `npx expo run:android`.

If the build succeeds your manual configuration is complete.

---

### Need an easier way?
Use the [Expo plugin](./with-expo.md) to apply exactly the same changes automatically during `expo prebuild`.

================================================
FILE: docs/docs/fundamentals/installation.md
================================================
---
title: Installation
sidebar_position: 2
description: React Native Video Installation Guide and Requirements
---
# Installation

React Native Video is a library that allows you to play various kinds of video in a React Native application. It is built on top of the [`react-native-nitro-modules`](https://nitro.margelo.com/docs/what-is-nitro) framework, giving it type-safety and blazing fast communication across Native and JavaScript threads. React Native Video supports both the New Architecture and the Old Architecture.

## Requirements

### System Requirements
- iOS `15.0` or higher
- Android `6.0` or higher

### Minimal Package Requirements
- `react-native` `0.75.0` or higher
- `react-native-nitro-modules` `0.35.0` or higher

## Installation

1. Install dependencies:
```bash
npm install react-native-video@next react-native-nitro-modules
```

2. Configure Library:
You can configure the library in two ways:
- [With Expo](./configuration/with-expo.md)
- [Without Expo](./configuration/without-expo.md)

3. Run the project:
If you are using Expo, you will need to generate native files:
```bash
npx expo prebuild
```

And then run the project:
```bash
npx expo run:ios # run on iOS
npx expo run:android # run on Android
```

If you are using React Native CLI, you will need to install Pods for iOS:
```bash
cd ios && pod install && cd ..
```

And then run the project:
```bash
npx react-native run-ios # run on iOS
npx react-native run-android # run on Android
```

## Patch for react-native < 0.80

Versions of `react-native` < 0.80 have a bug that prevents them from properly handling errors thrown by nitro modules on Android.
If working with these versions of `react-native`, we highly recommend you apply the `react-native-nitro-modules` patch below, to fix this issue.
You can apply it using `patch-package`.

:::warning
Without this patch you won't be able "recognize" errors, all will be thrown as unknown errors.
:::

<details>
  <summary>Patch for `react-native-nitro-modules`</summary>

  ```diff
  diff --git a/node_modules/react-native-nitro-modules/cpp/core/HybridFunction.hpp b/node_modules/react-native-nitro-modules/cpp/core/HybridFunction.hpp
  index efcea05..ffad3f2 100644
  --- a/node_modules/react-native-nitro-modules/cpp/core/HybridFunction.hpp
  +++ b/node_modules/react-native-nitro-modules/cpp/core/HybridFunction.hpp
  @@ -23,6 +23,10 @@ struct JSIConverter;
  #include <string>
  #include <type_traits>

  +#ifdef ANDROID
  +#include <fbjni/fbjni.h>
  +#endif
  +
  namespace margelo::nitro {

  using namespace facebook;
  @@ -109,6 +113,15 @@ public:
          std::string funcName = getHybridFuncFullName<THybrid>(kind, name, hybridInstance.get());
          std::string message = exception.what();
          throw jsi::JSError(runtime, funcName + ": " + message);
  +#ifdef ANDROID
  +#pragma clang diagnostic push
  +#pragma clang diagnostic ignored "-Wexceptions"
  +      } catch (const jni::JniException& exception) {
  +        std::string funcName = getHybridFuncFullName<THybrid>(kind, name, hybridInstance.get());
  +        std::string message = exception.what();
  +        throw jsi::JSError(runtime, funcName + ": " + message);
  +#pragma clang diagnostic pop
  +#endif
        } catch (...) {
          // Some unknown exception was thrown - add method name information and re-throw as `JSError`.
          std::string funcName = getHybridFuncFullName<THybrid>(kind, name, hybridInstance.get());
  ```

  see [raw](https://github.com/TheWidlarzGroup/react-native-video/blob/v7/example/patches/react-native-nitro-modules%2B0.27.2.patch)
</details>


## Usage

```tsx title="App.tsx"
import { VideoView, useVideoPlayer } from 'react-native-video';

export default function App() {
  const player = useVideoPlayer({
    source: {
      uri: 'https://www.w3schools.com/html/mov_bbb.mp4',
    },
  });

  return <VideoView player={player} />;
}
```

================================================
FILE: docs/docs/fundamentals/intro.mdx
================================================
---
title: Intro
sidebar_position: 1
description: Introduction to React Native Video v7
customProps:
  badgeType: new
---

import {
  V7Lead,
  V7FeatureCards,
  V7ApiModel,
  V7NitroSection,
  V7StatusTimeline,
  V7OpenSource,
  V7ProPlugins,
} from '@site/src/components/Intro';

<V7Lead />

## What changed in v7 vs v6

<V7FeatureCards />

## New API model in practice

### New model: you control the player, the view is optional

<V7ApiModel />

## Why Nitro Modules?

### Nitro Modules as the foundation of v7

<V7NitroSection />

## Status v7

<V7StatusTimeline />

## Open-source + optional Pro features and services

<V7OpenSource />

## Pro plugins

<V7ProPlugins />


================================================
FILE: docs/docs/offer.mdx
================================================
---
title: Offer
description: Introduction to React Native Video library
sidebar_class_name: hidden
---

import {
  IntroHero,
  OfferCards,
  HowItWorks,
  Services,
  Extensions,
  DecisionTable,
  Contact,
} from "@site/src/components/Offer";

<IntroHero />

## What you can use

Three ways to work with react-native-video, depending on your needs and timeline:

<OfferCards />

## How it works

<HowItWorks />

## Services

When you need guaranteed response times and direct maintainer involvement:

<Services />

## Extensions

Ready-to-use modules and templates for advanced use cases:

<Extensions />

## Which option should I choose?

Quick reference guide based on your situation:

<DecisionTable />

## Contact

Ready to discuss your project? Here's what to include:

<Contact />


================================================
FILE: docs/docs/player/_category_.json
================================================
{
  "label": "Player",
  "position": 2,
  "collapsed": false
}


================================================
FILE: docs/docs/player/analytics/_category_.json
================================================
{
  "label": "Analytics",
  "position": 7,
  "collapsed": false,
  "customProps": {
    "badgeType": "new"
  }
}


================================================
FILE: docs/docs/player/analytics/manual.md
================================================
---
sidebar_position: 2
sidebar_label: Manual (Native)
description: Manual analytics integration guide using native plugins
---

# Manual Analytics

Integrate your own analytics system using native plugins.

## Overview

Most analytics systems that track player data (e.g., bitrate, errors) can be integrated directly with ExoPlayer or AVPlayer. The [plugin system](../../plugins/plugins.mdx) allows for non-intrusive analytics integration with react-native-video. It should be implemented in native languages (Kotlin/Swift) to ensure efficiency.

## Architecture

```
┌─────────────────────────────────────┐
│     React Native App                │
│  ┌───────────────────────────────┐  │
│  │   react-native-video          │  │
│  │  ┌─────────────────────────┐  │  │
│  │  │   Plugin System         │  │  │
│  │  └─────────────────────────┘  │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘
         │                    │
         │ onPlayerCreated    │ onPlayerCreated
         ▼                    ▼
┌─────────────────┐  ┌─────────────────┐
│ Android Plugin  │  │  iOS Plugin     │
│   (Kotlin)      │  │   (Swift)       │
│                 │  │                 │
│ ExoPlayer       │  │ AVPlayer        │
│ Analytics       │  │ KVO Observers   │
│ Listener        │  │                 │
└─────────────────┘  └─────────────────┘
```

## Implementation

### Android (Kotlin)

```kotlin
import androidx.annotation.OptIn
import androidx.media3.common.Format
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.analytics.AnalyticsListener
import com.twg.video.core.plugins.NativeVideoPlayer
import com.twg.video.core.plugins.ReactNativeVideoPlugin
import java.lang.ref.WeakReference

@OptIn(UnstableApi::class)
class AnalyticsPlugin : ReactNativeVideoPlugin("MyAnalytics") {
    
    override fun onPlayerCreated(player: WeakReference<NativeVideoPlayer>) {
        val nativePlayer = player.get() ?: return
        val exoPlayer = nativePlayer.player
        
        exoPlayer.addAnalyticsListener(object : AnalyticsListener {
            override fun onBandwidthEstimate(
                eventTime: AnalyticsListener.EventTime,
                totalLoadTimeMs: Int,
                totalBytesLoaded: Long,
                bitrateEstimate: Long
            ) {
                trackMetric("bitrate", bitrateEstimate)
            }
            
            override fun onDroppedVideoFrames(
                eventTime: AnalyticsListener.EventTime,
                droppedFrames: Int,
                elapsedMs: Long
            ) {
                trackMetric("dropped_frames", droppedFrames)
            }
            
            override fun onVideoInputFormatChanged(
                eventTime: AnalyticsListener.EventTime,
                format: Format,
                decoderReuseDecision: Int?
            ) {
                trackEvent("quality_change", mapOf(
                    "width" to format.width,
                    "height" to format.height,
                    "bitrate" to format.bitrate
                ))
            }
            
            override fun onPlaybackStateChanged(
                eventTime: AnalyticsListener.EventTime,
                state: Int
            ) {
                when (state) {
                    Player.STATE_BUFFERING -> trackEvent("buffering_start")
                    Player.STATE_READY -> trackEvent("buffering_end")
                    Player.STATE_ENDED -> trackEvent("playback_complete")
                }
            }
            
            override fun onPlayerError(
                eventTime: AnalyticsListener.EventTime,
                error: PlaybackException
            ) {
                trackEvent("error", mapOf(
                    "code" to error.errorCode,
                    "message" to error.message
                ))
            }
        })
    }
    
    override fun onPlayerDestroyed(player: WeakReference<NativeVideoPlayer>) {
        flushAnalytics()
    }
    
    private fun trackEvent(name: String, params: Map<String, Any?> = emptyMap()) {
        // Send to your analytics backend
    }
    
    private fun trackMetric(name: String, value: Number) {
        // Send to your analytics backend
    }
    
    private fun flushAnalytics() {
        // Flush pending analytics
    }
}
```

### iOS (Swift)

```swift
import AVFoundation

class AnalyticsPlugin: ReactNativeVideoPlugin {
    
    // MARK: - Properties
    
    private weak var currentPlayer: AVPlayer?
    private var rateObserver: NSKeyValueObservation?
    private var statusObserver: NSKeyValueObservation?
    private var timeObserver: Any?
    
    // MARK: - Init
    
    init() {
        super.init(name: "MyAnalytics")
    }
    
    // MARK: - Plugin Lifecycle
    
    override func onPlayerCreated(player: Weak<NativeVideoPlayer>) {
        guard let nativePlayer = player.value else { return }
        currentPlayer = nativePlayer.player
        
        setupPlaybackObservers(for: nativePlayer.player)
        setupQualityTracking(for: nativePlayer.playerItem)
    }
    
    override func onPlayerDestroyed(player: Weak<NativeVideoPlayer>) {
        removeAllObservers()
        flushAnalytics()
    }
    
    // MARK: - Setup
    
    private func setupPlaybackObservers(for player: AVPlayer) {
        rateObserver = player.observe(\.rate) { [weak self] p, _ in
            self?.trackEvent(p.rate > 0 ? "play" : "pause")
        }
        
        statusObserver = player.observe(\.status) { [weak self] p, _ in
            if p.status == .readyToPlay {
                self?.trackEvent("ready")
            } else if p.status == .failed {
                self?.trackEvent("error", params: ["message": p.error?.localizedDescription ?? ""])
            }
        }
        
        timeObserver = player.addPeriodicTimeObserver(
            forInterval: CMTime(seconds: 10, preferredTimescale: 1),
            queue: .main
        ) { [weak self] time in
            self?.trackMetric("position", value: time.seconds)
        }
    }
    
    private func setupQualityTracking(for playerItem: AVPlayerItem?) {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(handleAccessLog),
            name: .AVPlayerItemNewAccessLogEntry,
            object: playerItem
        )
    }
    
    @objc private func handleAccessLog(_ notification: Notification) {
        guard let item = notification.object as? AVPlayerItem,
              let event = item.accessLog()?.events.last else { return }
        
        trackMetric("bitrate", value: event.indicatedBitrate)
        trackMetric("stalls", value: Double(event.numberOfStalls))
        trackMetric("dropped_frames", value: Double(event.numberOfDroppedVideoFrames))
    }
    
    private func removeAllObservers() {
        if let observer = timeObserver {
            currentPlayer?.removeTimeObserver(observer)
        }
        rateObserver?.invalidate()
        statusObserver?.invalidate()
        NotificationCenter.default.removeObserver(self)
        
        currentPlayer = nil
        timeObserver = nil
    }
    
    // MARK: - Analytics
    
    private func trackEvent(_ name: String, params: [String: Any] = [:]) {
        // Send to your analytics backend
    }
    
    private func trackMetric(_ name: String, value: Double) {
        // Send to your analytics backend
    }
    
    private func flushAnalytics() {
        // Flush pending analytics
    }
}
```

## Available Metrics

### Android (ExoPlayer AnalyticsListener)

| Event | Method | Data |
|-------|--------|------|
| Bitrate | `onBandwidthEstimate` | `bitrateEstimate` |
| Dropped frames | `onDroppedVideoFrames` | `droppedFrames`, `elapsedMs` |
| Quality change | `onVideoInputFormatChanged` | `format.width`, `format.height` |
| Buffering | `onPlaybackStateChanged` | `Player.STATE_BUFFERING` |
| Stall | `onStallStart` / `onStallEnd` | duration |
| Seek | `onSeekStarted` / `onSeekProcessed` | position |
| Error | `onPlayerError` | `errorCode`, `message` |

### iOS (AVPlayer)

| Metric | Source | Property |
|--------|--------|----------|
| Bitrate | `accessLog` | `indicatedBitrate` |
| Stalls | `accessLog` | `numberOfStalls` |
| Dropped frames | `accessLog` | `numberOfDroppedVideoFrames` |
| Bytes | `accessLog` | `numberOfBytesTransferred` |
| Playback status | KVO | `player.status` |
| Play/Pause | KVO | `player.rate` |
| Buffer | `playerItem` | `isPlaybackLikelyToKeepUp` |

## Registration

Plugins auto-register when instantiated. Create your plugin early in app lifecycle:

**Android** - `MainApplication.kt`:

```kotlin
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        AnalyticsPlugin() // Auto-registers via init block
    }
}
```

**iOS** - `AppDelegate.swift`:

```swift
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    private var analyticsPlugin: AnalyticsPlugin?
    
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        analyticsPlugin = AnalyticsPlugin() // Auto-registers via init
        return true
    }
}
```

## See Also

- [Plugins](../../plugins/plugins.mdx) - Full plugin system documentation
- [Plugin Interface](../../plugins/interface.md) - Complete API reference


================================================
FILE: docs/docs/player/analytics/simple.md
================================================
---
sidebar_position: 0
sidebar_label: Simple (JS Events)
description: Simple analytics using JavaScript events
---

# Simple Analytics

The easiest way to track video analytics is by using the JavaScript events provided by `react-native-video`. This approach requires no native code and works across all platforms.

## Overview

Use the `useEvent` hook to subscribe to player events. For a complete list of available events and their data, see the [Events documentation](../events.md).

## Example

```tsx
import { useVideoPlayer, useEvent, VideoView } from 'react-native-video';

function VideoPlayer() {
  const player = useVideoPlayer('https://example.com/video.mp4');

  useEvent(player, 'onLoad', (data) => {
    analytics.track('video_loaded', { duration: data.duration });
  });

  useEvent(player, 'onProgress', (data) => {
    analytics.track('video_progress', { currentTime: data.currentTime });
  });

  useEvent(player, 'onError', (error) => {
    analytics.track('video_error', { error: error.error });
  });

  useEvent(player, 'onEnd', () => {
    analytics.track('video_completed');
  });

  return <VideoView player={player} style={{ flex: 1 }} />;
}
```

## When to Use

**Use JS Events when:**
- You need basic playback tracking (play, pause, progress, errors)
- You want a quick integration without native code
- Your analytics needs are straightforward

**Consider [Manual Analytics](./manual.md) when:**
- You need low-level metrics (bitrate, dropped frames, buffer health)
- You want to integrate with native analytics SDKs
- You need the most accurate and detailed data

## Tips

1. **Throttle progress events** - `onProgress` fires frequently. Consider throttling before sending to your analytics backend.

2. **Track session data** - Store a session ID to group events from the same viewing session.

3. **Include video metadata** - Add video ID, title, or other metadata to your events for better reporting.

```tsx
const sessionId = useRef(uuid()).current;

const handleProgress = (data) => {
  // Throttle to every 10 seconds
  if (Math.floor(data.currentTime) % 10 === 0) {
    analytics.track('video_progress', {
      sessionId,
      videoId: 'video-123',
      currentTime: data.currentTime,
    });
  }
};
```


================================================
FILE: docs/docs/player/downloading/_category_.json
================================================
{
  "label": "Downloading",
  "position": 6,
  "link": null,
  "collapsed": false,
  "customProps": {
    "plan": "pro"
  }
}


================================================
FILE: docs/docs/player/downloading/downloading.md
================================================
---
sidebar_position: 2
sidebar_label: Downloading
description: Complete API reference for Offline Video SDK
---

# Downloading

## Authorization

### `registerPlugin(apiKey: string): Promise<boolean>`

Registers and authorizes the plugin with the provided API key. Must be called before using any other functions.

**Parameters:**
- `apiKey`: Your API key obtained from [sdk.thewidlarzgroup.com](https://sdk.thewidlarzgroup.com?utm_source=rnv&utm_medium=docs&utm_campaign=downloading&utm_id=downloading_api-key-param)

**Returns:** `Promise<boolean>` - `true` if registration was successful, `false` otherwise

```tsx
import { registerPlugin } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const success = await registerPlugin("YOUR_API_KEY");
```

### `disablePlugin(): void`

Disables the plugin. After calling this, you'll need to call `registerPlugin` again to use the SDK.

```tsx
import { disablePlugin } from "@TheWidlarzGroup/react-native-video-stream-downloader";

disablePlugin();
```

### `isRegistered(): boolean`

Checks if the plugin is currently registered and authorized.

**Returns:** `boolean` - `true` if registered, `false` otherwise

```tsx
import { isRegistered } from "@TheWidlarzGroup/react-native-video-stream-downloader";

if (isRegistered()) {
  // Plugin is ready to use
}
```

## Configuration

### `setConfig(config: DownloadConfig): void`

Sets global configuration for downloads.

**Parameters:**
- `config`: Configuration with the following properties:
  - `updateFrequencyMS?: number` - How often to update download progress (in milliseconds)
  - `maxParallelDownloads?: number` - Maximum number of simultaneous downloads

```tsx
import { setConfig } from "@TheWidlarzGroup/react-native-video-stream-downloader";

setConfig({
  updateFrequencyMS: 1000,
  maxParallelDownloads: 3,
});
```

### `getConfig(): DownloadConfig`

Gets the current global configuration.

**Returns:** `DownloadConfig` with properties:
- `updateFrequencyMS?: number`
- `maxParallelDownloads?: number`

```tsx
import { getConfig } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const config = getConfig();
```

## Download Management

### `downloadStream(url: string, options?: DownloadOptions): Promise<DownloadStatus>` {#downloadstream}

Downloads a video stream for offline playback.

**Parameters:**
- `url`: The URL of the video stream to download
- `options`: Optional download configuration with the following properties:
  - `includeAllTracks?: boolean` - Whether to download all available tracks (default: `false`)
  - `tracks?: Track[]` - Array of specific tracks to download. Each track has:
    - `id: string` - Track identifier
    - `type: 'video' | 'audio' | 'text'` - Track type
    - `language?: string` - Language code (for audio/text tracks)
  - `expiresAt?: number` - Unix timestamp when the download should expire
  - `drm?: DRMConfig` - DRM configuration (see [DRM Downloading](./drm-downloading.md) for details)
  - `metadata?: Record<string, string>` - Custom metadata to store with the download

**Returns:** `Promise<DownloadStatus>` - Status immediately after adding to queue (not after completion)

**DownloadStatus properties:**
- `id: string` - Unique download identifier
- `url: string` - Source URL
- `status: 'queued' | 'downloading' | 'paused' | 'completed' | 'failed' | 'cancelled'` - Current status
- `progress: number` - Download progress (0-1)
- `bytesDownloaded: number` - Number of bytes downloaded
- `totalBytes: number` - Total bytes to download (may be `undefined` until known)

```tsx
import { downloadStream } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const status = await downloadStream("https://example.com/video.m3u8", {
  tracks: [
    { id: "video-1", type: "video" },
    { id: "audio-en", type: "audio", language: "en" },
  ],
});
```

### `pauseDownload(id: string): Promise<void>`

Pauses an active download.

**Parameters:**
- `id`: The download identifier returned from `downloadStream`

```tsx
import { pauseDownload } from "@TheWidlarzGroup/react-native-video-stream-downloader";

await pauseDownload(downloadId);
```

### `resumeDownload(id: string): Promise<void>`

Resumes a paused download.

**Parameters:**
- `id`: The download identifier returned from `downloadStream`

```tsx
import { resumeDownload } from "@TheWidlarzGroup/react-native-video-stream-downloader";

await resumeDownload(downloadId);
```

### `cancelDownload(id: string): Promise<void>`

Cancels a download and removes it from the queue. Also deletes any partially downloaded files.

**Parameters:**
- `id`: The download identifier returned from `downloadStream`

```tsx
import { cancelDownload } from "@TheWidlarzGroup/react-native-video-stream-downloader";

await cancelDownload(downloadId);
```

### `cancelAllDownloads(): Promise<void>`

Cancels all active and queued downloads.

```tsx
import { cancelAllDownloads } from "@TheWidlarzGroup/react-native-video-stream-downloader";

await cancelAllDownloads();
```

### `getDownloadStatus(id: string): Promise<DownloadStatus | null>`

Gets the current status of a specific download.

**Parameters:**
- `id`: The download identifier

**Returns:** `Promise<DownloadStatus | null>` - Current download status or `null` if not found

```tsx
import { getDownloadStatus } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const status = await getDownloadStatus(downloadId);
```

### `getDownloadsStatus(): Promise<DownloadStatus[]>`

Gets the status of all downloads (active, queued, completed, etc.).

**Returns:** `Promise<DownloadStatus[]>` - Array of all download statuses

```tsx
import { getDownloadsStatus } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const allStatuses = await getDownloadsStatus();
```

## Track Inspection

### `getAvailableTracks(url: string): Promise<AvailableTracks>` {#getavailabletracks}

Retrieves information about available audio, video, and subtitle tracks in a stream.

**Parameters:**
- `url`: The URL of the video stream to inspect

**Returns:** `Promise<AvailableTracks>` with the following structure:
- `video: VideoTrack[]` - Available video tracks, each with:
  - `id: string` - Track identifier
  - `width: number` - Video width in pixels
  - `height: number` - Video height in pixels
  - `bitrate: number` - Bitrate in bits per second
- `audio: AudioTrack[]` - Available audio tracks, each with:
  - `id: string` - Track identifier
  - `language: string` - Language code (e.g., "en", "es")
  - `bitrate: number` - Bitrate in bits per second
- `text: TextTrack[]` - Available subtitle tracks, each with:
  - `id: string` - Track identifier
  - `language: string` - Language code
  - `type: string` - Subtitle format (e.g., "text/vtt")

```tsx
import { getAvailableTracks } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const tracks = await getAvailableTracks("https://example.com/video.m3u8");

// Use tracks.video, tracks.audio, tracks.text to let user select
// Then pass selected tracks to downloadStream
```

For more details on track selection, see [Track Selection](./track-selection.md).

## Types

### `DownloadStatus` {#downloadstatus}

Status information for a download.

**Properties:**
- `id: string` - Unique download identifier
- `url: string` - Source URL
- `status: 'queued' | 'downloading' | 'paused' | 'completed' | 'failed' | 'cancelled'` - Current status
- `progress: number` - Download progress (0-1)
- `bytesDownloaded: number` - Number of bytes downloaded
- `totalBytes: number | undefined` - Total bytes to download (may be `undefined` until known)

### `DownloadOptions`

Configuration options for `downloadStream`.

**Properties:**
- `includeAllTracks?: boolean` - Whether to download all available tracks (default: `false`)
- `tracks?: Track[]` - Array of specific tracks to download
- `expiresAt?: number` - Unix timestamp when the download should expire
- `drm?: DRMConfig` - DRM configuration (see [DRM Downloading](./drm-downloading.md))
- `metadata?: Record<string, string>` - Custom metadata to store with the download

### `Track`

A track selection for download.

**Properties:**
- `id: string` - Track identifier
- `type: 'video' | 'audio' | 'text'` - Track type
- `language?: string` - Language code (for audio/text tracks)

### `AvailableTracks`

Result from `getAvailableTracks` containing available tracks.

**Properties:**
- `video: VideoTrack[]` - Available video tracks
- `audio: AudioTrack[]` - Available audio tracks
- `text: TextTrack[]` - Available subtitle tracks

### `VideoTrack`

Information about a video track.

**Properties:**
- `id: string` - Track identifier
- `width: number` - Video width in pixels
- `height: number` - Video height in pixels
- `bitrate: number` - Bitrate in bits per second

### `AudioTrack`

Information about an audio track.

**Properties:**
- `id: string` - Track identifier
- `language: string` - Language code (e.g., "en", "es")
- `bitrate: number` - Bitrate in bits per second

### `TextTrack`

Information about a subtitle track.

**Properties:**
- `id: string` - Track identifier
- `language: string` - Language code
- `type: string` - Subtitle format (e.g., "text/vtt")

### `DownloadConfig`

Global configuration for downloads.

**Properties:**
- `updateFrequencyMS?: number` - How often to update download progress (in milliseconds)
- `maxParallelDownloads?: number` - Maximum number of simultaneous downloads

### `DRMConfig`

DRM configuration for downloading protected content.

**Properties:**
- `licenseServer: string` - URL of the license server
- `certificateUrl?: string` - Certificate URL (required for FairPlay on iOS)
- `headers?: Record<string, string>` - HTTP headers for license requests
- `getLicense?: (spcData: ArrayBuffer) => Promise<ArrayBuffer>` - Custom license acquisition function (iOS only, FairPlay)


================================================
FILE: docs/docs/player/downloading/drm-downloading.md
================================================
---
sidebar_position: 5
sidebar_label: DRM Downloading
description: Downloading and playing DRM-protected content offline
---

# DRM Downloading

The Offline Video SDK supports downloading and playing DRM-protected content offline, including support for persistent licenses.

## Prerequisites

:::warning Critical Requirement
Your DRM provider **must support persistent/offline licenses**. Not all DRM providers support this feature. Contact your DRM provider to confirm offline license support before implementing.
:::

To download DRM-protected content, you need:

- **Encrypted media**: Video content encrypted with DRM (Widevine, FairPlay, PlayReady)
- **License server**: A license server that supports **persistent/offline licenses**
- **Short-lived token**: Authentication token for license acquisition (if required)

## High-level Flow

1. **Content Preparation**: Media is encrypted and packaged with DRM
2. **License Server Configuration**: License server is configured to issue persistent licenses
3. **Download with DRM Config**: Call `downloadStream` with DRM configuration
4. **License Acquisition**: SDK automatically acquires and stores persistent license
5. **Offline Playback**: Downloaded content can be played offline using the stored license

## Configuration

The `drm` property in `downloadStream` accepts a `DRMConfig` with the following properties:
- `licenseServer: string` - URL of the license server
- `certificateUrl?: string` - Certificate URL (required for FairPlay on iOS)
- `headers?: Record<string, string>` - HTTP headers for license requests
- `getLicense?: (spcData: ArrayBuffer) => Promise<ArrayBuffer>` - Custom license acquisition function (iOS only, FairPlay)

See [DRMConfig](./downloading.md#drmconfig) in API Reference for complete type definition.

### Basic DRM Configuration

```tsx
import { downloadStream } from "@TheWidlarzGroup/react-native-video-stream-downloader";

await downloadStream(videoUrl, {
  drm: {
    licenseServer: "https://license.example.com/acquire",
    headers: {
      "Authorization": "Bearer YOUR_TOKEN",
    },
  },
});
```

### FairPlay (iOS)

For FairPlay on iOS, you also need to provide the certificate URL:

```tsx
await downloadStream(videoUrl, {
  drm: {
    licenseServer: "https://license.example.com/acquire",
    certificateUrl: "https://license.example.com/certificate.cer",
    headers: {
      "Authorization": "Bearer YOUR_TOKEN",
    },
  },
});
```

### Custom License Acquisition (iOS only)

On iOS, you can provide a custom license acquisition function:

```tsx
await downloadStream(videoUrl, {
  drm: {
    licenseServer: "https://license.example.com/acquire",
    certificateUrl: "https://license.example.com/certificate.cer",
    getLicense: async (spcData: ArrayBuffer) => {
      // Custom license acquisition logic
      const response = await fetch("https://license.example.com/acquire", {
        method: "POST",
        headers: {
          "Content-Type": "application/octet-stream",
          "Authorization": "Bearer YOUR_TOKEN",
        },
        body: spcData,
      });
      return await response.arrayBuffer();
    },
  },
});
```

## Platform-Specific Notes

### Android

- Supports Widevine and PlayReady
- License acquisition is handled automatically by the SDK
- Ensure your license server supports persistent licenses

### iOS

- Supports FairPlay
- Requires `certificateUrl` for FairPlay
- Custom license acquisition via `getLicense` is optional but available
- FairPlay configuration should match your `react-native-video` DRM setup

## Testing

:::tip
Always test DRM downloading on a **real device**. Simulators/emulators may not properly handle DRM operations.
:::

When testing:
1. Ensure your test content is properly encrypted
2. Verify your license server supports persistent licenses
3. Test on both iOS and Android devices
4. Verify offline playback works after download completes
5. Test license expiration scenarios

## FairPlay Notes

The FairPlay configuration for offline downloading should match your `react-native-video` DRM configuration exactly. Use the same:
- `licenseServer` URL
- `certificateUrl`
- `headers` (if applicable)
- `getLicense` function (if using custom acquisition)

This ensures consistency between online and offline playback.


================================================
FILE: docs/docs/player/downloading/events-downloading.md
================================================
---
sidebar_position: 3
sidebar_label: Events (downloading)
description: Event system for tracking download progress and status
---

# Downloading Events

The Offline Video SDK emits events that allow you to monitor and react to changes in download status and progress. You can subscribe to these events using the `useEvent` hook.

## Available Events

### `onError`

Fired when an error occurs during download.

**Callback signature:**
```tsx
(error: string) => void
```

**Parameters:**
- `error`: Error message describing what went wrong

```tsx
import { useEvent } from "@TheWidlarzGroup/react-native-video-stream-downloader";

useEvent("onError", (error: string) => {
  console.error("Download error:", error);
});
```

### `onDownloadProgress`

Fired periodically during downloads with current progress information.

**Callback signature:**
```tsx
(downloads: DownloadStatus[]) => void
```

**Parameters:**
- `downloads`: Array of `DownloadStatus` - See [DownloadStatus structure](./downloading.md#downloadstatus) in API Reference for complete properties

```tsx
import { useEvent } from "@TheWidlarzGroup/react-native-video-stream-downloader";

useEvent("onDownloadProgress", (downloads: DownloadStatus[]) => {
  downloads.forEach((download) => {
    console.log(`Download ${download.id}: ${(download.progress * 100).toFixed(1)}%`);
  });
});
```

### `onDownloadEnd`

Fired when a download completes (successfully or with failure).

**Callback signature:**
```tsx
(download: DownloadStatus) => void
```

**Parameters:**
- `download`: Final `DownloadStatus` - See [DownloadStatus structure](./downloading.md#downloadstatus) in API Reference for complete properties. When this event fires, `status` will be either `'completed'` or `'failed'`.

```tsx
import { useEvent } from "@TheWidlarzGroup/react-native-video-stream-downloader";

useEvent("onDownloadEnd", (download: DownloadStatus) => {
  if (download.status === "completed") {
    console.log(`Download ${download.id} completed successfully`);
  } else {
    console.log(`Download ${download.id} failed`);
  }
});
```

## Using Events

Events are automatically typed and can be used with the `useEvent` hook:

```tsx
import { useEvent } from "@TheWidlarzGroup/react-native-video-stream-downloader";

function DownloadManager() {
  useEvent("onDownloadProgress", (downloads) => {
    // Update UI with progress
  });

  useEvent("onDownloadEnd", (download) => {
    // Handle completion
  });

  useEvent("onError", (error) => {
    // Handle errors
  });

  // ... rest of component
}
```

The `useEvent` hook automatically manages cleanup when the component unmounts, preventing memory leaks.


================================================
FILE: docs/docs/player/downloading/getting-started.md
================================================
---
sidebar_position: 1
sidebar_label: Getting Started
description: Installation and setup guide for Offline Video SDK
---

# Getting Started

This section covers the **Offline Video SDK** - a commercial extension for `react-native-video` that enables downloading and offline playback.

The Offline Video SDK is a commercial add-on for `react-native-video` (versions 6 and 7) that enables secure offline playback of HLS/DASH streams or static videos like MP4, including support for DRM, multiple audio tracks, and subtitles.

## Requirements

- **React Native Video**: version 6.15.0 or higher (versions 6 and 7 are supported)
- **iOS**: 15.0 or higher
- **Android**: 6.0 or higher
- **Api key**: A valid api key for the Offline Video SDK is required. You can obtain this through the [SDK platform](https://sdk.thewidlarzgroup.com?utm_source=rnv&utm_medium=docs&utm_campaign=downloading&utm_id=getting-started_api-key-requirement).

## Features

- **HLS/DASH/MP4 Downloading**: Download and store video streams for offline playback
- **Asset Management**: Full control over downloaded assets
- **Offline DRM**: Supports offline playback of DRM-protected content with proper rights enforcement and license handling
- **Offline Playback**: Play downloaded content without internet connection
- **Cross-platform**: Works on both iOS and Android

## Installation

### 1. Configure npm for Private Package

Since this is a private package, configure npm to access GitHub Packages by adding the following to your `~/.npmrc` file:

```
@TheWidlarzGroup:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=<NPM_GITHUB_AUTH_TOKEN>
```

Replace `<NPM_GITHUB_AUTH_TOKEN>` with your GitHub token. To obtain this token, please [contact us](https://www.thewidlarzgroup.com/?utm_source=rnv&utm_medium=docs&utm_campaign=downloading&utm_id=getting-started_github-token#Contact).

:::note
This token is different from the API key used for plugin authorization.
:::

### 2. Install the Package

Install the package using npm:

```bash
npm install @TheWidlarzGroup/react-native-video-stream-downloader
```

### 3. Android Configuration

Add the following line to your `./android/app/build.gradle` file in the `dependencies` block:

```groovy
implementation fileTree(dir: "../../node_modules/@TheWidlarzGroup/react-native-video-stream-downloader/native-libs", include: ["*.aar"])
```

Ensure the path matches your project's `node_modules` location.

### 4. iOS Configuration

No additional configuration is required for iOS; the plugin will be automatically linked.

### 5. Plugin Authorization

After installation, authorize the plugin with an API key:

```tsx
import { registerPlugin } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const success = await registerPlugin("YOUR_API_KEY");
```

Replace `"YOUR_API_KEY"` with your actual API key obtained from [sdk.thewidlarzgroup.com](https://sdk.thewidlarzgroup.com?utm_source=rnv&utm_medium=docs&utm_campaign=downloading&utm_id=getting-started_api-key-link).

## Supported Formats

| Format | iOS | Android |
|--------|-----|---------|
| HLS | ✅ | ✅ |
| MP4 | ✅ | ✅ |
| MPEG-DASH | ❌ | ✅ |

## Licensing & Pricing

The Offline Video SDK is distributed under a commercial license. You can evaluate it for free for 14 days without a credit card. For questions or assistance, contact [hi@thewidlarzgroup.com](mailto:hi@thewidlarzgroup.com).


================================================
FILE: docs/docs/player/downloading/track-selection.md
================================================
---
sidebar_position: 4
sidebar_label: Track Selection
description: How to select specific tracks for download
---

# Track Selection

Track selection allows you to download only the specific audio, video, and subtitle tracks you need, optimizing storage usage and download time.

## Why Select Tracks?

- **Storage Optimization**: Download only the tracks you need (e.g., specific language, resolution)
- **Language Support**: Choose audio tracks in different languages
- **Subtitle Selection**: Download only the subtitle languages your users need
- **Bitrate Control**: Select video tracks with appropriate bitrates for your use case

## How It Works

The track selection process follows a 2-step flow:

1. **Inspect Available Tracks**: Use `getAvailableTracks(url)` to retrieve all available tracks
2. **Select Tracks for Download**: Pass the selected track IDs to `downloadStream` in the `tracks` property

### Step 1: Get Available Tracks

Use `getAvailableTracks` to retrieve all available tracks. See [getAvailableTracks](./downloading.md#getavailabletracks) in API Reference for complete details.

```tsx
import { getAvailableTracks } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const tracks = await getAvailableTracks("https://example.com/video.m3u8");
// tracks.video, tracks.audio, tracks.text contain available tracks
```

### Step 2: Download Selected Tracks

```tsx
import { downloadStream } from "@TheWidlarzGroup/react-native-video-stream-downloader";

// Select specific tracks
const selectedTracks = [
  tracks.video[0].id, // First video track (usually highest quality)
  tracks.audio.find(t => t.language === "en")?.id, // English audio
  tracks.text.find(t => t.language === "en")?.id, // English subtitles
].filter(Boolean); // Remove undefined values

await downloadStream("https://example.com/video.m3u8", {
  tracks: selectedTracks.map(id => ({ id, type: "video" })), // You need to specify type
});
```

## Example: Multi-Language Selection

```tsx
import { getAvailableTracks, downloadStream } from "@TheWidlarzGroup/react-native-video-stream-downloader";

const tracks = await getAvailableTracks(videoUrl);

// Select video track (highest quality)
const videoTrack = tracks.video[0];

// Select multiple audio tracks (English and Spanish)
const audioTracks = tracks.audio.filter(t => 
  t.language === "en" || t.language === "es"
);

// Select subtitles for both languages
const subtitleTracks = tracks.text.filter(t => 
  t.language === "en" || t.language === "es"
);

// Build track selection array
const selectedTracks = [
  { id: videoTrack.id, type: "video" as const },
  ...audioTracks.map(t => ({ id: t.id, type: "audio" as const })),
  ...subtitleTracks.map(t => ({ id: t.id, type: "text" as const })),
];

await downloadStream(videoUrl, {
  tracks: selectedTracks,
});
```

## Default Behavior

If you don't specify `tracks` in `downloadStream`, or if `includeAllTracks` is `false`, only the default tracks are downloaded (typically the first video track and the first audio track).

To download all available tracks, set `includeAllTracks: true`:

```tsx
await downloadStream(videoUrl, {
  includeAllTracks: true,
});
```


================================================
FILE: docs/docs/player/drm.md
================================================
---
sidebar_position: 4
sidebar_label: DRM
---

# DRM

## What is DRM (Digital Rights Management)?
DRM is a set of access control technologies that are used to protect copyrighted content from unauthorized use and distribution. It allows content owners to control how their digital media is used and distributed.

### When do you need it?
If you are working with copyrighted content and want to prevent unauthorized access or distribution, you will need DRM. It is especially important for streaming services, e-learning platforms, and any application that delivers premium content that you want to protect from piracy.

### What next?
This page explains how to play DRM‑protected content with React Native Video using the official DRM plugin. It covers installing and enabling the plugin, configuring sources with DRM, and platform‑specific notes for Android (Widevine) and iOS/visionOS (FairPlay).

## Install and enable the DRM plugin

:::tip Pluginable Architecture
React Native Video uses a plugin architecture. DRM support is provided by the `@react-native-video/drm` plugin and is not built into the core package.
:::

1) Install dependencies in your app:

```sh
npm install @react-native-video/drm
```

2) Enable the plugin at app startup (before creating any players):

```ts
// App.tsx (or any place you want to initialize the plugin)
import { enable } from '@react-native-video/drm';

enable();
```

The plugin autolinks on both Android and iOS. Nitro Modules are required because the plugin uses Nitro under the hood.

## Quick start

You pass DRM configuration via `VideoConfig.drm` when creating a player or using the `useVideoPlayer` hook. If `drm.type` is omitted, the default is inferred per platform (`widevine` on Android, `fairplay` on iOS/visionOS).

```tsx
import { VideoView, useVideoPlayer } from 'react-native-video';

export function Player() {
  const player = useVideoPlayer({
    source: {
    uri: 'https://example.com/manifest.mpd', // or HLS .m3u8 for FairPlay
    // On iOS these headers are also used for the default license request
    headers: { Authorization: 'Bearer <token>' },
    drm: {
      // type: 'widevine' | 'fairplay'  // optional; inferred by platform
      licenseUrl: 'https://license.example.com/widevine',
    },
  },
  });

  return <VideoView player={player} />;
}
```

:::warning
You shouldn't include your authorization token directly in the code. Instead, use a backend method to retrieve it at runtime.
:::

## DRM config reference

All properties are optional unless marked otherwise for a platform. The table below describes each property, the expected type, platforms where it applies, whether it's required, and important notes.

| Property | Type | Platform | Required | Notes |
|---|---:|---|:---:|---|
| `type` | `'widevine' \| 'fairplay'` | Android, iOS, visionOS | No (defaulted) | Default inferred per platform when `drm` is present and `type` omitted (Android → `widevine`, iOS/visionOS → `fairplay`). |
| `licenseUrl` | `string` | Android, iOS, visionOS | Android: Yes; iOS/visionOS: Yes for default/custom flows | URL of the license (CKC) service. Required for license acquisition. |
| `licenseHeaders` | ``Record<string, string>`` | Android | No | Extra headers sent with the Widevine license request. (On iOS, use `source.headers` for license requests.) |
| `multiSession` | `boolean` | Android | No | Whether to allow multiple Widevine sessions. |
| `certificateUrl` | `string` | iOS, visionOS | Yes (for FairPlay) | URL to fetch the FairPlay application certificate (used to create the SPC). |
| `contentId` | `string` | iOS, visionOS | No | If omitted, derived from the `skd://` key URL. Used when creating the SPC. |
| `getLicense` | ``(payload) => Promise<string>`` | iOS, visionOS | No | Optional hook for custom FairPlay license logic; must resolve to a base64‑encoded CKC string. |

Payload shape passed to `getLicense` (iOS/visionOS):

| Field | Type | Description |
|---|---:|---|
| `contentId` | `string` | Content identifier for the asset. If not provided the player will try to derive it from the `skd://` key URL. |
| `licenseUrl` | `string` | The license server URL that should be used for license acquisition. |
| `keyUrl` | `string` | The key URL/identifier received from the stream (typically an `skd://` URL). |
| `spc` | `string` | The SPC (secure playback context) as a base64‑encoded string. Send raw SPC bytes to your license server (server side may expect raw bytes rather than base64). |

## Android: Widevine

- Set `drm.type` to `'widevine'` or omit it (the library will default to Widevine on Android if `drm` is present).
- `licenseUrl` is required; `licenseHeaders` and `multiSession` are optional.
- Implementation details:
	- The plugin uses ExoPlayer’s `DefaultDrmSessionManager` and `HttpMediaDrmCallback` with your `licenseUrl` and `licenseHeaders`.
	- If a first attempt fails due to device security level issues, the plugin retries with `L3` security level.

Example:

```tsx
useVideoPlayer({
  source: {
    uri: 'https://example.com/manifest.mpd',
    drm: {
      // type: 'widevine', // optional
      licenseUrl: 'https://license.example.com/widevine',
      licenseHeaders: { 'X-Custom-Header': 'value' },
      multiSession: false,
    },
  },
});
```

## iOS and visionOS: FairPlay

Two ways to get the CKC (license):

1) Default flow (no `getLicense`):
	 - Required: `certificateUrl`, `licenseUrl`.
	 - The plugin requests the application certificate, generates the SPC, then POSTs the SPC to `licenseUrl`.
	 - It uses `source.headers` (not `drm.licenseHeaders`) for the license request.

2) Custom flow (provide `getLicense`):
	 - Required: `certificateUrl`, `licenseUrl`, and a `getLicense` implementation.
	 - You receive `{ contentId, licenseUrl, keyUrl, spc }` and must return a base64‑encoded CKC string.

Notes:
- DRM isn’t supported in the iOS Simulator; the plugin returns `null` for DRM in Simulator builds.
- If `contentId` isn’t provided, it is derived from the `skd://` key URL.

Default flow example:

```tsx
useVideoPlayer({
  source: {
    uri: 'https://example.com/fairplay.m3u8',
    headers: { Authorization: 'Bearer <token>' }, // used for the license request
    drm: {
      // type: 'fairplay', // optional
      certificateUrl: 'https://license.example.com/fps-cert',
      licenseUrl: 'https://license.example.com/fps',
      // contentId: 'my-content-id', // optional
    },
  },
});
```

Custom `getLicense` example:

:::tip
This is example code for a custom `getLicense` implementation. it may differ from your actual implementation provided by your DRM provider
:::

```tsx
useVideoPlayer({
  source: {
  uri: 'https://example.com/fairplay.m3u8',
  drm: {
    certificateUrl: 'https://license.example.com/fps-cert',
    licenseUrl: 'https://license.example.com/fps',
    getLicense: async ({ contentId, licenseUrl, keyUrl, spc }) => {
      // Example: POST SPC to your license server and return base64 CKC
        const res = await fetch(licenseUrl, {
          method: 'POST',
          body: Buffer.from(spc, 'base64'), // server expects raw SPC bytes
          headers: {
            'Content-Type': 'application/octet-stream',
            'X-Content-ID': contentId,
            'X-Asset-Id': keyUrl,
          },
        });
        if (!res.ok) throw new Error(`License request failed: ${res.status}`);
        const ckc = await res.arrayBuffer();
        // return base64 CKC string
        return Buffer.from(ckc).toString('base64');
      },
    },
  },
});
```

## Offline
If you are looking for implementing offline playback with DRM, make sure to checkout our [Offline Video SDK](https://www.thewidlarzgroup.com/offline-video-sdk?utm_source=rnv&utm_medium=docs&utm_campaign=drm&utm_id=offline-sdk-link). It provides a comprehensive solution for downloading and playing Streams and DRM-protected content.

## Troubleshooting

- DRMPluginNotFound: Ensure you installed `@react-native-video/drm`, imported it, and called `enable()` before creating any players.
- iOS headers: The default FairPlay flow uses `source.headers` for license requests; `drm.licenseHeaders` are not used on iOS.
- Invalid CKC: `getLicense` must return a base64 string. Returning raw bytes or JSON will fail.
- 403/415 from license server: Verify required auth headers, content type, and whether the server expects raw SPC bytes vs base64.
- Android security level issues: The plugin retries with Widevine L3 if the first attempt fails.
- iOS Simulator: DRM isn’t supported in Simulator. Test on a real device.

## Notes and defaults

- If `drm` is provided without `type`, the library sets a platform default: Android → Widevine, iOS/visionOS → FairPlay.
- For custom DRM systems or advanced pipelines, you can implement your own plugin. See the Plugin Interface docs.



================================================
FILE: docs/docs/player/events.md
================================================
---
sidebar_label: Events
sidebar_position: 5
---

# Handling Player Events

The `VideoPlayer` emits a variety of events that allow you to monitor and react to changes in its state and playback.

## Using the `useEvent` Hook

For React functional components, the `useEvent` hook provides a convenient way to subscribe to player events and automatically manage cleanup.

```typescript
import { useVideoPlayer, useEvent } from 'react-native-video';
import { useEffect } from 'react';

const MyVideoComponent = () => {
  const player = useVideoPlayer('https://example.com/video.mp4', (_player) => {
    _player.play();
  });

  useEvent(player, 'onLoad', (data) => {
    console.log('Video loaded via useEvent! Duration:', data.duration);
  });

  useEvent(player, 'onProgress', (data) => {
    console.log('Progress via useEvent:', data.currentTime);
  });

  // For onError, which is a direct property on VideoPlayer, not from VideoPlayerEvents
  useEvent(player, 'onError', (error) => {
    console.error('Player Error via useEvent:', error.code, error.message);
  });

  return <VideoView player={player} />;
};
```

## Available Events

The `VideoPlayer` class, through `VideoPlayerEvents`, supports the following events. You can subscribe to these by assigning a callback function to the corresponding property on the `VideoPlayer` instance.

| Event                      | Callback Signature                                      | Description                                                                                 |
|----------------------------|--------------------------------------------------------|---------------------------------------------------------------------------------------------|
| `onAudioBecomingNoisy`     | () => void                                           | Fired when audio is about to become noisy (e.g., headphones unplugged).                     |
| `onAudioFocusChange`       | (hasAudioFocus: boolean) => void                     | Fired when the audio focus changes (e.g., another app starts playing audio).                |
| `onBandwidthUpdate`        | (data: [BandwidthData](../api-reference/interfaces/BandwidthData.md)) => void                        | Fired with an estimate of the available bandwidth.                                          |
| `onBuffer`                 | (buffering: boolean) => void                         | Fired when the player starts or stops buffering data.                                       |
| `onControlsVisibleChange`  | (visible: boolean) => void                           | Fired when the visibility of native controls changes.                                       |
| `onEnd`                    | () => void                                           | Fired when the video playback reaches the end.                                              |
| `onExternalPlaybackChange` | (externalPlaybackActive: boolean) => void            | Fired when the external playback status changes (e.g., AirPlay).                            |
| `onLoad`                   | (data: [onLoadData](../api-reference/interfaces/onLoadData.md)) => void                           | Fired when the video has loaded and is ready to play.                                       |
| `onLoadStart`              | (data: [onLoadStartData](../api-reference/interfaces/onLoadStartData.md)) => void                      | Fired when the video starts loading.                                                        |
| `onPlaybackRateChange`     | (rate: number) => void                               | Fired when the playback rate changes.                                                       |
| `onPlaybackStateChange`    | (data: [onPlaybackStateChangeData](../api-reference/interfaces/onPlaybackStateChangeData.md)) => void            | Fired when the playback state changes (e.g., playing, paused, stopped).                     |
| `onProgress`               | (data: [onProgressData](../api-reference/interfaces/onProgressData.md)) => void                       | Fired periodically during playback with the current time.                                   |
| `onReadyToDisplay`         | () => void                                           | Fired when the player is ready to display the first frame of the video.                     |
| `onSeek`                   | (seekTime: number) => void                           | Fired when a seek operation has completed.                                                  |
| `onStatusChange`           | (status: [VideoPlayerStatus](../api-reference/type-aliases/VideoPlayerStatus.md)) => void                  | Fired when the player status changes (detailed status updates).                             |
| `onTextTrackDataChanged`   | (texts: string[]) => void                            | Fired when text track data (e.g., subtitles) changes.                                       |
| `onTimedMetadata`          | (metadata: [TimedMetadata](../api-reference/interfaces/TimedMetadata.md)) => void                    | Fired when timed metadata is encountered in the video stream.                               |
| `onTrackChange`            | (track: [TextTrack](../api-reference/interfaces/TextTrack.md) \| null) => void                    | Fired when the selected text track changes.                                                 |
| `onVolumeChange`           | (data: [onVolumeChangeData](../api-reference/interfaces/onVolumeChangeData.md)) => void     | Fired when the volume changes.                                                              |

Additionally, the `VideoPlayer` instance itself has an `onError` property:

-   `onError: (error: ` [VideoRuntimeError](../api-reference/interfaces/VideoRuntimeError.md) `) => void` - Fired when an error occurs. The callback receives the `VideoRuntimeError` object.

**Benefits of `useEvent`**:

-   **Automatic Cleanup**: The event listener is automatically removed when the component unmounts or when the `player`, `event`, or `callback` dependencies change, preventing memory leaks.
-   **Type Safety**: Provides better type inference for event callback parameters.

This hook is recommended for managing event subscriptions in a declarative React style. 

### Initialization Timing and Events

`onLoadStart` / `onLoad` will fire automatically after construction when `initializeOnCreation` (default `true`) is enabled. If you set `initializeOnCreation: false`, these events will not fire until you call `initialize()` or `preload()`. Attach your event handlers before invoking those methods to avoid missing early events.

## Subscribing to Events

You can subscribe to an event by assigning a function to the player instance's corresponding property:

```typescript
import { VideoPlayer } from 'react-native-video';

const player = new VideoPlayer('https://example.com/video.mp4');

player.addEventListener('onLoad', (data) => {
  console.log('Video loaded! Duration:', data.duration);
});

player.addEventListener('onProgress', (data) => {
  console.log('Current time:', data.currentTime);
});

player.addEventListener('onError', (error) => {
  console.error('Player Error:', error.code, error.message);
});

player.play();
```

## Clearing Events

-   The `player.clearEvent(eventName)` method can be used to clear a specific native event handler.
-   When a player instance is no longer needed and `player.release()` is called, all event listeners are automatically cleared


================================================
FILE: docs/docs/player/player.md
================================================
---
sidebar_position: 1
sidebar_label: Player
---

# Player

The `VideoPlayer` class is the primary way to control video playback. It provides methods and properties to manage the video source, playback state, volume, and other aspects of the video.

## Initialization

To use the `VideoPlayer`, you first need to create an instance of it with a video source. There are two ways to do this. By default the native media item is initialized asynchronously right after creation (unless you opt out with `initializeOnCreation: false`).

### Using `useVideoPlayer` hook

```tsx
import { useVideoPlayer } from 'react-native-video';

const player = useVideoPlayer({
  source: {
    uri: 'https://www.w3schools.com/html/mov_bbb.mp4',
  },
});
```

:::info
`useVideoPlayer` hook is recommended for most use cases. It automatically manages the player lifecycle between the component mount and unmount.
:::

For detailed information about using the hook, see [useVideoPlayer](./use-video-player.md).

### Using `VideoPlayer` class constructor directly

```typescript
import { VideoPlayer } from 'react-native-video';

// Using a URL string
const player = new VideoPlayer('https://example.com/video.mp4');

// Using a VideoSource object
const playerWithSource = new VideoPlayer({ uri: 'https://example.com/video.mp4' });

// Using a VideoConfig object
const playerWithConfig = new VideoPlayer({
  source: { uri: 'https://example.com/video.mp4' },
  // other configurations
});
```

:::warning
When using `VideoPlayer` class directly, you need to manually manage the player lifecycle. Once you no longer need the player, you need to call `release()` method to release the player's native resources. See [Player Lifecycle](./video-player.md#player-lifecycle) for more details.
:::

For detailed information about using the class, see [VideoPlayer](./video-player.md).


================================================
FILE: docs/docs/player/use-video-player.md
================================================
---
sidebar_position: 2
sidebar_label: useVideoPlayer
---

# useVideoPlayer

The `useVideoPlayer` hook is the recommended way to create and manage a `VideoPlayer` instance in React components. It automatically handles the player lifecycle, ensuring resources are properly released when the component unmounts.

## Quick Start

The simplest way to use the hook is to pass a video source:

```tsx
import { useVideoPlayer } from 'react-native-video';

const player = useVideoPlayer('https://www.w3schools.com/html/mov_bbb.mp4');
```

You can also pass a configuration object for more control:

```tsx
const player = useVideoPlayer({
  source: {
    uri: 'https://www.w3schools.com/html/mov_bbb.mp4',
  },
});
```

## Why useVideoPlayer?

The `useVideoPlayer` hook provides several advantages over creating a `VideoPlayer` instance directly:

- **Automatic lifecycle management**: The player is automatically released when the component unmounts
- **React-friendly**: Works seamlessly with React's component lifecycle

:::info
For most React components, `useVideoPlayer` is the recommended approach. If you need more control over the player lifecycle, see [VideoPlayer class](./video-player.md) for direct instantiation.
:::

## Using the Player Instance

The `useVideoPlayer` hook returns a `VideoPlayer` instance that you can use to control playback:

```tsx
import { useVideoPlayer } from 'react-native-video';

const player = useVideoPlayer('https://example.com/video.mp4');

// Control playback
player.play();
player.pause();
player.muted = true;
```

### Playback Control

| Method | Description |
|--------|-------------|
| `play()` | Starts or resumes video playback. |
| `pause()` | Pauses video playback. |
| `seekBy(time: number)` | Seeks the video forward or backward by the specified number of seconds. |
| `seekTo(time: number)` | Seeks the video to a specific time in seconds. |
| `replaceSourceAsync(source: VideoSource \| VideoConfig \| null)` | Replaces the current video source with a new one. Pass `null` to release the current source without replacing it. |
| `initialize()` | Manually initialize the underlying native player item when `initializeOnCreation` was set to `false`. No-op if already initialized. |
| `preload()` | Ensures the media source is set and prepared (buffering started) without starting playback. If not yet initialized it will initialize first. |
| `release()` | Releases the player's native resources. The player is no longer usable after calling this method. **Note:** If you intend to reuse the player instance with a different source, use `replaceSourceAsync(null)` to clear resources instead of `release()`. |

### Properties

| Property | Access | Type | Description |
|----------|--------|------|-------------|
| `source` | Read-only | `VideoPlayerSource` | Gets the current `VideoPlayerSource` object. |
| `status` | Read-only | `VideoPlayerStatus` | Gets the current status (e.g., `playing`, `paused`, `buffering`). |
| `duration` | Read-only | `number` | Gets the total duration of the video in seconds. Returns `NaN` until metadata is loaded. |
| `volume` | Read/Write | `number` | Gets or sets the player volume (0.0 to 1.0). |
| `currentTime` | Read/Write | `number` | Gets or sets the current playback time in seconds. |
| `muted` | Read/Write | `boolean` | Gets or sets whether the video is muted. |
| `loop` | Read/Write | `boolean` | Gets or sets whether the video should loop. |
| `rate` | Read/Write | `number` | Gets or sets the playback rate (e.g., 1.0 for normal speed, 0.5 for half speed, 2.0 for double speed). |
| `mixAudioMode` | Read/Write | `MixAudioMode` | Controls how this player's audio mixes with other audio sources (see [MixAudioMode](../api-reference/type-aliases/MixAudioMode.md)). |
| `ignoreSilentSwitchMode` | Read/Write | `IgnoreSilentSwitchMode` | iOS-only. Determines how audio should behave when the hardware mute (silent) switch is on. |
| `playInBackground` | Read/Write | `boolean` | Whether playback should continue when the app goes to the background. |
| `playWhenInactive` | Read/Write | `boolean` | Whether playback should continue when the app is inactive (e.g., during a phone call). |
| `isPlaying` | Read-only | `boolean` | Returns `true` if the video is currently playing. |
| `selectedTrack` | Read-only | `TextTrack \| undefined` | Currently selected text track, or `undefined` when no track is selected. |

### Error Handling

| Property | Type | Description |
|----------|------|-------------|
| `onError?` | `(error: VideoRuntimeError) => void` | A callback function that is invoked when a runtime error occurs in the player. You can use this to catch and handle errors gracefully. |

### Buffer Config

You can fine‑tune buffering via `bufferConfig` on the `VideoConfig` you pass to `useVideoPlayer`/`VideoPlayer`. This controls how much data is buffered, live latency targets, and iOS network constraints.

Example

```ts
const player = useVideoPlayer({
  source: {
    uri: 'https://example.com/stream.m3u8',
    bufferConfig: {
      // Android
      minBufferMs: 5000,
      maxBufferMs: 10000,
      // iOS
      preferredForwardBufferDurationMs: 3000,
      // Live (cross‑platform target)
      livePlayback: { targetOffsetMs: 500 },
    },
  },
});
```

#### Android
Properties below are Android‑only

| Property | Type | Description |
|----------|------|-------------|
| `minBufferMs` | `number` | Minimum media duration the player attempts to keep buffered (ms). Default: 5000. |
| `maxBufferMs` | `number` | Maximum media duration the player attempts to buffer (ms). Default: 10000. |
| `bufferForPlaybackMs` | `number` | Media that must be buffered before playback can start or resume after user action (ms). Default: 1000. |
| `bufferForPlaybackAfterRebufferMs` | `number` | Media that must be buffered to resume after a rebuffer (ms). Default: 2000. |
| `backBufferDurationMs` | `number` | Duration kept behind the current position to allow instant rewind without rebuffer (ms). |
| `livePlayback.minPlaybackSpeed` | `number` | Minimum playback speed used to maintain target live offset. |
| `livePlayback.maxPlaybackSpeed` | `number` | Maximum playback speed used to catch up to target live offset. |
| `livePlayback.minOffsetMs` | `number` | Minimum allowed live offset (ms). |
| `livePlayback.maxOffsetMs` | `number` | Maximum allowed live offset (ms). |
| `livePlayback.targetOffsetMs` | `number` | Target live offset the player tries to maintain (ms). |

#### iOS, visionOS, tvOS
Properties below are Apple platforms‑only

| Property | Type | Description |
|----------|------|-------------|
| `preferredForwardBufferDurationMs` | `number` | Preferred duration the player attempts to retain ahead of the playhead (ms). |
| `preferredPeakBitRate` | `number` | Desired limit of network bandwidth for loading the current item (bits per second). |
| `preferredMaximumResolution` | `{ width: number; height: number }` | Preferred maximum video resolution. |
| `preferredPeakBitRateForExpensiveNetworks` | `number` | Bandwidth limit for expensive networks (e.g., cellular), in bits per second. |
| `preferredMaximumResolutionForExpensiveNetworks` | `{ width: number; height: number }` | Preferred maximum resolution on expensive networks. |
| `livePlayback.targetOffsetMs` | `number` | Target live offset (ms) the player will try to maintain. |

## DRM

Protected content is supported via a plugin. See the full DRM guide: [DRM](./drm.md).

Quick notes:
- Install and enable the official plugin `@react-native-video/drm` and call `enable()` at app startup before creating players.
- Pass DRM configuration on the source using the `drm` property of `VideoConfig` (see the DRM guide for platform specifics and `getLicense` examples).
- If you defer initialization (`initializeOnCreation: false`), be sure to call `await player.initialize()` (or `preload()`) before expecting DRM license acquisition events.

================================================
FILE: docs/docs/player/video-player.md
================================================
---
sidebar_position: 3
sidebar_label: VideoPlayer
---

# VideoPlayer

:::tip When to Use What
- **[`useVideoPlayer`](./use-video-player.md) hook** - Recommended for most cases. Automatically manages player lifecycle (creation, cleanup on unmount, source changes).
- **`VideoPlayer` class** - Use when you need manual lifecycle control, e.g., preloading videos before displaying them, managing multiple players with custom logic, or deferred initialization scenarios.
:::

The `VideoPlayer` class is the primary way to control video playback. It provides methods and properties to manage the video source, playback state, volume, and other aspects of the video.

## Initialization

To use the `VideoPlayer`, you first need to create an instance of it with a video source. By default the native media item is initialized asynchronously right after creation (unless you opt out with `initializeOnCreation: false`).

```typescript
import { VideoPlayer } from 'react-native-video';

// Using a URL string
const player = new VideoPlayer('https://example.com/video.mp4');

// Using a VideoSource object
const playerWithSource = new VideoPlayer({ uri: 'https://example.com/video.mp4' });

// Using a VideoConfig object
const playerWithConfig = new VideoPlayer({
  source: { uri: 'https://example.com/video.mp4' },
  // other configurations
});
```

:::warning
When using `VideoPlayer` class directly, you need to manually manage the player lifecycle. Once you no longer need the player, you need to call `release()` method to release the player's native resources. See the [Player Lifecycle](#player-lifecycle) section below for more details.
:::

## Core Functionality

The `VideoPlayer` class offers a comprehensive set of methods and properties to control video playback:

### Playback Control

| Method | Description |
|--------|-------------|
| `play()` | Starts or resumes video playback. |
| `pause()` | Pauses video playback. |
| `seekBy(time: number)` | Seeks the video forward or backward by the specified number of seconds. |
| `seekTo(time: number)` | Seeks the video to a specific time in seconds. |
| `replaceSourceAsync(source: VideoSource \| VideoConfig \| null)` | Replaces the current video source with a new one. Pass `null` to release the current source without replacing it. |
| `initialize()` | Manually initialize the underlying native player item when `initializeOnCreation` was set to `false`. No-op if already initialized. |
| `preload()` | Ensures the media source is set and prepared (buffering started) without starting playback. If not yet initialized it will initialize first. |
| `release()` | Releases the player's native resources. The player is no longer usable after calling this method. **Note:** If you intend to reuse the player instance with a different source, use `replaceSourceAsync(null)` to clear resources instead of `release()`. |

### Properties

| Property | Access | Type | Description |
|----------|--------|------|-------------|
| `source` | Read-only | `VideoPlayerSource` | Gets the current `VideoPlayerSource` object. |
| `status` | Read-only | `VideoPlayerStatus` | Gets the current status (e.g., `playing`, `paused`, `buffering`). |
| `duration` | Read-only | `number` | Gets the total duration of the video in seconds. Returns `NaN` until metadata is loaded. |
| `volume` | Read/Write | `number` | Gets or sets the player volume (0.0 to 1.0). |
| `currentTime` | Read/Write | `number` | Gets or sets the current playback time in seconds. |
| `muted` | Read/Write | `boolean` | Gets or sets whether the video is muted. |
| `loop` | Read/Write | `boolean` | Gets or sets whether the video should loop. |
| `rate` | Read/Write | `number` | Gets or sets the playback rate (e.g., 1.0 for normal speed, 0.5 for half speed, 2.0 for double speed). |
| `mixAudioMode` | Read/Write | `MixAudioMode` | Controls how this player's audio mixes with other audio sources (see [MixAudioMode](../api-reference/type-aliases/MixAudioMode.md)). |
| `ignoreSilentSwitchMode` | Read/Write | `IgnoreSilentSwitchMode` | iOS-only. Determines how audio should behave when the hardware mute (silent) switch is on. |
| `playInBackground` | Read/Write | `boolean` | Whether playback should continue when the app goes to the background. |
| `playWhenInactive` | Read/Write | `boolean` | Whether playback should continue when the app is inactive (e.g., during a phone call). |
| `isPlaying` | Read-only | `boolean` | Returns `true` if the video is currently playing. |
| `selectedTrack` | Read-only | `TextTrack \| undefined` | Currently selected text track, or `undefined` when no track is selected. |

### Error Handling

| Property | Type | Description |
|----------|------|-------------|
| `onError?` | `(error: VideoRuntimeError) => void` | A callback function that is invoked when a runtime error occurs in the player. You can use this to catch and handle errors gracefully. |

### Buffer Config

You can fine‑tune buffering via `bufferConfig` on the `VideoConfig` you pass to `useVideoPlayer`/`VideoPlayer`. This controls how much data is buffered, live latency targets, and iOS network constraints.

Example

```ts
const player = new VideoPlayer({
  source: {
    uri: 'https://example.com/stream.m3u8',
    bufferConfig: {
      // Android
      minBufferMs: 5000,
      maxBufferMs: 10000,
      // iOS
      preferredForwardBufferDurationMs: 3000,
      // Live (cross‑platform target)
      livePlayback: { targetOffsetMs: 500 },
    },
  },
});
```

#### Android
Properties below are Android‑only

| Property | Type | Description |
|----------|------|-------------|
| `minBufferMs` | `number` | Minimum media duration the player attempts to keep buffered (ms). Default: 5000. |
| `maxBufferMs` | `number` | Maximum media duration the player attempts to buffer (ms). Default: 10000. |
| `bufferForPlaybackMs` | `number` | Media that must be buffered before playback can start or resume after user action (ms). Default: 1000. |
| `bufferForPlaybackAfterRebufferMs` | `number` | Media that must be buffered to resume after a rebuffer (ms). Default: 2000. |
| `backBufferDurationMs` | `number` | Duration kept behind the current position to allow instant rewind without rebuffer (ms). |
| `livePlayback.minPlaybackSpeed` | `number` | Minimum playback speed used to maintain target live offset. |
| `livePlayback.maxPlaybackSpeed` | `number` | Maximum playback speed used to catch up to target live offset. |
| `livePlayback.minOffsetMs` | `number` | Minimum allowed live offset (ms). |
| `livePlayback.maxOffsetMs` | `number` | Maximum allowed live offset (ms). |
| `livePlayback.targetOffsetMs` | `number` | Target live offset the player tries to maintain (ms). |

#### iOS, visionOS, tvOS
Properties below are Apple platforms‑only

| Property | Type | Description |
|----------|------|-------------|
| `preferredForwardBufferDurationMs` | `number` | Preferred duration the player attempts to retain ahead of the playhead (ms). |
| `preferredPeakBitRate` | `number` | Desired limit of network bandwidth for loading the current item (bits per second). |
| `preferredMaximumResolution` | `{ width: number; height: number }` | Preferred maximum video resolution. |
| `preferredPeakBitRateForExpensiveNetworks` | `number` | Bandwidth limit for expensive networks (e.g., cellular), in bits per second. |
| `preferredMaximumResolutionForExpensiveNetworks` | `{ width: number; height: number }` | Preferred maximum resolution on expensive networks. |
| `livePlayback.targetOffsetMs` | `number` | Target live offset (ms) the player will try to maintain. |

## DRM

Protected content is supported via a plugin. See the full DRM guide: [DRM](./drm.md).

Quick notes:
- Install and enable the official plugin `@react-native-video/drm` and call `enable()` at app startup before creating players.
- Pass DRM configuration on the source using the `drm` property of `VideoConfig` (see the DRM guide for platform specifics and `getLicense` examples).
- If you defer initialization (`initializeOnCreation: false`), be sure to call `await player.initialize()` (or `preload()`) before expecting DRM license acquisition events.

## Player Lifecycle

Understanding the lifecycle of the `VideoPlayer` is crucial for managing resources effectively and ensuring a smooth user experience.

### Creation and Initialization

1. **Instantiation**: A `VideoPlayer` instance is created by calling its constructor with a video source (URL, `VideoSource`, or `VideoConfig`).
    ```typescript
    const player = new VideoPlayer('https://example.com/video.mp4');
    ```
2. **Native Player Allocation**: A lightweight native player object is allocated immediately.
3. **Asset Initialization**: By default (unless you opt out) the underlying media item is prepared **asynchronously right after creation**. You can control this with `initializeOnCreation` inside `VideoConfig`.

#### Deferred Initialization (Advanced)

If you pass a `VideoConfig` with `{ initializeOnCreation: false }`, the player will skip preparing the media item automatically. This is useful when:

- You need to batch‑create many players without incurring immediate decoding / network cost
- You want to attach event handlers before any network requests happen
- You want explicit control over when buffering begins (e.g. on user interaction)

To initialize later, call:
```ts
await player.initialize();
// or preload if you also want it prepared & ready
await player.preload();
```

#### Initialization Methods Comparison

| Method | When to use | What it does |
|--------|-------------|--------------|
| `initialize()` | You deferred initialization and now want to create the native player item / media source | Creates & attaches the underlying player item / media source without starting playback |
| `preload()` | You want the player item prepared (buffering kicked off) ahead of an upcoming `play()` call | Ensures the media source is set and prepared; resolves once preparation started (may already be initialized) |
| Implicit (default) | `initializeOnCreation` not set or `true` | Automatically schedules initialization after JS construction |

:::info
By default, the player initializes automatically after construction. If you need to defer initialization, set `initializeOnCreation: false` in the config. You can then call `player.initialize()` or `player.preload()` later to start the player.
:::

### Playing a Video

1.  **Loading**: When the player (auto) initializes, `preload()` is called, or after `replaceSourceAsync()`, the player starts loading the video metadata and buffering content.
    -   `onLoadStart`: Fired when the video starts loading.
    -   `onLoad`: Fired when the video metadata is loaded and the player is ready to play (duration, dimensions, etc., are available).
    -   `onBuffer`: Fired when buffering starts or ends.
2.  **Playback**: Once enough data is buffered, playback begins.
    -   `onPlaybackStateChange`: Fired when the playback state changes (e.g., from `buffering` to `playing`).
    -   `onProgress`: Fired periodically with the current playback time.
    -   `onReadyToDisplay`: Fired when the first frame is ready to be displayed.

### Controlling Playback

-   `pause()`: Pauses playback. `status` changes to `paused`.
-   `seekTo(time)`, `seekBy(time)`: Changes the current playback position. `onSeek` is fired when the seek operation completes.
-   `set volume(value)`, `set muted(value)`, `set loop(value)`, `set rate(value)`: Modify player properties. Corresponding events like `onVolumeChange` or `onPlaybackRateChange` might be fired.

### Changing Source

-   `replaceSourceAsync(newSource)`: This method allows you to change the video source dynamically.
    1.  The current native player resources associated with the old source are released (similar to `release()` but specifically for the source).
    2.  A new native player instance (or reconfigured existing one) is prepared for the `newSource`.
    3.  The loading lifecycle events (`onLoadStart`, `onLoad`, etc.) will fire for the new source.
-   `replaceSourceAsync(null)`: This effectively unloads the current video and releases its associated resources without loading a new one. This is useful for freeing up memory if the player is temporarily not needed but might be used again later.

### Releasing Resources

There are two main ways to release resources:

1.  **`replaceSourceAsync(null)`**: This is a less destructive way to free resources related *only* to the current video source.
    -   The `VideoPlayer` instance itself remains usable.
    -   You can later call `replaceSourceAsync(newSource)` to load and play a new video.

2.  **`release()`**: This is a destructive operation.
   
:::danger
After calling `release()`, the player instance becomes unusable. Any subsequent calls to its methods or property access will result in errors.
:::

:::tip
It is recommended to use `replaceSourceAsync(null)` when you want to free resources related to the current video source. You should call `release()` only when you are 100% sure that you don't need the player instance anymore. Anyway garbage collector will release the player instance when it is no longer needed.
:::

### Error Handling

-   The `onError` callback, if provided, will be called when a `VideoRuntimeError` occurs. This allows you to handle issues like network errors, invalid source, or platform-specific playback problems.
-   If `onError` is not provided, errors might be thrown as exceptions.

### Using with Hooks (`useVideoPlayer`)

The `useVideoPlayer` hook simplifies managing the `VideoPlayer` lifecycle within React components.

```typescript
import { useVideoPlayer } from 'react-native-video';

const MyComponent = () => {
  const player = useVideoPlayer('https://example.com/video.mp4', (playerInstance) => {
    // Optional setup function: configure the player instance after creation
    playerInstance.loop = true;
  });

  // ... use player ...

  return <VideoView player={player} />;
};
```

-   **Automatic Creation**: `useVideoPlayer` creates a `VideoPlayer` instance when the component mounts or when the source dependency changes.
-   **Automatic Cleanup**: It automatically cleanup resources when the component unmounts or before recreating the player due to a source change. This prevents resource leaks.
-   **Dependency Management**: If the `source` prop passed to `useVideoPlayer` changes, the hook will clean up the old player instance and create a new one with the new source.

:::tip
Using `useVideoPlayer` is the recommended way to manage `VideoPlayer` instances in functional components to ensure proper lifecycle management and resource cleanup. It will also respect `initializeOnCreation` (defaults to `true`). If you need deferred initialization with the hook:

```tsx
const player = useVideoPlayer({
    source: { uri: 'https://example.com/video.mp4' },
    initializeOnCreation: false,
}, (instance) => {
    // Attach listeners first
    instance.onLoad = () => console.log('Loaded');
});

// Later (e.g. on user tap)
await player.initialize(); // or player.preload()
player.play();
```
:::


================================================
FILE: docs/docs/plugins/_category_.json
================================================
{
  "label": "Plugins",
  "position": 4,
  "collapsed": false
}


================================================
FILE: docs/docs/plugins/ask-for-plugin.md
================================================
---
title: Ask for Plugin
description: Request a custom plugin for your React Native Video application
sidebar_position: 7
---

# Ask for Plugin

Need a custom plugin for your React Native Video application? We can build it for you.

## What We Build

Our team specializes in creating production-ready plugins for `react-native-video`. Whatever video functionality you need - we can build it.

**Examples of plugins we can build:**

- **Analytics integrations** - Connect with any analytics provider (Mux, Conviva, custom solutions)
- **Live streaming features** - Real-time chat overlays, live reactions, viewer counts
- **Interactive video** - Clickable hotspots, branching narratives, shoppable videos
- **Accessibility enhancements** - Audio descriptions, sign language overlays, custom captions styling
- **AI-powered features** - Auto-generated thumbnails, content moderation, speech-to-text
- **Social features** - Watch parties, synchronized playback, clip sharing
- **Custom UI components** - Branded controls, gesture handlers, thumbnail previews on seek

## Why Choose Us?

- **Deep expertise** - We maintain `react-native-video` and know the codebase inside out
- **Production-ready** - Battle-tested code with proper error handling and edge cases covered
- **Native performance** - Plugins implemented in Kotlin/Swift for optimal performance
- **Ongoing support** - We maintain and update plugins as the library evolves

## Our Existing Plugins

We've already built several production-ready plugins:

| Plugin | Description |
|--------|-------------|
| [Offline Video SDK](https://www.thewidlarzgroup.com/offline-video-sdk?utm_source=rnv&utm_medium=docs&utm_campaign=ask-for-plugin&utm_id=offline-video-sdk) | Download and play HLS, MPEG-DASH, MP4 streams offline with DRM support |
| [Background Uploader](https://sdk.thewidlarzgroup.com/background-uploader?utm_source=rnv&utm_medium=docs&utm_campaign=ask-for-plugin&utm_id=background-uploader) | Upload files in the background with retry support and progress tracking |
| [Chapters Plugin](https://sdk.thewidlarzgroup.com/chapters?utm_source=rnv&utm_medium=docs&utm_campaign=ask-for-plugin&utm_id=chapters-plugin) | Chapter markers and navigation on the seekbar |

## Get Started

Ready to discuss your plugin needs?

➡️ [**Request a Plugin**](https://sdk.thewidlarzgroup.com/ask-for-plugin?utm_source=rnv&utm_medium=docs&utm_campaign=ask-for-plugin&utm_id=request-plugin-button)

We'll review your requirements and get back to you with a proposal.


================================================
FILE: docs/docs/plugins/examples.md
================================================
---
title: Plugin Usage Examples
description: Simple examples of implementing common plugin scenarios for React Native Video
sidebar_position: 3
---

# Plugin Usage Examples

This document provides practical examples of implementing common plugin scenarios for React Native Video.

## Basic Plugin Template

```kotlin title="Android"
class MyPlugin : ReactNativeVideoPlugin("MyPlugin") {
    override fun onPlayerCreated(player: WeakReference<NativeVideoPlayer>) {
        Log.d("MyPlugin", "Player created with uri ${player.get()?.source.uri}")
    }
    
    override fun onPlayerDestroyed(player: WeakReference<NativeVideoPlayer>) {
        Log.d("MyPlugin", "Player destroyed")
    }
    
    override fun overrideSource(source: NativeVideoPlayerSource): NativeVideoPlayerSource {
        Log.d("MyPlugin", "Overriding source with uri ${source.uri}")
        return source
    }
}

// Usage
val plugin = MyPlugin() // Automatically registered
```

```swift title="iOS"
class MyPlugin: ReactNativeVideoPlugin {
    init() {
        super.init(name: "MyPlugin")
    }
    
    override func onPlayerCreated(player: Weak<NativeVideoPlayer>) {
        // Custom logic when player is created
    }
    
    override func onPlayerDestroyed(player: Weak<NativeVideoPlayer>) {
        // Custom cleanup when player is destroyed
    }
    
    override func overrideSource(source: NativeVideoPlayerSource) async -> NativeVideoPlayerSource {
        // Modify source if needed
        return source
    }
}

// Usage
let plugin = MyPlugin() // Automatically registered
```

## DRM Plugin

Implement custom DRM handling for protected content.

:::warning

DRM plugins are not supported yet in React Native Video. `getDRMManager` is not implemented yet and will have no effect.

:::

```kotlin title="Android"
class CustomDRMPlugin : ReactNativeVideoPlugin("CustomDRM") {
    override fun getDRMManager(source: NativeVideoPlayerSource): Any? {
        if (source.isDRMProtected() && source.drmType == "custom") {
            return CustomDRMManager(
                licenseUrl = source.drmLicenseUrl,
                certificateUrl = source.drmCertificateUrl,
                keyId = source.drmKeyId
            )
        }
        return null
    }
}
```

```swift title="iOS"
class CustomDRMPlugin: ReactNativeVideoPlugin {
    init() {
        super.init(name: "CustomDRM")
    }
    
    override func getDRMManager(source: NativeVideoPlayerSource) async -> Any? {
        guard source.isDRMProtected() && source.drmType == "custom" else {
            return nil
        }
        
        return CustomDRMManager(
            licenseUrl: source.drmLicenseUrl,
            certificateUrl: source.drmCertificateUrl,
            keyId: source.drmKeyId
        )
    }
}
```

================================================
FILE: docs/docs/plugins/interface.md
================================================
---
title: Plugin Interface
description: Reference for the React Native Video plugin interface
sidebar_position: 2
---

# Plugin Interface Reference

This document provides a complete reference for the `ReactNativeVideoPluginSpec` interface and the base `ReactNativeVideoPlugin` implementation.

## ReactNativeVideoPluginSpec Interface

### Required Properties

#### id: String
Unique identifier for the plugin. Must be unique across all registered plugins.

```kotlin
// Android
override val id: String = "my_unique_plugin_id"
```

```swift
// iOS
var id: String { "my_unique_plugin_id" }
```

#### name: String
Human-readable name for the plugin, used in debug logging.

```kotlin
// Android
override val name: String = "My Custom Plugin"
```

```swift
// iOS
var name: String { "My Custom Plugin" }
```

## Lifecycle Methods

### Player Lifecycle

#### onPlayerCreated
Called when a new player instance is created.

```kotlin
// Android
@UnstableApi
fun onPlayerCreated(player: WeakReference<NativeVideoPlayer>)
```

```swift
// iOS
func onPlayerCreated(player: Weak<NativeVideoPlayer>)
```

**Parameters:**
- `player`: Weak reference to the newly created player instance

**Use Cases:**
- Initialize player-specific resources
- Set up player event listeners
- Configure player settings

#### onPlayerDestroyed
Called when a player instance is being destroyed.

```kotlin
// Android
@UnstableApi
fun onPlayerDestroyed(player: WeakReference<NativeVideoPlayer>)
```

```swift
// iOS
func onPlayerDestroyed(player: Weak<NativeVideoPlayer>)
```

**Parameters:**
- `player`: Weak reference to the player instance being destroyed

**Use Cases:**
- Clean up player-specific resources
- Remove event listeners
- Save state or analytics data

### Video View Lifecycle

#### onVideoViewCreated
Called when a new video view is created.

```kotlin
// Android
@UnstableApi
fun onVideoViewCreated(view: WeakReference<VideoView>)
```

```swift
// iOS
func onVideoViewCreated(view: Weak<VideoComponentView>)
```

**Parameters:**
- `view`: Weak reference to the newly created video view

**Use Cases:**
- Configure view-specific settings
- Set up UI event handlers
- Initialize view overlays

#### onVideoViewDestroyed
Called when a video view is being destroyed.

```kotlin
// Android
@UnstableApi
fun onVideoViewDestroyed(view: WeakReference<VideoView>)
```

```swift
// iOS
func onVideoViewDestroyed(view: Weak<VideoComponentView>)
```

**Parameters:**
- `view`: Weak reference to the video view being destroyed

**Use Cases:**
- Clean up view-specific resources
- Remove UI event handlers
- Save view state

## Content Modification Methods

### overrideSource
Modify the video source before it's processed by the player.

```kotlin
// Android
fun overrideSource(source: NativeVideoPlayerSource): NativeVideoPlayerSource
```

```swift
// iOS
func overrideSource(source: NativeVideoPlayerSource) async -> NativeVideoPlayerSource
```

**Parameters:**
- `source`: The original video source

**Returns:**
- Modified video source (can be the same instance if no changes needed)

**Use Cases:**
- Add authentication headers
- Modify URLs (e.g., CDN switching)
- Add tracking parameters
- Transform source format

### getDRMManager
Provide a custom DRM manager for protected content.

```kotlin
// Android
fun getDRMManager(source: NativeVideoPlayerSource): Any?
```

```swift
// iOS
func getDRMManager(source: NativeVideoPlayerSource) async -> Any?
```

**Parameters:**
- `source`: The video source that may require DRM

**Returns:**
- DRM manager instance, or `null` if this plugin doesn't handle DRM for this source

**Use Cases:**
- Widevine DRM implementation
- FairPlay DRM implementation
- Custom DRM solutions
- License acquisition logic

## Android-Specific Methods

### getMediaDataSourceFactory
Override the data source factory used by ExoPlayer.

```kotlin
fun getMediaDataSourceFactory(
    source: NativeVideoPlayerSource,
    mediaDataSourceFactory: DataSource.Factory
): DataSource.Factory?
```

**Parameters:**
- `source`: The video source
- `mediaDataSourceFactory`: The default data source factory

**Returns:**
- Custom data source factory, or `null` to use the default

**Use Cases:**
- Custom caching strategies
- Network optimization
- Custom authentication
- Analytics data collection

### getMediaSourceFactory
Override the media source factory used by ExoPlayer.

```kotlin
fun getMediaSourceFactory(
    source: NativeVideoPlayerSource,
    mediaSourceFactory: MediaSource.Factory,
    mediaDataSourceFactory: DataSource.Factory
): MediaSource.Factory?
```

**Parameters:**
- `source`: The video source
- `mediaSourceFactory`: The default media source factory
- `mediaDataSourceFactory`: The data source factory

**Returns:**
- Custom media source factory, or `null` to use the default

**Use Cases:**
- Custom media format support
- Advanced ExoPlayer configuration
- Source-specific optimizations

### getMediaItemBuilder
Override the media item builder used by ExoPlayer.

```kotlin
fun getMediaItemBuilder(
    source: NativeVideoPlayerSource,
    mediaItemBuilder: MediaItem.Builder
): MediaItem.Builder?
```

**Parameters:**
- `source`: The video source
- `mediaItemBuilder`: The default media item builder

**Returns:**
- Modified media item builder, or `null` to use the default

**Use Cases:**
- Add custom metadata
- Configure subtitles
- Set playback preferences
- Configure DRM settings

### shouldDisableCache
Control whether caching should be disabled for a source.

```kotlin
fun shouldDisableCache(source: NativeVideoPlayerSource): Boolean
```

**Parameters:**
- `source`: The video source

**Returns:**
- `true` to disable caching, `false` to allow caching

**Use Cases:**
- Disable caching for live streams
- Disable caching for DRM content
- Custom caching policies

## Base Implementation: ReactNativeVideoPlugin

The base class provides default implementations for all methods:

### Automatic Registration
```kotlin
// Android
init {
    PluginsRegistry.shared.register(this)
}
```

```swift
// iOS
public init(name: String) {
    self.name = name
    self.id = "RNV_Plugin_\(name)"
    PluginsRegistry.shared.register(plugin: self)
}
```

### Automatic Cleanup (iOS only)
```swift
deinit {
    PluginsRegistry.shared.unregister(plugin: self)
}
```

### Default Implementations

All methods have sensible defaults:
- Lifecycle methods: No-op implementations
- `overrideSource`: Returns the original source unchanged
- `getDRMManager`: Returns `null`
- Factory methods (Android): Return `null` (use defaults)
- `shouldDisableCache`: Returns `false`

## Method Calling Order

### Source Processing Flow
1. `overrideSource` - Called for each registered plugin in order
2. `getDRMManager` - Called for each plugin until one returns non-null
3. Factory methods (Android) - Called for each plugin until one returns non-null

### Lifecycle Flow
1. View/Player creation methods called for all plugins
2. Source processing happens during playback
3. View/Player destruction methods called for all plugins

## Error Handling

### DRM Plugin Not Found
If no plugin provides a DRM manager when required:

```kotlin
// Android
throw LibraryError.DRMPluginNotFound
```

```swift
// iOS
throw LibraryError.DRMPluginNotFound.error()
```

### Best Practices
- Return `null` from optional methods when not providing custom behavior
- Handle weak reference nullability properly
- Use appropriate error handling in async methods (iOS)
- Log meaningful debug information

## Platform Differences Summary

| Feature | Android | iOS |
|---------|---------|-----|
| Async Support | No | Yes (async/await) |
| Media Factories | Full ExoPlayer support | Limited AVFoundation |
| Cache Control | Yes | No |
| Auto Cleanup | Manual | Automatic (deinit) |
| Weak References | `WeakReference<T>` | `Weak<T>` |

================================================
FILE: docs/docs/plugins/plugins.mdx
================================================
---
title: Plugins  
description: Overview of the React Native Video plugin system
sidebar_position: 6
---

# Plugins Overview

The **React Native Video** library offers a robust plugin system to extend and customize video functionality on Android and iOS. With plugins, you can override source handling, implement custom DRM, modify media factories, and respond to player lifecycle events.

:::tip Use in Third Party Library Guide
If you are looking how to import React Native Video in your native code to use plugins, you can checkout [Use in Third Party Library](./use-in-third-party-library) page.
:::

## What Are Plugins?

Plugins are modular extensions that hook into the video player's lifecycle and processing pipeline. They allow you to:

-  **Customize video sources** before playback
-  **Implement custom DRM** for protected content
-  **Override media factories** (Android only)
-  **React to player lifecycle events** for analytics, logging, or cleanup
-  **Control caching behavior** for performance

## Architecture

The plugin system consists of three main components:

| Component                    | Description                                                                                 |
|:-----------------------------|:-------------------------------------------------------------------------------------------|
| `PluginsRegistry`            | Singleton that manages plugin registration and coordinates plugin interactions              |
| `ReactNativeVideoPluginSpec` | Interface/protocol defining the contract all plugins must implement                        |
| `ReactNativeVideoPlugin`     | Base implementation with convenient defaults; override only the methods you care about     |

:::tip
Plugins are automatically registered when you instantiate a class that extends `ReactNativeVideoPlugin`.  
:::

## Core Concepts

### Plugin Lifecycle

Plugins receive notifications for key events:

-  **Player creation/destruction** - react to player instance lifecycle
-  **Video view creation/destruction** - handle UI component lifecycle
-  **Source processing** - modify video sources before playback
-  **DRM requests** - provide custom DRM handling
-  **Media factory overrides** - customize ExoPlayer components (Android)

:::caution
All player and view references passed to plugins are **weak references** to prevent memory leaks.
:::

## Platform Differences

| Feature                        | Android (Kotlin / ExoPlayer)                   | iOS (Swift / AVFoundation)         |
|:-------------------------------|:-----------------------------------------------|:-----------------------------------|
| Underlying player              | ExoPlayer                                      | AVFoundation                       |
| Media factory customization    | Extensive                                      | Limited                            |
| Cache control                  | Supported                                      | Limited                            |
| Plugin method style            | Synchronous                                    | Async/await                        |
| Memory management              | Manual cleanup                                 | Manual cleanup                     |

## Getting Started

### Example: Android Plugin

```kotlin
// Android
class MyPlugin : ReactNativeVideoPlugin("MyPluginName") {
    override fun onPlayerCreated(player: WeakReference<NativeVideoPlayer>) {
        // Custom logic here
    }
}
```

### Example: iOS Plugin

```swift
// iOS
class MyPlugin: ReactNativeVideoPlugin {
    init() {
        super.init(name: "MyPluginName")
    }

    override func onPlayerCreated(player: Weak<NativeVideoPlayer>) {
        // Custom logic here
    }
}
```



## Next Steps

-  [**Plugin Registry**](./registry) - Learn about plugin management and registration
-  [**Plugin Interface**](./interface) - Complete API reference for plugin methods
-  [**Usage Examples**](./examples) - Practical implementations and common patterns
-  [**Ask for Plugin**](./ask-for-plugin) - Request a custom plugin built by our team





================================================
FILE: docs/docs/plugins/registry.md
================================================
---
title: Plugin Registry  
description: Overview of the React Native Video plugin registry and how to use it
sidebar_position: 1
---

# Plugin Registry

The `PluginsRegistry` is a singleton that manages all plugin instances and coordinates their interactions with the video player system. It handles registration, unregistration, and notification distribution to all active plugins.

## Singleton Pattern

Both Android and iOS use a shared singleton:

```kotlin title="Android"
// Register
PluginsRegistry.shared.register(plugin)
// Unregister
PluginsRegistry.shared.unregister(plugin)
```

```swift title="iOS"
// Register
PluginsRegistry.shared.register(plugin: plugin)
// Unregister
PluginsRegistry.shared.unregister(plugin: plugin)
```

:::tip Plugin Ordering
Plugins are processed in registration order. Later plugins can override earlier ones.
:::

## Registration Methods

### Automatic Registration

You can use the base class `ReactNativeVideoPlugin` to automatically register your plugin. This will also mock all the methods that are not implemented in your plugin. 

:::danger
You still need to unregister your plugin manually when you are done with it. Otherwise, you will have a memory leak.
:::

```kotlin title="Android"
class MyPlugin : ReactNativeVideoPlugin("MyPlugin") {
    // ...
}
val plugin = MyPlugin() // Auto-registered
```

```swift title="iOS"
class MyPlugin: ReactNativeVideoPlugin {
    init() {
        super.init(name: "MyPlugin")
    }
    // Auto-unregistered in deinit
}
let plugin = MyPlugin() // Auto-registered
```

### Manual Registration

You can also manually register your plugin. This is useful if you want to implement a plugin that is not a subclass of `ReactNativeVideoPlugin`.
You will need to implement the `ReactNativeVideoPluginSpec` interface. This is a protocol that defines the methods and properties that a plugin must implement.

```kotlin title="Android"
class MyCustomPlugin : ReactNativeVideoPluginSpec {
    override val id = "my_custom_id"
    override val name = "MyCustomPlugin"
    // ...
}
val plugin = MyCustomPlugin()
PluginsRegistry.shared.register(plugin)
```

```swift title="iOS"
class MyCustomPlugin: ReactNativeVideoPluginSpec {
    let id = "my_custom_id"
    let name = "MyCustomPlugin"
    // ...
}
let plugin = MyCustomPlugin()
PluginsRegistry.shared.register(plugin: plugin)
```

## Plugin ID Generation

When using the base class, IDs are auto-generated:

```kotlin title="Android"
ID Format: "RNV_Plugin_{name}"
Example: "RNV_Plugin_MyCustomDRM"
```

```swift title="iOS"
ID Format: "RNV_Plugin_{name}"
Example: "RNV_Plugin_MyCustomDRM"
```

## Plugin Internals

Bellow are the internals of the plugin registry, that shows logic for certain methods.

### Source Processing

The registry coordinates source modifications:

```kotlin title="Android"
internal fun overrideSource(source: NativeVideoPlayerSource): NativeVideoPlayerSource {
    var overriddenSource = source
    for (plugin in plugins.values) {
        overriddenSource = plugin.overrideSource(overriddenSource)
    }
    return overriddenSource
}
```

```swift title="iOS"
internal func overrideSource(source: NativeVideoPlayerSource) async -> NativeVideoPlayerSource {
    var overriddenSource = source
    for plugin in plugins.values {
        overriddenSource = await plugin.overrideSource(source: source)
    }
    return overriddenSource
}
```

### DRM Manager Resolution

Finds the first plugin that can provide a DRM manager:

```kotlin title="Android"
internal fun getDRMManager(source: NativeVideoPlayerSource): Any {
    for (plugin in plugins.values) {
        val manager = plugin.getDRMManager(source)
        if (manager != null) return manager
    }
    throw LibraryError.DRMPluginNotFound
}
```

```swift title="iOS"
internal func getDrmManager(source: NativeVideoPlayerSource) async throws -> Any? {
    for plugin in plugins.values {
        if let drmManager = await plugin.getDRMManager(source: source) {
            return drmManager
        }
    }
    throw LibraryError.DRMPluginNotFound.error()
}
```

## Android-Specific Registry Methods

| Method Name                       | Purpose                                                   |
|:----------------------------------|:----------------------------------------------------------|
| `overrideMediaDataSourceFactory`  | Override data source factory for custom ExoPlayer sources  |
| `overrideMediaSourceFactory`      | Override media source factory                             |
| `overrideMediaItemBuilder`        | Customize the media item builder                          |
| `shouldDisableCache`              | Control caching behavior                                  |

Example signatures:

```kotlin
internal fun overrideMediaDataSourceFactory(
    source: NativeVideoPlayerSource,
    mediaDataSourceFactory: DataSource.Factory
): DataSource.Factory

internal fun overrideMediaSourceFactory(
    source: NativeVideoPlayerSource,
    mediaSourceFactory: MediaSource.Factory,
    mediaDataSourceFactory: DataSource.Factory
): MediaSource.Factory

internal fun overrideMediaItemBuilder(
    source: NativeVideoPlayerSource,
    mediaItemBuilder: MediaItem.Builder
): MediaItem.Builder

internal fun shouldDisableCache(source: NativeVideoPlayerSource): Boolean
```

## Best Practices

-  **Memory management**: Registry holds strong references to plugins; plugins get weak references to players/views.
-  **Unregister plugins**: Use unregistration to prevent memory leaks.
-  **Performance**: Minimize work in notification handlers. Cache expensive operations. Be mindful of plugin order.

:::tip Need a Custom Plugin?
If you need functionality that the library doesn't currently offer, we can build it for you. Check out [Ask for Plugin](./ask-for-plugin.md) to request a custom plugin built by our team.
:::



================================================
FILE: docs/docs/plugins/use-in-third-party-library.md
================================================
---
title: Use in Third Party Library
description: How to use React Native Video in a third party library
sidebar_position: 4
---

# Use in Third Party Library

You can use React Native Video in your third party library either as a dependency if you want to have specific version of the library or as a peer dependency if you want to version selection to be handled by the consumer of the library.

## In JS

Add `react-native-video` as a dependency or peer dependency.

```json title="package.json"
{
  "dependencies": {
    "react-native-video": "latest"
  }
  // OR
  "peerDependencies": {
    "react-native-video": "*"
  }
}
```

And then you can import it in your code.

```ts
import { VideoPlayer } from 'react-native-video';

const player = new VideoPlayer({ uri: 'https://www.example.com/video.mp4' });

player.play();
```

## In Native

### iOS
Add `ReactNativeVideo` as a dependency in your `*.podspec` file.

```ruby title="*.podspec"
Pod::Spec.new do |s|
  // ...

  s.dependency 'ReactNativeVideo'
end
```

### Android

Add `:react-native-video` and `:react-native-nitro-modules` as a dependency in your `build.gradle` file. Also you will need to add `androidx.media3` dependencies. to use player and source in your library.

```groovy title="build.gradle"
// ...

dependencies {
  // ...

  implementation project(':react-native-video')
  implementation project(':react-native-nitro-modules')

  implementation "androidx.media3:media3-common:1.4.1"
  implementation "androidx.media3:media3-exoplayer:1.4.1"
}
```



================================================
FILE: docs/docs/projects.md
================================================
---
title: Useful Projects
description: React Native Video Useful Projects
sidebar_class_name: hidden
---
# Useful Projects

This page lists open-source projects that can be helpful for your player implementation. <br/>
If you have a project that could benefit other users, feel free to open a PR to add it here.

## Our (TheWidlarzGroup) Libraries
- [react-native-video-player](https://github.com/TheWidlarzGroup/react-native-video-player): Our video player UI library.
- [Offline Video SDK](https://www.thewidlarzgroup.com/offline-video-sdk?utm_source=rnv&utm_medium=docs&utm_campaign=projects&utm_id=offline-video-sdk): If you're building an app that needs **offline playback** (e.g., downloading HLS videos, subtitles, audio tracks, or DRM-protected content), check out our commercial Offline Video SDK. It integrates with `react-native-video` and is available with a [free trial](https://sdk.thewidlarzgroup.com/signup?utm_source=rnv&utm_medium=docs&utm_campaign=projects&utm_id=start-trial-offline-video-sdk). To get started quickly, you can clone our [Offline Video Starter Project](https://github.com/TheWidlarzGroup/react-native-offline-video-starter?utm_source=rnv&utm_medium=docs&utm_campaign=projects&utm_id=offline-video-starter), which includes a ready-to-run example app demonstrating offline playback, multi-audio, subtitles, and DRM setup.

## Community Libraries
- [react-native-corner-video](https://github.com/Lg0gs/react-native-corner-video): A floating video player.
- [react-native-track-player](https://github.com/doublesymmetry/react-native-track-player): A toolbox for audio playback.
- [react-native-video-controls](https://github.com/itsnubix/react-native-video-controls): A video player UI.
- [react-native-media-console](https://github.com/criszz77/react-native-media-console): An updated version of react-native-video-controls, rewritten in TypeScript.


================================================
FILE: docs/docs/updating.md
================================================
---
title: Updating
description: React Native Video Updating Guide
sidebar_class_name: hidden
---

## Upgrading from react-native-video v6 to v7

Version 7 of `react-native-video` introduces a significant architectural shift, separating the video player logic from the UI rendering. This change unlocks new capabilities like video preloading and a more intuitive, hook-based API. This guide will walk you through the necessary steps to migrate your application from v6 to v7.

### Key Changes in v7

The most substantial change in v7 is the move from a monolithic `<Video>` component to a more modular approach with two distinct components:

*   **`VideoPlayer`**: A new class that manages the player's state and playback logic. It is not a UI component.
*   **`VideoView`**: A UI component responsible for rendering the video on the screen. It takes a `VideoPlayer` instance as a prop.
*   **`useVideoPlayer` hook**: The recommended way to create and manage the lifecycle of a `VideoPlayer` instance within a functional component. It automatically handles the creation and cleanup of the player.

### New Dependency
`react-native-video` v7 is now built on top of [`react-native-nitro-modules`](https://nitro.margelo.com/docs/what-is-nitro) framework. This means that you need to install the Nitro framework to use `react-native-video` v7.

### Step-by-Step Migration Guide

#### 1. Installation

First, update the `react-native-video` package to the latest v7 release:

```bash
npm install react-native-video@next --save
```

Then, install the pods for iOS:

```bash
cd ios && pod install
```

#### 2. Updating Your Component

The core of the migration involves replacing the `<Video>` component with the new `useVideoPlayer` hook and `<VideoView>` component.

**v6 Implementation:**

```jsx
import React, { useRef } from 'react';
import Video from 'react-native-video';

const VideoPlayerV6 = () => {
  const videoRef = useRef(null);

  return (
    <Video
      source={{ uri: 'https://www.w3schools.com/html/mov_bbb.mp4' }}
      ref={videoRef}
      style={{ width: 300, height: 200 }}
      controls={true}
      onLoad={() => console.log('Video loaded')}
      onProgress={(data) => console.log('Progress:', data.currentTime)}
    />
  );
};
```

**v7 Implementation:**

```jsx
import React from 'react';
import { useVideoPlayer, VideoView, useEvent } from 'react-native-video';

const VideoPlayerV7 = () => {
  const player = useVideoPlayer({
    source: {
      uri: 'https://www.w3schools.com/html/mov_bbb.mp4',
    },
  });

  useEvent(player, 'onLoad', () => {
    console.log('Video loaded');
  });

  useEvent(player, 'onProgress', (data) => {
    console.log('Progress:', data.currentTime);
  });

  return (
    <VideoView
      player={player}
      style={{ width: 300, height: 200 }}
      controls={true}
    />
  );
};
```

### Prop and Method Migration

Many props and methods from the v6 `<Video>` component have been moved to the `VideoPlayer` instance in v7.

#### Common Props

| v6 Prop (`<Video>`) | v7 Equivalent (`VideoPlayer` properties) | Notes |
| :--- | :--- | :--- |
| `source` | `source` property in `useVideoPlayer` config | The structure of the source object remains largely the same. |
| `paused` | `paused` property on the `VideoPlayer` instance | Can be controlled via `player.pause()` and `player.play()`. |
| `muted` | `muted` property on the `VideoPlayer` instance | `player.muted = true/false;` |
| `volume` | `volume` property on the `VideoPlayer` instance | `player.volume = 0.5;` |
| `rate` | `rate` property on the `VideoPlayer` instance | `player.rate = 1.5;` |
| `loop` | `loop` property on the `VideoPlayer` instance | `player.loop = true;` |
| `resizeMode` | `resizeMode` prop on `<VideoView>` | This remains a prop on the UI component. |
| `controls` | `controls` prop on `<VideoView>` | This also remains on the UI component. |

see [VideoPlayer](./player/player.md) for more details.

#### Methods

Imperative methods previously called on the `<Video>` component's ref are now methods on the `VideoPlayer` instance.

| v6 Method (`videoRef.current`) | v7 Equivalent (`player`) |
| :--- | :--- |
| `seek(time)` | `player.seekTo(time)` |
| `presentFullscreenPlayer()` | `videoViewRef.current.enterFullscreen()` | Fullscreen is now managed by the `VideoView` ref. |
| `dismissFullscreenPlayer()` | `videoViewRef.current.exitFullscreen()` | |
| `pause()` | `player.pause()` | |
| `resume()` | `player.play()` | |

see [VideoPlayer](./player/player.md) for more details.

### Event Handling

In v7, event handling is standardized through the `useEvent` hook or by directly assigning callbacks to the `VideoPlayer` instance. The `useEvent` hook is recommended as it automatically handles listener cleanup.

**v6 Event Handling:**

```jsx
<Video
  onLoad={(data) => console.log(data)}
  onProgress={(data) => console.log(data.currentTime)}
  onError={(error) => console.error(error)}
/>
```

**v7 Event Handling with `useEvent`:**

```jsx
import { useVideoPlayer, VideoView, useEvent } from 'react-native-video';

const MyPlayer = () => {
  const player = useVideoPlayer({ source: { uri: '...' } });

  useEvent(player, 'onLoad', (data) => console.log(data));
  useEvent(player, 'onProgress', (data) => console.log(data.currentTime));
  useEvent(player, 'onError', (error) => console.error(error.code, error.message));

  return <VideoView player={player} />;
}
```

**Directly assigning callbacks in v7:**

```jsx
const player = useVideoPlayer('https://example.com/video.mp4', (_player) => {
  _player.onLoad = (data) => {
    console.log('Video loaded! Duration:', data.duration);
  };
  _player.onError = (error) => {
    console.error('Player Error:', error.code, error.message);
  };
});
```

### Benefits of the New Architecture

*   **Preloading**: You can create a `VideoPlayer` instance and begin loading a video before it's visible in the UI. When you're ready to display it, simply pass the player instance to a `<VideoView>`.
*   **Improved Performance**: Separating the player logic from the UI rendering can lead to better performance and a more responsive application.
*   **Cleaner API**: The hook-based API simplifies player management and reduces boilerplate code, especially for handling the player's lifecycle.
*   **Full New Architecture Support**: Version 7 fully embraces React Native's New Architecture, ensuring better performance and consistency.

================================================
FILE: docs/docs/video-view/_category_.json
================================================
{
  "label": "video-view",
  "position": 3,
  "collapsed": false
}


================================================
FILE: docs/docs/video-view/chapters.md
================================================
---
sidebar_position: 5
sidebar_label: Chapters
description: VideoView chapters support
customProps:
  plan: pro
---

# Chapters

The `VideoView` component supports video chapters, allowing users to navigate through different segments of a video. Chapters appear as visual markers on the seekbar and can be used to jump to specific points in the video.

<video controls width="50%">
  <source src="/react-native-video/videos/chapters.mp4" type="video/mp4" />
  Your browser does not support the video tag.
</video>

## Installation

To use chapters functionality, you need to install the `@react-native-video/chapters` package:

```bash
npm install @react-native-video/chapters
```

## Getting Started

First, enable the chapters functionality by calling `enable()`:

```tsx
import { enable } from '@react-native-video/chapters';

enable();
```

## API

### `enable()`

Enables the chapters functionality. Must be called before using other chapter methods.

### `setChapters(chapters, options?)`

Sets the chapters for the video player.

**Parameters:**
- `chapters`: Array of chapter objects with the following structure:
  ```tsx
  {
    title: string;  // Chapter title
    timeMs: number; // Chapter time in milliseconds
  }[]
  ```
- `options` (optional): Configuration object
  - `markersColor?: string` - Color of the chapter markers (default: platform default)
  - `showTooltip?: boolean` - Whether to show tooltip when hovering over markers (default: `true`)
  - `showTimer?: boolean` - Whether to show timer on markers (default: `true`)

**Example:**
```tsx
import { setChapters } from '@react-native-video/chapters';

const chapters = [
  { title: "Introduction", timeMs: 0 },
  { title: "Main Content", timeMs: 30000 }, // 30 seconds
  { title: "Conclusion", timeMs: 120000 },  // 2 minutes
];

setChapters(chapters, {
  markersColor: "#FF6B35",
  showTooltip: true,
  showTimer: true,
});
```

### `clearChapters()`

Removes all chapters from the video player.

```tsx
import { clearChapters } from '@react-native-video/chapters';

clearChapters();
```

### `goToChapter(title)`

Programmatically navigates to a specific chapter by its title.

**Parameters:**
- `title`: The title of the chapter to navigate to

```tsx
import { goToChapter } from '@react-native-video/chapters';

goToChapter("Main Content");
```

## Platform Differences

- **iOS**: Custom seekbar with visual markers and tooltip
- **Android**: Visual markers on seekbar with tooltip


================================================
FILE: docs/docs/video-view/events.md
================================================
---
sidebar_position: 3
sidebar_label: Events
description: VideoView event callbacks
---

# Events

`VideoView` also accepts several event callback props related to UI state changes:

| Event | Type | Description |
|-------|------|-------------|
| `onPictureInPictureChange?` | `(event: { isActive: boolean }) => void` | Fired when the picture-in-picture mode starts or stops. |
| `onFullscreenChange?` | `(event: { isFullscreen: boolean }) => void` | Fired when the fullscreen mode starts or stops. |
| `willEnterFullscreen?` | `() => void` | Fired just before the view enters fullscreen mode. |
| `willExitFullscreen?` | `() => void` | Fired just before the view exits fullscreen mode. |
| `willEnterPictureInPicture?` | `() => void` | Fired just before the view enters picture-in-picture mode. |
| `willExitPictureInPicture?` | `() => void` | Fired just before the view exits picture-in-picture mode. |

These can be used to update your component's state or UI in response to these changes.

```tsx
<VideoView
  player={player}
  onFullscreenChange={({ isFullscreen }) => {
    console.log(isFullscreen ? 'Entered fullscreen' : 'Exited fullscreen');
  }}
  onPictureInPictureChange={({ isActive }) => {
    console.log(isActive ? 'PiP active' : 'PiP inactive');
  }}
/>
```


================================================
FILE: docs/docs/video-view/methods.md
================================================
---
sidebar_position: 4
sidebar_label: Methods
description: VideoView imperative methods
---

# Refs and Imperative Methods

You can obtain a ref to the `VideoView` component to call imperative methods:

```tsx
const videoViewRef = React.useRef<VideoViewRef>(null);

// ...

<VideoView ref={videoViewRef} player={player} />

// Later, you can call methods like:
videoViewRef.current?.enterFullscreen();
```

Available methods on the `VideoViewRef`:

| Method | Type | Description |
|--------|------|-------------|
| `enterFullscreen()` | `() => void` | Programmatically requests the video view to enter fullscreen mode. |
| `exitFullscreen()` | `() => void` | Programmatically requests the video view to exit fullscreen mode. |
| `enterPictureInPicture()` | `() => void` | Programmatically requests the video view to enter picture-in-picture mode. |
| `exitPictureInPicture()` | `() => void` | Programmatically requests the video view to exit picture-in-picture mode. |
| `canEnterPictureInPicture()` | `() => boolean` | Checks if picture-in-picture mode is currently available and supported. Returns `true` if PiP can be entered, `false` otherwise. |


================================================
FILE: docs/docs/video-view/props.md
================================================
---
sidebar_position: 2
sidebar_label: Props
description: VideoView component properties
---

# Props

| Prop | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `player` | `VideoPlayer` | Yes | - | The `VideoPlayer` instance that manages the video to be displayed. |
| `style` | `ViewStyle` | No | - | Standard React Native styles to control the layout and appearance of the `VideoView`. |
| `controls` | `boolean` | No | `false` | Whether to show the native video playback controls (play/pause, seek bar, volume, etc.). |
| `pictureInPicture` | `boolean` | No | `false` | Whether to enable and show the picture-in-picture (PiP) button in the native controls (if supported by the platform and controls are visible). |
| `autoEnterPictureInPicture` | `boolean` | No | `false` | Whether the video should automatically enter PiP mode when it starts playing and the app is backgrounded (behavior might vary by platform). |
| `resizeMode` | `'contain' \| 'cover' \| 'stretch' \| 'none'` | No | `'none'` | How the video should be resized to fit the view. |
| `keepScreenAwake` | `boolean` | No | `true` | Whether to keep the device screen awake while the video view is mounted. |
| `surfaceType` | `'surface' \| 'texture'` | No (Android only) | `'surface'` | (Android) Underlying native view type. `'surface'` uses a SurfaceView (better performance, no transforms/overlap), `'texture'` uses a TextureView (supports animations, transforms, overlapping UI) at a small performance cost. Ignored on iOS. |

## Android: Choosing a surface type

:::info Android Only
This section applies only to Android. The `surfaceType` prop is ignored on iOS.
:::

On Android the default rendering path uses a `SurfaceView` (set via `surfaceType="surface"`) for optimal decoding performance and lower latency. However `SurfaceView` lives in a separate window and can't be:

- Animated with transforms (scale, rotate, opacity fade)
- Clipped by parent views (rounded corners, masks)
- Overlapped reliably with sibling views (z-order issues)

If you need those UI effects, switch to `TextureView`:

```tsx
<VideoView
  player={player}
  surfaceType="texture"
  style={{ width: 300, height: 170, borderRadius: 16, overflow: 'hidden' }}
  resizeMode="cover"
  controls
/>
```

Use `TextureView` only when required, as it can be slightly less performant and may increase power consumption on some devices.


================================================
FILE: docs/docs/video-view/video-view.md
================================================
---
sidebar_position: 1
sidebar_label: Introduction
description: Introduction to VideoView component
---

# VideoView Component

The `VideoView` component is responsible for rendering the video content managed by a `VideoPlayer` instance onto the screen. It also provides UI functionalities like native controls, fullscreen, and picture-in-picture mode.

## Basic Usage

To use `VideoView`, you need to pass a `VideoPlayer` instance to its `player` prop.

```tsx
import React from 'react';
import { VideoPlayer, VideoView } from 'react-native-video';
import { StyleSheet } from 'react-native';

const App = () => {
  const player = useVideoPlayer('https://example.com/video.mp4', (_player) => {
    // This is optional setup function that will be called when the player is created.
    _player.play();
  });

  return (
    <VideoView
      style={styles.video}
      player={player}
      controls={true}
    />
  );
};

const styles = StyleSheet.create({
  video: {
    width: '100%',
    height: 200,
  },
});

export default App;
```


================================================
FILE: docs/docusaurus.config.ts
================================================
import type * as Preset from '@docusaurus/preset-classic';
import type { Config } from '@docusaurus/types';
import { createSidebarWithCustomProps } from '@widlarzgroup/docusaurus-ui';
import { themes as prismThemes } from 'prism-react-renderer';

// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)

const config: Config = {
  title: 'React Native Video',
  tagline: 'React Native Video - Video player for React Native',
  favicon: 'img/favicon.ico',

  url: 'https://docs.thewidlarzgroup.com',
  baseUrl: '/react-native-video',

  organizationName: 'TheWidlarzGroup',
  projectName: 'react-native-video',

  onBrokenLinks: 'throw',
  onBrokenMarkdownLinks: 'warn',

  future: {
    experimental_faster: true,
    v4: true,
  },

  i18n: {
    defaultLocale: 'en',
    locales: ['en'],
  },

  presets: [
    [
      'classic',
      {
        docs: {
          sidebarPath: './sidebars.ts',
          lastVersion: '6.x',
          includeCurrentVersion: true,
          versions: {
            'current': {
              label: 'v7 Beta',
              path: 'v7',
              banner: 'none',
            },
            '6.x': {
              label: 'v6',
              path: 'v6',
            },
          },
          sidebarItemsGenerator: createSidebarWithCustomProps,
        },
        theme: {
          customCss: './src/css/custom.css',
        },
      } satisfies Preset.Options,
    ],
  ],

  headTags: [
    {
      tagName: 'link',
      attributes: {
        rel: 'preconnect',
        href: 'https://fonts.googleapis.com',
      },
    },
    {
      tagName: 'link',
      attributes: {
        rel: 'preconnect',
        href: 'https://fonts.gstatic.com',
      },
    },
    {
      tagName: 'link',
      attributes: {
        rel: 'stylesheet',
        href: 'https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap',
      },
    },
  ],

  themes: ['@widlarzgroup/docusaurus-ui'],

  themeConfig: {
    image: 'img/twg-social-card.png',
    navbar: {
      title: 'React Native Video',
      logo: {
        alt: 'TheWidlarzGroup Logo',
        style: {
          width: '60px',
          height: '40px',
          marginRight: '10px',
          transform: 'translateY(-4px)',
        },
        src: 'img/twg-logo.png',
      },
      items: [
        {
          type: 'docSidebar',
          sidebarId: 'docsSidebar',
          position: 'left',
          label: 'Documentation',
        },
        {
          type: 'docsVersionDropdown',
          versions: {
            'current': { label: 'v7 Beta' },
            '6.x': { label: 'v6' },
          },
          position: 'right',
        },
        {
          href: 'https://github.com/TheWidlarzGroup/react-native-video',
          label: 'GitHub',
          position: 'right',
        },
        {
          href: 'https://www.thewidlarzgroup.com/react-native-video?utm_source=rnv&utm_medium=docs&utm_campaign=navbar&utm_id=offer-button',
          label: 'Offer',
          position: 'right',
        },
        {
          type: 'search',
          position: 'right',
        },
      ],
    },
    docs: {
      sidebar: {
        hideable: false,
      },
      versionPersistence: 'localStorage',
    },
    footer: {
      style: 'light',
      copyright: `Built With ❤️ By TheWidlarzGroup & React Native Video Community`,
    },
    colorMode: {
      defaultMode: 'dark',
      disableSwitch: true,
      respectPrefersColorScheme: false,
    },
    prism: {
      theme: prismThemes.oneLight,
      darkTheme: prismThemes.oneDark,
    },
  } satisfies Preset.ThemeConfig,

  plugins: [
    require.resolve('docusaurus-lunr-search'),
    [
      'docusaurus-plugin-typedoc',
      {
        name: 'API Reference',
        entryPoints: ['../packages/react-native-video/src'],
        exclude: '../packages/react-native-video/src/index.ts',
        tsconfig: '../packages/react-native-video/tsconfig.json',
        out: './docs/api-reference',
        watch: process.env.TYPEDOC_WATCH,
        excludePrivate: true,
        excludeProtected: true,
        excludeExternals: true,
        excludeInternal: true,
        readme: 'none',
        sidebar: {
          autoConfiguration: false,
        },
        parametersFormat: 'table',
        enumMembersFormat: 'table',
        useCodeBlocks: true,
      },
    ],
    // LLMs txt generation for v6
    [
      'docusaurus-plugin-llms',
      {
        id: 'llms-v6',
        generateLLMsTxt: false,
        generateLLMsFullTxt: false,
        docsDir: 'versioned_docs/version-6.x',
        pathTransformation: {
          ignorePaths: ['docs'],
          addPaths: ['react-native-video/docs/v6'],
        },
        version: '6.x.x',
        customLLMFiles: [
          {
            filename: 'llms-v6.txt',
            title: 'React Native Video v6 Documentation',
            description: 'Complete documentation for React Native Video v6',
            includePatterns: ['**/*.md', '**/*.mdx'],
            fullContent: false,
          },
          {
            filename: 'llms-v6-full.txt',
            title: 'React Native Video v6 Documentation',
            description: 'Complete documentation for React Native Video v6',
            includePatterns: ['**/*.md', '**/*.mdx'],
            fullContent: true,
          },
        ],
      },
    ],
    // LLMs txt generation for v7
    [
      'docusaurus-plugin-llms',
      {
        id: 'llms-v7',
        generateLLMsTxt: false,
        generateLLMsFullTxt: false,
        docsDir: 'docs',
        pathTransformation: {
          ignorePaths: ['docs'],
          addPaths: ['react-native-video/docs/v7'],
        },
        version: '7.x.x',
        customLLMFiles: [
          {
            filename: 'llms-v7.txt',
            title: 'React Native Video v7 Documentation',
            description: 'Complete documentation for React Native Video v7',
            includePatterns: ['docs/**/*.md'],
            fullContent: false,
          },
          {
            filename: 'llms-v7-full.txt',
            title: 'React Native Video v7 Documentation',
            description: 'Complete documentation for React Native Video v7',
            includePatterns: ['docs/**/*.md'],
            fullContent: true,
          },
        ],
      },
    ],
  ],
};

export default config;


================================================
FILE: docs/package.json
================================================
{
  "name": "@react-native-video/docs",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "docusaurus": "docusaurus",
    "start": "TYPEDOC_WATCH=true docusaurus start",
    "build": "docusaurus build",
    "swizzle": "docusaurus swizzle",
    "deploy": "docusaurus deploy",
    "clear": "docusaurus clear",
    "serve": "docusaurus serve",
    "write-translations": "docusaurus write-translations",
    "write-heading-ids": "docusaurus write-heading-ids",
    "typecheck": "tsc",
    "lint": "eslint ."
  },
  "dependencies": {
    "@docusaurus/core": "^3.8.1",
    "@docusaurus/faster": "^3.8.1",
    "@docusaurus/preset-classic": "^3.8.1",
    "@mdx-js/react": "^3.0.0",
    "@widlarzgroup/docusaurus-ui": "^0.1.3",
    "clsx": "^2.0.0",
    "docusaurus-lunr-search": "^3.6.0",
    "motion": "^12.23.26",
    "prism-react-renderer": "^2.3.0",
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
  },
  "devDependencies": {
    "@docusaurus/module-type-aliases": "^3.8.1",
    "@docusaurus/tsconfig": "^3.8.1",
    "@docusaurus/types": "^3.8.1",
    "@widlarzgroup/eslint-plugin-docusaurus": "^0.0.1",
    "docusaurus-plugin-llms": "^0.1.5",
    "docusaurus-plugin-typedoc": "^1.4.0",
    "eslint": "^8.51.0",
    "typescript": "^5.2.2"
  },
  "browserslist": {
    "production": [
      ">0.5%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 3 chrome version",
      "last 3 firefox version",
      "last 5 safari version"
    ]
  },
  "engines": {
    "node": ">=18.0"
  }
}


================================================
FILE: docs/sidebars.ts
================================================
import { TypedSidebarsConfig } from '@widlarzgroup/docusaurus-ui';

const sidebars: TypedSidebarsConfig = {
  docsSidebar: [
    {
      type: 'autogenerated',
      dirName: '.',
    },
    {
      type: 'html',
      value:
        '<hr style="margin: 1rem 0; border: none; border-top: 1px solid var(--ifm-color-emphasis-300);" />',
    },
    {
      type: 'link',
      label: 'Example Apps',
      href: 'https://github.com/TheWidlarzGroup/react-native-video/tree/master/example',
    },
    {
      type: 'doc',
      label: 'Useful Projects',
      id: 'projects',
    },
    {
      type: 'html',
      value:
        '<hr style="margin: 1rem 0; border: none; border-top: 1px solid var(--ifm-color-emphasis-300);" />',
    },
    {
      type: 'link',
      label: 'Offer',
      href: '/react-native-video/docs/v7/offer',
    },
    {
      type: 'link',
      label: 'Boost Your Issue',
      href: 'https://www.thewidlarzgroup.com/issue-boost/?utm_source=rnv&utm_medium=docs&utm_campaign=sidebar&utm_id=issue-boost-button',
    },
    {
      type: 'html',
      value:
        '<hr style="margin: 1rem 0; border: none; border-top: 1px solid var(--ifm-color-emphasis-300);" />',
    },
    {
      type: 'doc',
      label: 'Updating',
      id: 'updating',
    },
    {
      type: 'link',
      label: 'Releases',
      href: 'https://github.com/TheWidlarzGroup/react-native-video/releases',
    },
  ],
};

export default sidebars;


================================================
FILE: docs/src/components/Homepage/Enterprise/Enterprise.module.css
================================================
.enterprise {
  padding: 6rem 2rem;
}

.container {
  max-width: 1200px;
  margin: 0 auto;
}

.content {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 4rem;
  align-items: center;
}

.textContent {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}

.label {
  display: inline-block;
  padding: 0.5rem 1rem;
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--color-accent);
  background: var(--color-accent-subtle);
  border-radius: 100px;
  width: fit-content;
}

.title {
  margin: 0;
  font-size: 2.5rem;
  font-weight: 700;
  line-height: 1.2;
  color: var(--color-text-primary);
}

.description {
  margin: 0;
  font-size: 1.125rem;
  line-height: 1.6;
  color: var(--color-text-secondary);
}

.ctaButton {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.875rem 1.5rem;
  font-size: 1rem;
  font-weight: 600;
  color: var(--color-text-primary);
  background: var(--color-accent-bright);
  border-radius: 8px;
  text-decoration: none;
  transition: all 0.2s ease;
  width: fit-content;
}

[data-theme='dark'] .ctaButton {
  color: var(--color-bg-primary);
}

.ctaButton:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}

.arrowIcon {
  width: 20px;
  height: 20px;
  transition: transform 0.2s ease;
}

.ctaButton:hover .arrowIcon {
  transform: translateX(4px);
}

.featuresList {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

@media (max-width: 968px) {
  .content {
    grid-template-columns: 1fr;
    gap: 3rem;
  }

  .title {
    font-size: 2rem;
  }
}

@media (max-width: 640px) {
  .enterprise {
    padding: 4rem 1.5rem;
  }

  .title {
    font-size: 1.75rem;
  }

  .description {
    font-size: 1rem;
  }
}



================================================
FILE: docs/src/components/Homepage/Enterprise/Enterprise.tsx
================================================
import React from 'react';
import Link from '@docusaurus/Link';
import { FeatureCard, type FeatureCardItem } from './FeatureCard/FeatureCard';
import styles from './Enterprise.module.css';

const ArrowIcon = require('@site/static/img/arrow-icon.svg').default;
const LayersIcon =
  require('@site/static/img/homepage/enterprise/layers-icon.svg').default;
const ShieldIcon =
  require('@site/static/img/homepage/enterprise/shield-icon.svg').default;
const LightningIcon =
  require('@site/static/img/homepage/enterprise/lightning-icon.svg').default;

const CONTACT_URL =
  'https://www.thewidlarzgroup.com/?utm_source=rnv&utm_medium=docs&utm_campaign=landing-enterprise-solutions&utm_id=enterprise#Contact';

const FEATURE_LIST: FeatureCardItem[] = [
  {
    title: 'Custom Integration',
    description: 'Custom solutions for your specific requirements',
    Icon: LayersIcon,
  },
  {
    title: 'Dedicated Support',
    description: 'Priority support with direct access to our team',
    Icon: ShieldIcon,
  },
  {
    title: 'Expert Consultation',
    description: 'Architecture guidance and best practices',
    Icon: LightningIcon,
  },
];

export function Enterprise() {
  return (
    <section className={styles.enterprise}>
      <div className={styles.container}>
        <div className={styles.content}>
          <div className={styles.textContent}>
            <span className={styles.label}>Enterprise Solutions</span>
            <h2 className={styles.title}>
              Need custom integration or support?
            </h2>
            <p className={styles.description}>
              Our team provides enterprise-grade integration services, custom
              development, and dedicated support to help you build the perfect
              video solution for your business.
            </p>
            <Link to={CONTACT_URL} className={styles.ctaButton}>
              Get in touch
              <ArrowIcon className={styles.arrowIcon} />
            </Link>
          </div>
          <div className={styles.featuresList}>
            {FEATURE_LIST.map((feature) => (
              <FeatureCard key={feature.title} {...feature} />
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}


================================================
FILE: docs/src/components/Homepage/Enterprise/FeatureCard/FeatureCard.module.css
================================================
.card {
  display: flex;
  gap: 1rem;
  padding: 1.25rem;
  background: var(--color-bg-secondary);
  border: 1px solid var(--color-border);
  border-radius: 12px;
  transition: all 0.2s ease;
}

.card:hover {
  border-color: var(--color-border-hover);
}

.iconWrapper {
  flex-shrink: 0;
  width: 48px;
  height: 48px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--color-bg-tertiary);
  border: 1px solid var(--color-border);
  border-radius: 10px;
}

.icon {
  width: 24px;
  height: 24px;
  stroke: var(--color-accent);
}

.content {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

.title {
  margin: 0;
  font-size: 1rem;
  font-weight: 600;
  color: var(--color-text-primary);
}

.description {
  margin: 0;
  font-size: 0.875rem;
  color: var(--color-text-secondary);
  line-height: 1.5;
}



================================================
FILE: docs/src/components/Homepage/Enterprise/FeatureCard/FeatureCard.tsx
================================================
import React from 'react';
import styles from './FeatureCard.module.css';

export interface FeatureCardItem {
  title: string;
  description: string;
  Icon: React.ComponentType<React.ComponentProps<'svg'>>;
}

export function FeatureCard({ title, description, Icon }: FeatureCardItem) {
  return (
    <div className={styles.card}>
      <div className={styles.iconWrapper}>
        <Icon role="img" className={styles.icon} />
      </div>
      <div className={styles.content}>
        <h3 className={styles.title}>{title}</h3>
        <p className={styles.description}>{description}</p>
      </div>
    </div>
  );
}


================================================
FILE: docs/src/components/Homepage/Features/Feature/Feature.module.css
================================================
.card {
  position: relative;
  padding: 2rem;
  border-radius: 16px;
  background: var(--glass-bg);
  border: 1px solid var(--color-border);
  transition: all 0.3s ease;
  backdrop-filter: blur(10px);
  display: flex;
  flex-direction: column;
}

.card:hover {
  border-color: rgba(150, 201, 235, 0.4);
  background: var(--color-bg-elevated);
  box-shadow: 0 4px 20px rgba(150, 201, 235, 0.15);
  transform: translateY(-2px);
}

[data-theme='dark'] .card:hover {
  box-shadow: none;
}

.iconWrapper {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  margin-bottom: 1.5rem;
  border-radius: 12px;
  background: var(--color-accent-subtle);
  border: 1px solid rgba(150, 201, 235, 0.2);
}

[data-theme='dark'] .iconWrapper {
  background: var(--color-bg-tertiary);
  border: 1px solid var(--color-border);
}

.icon {
  width: 24px;
  height: 24px;
  stroke: var(--color-accent);
}

.title {
  font-size: 1.15rem;
  font-weight: 600;
  color: var(--color-text-primary);
  margin-bottom: 0.75rem;
  letter-spacing: -0.01em;
}

.description {
  font-size: 0.95rem;
  color: var(--color-text-secondary);
  line-height: 1.7;
  margin: 0;
}

.card:hover .iconWrapper {
  background: rgba(150, 201, 235, 0.15);
  border-color: rgba(150, 201, 235, 0.3);
}

[data-theme='dark'] .card:hover .iconWrapper {
  background: rgba(150, 201, 235, 0.1);
  border-color: rgba(150, 201, 235, 0.2);
}


================================================
FILE: docs/src/components/Homepage/Features/Feature/Feature.tsx
================================================
import React from 'react';
import styles from './Feature.module.css';

export interface FeatureItem {
  title: string;
  Icon: React.ComponentType<React.ComponentProps<'svg'>>;
  description: string;
}

export function Feature({ title, Icon, description }: FeatureItem) {
  return (
    <div className={styles.card}>
      <div className={styles.iconWrapper}>
        <Icon role="img" className={styles.icon} />
      </div>
      <h3 className={styles.title}>{title}</h3>
      <p className={styles.description}>{description}</p>
    </div>
  );
}


================================================
FILE: docs/src/components/Homepage/Features/Features.module.css
================================================
.features {
  padding: 6rem 2rem 8rem;
  position: relative;
  background: linear-gradient(180deg, transparent 0%, var(--color-bg-primary) 15%, var(--color-bg-primary) 100%);
  margin-top: -1px;
}

.container {
  max-width: 1200px;
  margin: 0 auto;
}

.header {
  text-align: center;
  margin-bottom: 4rem;
}

.label {
  display: inline-block;
  padding: 0.4rem 1rem;
  background: var(--color-accent-subtle);
  border: 1px solid rgba(150, 201, 235, 0.2);
  border-radius: 100px;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--color-accent);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-bottom: 1.5rem;
}

.title {
  font-size: clamp(1.75rem, 4vw, 2.5rem);
  font-weight: 700;
  color: var(--color-text-primary);
  letter-spacing: -0.03em;
  margin-bottom: 1rem;
  line-height: 1.2;
}

.subtitle {
  font-size: 1.1rem;
  color: var(--color-text-muted);
  max-width: 500px;
  margin: 0 auto;
  line-height: 1.7;
}

.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
}

@media (max-width: 1024px) {
  .grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 640px) {
  .grid {
    grid-template-columns: 1fr;
  }
  
  .features {
    padding: 4rem 1.5rem 6rem;
  }
}


================================================
FILE: docs/src/components/Homepage/Features/Features.tsx
================================================
import React from 'react';
import { Feature, type FeatureItem } from './Feature/Feature';
import styles from './Features.module.css';

const FEATURE_LIST: FeatureItem[] = [
  {
    title: 'React Native First',
    Icon: require('@site/static/img/homepage/features/reactjs-icon.svg')
      .default,
    description:
      'Built specifically for React Native with a native-first approach. Seamless integration with your existing React Native projects.',
  },
  {
    title: 'Multi-Platform',
    Icon: require('@site/static/img/homepage/features/platforms-icon.svg')
      .default,
    description:
      'iOS, Android, tvOS, visionOS, Vega OS, Web, and Windows. One API across all platforms with platform-specific optimizations.',
  },
  {
    title: 'Subtitles & Audio',
    Icon: require('@site/static/img/homepage/features/subtitles-icon.svg')
      .default,
    description:
      'Full support for multiple subtitle formats and audio tracks. Switch between languages on the fly.',
  },
  {
    title: 'DRM Protected',
    Icon: require('@site/static/img/homepage/features/shield-icon.svg').default,
    description:
      'Industry-standard DRM support including Widevine, FairPlay, and PlayReady for secure content delivery.',
  },
  {
    title: 'High Performance',
    Icon: require('@site/static/img/homepage/features/performance-icon.svg')
      .default,
    description:
      'Optimized native players under the hood. Smooth playback with minimal memory footprint.',
  },
  {
    title: 'Plugin System',
    Icon: require('@site/static/img/homepage/features/plugins-icon.svg')
      .default,
    description:
      'Extensible architecture with a powerful plugin system. Add custom functionality without forking.',
  },
];

export function Features() {
  return (
    <section className={styles.features}>
      <div className={styles.container}>
        <div className={styles.header}>
          <span className={styles.label}>Features</span>
          <h2 className={styles.title}>
            Everything you need for video playback
          </h2>
          <p className={styles.subtitle}>
            A comprehensive video solution trusted by thousands of developers
            worldwide
          </p>
        </div>

        <div className={styles.grid}>
          {FEATURE_LIST.map((props, idx) => (
            <Feature key={idx} {...props} />
          ))}
        </div>
      </div>
    </section>
  );
}


================================================
FILE: docs/src/components/Homepage/Hero/Badge/Badge.module.css
================================================
.badge {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.5rem 1rem;
  margin-bottom: 1.5rem;
  background: var(--color-secondary-subtle);
  border: 1px solid rgba(250, 216, 91, 0.25);
  border-radius: 100px;
  font-size: 0.85rem;
  font-weight: 500;
  color: var(--color-secondary);
}

.dot {
  width: 8px;
  height: 8px;
  background: var(--color-secondary-dim);
  border-radius: 50%;
}

@media screen and (max-width: 480px) {
  .badge {
    font-size: 0.75rem;
    padding: 0.4rem 0.8rem;
  }
}


================================================
FILE: docs/src/components/Homepage/Hero/Badge/Badge.tsx
================================================
import React, { type ReactNode } from 'react';
import { motion } from 'motion/react';
import { itemVariants } from '../Hero';
import styles from './Badge.module.css';

interface BadgeProps {
  children: ReactNode;
}

export function Badge({ children }: BadgeProps) {
  return (
    <motion.div className={styles.badge} variants={itemVariants}>
      <motion.span
        className={styles.dot}
        animate={{ opacity: [0.5, 0.3, 0.5] }}
        transition={{ duration: 2, ease: 'easeInOut', repeat: Infinity }}
      />
      {children}
    </motion.div>
  );
}


================================================
FILE: docs/src/components/Homepage/Hero/Buttons/Buttons.module.css
================================================
.buttons {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  justify-content: center;
}

.primary,
.secondary {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 1rem 2rem;
  font-size: 1rem;
  font-weight: 600;
  border-radius: 12px;
  text-decoration: none;
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.primary:hover,
.secondary:hover {
  transform: translateY(-2px);
}

.primary {
  background: var(--color-accent-bright);
  color: var(--color-dark);
  box-shadow: 0 0 0 0 rgba(150, 201, 235, 0);
}

.primary:hover {
  background: var(--color-accent-bright-dim);
}

.secondary {
  background: transparent;
  color: var(--color-text-primary);
  border: 1px solid var(--color-border);
}

.secondary:hover {
  background: var(--color-accent-subtle);
  border-color: var(--color-border-hover);
}

.icon {
  width: 20px;
  height: 20px;
  transition: transform 0.3s ease;
}

.primary:hover .icon {
  transform: translateX(4px);
}

@media screen and (max-width: 768px) {
  .buttons {
    flex-direction: column;
    width: 100%;
  }
  
  .primary,
  .secondary {
    width: 100%;
    justify-content: center;
  }
}


================================================
FILE: docs/src/components/Homepage/Hero/Buttons/Buttons.tsx
================================================
import React from 'react';
import Link from '@docusaurus/Link';
import { motion } from 'motion/react';
import { itemVariants } from '../Hero';
import styles from './Buttons.module.css';

const ArrowIcon = require('@site/static/img/arrow-icon.svg').default;
const GitHubIcon = require('@site/static/img/github-icon.svg').default;

interface ButtonsProps {
  docsLink: string;
  githubLink: string;
}

export function Buttons({ docsLink, githubLink }: ButtonsProps) {
  return (
    <motion.div className={styles.buttons} variants={itemVariants}>
      <Link to={docsLink} className={styles.primary}>
        Get Started
        <ArrowIcon role="img" className={styles.icon} />
      </Link>
      <Link to={githubLink} className={styles.secondary}>
        <GitHubIcon role="img" className={styles.icon} />
        View on GitHub
      </Link>
    </motion.div>
  );
}


================================================
FILE: docs/src/components/Homepage/Hero/Hero.module.css
================================================
.hero {
  position: relative;
  min-height: calc(100vh - var(--ifm-navbar-height));
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 4rem 2rem 8rem;
  overflow: visible;
  background: var(--color-bg-primary);
}

.hero::before {
  content: '';
  position: absolute;
  top: -50%;
  right: -20%;
  width: 80vw;
  height: 80vw;
  max-width: 1200px;
  max-height: 1200px;
  background: rgba(250, 216, 91, 0.05);
  border-radius: 50%;
  z-index: 0;
  pointer-events: none;
  display: none;
}

.hero::after {
  content: '';
  position: absolute;
  bottom: -40%;
  left: -20%;
  width: 70vw;
  height: 70vw;
  max-width: 1000px;
  max-height: 1000px;
  background: rgba(150, 201, 235, 0.05);
  border-radius: 50%;
  z-index: 0;
  pointer-events: none;
  display: none;
}

[data-theme='dark'] .hero::before {
  background: rgba(250, 216, 91, 0.008);
}

[data-theme='dark'] .hero::after {
  background: rgba(150, 201, 235, 0.004);
}

.content {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  max-width: 900px;
}

.logo {
  width: 120px;
  height: 80px;
  margin-bottom: 2rem;
}

.title {
  font-size: clamp(2.5rem, 8vw, 5rem);
  font-weight: 800;
  letter-spacing: -0.04em;
  line-height: 1.1;
  margin-bottom: 1.5rem;
  color: var(--color-text-primary);
}

.titleAccent {
  background: linear-gradient(135deg, var(--color-accent-bright) 0%, var(--color-accent-bright-dim) 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  padding-right: 0.05em;
}

.subtitle {
  font-size: clamp(1.1rem, 2.5vw, 1.4rem);
  font-weight: 400;
  color: var(--color-text-secondary);
  max-width: 600px;
  line-height: 1.7;
  margin-bottom: 3rem;
}

@media screen and (min-width: 769px) {
  .hero::before,
  .hero::after {
    display: block;
  }
}

@media screen and (max-width: 768px) {
  .hero {
    padding: 3rem 1.5rem;
    min-height: auto;
  }
  
  .logo {
    width: 100px;
    height: 66px;
  }
}

@media screen and (max-width: 480px) {
  .hero {
    padding: 2rem 1rem;
  }
}


================================================
FILE: docs/src/components/Homepage/Hero/Hero.tsx
================================================
import React, { useMemo } from 'react';
import { useDocsPreferredVersion } from '@docusaurus/theme-common';
import { motion, type Variants } from 'motion/react';
import { Badge } from './Badge/Badge';
import { Buttons } from './Buttons/Buttons';
import { Stats } from './Stats/Stats';
import { ScrollIndicator } from './ScrollIndicator/ScrollIndicator';
import styles from './Hero.module.css';

const GITHUB_URL = 'https://github.com/TheWidlarzGroup/react-native-video';
const DEFAULT_DOCS_PATH = '/docs/v6/intro';

const STATS = [
  { value: '7k+', label: 'GitHub Stars' },
  { value: '350k+', label: 'Weekly Downloads' },
  { value: 'TWG', label: 'Company Backed' },
];

export const itemVariants: Variants = {
  hidden: { opacity: 0, y: 20 },
  visible: {
    opacity: 1,
    y: 0,
  },
};

const logoVariants: Variants = {
  hidden: { opacity: 0, scale: 0.8 },
  visible: {
    opacity: 1,
    scale: 1,
  },
};

interface PreferredVersion {
  preferredVersion: { label: string; mainDocId: string; path: string } | null;
}

function useDocsLink() {
  const version = useDocsPreferredVersion() as PreferredVersion;

  return useMemo(() => {
    if (!version.preferredVersion) {
      return DEFAULT_DOCS_PATH;
    }
    return `${version.preferredVersion.path}/${version.preferredVersion.mainDocId}`;
  }, [version]);
}

export function Hero() {
  const docsLink = useDocsLink();

  return (
    <header className={styles.hero}>
      <motion.div
        className={styles.content}
        initial="hidden"
        animate="visible"
        transition={{
          staggerChildren: 0.1,
          delayChildren: 0.1,
        }}
      >
        <Badge>v7 Beta Available</Badge>

        <motion.img
          src="./img/twg-logo.png"
          alt="TheWidlarzGroup logo"
          className={styles.logo}
          variants={logoVariants}
          transition={{ duration: 0.5, ease: 'easeOut' }}
        />

        <motion.h1
          className={styles.title}
          variants={itemVariants}
          transition={{ duration: 0.5, ease: 'easeOut' }}
        >
          <span className={styles.titleAccent}>Video</span> for React Native
        </motion.h1>

        <motion.p
          className={styles.subtitle}
          variants={itemVariants}
          transition={{ duration: 0.5, ease: 'easeOut' }}
        >
          The most feature-rich video player for React Native. Multi-platform
          support with DRM, subtitles, and audio tracks.
        </motion.p>

        <Buttons docsLink={docsLink} githubLink={GITHUB_URL} />
        <Stats stats={STATS} />
      </motion.div>

      <ScrollIndicator />
    </header>
  );
}


================================================
FILE: docs/src/components/Homepage/Hero/ScrollIndicator/ScrollIndicator.module.css
================================================
.indicator {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  color: var(--color-text-muted);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
}

.line {
  width: 1px;
  height: 40px;
  background: linear-gradient(to bottom, var(--color-text-muted), transparent);
}

@media screen and (max-width: 768px) {
  .indicator {
    display: none;
  }
}


================================================
FILE: docs/src/components/Homepage/Hero/ScrollIndicator/ScrollIndicator.tsx
================================================
import React from 'react';
import { motion } from 'motion/react';
import styles from './ScrollIndicator.module.css';

interface ScrollIndicatorProps {
  label?: string;
}

export function ScrollIndicator({ label = 'Explore' }: ScrollIndicatorProps) {
  return (
    <motion.div
      className={styles.indicator}
      initial={{ opacity: 0, y: 20 }}
      animate={{
        opacity: [0.5, 1, 0.5],
        y: [0, 10, 0],
      }}
      transition={{
        duration: 2,
        repeat: Infinity,
        ease: 'easeInOut',
        delay: 0.6,
      }}
    >
      <span>{label}</span>
      <div className={styles.line} />
    </motion.div>
  );
}


================================================
FILE: docs/src/components/Homepage/Hero/Stats/Stats.module.css
================================================
.stats {
  display: flex;
  gap: 4rem;
  margin-top: 5rem;
  padding-top: 3rem;
  border-top: 1px solid var(--color-border);
}

.stat {
  text-align: center;
}

.value {
  display: block;
  font-size: 2.5rem;
  font-weight: 700;
  color: var(--color-accent-bright);
  letter-spacing: -0.02em;
}

.label {
  font-size: 0.9rem;
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

@media screen and (max-width: 768px) {
  .stats {
    flex-direction: column;
    gap: 2rem;
    margin-top: 3rem;
    padding-top: 2rem;
  }
}


================================================
FILE: docs/src/components/Homepage/Hero/Stats/Stats.tsx
================================================
import React from 'react';
import { motion } from 'motion/react';
import { itemVariants } from '../Hero';
import styles from './Stats.module.css';

interface StatItem {
  value: string;
  label: string;
}

interface StatsProps {
  stats: StatItem[];
}

export function Stats({ stats }: StatsProps) {
  return (
    <motion.div className={styles.stats} variants={itemVariants}>
      {stats.map((stat) => (
        <div key={stat.label} className={styles.stat}>
          <span className={styles.value}>{stat.value}</span>
          <span className={styles.label}>{stat.label}</span>
        </div>
      ))}
    </motion.div>
  );
}


================================================
FILE: docs/src/components/Intro/V7ApiModel/V7ApiModel.module.css
================================================
.container {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
  margin-bottom: 1rem;
}

.text {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--color-text-secondary);
  margin: 0;
  max-width: 700px;
}

.useCases {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1rem;
}

.useCase {
  padding: 1rem 1.25rem;
  border-left: 3px solid var(--color-accent);
  background: var(--color-accent-subtle);
  border-radius: 0 8px 8px 0;
}

.useCaseTitle {
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--color-text-primary);
  margin: 0 0 0.5rem;
}

.useCaseDescription {
  font-size: 0.875rem;
  color: var(--color-text-secondary);
  line-height: 1.6;
  margin: 0;
}

@media (max-width: 640px) {
  .useCases {
    grid-template-columns: 1fr;
  }
}


================================================
FILE: docs/src/components/Intro/V7ApiModel/V7ApiModel.tsx
================================================
import React from 'react';
import styles from './V7ApiModel.module.css';

const USE_CASES = [
  {
    title: 'Video feeds / lists',
    description:
      'Prepare upcoming players in advance for smoother scrolling and fewer glitches.',
  },
  {
    title: 'Faster playback start',
    description:
      'Preload before the user clicks "play" / before the screen appears.',
  },
];

export function V7ApiModel() {
  return (
    <div className={styles.container}>
      <p className={styles.text}>
        In v6, "player = view". In v7, the player is a separate entity: you can
        pass it as a prop to a view or prepare it in advance before rendering
        anything.
      </p>
      <div className={styles.useCases}>
        {USE_CASES.map((useCase) => (
          <div key={useCase.title} className={styles.useCase}>
            <h4 className={styles.useCaseTitle}>{useCase.title}</h4>
            <p className={styles.useCaseDescription}>{useCase.description}</p>
          </div>
        ))}
      </div>
    </div>
  );
}


================================================
FILE: docs/src/components/Intro/V7FeatureCards/V7FeatureCards.module.css
================================================
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
  margin: 1.5rem 0 2rem;
}

.card {
  padding: 1.25rem;
  border-radius: 12px;
  background: var(--glass-bg);
  border: 1px solid var(--color-border);
  transition: all 0.3s ease;
}

.card:hover {
  border-color: var(--color-border-hover);
  background: var(--color-bg-elevated);
}

.card.wide {
  grid-column: span 2;
}

.title {
  font-size: 1rem;
  font-weight: 600;
  color: var(--color-text-primary);
  margin: 0 0 0.5rem;
}

.description {
  font-size: 0.9rem;
  color: var(--color-text-secondary);
  line-height: 1.6;
  margin: 0;
}

.badge {
  display: inline-block;
  margin-top: 0.75rem;
  padding: 0.25rem 0.6rem;
  font-size: 0.7rem;
  font-weight: 600;
  color: var(--color-accent);
  background: var(--color-accent-subtle);
  border: 1px soli
Download .txt
gitextract_c7gy42g0/

├── .github/
│   ├── actions/
│   │   └── setup-bun/
│   │       └── action.yml
│   └── workflows/
│       ├── deploy-docs.yml
│       └── test-docs-build.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── bunfig.toml
├── config/
│   ├── .editorconfig
│   ├── .eslintrc.js
│   └── tsconfig.json
├── docs/
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── README.md
│   ├── docs/
│   │   ├── fundamentals/
│   │   │   ├── _category_.json
│   │   │   ├── configuration/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── with-expo.md
│   │   │   │   └── without-expo.md
│   │   │   ├── installation.md
│   │   │   └── intro.mdx
│   │   ├── offer.mdx
│   │   ├── player/
│   │   │   ├── _category_.json
│   │   │   ├── analytics/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── manual.md
│   │   │   │   └── simple.md
│   │   │   ├── downloading/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── downloading.md
│   │   │   │   ├── drm-downloading.md
│   │   │   │   ├── events-downloading.md
│   │   │   │   ├── getting-started.md
│   │   │   │   └── track-selection.md
│   │   │   ├── drm.md
│   │   │   ├── events.md
│   │   │   ├── player.md
│   │   │   ├── use-video-player.md
│   │   │   └── video-player.md
│   │   ├── plugins/
│   │   │   ├── _category_.json
│   │   │   ├── ask-for-plugin.md
│   │   │   ├── examples.md
│   │   │   ├── interface.md
│   │   │   ├── plugins.mdx
│   │   │   ├── registry.md
│   │   │   └── use-in-third-party-library.md
│   │   ├── projects.md
│   │   ├── updating.md
│   │   └── video-view/
│   │       ├── _category_.json
│   │       ├── chapters.md
│   │       ├── events.md
│   │       ├── methods.md
│   │       ├── props.md
│   │       └── video-view.md
│   ├── docusaurus.config.ts
│   ├── package.json
│   ├── sidebars.ts
│   ├── src/
│   │   ├── components/
│   │   │   ├── Homepage/
│   │   │   │   ├── Enterprise/
│   │   │   │   │   ├── Enterprise.module.css
│   │   │   │   │   ├── Enterprise.tsx
│   │   │   │   │   └── FeatureCard/
│   │   │   │   │       ├── FeatureCard.module.css
│   │   │   │   │       └── FeatureCard.tsx
│   │   │   │   ├── Features/
│   │   │   │   │   ├── Feature/
│   │   │   │   │   │   ├── Feature.module.css
│   │   │   │   │   │   └── Feature.tsx
│   │   │   │   │   ├── Features.module.css
│   │   │   │   │   └── Features.tsx
│   │   │   │   └── Hero/
│   │   │   │       ├── Badge/
│   │   │   │       │   ├── Badge.module.css
│   │   │   │       │   └── Badge.tsx
│   │   │   │       ├── Buttons/
│   │   │   │       │   ├── Buttons.module.css
│   │   │   │       │   └── Buttons.tsx
│   │   │   │       ├── Hero.module.css
│   │   │   │       ├── Hero.tsx
│   │   │   │       ├── ScrollIndicator/
│   │   │   │       │   ├── ScrollIndicator.module.css
│   │   │   │       │   └── ScrollIndicator.tsx
│   │   │   │       └── Stats/
│   │   │   │           ├── Stats.module.css
│   │   │   │           └── Stats.tsx
│   │   │   ├── Intro/
│   │   │   │   ├── V7ApiModel/
│   │   │   │   │   ├── V7ApiModel.module.css
│   │   │   │   │   └── V7ApiModel.tsx
│   │   │   │   ├── V7FeatureCards/
│   │   │   │   │   ├── V7FeatureCards.module.css
│   │   │   │   │   └── V7FeatureCards.tsx
│   │   │   │   ├── V7Lead/
│   │   │   │   │   ├── V7Lead.module.css
│   │   │   │   │   └── V7Lead.tsx
│   │   │   │   ├── V7NitroSection/
│   │   │   │   │   ├── V7NitroSection.module.css
│   │   │   │   │   └── V7NitroSection.tsx
│   │   │   │   ├── V7OpenSource/
│   │   │   │   │   ├── V7OpenSource.module.css
│   │   │   │   │   └── V7OpenSource.tsx
│   │   │   │   ├── V7ProPlugins/
│   │   │   │   │   ├── V7ProPlugins.module.css
│   │   │   │   │   └── V7ProPlugins.tsx
│   │   │   │   ├── V7StatusTimeline/
│   │   │   │   │   ├── V7StatusTimeline.module.css
│   │   │   │   │   └── V7StatusTimeline.tsx
│   │   │   │   └── index.ts
│   │   │   ├── Offer/
│   │   │   │   ├── Contact/
│   │   │   │   │   ├── Contact.module.css
│   │   │   │   │   └── Contact.tsx
│   │   │   │   ├── DecisionTable/
│   │   │   │   │   ├── DecisionTable.module.css
│   │   │   │   │   └── DecisionTable.tsx
│   │   │   │   ├── Extensions/
│   │   │   │   │   ├── Extensions.module.css
│   │   │   │   │   └── Extensions.tsx
│   │   │   │   ├── Hero/
│   │   │   │   │   ├── IntroHero.module.css
│   │   │   │   │   └── IntroHero.tsx
│   │   │   │   ├── HowItWorks/
│   │   │   │   │   ├── HowItWorks.module.css
│   │   │   │   │   └── HowItWorks.tsx
│   │   │   │   ├── Migration/
│   │   │   │   │   ├── Migration.module.css
│   │   │   │   │   └── Migration.tsx
│   │   │   │   ├── OfferCards/
│   │   │   │   │   ├── OfferCards.module.css
│   │   │   │   │   └── OfferCards.tsx
│   │   │   │   ├── Services/
│   │   │   │   │   ├── Services.module.css
│   │   │   │   │   └── Services.tsx
│   │   │   │   └── index.ts
│   │   │   └── PlatformsList/
│   │   │       ├── PlatformsList.module.css
│   │   │       └── PlatformsList.tsx
│   │   ├── css/
│   │   │   └── custom.css
│   │   └── pages/
│   │       ├── index.module.css
│   │       └── index.tsx
│   ├── static/
│   │   └── .nojekyll
│   ├── tsconfig.json
│   ├── versioned_docs/
│   │   └── version-6.x/
│   │       ├── component/
│   │       │   ├── _category_.json
│   │       │   ├── ads.md
│   │       │   ├── drm.mdx
│   │       │   ├── events.mdx
│   │       │   ├── methods.mdx
│   │       │   └── props.mdx
│   │       ├── installation.md
│   │       ├── intro.md
│   │       ├── other/
│   │       │   ├── _category_.json
│   │       │   ├── caching.md
│   │       │   ├── debug.md
│   │       │   ├── downloading.md
│   │       │   ├── expo.md
│   │       │   ├── misc.md
│   │       │   ├── new-arch.md
│   │       │   └── plugin.md
│   │       ├── projects.md
│   │       └── updating.md
│   ├── versioned_sidebars/
│   │   └── version-6.x-sidebars.json
│   └── versions.json
├── example/
│   ├── .bundle/
│   │   └── config
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .watchmanconfig
│   ├── Gemfile
│   ├── android/
│   │   ├── app/
│   │   │   ├── build.gradle
│   │   │   ├── debug.keystore
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── debug/
│   │   │       │   └── AndroidManifest.xml
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── videoexample/
│   │   │           │           ├── MainActivity.kt
│   │   │           │           └── MainApplication.kt
│   │   │           └── res/
│   │   │               ├── drawable/
│   │   │               │   └── rn_edit_text_material.xml
│   │   │               └── values/
│   │   │                   ├── strings.xml
│   │   │                   └── styles.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   ├── app.json
│   ├── babel.config.js
│   ├── index.js
│   ├── ios/
│   │   ├── .xcode.env
│   │   ├── Podfile
│   │   ├── VideoExample/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Images.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── Contents.json
│   │   │   ├── Info.plist
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── PrivacyInfo.xcprivacy
│   │   ├── VideoExample-Bridging-Header.h
│   │   ├── VideoExample.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── VideoExample.xcscheme
│   │   ├── VideoExample.xcworkspace/
│   │   │   └── contents.xcworkspacedata
│   │   └── VideoExampleTests/
│   │       ├── Info.plist
│   │       └── VideoExampleTests.m
│   ├── metro.config.js
│   ├── package.json
│   ├── src/
│   │   ├── App.tsx
│   │   ├── components/
│   │   │   ├── Controls.tsx
│   │   │   └── TextTrackManager.tsx
│   │   ├── styles.ts
│   │   ├── types/
│   │   │   └── videoSettings.ts
│   │   └── utils/
│   │       ├── time.ts
│   │       └── videoSource.ts
│   └── tsconfig.json
├── lefthook.yml
├── package.json
├── packages/
│   ├── drm-plugin/
│   │   ├── .eslintrc.js
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── .watchmanconfig
│   │   ├── README.md
│   │   ├── ReactNativeVideoDrm.podspec
│   │   ├── android/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── build.gradle
│   │   │   ├── gradle.properties
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── cpp/
│   │   │           │   └── cpp-adapter.cpp
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── twg/
│   │   │                       └── videodrm/
│   │   │                           ├── DRMManager/
│   │   │                           │   └── DRMManager.kt
│   │   │                           ├── DRMPlugin.kt
│   │   │                           ├── PluginManager.kt
│   │   │                           └── VideoDrmPackage.kt
│   │   ├── babel.config.js
│   │   ├── ios/
│   │   │   ├── DRMManager/
│   │   │   │   ├── DRMManager+AVContentKeySessionDelegate.swift
│   │   │   │   └── DRMManager.swift
│   │   │   ├── DRMPlugin.swift
│   │   │   └── PluginManager.swift
│   │   ├── nitro.json
│   │   ├── nitrogen/
│   │   │   └── generated/
│   │   │       ├── .gitattributes
│   │   │       ├── android/
│   │   │       │   ├── ReactNativeVideoDrm+autolinking.cmake
│   │   │       │   ├── ReactNativeVideoDrm+autolinking.gradle
│   │   │       │   ├── ReactNativeVideoDrmOnLoad.cpp
│   │   │       │   ├── ReactNativeVideoDrmOnLoad.hpp
│   │   │       │   ├── c++/
│   │   │       │   │   ├── JHybridPluginManagerSpec.cpp
│   │   │       │   │   └── JHybridPluginManagerSpec.hpp
│   │   │       │   └── kotlin/
│   │   │       │       └── com/
│   │   │       │           └── margelo/
│   │   │       │               └── nitro/
│   │   │       │                   └── videodrm/
│   │   │       │                       ├── HybridPluginManagerSpec.kt
│   │   │       │                       └── ReactNativeVideoDrmOnLoad.kt
│   │   │       ├── ios/
│   │   │       │   ├── ReactNativeVideoDrm+autolinking.rb
│   │   │       │   ├── ReactNativeVideoDrm-Swift-Cxx-Bridge.cpp
│   │   │       │   ├── ReactNativeVideoDrm-Swift-Cxx-Bridge.hpp
│   │   │       │   ├── ReactNativeVideoDrm-Swift-Cxx-Umbrella.hpp
│   │   │       │   ├── ReactNativeVideoDrmAutolinking.mm
│   │   │       │   ├── ReactNativeVideoDrmAutolinking.swift
│   │   │       │   ├── c++/
│   │   │       │   │   ├── HybridPluginManagerSpecSwift.cpp
│   │   │       │   │   └── HybridPluginManagerSpecSwift.hpp
│   │   │       │   └── swift/
│   │   │       │       ├── HybridPluginManagerSpec.swift
│   │   │       │       └── HybridPluginManagerSpec_cxx.swift
│   │   │       └── shared/
│   │   │           └── c++/
│   │   │               ├── HybridPluginManagerSpec.cpp
│   │   │               └── HybridPluginManagerSpec.hpp
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── PluginManager.nitro.ts
│   │   │   └── index.tsx
│   │   ├── tsconfig.build.json
│   │   └── tsconfig.json
│   └── react-native-video/
│       ├── .eslintrc.js
│       ├── .gitignore
│       ├── .watchmanconfig
│       ├── ReactNativeVideo.podspec
│       ├── android/
│       │   ├── CMakeLists.txt
│       │   ├── build.gradle
│       │   ├── fix-prefab.gradle
│       │   ├── gradle.properties
│       │   └── src/
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── AndroidManifestNew.xml
│       │       │   ├── cpp/
│       │       │   │   └── cpp-adapter.cpp
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── twg/
│       │       │   │           └── video/
│       │       │   │               ├── core/
│       │       │   │               │   ├── AudioFocusManager.kt
│       │       │   │               │   ├── VideoError.kt
│       │       │   │               │   ├── VideoManager.kt
│       │       │   │               │   ├── extensions/
│       │       │   │               │   │   ├── ResizeMode+AspectRatioFrameLayout.kt
│       │       │   │               │   │   ├── SubtitleType+toString.kt
│       │       │   │               │   │   └── VideoPlaybackService+ServiceManagment.kt
│       │       │   │               │   ├── fragments/
│       │       │   │               │   │   ├── FullscreenVideoFragment.kt
│       │       │   │               │   │   └── PictureInPictureHelperFragment.kt
│       │       │   │               │   ├── player/
│       │       │   │               │   │   ├── DRMManagerSpec.kt
│       │       │   │               │   │   ├── DataSourceFactoryUtils.kt
│       │       │   │               │   │   ├── MediaItemUtils.kt
│       │       │   │               │   │   ├── MediaSourceUtils.kt
│       │       │   │               │   │   └── OnAudioFocusChangedListener.kt
│       │       │   │               │   ├── plugins/
│       │       │   │               │   │   ├── PluginsRegistry.kt
│       │       │   │               │   │   └── ReactNativeVideoPlugin.kt
│       │       │   │               │   ├── recivers/
│       │       │   │               │   │   └── AudioBecomingNoisyReceiver.kt
│       │       │   │               │   ├── services/
│       │       │   │               │   │   └── playback/
│       │       │   │               │   │       ├── CustomMediaNotificationProvider.kt
│       │       │   │               │   │       ├── VideoPlaybackCallback.kt
│       │       │   │               │   │       ├── VideoPlaybackService.kt
│       │       │   │               │   │       └── VideoPlaybackServiceConnection.kt
│       │       │   │               │   └── utils/
│       │       │   │               │       ├── PictureInPictureUtils.kt
│       │       │   │               │       ├── SmallVideoPlayerOptimizer.kt
│       │       │   │               │       ├── SourceLoader.kt
│       │       │   │               │       ├── TextTrackUtils.kt
│       │       │   │               │       ├── Threading.kt
│       │       │   │               │       ├── VideoFileHelper.kt
│       │       │   │               │       ├── VideoInformationUtils.kt
│       │       │   │               │       └── VideoOrientationUtils.kt
│       │       │   │               ├── hybrids/
│       │       │   │               │   ├── videoplayer/
│       │       │   │               │   │   ├── HybridVideoPlayer.kt
│       │       │   │               │   │   └── HybridVideoPlayerFactory.kt
│       │       │   │               │   ├── videoplayereventemitter/
│       │       │   │               │   │   └── HybridVideoPlayerEventEmitter.kt
│       │       │   │               │   ├── videoplayersource/
│       │       │   │               │   │   ├── HybridVideoPlayerSource.kt
│       │       │   │               │   │   └── HybridVideoPlayerSourceFactory.kt
│       │       │   │               │   └── videoviewviewmanager/
│       │       │   │               │       ├── HybridVideoViewViewManager.kt
│       │       │   │               │       └── HybridVideoViewViewManagerFactory.kt
│       │       │   │               ├── react/
│       │       │   │               │   ├── VideoPackage.kt
│       │       │   │               │   └── VideoViewViewManager.kt
│       │       │   │               └── view/
│       │       │   │                   └── VideoView.kt
│       │       │   └── res/
│       │       │       └── layout/
│       │       │           ├── player_view_surface.xml
│       │       │           └── player_view_texture.xml
│       │       ├── paper/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── facebook/
│       │       │               └── react/
│       │       │                   └── viewmanagers/
│       │       │                       ├── RNCVideoViewManagerDelegate.java
│       │       │                       └── RNCVideoViewManagerInterface.java
│       │       └── stubs/
│       │           ├── dash/
│       │           │   └── androidx/
│       │           │       └── media3/
│       │           │           └── exoplayer/
│       │           │               └── dash/
│       │           │                   ├── DashMediaSource.kt
│       │           │                   ├── DashUtil.kt
│       │           │                   └── manifest/
│       │           │                       ├── AdaptationSet.kt
│       │           │                       ├── DashManifest.kt
│       │           │                       ├── Period.kt
│       │           │                       └── Representation.kt
│       │           └── hls/
│       │               └── androidx/
│       │                   └── media3/
│       │                       └── exoplayer/
│       │                           └── hls/
│       │                               └── HlsMediaSource.kt
│       ├── app.plugin.js
│       ├── babel.config.js
│       ├── ios/
│       │   ├── Video-Bridging-Header.h
│       │   ├── core/
│       │   │   ├── Extensions/
│       │   │   │   ├── AVAsset+estimatedMemoryUsage.swift
│       │   │   │   ├── AVAssetTrack+orientation.swift
│       │   │   │   ├── AVMetadataItem+make.swift
│       │   │   │   ├── AVPlayerItem+externalSubtitles.swift
│       │   │   │   ├── AVPlayerItem+getBufferedDurration.swift
│       │   │   │   ├── AVPlayerItem+setBufferConfig.swift
│       │   │   │   ├── AVPlayerViewController+Fullscreen.swift
│       │   │   │   ├── AVPlayerViewController+PictureInPicture.swift
│       │   │   │   ├── AVURLAsset+getAssetInformation.swift
│       │   │   │   ├── NSObject+PerformIfResponds.swift
│       │   │   │   └── ResizeMode+VideoGravity.swift
│       │   │   ├── HLSSubtitleInjector.swift
│       │   │   ├── NowPlayingInfoCenterManager.swift
│       │   │   ├── Plugins/
│       │   │   │   ├── PluginsRegistry.swift
│       │   │   │   └── ReactNativeVideoPlugin.swift
│       │   │   ├── Spec/
│       │   │   │   ├── DRMManagerSpec.swift
│       │   │   │   ├── NativeVideoPlayerSourceSpec.swift
│       │   │   │   └── NativeVideoPlayerSpec.swift
│       │   │   ├── Utils/
│       │   │   │   ├── ExternalSubtitlesUtils.swift
│       │   │   │   ├── HLSManifestParser.swift
│       │   │   │   └── Weak.swift
│       │   │   ├── VideoError.swift
│       │   │   ├── VideoFileHelper.swift
│       │   │   ├── VideoManager.swift
│       │   │   └── VideoPlayerObserver.swift
│       │   ├── hybrids/
│       │   │   ├── VideoPlayer/
│       │   │   │   ├── HybridVideoPlayer+Events.swift
│       │   │   │   ├── HybridVideoPlayer.swift
│       │   │   │   └── HybridVideoPlayerFactory.swift
│       │   │   ├── VideoPlayerEmitter/
│       │   │   │   └── HybridVideoPlayerEventEmitter.swift
│       │   │   ├── VideoPlayerSource/
│       │   │   │   ├── HybridVideoPlayerSource.swift
│       │   │   │   ├── HybridVideoPlayerSourceFactory.swift
│       │   │   │   └── SourceLoader.swift
│       │   │   └── VideoViewViewManager/
│       │   │       ├── HybridVideoViewViewManager.swift
│       │   │       └── HybridVideoViewViewManagerFactory.swift
│       │   └── view/
│       │       ├── VideoComponentView.swift
│       │       ├── VideoComponentViewObserver.swift
│       │       ├── fabric/
│       │       │   ├── RCTVideoViewComponentView.h
│       │       │   ├── RCTVideoViewComponentView.mm
│       │       │   └── RCTVideoViewViewManager.mm
│       │       └── paper/
│       │           ├── RCTVideoViewComponentView.h
│       │           ├── RCTVideoViewComponentView.mm
│       │           └── RCTVideoViewViewManager.m
│       ├── nitro.json
│       ├── nitrogen/
│       │   └── generated/
│       │       ├── .gitattributes
│       │       ├── android/
│       │       │   ├── ReactNativeVideo+autolinking.cmake
│       │       │   ├── ReactNativeVideo+autolinking.gradle
│       │       │   ├── ReactNativeVideoOnLoad.cpp
│       │       │   ├── ReactNativeVideoOnLoad.hpp
│       │       │   ├── c++/
│       │       │   │   ├── JBandwidthData.hpp
│       │       │   │   ├── JBufferConfig.hpp
│       │       │   │   ├── JCustomVideoMetadata.hpp
│       │       │   │   ├── JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.hpp
│       │       │   │   ├── JFunc_void.hpp
│       │       │   │   ├── JFunc_void_BandwidthData.hpp
│       │       │   │   ├── JFunc_void_TimedMetadata.hpp
│       │       │   │   ├── JFunc_void_VideoPlayerStatus.hpp
│       │       │   │   ├── JFunc_void_bool.hpp
│       │       │   │   ├── JFunc_void_double.hpp
│       │       │   │   ├── JFunc_void_onLoadData.hpp
│       │       │   │   ├── JFunc_void_onLoadStartData.hpp
│       │       │   │   ├── JFunc_void_onPlaybackStateChangeData.hpp
│       │       │   │   ├── JFunc_void_onProgressData.hpp
│       │       │   │   ├── JFunc_void_onVolumeChangeData.hpp
│       │       │   │   ├── JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack__.hpp
│       │       │   │   ├── JFunc_void_std__vector_std__string_.hpp
│       │       │   │   ├── JHybridVideoPlayerEventEmitterSpec.cpp
│       │       │   │   ├── JHybridVideoPlayerEventEmitterSpec.hpp
│       │       │   │   ├── JHybridVideoPlayerFactorySpec.cpp
│       │       │   │   ├── JHybridVideoPlayerFactorySpec.hpp
│       │       │   │   ├── JHybridVideoPlayerSourceFactorySpec.cpp
│       │       │   │   ├── JHybridVideoPlayerSourceFactorySpec.hpp
│       │       │   │   ├── JHybridVideoPlayerSourceSpec.cpp
│       │       │   │   ├── JHybridVideoPlayerSourceSpec.hpp
│       │       │   │   ├── JHybridVideoPlayerSpec.cpp
│       │       │   │   ├── JHybridVideoPlayerSpec.hpp
│       │       │   │   ├── JHybridVideoViewViewManagerFactorySpec.cpp
│       │       │   │   ├── JHybridVideoViewViewManagerFactorySpec.hpp
│       │       │   │   ├── JHybridVideoViewViewManagerSpec.cpp
│       │       │   │   ├── JHybridVideoViewViewManagerSpec.hpp
│       │       │   │   ├── JIgnoreSilentSwitchMode.hpp
│       │       │   │   ├── JListenerSubscription.hpp
│       │       │   │   ├── JLivePlaybackParams.hpp
│       │       │   │   ├── JMixAudioMode.hpp
│       │       │   │   ├── JNativeDrmParams.hpp
│       │       │   │   ├── JNativeExternalSubtitle.hpp
│       │       │   │   ├── JNativeVideoConfig.hpp
│       │       │   │   ├── JOnGetLicensePayload.hpp
│       │       │   │   ├── JResizeMode.hpp
│       │       │   │   ├── JResolution.hpp
│       │       │   │   ├── JSourceType.hpp
│       │       │   │   ├── JSubtitleType.hpp
│       │       │   │   ├── JSurfaceType.hpp
│       │       │   │   ├── JTextTrack.hpp
│       │       │   │   ├── JTimedMetadata.hpp
│       │       │   │   ├── JTimedMetadataObject.hpp
│       │       │   │   ├── JVariant_NullType_HybridVideoPlayerSourceSpec.cpp
│       │       │   │   ├── JVariant_NullType_HybridVideoPlayerSourceSpec.hpp
│       │       │   │   ├── JVariant_NullType_TextTrack.cpp
│       │       │   │   ├── JVariant_NullType_TextTrack.hpp
│       │       │   │   ├── JVideoInformation.hpp
│       │       │   │   ├── JVideoOrientation.hpp
│       │       │   │   ├── JVideoPlayerStatus.hpp
│       │       │   │   ├── JonLoadData.hpp
│       │       │   │   ├── JonLoadStartData.hpp
│       │       │   │   ├── JonPlaybackStateChangeData.hpp
│       │       │   │   ├── JonProgressData.hpp
│       │       │   │   └── JonVolumeChangeData.hpp
│       │       │   └── kotlin/
│       │       │       └── com/
│       │       │           └── margelo/
│       │       │               └── nitro/
│       │       │                   └── video/
│       │       │                       ├── BandwidthData.kt
│       │       │                       ├── BufferConfig.kt
│       │       │                       ├── CustomVideoMetadata.kt
│       │       │                       ├── Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.kt
│       │       │                       ├── Func_void.kt
│       │       │                       ├── Func_void_BandwidthData.kt
│       │       │                       ├── Func_void_TimedMetadata.kt
│       │       │                       ├── Func_void_VideoPlayerStatus.kt
│       │       │                       ├── Func_void_bool.kt
│       │       │                       ├── Func_void_double.kt
│       │       │                       ├── Func_void_onLoadData.kt
│       │       │                       ├── Func_void_onLoadStartData.kt
│       │       │                       ├── Func_void_onPlaybackStateChangeData.kt
│       │       │                       ├── Func_void_onProgressData.kt
│       │       │                       ├── Func_void_onVolumeChangeData.kt
│       │       │                       ├── Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.kt
│       │       │                       ├── Func_void_std__vector_std__string_.kt
│       │       │                       ├── HybridVideoPlayerEventEmitterSpec.kt
│       │       │                       ├── HybridVideoPlayerFactorySpec.kt
│       │       │                       ├── HybridVideoPlayerSourceFactorySpec.kt
│       │       │                       ├── HybridVideoPlayerSourceSpec.kt
│       │       │                       ├── HybridVideoPlayerSpec.kt
│       │       │                       ├── HybridVideoViewViewManagerFactorySpec.kt
│       │       │                       ├── HybridVideoViewViewManagerSpec.kt
│       │       │                       ├── IgnoreSilentSwitchMode.kt
│       │       │                       ├── ListenerSubscription.kt
│       │       │                       ├── LivePlaybackParams.kt
│       │       │                       ├── MixAudioMode.kt
│       │       │                       ├── NativeDrmParams.kt
│       │       │                       ├── NativeExternalSubtitle.kt
│       │       │                       ├── NativeVideoConfig.kt
│       │       │                       ├── OnGetLicensePayload.kt
│       │       │                       ├── ReactNativeVideoOnLoad.kt
│       │       │                       ├── ResizeMode.kt
│       │       │                       ├── Resolution.kt
│       │       │                       ├── SourceType.kt
│       │       │                       ├── SubtitleType.kt
│       │       │                       ├── SurfaceType.kt
│       │       │                       ├── TextTrack.kt
│       │       │                       ├── TimedMetadata.kt
│       │       │                       ├── TimedMetadataObject.kt
│       │       │                       ├── Variant_NullType_HybridVideoPlayerSourceSpec.kt
│       │       │                       ├── Variant_NullType_TextTrack.kt
│       │       │                       ├── VideoInformation.kt
│       │       │                       ├── VideoOrientation.kt
│       │       │                       ├── VideoPlayerStatus.kt
│       │       │                       ├── onLoadData.kt
│       │       │                       ├── onLoadStartData.kt
│       │       │                       ├── onPlaybackStateChangeData.kt
│       │       │                       ├── onProgressData.kt
│       │       │                       └── onVolumeChangeData.kt
│       │       ├── ios/
│       │       │   ├── ReactNativeVideo+autolinking.rb
│       │       │   ├── ReactNativeVideo-Swift-Cxx-Bridge.cpp
│       │       │   ├── ReactNativeVideo-Swift-Cxx-Bridge.hpp
│       │       │   ├── ReactNativeVideo-Swift-Cxx-Umbrella.hpp
│       │       │   ├── ReactNativeVideoAutolinking.mm
│       │       │   ├── ReactNativeVideoAutolinking.swift
│       │       │   ├── c++/
│       │       │   │   ├── HybridVideoPlayerEventEmitterSpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerEventEmitterSpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerFactorySpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerFactorySpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerSourceFactorySpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerSourceFactorySpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerSourceSpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerSourceSpecSwift.hpp
│       │       │   │   ├── HybridVideoPlayerSpecSwift.cpp
│       │       │   │   ├── HybridVideoPlayerSpecSwift.hpp
│       │       │   │   ├── HybridVideoViewViewManagerFactorySpecSwift.cpp
│       │       │   │   ├── HybridVideoViewViewManagerFactorySpecSwift.hpp
│       │       │   │   ├── HybridVideoViewViewManagerSpecSwift.cpp
│       │       │   │   └── HybridVideoViewViewManagerSpecSwift.hpp
│       │       │   └── swift/
│       │       │       ├── BandwidthData.swift
│       │       │       ├── BufferConfig.swift
│       │       │       ├── CustomVideoMetadata.swift
│       │       │       ├── Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.swift
│       │       │       ├── Func_void.swift
│       │       │       ├── Func_void_BandwidthData.swift
│       │       │       ├── Func_void_TimedMetadata.swift
│       │       │       ├── Func_void_VideoInformation.swift
│       │       │       ├── Func_void_VideoPlayerStatus.swift
│       │       │       ├── Func_void_bool.swift
│       │       │       ├── Func_void_double.swift
│       │       │       ├── Func_void_onLoadData.swift
│       │       │       ├── Func_void_onLoadStartData.swift
│       │       │       ├── Func_void_onPlaybackStateChangeData.swift
│       │       │       ├── Func_void_onProgressData.swift
│       │       │       ├── Func_void_onVolumeChangeData.swift
│       │       │       ├── Func_void_std__exception_ptr.swift
│       │       │       ├── Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.swift
│       │       │       ├── Func_void_std__shared_ptr_Promise_std__string__.swift
│       │       │       ├── Func_void_std__string.swift
│       │       │       ├── Func_void_std__vector_std__string_.swift
│       │       │       ├── HybridVideoPlayerEventEmitterSpec.swift
│       │       │       ├── HybridVideoPlayerEventEmitterSpec_cxx.swift
│       │       │       ├── HybridVideoPlayerFactorySpec.swift
│       │       │       ├── HybridVideoPlayerFactorySpec_cxx.swift
│       │       │       ├── HybridVideoPlayerSourceFactorySpec.swift
│       │       │       ├── HybridVideoPlayerSourceFactorySpec_cxx.swift
│       │       │       ├── HybridVideoPlayerSourceSpec.swift
│       │       │       ├── HybridVideoPlayerSourceSpec_cxx.swift
│       │       │       ├── HybridVideoPlayerSpec.swift
│       │       │       ├── HybridVideoPlayerSpec_cxx.swift
│       │       │       ├── HybridVideoViewViewManagerFactorySpec.swift
│       │       │       ├── HybridVideoViewViewManagerFactorySpec_cxx.swift
│       │       │       ├── HybridVideoViewViewManagerSpec.swift
│       │       │       ├── HybridVideoViewViewManagerSpec_cxx.swift
│       │       │       ├── IgnoreSilentSwitchMode.swift
│       │       │       ├── ListenerSubscription.swift
│       │       │       ├── LivePlaybackParams.swift
│       │       │       ├── MixAudioMode.swift
│       │       │       ├── NativeDrmParams.swift
│       │       │       ├── NativeExternalSubtitle.swift
│       │       │       ├── NativeVideoConfig.swift
│       │       │       ├── OnGetLicensePayload.swift
│       │       │       ├── ResizeMode.swift
│       │       │       ├── Resolution.swift
│       │       │       ├── SourceType.swift
│       │       │       ├── SubtitleType.swift
│       │       │       ├── SurfaceType.swift
│       │       │       ├── TextTrack.swift
│       │       │       ├── TimedMetadata.swift
│       │       │       ├── TimedMetadataObject.swift
│       │       │       ├── Variant_NullType_TextTrack.swift
│       │       │       ├── Variant_NullType__any_HybridVideoPlayerSourceSpec_.swift
│       │       │       ├── VideoInformation.swift
│       │       │       ├── VideoOrientation.swift
│       │       │       ├── VideoPlayerStatus.swift
│       │       │       ├── onLoadData.swift
│       │       │       ├── onLoadStartData.swift
│       │       │       ├── onPlaybackStateChangeData.swift
│       │       │       ├── onProgressData.swift
│       │       │       └── onVolumeChangeData.swift
│       │       └── shared/
│       │           └── c++/
│       │               ├── BandwidthData.hpp
│       │               ├── BufferConfig.hpp
│       │               ├── CustomVideoMetadata.hpp
│       │               ├── HybridVideoPlayerEventEmitterSpec.cpp
│       │               ├── HybridVideoPlayerEventEmitterSpec.hpp
│       │               ├── HybridVideoPlayerFactorySpec.cpp
│       │               ├── HybridVideoPlayerFactorySpec.hpp
│       │               ├── HybridVideoPlayerSourceFactorySpec.cpp
│       │               ├── HybridVideoPlayerSourceFactorySpec.hpp
│       │               ├── HybridVideoPlayerSourceSpec.cpp
│       │               ├── HybridVideoPlayerSourceSpec.hpp
│       │               ├── HybridVideoPlayerSpec.cpp
│       │               ├── HybridVideoPlayerSpec.hpp
│       │               ├── HybridVideoViewViewManagerFactorySpec.cpp
│       │               ├── HybridVideoViewViewManagerFactorySpec.hpp
│       │               ├── HybridVideoViewViewManagerSpec.cpp
│       │               ├── HybridVideoViewViewManagerSpec.hpp
│       │               ├── IgnoreSilentSwitchMode.hpp
│       │               ├── ListenerSubscription.hpp
│       │               ├── LivePlaybackParams.hpp
│       │               ├── MixAudioMode.hpp
│       │               ├── NativeDrmParams.hpp
│       │               ├── NativeExternalSubtitle.hpp
│       │               ├── NativeVideoConfig.hpp
│       │               ├── OnGetLicensePayload.hpp
│       │               ├── ResizeMode.hpp
│       │               ├── Resolution.hpp
│       │               ├── SourceType.hpp
│       │               ├── SubtitleType.hpp
│       │               ├── SurfaceType.hpp
│       │               ├── TextTrack.hpp
│       │               ├── TimedMetadata.hpp
│       │               ├── TimedMetadataObject.hpp
│       │               ├── VideoInformation.hpp
│       │               ├── VideoOrientation.hpp
│       │               ├── VideoPlayerStatus.hpp
│       │               ├── onLoadData.hpp
│       │               ├── onLoadStartData.hpp
│       │               ├── onPlaybackStateChangeData.hpp
│       │               ├── onProgressData.hpp
│       │               └── onVolumeChangeData.hpp
│       ├── package.json
│       ├── react-native.config.js
│       ├── src/
│       │   ├── core/
│       │   │   ├── VideoPlayer.ts
│       │   │   ├── VideoPlayerEvents.ts
│       │   │   ├── hooks/
│       │   │   │   ├── useEvent.ts
│       │   │   │   ├── useManagedInstance.ts
│       │   │   │   └── useVideoPlayer.ts
│       │   │   ├── types/
│       │   │   │   ├── BufferConfig.ts
│       │   │   │   ├── DrmParams.ts
│       │   │   │   ├── Events.ts
│       │   │   │   ├── IgnoreSilentSwitchMode.ts
│       │   │   │   ├── MixAudioMode.ts
│       │   │   │   ├── ResizeMode.ts
│       │   │   │   ├── TextTrack.ts
│       │   │   │   ├── Utils.ts
│       │   │   │   ├── VideoConfig.ts
│       │   │   │   ├── VideoError.ts
│       │   │   │   ├── VideoInformation.ts
│       │   │   │   ├── VideoOrientation.ts
│       │   │   │   ├── VideoPlayerBase.ts
│       │   │   │   ├── VideoPlayerSourceBase.ts
│       │   │   │   └── VideoPlayerStatus.ts
│       │   │   ├── utils/
│       │   │   │   ├── playerFactory.ts
│       │   │   │   └── sourceFactory.ts
│       │   │   └── video-view/
│       │   │       ├── NativeVideoView.tsx
│       │   │       └── VideoView.tsx
│       │   ├── expo-plugins/
│       │   │   ├── @types.ts
│       │   │   ├── getPackageInfo.ts
│       │   │   ├── withAndroidExtensions.ts
│       │   │   ├── withAndroidNotificationControls.ts
│       │   │   ├── withAndroidPictureInPicture.ts
│       │   │   ├── withBackgroundAudio.ts
│       │   │   ├── withReactNativeVideo.ts
│       │   │   └── writeToPodfile.ts
│       │   ├── index.tsx
│       │   └── spec/
│       │       ├── fabric/
│       │       │   └── VideoViewNativeComponent.ts
│       │       └── nitro/
│       │           ├── VideoPlayer.nitro.ts
│       │           ├── VideoPlayerEventEmitter.nitro.ts
│       │           ├── VideoPlayerSource.nitro.ts
│       │           └── VideoViewViewManager.nitro.ts
│       ├── tsconfig.build.json
│       └── tsconfig.json
└── scripts/
    └── release.sh
Download .txt
Showing preview only (536K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (1610 symbols across 193 files)

FILE: docs/src/components/Homepage/Enterprise/Enterprise.tsx
  constant CONTACT_URL (line 14) | const CONTACT_URL =
  constant FEATURE_LIST (line 17) | const FEATURE_LIST: FeatureCardItem[] = [
  function Enterprise (line 35) | function Enterprise() {

FILE: docs/src/components/Homepage/Enterprise/FeatureCard/FeatureCard.tsx
  type FeatureCardItem (line 4) | interface FeatureCardItem {
  function FeatureCard (line 10) | function FeatureCard({ title, description, Icon }: FeatureCardItem) {

FILE: docs/src/components/Homepage/Features/Feature/Feature.tsx
  type FeatureItem (line 4) | interface FeatureItem {
  function Feature (line 10) | function Feature({ title, Icon, description }: FeatureItem) {

FILE: docs/src/components/Homepage/Features/Features.tsx
  constant FEATURE_LIST (line 5) | const FEATURE_LIST: FeatureItem[] = [
  function Features (line 49) | function Features() {

FILE: docs/src/components/Homepage/Hero/Badge/Badge.tsx
  type BadgeProps (line 6) | interface BadgeProps {
  function Badge (line 10) | function Badge({ children }: BadgeProps) {

FILE: docs/src/components/Homepage/Hero/Buttons/Buttons.tsx
  type ButtonsProps (line 10) | interface ButtonsProps {
  function Buttons (line 15) | function Buttons({ docsLink, githubLink }: ButtonsProps) {

FILE: docs/src/components/Homepage/Hero/Hero.tsx
  constant GITHUB_URL (line 10) | const GITHUB_URL = 'https://github.com/TheWidlarzGroup/react-native-video';
  constant DEFAULT_DOCS_PATH (line 11) | const DEFAULT_DOCS_PATH = '/docs/v6/intro';
  constant STATS (line 13) | const STATS = [
  type PreferredVersion (line 35) | interface PreferredVersion {
  function useDocsLink (line 39) | function useDocsLink() {
  function Hero (line 50) | function Hero() {

FILE: docs/src/components/Homepage/Hero/ScrollIndicator/ScrollIndicator.tsx
  type ScrollIndicatorProps (line 5) | interface ScrollIndicatorProps {
  function ScrollIndicator (line 9) | function ScrollIndicator({ label = 'Explore' }: ScrollIndicatorProps) {

FILE: docs/src/components/Homepage/Hero/Stats/Stats.tsx
  type StatItem (line 6) | interface StatItem {
  type StatsProps (line 11) | interface StatsProps {
  function Stats (line 15) | function Stats({ stats }: StatsProps) {

FILE: docs/src/components/Intro/V7ApiModel/V7ApiModel.tsx
  constant USE_CASES (line 4) | const USE_CASES = [
  function V7ApiModel (line 17) | function V7ApiModel() {

FILE: docs/src/components/Intro/V7FeatureCards/V7FeatureCards.tsx
  type FeatureCard (line 4) | interface FeatureCard {
  constant FEATURES (line 11) | const FEATURES: FeatureCard[] = [
  function FeatureCard (line 41) | function FeatureCard({ title, description, badge, wide }: FeatureCard) {
  function V7FeatureCards (line 51) | function V7FeatureCards() {

FILE: docs/src/components/Intro/V7Lead/V7Lead.tsx
  function V7Lead (line 4) | function V7Lead() {

FILE: docs/src/components/Intro/V7NitroSection/V7NitroSection.tsx
  function V7NitroSection (line 4) | function V7NitroSection() {

FILE: docs/src/components/Intro/V7OpenSource/V7OpenSource.tsx
  function V7OpenSource (line 4) | function V7OpenSource() {

FILE: docs/src/components/Intro/V7ProPlugins/V7ProPlugins.tsx
  function V7ProPlugins (line 5) | function V7ProPlugins() {

FILE: docs/src/components/Intro/V7StatusTimeline/V7StatusTimeline.tsx
  constant STATUS_POINTS (line 4) | const STATUS_POINTS = [
  function V7StatusTimeline (line 20) | function V7StatusTimeline() {

FILE: docs/src/components/Offer/Contact/Contact.tsx
  constant CONTACT_URL (line 8) | const CONTACT_URL =
  constant CHECKLIST (line 11) | const CHECKLIST = [
  function Contact (line 22) | function Contact() {

FILE: docs/src/components/Offer/DecisionTable/DecisionTable.tsx
  type DecisionRow (line 4) | interface DecisionRow {
  constant DECISIONS (line 16) | const DECISIONS: DecisionRow[] = [
  function DecisionTable (line 49) | function DecisionTable() {

FILE: docs/src/components/Offer/Extensions/Extensions.tsx
  constant PRO_ADDONS_URL (line 11) | const PRO_ADDONS_URL =
  constant BOILERPLATES_URL (line 13) | const BOILERPLATES_URL =
  constant CUSTOM_URL (line 15) | const CUSTOM_URL =
  function Extensions (line 18) | function Extensions() {

FILE: docs/src/components/Offer/Hero/IntroHero.tsx
  constant CONTACT_URL (line 5) | const CONTACT_URL =
  constant URGENT_URL (line 7) | const URGENT_URL =
  function IntroHero (line 10) | function IntroHero() {

FILE: docs/src/components/Offer/HowItWorks/HowItWorks.tsx
  type FlowLine (line 4) | interface FlowLine {
  constant FLOWS (line 11) | const FLOWS: FlowLine[] = [
  function FlowLine (line 42) | function FlowLine({ label, steps, variant, highlight }: FlowLine) {
  function HowItWorks (line 63) | function HowItWorks() {

FILE: docs/src/components/Offer/Migration/Migration.tsx
  constant MIGRATION_URL (line 8) | const MIGRATION_URL =
  function Migration (line 11) | function Migration() {

FILE: docs/src/components/Offer/OfferCards/OfferCards.tsx
  type Badge (line 11) | interface Badge {
  type OfferCard (line 16) | interface OfferCard {
  constant CARDS (line 26) | const CARDS: OfferCard[] = [
  function OfferCard (line 65) | function OfferCard({
  function OfferCards (line 101) | function OfferCards() {

FILE: docs/src/components/Offer/Services/Services.tsx
  constant ISSUE_BOOSTER_URL (line 8) | const ISSUE_BOOSTER_URL =
  constant SUPPORT_PLAN_URL (line 10) | const SUPPORT_PLAN_URL =
  function Services (line 13) | function Services() {

FILE: docs/src/components/PlatformsList/PlatformsList.tsx
  type Platform (line 4) | type Platform =
  type Platforms (line 13) | interface Platforms {
  function PlatformsList (line 17) | function PlatformsList({ types }: Platforms) {

FILE: docs/src/pages/index.tsx
  function Home (line 8) | function Home() {

FILE: example/src/App.tsx
  function App (line 461) | function App() {

FILE: example/src/types/videoSettings.ts
  type VideoSettings (line 7) | interface VideoSettings {

FILE: example/src/utils/videoSource.ts
  type VideoType (line 78) | type VideoType = 'hls' | 'mp4' | 'drm';

FILE: packages/drm-plugin/android/src/main/cpp/cpp-adapter.cpp
  function JNIEXPORT (line 4) | JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {

FILE: packages/drm-plugin/nitrogen/generated/android/ReactNativeVideoDrmOnLoad.cpp
  type margelo::nitro::videodrm (line 21) | namespace margelo::nitro::videodrm {
    function initialize (line 23) | int initialize(JavaVM* vm) {
    type JHybridPluginManagerSpecImpl (line 29) | struct JHybridPluginManagerSpecImpl: public jni::JavaClass<JHybridPlug...
      method create (line 31) | static std::shared_ptr<JHybridPluginManagerSpec> create() {
    function registerAllNatives (line 38) | void registerAllNatives() {

FILE: packages/drm-plugin/nitrogen/generated/android/ReactNativeVideoDrmOnLoad.hpp
  type margelo::nitro::videodrm (line 12) | namespace margelo::nitro::videodrm {

FILE: packages/drm-plugin/nitrogen/generated/android/c++/JHybridPluginManagerSpec.cpp
  type margelo::nitro::videodrm (line 14) | namespace margelo::nitro::videodrm {

FILE: packages/drm-plugin/nitrogen/generated/android/c++/JHybridPluginManagerSpec.hpp
  type margelo::nitro::videodrm (line 17) | namespace margelo::nitro::videodrm {
    class JHybridPluginManagerSpec (line 21) | class JHybridPluginManagerSpec: public virtual HybridPluginManagerSpec...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridPluginManagerSpec (line 37) | explicit JHybridPluginManagerSpec(const jni::local_ref<JHybridPlugin...

FILE: packages/drm-plugin/nitrogen/generated/ios/ReactNativeVideoDrm+autolinking.rb
  function add_nitrogen_files (line 22) | def add_nitrogen_files(spec)

FILE: packages/drm-plugin/nitrogen/generated/ios/ReactNativeVideoDrm-Swift-Cxx-Bridge.cpp
  type margelo::nitro::videodrm::bridge::swift (line 15) | namespace margelo::nitro::videodrm::bridge::swift {
    function create_std__shared_ptr_HybridPluginManagerSpec_ (line 18) | std::shared_ptr<HybridPluginManagerSpec> create_std__shared_ptr_Hybrid...

FILE: packages/drm-plugin/nitrogen/generated/ios/ReactNativeVideoDrm-Swift-Cxx-Bridge.hpp
  type margelo::nitro::videodrm (line 12) | namespace margelo::nitro::videodrm { class HybridPluginManagerSpec; }
    class HybridPluginManagerSpec (line 12) | class HybridPluginManagerSpec
  type ReactNativeVideoDrm (line 16) | namespace ReactNativeVideoDrm { class HybridPluginManagerSpec_cxx; }
    class HybridPluginManagerSpec_cxx (line 16) | class HybridPluginManagerSpec_cxx
  type margelo::nitro::videodrm::bridge::swift (line 28) | namespace margelo::nitro::videodrm::bridge::swift {
    function std__weak_ptr_HybridPluginManagerSpec_ (line 40) | inline std__weak_ptr_HybridPluginManagerSpec_ weakify_std__shared_ptr_...
    function Result_void_ (line 44) | inline Result_void_ create_Result_void_() noexcept {
    function Result_void_ (line 47) | inline Result_void_ create_Result_void_(const std::exception_ptr& erro...

FILE: packages/drm-plugin/nitrogen/generated/ios/ReactNativeVideoDrm-Swift-Cxx-Umbrella.hpp
  type margelo::nitro::videodrm (line 12) | namespace margelo::nitro::videodrm { class HybridPluginManagerSpec; }
    class HybridPluginManagerSpec (line 12) | class HybridPluginManagerSpec
  type ReactNativeVideoDrm (line 31) | namespace ReactNativeVideoDrm { class HybridPluginManagerSpec_cxx; }
    class HybridPluginManagerSpec_cxx (line 31) | class HybridPluginManagerSpec_cxx

FILE: packages/drm-plugin/nitrogen/generated/ios/c++/HybridPluginManagerSpecSwift.cpp
  type margelo::nitro::videodrm (line 10) | namespace margelo::nitro::videodrm {

FILE: packages/drm-plugin/nitrogen/generated/ios/c++/HybridPluginManagerSpecSwift.hpp
  type ReactNativeVideoDrm (line 13) | namespace ReactNativeVideoDrm { class HybridPluginManagerSpec_cxx; }
    class HybridPluginManagerSpec_cxx (line 13) | class HybridPluginManagerSpec_cxx
  type margelo::nitro::videodrm (line 21) | namespace margelo::nitro::videodrm {
    class HybridPluginManagerSpecSwift (line 33) | class HybridPluginManagerSpecSwift: public virtual HybridPluginManager...
      method HybridPluginManagerSpecSwift (line 36) | explicit HybridPluginManagerSpecSwift(const ReactNativeVideoDrm::Hyb...
      method getExternalMemorySize (line 47) | inline size_t getExternalMemorySize() noexcept override {
      method equals (line 50) | bool equals(const std::shared_ptr<HybridObject>& other) override {
      method dispose (line 56) | void dispose() noexcept override {
      method toString (line 59) | std::string toString() override {
      method getIsEnabled (line 65) | inline bool getIsEnabled() noexcept override {
      method enable (line 71) | inline void enable() override {
      method disable (line 77) | inline void disable() override {

FILE: packages/drm-plugin/nitrogen/generated/shared/c++/HybridPluginManagerSpec.cpp
  type margelo::nitro::videodrm (line 10) | namespace margelo::nitro::videodrm {

FILE: packages/drm-plugin/nitrogen/generated/shared/c++/HybridPluginManagerSpec.hpp
  type margelo::nitro::videodrm (line 20) | namespace margelo::nitro::videodrm {
    class HybridPluginManagerSpec (line 37) | class HybridPluginManagerSpec: public virtual HybridObject {
      method HybridPluginManagerSpec (line 40) | explicit HybridPluginManagerSpec(): HybridObject(TAG) { }

FILE: packages/drm-plugin/src/PluginManager.nitro.ts
  type PluginManager (line 3) | interface PluginManager

FILE: packages/drm-plugin/src/index.tsx
  function enable (line 7) | function enable() {
  function disable (line 11) | function disable() {

FILE: packages/react-native-video/android/src/main/cpp/cpp-adapter.cpp
  function JNIEXPORT (line 4) | JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {

FILE: packages/react-native-video/android/src/paper/java/com/facebook/react/viewmanagers/RNCVideoViewManagerDelegate.java
  class RNCVideoViewManagerDelegate (line 18) | public class RNCVideoViewManagerDelegate<T extends View, U extends BaseV...
    method RNCVideoViewManagerDelegate (line 19) | public RNCVideoViewManagerDelegate(U viewManager) {
    method setProperty (line 22) | @Override

FILE: packages/react-native-video/android/src/paper/java/com/facebook/react/viewmanagers/RNCVideoViewManagerInterface.java
  type RNCVideoViewManagerInterface (line 14) | public interface RNCVideoViewManagerInterface<T extends View> {
    method setNitroId (line 15) | void setNitroId(T view, int value);

FILE: packages/react-native-video/nitrogen/generated/android/ReactNativeVideoOnLoad.cpp
  type margelo::nitro::video (line 41) | namespace margelo::nitro::video {
    function initialize (line 43) | int initialize(JavaVM* vm) {
    type JHybridVideoPlayerFactorySpecImpl (line 49) | struct JHybridVideoPlayerFactorySpecImpl: public jni::JavaClass<JHybri...
      method create (line 51) | static std::shared_ptr<JHybridVideoPlayerFactorySpec> create() {
    type JHybridVideoPlayerSourceFactorySpecImpl (line 57) | struct JHybridVideoPlayerSourceFactorySpecImpl: public jni::JavaClass<...
      method create (line 59) | static std::shared_ptr<JHybridVideoPlayerSourceFactorySpec> create() {
    type JHybridVideoViewViewManagerFactorySpecImpl (line 65) | struct JHybridVideoViewViewManagerFactorySpecImpl: public jni::JavaCla...
      method create (line 67) | static std::shared_ptr<JHybridVideoViewViewManagerFactorySpec> creat...
    function registerAllNatives (line 74) | void registerAllNatives() {

FILE: packages/react-native-video/nitrogen/generated/android/ReactNativeVideoOnLoad.hpp
  type margelo::nitro::video (line 12) | namespace margelo::nitro::video {

FILE: packages/react-native-video/nitrogen/generated/android/c++/JBandwidthData.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JBandwidthData (line 22) | struct JBandwidthData final: public jni::JavaClass<JBandwidthData> {
      method BandwidthData (line 30) | [[maybe_unused]]
      method fromCpp (line 51) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JBufferConfig.hpp
  type margelo::nitro::video (line 19) | namespace margelo::nitro::video {
    type JBufferConfig (line 26) | struct JBufferConfig final: public jni::JavaClass<JBufferConfig> {
      method BufferConfig (line 34) | [[maybe_unused]]
      method fromCpp (line 79) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JCustomVideoMetadata.hpp
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video {
    type JCustomVideoMetadata (line 23) | struct JCustomVideoMetadata final: public jni::JavaClass<JCustomVideoM...
      method CustomVideoMetadata (line 31) | [[maybe_unused]]
      method fromCpp (line 58) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.hpp
  type margelo::nitro::video (line 21) | namespace margelo::nitro::video {
    type JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload (line 29) | struct JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__stri...
      method invoke (line 37) | std::shared_ptr<Promise<std::shared_ptr<Promise<std::string>>>> invo...
    class JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload_cxx (line 69) | class JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__strin...
      method fromCpp (line 71) | static jni::local_ref<JFunc_std__shared_ptr_Promise_std__shared_ptr_...
      method invoke_cxx (line 79) | jni::local_ref<JPromise::javaobject> invoke_cxx(jni::alias_ref<JOnGe...
      method registerNatives (line 114) | static void registerNatives() {
      method JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload_cxx (line 119) | explicit JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void.hpp
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video {
    type JFunc_void (line 24) | struct JFunc_void: public jni::JavaClass<JFunc_void> {
      method invoke (line 32) | void invoke() const {
    class JFunc_void_cxx (line 41) | class JFunc_void_cxx final: public jni::HybridClass<JFunc_void_cxx, JF...
      method fromCpp (line 43) | static jni::local_ref<JFunc_void::javaobject> fromCpp(const std::fun...
      method invoke_cxx (line 51) | void invoke_cxx() {
      method registerNatives (line 63) | static void registerNatives() {
      method JFunc_void_cxx (line 68) | explicit JFunc_void_cxx(const std::function<void()>& func): _func(fu...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_BandwidthData.hpp
  type margelo::nitro::video (line 19) | namespace margelo::nitro::video {
    type JFunc_void_BandwidthData (line 27) | struct JFunc_void_BandwidthData: public jni::JavaClass<JFunc_void_Band...
      method invoke (line 35) | void invoke(const BandwidthData& data) const {
    class JFunc_void_BandwidthData_cxx (line 44) | class JFunc_void_BandwidthData_cxx final: public jni::HybridClass<JFun...
      method fromCpp (line 46) | static jni::local_ref<JFunc_void_BandwidthData::javaobject> fromCpp(...
      method invoke_cxx (line 54) | void invoke_cxx(jni::alias_ref<JBandwidthData> data) {
      method registerNatives (line 66) | static void registerNatives() {
      method JFunc_void_BandwidthData_cxx (line 71) | explicit JFunc_void_BandwidthData_cxx(const std::function<void(const...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp
  type margelo::nitro::video (line 22) | namespace margelo::nitro::video {
    type JFunc_void_TimedMetadata (line 30) | struct JFunc_void_TimedMetadata: public jni::JavaClass<JFunc_void_Time...
      method invoke (line 38) | void invoke(const TimedMetadata& data) const {
    class JFunc_void_TimedMetadata_cxx (line 47) | class JFunc_void_TimedMetadata_cxx final: public jni::HybridClass<JFun...
      method fromCpp (line 49) | static jni::local_ref<JFunc_void_TimedMetadata::javaobject> fromCpp(...
      method invoke_cxx (line 57) | void invoke_cxx(jni::alias_ref<JTimedMetadata> data) {
      method registerNatives (line 69) | static void registerNatives() {
      method JFunc_void_TimedMetadata_cxx (line 74) | explicit JFunc_void_TimedMetadata_cxx(const std::function<void(const...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_VideoPlayerStatus.hpp
  type margelo::nitro::video (line 18) | namespace margelo::nitro::video {
    type JFunc_void_VideoPlayerStatus (line 26) | struct JFunc_void_VideoPlayerStatus: public jni::JavaClass<JFunc_void_...
      method invoke (line 34) | void invoke(VideoPlayerStatus status) const {
    class JFunc_void_VideoPlayerStatus_cxx (line 43) | class JFunc_void_VideoPlayerStatus_cxx final: public jni::HybridClass<...
      method fromCpp (line 45) | static jni::local_ref<JFunc_void_VideoPlayerStatus::javaobject> from...
      method invoke_cxx (line 53) | void invoke_cxx(jni::alias_ref<JVideoPlayerStatus> status) {
      method registerNatives (line 65) | static void registerNatives() {
      method JFunc_void_VideoPlayerStatus_cxx (line 70) | explicit JFunc_void_VideoPlayerStatus_cxx(const std::function<void(V...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_bool.hpp
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video {
    type JFunc_void_bool (line 24) | struct JFunc_void_bool: public jni::JavaClass<JFunc_void_bool> {
      method invoke (line 32) | void invoke(bool isInPictureInPicture) const {
    class JFunc_void_bool_cxx (line 41) | class JFunc_void_bool_cxx final: public jni::HybridClass<JFunc_void_bo...
      method fromCpp (line 43) | static jni::local_ref<JFunc_void_bool::javaobject> fromCpp(const std...
      method invoke_cxx (line 51) | void invoke_cxx(jboolean isInPictureInPicture) {
      method registerNatives (line 63) | static void registerNatives() {
      method JFunc_void_bool_cxx (line 68) | explicit JFunc_void_bool_cxx(const std::function<void(bool /* isInPi...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_double.hpp
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video {
    type JFunc_void_double (line 24) | struct JFunc_void_double: public jni::JavaClass<JFunc_void_double> {
      method invoke (line 32) | void invoke(double rate) const {
    class JFunc_void_double_cxx (line 41) | class JFunc_void_double_cxx final: public jni::HybridClass<JFunc_void_...
      method fromCpp (line 43) | static jni::local_ref<JFunc_void_double::javaobject> fromCpp(const s...
      method invoke_cxx (line 51) | void invoke_cxx(double rate) {
      method registerNatives (line 63) | static void registerNatives() {
      method JFunc_void_double_cxx (line 68) | explicit JFunc_void_double_cxx(const std::function<void(double /* ra...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_onLoadData.hpp
  type margelo::nitro::video (line 20) | namespace margelo::nitro::video {
    type JFunc_void_onLoadData (line 28) | struct JFunc_void_onLoadData: public jni::JavaClass<JFunc_void_onLoadD...
      method invoke (line 36) | void invoke(const onLoadData& data) const {
    class JFunc_void_onLoadData_cxx (line 45) | class JFunc_void_onLoadData_cxx final: public jni::HybridClass<JFunc_v...
      method fromCpp (line 47) | static jni::local_ref<JFunc_void_onLoadData::javaobject> fromCpp(con...
      method invoke_cxx (line 55) | void invoke_cxx(jni::alias_ref<JonLoadData> data) {
      method registerNatives (line 67) | static void registerNatives() {
      method JFunc_void_onLoadData_cxx (line 72) | explicit JFunc_void_onLoadData_cxx(const std::function<void(const on...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_onLoadStartData.hpp
  type margelo::nitro::video (line 23) | namespace margelo::nitro::video {
    type JFunc_void_onLoadStartData (line 31) | struct JFunc_void_onLoadStartData: public jni::JavaClass<JFunc_void_on...
      method invoke (line 39) | void invoke(const onLoadStartData& data) const {
    class JFunc_void_onLoadStartData_cxx (line 48) | class JFunc_void_onLoadStartData_cxx final: public jni::HybridClass<JF...
      method fromCpp (line 50) | static jni::local_ref<JFunc_void_onLoadStartData::javaobject> fromCp...
      method invoke_cxx (line 58) | void invoke_cxx(jni::alias_ref<JonLoadStartData> data) {
      method registerNatives (line 70) | static void registerNatives() {
      method JFunc_void_onLoadStartData_cxx (line 75) | explicit JFunc_void_onLoadStartData_cxx(const std::function<void(con...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_onPlaybackStateChangeData.hpp
  type margelo::nitro::video (line 18) | namespace margelo::nitro::video {
    type JFunc_void_onPlaybackStateChangeData (line 26) | struct JFunc_void_onPlaybackStateChangeData: public jni::JavaClass<JFu...
      method invoke (line 34) | void invoke(const onPlaybackStateChangeData& data) const {
    class JFunc_void_onPlaybackStateChangeData_cxx (line 43) | class JFunc_void_onPlaybackStateChangeData_cxx final: public jni::Hybr...
      method fromCpp (line 45) | static jni::local_ref<JFunc_void_onPlaybackStateChangeData::javaobje...
      method invoke_cxx (line 53) | void invoke_cxx(jni::alias_ref<JonPlaybackStateChangeData> data) {
      method registerNatives (line 65) | static void registerNatives() {
      method JFunc_void_onPlaybackStateChangeData_cxx (line 70) | explicit JFunc_void_onPlaybackStateChangeData_cxx(const std::functio...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_onProgressData.hpp
  type margelo::nitro::video (line 18) | namespace margelo::nitro::video {
    type JFunc_void_onProgressData (line 26) | struct JFunc_void_onProgressData: public jni::JavaClass<JFunc_void_onP...
      method invoke (line 34) | void invoke(const onProgressData& data) const {
    class JFunc_void_onProgressData_cxx (line 43) | class JFunc_void_onProgressData_cxx final: public jni::HybridClass<JFu...
      method fromCpp (line 45) | static jni::local_ref<JFunc_void_onProgressData::javaobject> fromCpp...
      method invoke_cxx (line 53) | void invoke_cxx(jni::alias_ref<JonProgressData> data) {
      method registerNatives (line 65) | static void registerNatives() {
      method JFunc_void_onProgressData_cxx (line 70) | explicit JFunc_void_onProgressData_cxx(const std::function<void(cons...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_onVolumeChangeData.hpp
  type margelo::nitro::video (line 18) | namespace margelo::nitro::video {
    type JFunc_void_onVolumeChangeData (line 26) | struct JFunc_void_onVolumeChangeData: public jni::JavaClass<JFunc_void...
      method invoke (line 34) | void invoke(const onVolumeChangeData& data) const {
    class JFunc_void_onVolumeChangeData_cxx (line 43) | class JFunc_void_onVolumeChangeData_cxx final: public jni::HybridClass...
      method fromCpp (line 45) | static jni::local_ref<JFunc_void_onVolumeChangeData::javaobject> fro...
      method invoke_cxx (line 53) | void invoke_cxx(jni::alias_ref<JonVolumeChangeData> data) {
      method registerNatives (line 65) | static void registerNatives() {
      method JFunc_void_onVolumeChangeData_cxx (line 70) | explicit JFunc_void_onVolumeChangeData_cxx(const std::function<void(...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack__.hpp
  type margelo::nitro::video (line 24) | namespace margelo::nitro::video {
    type JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack__ (line 32) | struct JFunc_void_std__optional_std__variant_nitro__NullType__TextTrac...
      method invoke (line 40) | void invoke(const std::optional<std::variant<nitro::NullType, TextTr...
    class JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack___cxx (line 49) | class JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack...
      method fromCpp (line 51) | static jni::local_ref<JFunc_void_std__optional_std__variant_nitro__N...
      method invoke_cxx (line 59) | void invoke_cxx(jni::alias_ref<JVariant_NullType_TextTrack> track) {
      method registerNatives (line 71) | static void registerNatives() {
      method JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack___cxx (line 76) | explicit JFunc_void_std__optional_std__variant_nitro__NullType__Text...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JFunc_void_std__vector_std__string_.hpp
  type margelo::nitro::video (line 18) | namespace margelo::nitro::video {
    type JFunc_void_std__vector_std__string_ (line 26) | struct JFunc_void_std__vector_std__string_: public jni::JavaClass<JFun...
      method invoke (line 34) | void invoke(const std::vector<std::string>& data) const {
    class JFunc_void_std__vector_std__string__cxx (line 52) | class JFunc_void_std__vector_std__string__cxx final: public jni::Hybri...
      method fromCpp (line 54) | static jni::local_ref<JFunc_void_std__vector_std__string_::javaobjec...
      method invoke_cxx (line 62) | void invoke_cxx(jni::alias_ref<jni::JArrayClass<jni::JString>> data) {
      method registerNatives (line 83) | static void registerNatives() {
      method JFunc_void_std__vector_std__string__cxx (line 88) | explicit JFunc_void_std__vector_std__string__cxx(const std::function...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerEventEmitterSpec.cpp
  type margelo::nitro::video (line 11) | namespace margelo::nitro::video { struct ListenerSubscription; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video { struct BandwidthData; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video { struct onLoadData; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video { enum class VideoOrientation; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 19) | namespace margelo::nitro::video { struct onLoadStartData; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 21) | namespace margelo::nitro::video { enum class SourceType; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 23) | namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 25) | namespace margelo::nitro::video { struct onPlaybackStateChangeData; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 27) | namespace margelo::nitro::video { struct onProgressData; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 29) | namespace margelo::nitro::video { enum class VideoPlayerStatus; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 31) | namespace margelo::nitro::video { struct TimedMetadata; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 33) | namespace margelo::nitro::video { struct TimedMetadataObject; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 35) | namespace margelo::nitro::video { struct TextTrack; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 37) | namespace margelo::nitro::video { struct onVolumeChangeData; }
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...
  type margelo::nitro::video (line 91) | namespace margelo::nitro::video {
    type ListenerSubscription (line 11) | struct ListenerSubscription
    type BandwidthData (line 13) | struct BandwidthData
    type onLoadData (line 15) | struct onLoadData
    type VideoOrientation (line 17) | enum class VideoOrientation
    type onLoadStartData (line 19) | struct onLoadStartData
    type SourceType (line 21) | enum class SourceType
    class HybridVideoPlayerSourceSpec (line 23) | class HybridVideoPlayerSourceSpec
    type onPlaybackStateChangeData (line 25) | struct onPlaybackStateChangeData
    type onProgressData (line 27) | struct onProgressData
    type VideoPlayerStatus (line 29) | enum class VideoPlayerStatus
    type TimedMetadata (line 31) | struct TimedMetadata
    type TimedMetadataObject (line 33) | struct TimedMetadataObject
    type TextTrack (line 35) | struct TextTrack
    type onVolumeChangeData (line 37) | struct onVolumeChangeData
    function ListenerSubscription (line 124) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioBec...
    function ListenerSubscription (line 129) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnAudioFoc...
    function ListenerSubscription (line 134) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBandwidt...
    function ListenerSubscription (line 139) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnBufferLi...
    function ListenerSubscription (line 144) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnControls...
    function ListenerSubscription (line 149) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnEndListe...
    function ListenerSubscription (line 154) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnExternal...
    function ListenerSubscription (line 159) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadList...
    function ListenerSubscription (line 164) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnLoadStar...
    function ListenerSubscription (line 169) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 174) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnPlayback...
    function ListenerSubscription (line 179) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnProgress...
    function ListenerSubscription (line 184) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnReadyToD...
    function ListenerSubscription (line 189) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnSeekList...
    function ListenerSubscription (line 194) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnStatusCh...
    function ListenerSubscription (line 199) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTimedMet...
    function ListenerSubscription (line 204) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTextTrac...
    function ListenerSubscription (line 209) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnTrackCha...
    function ListenerSubscription (line 214) | ListenerSubscription JHybridVideoPlayerEventEmitterSpec::addOnVolumeCh...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerEventEmitterSpec.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class JHybridVideoPlayerEventEmitterSpec (line 21) | class JHybridVideoPlayerEventEmitterSpec: public virtual HybridVideoPl...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridVideoPlayerEventEmitterSpec (line 37) | explicit JHybridVideoPlayerEventEmitterSpec(const jni::local_ref<JHy...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp
  type margelo::nitro::video (line 11) | namespace margelo::nitro::video { class HybridVideoPlayerSpec; }
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    class HybridVideoPlayerSourceSpec (line 13) | class HybridVideoPlayerSourceSpec
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; }
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    class HybridVideoPlayerSourceSpec (line 13) | class HybridVideoPlayerSourceSpec
  type margelo::nitro::video (line 21) | namespace margelo::nitro::video {
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    class HybridVideoPlayerSourceSpec (line 13) | class HybridVideoPlayerSourceSpec

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class JHybridVideoPlayerFactorySpec (line 21) | class JHybridVideoPlayerFactorySpec: public virtual HybridVideoPlayerF...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridVideoPlayerFactorySpec (line 37) | explicit JHybridVideoPlayerFactorySpec(const jni::local_ref<JHybridV...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.cpp
  type margelo::nitro::video (line 11) | namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video { struct NativeVideoConfig; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video { struct NativeExternalSubtitle; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video { enum class SubtitleType; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 19) | namespace margelo::nitro::video { struct NativeDrmParams; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 21) | namespace margelo::nitro::video { struct OnGetLicensePayload; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 23) | namespace margelo::nitro::video { struct BufferConfig; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 25) | namespace margelo::nitro::video { struct LivePlaybackParams; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 27) | namespace margelo::nitro::video { struct Resolution; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 29) | namespace margelo::nitro::video { struct CustomVideoMetadata; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata
  type margelo::nitro::video (line 62) | namespace margelo::nitro::video {
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    type NativeVideoConfig (line 13) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 15) | struct NativeExternalSubtitle
    type SubtitleType (line 17) | enum class SubtitleType
    type NativeDrmParams (line 19) | struct NativeDrmParams
    type OnGetLicensePayload (line 21) | struct OnGetLicensePayload
    type BufferConfig (line 23) | struct BufferConfig
    type LivePlaybackParams (line 25) | struct LivePlaybackParams
    type Resolution (line 27) | struct Resolution
    type CustomVideoMetadata (line 29) | struct CustomVideoMetadata

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class JHybridVideoPlayerSourceFactorySpec (line 21) | class JHybridVideoPlayerSourceFactorySpec: public virtual HybridVideoP...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridVideoPlayerSourceFactorySpec (line 37) | explicit JHybridVideoPlayerSourceFactorySpec(const jni::local_ref<JH...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.cpp
  type margelo::nitro::video (line 11) | namespace margelo::nitro::video { struct NativeVideoConfig; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video { struct NativeExternalSubtitle; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video { enum class SubtitleType; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video { struct NativeDrmParams; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 19) | namespace margelo::nitro::video { struct OnGetLicensePayload; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 21) | namespace margelo::nitro::video { struct BufferConfig; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 23) | namespace margelo::nitro::video { struct LivePlaybackParams; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 25) | namespace margelo::nitro::video { struct Resolution; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 27) | namespace margelo::nitro::video { struct CustomVideoMetadata; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 29) | namespace margelo::nitro::video { struct VideoInformation; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 31) | namespace margelo::nitro::video { enum class VideoOrientation; }
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {
  type margelo::nitro::video (line 65) | namespace margelo::nitro::video {
    type NativeVideoConfig (line 11) | struct NativeVideoConfig
    type NativeExternalSubtitle (line 13) | struct NativeExternalSubtitle
    type SubtitleType (line 15) | enum class SubtitleType
    type NativeDrmParams (line 17) | struct NativeDrmParams
    type OnGetLicensePayload (line 19) | struct OnGetLicensePayload
    type BufferConfig (line 21) | struct BufferConfig
    type LivePlaybackParams (line 23) | struct LivePlaybackParams
    type Resolution (line 25) | struct Resolution
    type CustomVideoMetadata (line 27) | struct CustomVideoMetadata
    type VideoInformation (line 29) | struct VideoInformation
    type VideoOrientation (line 31) | enum class VideoOrientation
    function NativeVideoConfig (line 100) | NativeVideoConfig JHybridVideoPlayerSourceSpec::getConfig() {

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class JHybridVideoPlayerSourceSpec (line 21) | class JHybridVideoPlayerSourceSpec: public virtual HybridVideoPlayerSo...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridVideoPlayerSourceSpec (line 37) | explicit JHybridVideoPlayerSourceSpec(const jni::local_ref<JHybridVi...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp
  type margelo::nitro::video (line 11) | namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerEventEmitterSpec (line 13) | class HybridVideoPlayerEventEmitterSpec
    type VideoPlayerStatus (line 15) | enum class VideoPlayerStatus
    type MixAudioMode (line 17) | enum class MixAudioMode
    type IgnoreSilentSwitchMode (line 19) | enum class IgnoreSilentSwitchMode
    type TextTrack (line 21) | struct TextTrack
    function VideoPlayerStatus (line 97) | VideoPlayerStatus JHybridVideoPlayerSpec::getStatus() {
    function MixAudioMode (line 152) | MixAudioMode JHybridVideoPlayerSpec::getMixAudioMode() {
    function IgnoreSilentSwitchMode (line 161) | IgnoreSilentSwitchMode JHybridVideoPlayerSpec::getIgnoreSilentSwitchMo...
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video { class HybridVideoPlayerEventEmitterSpe...
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerEventEmitterSpec (line 13) | class HybridVideoPlayerEventEmitterSpec
    type VideoPlayerStatus (line 15) | enum class VideoPlayerStatus
    type MixAudioMode (line 17) | enum class MixAudioMode
    type IgnoreSilentSwitchMode (line 19) | enum class IgnoreSilentSwitchMode
    type TextTrack (line 21) | struct TextTrack
    function VideoPlayerStatus (line 97) | VideoPlayerStatus JHybridVideoPlayerSpec::getStatus() {
    function MixAudioMode (line 152) | MixAudioMode JHybridVideoPlayerSpec::getMixAudioMode() {
    function IgnoreSilentSwitchMode (line 161) | IgnoreSilentSwitchMode JHybridVideoPlayerSpec::getIgnoreSilentSwitchMo...
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video { enum class VideoPlayerStatus; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerEventEmitterSpec (line 13) | class HybridVideoPlayerEventEmitterSpec
    type VideoPlayerStatus (line 15) | enum class VideoPlayerStatus
    type MixAudioMode (line 17) | enum class MixAudioMode
    type IgnoreSilentSwitchMode (line 19) | enum class IgnoreSilentSwitchMode
    type TextTrack (line 21) | struct TextTrack
    function VideoPlayerStatus (line 97) | VideoPlayerStatus JHybridVideoPlayerSpec::getStatus() {
    function MixAudioMode (line 152) | MixAudioMode JHybridVideoPlayerSpec::getMixAudioMode() {
    function IgnoreSilentSwitchMode (line 161) | IgnoreSilentSwitchMode JHybridVideoPlayerSpec::getIgnoreSilentSwitchMo...
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video { enum class MixAudioMode; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerEventEmitterSpec (line 13) | class HybridVideoPlayerEventEmitterSpec
    type VideoPlayerStatus (line 15) | enum class VideoPlayerStatus
    type MixAudioMode (line 17) | enum class MixAudioMode
    type IgnoreSilentSwitchMode (line 19) | enum class IgnoreSilentSwitchMode
    type TextTrack (line 21) | struct TextTrack
    function VideoPlayerStatus (line 97) | VideoPlayerStatus JHybridVideoPlayerSpec::getStatus() {
    function MixAudioMode (line 152) | MixAudioMode JHybridVideoPlayerSpec::getMixAudioMode() {
    function IgnoreSilentSwitchMode (line 161) | IgnoreSilentSwitchMode JHybridVideoPlayerSpec::getIgnoreSilentSwitchMo...
  type margelo::nitro::video (line 19) | namespace margelo::nitro::video { enum class IgnoreSilentSwitchMode; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerEventEmitterSpec (line 13) | class HybridVideoPlayerEventEmitterSpec
    type VideoPlayerStatus (line 15) | enum class VideoPlayerStatus
    type MixAudioMode (line 17) | enum class MixAudioMode
    type IgnoreSilentSwitchMode (line 19) | enum class IgnoreSilentSwitchMode
    type TextTrack (line 21) | struct TextTrack
    function VideoPlayerStatus (line 97) | VideoPlayerStatus JHybridVideoPlayerSpec::getStatus() {
    function MixAudioMode (line 152) | MixAudioMode JHybridVideoPlayerSpec::getMixAudioMode() {
    function IgnoreSilentSwitchMode (line 161) | IgnoreSilentSwitchMode JHybridVideoPlayerSpec::getIgnoreSilentSwitchMo...
  type margelo::nitro::video (line 21) | namespace margelo::nitro::video { struct TextTrack; }
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerEventEmitterSpec (line 13) | class HybridVideoPlayerEventEmitterSpec
    type VideoPlayerStatus (line 15) | enum class VideoPlayerStatus
    type MixAudioMode (line 17) | enum class MixAudioMode
    type IgnoreSilentSwitchMode (line 19) | enum class IgnoreSilentSwitchMode
    type TextTrack (line 21) | struct TextTrack
    function VideoPlayerStatus (line 97) | VideoPlayerStatus JHybridVideoPlayerSpec::getStatus() {
    function MixAudioMode (line 152) | MixAudioMode JHybridVideoPlayerSpec::getMixAudioMode() {
    function IgnoreSilentSwitchMode (line 161) | IgnoreSilentSwitchMode JHybridVideoPlayerSpec::getIgnoreSilentSwitchMo...
  type margelo::nitro::video (line 48) | namespace margelo::nitro::video {
    class HybridVideoPlayerSourceSpec (line 11) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerEventEmitterSpec (line 13) | class HybridVideoPlayerEventEmitterSpec
    type VideoPlayerStatus (line 15) | enum class VideoPlayerStatus
    type MixAudioMode (line 17) | enum class MixAudioMode
    type IgnoreSilentSwitchMode (line 19) | enum class IgnoreSilentSwitchMode
    type TextTrack (line 21) | struct TextTrack
    function VideoPlayerStatus (line 97) | VideoPlayerStatus JHybridVideoPlayerSpec::getStatus() {
    function MixAudioMode (line 152) | MixAudioMode JHybridVideoPlayerSpec::getMixAudioMode() {
    function IgnoreSilentSwitchMode (line 161) | IgnoreSilentSwitchMode JHybridVideoPlayerSpec::getIgnoreSilentSwitchMo...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class JHybridVideoPlayerSpec (line 21) | class JHybridVideoPlayerSpec: public virtual HybridVideoPlayerSpec, pu...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridVideoPlayerSpec (line 37) | explicit JHybridVideoPlayerSpec(const jni::local_ref<JHybridVideoPla...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp
  type margelo::nitro::video (line 11) | namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; }
    class HybridVideoViewViewManagerSpec (line 11) | class HybridVideoViewViewManagerSpec
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class HybridVideoViewViewManagerSpec (line 11) | class HybridVideoViewViewManagerSpec

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class JHybridVideoViewViewManagerFactorySpec (line 21) | class JHybridVideoViewViewManagerFactorySpec: public virtual HybridVid...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridVideoViewViewManagerFactorySpec (line 37) | explicit JHybridVideoViewViewManagerFactorySpec(const jni::local_ref...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.cpp
  type margelo::nitro::video (line 11) | namespace margelo::nitro::video { class HybridVideoPlayerSpec; }
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    type ResizeMode (line 13) | enum class ResizeMode
    type SurfaceType (line 15) | enum class SurfaceType
    type ListenerSubscription (line 17) | struct ListenerSubscription
    function ResizeMode (line 100) | ResizeMode JHybridVideoViewViewManagerSpec::getResizeMode() {
    function SurfaceType (line 118) | SurfaceType JHybridVideoViewViewManagerSpec::getSurfaceType() {
    function ListenerSubscription (line 150) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnPictureInPi...
    function ListenerSubscription (line 155) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnFullscreenC...
    function ListenerSubscription (line 160) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterFull...
    function ListenerSubscription (line 165) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitFulls...
    function ListenerSubscription (line 170) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterPict...
    function ListenerSubscription (line 175) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitPictu...
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video { enum class ResizeMode; }
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    type ResizeMode (line 13) | enum class ResizeMode
    type SurfaceType (line 15) | enum class SurfaceType
    type ListenerSubscription (line 17) | struct ListenerSubscription
    function ResizeMode (line 100) | ResizeMode JHybridVideoViewViewManagerSpec::getResizeMode() {
    function SurfaceType (line 118) | SurfaceType JHybridVideoViewViewManagerSpec::getSurfaceType() {
    function ListenerSubscription (line 150) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnPictureInPi...
    function ListenerSubscription (line 155) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnFullscreenC...
    function ListenerSubscription (line 160) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterFull...
    function ListenerSubscription (line 165) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitFulls...
    function ListenerSubscription (line 170) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterPict...
    function ListenerSubscription (line 175) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitPictu...
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video { enum class SurfaceType; }
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    type ResizeMode (line 13) | enum class ResizeMode
    type SurfaceType (line 15) | enum class SurfaceType
    type ListenerSubscription (line 17) | struct ListenerSubscription
    function ResizeMode (line 100) | ResizeMode JHybridVideoViewViewManagerSpec::getResizeMode() {
    function SurfaceType (line 118) | SurfaceType JHybridVideoViewViewManagerSpec::getSurfaceType() {
    function ListenerSubscription (line 150) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnPictureInPi...
    function ListenerSubscription (line 155) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnFullscreenC...
    function ListenerSubscription (line 160) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterFull...
    function ListenerSubscription (line 165) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitFulls...
    function ListenerSubscription (line 170) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterPict...
    function ListenerSubscription (line 175) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitPictu...
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video { struct ListenerSubscription; }
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    type ResizeMode (line 13) | enum class ResizeMode
    type SurfaceType (line 15) | enum class SurfaceType
    type ListenerSubscription (line 17) | struct ListenerSubscription
    function ResizeMode (line 100) | ResizeMode JHybridVideoViewViewManagerSpec::getResizeMode() {
    function SurfaceType (line 118) | SurfaceType JHybridVideoViewViewManagerSpec::getSurfaceType() {
    function ListenerSubscription (line 150) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnPictureInPi...
    function ListenerSubscription (line 155) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnFullscreenC...
    function ListenerSubscription (line 160) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterFull...
    function ListenerSubscription (line 165) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitFulls...
    function ListenerSubscription (line 170) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterPict...
    function ListenerSubscription (line 175) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitPictu...
  type margelo::nitro::video (line 34) | namespace margelo::nitro::video {
    class HybridVideoPlayerSpec (line 11) | class HybridVideoPlayerSpec
    type ResizeMode (line 13) | enum class ResizeMode
    type SurfaceType (line 15) | enum class SurfaceType
    type ListenerSubscription (line 17) | struct ListenerSubscription
    function ResizeMode (line 100) | ResizeMode JHybridVideoViewViewManagerSpec::getResizeMode() {
    function SurfaceType (line 118) | SurfaceType JHybridVideoViewViewManagerSpec::getSurfaceType() {
    function ListenerSubscription (line 150) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnPictureInPi...
    function ListenerSubscription (line 155) | ListenerSubscription JHybridVideoViewViewManagerSpec::addOnFullscreenC...
    function ListenerSubscription (line 160) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterFull...
    function ListenerSubscription (line 165) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitFulls...
    function ListenerSubscription (line 170) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillEnterPict...
    function ListenerSubscription (line 175) | ListenerSubscription JHybridVideoViewViewManagerSpec::addWillExitPictu...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    class JHybridVideoViewViewManagerSpec (line 21) | class JHybridVideoViewViewManagerSpec: public virtual HybridVideoViewV...
      type JavaPart (line 23) | struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::Java...
      type CxxPart (line 27) | struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxP...
      method JHybridVideoViewViewManagerSpec (line 37) | explicit JHybridVideoViewViewManagerSpec(const jni::local_ref<JHybri...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JIgnoreSilentSwitchMode.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JIgnoreSilentSwitchMode (line 20) | struct JIgnoreSilentSwitchMode final: public jni::JavaClass<JIgnoreSil...
      method IgnoreSilentSwitchMode (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JListenerSubscription.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    type JListenerSubscription (line 24) | struct JListenerSubscription final: public jni::JavaClass<JListenerSub...
      method ListenerSubscription (line 32) | [[maybe_unused]]
      method fromCpp (line 55) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JLivePlaybackParams.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JLivePlaybackParams (line 22) | struct JLivePlaybackParams final: public jni::JavaClass<JLivePlaybackP...
      method LivePlaybackParams (line 30) | [[maybe_unused]]
      method fromCpp (line 57) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JMixAudioMode.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JMixAudioMode (line 20) | struct JMixAudioMode final: public jni::JavaClass<JMixAudioMode> {
      method MixAudioMode (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JNativeDrmParams.hpp
  type margelo::nitro::video (line 24) | namespace margelo::nitro::video {
    type JNativeDrmParams (line 31) | struct JNativeDrmParams final: public jni::JavaClass<JNativeDrmParams> {
      method NativeDrmParams (line 39) | [[maybe_unused]]
      method fromCpp (line 87) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JNativeExternalSubtitle.hpp
  type margelo::nitro::video (line 17) | namespace margelo::nitro::video {
    type JNativeExternalSubtitle (line 24) | struct JNativeExternalSubtitle final: public jni::JavaClass<JNativeExt...
      method NativeExternalSubtitle (line 32) | [[maybe_unused]]
      method fromCpp (line 56) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JNativeVideoConfig.hpp
  type margelo::nitro::video (line 39) | namespace margelo::nitro::video {
    type JNativeVideoConfig (line 46) | struct JNativeVideoConfig final: public jni::JavaClass<JNativeVideoCon...
      method NativeVideoConfig (line 54) | [[maybe_unused]]
      method fromCpp (line 103) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JOnGetLicensePayload.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JOnGetLicensePayload (line 22) | struct JOnGetLicensePayload final: public jni::JavaClass<JOnGetLicense...
      method OnGetLicensePayload (line 30) | [[maybe_unused]]
      method fromCpp (line 54) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JResizeMode.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JResizeMode (line 20) | struct JResizeMode final: public jni::JavaClass<JResizeMode> {
      method ResizeMode (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JResolution.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JResolution (line 22) | struct JResolution final: public jni::JavaClass<JResolution> {
      method Resolution (line 30) | [[maybe_unused]]
      method fromCpp (line 48) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JSourceType.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JSourceType (line 20) | struct JSourceType final: public jni::JavaClass<JSourceType> {
      method SourceType (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JSubtitleType.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JSubtitleType (line 20) | struct JSubtitleType final: public jni::JavaClass<JSubtitleType> {
      method SubtitleType (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JSurfaceType.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JSurfaceType (line 20) | struct JSurfaceType final: public jni::JavaClass<JSurfaceType> {
      method SurfaceType (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JTextTrack.hpp
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video {
    type JTextTrack (line 23) | struct JTextTrack final: public jni::JavaClass<JTextTrack> {
      method TextTrack (line 31) | [[maybe_unused]]
      method fromCpp (line 55) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JTimedMetadata.hpp
  type margelo::nitro::video (line 18) | namespace margelo::nitro::video {
    type JTimedMetadata (line 25) | struct JTimedMetadata final: public jni::JavaClass<JTimedMetadata> {
      method TimedMetadata (line 33) | [[maybe_unused]]
      method fromCpp (line 57) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JTimedMetadataObject.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JTimedMetadataObject (line 22) | struct JTimedMetadataObject final: public jni::JavaClass<JTimedMetadat...
      method TimedMetadataObject (line 30) | [[maybe_unused]]
      method fromCpp (line 48) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JVariant_NullType_HybridVideoPlayerSourceSpec.cpp
  type margelo::nitro::video (line 10) | namespace margelo::nitro::video {

FILE: packages/react-native-video/nitrogen/generated/android/c++/JVariant_NullType_HybridVideoPlayerSourceSpec.hpp
  type margelo::nitro::video (line 20) | namespace margelo::nitro::video {
    class JVariant_NullType_HybridVideoPlayerSourceSpec (line 27) | class JVariant_NullType_HybridVideoPlayerSourceSpec: public jni::JavaC...
      method create_0 (line 31) | static jni::local_ref<JVariant_NullType_HybridVideoPlayerSourceSpec>...
      method create_1 (line 35) | static jni::local_ref<JVariant_NullType_HybridVideoPlayerSourceSpec>...
      method fromCpp (line 40) | static jni::local_ref<JVariant_NullType_HybridVideoPlayerSourceSpec>...
    type JVariant_NullType_HybridVideoPlayerSourceSpec_impl (line 51) | namespace JVariant_NullType_HybridVideoPlayerSourceSpec_impl {
      class First (line 52) | class First final: public jni::JavaClass<First, JVariant_NullType_Hy...
        method getValue (line 56) | [[nodiscard]] jni::local_ref<JNull> getValue() const {
      class Second (line 62) | class Second final: public jni::JavaClass<Second, JVariant_NullType_...
        method getValue (line 66) | [[nodiscard]] jni::local_ref<JHybridVideoPlayerSourceSpec::JavaPar...

FILE: packages/react-native-video/nitrogen/generated/android/c++/JVariant_NullType_TextTrack.cpp
  type margelo::nitro::video (line 10) | namespace margelo::nitro::video {

FILE: packages/react-native-video/nitrogen/generated/android/c++/JVariant_NullType_TextTrack.hpp
  type margelo::nitro::video (line 21) | namespace margelo::nitro::video {
    class JVariant_NullType_TextTrack (line 28) | class JVariant_NullType_TextTrack: public jni::JavaClass<JVariant_Null...
      method create_0 (line 32) | static jni::local_ref<JVariant_NullType_TextTrack> create_0(jni::ali...
      method create_1 (line 36) | static jni::local_ref<JVariant_NullType_TextTrack> create_1(jni::ali...
      method fromCpp (line 41) | static jni::local_ref<JVariant_NullType_TextTrack> fromCpp(const std...
    type JVariant_NullType_TextTrack_impl (line 52) | namespace JVariant_NullType_TextTrack_impl {
      class First (line 53) | class First final: public jni::JavaClass<First, JVariant_NullType_Te...
        method getValue (line 57) | [[nodiscard]] jni::local_ref<JNull> getValue() const {
      class Second (line 63) | class Second final: public jni::JavaClass<Second, JVariant_NullType_...
        method getValue (line 67) | [[nodiscard]] jni::local_ref<JTextTrack> getValue() const {

FILE: packages/react-native-video/nitrogen/generated/android/c++/JVideoInformation.hpp
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video {
    type JVideoInformation (line 23) | struct JVideoInformation final: public jni::JavaClass<JVideoInformatio...
      method VideoInformation (line 31) | [[maybe_unused]]
      method fromCpp (line 67) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JVideoOrientation.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JVideoOrientation (line 20) | struct JVideoOrientation final: public jni::JavaClass<JVideoOrientatio...
      method VideoOrientation (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JVideoPlayerStatus.hpp
  type margelo::nitro::video (line 13) | namespace margelo::nitro::video {
    type JVideoPlayerStatus (line 20) | struct JVideoPlayerStatus final: public jni::JavaClass<JVideoPlayerSta...
      method VideoPlayerStatus (line 28) | [[maybe_unused]]
      method fromCpp (line 41) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JonLoadData.hpp
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video {
    type JonLoadData (line 23) | struct JonLoadData final: public jni::JavaClass<JonLoadData> {
      method onLoadData (line 31) | [[maybe_unused]]
      method fromCpp (line 58) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JonLoadStartData.hpp
  type margelo::nitro::video (line 19) | namespace margelo::nitro::video {
    type JonLoadStartData (line 26) | struct JonLoadStartData final: public jni::JavaClass<JonLoadStartData> {
      method onLoadStartData (line 34) | [[maybe_unused]]
      method fromCpp (line 52) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JonPlaybackStateChangeData.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JonPlaybackStateChangeData (line 22) | struct JonPlaybackStateChangeData final: public jni::JavaClass<JonPlay...
      method onPlaybackStateChangeData (line 30) | [[maybe_unused]]
      method fromCpp (line 48) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JonProgressData.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JonProgressData (line 22) | struct JonProgressData final: public jni::JavaClass<JonProgressData> {
      method onProgressData (line 30) | [[maybe_unused]]
      method fromCpp (line 48) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/android/c++/JonVolumeChangeData.hpp
  type margelo::nitro::video (line 15) | namespace margelo::nitro::video {
    type JonVolumeChangeData (line 22) | struct JonVolumeChangeData final: public jni::JavaClass<JonVolumeChang...
      method onVolumeChangeData (line 30) | [[maybe_unused]]
      method fromCpp (line 48) | [[maybe_unused]]

FILE: packages/react-native-video/nitrogen/generated/ios/ReactNativeVideo+autolinking.rb
  function add_nitrogen_files (line 22) | def add_nitrogen_files(spec)

FILE: packages/react-native-video/nitrogen/generated/ios/ReactNativeVideo-Swift-Cxx-Bridge.cpp
  type margelo::nitro::video::bridge::swift (line 21) | namespace margelo::nitro::video::bridge::swift {
    function create_std__shared_ptr_HybridVideoPlayerSourceSpec_ (line 24) | std::shared_ptr<HybridVideoPlayerSourceSpec> create_std__shared_ptr_Hy...
    function create_std__shared_ptr_HybridVideoPlayerEventEmitterSpec_ (line 40) | std::shared_ptr<HybridVideoPlayerEventEmitterSpec> create_std__shared_...
    function Func_void (line 56) | Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept {
    function Func_void_std__exception_ptr (line 64) | Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void*...
    function create_std__shared_ptr_HybridVideoPlayerSpec_ (line 72) | std::shared_ptr<HybridVideoPlayerSpec> create_std__shared_ptr_HybridVi...
    function create_std__shared_ptr_HybridVideoPlayerFactorySpec_ (line 88) | std::shared_ptr<HybridVideoPlayerFactorySpec> create_std__shared_ptr_H...
    function Func_void_bool (line 104) | Func_void_bool create_Func_void_bool(void* NON_NULL swiftClosureWrappe...
    function Func_void_BandwidthData (line 112) | Func_void_BandwidthData create_Func_void_BandwidthData(void* NON_NULL ...
    function Func_void_onLoadData (line 120) | Func_void_onLoadData create_Func_void_onLoadData(void* NON_NULL swiftC...
    function Func_void_onLoadStartData (line 128) | Func_void_onLoadStartData create_Func_void_onLoadStartData(void* NON_N...
    function Func_void_onPlaybackStateChangeData (line 136) | Func_void_onPlaybackStateChangeData create_Func_void_onPlaybackStateCh...
    function Func_void_double (line 144) | Func_void_double create_Func_void_double(void* NON_NULL swiftClosureWr...
    function Func_void_onProgressData (line 152) | Func_void_onProgressData create_Func_void_onProgressData(void* NON_NUL...
    function Func_void_VideoPlayerStatus (line 160) | Func_void_VideoPlayerStatus create_Func_void_VideoPlayerStatus(void* N...
    function Func_void_TimedMetadata (line 168) | Func_void_TimedMetadata create_Func_void_TimedMetadata(void* NON_NULL ...
    function Func_void_std__vector_std__string_ (line 176) | Func_void_std__vector_std__string_ create_Func_void_std__vector_std__s...
    function Func_void_std__optional_std__variant_nitro__NullType__TextTrack__ (line 184) | Func_void_std__optional_std__variant_nitro__NullType__TextTrack__ crea...
    function Func_void_onVolumeChangeData (line 192) | Func_void_onVolumeChangeData create_Func_void_onVolumeChangeData(void*...
    function Func_void_std__string (line 200) | Func_void_std__string create_Func_void_std__string(void* NON_NULL swif...
    function Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload (line 208) | Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____O...
    function Func_void_std__shared_ptr_Promise_std__string__ (line 217) | Func_void_std__shared_ptr_Promise_std__string__ create_Func_void_std__...
    function Func_void_VideoInformation (line 225) | Func_void_VideoInformation create_Func_void_VideoInformation(void* NON...
    function create_std__shared_ptr_HybridVideoPlayerSourceFactorySpec_ (line 233) | std::shared_ptr<HybridVideoPlayerSourceFactorySpec> create_std__shared...
    function create_std__shared_ptr_HybridVideoViewViewManagerSpec_ (line 249) | std::shared_ptr<HybridVideoViewViewManagerSpec> create_std__shared_ptr...
    function create_std__shared_ptr_HybridVideoViewViewManagerFactorySpec_ (line 265) | std::shared_ptr<HybridVideoViewViewManagerFactorySpec> create_std__sha...

FILE: packages/react-native-video/nitrogen/generated/ios/ReactNativeVideo-Swift-Cxx-Bridge.hpp
  type margelo::nitro::video (line 12) | namespace margelo::nitro::video { struct BandwidthData; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 14) | namespace margelo::nitro::video { struct BufferConfig; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 16) | namespace margelo::nitro::video { struct CustomVideoMetadata; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 18) | namespace margelo::nitro::video { class HybridVideoPlayerEventEmitterSpe...
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 20) | namespace margelo::nitro::video { class HybridVideoPlayerFactorySpec; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 22) | namespace margelo::nitro::video { class HybridVideoPlayerSourceFactorySp...
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 24) | namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 26) | namespace margelo::nitro::video { class HybridVideoPlayerSpec; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 28) | namespace margelo::nitro::video { class HybridVideoViewViewManagerFactor...
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 30) | namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 32) | namespace margelo::nitro::video { struct ListenerSubscription; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 34) | namespace margelo::nitro::video { struct LivePlaybackParams; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 36) | namespace margelo::nitro::video { struct NativeDrmParams; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 38) | namespace margelo::nitro::video { struct NativeExternalSubtitle; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 40) | namespace margelo::nitro::video { struct OnGetLicensePayload; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 42) | namespace margelo::nitro::video { struct Resolution; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 44) | namespace margelo::nitro::video { enum class SourceType; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 46) | namespace margelo::nitro::video { enum class SubtitleType; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 48) | namespace margelo::nitro::video { struct TextTrack; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 50) | namespace margelo::nitro::video { struct TimedMetadataObject; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 52) | namespace margelo::nitro::video { struct TimedMetadata; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 54) | namespace margelo::nitro::video { struct VideoInformation; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 56) | namespace margelo::nitro::video { enum class VideoOrientation; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 58) | namespace margelo::nitro::video { enum class VideoPlayerStatus; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 60) | namespace margelo::nitro::video { struct onLoadData; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 62) | namespace margelo::nitro::video { struct onLoadStartData; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 64) | namespace margelo::nitro::video { struct onPlaybackStateChangeData; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 66) | namespace margelo::nitro::video { struct onProgressData; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type margelo::nitro::video (line 68) | namespace margelo::nitro::video { struct onVolumeChangeData; }
    type BandwidthData (line 12) | struct BandwidthData
    type BufferConfig (line 14) | struct BufferConfig
    type CustomVideoMetadata (line 16) | struct CustomVideoMetadata
    class HybridVideoPlayerEventEmitterSpec (line 18) | class HybridVideoPlayerEventEmitterSpec
    class HybridVideoPlayerFactorySpec (line 20) | class HybridVideoPlayerFactorySpec
    class HybridVideoPlayerSourceFactorySpec (line 22) | class HybridVideoPlayerSourceFactorySpec
    class HybridVideoPlayerSourceSpec (line 24) | class HybridVideoPlayerSourceSpec
    class HybridVideoPlayerSpec (line 26) | class HybridVideoPlayerSpec
    class HybridVideoViewViewManagerFactorySpec (line 28) | class HybridVideoViewViewManagerFactorySpec
    class HybridVideoViewViewManagerSpec (line 30) | class HybridVideoViewViewManagerSpec
    type ListenerSubscription (line 32) | struct ListenerSubscription
    type LivePlaybackParams (line 34) | struct LivePlaybackParams
    type NativeDrmParams (line 36) | struct NativeDrmParams
    type NativeExternalSubtitle (line 38) | struct NativeExternalSubtitle
    type OnGetLicensePayload (line 40) | struct OnGetLicensePayload
    type Resolution (line 42) | struct Resolution
    type SourceType (line 44) | enum class SourceType
    type SubtitleType (line 46) | enum class SubtitleType
    type TextTrack (line 48) | struct TextTrack
    type TimedMetadataObject (line 50) | struct TimedMetadataObject
    type TimedMetadata (line 52) | struct TimedMetadata
    type VideoInformation (line 54) | struct VideoInformation
    type VideoOrientation (line 56) | enum class VideoOrientation
    type VideoPlayerStatus (line 58) | enum class VideoPlayerStatus
    type onLoadData (line 60) | struct onLoadData
    type onLoadStartData (line 62) | struct onLoadStartData
    type onPlaybackStateChangeData (line 64) | struct onPlaybackStateChangeData
    type onProgressData (line 66) | struct onProgressData
    type onVolumeChangeData (line 68) | struct onVolumeChangeData
  type ReactNativeVideo (line 72) | namespace ReactNativeVideo { class HybridVideoPlayerEventEmitterSpec_cxx; }
    class HybridVideoPlayerEventEmitterSpec_cxx (line 72) | class HybridVideoPlayerEventEmitterSpec_cxx
    class HybridVideoPlayerFactorySpec_cxx (line 74) | class HybridVideoPlayerFactorySpec_cxx
    class HybridVideoPlayerSourceFactorySpec_cxx (line 76) | class HybridVideoPlayerSourceFactorySpec_cxx
    class HybridVideoPlayerSourceSpec_cxx (line 78) | class HybridVideoPlayerSourceSpec_cxx
    class HybridVideoPlayerSpec_cxx (line 80) | class HybridVideoPlayerSpec_cxx
    class HybridVideoViewViewManagerFactorySpec_cxx (line 82) | class HybridVideoViewViewManagerFactorySpec_cxx
    class HybridVideoViewViewManagerSpec_cxx (line 84) | class HybridVideoViewViewManagerSpec_cxx
  type ReactNativeVideo (line 74) | namespace ReactNativeVideo { class HybridVideoPlayerFactorySpec_cxx; }
    class HybridVideoPlayerEventEmitterSpec_cxx (line 72) | class HybridVideoPlayerEventEmitterSpec_cxx
    class HybridVideoPlayerFactorySpec_cxx (line 74) | class HybridVideoPlayerFactorySpec_cxx
    class HybridVideoPlayerSourceFactorySpec_cxx (line 76) | class HybridVideoPlayerSourceFactorySpec_cxx
    class HybridVideoPlayerSourceSpec_cxx (line 78) | class HybridVideoPlayerSourceSpec_cxx
    class HybridVideoPlayerSpec_cxx (line 80) | class HybridVideoPlayerSpec_cxx
    class HybridVideoViewViewManagerFactorySpec_cxx (line 82) | class HybridVideoViewViewManagerFactorySpec_cxx
    class HybridVideoViewViewManagerSpec_cxx (line 84) | class HybridVideoViewViewManagerSpec_cxx
  type ReactNativeVideo (line 76) | namespace ReactNativeVideo { class HybridVideoPlayerSourceFactorySpec_cx...
    class HybridVideoPlayerEventEmitterSpec_cxx (line 72) | class HybridVideoPlayerEventEmitterSpec_cxx
    class HybridVideoPlayerFactorySpec_cxx (line 74) | class HybridVideoPlayerFactorySpec_cxx
    class HybridVideoPlayerSourceFactorySpec_cxx (line 76) | class HybridVideoPlayerSourceFactorySpec_cxx
    class HybridVideoPlayerSourceSpec_cxx (line 78) | class HybridVideoPlayerSourceSpec_cxx
    class HybridVideoPlayerSpec_cxx (line 80) | class HybridVideoPlayerSpec_cxx
    class HybridVideoViewViewManagerFactorySpec_cxx (line 82) | class HybridVideoViewViewManagerFactorySpec_cxx
    class HybridVideoViewViewManagerSpec_cxx (line 84) | class HybridVideoViewViewManagerSpec_cxx
  type ReactNativeVideo (line 78) | namespace ReactNativeVideo { class HybridVideoPlayerSourceSpec_cxx; }
    class HybridVideoPlayerEventEmitterSpec_cxx (line 72) | class HybridVideoPlayerEventEmitterSpec_cxx
    class HybridVideoPlayerFactorySpec_cxx (line 74) | class HybridVideoPlayerFactorySpec_cxx
    class HybridVideoPlayerSourceFactorySpec_cxx (line 76) | class HybridVideoPlayerSourceFactorySpec_cxx
    class HybridVideoPlayerSourceSpec_cxx (line 78) | class HybridVideoPlayerSourceSpec_cxx
    class HybridVideoPlayerSpec_cxx (line 80) | class HybridVideoPlayerSpec_cxx
    class HybridVideoViewViewManagerFactorySpec_cxx (line 82) | class HybridVideoViewViewManagerFactorySpec_cxx
    class HybridVideoViewViewManagerSpec_cxx (line 84) | class HybridVideoViewViewManagerSpec_cxx
  type ReactNativeVideo (line 80) | namespace ReactNativeVideo { class HybridVideoPlayerSpec_cxx; }
    class HybridVideoPlayerEventEmitterSpec_cxx (line 72) | class HybridVideoPlayerEventEmitterSpec_cxx
    class HybridVideoPlayerFactorySpec_cxx (line 74) | class HybridVideoPlayerFactorySpec_cxx
    class HybridVideoPlayerSourceFactorySpec_cxx (line 76) | class HybridVideoPlayerSourceFactorySpec_cxx
    class HybridVideoPlayerSourceSpec_cxx (line 78) | class HybridVideoPlayerSourceSpec_cxx
    class HybridVideoPlayerSpec_cxx (line 80) | class HybridVideoPlayerSpec_cxx
    class HybridVideoViewViewManagerFactorySpec_cxx (line 82) | class HybridVideoViewViewManagerFactorySpec_cxx
    class HybridVideoViewViewManagerSpec_cxx (line 84) | class HybridVideoViewViewManagerSpec_cxx
  type ReactNativeVideo (line 82) | namespace ReactNativeVideo { class HybridVideoViewViewManagerFactorySpec...
    class HybridVideoPlayerEventEmitterSpec_cxx (line 72) | class HybridVideoPlayerEventEmitterSpec_cxx
    class HybridVideoPlayerFactorySpec_cxx (line 74) | class HybridVideoPlayerFactorySpec_cxx
    class HybridVideoPlayerSourceFactorySpec_cxx (line 76) | class HybridVideoPlayerSourceFactorySpec_cxx
    class HybridVideoPlayerSourceSpec_cxx (line 78) | class HybridVideoPlayerSourceSpec_cxx
    class HybridVideoPlayerSpec_cxx (line 80) | class HybridVideoPlayerSpec_cxx
    class HybridVideoViewViewManagerFactorySpec_cxx (line 82) | class HybridVideoViewViewManagerFactorySpec_cxx
    class HybridVideoViewViewManagerSpec_cxx (line 84) | class HybridVideoViewViewManagerSpec_cxx
  type ReactNativeVideo (line 84) | namespace ReactNativeVideo { class HybridVideoViewViewManagerSpec_cxx; }
    class HybridVideoPlayerEventEmitterSpec_cxx (line 72) | class HybridVideoPlayerEventEmitterSpec_cxx
    class HybridVideoPlayerFactorySpec_cxx (line 74) | class HybridVideoPlayerFactorySpec_cxx
    class HybridVideoPlayerSourceFactorySpec_cxx (line 76) | class HybridVideoPlayerSourceFactorySpec_cxx
    class HybridVideoPlayerSourceSpec_cxx (line 78) | class HybridVideoPlayerSourceSpec_cxx
    class HybridVideoPlayerSpec_cxx (line 80) | class HybridVideoPlayerSpec_cxx
    class HybridVideoViewViewManagerFactorySpec_cxx (line 82) | class HybridVideoViewViewManagerFactorySpec_cxx
    class HybridVideoViewViewManagerSpec_cxx (line 84) | class HybridVideoViewViewManagerSpec_cxx
  type margelo::nitro::video::bridge::swift (line 133) | namespace margelo::nitro::video::bridge::swift {
    function std__weak_ptr_HybridVideoPlayerSourceSpec_ (line 145) | inline std__weak_ptr_HybridVideoPlayerSourceSpec_ weakify_std__shared_...
    function std__weak_ptr_HybridVideoPlayerEventEmitterSpec_ (line 157) | inline std__weak_ptr_HybridVideoPlayerEventEmitterSpec_ weakify_std__s...
    function create_std__shared_ptr_Promise_void__ (line 164) | inline std::shared_ptr<Promise<void>> create_std__shared_ptr_Promise_v...
    function wrap_std__shared_ptr_Promise_void__ (line 167) | inline PromiseHolder<void> wrap_std__shared_ptr_Promise_void__(std::sh...
    class Func_void_Wrapper (line 179) | class Func_void_Wrapper final {
      method Func_void_Wrapper (line 181) | explicit Func_void_Wrapper(std::function<void()>&& func): _function(...
      method call (line 182) | inline void call() const noexcept {
    function Func_void_Wrapper (line 189) | inline Func_void_Wrapper wrap_Func_void(Func_void value) noexcept {
      method Func_void_Wrapper (line 181) | explicit Func_void_Wrapper(std::function<void()>&& func): _function(...
      method call (line 182) | inline void call() const noexcept {
    class Func_void_std__exception_ptr_Wrapper (line 201) | class Func_void_std__exception_ptr_Wrapper final {
      method Func_void_std__exception_ptr_Wrapper (line 203) | explicit Func_void_std__exception_ptr_Wrapper(std::function<void(con...
      method call (line 204) | inline void call(std::exception_ptr error) const noexcept {
    function Func_void_std__exception_ptr_Wrapper (line 211) | inline Func_void_std__exception_ptr_Wrapper wrap_Func_void_std__except...
      method Func_void_std__exception_ptr_Wrapper (line 203) | explicit Func_void_std__exception_ptr_Wrapper(std::function<void(con...
      method call (line 204) | inline void call(std::exception_ptr error) const noexcept {
    type std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayerSourceSpec__ (line 221) | struct std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayer...
      method std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayerSourceSpec__ (line 223) | std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayerSourc...
      method index (line 227) | inline size_t index() const noexcept {
      method get_0 (line 230) | inline nitro::NullType get_0() const noexcept {
      method get_1 (line 233) | inline std::shared_ptr<HybridVideoPlayerSourceSpec> get_1() const no...
    function std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayerSourceSpec__ (line 237) | inline std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayer...
      method std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayerSourceSpec__ (line 223) | std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayerSourc...
      method index (line 227) | inline size_t index() const noexcept {
      method get_0 (line 230) | inline nitro::NullType get_0() const noexcept {
      method get_1 (line 233) | inline std::shared_ptr<HybridVideoPlayerSourceSpec> get_1() const no...
    function std__variant_nitro__NullType__std__shared_ptr_HybridVideoPlayerSourceSpec__ (line 240) | inline std__variant_nitro__NullType__st
Condensed preview — 616 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,861K chars).
[
  {
    "path": ".github/actions/setup-bun/action.yml",
    "chars": 819,
    "preview": "name: setup bun\ndescription: Setup bun and install dependencies\n\ninputs:\n  working-directory:\n    description: 'working "
  },
  {
    "path": ".github/workflows/deploy-docs.yml",
    "chars": 1082,
    "preview": "name: Deploy Documentation\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - master\n    paths:\n      # Update on w"
  },
  {
    "path": ".github/workflows/test-docs-build.yml",
    "chars": 601,
    "preview": "name: Test Documentation Build\n\non:\n  pull_request:\n    branches:\n      - master\n    paths:\n      # Update on workflow c"
  },
  {
    "path": ".gitignore",
    "chars": 838,
    "preview": "# OSX\n#\n.DS_Store\n\n**/.xcode.env.local\n\n# XDE\n.expo/\n\n# VSCode\n.vscode/\njsconfig.json\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!defau"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5489,
    "preview": "\n# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make particip"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4740,
    "preview": "# Contributing\n\nContributions are always welcome, no matter how large or small!\n\nWe want this community to be friendly a"
  },
  {
    "path": "LICENSE",
    "chars": 1076,
    "preview": "MIT License\n\nCopyright (c) 2024-2025 TheWidlarzGroup\nPermission is hereby granted, free of charge, to any person obtaini"
  },
  {
    "path": "README.md",
    "chars": 8549,
    "preview": "[![React Native Video Component](./docs/static/baners/rnv-banner.png)](https://thewidlarzgroup.com/?utm_source=rnv&utm_m"
  },
  {
    "path": "bunfig.toml",
    "chars": 28,
    "preview": "[install]\nlinker = \"hoisted\""
  },
  {
    "path": "config/.editorconfig",
    "chars": 303,
    "preview": "# EditorConfig helps developers define and maintain consistent\n# coding styles between different editors and IDEs\n# edit"
  },
  {
    "path": "config/.eslintrc.js",
    "chars": 983,
    "preview": "module.exports = {\n  root: true,\n  extends: ['@react-native', 'plugin:prettier/recommended'],\n  ignorePatterns: [\n    '*"
  },
  {
    "path": "config/tsconfig.json",
    "chars": 908,
    "preview": "{\n  \"exclude\": [\n    \"**/node_modules\",\n    \"**/lib\",\n    \"**/.eslintrc.js\",\n    \"**/.prettierrc.js\",\n    \"**/jest.confi"
  },
  {
    "path": "docs/.eslintrc.js",
    "chars": 399,
    "preview": "module.exports = {\n  root: true,\n  extends: [\"../config/.eslintrc.js\"],\n  parserOptions: {\n    tsconfigRootDir: __dirnam"
  },
  {
    "path": "docs/.gitignore",
    "chars": 286,
    "preview": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# API Reference generate"
  },
  {
    "path": "docs/README.md",
    "chars": 1280,
    "preview": "### Instalation\n\nTo install the dependencies, run at the root of the repository:\n\n```\n$ bun install\n```\n\n### Development"
  },
  {
    "path": "docs/docs/fundamentals/_category_.json",
    "chars": 69,
    "preview": "{\n  \"label\": \"Fundamentals\",\n  \"position\": 1,\n  \"collapsed\": false\n}\n"
  },
  {
    "path": "docs/docs/fundamentals/configuration/_category_.json",
    "chars": 70,
    "preview": "{\n  \"label\": \"Configuration\",\n  \"position\": 3,\n  \"collapsed\": false\n}\n"
  },
  {
    "path": "docs/docs/fundamentals/configuration/with-expo.md",
    "chars": 2691,
    "preview": "---\nsidebar_position: 1\nsidebar_label: With Expo\ndescription: Expo plugin for react-native-video configuration\n---\n\n# Ex"
  },
  {
    "path": "docs/docs/fundamentals/configuration/without-expo.md",
    "chars": 2180,
    "preview": "---\nsidebar_position: 2\nsidebar_label: Without Expo\ndescription: Manual configuration of react-native-video\n---\n\n# Manua"
  },
  {
    "path": "docs/docs/fundamentals/installation.md",
    "chars": 3902,
    "preview": "---\ntitle: Installation\nsidebar_position: 2\ndescription: React Native Video Installation Guide and Requirements\n---\n# In"
  },
  {
    "path": "docs/docs/fundamentals/intro.mdx",
    "chars": 676,
    "preview": "---\ntitle: Intro\nsidebar_position: 1\ndescription: Introduction to React Native Video v7\ncustomProps:\n  badgeType: new\n--"
  },
  {
    "path": "docs/docs/offer.mdx",
    "chars": 790,
    "preview": "---\ntitle: Offer\ndescription: Introduction to React Native Video library\nsidebar_class_name: hidden\n---\n\nimport {\n  Intr"
  },
  {
    "path": "docs/docs/player/_category_.json",
    "chars": 63,
    "preview": "{\n  \"label\": \"Player\",\n  \"position\": 2,\n  \"collapsed\": false\n}\n"
  },
  {
    "path": "docs/docs/player/analytics/_category_.json",
    "chars": 113,
    "preview": "{\n  \"label\": \"Analytics\",\n  \"position\": 7,\n  \"collapsed\": false,\n  \"customProps\": {\n    \"badgeType\": \"new\"\n  }\n}\n"
  },
  {
    "path": "docs/docs/player/analytics/manual.md",
    "chars": 9510,
    "preview": "---\nsidebar_position: 2\nsidebar_label: Manual (Native)\ndescription: Manual analytics integration guide using native plug"
  },
  {
    "path": "docs/docs/player/analytics/simple.md",
    "chars": 2246,
    "preview": "---\nsidebar_position: 0\nsidebar_label: Simple (JS Events)\ndescription: Simple analytics using JavaScript events\n---\n\n# S"
  },
  {
    "path": "docs/docs/player/downloading/_category_.json",
    "chars": 126,
    "preview": "{\n  \"label\": \"Downloading\",\n  \"position\": 6,\n  \"link\": null,\n  \"collapsed\": false,\n  \"customProps\": {\n    \"plan\": \"pro\"\n"
  },
  {
    "path": "docs/docs/player/downloading/downloading.md",
    "chars": 9841,
    "preview": "---\nsidebar_position: 2\nsidebar_label: Downloading\ndescription: Complete API reference for Offline Video SDK\n---\n\n# Down"
  },
  {
    "path": "docs/docs/player/downloading/drm-downloading.md",
    "chars": 4282,
    "preview": "---\nsidebar_position: 5\nsidebar_label: DRM Downloading\ndescription: Downloading and playing DRM-protected content offlin"
  },
  {
    "path": "docs/docs/player/downloading/events-downloading.md",
    "chars": 2656,
    "preview": "---\nsidebar_position: 3\nsidebar_label: Events (downloading)\ndescription: Event system for tracking download progress and"
  },
  {
    "path": "docs/docs/player/downloading/getting-started.md",
    "chars": 3401,
    "preview": "---\nsidebar_position: 1\nsidebar_label: Getting Started\ndescription: Installation and setup guide for Offline Video SDK\n-"
  },
  {
    "path": "docs/docs/player/downloading/track-selection.md",
    "chars": 3180,
    "preview": "---\nsidebar_position: 4\nsidebar_label: Track Selection\ndescription: How to select specific tracks for download\n---\n\n# Tr"
  },
  {
    "path": "docs/docs/player/drm.md",
    "chars": 8805,
    "preview": "---\nsidebar_position: 4\nsidebar_label: DRM\n---\n\n# DRM\n\n## What is DRM (Digital Rights Management)?\nDRM is a set of acces"
  },
  {
    "path": "docs/docs/player/events.md",
    "chars": 7452,
    "preview": "---\nsidebar_label: Events\nsidebar_position: 5\n---\n\n# Handling Player Events\n\nThe `VideoPlayer` emits a variety of events"
  },
  {
    "path": "docs/docs/player/player.md",
    "chars": 1854,
    "preview": "---\nsidebar_position: 1\nsidebar_label: Player\n---\n\n# Player\n\nThe `VideoPlayer` class is the primary way to control video"
  },
  {
    "path": "docs/docs/player/use-video-player.md",
    "chars": 7919,
    "preview": "---\nsidebar_position: 2\nsidebar_label: useVideoPlayer\n---\n\n# useVideoPlayer\n\nThe `useVideoPlayer` hook is the recommende"
  },
  {
    "path": "docs/docs/player/video-player.md",
    "chars": 15101,
    "preview": "---\nsidebar_position: 3\nsidebar_label: VideoPlayer\n---\n\n# VideoPlayer\n\n:::tip When to Use What\n- **[`useVideoPlayer`](./"
  },
  {
    "path": "docs/docs/plugins/_category_.json",
    "chars": 64,
    "preview": "{\n  \"label\": \"Plugins\",\n  \"position\": 4,\n  \"collapsed\": false\n}\n"
  },
  {
    "path": "docs/docs/plugins/ask-for-plugin.md",
    "chars": 2514,
    "preview": "---\ntitle: Ask for Plugin\ndescription: Request a custom plugin for your React Native Video application\nsidebar_position:"
  },
  {
    "path": "docs/docs/plugins/examples.md",
    "chars": 2767,
    "preview": "---\ntitle: Plugin Usage Examples\ndescription: Simple examples of implementing common plugin scenarios for React Native V"
  },
  {
    "path": "docs/docs/plugins/interface.md",
    "chars": 7809,
    "preview": "---\ntitle: Plugin Interface\ndescription: Reference for the React Native Video plugin interface\nsidebar_position: 2\n---\n\n"
  },
  {
    "path": "docs/docs/plugins/plugins.mdx",
    "chars": 4106,
    "preview": "---\ntitle: Plugins  \ndescription: Overview of the React Native Video plugin system\nsidebar_position: 6\n---\n\n# Plugins Ov"
  },
  {
    "path": "docs/docs/plugins/registry.md",
    "chars": 5840,
    "preview": "---\ntitle: Plugin Registry  \ndescription: Overview of the React Native Video plugin registry and how to use it\nsidebar_p"
  },
  {
    "path": "docs/docs/plugins/use-in-third-party-library.md",
    "chars": 1528,
    "preview": "---\ntitle: Use in Third Party Library\ndescription: How to use React Native Video in a third party library\nsidebar_positi"
  },
  {
    "path": "docs/docs/projects.md",
    "chars": 1884,
    "preview": "---\ntitle: Useful Projects\ndescription: React Native Video Useful Projects\nsidebar_class_name: hidden\n---\n# Useful Proje"
  },
  {
    "path": "docs/docs/updating.md",
    "chars": 6421,
    "preview": "---\ntitle: Updating\ndescription: React Native Video Updating Guide\nsidebar_class_name: hidden\n---\n\n## Upgrading from rea"
  },
  {
    "path": "docs/docs/video-view/_category_.json",
    "chars": 67,
    "preview": "{\n  \"label\": \"video-view\",\n  \"position\": 3,\n  \"collapsed\": false\n}\n"
  },
  {
    "path": "docs/docs/video-view/chapters.md",
    "chars": 2464,
    "preview": "---\nsidebar_position: 5\nsidebar_label: Chapters\ndescription: VideoView chapters support\ncustomProps:\n  plan: pro\n---\n\n# "
  },
  {
    "path": "docs/docs/video-view/events.md",
    "chars": 1277,
    "preview": "---\nsidebar_position: 3\nsidebar_label: Events\ndescription: VideoView event callbacks\n---\n\n# Events\n\n`VideoView` also acc"
  },
  {
    "path": "docs/docs/video-view/methods.md",
    "chars": 1152,
    "preview": "---\nsidebar_position: 4\nsidebar_label: Methods\ndescription: VideoView imperative methods\n---\n\n# Refs and Imperative Meth"
  },
  {
    "path": "docs/docs/video-view/props.md",
    "chars": 2422,
    "preview": "---\nsidebar_position: 2\nsidebar_label: Props\ndescription: VideoView component properties\n---\n\n# Props\n\n| Prop | Type | R"
  },
  {
    "path": "docs/docs/video-view/video-view.md",
    "chars": 1038,
    "preview": "---\nsidebar_position: 1\nsidebar_label: Introduction\ndescription: Introduction to VideoView component\n---\n\n# VideoView Co"
  },
  {
    "path": "docs/docusaurus.config.ts",
    "chars": 6343,
    "preview": "import type * as Preset from '@docusaurus/preset-classic';\nimport type { Config } from '@docusaurus/types';\nimport { cre"
  },
  {
    "path": "docs/package.json",
    "chars": 1524,
    "preview": "{\n  \"name\": \"@react-native-video/docs\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docus"
  },
  {
    "path": "docs/sidebars.ts",
    "chars": 1446,
    "preview": "import { TypedSidebarsConfig } from '@widlarzgroup/docusaurus-ui';\n\nconst sidebars: TypedSidebarsConfig = {\n  docsSideba"
  },
  {
    "path": "docs/src/components/Homepage/Enterprise/Enterprise.module.css",
    "chars": 1782,
    "preview": ".enterprise {\n  padding: 6rem 2rem;\n}\n\n.container {\n  max-width: 1200px;\n  margin: 0 auto;\n}\n\n.content {\n  display: grid"
  },
  {
    "path": "docs/src/components/Homepage/Enterprise/Enterprise.tsx",
    "chars": 2235,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport { FeatureCard, type FeatureCardItem } from './Fea"
  },
  {
    "path": "docs/src/components/Homepage/Enterprise/FeatureCard/FeatureCard.module.css",
    "chars": 851,
    "preview": ".card {\n  display: flex;\n  gap: 1rem;\n  padding: 1.25rem;\n  background: var(--color-bg-secondary);\n  border: 1px solid v"
  },
  {
    "path": "docs/src/components/Homepage/Enterprise/FeatureCard/FeatureCard.tsx",
    "chars": 621,
    "preview": "import React from 'react';\nimport styles from './FeatureCard.module.css';\n\nexport interface FeatureCardItem {\n  title: s"
  },
  {
    "path": "docs/src/components/Homepage/Features/Feature/Feature.module.css",
    "chars": 1429,
    "preview": ".card {\n  position: relative;\n  padding: 2rem;\n  border-radius: 16px;\n  background: var(--glass-bg);\n  border: 1px solid"
  },
  {
    "path": "docs/src/components/Homepage/Features/Feature/Feature.tsx",
    "chars": 549,
    "preview": "import React from 'react';\nimport styles from './Feature.module.css';\n\nexport interface FeatureItem {\n  title: string;\n "
  },
  {
    "path": "docs/src/components/Homepage/Features/Features.module.css",
    "chars": 1243,
    "preview": ".features {\n  padding: 6rem 2rem 8rem;\n  position: relative;\n  background: linear-gradient(180deg, transparent 0%, var(-"
  },
  {
    "path": "docs/src/components/Homepage/Features/Features.tsx",
    "chars": 2434,
    "preview": "import React from 'react';\nimport { Feature, type FeatureItem } from './Feature/Feature';\nimport styles from './Features"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Badge/Badge.module.css",
    "chars": 524,
    "preview": ".badge {\n  display: inline-flex;\n  align-items: center;\n  gap: 0.5rem;\n  padding: 0.5rem 1rem;\n  margin-bottom: 1.5rem;\n"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Badge/Badge.tsx",
    "chars": 566,
    "preview": "import React, { type ReactNode } from 'react';\nimport { motion } from 'motion/react';\nimport { itemVariants } from '../H"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Buttons/Buttons.module.css",
    "chars": 1148,
    "preview": ".buttons {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 1rem;\n  justify-content: center;\n}\n\n.primary,\n.secondary {\n  displ"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Buttons/Buttons.tsx",
    "chars": 868,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport { motion } from 'motion/react';\nimport { itemVari"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Hero.module.css",
    "chars": 2145,
    "preview": ".hero {\n  position: relative;\n  min-height: calc(100vh - var(--ifm-navbar-height));\n  display: flex;\n  flex-direction: c"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Hero.tsx",
    "chars": 2644,
    "preview": "import React, { useMemo } from 'react';\nimport { useDocsPreferredVersion } from '@docusaurus/theme-common';\nimport { mot"
  },
  {
    "path": "docs/src/components/Homepage/Hero/ScrollIndicator/ScrollIndicator.module.css",
    "chars": 492,
    "preview": ".indicator {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  display: flex;\n  flex-direction: column;\n  alig"
  },
  {
    "path": "docs/src/components/Homepage/Hero/ScrollIndicator/ScrollIndicator.tsx",
    "chars": 651,
    "preview": "import React from 'react';\nimport { motion } from 'motion/react';\nimport styles from './ScrollIndicator.module.css';\n\nin"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Stats/Stats.module.css",
    "chars": 562,
    "preview": ".stats {\n  display: flex;\n  gap: 4rem;\n  margin-top: 5rem;\n  padding-top: 3rem;\n  border-top: 1px solid var(--color-bord"
  },
  {
    "path": "docs/src/components/Homepage/Hero/Stats/Stats.tsx",
    "chars": 633,
    "preview": "import React from 'react';\nimport { motion } from 'motion/react';\nimport { itemVariants } from '../Hero';\nimport styles "
  },
  {
    "path": "docs/src/components/Intro/V7ApiModel/V7ApiModel.module.css",
    "chars": 779,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  margin-bottom: 1rem;\n}\n\n.text {\n  font-size: 1r"
  },
  {
    "path": "docs/src/components/Intro/V7ApiModel/V7ApiModel.tsx",
    "chars": 1035,
    "preview": "import React from 'react';\nimport styles from './V7ApiModel.module.css';\n\nconst USE_CASES = [\n  {\n    title: 'Video feed"
  },
  {
    "path": "docs/src/components/Intro/V7FeatureCards/V7FeatureCards.module.css",
    "chars": 1144,
    "preview": ".grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 1rem;\n  margin: 1.5rem 0 2rem;\n}\n\n.card {\n  pad"
  },
  {
    "path": "docs/src/components/Intro/V7FeatureCards/V7FeatureCards.tsx",
    "chars": 1624,
    "preview": "import React from 'react';\nimport styles from './V7FeatureCards.module.css';\n\ninterface FeatureCard {\n  title: string;\n "
  },
  {
    "path": "docs/src/components/Intro/V7Lead/V7Lead.module.css",
    "chars": 627,
    "preview": ".lead {\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  max-width: 800px;\n  margin-bottom: 1rem;\n}\n\n.text {\n  "
  },
  {
    "path": "docs/src/components/Intro/V7Lead/V7Lead.tsx",
    "chars": 754,
    "preview": "import React from 'react';\nimport styles from './V7Lead.module.css';\n\nexport function V7Lead() {\n  return (\n    <div cla"
  },
  {
    "path": "docs/src/components/Intro/V7NitroSection/V7NitroSection.module.css",
    "chars": 499,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n  gap: 0.75rem;\n  margin-bottom: 1rem;\n}\n\n.text {\n  font-size: 1"
  },
  {
    "path": "docs/src/components/Intro/V7NitroSection/V7NitroSection.tsx",
    "chars": 679,
    "preview": "import React from 'react';\nimport styles from './V7NitroSection.module.css';\n\nexport function V7NitroSection() {\n  retur"
  },
  {
    "path": "docs/src/components/Intro/V7OpenSource/V7OpenSource.module.css",
    "chars": 717,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n  gap: 0.75rem;\n}\n\n.text {\n  font-size: 1rem;\n  line-height: 1.7"
  },
  {
    "path": "docs/src/components/Intro/V7OpenSource/V7OpenSource.tsx",
    "chars": 502,
    "preview": "import React from 'react';\nimport styles from './V7OpenSource.module.css';\n\nexport function V7OpenSource() {\n  return (\n"
  },
  {
    "path": "docs/src/components/Intro/V7ProPlugins/V7ProPlugins.module.css",
    "chars": 2576,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  margin-top: 1rem;\n}\n\n.plugin {\n  padding: 1.5re"
  },
  {
    "path": "docs/src/components/Intro/V7ProPlugins/V7ProPlugins.tsx",
    "chars": 5644,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport styles from './V7ProPlugins.module.css';\n\nexport "
  },
  {
    "path": "docs/src/components/Intro/V7StatusTimeline/V7StatusTimeline.module.css",
    "chars": 1255,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  margin-bottom: 1rem;\n}\n\n.list {\n  margin: 0;\n  "
  },
  {
    "path": "docs/src/components/Intro/V7StatusTimeline/V7StatusTimeline.tsx",
    "chars": 1488,
    "preview": "import React from 'react';\nimport styles from './V7StatusTimeline.module.css';\n\nconst STATUS_POINTS = [\n  {\n    label: '"
  },
  {
    "path": "docs/src/components/Intro/index.ts",
    "chars": 420,
    "preview": "export { V7Lead } from './V7Lead/V7Lead';\nexport { V7FeatureCards } from './V7FeatureCards/V7FeatureCards';\nexport { V7A"
  },
  {
    "path": "docs/src/components/Offer/Contact/Contact.module.css",
    "chars": 2473,
    "preview": ".section {\n  padding: 3rem 0 4rem;\n}\n\n.sectionTitle {\n  font-size: 1.5rem;\n  font-weight: 700;\n  color: var(--color-text"
  },
  {
    "path": "docs/src/components/Offer/Contact/Contact.tsx",
    "chars": 1710,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport styles from './Contact.module.css';\n\nconst MailIc"
  },
  {
    "path": "docs/src/components/Offer/DecisionTable/DecisionTable.module.css",
    "chars": 2210,
    "preview": ".section {\n  padding: 3rem 0;\n  border-bottom: 1px solid var(--color-border);\n}\n\n.sectionTitle {\n  font-size: 1.5rem;\n  "
  },
  {
    "path": "docs/src/components/Offer/DecisionTable/DecisionTable.tsx",
    "chars": 2153,
    "preview": "import React from 'react';\nimport styles from './DecisionTable.module.css';\n\ninterface DecisionRow {\n  situation: string"
  },
  {
    "path": "docs/src/components/Offer/Extensions/Extensions.module.css",
    "chars": 3721,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n}\n\n.grid {\n  display: grid;\n  grid-template-columns: repeat(2, 1"
  },
  {
    "path": "docs/src/components/Offer/Extensions/Extensions.tsx",
    "chars": 2436,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport styles from './Extensions.module.css';\n\nconst Dow"
  },
  {
    "path": "docs/src/components/Offer/Hero/IntroHero.module.css",
    "chars": 2098,
    "preview": ".hero {\n  padding: 3rem 0 4rem;\n  border-bottom: 1px solid var(--color-border);\n}\n\n.content {\n  max-width: 700px;\n  disp"
  },
  {
    "path": "docs/src/components/Offer/Hero/IntroHero.tsx",
    "chars": 1255,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport styles from './IntroHero.module.css';\n\nconst CONT"
  },
  {
    "path": "docs/src/components/Offer/HowItWorks/HowItWorks.module.css",
    "chars": 1468,
    "preview": ".container {\n  display: flex;\n  flex-direction: column;\n}\n\n.flows {\n  display: flex;\n  flex-direction: column;\n  gap: 0."
  },
  {
    "path": "docs/src/components/Offer/HowItWorks/HowItWorks.tsx",
    "chars": 1927,
    "preview": "import React from 'react';\nimport styles from './HowItWorks.module.css';\n\ninterface FlowLine {\n  label: string;\n  steps:"
  },
  {
    "path": "docs/src/components/Offer/Migration/Migration.module.css",
    "chars": 2561,
    "preview": ".section {\n  padding: 3rem 0;\n  border-bottom: 1px solid var(--color-border);\n}\n\n.container {\n  display: flex;\n  gap: 1."
  },
  {
    "path": "docs/src/components/Offer/Migration/Migration.tsx",
    "chars": 1418,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport styles from './Migration.module.css';\n\nconst Migr"
  },
  {
    "path": "docs/src/components/Offer/OfferCards/OfferCards.module.css",
    "chars": 2913,
    "preview": ".section {\n  padding: 3rem 0;\n  border-bottom: 1px solid var(--color-border);\n}\n\n.sectionTitle {\n  font-size: 1.5rem;\n  "
  },
  {
    "path": "docs/src/components/Offer/OfferCards/OfferCards.tsx",
    "chars": 3257,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport styles from './OfferCards.module.css';\n\nconst Com"
  },
  {
    "path": "docs/src/components/Offer/Services/Services.module.css",
    "chars": 3270,
    "preview": ".section {\n  padding: 3rem 0;\n  border-bottom: 1px solid var(--color-border);\n}\n\n.sectionTitle {\n  font-size: 1.5rem;\n  "
  },
  {
    "path": "docs/src/components/Offer/Services/Services.tsx",
    "chars": 1918,
    "preview": "import React from 'react';\nimport Link from '@docusaurus/Link';\nimport styles from './Services.module.css';\n\nconst Rocke"
  },
  {
    "path": "docs/src/components/Offer/index.ts",
    "chars": 415,
    "preview": "export { IntroHero } from './Hero/IntroHero';\nexport { OfferCards } from './OfferCards/OfferCards';\nexport { HowItWorks "
  },
  {
    "path": "docs/src/components/PlatformsList/PlatformsList.module.css",
    "chars": 164,
    "preview": ".paragraphStyle {\n  margin-top: 10;\n}\n\n.spanStyle {\n  font-family: \"Orbitron\", sans-serif;\n  font-optical-sizing: auto;\n"
  },
  {
    "path": "docs/src/components/PlatformsList/PlatformsList.tsx",
    "chars": 548,
    "preview": "import React from 'react';\nimport styles from './PlatformsList.module.css';\n\ntype Platform =\n  | 'Android'\n  | 'iOS'\n  |"
  },
  {
    "path": "docs/src/css/custom.css",
    "chars": 592,
    "preview": "/**\n * Custom CSS for this project.\n * \n * We import base styles from @widlarzgroup/docusaurus-ui which:\n * - Overrides "
  },
  {
    "path": "docs/src/pages/index.module.css",
    "chars": 432,
    "preview": "/**\n * CSS files with the .module.css suffix will be treated as CSS modules\n * and scoped locally.\n */\n\n.heroBanner {\n  "
  },
  {
    "path": "docs/src/pages/index.tsx",
    "chars": 653,
    "preview": "import React from 'react';\nimport useDocusaurusContext from '@docusaurus/useDocusaurusContext';\nimport { Enterprise } fr"
  },
  {
    "path": "docs/static/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/tsconfig.json",
    "chars": 256,
    "preview": "{\n  // This file is not used in compilation. It is here just for a nice editor experience.\n  \"extends\": [\n    \"@docusaur"
  },
  {
    "path": "docs/versioned_docs/version-6.x/component/_category_.json",
    "chars": 179,
    "preview": "{\n  \"label\": \"Component\",\n  \"position\": 3,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Description of"
  },
  {
    "path": "docs/versioned_docs/version-6.x/component/ads.md",
    "chars": 1918,
    "preview": "---\nsidebar_position: 5\ntitle: Ads\ndescription: React Native Video Ads Integration\n---\n# Ads\n\n## IMA SDK\n\n`react-native-"
  },
  {
    "path": "docs/versioned_docs/version-6.x/component/drm.mdx",
    "chars": 5926,
    "preview": "---\nsidebar_position: 4\ntitle: DRM\ndescription: React Native Video DRM Integration\n---\nimport PlatformsList from \"@site/"
  },
  {
    "path": "docs/versioned_docs/version-6.x/component/events.mdx",
    "chars": 27618,
    "preview": "---\nsidebar_position: 2\ntitle: Events\ndescription: React Native Video Component Events\n---\n\nimport PlatformsList from \"@"
  },
  {
    "path": "docs/versioned_docs/version-6.x/component/methods.mdx",
    "chars": 6795,
    "preview": "---\nsidebar_position: 3\ntitle: Methods\ndescription: React Native Video Component Methods\n---\n\nimport PlatformsList from "
  },
  {
    "path": "docs/versioned_docs/version-6.x/component/props.mdx",
    "chars": 48088,
    "preview": "---\nsidebar_position: 1\ntitle: Props\ndescription: React Native Video Component Props\n---\n\nimport PlatformsList from \"@si"
  },
  {
    "path": "docs/versioned_docs/version-6.x/installation.md",
    "chars": 5306,
    "preview": "---\nsidebar_position: 2\n---\n\n# Installation\n\nUsing npm:\n\n```shell\nnpm install --save react-native-video\n```\n\nor using ya"
  },
  {
    "path": "docs/versioned_docs/version-6.x/intro.md",
    "chars": 2219,
    "preview": "---\nsidebar_position: 1\ntitle: Intro\n---\n# A `<Video>` Component for React Native\n\n## About\n`react-native-video` is a Re"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/_category_.json",
    "chars": 165,
    "preview": "{\n  \"label\": \"Other\",\n  \"position\": 4,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Other topics of Re"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/caching.md",
    "chars": 2104,
    "preview": "---\nsidebar_position: 3\ntitle: Caching\ndescription: React Native Video Caching Integration\n---\n# Caching\n\nCaching is sup"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/debug.md",
    "chars": 3941,
    "preview": "---\nsidebar_position: 2\ntitle: Debugging\ndescription: React Native Video Debugging Tips\n---\n# Debugging\n\nThis page provi"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/downloading.md",
    "chars": 2918,
    "preview": "---\nsidebar_position: 4\ntitle: Downloading\ndescription: React Native Video Integration with Offline Video SDK\n---\n# Offl"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/expo.md",
    "chars": 1681,
    "preview": "---\nsidebar_position: 1\ntitle: Expo\ndescription: React Native Video Expo Plugin\n---\n# Expo\n\n## Expo Plugin\n\nStarting fro"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/misc.md",
    "chars": 2800,
    "preview": "---\nsidebar_position: 5\ntitle: Miscellaneous\ndescription: React Native Video Miscellaneous & Tips\n---\n# Miscellaneous\n\n#"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/new-arch.md",
    "chars": 902,
    "preview": "---\nsidebar_position: 6\ntitle: New Architecture\ndescription: React Native Video New Architecture Support\n---\n# New Archi"
  },
  {
    "path": "docs/versioned_docs/version-6.x/other/plugin.md",
    "chars": 14629,
    "preview": "---\nsidebar_position: 4\ntitle: Plugins\ndescription: React Native Video Plugins Integration\n---\n# Plugins\n\nSince version "
  },
  {
    "path": "docs/versioned_docs/version-6.x/projects.md",
    "chars": 1845,
    "preview": "---\ntitle: Useful Projects\ndescription: React Native Video Useful Projects\nsidebar_class_name: hidden\n---\n# Useful Proje"
  },
  {
    "path": "docs/versioned_docs/version-6.x/updating.md",
    "chars": 2980,
    "preview": "---\ntitle: Updating\ndescription: React Native Video Updating Guide\nsidebar_class_name: hidden\n---\n# Updating\n\n## Version"
  },
  {
    "path": "docs/versioned_sidebars/version-6.x-sidebars.json",
    "chars": 1680,
    "preview": "{\n  \"docsSidebar\": [\n    {\n      \"type\": \"autogenerated\",\n      \"dirName\": \".\"\n    },\n    {\n      \"type\": \"html\",\n      "
  },
  {
    "path": "docs/versions.json",
    "chars": 12,
    "preview": "[\n  \"6.x\"\n]\n"
  },
  {
    "path": "example/.bundle/config",
    "chars": 59,
    "preview": "BUNDLE_PATH: \"vendor/bundle\"\nBUNDLE_FORCE_RUBY_PLATFORM: 1\n"
  },
  {
    "path": "example/.eslintrc.js",
    "chars": 150,
    "preview": "module.exports = {\n  root: true,\n  extends: [\"../config/.eslintrc.js\"],\n  parserOptions: {\n    tsconfigRootDir: __dirnam"
  },
  {
    "path": "example/.gitignore",
    "chars": 1111,
    "preview": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.p"
  },
  {
    "path": "example/.watchmanconfig",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "example/Gemfile",
    "chars": 349,
    "preview": "source 'https://rubygems.org'\n\n# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version\nruby \""
  },
  {
    "path": "example/android/app/build.gradle",
    "chars": 4640,
    "preview": "apply plugin: \"com.android.application\"\napply plugin: \"org.jetbrains.kotlin.android\"\napply plugin: \"com.facebook.react\"\n"
  },
  {
    "path": "example/android/app/proguard-rules.pro",
    "chars": 435,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /u"
  },
  {
    "path": "example/android/app/src/debug/AndroidManifest.xml",
    "chars": 313,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "example/android/app/src/main/AndroidManifest.xml",
    "chars": 1613,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permiss"
  },
  {
    "path": "example/android/app/src/main/java/com/videoexample/MainActivity.kt",
    "chars": 859,
    "preview": "package com.twg.videoexample\n\nimport com.facebook.react.ReactActivity\nimport com.facebook.react.ReactActivityDelegate\nim"
  },
  {
    "path": "example/android/app/src/main/java/com/videoexample/MainApplication.kt",
    "chars": 1670,
    "preview": "package com.twg.videoexample\n\nimport android.app.Application\nimport com.facebook.react.PackageList\nimport com.facebook.r"
  },
  {
    "path": "example/android/app/src/main/res/drawable/rn_edit_text_material.xml",
    "chars": 1917,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2014 The Android Open Source Project\n\n     Licensed under the "
  },
  {
    "path": "example/android/app/src/main/res/values/strings.xml",
    "chars": 75,
    "preview": "<resources>\n    <string name=\"app_name\">VideoExample</string>\n</resources>\n"
  },
  {
    "path": "example/android/app/src/main/res/values/styles.xml",
    "chars": 282,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.DayNight.NoActionBa"
  },
  {
    "path": "example/android/build.gradle",
    "chars": 547,
    "preview": "buildscript {\n    ext {\n        buildToolsVersion = \"35.0.0\"\n        minSdkVersion = 24\n        compileSdkVersion = 35\n "
  },
  {
    "path": "example/android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 253,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "example/android/gradle.properties",
    "chars": 1784,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "example/android/gradlew",
    "chars": 8739,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "example/android/gradlew.bat",
    "chars": 2966,
    "preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
  },
  {
    "path": "example/android/settings.gradle",
    "chars": 349,
    "preview": "pluginManagement { includeBuild(\"../../node_modules/@react-native/gradle-plugin\") }\nplugins { id(\"com.facebook.react.set"
  },
  {
    "path": "example/app.json",
    "chars": 62,
    "preview": "{\n  \"name\": \"VideoExample\",\n  \"displayName\": \"VideoExample\"\n}\n"
  },
  {
    "path": "example/babel.config.js",
    "chars": 72,
    "preview": "module.exports = {\n  presets: ['module:@react-native/babel-preset'],\n};\n"
  },
  {
    "path": "example/index.js",
    "chars": 191,
    "preview": "/**\n * @format\n */\n\nimport { AppRegistry } from 'react-native';\nimport { name as appName } from './app.json';\nimport App"
  },
  {
    "path": "example/ios/.xcode.env",
    "chars": 482,
    "preview": "# This `.xcode.env` file is versioned and is used to source the environment\n# used when running script phases inside Xco"
  },
  {
    "path": "example/ios/Podfile",
    "chars": 1224,
    "preview": "# Resolve react_native_pods.rb with node to allow for hoisting\nrequire Pod::Executable.execute_command('node', ['-p',\n  "
  },
  {
    "path": "example/ios/VideoExample/AppDelegate.swift",
    "chars": 1047,
    "preview": "//\n//  AppDelegate.swift\n//  VideoExample\n//\n//  Created by Krzysztof Moch on 31/01/2025.\n//\n\n\nimport UIKit\nimport React"
  },
  {
    "path": "example/ios/VideoExample/Images.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 849,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "example/ios/VideoExample/Images.xcassets/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/VideoExample/Info.plist",
    "chars": 1604,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "example/ios/VideoExample/LaunchScreen.storyboard",
    "chars": 4236,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "example/ios/VideoExample/PrivacyInfo.xcprivacy",
    "chars": 986,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "example/ios/VideoExample-Bridging-Header.h",
    "chars": 104,
    "preview": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
  },
  {
    "path": "example/ios/VideoExample.xcodeproj/project.pbxproj",
    "chars": 24651,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "example/ios/VideoExample.xcodeproj/xcshareddata/xcschemes/VideoExample.xcscheme",
    "chars": 3330,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1210\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "example/ios/VideoExample.xcworkspace/contents.xcworkspacedata",
    "chars": 230,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:VideoExample.x"
  },
  {
    "path": "example/ios/VideoExampleTests/Info.plist",
    "chars": 733,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "example/ios/VideoExampleTests/VideoExampleTests.m",
    "chars": 2000,
    "preview": "#import <UIKit/UIKit.h>\n#import <XCTest/XCTest.h>\n\n#import <React/RCTLog.h>\n#import <React/RCTRootView.h>\n\n#define TIMEO"
  },
  {
    "path": "example/metro.config.js",
    "chars": 1101,
    "preview": "const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');\nconst path = require('path');\nconst escap"
  },
  {
    "path": "example/package.json",
    "chars": 1235,
    "preview": "{\n  \"name\": \"react-native-video-example\",\n  \"version\": \"7.0.0-beta.7\",\n  \"private\": true,\n  \"scripts\": {\n    \"android\": "
  },
  {
    "path": "example/src/App.tsx",
    "chars": 15226,
    "preview": "import Slider from '@react-native-community/slider';\nimport React from 'react';\nimport { Alert, SafeAreaView, ScrollView"
  },
  {
    "path": "example/src/components/Controls.tsx",
    "chars": 1673,
    "preview": "import React from 'react';\nimport { Switch, Text, TouchableOpacity, View } from 'react-native';\nimport { styles } from '"
  },
  {
    "path": "example/src/components/TextTrackManager.tsx",
    "chars": 4932,
    "preview": "import React from 'react';\nimport { Text, TouchableOpacity, View } from 'react-native';\nimport { useEvent, type TextTrac"
  },
  {
    "path": "example/src/styles.ts",
    "chars": 5836,
    "preview": "import { StyleSheet } from 'react-native';\n\nexport const styles = StyleSheet.create({\n  app: {\n    flex: 1,\n    backgrou"
  },
  {
    "path": "example/src/types/videoSettings.ts",
    "chars": 830,
    "preview": "import type {\n  IgnoreSilentSwitchMode,\n  MixAudioMode,\n  ResizeMode,\n} from 'react-native-video';\n\nexport interface Vid"
  },
  {
    "path": "example/src/utils/time.ts",
    "chars": 208,
    "preview": "export const formatTime = (seconds: number) => {\n  if (isNaN(seconds)) return '--:--';\n  const m = Math.floor(seconds / "
  },
  {
    "path": "example/src/utils/videoSource.ts",
    "chars": 4077,
    "preview": "import { Platform } from 'react-native';\nimport type { VideoConfig } from 'react-native-video';\nimport {\n  enable as ena"
  },
  {
    "path": "example/tsconfig.json",
    "chars": 230,
    "preview": "{\n  \"extends\": [\n    \"@react-native/typescript-config/tsconfig.json\",\n    \"../config/tsconfig.json\"\n  ],\n  \"include\": [\""
  },
  {
    "path": "lefthook.yml",
    "chars": 468,
    "preview": "pre-commit:\n  parallel: true\n  commands:\n    lint:\n      glob: \"*.{js,ts,jsx,tsx}\"\n      exclude: \"docs/**/*\"\n      run:"
  },
  {
    "path": "package.json",
    "chars": 3458,
    "preview": "{\n  \"name\": \"react-native-video-monorepo\",\n  \"packageManager\": \"bun@1.1.42\",\n  \"version\": \"7.0.0-beta.8\",\n  \"private\": t"
  },
  {
    "path": "packages/drm-plugin/.eslintrc.js",
    "chars": 153,
    "preview": "module.exports = {\n  root: true,\n  extends: ['../../config/.eslintrc.js'],\n  parserOptions: {\n    tsconfigRootDir: __dir"
  },
  {
    "path": "packages/drm-plugin/.gitattributes",
    "chars": 72,
    "preview": "*.pbxproj -text\n# specific for windows script files\n*.bat text eol=crlf\n"
  },
  {
    "path": "packages/drm-plugin/.gitignore",
    "chars": 825,
    "preview": "# OSX\n#\n.DS_Store\n\n# XDE\n.expo/\n\n# VSCode\n.vscode/\njsconfig.json\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n"
  },
  {
    "path": "packages/drm-plugin/.watchmanconfig",
    "chars": 2,
    "preview": "{}"
  },
  {
    "path": "packages/drm-plugin/README.md",
    "chars": 3868,
    "preview": "# @react-native-video/drm\n\nDRM plugin for react-native-video. It adds Widevine (Android) and FairPlay (iOS, visionOS) pl"
  },
  {
    "path": "packages/drm-plugin/ReactNativeVideoDrm.podspec",
    "chars": 846,
    "preview": "require \"json\"\n\npackage = JSON.parse(File.read(File.join(__dir__, \"package.json\")))\n\nPod::Spec.new do |s|\n  s.name      "
  },
  {
    "path": "packages/drm-plugin/android/CMakeLists.txt",
    "chars": 624,
    "preview": "project(ReactNativeVideoDrm)\ncmake_minimum_required(VERSION 3.9.0)\n\nset(PACKAGE_NAME ReactNativeVideoDrm)\nset(CMAKE_VERB"
  },
  {
    "path": "packages/drm-plugin/android/build.gradle",
    "chars": 3262,
    "preview": "buildscript {\n  ext.getExtOrDefault = {name ->\n    return rootProject.ext.has(name) ? rootProject.ext.get(name) : projec"
  },
  {
    "path": "packages/drm-plugin/android/gradle.properties",
    "chars": 149,
    "preview": "VideoDrm_kotlinVersion=2.0.21\nVideoDrm_minSdkVersion=24\nVideoDrm_targetSdkVersion=34\nVideoDrm_compileSdkVersion=35\nVideo"
  },
  {
    "path": "packages/drm-plugin/android/src/main/AndroidManifest.xml",
    "chars": 82,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n</manifest>\n"
  },
  {
    "path": "packages/drm-plugin/android/src/main/cpp/cpp-adapter.cpp",
    "chars": 167,
    "preview": "#include <jni.h>\n#include \"ReactNativeVideoDrmOnLoad.hpp\"\n\nJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {\n  retu"
  },
  {
    "path": "packages/drm-plugin/android/src/main/java/com/twg/videodrm/DRMManager/DRMManager.kt",
    "chars": 3449,
    "preview": "package com.twg.videodrm.DRMManager\n\nimport android.content.Context\nimport androidx.annotation.OptIn\nimport androidx.med"
  },
  {
    "path": "packages/drm-plugin/android/src/main/java/com/twg/videodrm/DRMPlugin.kt",
    "chars": 415,
    "preview": "package com.twg.videodrm\n\nimport com.twg.videodrm.DRMManager.DRMManager\nimport com.twg.video.core.player.DRMManagerSpec\n"
  },
  {
    "path": "packages/drm-plugin/android/src/main/java/com/twg/videodrm/PluginManager.kt",
    "chars": 1031,
    "preview": "package com.margelo.nitro.videodrm\n  \nimport com.facebook.proguard.annotations.DoNotStrip\nimport com.twg.videodrm.DRMPlu"
  },
  {
    "path": "packages/drm-plugin/android/src/main/java/com/twg/videodrm/VideoDrmPackage.kt",
    "chars": 650,
    "preview": "package com.twg.videodrm\n\nimport com.facebook.react.TurboReactPackage\nimport com.facebook.react.bridge.NativeModule\nimpo"
  },
  {
    "path": "packages/drm-plugin/babel.config.js",
    "chars": 257,
    "preview": "module.exports = {\n  overrides: [\n    {\n      exclude: /\\/node_modules\\//,\n      presets: ['module:react-native-builder-"
  },
  {
    "path": "packages/drm-plugin/ios/DRMManager/DRMManager+AVContentKeySessionDelegate.swift",
    "chars": 1648,
    "preview": "//\n//  DRMManager+AVContentKeySessionDelegate.swift\n//  ReactNativeVideoDrm\n//\n//  Created by Krzysztof Moch on 07/08/20"
  },
  {
    "path": "packages/drm-plugin/ios/DRMManager/DRMManager.swift",
    "chars": 6422,
    "preview": "//\n//  DRMManager.swift\n//  ReactNativeVideoDrm\n//\n//  Created by Krzysztof Moch on 07/08/2025.\n//\n\nimport AVFoundation\n"
  },
  {
    "path": "packages/drm-plugin/ios/DRMPlugin.swift",
    "chars": 538,
    "preview": "//\n//  DRMPlugin.swift\n//  ReactNativeVideoDrm\n//\n//  Created by Krzysztof Moch on 07/08/2025.\n//\n\nimport Foundation\nimp"
  }
]

// ... and 416 more files (download for full content)

About this extraction

This page contains the full source code of the TheWidlarzGroup/react-native-video GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 616 files (1.7 MB), approximately 444.2k tokens, and a symbol index with 1610 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!