@@ -20,7 +36,7 @@ function HomepageHeader() {
+ to={link}>
Get Started
diff --git a/docs/src/theme/DocItem/Footer/index.tsx b/docs/src/theme/DocItem/Footer/index.tsx
new file mode 100644
index 00000000..e2380f11
--- /dev/null
+++ b/docs/src/theme/DocItem/Footer/index.tsx
@@ -0,0 +1,16 @@
+import type { WrapperProps } from '@docusaurus/types';
+import TWGBadge from '@site/src/components/TWGBadge/TWGBadge';
+import Footer from '@theme-original/DocItem/Footer';
+import type FooterType from '@theme/DocItem/Footer';
+import { type ReactNode } from 'react';
+
+type Props = WrapperProps
;
+
+export default function FooterWrapper(props: Props): ReactNode {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/docs/src/theme/TOC/index.tsx b/docs/src/theme/TOC/index.tsx
new file mode 100644
index 00000000..add6cc57
--- /dev/null
+++ b/docs/src/theme/TOC/index.tsx
@@ -0,0 +1,25 @@
+import type { Props } from '@theme/TOC';
+import TOCItems from '@theme/TOCItems';
+import clsx from 'clsx';
+import { type ReactNode } from 'react';
+
+import TWGBadge from '@site/src/components/TWGBadge/TWGBadge';
+import styles from './styles.module.css';
+
+// Using a custom className
+// This prevents TOCInline/TOCCollapsible getting highlighted by mistake
+const LINK_CLASS_NAME = 'table-of-contents__link toc-highlight';
+const LINK_ACTIVE_CLASS_NAME = 'table-of-contents__link--active';
+
+export default function TOC({className, ...props}: Props): ReactNode {
+ return (
+
+
+
+
+ );
+}
diff --git a/docs/src/theme/TOC/styles.module.css b/docs/src/theme/TOC/styles.module.css
new file mode 100644
index 00000000..4b5d9f46
--- /dev/null
+++ b/docs/src/theme/TOC/styles.module.css
@@ -0,0 +1,16 @@
+.tableOfContents {
+ max-height: calc(100vh - (var(--ifm-navbar-height) + 2rem));
+ overflow-y: auto;
+ position: sticky;
+ top: calc(var(--ifm-navbar-height) + 1rem);
+}
+
+@media (max-width: 996px) {
+ .tableOfContents {
+ display: none;
+ }
+
+ .docItemContainer {
+ padding: 0 0.3rem;
+ }
+}
diff --git a/docs/versioned_docs/version-6.x/assets/AppTransportSecuritySetting.png b/docs/versioned_docs/version-6.x/assets/AppTransportSecuritySetting.png
new file mode 100644
index 00000000..b57be9a4
Binary files /dev/null and b/docs/versioned_docs/version-6.x/assets/AppTransportSecuritySetting.png differ
diff --git a/docs/versioned_docs/version-6.x/assets/tvOS-step-1.jpg b/docs/versioned_docs/version-6.x/assets/tvOS-step-1.jpg
new file mode 100644
index 00000000..742304d6
Binary files /dev/null and b/docs/versioned_docs/version-6.x/assets/tvOS-step-1.jpg differ
diff --git a/docs/versioned_docs/version-6.x/assets/tvOS-step-2.jpg b/docs/versioned_docs/version-6.x/assets/tvOS-step-2.jpg
new file mode 100644
index 00000000..3e955050
Binary files /dev/null and b/docs/versioned_docs/version-6.x/assets/tvOS-step-2.jpg differ
diff --git a/docs/versioned_docs/version-6.x/assets/tvOS-step-3.jpg b/docs/versioned_docs/version-6.x/assets/tvOS-step-3.jpg
new file mode 100644
index 00000000..395cd379
Binary files /dev/null and b/docs/versioned_docs/version-6.x/assets/tvOS-step-3.jpg differ
diff --git a/docs/versioned_docs/version-6.x/assets/tvOS-step-4.jpg b/docs/versioned_docs/version-6.x/assets/tvOS-step-4.jpg
new file mode 100644
index 00000000..c709618b
Binary files /dev/null and b/docs/versioned_docs/version-6.x/assets/tvOS-step-4.jpg differ
diff --git a/docs/versioned_docs/version-6.x/component/_category_.json b/docs/versioned_docs/version-6.x/component/_category_.json
new file mode 100644
index 00000000..59b5fb8a
--- /dev/null
+++ b/docs/versioned_docs/version-6.x/component/_category_.json
@@ -0,0 +1,9 @@
+{
+ "label": "Component",
+ "position": 3,
+ "link": {
+ "type": "generated-index",
+ "description": "Description of React Native Video Component"
+ },
+ "collapsed": false
+}
diff --git a/docs/versioned_docs/version-6.x/component/ads.md b/docs/versioned_docs/version-6.x/component/ads.md
new file mode 100644
index 00000000..1a1b6135
--- /dev/null
+++ b/docs/versioned_docs/version-6.x/component/ads.md
@@ -0,0 +1,48 @@
+---
+sidebar_position: 5
+title: Ads
+description: React Native Video Ads Integration
+---
+# Ads
+
+## IMA SDK
+
+`react-native-video` includes built-in support for Google IMA SDK on Android and iOS. To enable it, refer to the [installation section](../installation.md).
+
+### Usage
+
+To use AVOD (Ad-Supported Video on Demand), pass the `adTagUrl` prop to the `Video` component. The `adTagUrl` should be a VAST-compliant URI.
+
+#### Example:
+
+```jsx
+adTagUrl="https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/vmap_ad_samples&sz=640x480&cust_params=sample_ar%3Dpremidpostoptimizedpodbumper&ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&env=vp&impl=s&cmsid=496&vid=short_onecue&correlator="
+```
+
+> **Note:** Video ads cannot start when Picture-in-Picture (PiP) mode is active on iOS. More details are available in the [Google IMA SDK Docs](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/picture_in_picture?hl=en#starting_ads). If you are using custom controls, hide the PiP button when receiving the `STARTED` event from `onReceiveAdEvent` and show it again when receiving the `ALL_ADS_COMPLETED` event.
+
+### Events
+
+To receive events from the IMA SDK, pass the `onReceiveAdEvent` prop to the `Video` component. The full list of supported events is available [here](https://github.com/TheWidlarzGroup/react-native-video/blob/master/src/types/Ads.ts).
+
+#### Example:
+
+```jsx
+...
+onReceiveAdEvent={event => console.log(event)}
+...
+```
+
+### Localization
+
+To change the language of the IMA SDK, pass the `adLanguage` prop to the `Video` component. The list of supported languages is available [here](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/localization#locale-codes).
+
+- By default, **iOS** uses the system language, and **Android** defaults to `en` (English).
+
+#### Example:
+
+```jsx
+...
+adLanguage="fr"
+...
+```
diff --git a/docs/versioned_docs/version-6.x/component/drm.mdx b/docs/versioned_docs/version-6.x/component/drm.mdx
new file mode 100644
index 00000000..b502cf70
--- /dev/null
+++ b/docs/versioned_docs/version-6.x/component/drm.mdx
@@ -0,0 +1,211 @@
+---
+sidebar_position: 4
+title: DRM
+description: React Native Video DRM Integration
+---
+import PlatformsList from "@site/src/components/PlatformsList/PlatformsList.tsx";
+
+# DRM
+
+## DRM Example
+
+We provide a sample implementation in the [example app](https://github.com/TheWidlarzGroup/react-native-video/blob/master/examples/common/DRMExample.tsx) demonstrating how to use DRM with `react-native-video`. You’ll need a valid token—visit [our site](https://www.thewidlarzgroup.com/services/free-drm-token-generator-for-video?utm_source=rnv&utm_medium=docs&utm_campaign=drm&utm_id=text) to obtain a **free 24-hour token**.
+
+## DRM Offline
+
+If you need DRM-protected content available offline, our [Offline Video SDK](https://www.thewidlarzgroup.com/offline-video-sdk/?utm_source=rnv&utm_medium=docs&utm_campaign=drm&utm_id=offline-video-sdk-link) enables downloading, storing, and managing streams with and without DRM. It also handles many edge cases you may encounter over time.
+
+### Prerequisites:
+
+- Use `react-native-video` v6 or v7. If you're still on v5 or lower, [contact us](https://www.thewidlarzgroup.com/?utm_source=rnv&utm_medium=docs&utm_campaign=drm&utm_id=upgrade-contact#Contact) for assistance.
+
+> Supporting our software kits helps maintain this open-source project. Thank you!
+
+## Providing DRM Data (Tested with HTTP/HTTPS Assets)
+
+You can configure DRM playback by providing a DRM object with the following properties. This feature disables the use of `TextureView` on Android.
+
+### DRM Properties
+
+### `base64Certificate`
+
+
+
+**Type:** boolean
+**Default:** `false`
+
+Indicates whether the certificate URL returns data in Base64 format.
+
+### `certificateUrl`
+
+
+
+**Type:** string
+**Default:** `undefined`
+
+The URL used to fetch a valid certificate for FairPlay.
+
+### `getLicense`
+
+
+
+**Type:** function
+**Default:** `undefined`
+
+Instead of setting `licenseServer`, you can manually acquire the license in JavaScript and send the result to the native module for FairPlay DRM configuration.
+
+The following parameters are available in `getLicense`:
+
+- `contentId`: The content ID from the DRM object or `loadingRequest.request.url?.host`
+- `loadedLicenseUrl`: The URL retrieved from `loadingRequest.request.URL.absoluteString`, starting with `skd://` or `clearkey://`
+- `licenseServer`: The URL passed in the DRM object
+- `spcString`: The SPC used for DRM validation
+
+You should return a Base64-encoded CKC response, either directly or as a `Promise`.
+
+#### Example:
+
+```js
+getLicense: (spcString, contentId, licenseUrl, loadedLicenseUrl) => {
+ const base64spc = Base64.encode(spcString);
+ const formData = new FormData();
+ formData.append("spc", base64spc);
+ return fetch(`https://license.pallycon.com/ri/licenseManager.do`, {
+ method: "POST",
+ headers: {
+ "pallycon-customdata-v2": "your-custom-header",
+ "Content-Type": "application/x-www-form-urlencoded",
+ },
+ body: formData,
+ })
+ .then((response) => response.text())
+ .then((response) => response)
+ .catch((error) => console.error("Error", error));
+};
+```
+
+### `contentId`
+
+
+
+**Type:** string
+**Default:** `undefined`
+
+Sets the content ID for the stream. If not specified, the system uses the host value from `loadingRequest.request.URL.host`.
+
+### `headers`
+
+
+
+**Type:** Object
+**Default:** `undefined`
+
+Custom headers for the license server request.
+
+#### Example:
+
+```js
+drm: {
+ type: DRMType.WIDEVINE,
+ licenseServer: 'https://drm-widevine-licensing.axtest.net/AcquireLicense',
+ headers: {
+ 'X-AxDRM-Message': 'your-drm-header',
+ },
+}
+```
+
+### `licenseServer`
+
+
+
+**Type:** string
+**Default:** `undefined`
+
+The license server URL that authorizes protected content playback.
+
+### `multiDrm`
+
+
+
+**Type:** boolean
+**Default:** `false`
+
+Indicates whether the DRM system should support key rotation. See [Android Developer Docs](https://developer.android.google.cn/media/media3/exoplayer/drm?hl=en#key-rotation) for more details.
+
+### `type`
+
+
+
+**Type:** DRMType
+**Default:** `undefined`
+
+Defines the DRM type:
+
+- **Android:** `DRMType.WIDEVINE`, `DRMType.PLAYREADY`, `DRMType.CLEARKEY`
+- **iOS:** `DRMType.FAIRPLAY`
+
+### `localSourceEncryptionKeyScheme`
+
+
+
+**Type:** string
+
+Sets the URL scheme for stream encryption keys used in local assets.
+
+#### Example:
+
+```js
+localSourceEncryptionKeyScheme = "my-offline-key";
+```
+
+## Common Usage Scenarios
+
+### Sending Cookies to the License Server
+
+You can send cookies using the `headers` prop.
+
+#### Example:
+
+```js
+drm: {
+ type: DRMType.WIDEVINE,
+ licenseServer: 'https://drm-widevine-licensing.axtest.net/AcquireLicense',
+ headers: {
+ 'Cookie': 'PHPSESSID=your-session-id; csrftoken=mytoken; _gat=1; foo=bar'
+ },
+}
+```
+
+### Custom License Acquisition (iOS Only)
+
+#### Example:
+
+```js
+drm: {
+ type: DRMType.FAIRPLAY,
+ getLicense: (spcString) => {
+ const base64spc = Base64.encode(spcString);
+ return fetch('YOUR_LICENSE_SERVER_URL', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ },
+ body: JSON.stringify({
+ getFairplayLicense: {
+ foo: 'bar',
+ spcMessage: base64spc,
+ }
+ })
+ })
+ .then(response => response.json())
+ .then((response) => {
+ if (response?.getFairplayLicenseResponse?.ckcResponse) {
+ return response.getFairplayLicenseResponse.ckcResponse;
+ }
+ throw new Error('No valid response');
+ })
+ .catch((error) => console.error('CKC error', error));
+ }
+}
+```
diff --git a/docs/versioned_docs/version-6.x/component/events.mdx b/docs/versioned_docs/version-6.x/component/events.mdx
new file mode 100644
index 00000000..9d389a78
--- /dev/null
+++ b/docs/versioned_docs/version-6.x/component/events.mdx
@@ -0,0 +1,675 @@
+---
+sidebar_position: 2
+title: Events
+description: React Native Video Component Events
+---
+
+import PlatformsList from "@site/src/components/PlatformsList/PlatformsList.tsx";
+
+# Events
+
+This page lists all available callbacks for handling player notifications.
+
+## Details
+
+### `onAudioBecomingNoisy`
+
+
+
+Triggered when audio output changes (e.g., switching from headphones to speakers). It's recommended to pause the media when this event occurs.
+
+**Payload:** _none_
+
+---
+
+### `onAudioFocusChanged`
+
+
+
+Called when audio focus is gained or lost.
+
+**Payload:**
+| Property | Type | Description |
+|---------------|--------|----------------------------------------------|
+| hasAudioFocus | boolean | `true` if media has audio focus, `false` otherwise |
+
+**Example:**
+
+```javascript
+{
+ hasAudioFocus: true;
+}
+```
+
+---
+
+### `onAudioTracks`
+
+
+
+Triggered when available audio tracks change.
+
+**Payload:** _Array of objects with track details_
+
+| Property | Type | Description |
+| -------- | ------- | -------------------------------------------------------------------------------- |
+| index | number | Internal track ID |
+| title | string | Descriptive track name |
+| language | string | [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) language code |
+| bitrate | number | Track bitrate |
+| type | string | Track MIME type |
+| selected | boolean | `true` if track is currently playing |
+
+**Example:**
+
+```javascript
+{
+ audioTracks: [
+ {
+ language: "es",
+ title: "Spanish",
+ type: "audio/mpeg",
+ index: 0,
+ selected: true,
+ },
+ { language: "en", title: "English", type: "audio/mpeg", index: 1 },
+ ];
+}
+```
+
+---
+
+### `onBandwidthUpdate`
+
+
+
+Called when available bandwidth changes.
+
+**Payload:**
+| Property | Type | Description |
+|----------|--------|-----------------------------------------------|
+| bitrate | number | Estimated bitrate in bits/sec |
+| width | number | Video width (Android only) |
+| height | number | Video height (Android only) |
+| trackId | string | Video track ID (Android only) |
+
+**Example (iOS):**
+
+```javascript
+{
+ bitrate: 1000000;
+}
+```
+
+**Example (Android):**
+
+```javascript
+{
+ bitrate: 1000000,
+ width: 1920,
+ height: 1080,
+ trackId: 'some-track-id'
+}
+```
+
+> **Note:** On Android, set the [`reportBandwidth`](#reportbandwidth) prop to enable this event.
+
+---
+
+### `onBuffer`
+
+
+
+Triggered when buffering starts or stops.
+
+**Payload:**
+| Property | Type | Description |
+|------------|--------|---------------------------------|
+| isBuffering | boolean | `true` if buffering is active |
+
+**Example:**
+
+```javascript
+{
+ isBuffering: true;
+}
+```
+
+---
+
+### `onControlsVisibilityChange`
+
+
+
+Triggered when the video player controls become visible or hidden.
+
+**Payload:**
+| Property | Type | Description |
+|----------|--------|-------------------------------------|
+| isVisible | boolean | `true` if controls are visible |
+
+**Example:**
+
+```javascript
+{
+ isVisible: true;
+}
+```
+
+---
+
+### `onEnd`
+
+
+
+Triggered when the media reaches the end.
+
+**Payload:** _none_
+
+---
+
+### `onError`
+
+
+
+Called when a playback error occurs.
+
+**Payload:**
+| Property | Type | Description |
+|---------|--------|---------------------------|
+| error | object | Error details |
+
+---
+
+### `onExternalPlaybackChange`
+
+
+
+Called when external playback mode changes (e.g., Apple TV connection/disconnection).
+
+**Payload:**
+| Property | Type | Description |
+|-------------------------|--------|--------------------------------------------|
+| isExternalPlaybackActive | boolean | `true` if external playback is active |
+
+**Example:**
+
+```javascript
+{
+ isExternalPlaybackActive: true;
+}
+```
+
+---
+
+### `onFullscreenPlayerWillPresent`
+
+
+
+Called before entering fullscreen mode.
+
+**Payload:** _none_
+
+---
+
+### `onFullscreenPlayerDidPresent`
+
+
+
+Called when fullscreen mode is active.
+
+**Payload:** _none_
+
+---
+
+### `onFullscreenPlayerWillDismiss`
+
+
+
+Called before exiting fullscreen mode.
+
+**Payload:** _none_
+
+---
+
+### `onFullscreenPlayerDidDismiss`
+
+
+
+Called when fullscreen mode is exited.
+
+**Payload:** _none_
+
+---
+
+### `onLoad`
+
+
+
+Triggered when the media is loaded and ready to play.
+
+### Payload:
+
+| Property | Type | Description |
+| ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| currentTime | number | Time in seconds where the media will start |
+| duration | number | Length of the media in seconds |
+| naturalSize | object | Properties:
width - Width in pixels that the video was encoded at
height - Height in pixels that the video was encoded at
orientation - "portrait", "landscape" or "square" |
+| audioTracks | array | An array of audio track info objects with the following properties:
index - Index number
title - Description of the track
language - 2 letter [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) or 3 letter [ISO639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) language code
type - Mime type of track |
+| textTracks | array | An array of text track info objects with the following properties:
index - Index number
title - Description of the track
language - 2 letter [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) or 3 letter [ISO 639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) language code
type - Mime type of track |
+| videoTracks | array | An array of video track info objects with the following properties:
trackId - ID for the track
bitrate - Bit rate in bits per second
codecs - Comma separated list of codecs
height - Height of the video
width - Width of the video |
+| trackId | string | Provide key information about the video track, typically including: `Resolution`, `Bitrate`. |
+
+**Example:**
+
+```js
+{
+ canPlaySlowForward: true,
+ canPlayReverse: false,
+ canPlaySlowReverse: false,
+ canPlayFastForward: false,
+ canStepForward: false,
+ canStepBackward: false,
+ currentTime: 0,
+ duration: 5910.208984375,
+ naturalSize: {
+ height: 1080
+ orientation: 'landscape'
+ width: '1920'
+ },
+ audioTracks: [
+ { language: 'es', title: 'Spanish', type: 'audio/mpeg', index: 0 },
+ { language: 'en', title: 'English', type: 'audio/mpeg', index: 1 }
+ ],
+ textTracks: [
+ { title: '#1 French', language: 'fr', index: 0, type: 'text/vtt' },
+ { title: '#2 English CC', language: 'en', index: 1, type: 'text/vtt' },
+ { title: '#3 English Director Commentary', language: 'en', index: 2, type: 'text/vtt' }
+ ],
+ videoTracks: [
+ { index: 0, bitrate: 3987904, codecs: "avc1.640028", height: 720, trackId: "f1-v1-x3", width: 1280 },
+ { index: 1, bitrate: 7981888, codecs: "avc1.640028", height: 1080, trackId: "f2-v1-x3", width: 1920 },
+ { index: 2, bitrate: 1994979, codecs: "avc1.4d401f", height: 480, trackId: "f3-v1-x3", width: 848 }
+ ],
+ trackId: "720p 2400kbps",
+}
+```
+
+> **Note:** `audioTracks`, `textTracks`, and `videoTracks` are not available on the web.
+
+---
+
+### `onLoadStart`
+
+
+
+Triggered when media starts loading.
+
+**Payload:**
+| Property | Type | Description |
+|----------|--------|-------------------------------------|
+| isNetwork | boolean | `true` if media is loaded from a network |
+| type | string | Media type (not available on Windows) |
+| uri | string | Media source URI (not available on Windows) |
+
+**Example:**
+
+```javascript
+{
+ isNetwork: true,
+ type: '',
+ uri: 'https://example.com/video.mp4'
+}
+```
+
+---
+
+### `onPlaybackStateChanged`
+
+
+
+Triggered when playback state changes.
+
+**Payload:**
+| Property | Type | Description |
+|----------|--------|-------------------------------------|
+| isPlaying | boolean | `true` if media is playing |
+| isSeeking | boolean | `true` if seeking is in progress |
+
+**Example:**
+
+```javascript
+{
+ isPlaying: true,
+ isSeeking: false
+}
+```
+
+---
+
+### `onPictureInPictureStatusChanged`
+
+
+
+Triggered when Picture-in-Picture (PiP) mode is activated or deactivated.
+
+**Payload:**
+| Property | Type | Description |
+|----------|--------|----------------------------------|
+| isActive | boolean | `true` if PiP mode is active |
+
+**Example:**
+
+```javascript
+{
+ isActive: true;
+}
+```
+
+---
+
+### `onPlaybackRateChange`
+
+
+
+Triggered when playback speed changes.
+
+**Payload:**
+| Property | Type | Description |
+|-------------|--------|---------------------------------|
+| playbackRate | number | `0` (paused), `1` (normal speed), other values indicate speed changes |
+
+**Example:**
+
+```javascript
+{
+ playbackRate: 0; // indicates paused
+}
+```
+
+---
+
+### `onProgress`
+
+
+
+Triggered every `progressUpdateInterval` milliseconds, providing information about the current playback position.
+
+**Payload:**
+| Property | Type | Description |
+|----------------|--------|-------------------------------------------------------------------------|
+| currentTime | number | Current playback position (seconds) |
+| playableDuration | number | Duration that can be played using only the buffer (seconds) |
+| seekableDuration | number | Duration that can be seeked to (usually the total length of the media) |
+
+**Example:**
+
+```javascript
+{
+ currentTime: 5.2,
+ playableDuration: 34.6,
+ seekableDuration: 888
+}
+```
+
+---
+
+### `onReadyForDisplay`
+
+
+
+Triggered when the first video frame is ready to be displayed. This is when the poster is removed.
+
+**Payload:** _none_
+
+- iOS: [`readyForDisplay`](https://developer.apple.com/documentation/avkit/avplayerviewcontroller/1615830-readyfordisplay?language=objc)
+- Android: [`STATE_READY`](https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/Player.html#STATE_READY)
+
+---
+
+### `onReceiveAdEvent`
+
+
+
+Triggered when an AdEvent is received from the IMA SDK.
+
+Enum `AdEvent` possible values for [Android](https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/reference/js/google.ima.AdEvent) and [iOS](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Enums/IMAAdEventType):
+
+
+ AdEvent
+
+| Event | Platform | Description |
+| -------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `AD_BREAK_ENDED` | iOS | Fired the first time each ad break ends. Applications must reenable seeking when this occurs (only used for dynamic ad insertion). |
+| `AD_BREAK_READY` | Android, iOS | Fires when an ad rule or a VMAP ad break would have played if autoPlayAdBreaks is false. |
+| `AD_BREAK_STARTED` | iOS | Fired first time each ad break begins playback. If an ad break is watched subsequent times this will not be fired. Applications must disable seeking when this occurs (only used for dynamic ad insertion). |
+| `AD_BUFFERING` | Android | Fires when the ad has stalled playback to buffer. |
+| `AD_CAN_PLAY` | Android | Fires when the ad is ready to play without buffering, either at the beginning of the ad or after buffering completes. |
+| `AD_METADATA` | Android | Fires when an ads list is loaded. |
+| `AD_PERIOD_ENDED` | iOS | Fired every time the stream switches from advertising or slate to content. This will be fired even when an ad is played a second time or when seeking into an ad (only used for dynamic ad insertion). |
+| `AD_PERIOD_STARTED` | iOS | Fired every time the stream switches from content to advertising or slate. This will be fired even when an ad is played a second time or when seeking into an ad (only used for dynamic ad insertion). |
+| `AD_PROGRESS` | Android | Fires when the ad's current time value changes. The event `data` will be populated with an AdProgressData object. |
+| `ALL_ADS_COMPLETED` | Android, iOS | Fires when the ads manager is done playing all the valid ads in the ads response, or when the response doesn't return any valid ads. |
+| `CLICK` | Android, iOS | Fires when the ad is clicked. |
+| `COMPLETED` | Android, iOS | Fires when the ad completes playing. |
+| `CONTENT_PAUSE_REQUESTED` | Android | Fires when content should be paused. This usually happens right before an ad is about to cover the content. |
+| `CONTENT_RESUME_REQUESTED` | Android | Fires when content should be resumed. This usually happens when an ad finishes or collapses. |
+| `CUEPOINTS_CHANGED` | iOS | Cuepoints changed for VOD stream (only used for dynamic ad insertion). |
+| `DURATION_CHANGE` | Android | Fires when the ad's duration changes. |
+| `ERROR` | Android, iOS | Fires when an error occurred while loading the ad and prevent it from playing. |
+| `FIRST_QUARTILE` | Android, iOS | Fires when the ad playhead crosses first quartile. |
+| `IMPRESSION` | Android | Fires when the impression URL has been pinged. |
+| `INTERACTION` | Android | Fires when an ad triggers the interaction callback. Ad interactions contain an interaction ID string in the ad data. |
+| `LINEAR_CHANGED` | Android | Fires when the displayed ad changes from linear to nonlinear, or the reverse. |
+| `LOADED` | Android, iOS | Fires when ad data is available. |
+| `LOG` | Android, iOS | Fires when a non-fatal error is encountered. The user need not take any action since the SDK will continue with the same or next ad playback depending on the error situation. |
+| `MIDPOINT` | Android, iOS | Fires when the ad playhead crosses midpoint. |
+| `PAUSED` | Android, iOS | Fires when the ad is paused. |
+| `RESUMED` | Android, iOS | Fires when the ad is resumed. |
+| `SKIPPABLE_STATE_CHANGED` | Android | Fires when the displayed ads skippable state is changed. |
+| `SKIPPED` | Android, iOS | Fires when the ad is skipped by the user. |
+| `STARTED` | Android, iOS | Fires when the ad starts playing. |
+| `STREAM_LOADED` | iOS | Stream request has loaded (only used for dynamic ad insertion). |
+| `TAPPED` | iOS | Fires when the ad is tapped. |
+| `THIRD_QUARTILE` | Android, iOS | Fires when the ad playhead crosses third quartile. |
+| `UNKNOWN` | iOS | An unknown event has fired |
+| `USER_CLOSE` | Android | Fires when the ad is closed by the user. |
+| `VIDEO_CLICKED` | Android | Fires when the non-clickthrough portion of a video ad is clicked. |
+| `VIDEO_ICON_CLICKED` | Android | Fires when a user clicks a video icon. |
+| `VOLUME_CHANGED` | Android | Fires when the ad volume has changed. |
+| `VOLUME_MUTED` | Android | Fires when the ad volume has been muted. |
+
+
+
+**Payload:**
+| Property | Type | Description |
+|----------|-----------------------------------------|---------------------|
+| event | AdEvent | The ad event received |
+| data | Record<string, string> \| undefined | Additional ad event data |
+
+**Example:**
+
+```json
+{
+ "data": {
+ "key": "value"
+ },
+ "event": "LOG"
+}
+```
+
+---
+
+### `onRestoreUserInterfaceForPictureInPictureStop`
+
+
+
+Corresponds to Apple's [`restoreUserInterfaceForPictureInPictureStopWithCompletionHandler`](https://developer.apple.com/documentation/avkit/avpictureinpicturecontrollerdelegate/1614703-pictureinpicturecontroller?language=objc).
+Call `restoreUserInterfaceForPictureInPictureStopCompleted` inside this function when the UI is restored.
+
+**Payload:** _none_
+
+---
+
+### `onSeek`
+
+
+
+Triggered when a seek operation completes.
+
+**Payload:**
+| Property | Type | Description |
+|------------|--------|---------------------------------|
+| currentTime | number | Current time after seeking |
+| seekTime | number | Requested seek time |
+
+**Example:**
+
+```javascript
+{
+ currentTime: 100.5,
+ seekTime: 100
+}
+```
+
+> **Note:** On iOS, this callback is not reported when native controls are enabled.
+
+---
+
+### `onTimedMetadata`
+
+
+
+Triggered when timed metadata is available.
+
+**Payload:**
+| Property | Type | Description |
+|----------|------|--------------------------|
+| metadata | array | Array of metadata objects |
+
+**Example:**
+
+```javascript
+{
+ metadata: [
+ { value: "Streaming Encoder", identifier: "TRSN" },
+ { value: "Internet Stream", identifier: "TRSO" },
+ { value: "Any Time You Like", identifier: "TIT2" },
+ ];
+}
+```
+
+---
+
+### `onTextTrackDataChanged`
+
+
+
+Triggered when new subtitle data becomes available.
+
+**Payload:**
+| Property | Type | Description |
+|----------------|--------|--------------------------------------------------|
+| subtitleTracks | string | The subtitle text content in a compatible format |
+
+**Example:**
+
+```javascript
+{
+ subtitleTracks: "This blade has a dark past.";
+}
+```
+
+---
+
+### `onTextTracks`
+
+
+
+Triggered when available text (subtitle) tracks change.
+
+**Payload:**
+| Property | Type | Description |
+|----------|--------|--------------------------------------------------------------------------------------------------------------|
+| index | number | Internal track ID |
+| title | string | Track name |
+| language | string | 2 letter [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) language code |
+| type | string | Track MIME type (_VTT_, _SRT_, _TTML_) |
+| selected | boolean | `true` if the track is currently playing |
+
+**Example:**
+
+```javascript
+{
+ textTracks: [
+ {
+ index: 0,
+ title: "English Subtitles",
+ type: "vtt",
+ selected: true,
+ },
+ ];
+}
+```
+
+---
+
+### `onVideoTracks`
+
+
+
+Triggered when video tracks change.
+
+**Payload:**
+| Property | Type | Description |
+|----------|---------|-----------------------------------|
+| index | number | Track index |
+| trackId | string | Internal track ID |
+| codecs | string | Codec type |
+| width | number | Video width |
+| height | number | Video height |
+| bitrate | number | Track bitrate (bps) |
+| selected | boolean | `true` if the track is playing |
+| rotation | number | Rotation angle (0, 90, 180, 270) |
+
+**Example:**
+
+```javascript
+{
+ videoTracks: [
+ {
+ index: 0,
+ trackId: "1",
+ codecs: "video/mp4",
+ width: 1920,
+ height: 1080,
+ bitrate: 5000000,
+ selected: true,
+ rotation: 0,
+ },
+ ];
+}
+```
+
+---
+
+### `onVolumeChange`
+
+
+
+Triggered when the player volume changes.
+
+> **Note:** This event applies to the player's volume, not the device's system volume.
+
+**Payload:**
+| Property | Type | Description |
+|----------|--------|---------------------------------|
+| volume | number | Volume level (0 to 1) |
+
+**Example:**
+
+```javascript
+{
+ volume: 0.5;
+}
+```
diff --git a/docs/versioned_docs/version-6.x/component/methods.mdx b/docs/versioned_docs/version-6.x/component/methods.mdx
new file mode 100644
index 00000000..d1b7b619
--- /dev/null
+++ b/docs/versioned_docs/version-6.x/component/methods.mdx
@@ -0,0 +1,352 @@
+---
+sidebar_position: 3
+title: Methods
+description: React Native Video Component Methods
+---
+
+import PlatformsList from "@site/src/components/PlatformsList/PlatformsList.tsx";
+
+# Methods
+
+This page shows the list of available methods.
+
+## Details
+
+### `dismissFullscreenPlayer`
+
+
+
+```tsx
+dismissFullscreenPlayer(): Promise
+```
+
+Exits fullscreen mode.
+
+> **Deprecated:** Use `setFullScreen(false)` instead.
+
+---
+
+### `pause`
+
+
+
+```tsx
+pause(): Promise
+```
+
+Pauses the video.
+
+---
+
+### `presentFullscreenPlayer`
+
+
+
+```tsx
+presentFullscreenPlayer(): Promise
+```
+
+Enters fullscreen mode.
+
+- On **iOS**, this opens a fullscreen view controller with controls.
+- On **Android**, this makes the player fullscreen but requires styling to match screen dimensions.
+
+> **Deprecated:** Use `setFullScreen(true)` instead.
+
+---
+
+### `resume`
+
+
+
+```tsx
+resume(): Promise
+```
+
+Resumes video playback.
+
+---
+
+### `restoreUserInterfaceForPictureInPictureStopCompleted`
+
+
+
+```tsx
+restoreUserInterfaceForPictureInPictureStopCompleted(restored);
+```
+
+Must be called after `onRestoreUserInterfaceForPictureInPictureStop`.
+Corresponds to Apple's [`restoreUserInterfaceForPictureInPictureStop`](https://developer.apple.com/documentation/avkit/avpictureinpicturecontrollerdelegate/1614703-pictureinpicturecontroller?language=objc).
+
+---
+
+### `save`
+
+
+
+```tsx
+save(): Promise<{ uri: string }>
+```
+
+Saves the video to the user's **Photos app** with the current filter.
+
+#### Notes:
+
+- Supports **MP4** export only.
+- Exports to the **cache directory** with a generated UUID filename.
+- Requires **internet connection** if the video is not already buffered.
+- Video remains in the **Photos app** until manually deleted.
+- Works with **cached videos**.
+
+#### Future improvements:
+
+- Support for **multiple quality options**.
+- Support for **more formats**.
+- Support for **custom directory and filename**.
+
+---
+
+### `enterPictureInPicture`
+
+
+
+```tsx
+enterPictureInPicture();
+```
+
+Activates Picture-in-Picture (PiP) mode.
+
+#### Android setup:
+
+For **Expo**, enable PiP in `app.json`:
+
+```json
+"plugins": [
+ [
+ "react-native-video",
+ {
+ "enableAndroidPictureInPicture": true
+ }
+ ]
+]
+```
+
+For **Bare React Native**, update `AndroidManifest.xml`:
+
+```xml
+
+
+```
+
+> **Note:**
+>
+> - On **Android**, entering PiP moves the app to the **background**.
+> - On **iOS**, **video ads cannot start** in PiP mode ([Google IMA SDK](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/picture_in_picture?hl=en#starting_ads)).
+
+---
+
+### `exitPictureInPicture`
+
+
+
+```tsx
+exitPictureInPicture();
+```
+
+Exits Picture-in-Picture (PiP) mode.
+
+---
+
+### `seek`
+
+
+
+```tsx
+seek(seconds: number)
+```
+
+Seeks to the specified position (**in seconds**).
+
+#### Notes:
+
+- **Must be called after** `onLoad`.
+- Triggers the [`onSeek`](./events#onseek) event.
+
+#### **iOS Exact Seek:**
+
+```tsx
+seek(seconds, tolerance: number)
+```
+
+- Default **tolerance**: ±100ms.
+- Set `tolerance = 0` for **precise seeking**.
+
+---
+
+### `setVolume`
+
+
+
+```tsx
+setVolume(value: number): Promise
+```
+
+Changes the **volume** level. Same behavior as the [`volume`](./props#volume) prop.
+
+---
+
+### `getCurrentPosition`
+
+
+
+```tsx
+getCurrentPosition(): Promise
+```
+
+Returns the **current playback position** in seconds.
+
+> **Throws an error** if the player is not initialized.
+
+---
+
+### `setSource`
+
+
+
+```tsx
+setSource(source: ReactVideoSource): Promise
+```
+
+Updates the media source **dynamically**.
+
+> **Note:** This **overrides** the `source` prop.
+
+---
+
+### `setFullScreen`
+
+
+
+```tsx
+setFullScreen(fullscreen: boolean): Promise
+```
+
+Toggles fullscreen mode.
+
+- `true` → Enters fullscreen.
+- `false` → Exits fullscreen.
+
+---
+
+### `nativeHtmlVideoRef`
+
+
+
+A **reference to the native HTML `