Merge pull request #52 from isair/feature/playable-duration

Add playableDuration property to onProgress event
This commit is contained in:
Brent Vatne 2015-06-15 15:36:28 -07:00
commit 330b5a93fc

View File

@ -69,6 +69,7 @@ static NSString *const statusKeyPath = @"status";
(([_prevProgressUpdateTime timeIntervalSinceNow] * -1000.0) >= _progressUpdateInterval)) { (([_prevProgressUpdateTime timeIntervalSinceNow] * -1000.0) >= _progressUpdateInterval)) {
[_eventDispatcher sendInputEventWithName:RNVideoEventProgress body:@{ [_eventDispatcher sendInputEventWithName:RNVideoEventProgress body:@{
@"currentTime": [NSNumber numberWithFloat:CMTimeGetSeconds(video.currentTime)], @"currentTime": [NSNumber numberWithFloat:CMTimeGetSeconds(video.currentTime)],
@"playableDuration": [self calculatePlayableDuration],
@"target": self.reactTag @"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 in seconds.
*/
- (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 - (void)stopProgressTimer
{ {
[_progressUpdateTimer invalidate]; [_progressUpdateTimer invalidate];