From 88fb101b38cba159b146f44b7d47aaa97e9a39f1 Mon Sep 17 00:00:00 2001 From: "fahim.faez" Date: Mon, 12 May 2025 09:45:36 +0600 Subject: [PATCH 1/4] [Update] Expose PDT to get actual date/time - Pass the EXT-X-PROGRAMMING-Date --- ios/Video/RCTVideo.swift | 8 ++++++++ ios/Video/RCTVideoManager.m | 1 + src/types/events.ts | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/ios/Video/RCTVideo.swift b/ios/Video/RCTVideo.swift index 0500cbae8f..b4e9fbf02f 100644 --- a/ios/Video/RCTVideo.swift +++ b/ios/Video/RCTVideo.swift @@ -136,6 +136,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH @objc var onTextTracks: RCTDirectEventBlock? @objc var onAudioTracks: RCTDirectEventBlock? @objc var onTextTrackDataChanged: RCTDirectEventBlock? + @objc var onTimeUpdate: RCTDirectEventBlock? // To get EXT-X-PROGRaM-DATE from HLS streams @objc func _onPictureInPictureEnter() { @@ -1456,6 +1457,13 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH func handleTimeUpdate(time _: CMTime) { sendProgressUpdate() + if let onTimeUpdate = onTimeUpdate, + let currentDate = _player?.currentItem?.currentDate() { + onTimeUpdate([ + "programDateTime": NSNumber(value: Double(currentDate.timeIntervalSince1970 * 1000)).int64Value, + "target": reactTag as Any + ]) // Pass the current date (epoch time) to JS + } } func handleReadyForDisplay(changeObject _: Any, change _: NSKeyValueObservedChange) { diff --git a/ios/Video/RCTVideoManager.m b/ios/Video/RCTVideoManager.m index 2d7cd36392..a0c89c6f2a 100644 --- a/ios/Video/RCTVideoManager.m +++ b/ios/Video/RCTVideoManager.m @@ -67,6 +67,7 @@ @interface RCT_EXTERN_MODULE (RCTVideoManager, RCTViewManager) RCT_EXPORT_VIEW_PROPERTY(onTextTracks, RCTDirectEventBlock); RCT_EXPORT_VIEW_PROPERTY(onAudioTracks, RCTDirectEventBlock); RCT_EXPORT_VIEW_PROPERTY(onTextTrackDataChanged, RCTDirectEventBlock); +RCT_EXPORT_VIEW_PROPERTY(onTimeUpdate, RCTDirectEventBlock); // Pass time update events RCT_EXTERN_METHOD(seekCmd : (nonnull NSNumber*)reactTag time : (nonnull NSNumber*)time tolerance : (nonnull NSNumber*)tolerance) RCT_EXTERN_METHOD(setLicenseResultCmd : (nonnull NSNumber*)reactTag license : (NSString*)license licenseUrl : (NSString*)licenseUrl) diff --git a/src/types/events.ts b/src/types/events.ts index b99aa7abee..03e8be8285 100644 --- a/src/types/events.ts +++ b/src/types/events.ts @@ -234,6 +234,10 @@ export type OnReceiveAdEventData = Readonly<{ >; }>; +export type OnTimeUpdateData = Readonly<{ + programDateTime: number; // Unix timestamp in milliseconds +}>; + export interface ReactVideoEvents { onAudioBecomingNoisy?: () => void; //Android, iOS onAudioFocusChanged?: (e: OnAudioFocusChangedData) => void; // Android @@ -267,4 +271,5 @@ export interface ReactVideoEvents { onTextTrackDataChanged?: (e: OnTextTrackDataChangedData) => void; // iOS onVideoTracks?: (e: OnVideoTracksData) => void; //Android onAspectRatio?: (e: OnVideoAspectRatioData) => void; + onTimeUpdate?: (e: OnTimeUpdateData) => void; } From f5e9a833b388654596ace396b5185f268556624b Mon Sep 17 00:00:00 2001 From: "fahim.faez" Date: Tue, 13 May 2025 15:00:18 +0600 Subject: [PATCH 2/4] [Update] Remove the unnecessary change - Added currentPlaybackTime Property --- ios/Video/RCTVideo.swift | 8 -------- src/specs/VideoNativeComponent.ts | 1 + src/types/events.ts | 5 ----- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/ios/Video/RCTVideo.swift b/ios/Video/RCTVideo.swift index b4e9fbf02f..0500cbae8f 100644 --- a/ios/Video/RCTVideo.swift +++ b/ios/Video/RCTVideo.swift @@ -136,7 +136,6 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH @objc var onTextTracks: RCTDirectEventBlock? @objc var onAudioTracks: RCTDirectEventBlock? @objc var onTextTrackDataChanged: RCTDirectEventBlock? - @objc var onTimeUpdate: RCTDirectEventBlock? // To get EXT-X-PROGRaM-DATE from HLS streams @objc func _onPictureInPictureEnter() { @@ -1457,13 +1456,6 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH func handleTimeUpdate(time _: CMTime) { sendProgressUpdate() - if let onTimeUpdate = onTimeUpdate, - let currentDate = _player?.currentItem?.currentDate() { - onTimeUpdate([ - "programDateTime": NSNumber(value: Double(currentDate.timeIntervalSince1970 * 1000)).int64Value, - "target": reactTag as Any - ]) // Pass the current date (epoch time) to JS - } } func handleReadyForDisplay(changeObject _: Any, change _: NSKeyValueObservedChange) { diff --git a/src/specs/VideoNativeComponent.ts b/src/specs/VideoNativeComponent.ts index 493736d990..f8a0dcfdff 100644 --- a/src/specs/VideoNativeComponent.ts +++ b/src/specs/VideoNativeComponent.ts @@ -191,6 +191,7 @@ export type OnProgressData = Readonly<{ currentTime: Float; playableDuration: Float; seekableDuration: Float; + currentPlaybackTime: number; // To get EXT-X-PLAYBACK-TIME }>; export type OnBandwidthUpdateData = Readonly<{ diff --git a/src/types/events.ts b/src/types/events.ts index 03e8be8285..b99aa7abee 100644 --- a/src/types/events.ts +++ b/src/types/events.ts @@ -234,10 +234,6 @@ export type OnReceiveAdEventData = Readonly<{ >; }>; -export type OnTimeUpdateData = Readonly<{ - programDateTime: number; // Unix timestamp in milliseconds -}>; - export interface ReactVideoEvents { onAudioBecomingNoisy?: () => void; //Android, iOS onAudioFocusChanged?: (e: OnAudioFocusChangedData) => void; // Android @@ -271,5 +267,4 @@ export interface ReactVideoEvents { onTextTrackDataChanged?: (e: OnTextTrackDataChangedData) => void; // iOS onVideoTracks?: (e: OnVideoTracksData) => void; //Android onAspectRatio?: (e: OnVideoAspectRatioData) => void; - onTimeUpdate?: (e: OnTimeUpdateData) => void; } From a10469015683ddcbc51d3c810e3e0cb1213796e0 Mon Sep 17 00:00:00 2001 From: "fahim.faez" Date: Tue, 13 May 2025 15:19:04 +0600 Subject: [PATCH 3/4] interim fix on video.web onProgress --- src/Video.web.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Video.web.tsx b/src/Video.web.tsx index cfd58639f0..3d75ce51a3 100644 --- a/src/Video.web.tsx +++ b/src/Video.web.tsx @@ -379,6 +379,7 @@ const Video = forwardRef( ) : 0, seekableDuration: 0, + currentPlaybackTime: 0, //Update this with the correct playback time }); }} onLoadedData={() => onReadyForDisplay?.()} From 261a000f06cf99662b30493348f3df9108fafa00 Mon Sep 17 00:00:00 2001 From: "fahim.faez" Date: Tue, 13 May 2025 16:30:38 +0600 Subject: [PATCH 4/4] Eslint issue fix --- src/Video.web.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Video.web.tsx b/src/Video.web.tsx index 3d75ce51a3..39881355c0 100644 --- a/src/Video.web.tsx +++ b/src/Video.web.tsx @@ -379,7 +379,7 @@ const Video = forwardRef( ) : 0, seekableDuration: 0, - currentPlaybackTime: 0, //Update this with the correct playback time + currentPlaybackTime: 0, // Update this with the correct playback time }); }} onLoadedData={() => onReadyForDisplay?.()}