react-native-unified-player 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@ Pod::Spec.new do |s|
10
10
  s.license = package["license"]
11
11
  s.authors = package["author"]
12
12
 
13
- s.platforms = { :ios => "12.0" }
13
+ s.platforms = { :ios => "13.0" }
14
14
  s.source = { :git => "https://github.com/blueromans/react-native-unified-player.git", :tag => "#{s.version}" }
15
15
 
16
16
  s.source_files = "ios/**/*.{h,m,mm}"
@@ -62,4 +62,4 @@ class UnifiedPlayerEventEmitter(private val reactContext: ReactApplicationContex
62
62
  super.onCatalystInstanceDestroy()
63
63
  instance = null
64
64
  }
65
- }
65
+ }
@@ -169,4 +169,4 @@ class UnifiedPlayerModule(private val reactContext: ReactApplicationContext) : R
169
169
  }
170
170
  }
171
171
 
172
- }
172
+ }
@@ -20,4 +20,4 @@ class UnifiedPlayerPackage : ReactPackage {
20
20
  Log.d(TAG, "Creating view managers")
21
21
  return listOf(UnifiedPlayerViewManager())
22
22
  }
23
- }
23
+ }
@@ -387,4 +387,4 @@ class UnifiedPlayerView(context: Context) : FrameLayout(context) {
387
387
  progressHandler.removeCallbacks(progressRunnable) // Stop progress updates
388
388
  player?.release()
389
389
  }
390
- }
390
+ }
@@ -57,4 +57,4 @@ class UnifiedPlayerViewManager : SimpleViewManager<UnifiedPlayerView>() {
57
57
  .put("topLoadStart", MapBuilder.of("registrationName", "onLoadStart"))
58
58
  .build()
59
59
  }
60
- }
60
+ }
@@ -1,5 +1,9 @@
1
1
  #import <React/RCTEventEmitter.h>
2
2
  #import <React/RCTBridgeModule.h>
3
+ #import <MobileVLCKit/MobileVLCKit.h> // Import MobileVLCKit
4
+
5
+ // Forward declaration for UnifiedPlayerUIView
6
+ @class UnifiedPlayerUIView;
3
7
 
4
8
  @interface UnifiedPlayerModule : RCTEventEmitter <RCTBridgeModule>
5
- @end
9
+ @end
@@ -1,4 +1,5 @@
1
1
  #import "UnifiedPlayerModule.h"
2
+ #import "UnifiedPlayerUIView.h"
2
3
  #import <React/RCTLog.h>
3
4
  #import <React/RCTBridgeModule.h>
4
5
  #import <React/RCTEventEmitter.h>
