From da4e5df5c808fdf7947e49fa0bdb84d6d3201dc2 Mon Sep 17 00:00:00 2001 From: Baris Sencan Date: Wed, 10 Jun 2015 14:29:38 -0700 Subject: [PATCH] Add playableDuration property to onProgress event --- RCTVideo.m | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/RCTVideo.m b/RCTVideo.m index c03debf3..b06d32f7 100644 --- a/RCTVideo.m +++ b/RCTVideo.m @@ -69,6 +69,7 @@ static NSString *const statusKeyPath = @"status"; (([_prevProgressUpdateTime timeIntervalSinceNow] * -1000.0) >= _progressUpdateInterval)) { [_eventDispatcher sendInputEventWithName:RNVideoEventProgress body:@{ @"currentTime": [NSNumber numberWithFloat:CMTimeGetSeconds(video.currentTime)], + @"playableDuration": [self calculatePlayableDuration], @"target": self.reactTag }]; @@ -76,6 +77,27 @@ static NSString *const statusKeyPath = @"status"; } } +/*! + * Calculates and returns the playable duration of the current player item using its loaded time ranges. + * + * \returns The playable duration of the current player item. + */ +- (NSNumber *)calculatePlayableDuration { + AVPlayerItem *video = _player.currentItem; + if (video.status == AVPlayerItemStatusReadyToPlay) { + __block CMTimeRange effectiveTimeRange; + [video.loadedTimeRanges enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + CMTimeRange timeRange = [obj CMTimeRangeValue]; + if (CMTimeRangeContainsTime(timeRange, video.currentTime)) { + effectiveTimeRange = timeRange; + *stop = YES; + } + }]; + return [NSNumber numberWithFloat:CMTimeGetSeconds(CMTimeRangeGetEnd(effectiveTimeRange))]; + } + return [NSNumber numberWithFloat:CMTimeGetSeconds(kCMTimeInvalid)]; +} + - (void)stopProgressTimer { [_progressUpdateTimer invalidate];