@@ -175,35 +176,43 @@ RCT_EXPORT_METHOD(getCurrentTime:(nonnull NSNumber *)reactTag
175
176
  // Get video duration
176
177
  RCT_EXPORT_METHOD(getDuration:(nonnull NSNumber *)reactTag
177
178
  resolver:(RCTPromiseResolveBlock)resolve
178
- rejecter:(RCTPromiseRejectBlock)reject) {
179
- [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
179
+ rejecter:(RCTPromiseRejectBlock)reject)
180
+ {
181
+ [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
180
182
  UIView *view = viewRegistry[reactTag];
181
- if (!view) {
182
- reject(@"error", @"Invalid view for tag", nil);
183
- return;
183
+ if (![view isKindOfClass:[UnifiedPlayerUIView class]]) {
184
+ RCTLogError(@"Invalid view returned from registry, expecting UnifiedPlayerUIView, got: %@", view);
185
+ reject(@"E_INVALID_VIEW", @"Expected UnifiedPlayerUIView", nil);
186
+ } else {
187
+ UnifiedPlayerUIView *playerView = (UnifiedPlayerUIView *)view;
188
+ float duration = [playerView getDuration];
189
+ resolve(@(duration));
184
190
  }
185
-
186
- // Cast to UnifiedPlayerUIView class
187
- Class UnifiedPlayerUIViewClass = NSClassFromString(@"UnifiedPlayerUIView");
188
- if (![view isKindOfClass:UnifiedPlayerUIViewClass]) {
189
- reject(@"error", @"View is not a UnifiedPlayerUIView", nil);
191
+ }];
192
+ }
193
+
194
+ RCT_EXPORT_METHOD(capture:(nonnull NSNumber *)reactTag
195
+ resolver:(RCTPromiseResolveBlock)resolve
196
+ rejecter:(RCTPromiseRejectBlock)reject)
197
+ {
198
+ [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
199
+ UIView *view = viewRegistry[reactTag];
200
+ if (![view isKindOfClass:[UnifiedPlayerUIView class]]) {
201
+ RCTLogError(@"Invalid view returned from registry, expecting UnifiedPlayerUIView, got: %@", view);
202
+ reject(@"E_INVALID_VIEW", @"Expected UnifiedPlayerUIView", nil);
190
203
  return;
191
204
  }
192
205
 
193
- // Use direct method call with proper type safety
194
- float duration = 0;
195
- @try {
196
- // Use direct ivar access for safety
197
- VLCMediaPlayer *player = [view valueForKey:@"player"];
198
- if (player && player.media) {
199
- duration = player.media.length.intValue / 1000.0f;
200
- resolve(@(duration));
206
+ UnifiedPlayerUIView *playerView = (UnifiedPlayerUIView *)view;
207
+ [playerView captureFrameWithCompletion:^(NSString * _Nullable base64String, NSError * _Nullable error) {
208
+ if (error) {
209
+ reject(@"E_CAPTURE_FAILED", error.localizedDescription, error);
210
+ } else if (base64String) {
211
+ resolve(base64String);
201
212
  } else {
202
- reject(@"error", @"Player or media not initialized", nil);
213
+ reject(@"E_CAPTURE_FAILED", @"Unknown capture error", nil);
203
214
  }
204
- } @catch (NSException *exception) {
205
- reject(@"error", [NSString stringWithFormat:@"Error getting duration: %@", exception.reason], nil);
206
- }
215
+ }];
207
216
  }];
208
217
  }
209
218
 
@@ -0,0 +1,43 @@
1
+ #import <UIKit/UIKit.h>
2
+ #import <React/RCTView.h>
3
+ #import <React/RCTComponent.h>
4
+ #import <MobileVLCKit/MobileVLCKit.h>
5
+
6
+ NS_ASSUME_NONNULL_BEGIN
7
+
8
+ @interface UnifiedPlayerUIView : UIView <VLCMediaPlayerDelegate>
9
+
10
+ @property (nonatomic, strong) VLCMediaPlayer *player;
11
+ @property (nonatomic, copy) NSString *videoUrlString;
12
+ @property (nonatomic, assign) BOOL autoplay;
13
+ @property (nonatomic, assign) BOOL loop;
14
+ @property (nonatomic, assign) BOOL isPaused;
15
+ @property (nonatomic, strong) NSArray *mediaOptions;
16
+ @property (nonatomic, weak) RCTBridge *bridge;
17
+ @property (nonatomic, assign) VLCMediaPlayerState previousState;
18
+ @property (nonatomic, assign) BOOL hasRenderedVideo;
19
+ @property (nonatomic, assign) BOOL readyEventSent;
20
+
21
+ // Event callbacks
22
+ @property (nonatomic, copy) RCTDirectEventBlock onLoadStart;
23
+ @property (nonatomic, copy) RCTDirectEventBlock onReadyToPlay;
24
+ @property (nonatomic, copy) RCTDirectEventBlock onError;
25
+ @property (nonatomic, copy) RCTDirectEventBlock onProgress;
26
+ @property (nonatomic, copy) RCTDirectEventBlock onPlaybackComplete;
27
+ @property (nonatomic, copy) RCTDirectEventBlock onPlaybackStalled;
28
+ @property (nonatomic, copy) RCTDirectEventBlock onPlaybackResumed;
29
+ @property (nonatomic, copy) RCTDirectEventBlock onPlaying;
30
+ @property (nonatomic, copy) RCTDirectEventBlock onPaused;
31
+
32
+ // Method declarations
33
+ - (void)setupWithVideoUrlString:(NSString *)videoUrlString;
34
+ - (void)play;
35
+ - (void)pause;
36
+ - (void)seekToTime:(NSNumber *)timeNumber;
37
+ - (float)getCurrentTime;
38
+ - (float)getDuration;
39
+ - (void)captureFrameWithCompletion:(void (^)(NSString * _Nullable base64String, NSError * _Nullable error))completion;
40
+
41
+ @end
42
+
43
+ NS_ASSUME_NONNULL_END
@@ -8,37 +8,7 @@
8
8
  #import <React/RCTComponent.h>
9
9
  #import <MobileVLCKit/MobileVLCKit.h>
10
10
  #import "UnifiedPlayerModule.h"
11
-
12
- // Forward declarations
13
- @interface UnifiedPlayerUIView : UIView <VLCMediaPlayerDelegate>
14
- @property (nonatomic, strong) VLCMediaPlayer *player;
15
- @property (nonatomic, copy) NSString *videoUrlString;
16
- @property (nonatomic, assign) BOOL autoplay;
17
- @property (nonatomic, assign) BOOL loop;
18
- @property (nonatomic, assign) BOOL isPaused;
19
- @property (nonatomic, strong) NSArray *mediaOptions;
20
- @property (nonatomic, weak) RCTBridge *bridge;
21
- @property (nonatomic, assign) VLCMediaPlayerState previousState;
22
- @property (nonatomic, assign) BOOL hasRenderedVideo;
23
-
24
- // Event callbacks
25
- @property (nonatomic, copy) RCTDirectEventBlock onLoadStart;
26
- @property (nonatomic, copy) RCTDirectEventBlock onReadyToPlay;
27
- @property (nonatomic, copy) RCTDirectEventBlock onError;
28
- @property (nonatomic, copy) RCTDirectEventBlock onProgress;
29
- @property (nonatomic, copy) RCTDirectEventBlock onPlaybackComplete;
30
- @property (nonatomic, copy) RCTDirectEventBlock onPlaybackStalled;
31
- @property (nonatomic, copy) RCTDirectEventBlock onPlaybackResumed;
32
- @property (nonatomic, copy) RCTDirectEventBlock onPlaying;
33
- @property (nonatomic, copy) RCTDirectEventBlock onPaused;
34
-
35
- - (void)setupWithVideoUrlString:(NSString *)videoUrlString;
36
- - (void)play;
37
- - (void)pause;
38
- - (void)seekToTime:(NSNumber *)timeNumber;
39
- - (float)getCurrentTime;
40
- - (float)getDuration;
41
- @end
11
+ #import "UnifiedPlayerUIView.h"
42
12
 
43
13
  // Main player view implementation
44
14
  @implementation UnifiedPlayerUIView
@@ -49,6 +19,7 @@
49
19
 
50
20
  // Initialize properties
51
21
  _hasRenderedVideo = NO;
22
+ _readyEventSent = NO;
52
23
 
53
24
  // Create the player
54
25
  _player = [[VLCMediaPlayer alloc] init];
@@ -179,13 +150,15 @@
179
150
  self.onPlaying(body);
180
151
  } else if ([eventName isEqualToString:@"onPaused"] && self.onPaused) {
181
152
  self.onPaused(body);
153
+ } else {
154
+ RCTLogInfo(@"[UnifiedPlayerViewManager] No direct event block found for event: %@", eventName);
182
155
  }
183
156
 
184
- // Also send events through the module for backward compatibility
185
- UnifiedPlayerModule *eventEmitter = [self.bridge moduleForClass:[UnifiedPlayerModule class]];
186
- if (eventEmitter != nil) {
187
- [eventEmitter sendEventWithName:eventName body:body];
188
- }
157
+ // Removed the redundant event sending via UnifiedPlayerModule emitter
158
+ // UnifiedPlayerModule *eventEmitter = [self.bridge moduleForClass:[UnifiedPlayerModule class]];
159
+ // if (eventEmitter != nil) {
160
+ // [eventEmitter sendEventWithName:eventName body:body];
161
+ // }
189
162
  }
190
163
 
191
164
  - (void)setupWithVideoUrlString:(NSString *)videoUrlString {
@@ -210,8 +183,9 @@
210
183
  self.window ? @"YES" : @"NO",
211
184
  self.superview ? @"YES" : @"NO");
212
185
 
213
- // Reset the rendered flag
186
+ // Reset the flags
214
187
  _hasRenderedVideo = NO;
188
+ _readyEventSent = NO;
215
189
 
216
190
  // Make sure we're in the main thread
217
191
  dispatch_async(dispatch_get_main_queue(), ^{
@@ -369,11 +343,49 @@
369
343
  }
370
344
 
371
345
  - (float)getCurrentTime {
372
- return _player.time.intValue / 1000.0f; // Convert from milliseconds to seconds
346
+ if (_player) {
347
+ return _player.time.intValue / 1000.0f;
348
+ }
349
+ return 0.0f;
373
350
  }
374
351
 
375
352
  - (float)getDuration {
376
- return _player.media.length.intValue / 1000.0f; // Convert from milliseconds to seconds
353
+ if (_player && _player.media) {
354
+ return _player.media.length.intValue / 1000.0f;
355
+ }
356
+ return 0.0f;
357
+ }
358
+
359
+ - (void)captureFrameWithCompletion:(void (^)(NSString * _Nullable base64String, NSError * _Nullable error))completion {
360
+ if (!_player || !_player.drawable) {
361
+ NSError *error = [NSError errorWithDomain:@"UnifiedPlayerUIView" code:100 userInfo:@{NSLocalizedDescriptionKey: @"Player not initialized"}];
362
+ if (completion) {
363
+ completion(nil, error);
364
+ }
365
+ return;
366
+ }
367
+
368
+ // Create a snapshot of the current view
369
+ UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);
370
+ [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
371
+ UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
372
+ UIGraphicsEndImageContext();
373
+
374
+ if (!image) {
375
+ NSError *error = [NSError errorWithDomain:@"UnifiedPlayerUIView" code:101 userInfo:@{NSLocalizedDescriptionKey: @"Failed to capture frame"}];
376
+ if (completion) {
377
+ completion(nil, error);
378
+ }
379
+ return;
380
+ }
381
+
382
+ // Convert to base64
383
+ NSData *imageData = UIImageJPEGRepresentation(image, 0.8);
384
+ NSString *base64String = [imageData base64EncodedStringWithOptions:0];
385
+
386
+ if (completion) {
387
+ completion(base64String, nil);
388
+ }
377
389
  }
378
390
 
379
391
  - (void)setAutoplay:(BOOL)autoplay {
@@ -406,6 +418,12 @@
406
418
  float currentTime = [self getCurrentTime];
407
419
  float duration = [self getDuration];
408
420
 
421
+ // Avoid sending progress events for invalid durations
422
+ if (duration > 0 && !isnan(duration)) {
423
+ [self sendProgressEvent:currentTime duration:duration];
424
+ }
425
+ RCTLogInfo(@"[UnifiedPlayerViewManager] mediaPlayerTimeChanged - CurrentTime: %f, Duration: %f", currentTime, duration); // Added Log
426
+
409
427
  // Avoid sending progress events for invalid durations
410
428
  if (duration > 0 && !isnan(duration)) {
411
429
  [self sendProgressEvent:currentTime duration:duration];
@@ -414,6 +432,20 @@
414
432
 
415
433
  - (void)mediaPlayerStateChanged:(NSNotification *)notification {
416
434
  VLCMediaPlayerState state = _player.state;
435
+ RCTLogInfo(@"[UnifiedPlayerViewManager] mediaPlayerStateChanged - New State: %d", state); // Added Log
436
+
437
+ // Check if media is ready to play
438
+ if ((state == VLCMediaPlayerStateBuffering || state == VLCMediaPlayerStatePlaying || state == VLCMediaPlayerStatePaused) && !_readyEventSent) {
439
+ // Check if we have video tracks
440
+ NSArray *videoTracks = [_player.media tracksInformation];
441
+ if (videoTracks.count > 0 || _player.hasVideoOut) {
442
+ RCTLogInfo(@"[UnifiedPlayerViewManager] Media is ready to play - Video tracks found: %lu", (unsigned long)videoTracks.count);
443
+
444
+ // Send ready event when media is ready, regardless of autoplay
445
+ [self sendEvent:@"onReadyToPlay" body:@{}];
446
+ _readyEventSent = YES;
447
+ }
448
+ }
417
449
 
418
450
  // Debug information for video output
419
451
  if (state == VLCMediaPlayerStatePlaying) {
@@ -427,11 +459,6 @@
427
459
  if (videoTracks.count > 0) {
428
460
  RCTLogInfo(@"[UnifiedPlayerViewManager] Video tracks found: %lu", (unsigned long)videoTracks.count);
429
461
 
430
- // Send ready event the first time we start playing
431
- if (!_hasRenderedVideo) {
432
- [self sendEvent:@"onReadyToPlay" body:@{}];
433
- }
434
-
435
462
  // Send playing event when we actually start playing
436
463
  [self sendEvent:@"onPlaying" body:@{}];
437
464
 
@@ -143,6 +143,26 @@ export const UnifiedPlayer = {
143
143
  console.log('Error calling getDuration:', error instanceof Error ? error.message : String(error));
144
144
  return Promise.reject(error);
145
145
  }
146
+ },
147
+ /**
148
+ * Capture the current video frame as a base64 encoded image
149
+ * @param viewTag - The tag of the player view
150
+ * @returns Promise resolving to the base64 encoded image string
151
+ */
152
+ capture: viewTag => {
153
+ try {
154
+ console.log('UnifiedPlayer.capture called with viewTag:', viewTag);
155
+ return UnifiedPlayerModule.capture(viewTag).then(base64String => {
156
+ console.log('Native capture method called successfully');
157
+ return base64String;
158
+ }).catch(error => {
159
+ console.log('Error calling capture:', error instanceof Error ? error.message : String(error));
160
+ throw error;
161
+ });
162
+ } catch (error) {
163
+ console.log('Error calling capture:', error instanceof Error ? error.message : String(error));
164
+ return Promise.reject(error);
165
+ }
146
166
  }
147
167
  };
148
168
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","requireNativeComponent","UIManager","NativeModules","Platform","jsx","_jsx","LINKING_ERROR","select","ios","default","getViewManagerConfig","UnifiedPlayer","Error","NativeUnifiedPlayerView","UnifiedPlayerModule","UnifiedPlayerEventTypes","LOAD_START","READY","ERROR","PROGRESS","COMPLETE","STALLED","RESUMED","PLAYING","PAUSED","UnifiedPlayerEvents","UnifiedPlayerView","props","ref","play","viewTag","console","log","then","result","catch","error","message","String","Promise","reject","pause","seekTo","time","getCurrentTime","getDuration"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","requireNativeComponent","UIManager","NativeModules","Platform","jsx","_jsx","LINKING_ERROR","select","ios","default","getViewManagerConfig","UnifiedPlayer","Error","NativeUnifiedPlayerView","UnifiedPlayerModule","UnifiedPlayerEventTypes","LOAD_START","READY","ERROR","PROGRESS","COMPLETE","STALLED","RESUMED","PLAYING","PAUSED","UnifiedPlayerEvents","UnifiedPlayerView","props","ref","play","viewTag","console","log","then","result","catch","error","message","String","Promise","reject","pause","seekTo","time","getCurrentTime","getDuration","capture","base64String"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
@@ -69,5 +69,11 @@ export declare const UnifiedPlayer: {
69
69
  * @returns Promise resolving to duration in seconds
70
70
  */
71
71
  getDuration: (viewTag: number) => Promise<number>;
72
+ /**
73
+ * Capture the current video frame as a base64 encoded image
74
+ * @param viewTag - The tag of the player view
75
+ * @returns Promise resolving to the base64 encoded image string
76
+ */
77
+ capture: (viewTag: number) => Promise<string>;
72
78
  };
73
79
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAkBtB,MAAM,MAAM,kBAAkB,GAAG;IAE/B,QAAQ,EAAE,MAAM,CAAC;IAGjB,KAAK,EAAE,SAAS,CAAC;IAGjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,IAAI,CAAC,EAAE,OAAO,CAAC;IAGf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAGzB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAG3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAG/B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAGhC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAGvE,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAG/B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAG/B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAGtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAYF,eAAO,MAAM,uBAAuB;;;;;;;;;;CAUnC,CAAC;AAGF,eAAO,MAAM,mBAAmB,KAA8B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,iBAAiB,8LAK5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;;;OAIG;oBACa,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;IAwBzC;;;;OAIG;qBACc,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;IAwB1C;;;;;OAKG;sBACe,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;IA6BzD;;;;OAIG;8BACuB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;IAalD;;;;OAIG;2BACoB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;CAYhD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAkBtB,MAAM,MAAM,kBAAkB,GAAG;IAE/B,QAAQ,EAAE,MAAM,CAAC;IAGjB,KAAK,EAAE,SAAS,CAAC;IAGjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,IAAI,CAAC,EAAE,OAAO,CAAC;IAGf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAGzB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAG3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAG/B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAGhC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAGvE,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAG/B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAG/B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAGtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAYF,eAAO,MAAM,uBAAuB;;;;;;;;;;CAUnC,CAAC;AAGF,eAAO,MAAM,mBAAmB,KAA8B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,iBAAiB,8LAK5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;;;OAIG;oBACa,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;IAwBzC;;;;OAIG;qBACc,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;IAwB1C;;;;;OAKG;sBACe,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;IA6BzD;;;;OAIG;8BACuB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;IAalD;;;;OAIG;2BACoB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;IAa/C;;;;OAIG;uBACgB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;CAuB5C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-unified-player",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Unified Player",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/module/index.js",
package/src/index.tsx CHANGED
@@ -234,4 +234,33 @@ export const UnifiedPlayer = {
234
234
  return Promise.reject(error);
235
235
  }
236
236
  },
237
+
238
+ /**
239
+ * Capture the current video frame as a base64 encoded image
240
+ * @param viewTag - The tag of the player view
241
+ * @returns Promise resolving to the base64 encoded image string
242
+ */
243
+ capture: (viewTag: number): Promise<string> => {
244
+ try {
245
+ console.log('UnifiedPlayer.capture called with viewTag:', viewTag);
246
+ return UnifiedPlayerModule.capture(viewTag)
247
+ .then((base64String: string) => {
248
+ console.log('Native capture method called successfully');
249
+ return base64String;
250
+ })
251
+ .catch((error: any) => {
252
+ console.log(
253
+ 'Error calling capture:',
254
+ error instanceof Error ? error.message : String(error)
255
+ );
256
+ throw error;
257
+ });
258
+ } catch (error) {
259
+ console.log(
260
+ 'Error calling capture:',
261
+ error instanceof Error ? error.message : String(error)
262
+ );
263
+ return Promise.reject(error);
264
+ }
265
+ },
237
266
  };