Merge branch 'master' of https://github.com/react-native-video/react-native-video into feat/subtitles_style
This commit is contained in:
commit
268b34d5de
10
.github/ISSUE_TEMPLATE/bug_report.md
vendored
10
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -10,10 +10,12 @@ assignees: ''
|
|||||||
# Bug
|
# Bug
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Please provide a clear and concise description of what the bug is.
|
Before opening a ticket
|
||||||
Include screenshots if needed.
|
* Ensure the issue has not been already reported
|
||||||
Please test using the latest release of the library, as maybe said bug has been already fixed.
|
* Please test using the latest release of the library, as maybe said bug has been already fixed.
|
||||||
If the library has multiple install methods, describe installation method (e.g., pod, not pod, with jetifier etc)
|
* Provide a clear and concise description of what the bug is.
|
||||||
|
* If the library has multiple install methods, describe installation method (e.g., pod, not pod, with jetifier etc)
|
||||||
|
* Include screenshots if needed.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## Platform
|
## Platform
|
||||||
|
2
API.md
2
API.md
@ -437,7 +437,7 @@ Determines if the player needs to throw an error when connection is lost or not
|
|||||||
Platforms: Android
|
Platforms: Android
|
||||||
|
|
||||||
### DRM
|
### DRM
|
||||||
To setup DRM please follow [this guide](./DRM.md)
|
To setup DRM please follow [this guide](./docs/DRM.md)
|
||||||
|
|
||||||
Platforms: Android, iOS
|
Platforms: Android, iOS
|
||||||
|
|
||||||
|
@ -2,14 +2,19 @@
|
|||||||
|
|
||||||
### Version 6.0.0-alpha.2
|
### Version 6.0.0-alpha.2
|
||||||
|
|
||||||
|
- Fix Android #2690 ensure onEnd is not sent twice [#2690](https://github.com/react-native-video/react-native-video/issues/2690)
|
||||||
- Fix Exoplayer progress not reported when paused [#2664](https://github.com/react-native-video/react-native-video/pull/2664)
|
- Fix Exoplayer progress not reported when paused [#2664](https://github.com/react-native-video/react-native-video/pull/2664)
|
||||||
- Call playbackRateChange onPlay and onPause [#1493](https://github.com/react-native-video/react-native-video/pull/1493)
|
- Call playbackRateChange onPlay and onPause [#1493](https://github.com/react-native-video/react-native-video/pull/1493)
|
||||||
- Fix being unable to disable sideloaded texttracks in the AVPlayer [#2679](https://github.com/react-native-video/react-native-video/pull/2679)
|
- Fix being unable to disable sideloaded texttracks in the AVPlayer [#2679](https://github.com/react-native-video/react-native-video/pull/2679)
|
||||||
- Fixed crash when iOS seek method called reject on the promise [#2743](https://github.com/react-native-video/react-native-video/pull/2743)
|
- Fixed crash when iOS seek method called reject on the promise [#2743](https://github.com/react-native-video/react-native-video/pull/2743)
|
||||||
|
- Fix maxBitRate property being ignored on Android [#2670](https://github.com/react-native-video/react-native-video/pull/2670)
|
||||||
|
- Fix crash when the source is a cameraroll [#2639] (https://github.com/react-native-video/react-native-video/pull/2639)
|
||||||
|
|
||||||
### Version 6.0.0-alpha.1
|
### Version 6.0.0-alpha.1
|
||||||
|
|
||||||
- Remove Android MediaPlayer support [#2724](https://github.com/react-native-video/react-native-video/pull/2724)
|
- Remove Android MediaPlayer support [#2724](https://github.com/react-native-video/react-native-video/pull/2724)
|
||||||
|
**WARNING**: when switching from older version to V6, you need to remove all refrerences of android-exoplayer. This android-exoplayer folder has been renamed to android. Exoplayer is now the only player implementation supported.
|
||||||
|
|
||||||
- Replace Image.propTypes with ImagePropTypes. [#2718](https://github.com/react-native-video/react-native-video/pull/2718)
|
- Replace Image.propTypes with ImagePropTypes. [#2718](https://github.com/react-native-video/react-native-video/pull/2718)
|
||||||
- Fix iOS build caused by type mismatch [#2720](https://github.com/react-native-video/react-native-video/pull/2720)
|
- Fix iOS build caused by type mismatch [#2720](https://github.com/react-native-video/react-native-video/pull/2720)
|
||||||
- ERROR TypeError: undefined is not an object (evaluating '_reactNative.Image.propTypes.resizeMode') [#2714](https://github.com/react-native-video/react-native-video/pull/2714)
|
- ERROR TypeError: undefined is not an object (evaluating '_reactNative.Image.propTypes.resizeMode') [#2714](https://github.com/react-native-video/react-native-video/pull/2714)
|
||||||
|
2
Video.js
2
Video.js
@ -284,7 +284,7 @@ export default class Video extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const isNetwork = !!(uri && uri.match(/^https?:/));
|
const isNetwork = !!(uri && uri.match(/^https?:/));
|
||||||
const isAsset = !!(uri && uri.match(/^(assets-library|ipod-library|file|content|ms-appx|ms-appdata):/));
|
const isAsset = !!(uri && uri.match(/^(assets-library|ph|ipod-library|file|content|ms-appx|ms-appdata):/));
|
||||||
|
|
||||||
let nativeResizeMode;
|
let nativeResizeMode;
|
||||||
const RCTVideoInstance = this.getViewManagerConfig('RCTVideo');
|
const RCTVideoInstance = this.getViewManagerConfig('RCTVideo');
|
||||||
|
@ -403,6 +403,15 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
eventListener = new Player.Listener() {
|
eventListener = new Player.Listener() {
|
||||||
@Override
|
@Override
|
||||||
public void onPlaybackStateChanged(int playbackState) {
|
public void onPlaybackStateChanged(int playbackState) {
|
||||||
|
View playButton = playerControlView.findViewById(R.id.exo_play);
|
||||||
|
View pauseButton = playerControlView.findViewById(R.id.exo_pause);
|
||||||
|
if (playButton != null && playButton.getVisibility() == GONE) {
|
||||||
|
playButton.setVisibility(INVISIBLE);
|
||||||
|
}
|
||||||
|
if (pauseButton != null && pauseButton.getVisibility() == GONE) {
|
||||||
|
pauseButton.setVisibility(INVISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
reLayout(playPauseControlContainer);
|
reLayout(playPauseControlContainer);
|
||||||
//Remove this eventListener once its executed. since UI will work fine once after the reLayout is done
|
//Remove this eventListener once its executed. since UI will work fine once after the reLayout is done
|
||||||
player.removeListener(eventListener);
|
player.removeListener(eventListener);
|
||||||
@ -815,7 +824,10 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
player.setPlayWhenReady(true);
|
player.setPlayWhenReady(true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
player.setPlayWhenReady(false);
|
// ensure playback is not ENDED, else it will trigger another ended event
|
||||||
|
if (player.getPlaybackState() != Player.STATE_ENDED) {
|
||||||
|
player.setPlayWhenReady(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1017,9 +1029,15 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
private void videoLoaded() {
|
private void videoLoaded() {
|
||||||
if (loadVideoStarted) {
|
if (loadVideoStarted) {
|
||||||
loadVideoStarted = false;
|
loadVideoStarted = false;
|
||||||
setSelectedAudioTrack(audioTrackType, audioTrackValue);
|
if (audioTrackType != null) {
|
||||||
setSelectedVideoTrack(videoTrackType, videoTrackValue);
|
setSelectedAudioTrack(audioTrackType, audioTrackValue);
|
||||||
setSelectedTextTrack(textTrackType, textTrackValue);
|
}
|
||||||
|
if (videoTrackType != null) {
|
||||||
|
setSelectedVideoTrack(videoTrackType, videoTrackValue);
|
||||||
|
}
|
||||||
|
if (textTrackType != null) {
|
||||||
|
setSelectedTextTrack(textTrackType, textTrackValue);
|
||||||
|
}
|
||||||
Format videoFormat = player.getVideoFormat();
|
Format videoFormat = player.getVideoFormat();
|
||||||
int width = videoFormat != null ? videoFormat.width : 0;
|
int width = videoFormat != null ? videoFormat.width : 0;
|
||||||
int height = videoFormat != null ? videoFormat.height : 0;
|
int height = videoFormat != null ? videoFormat.height : 0;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import AVFoundation
|
import AVFoundation
|
||||||
import Promises
|
import Promises
|
||||||
|
import Photos
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Collection of pure functions
|
* Collection of pure functions
|
||||||
@ -264,8 +265,23 @@ enum RCTVideoUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func preparePHAsset(uri: String) -> Promise<AVAsset?> {
|
||||||
|
return Promise<AVAsset?>(on: .global()) { fulfill, reject in
|
||||||
|
let assetId = String(uri[uri.index(uri.startIndex, offsetBy: "ph://".count)...])
|
||||||
|
guard let phAsset = PHAsset.fetchAssets(withLocalIdentifiers: [assetId], options: nil).firstObject else {
|
||||||
|
reject(NSError(domain: "", code: 0, userInfo: nil))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let options = PHVideoRequestOptions()
|
||||||
|
options.isNetworkAccessAllowed = true
|
||||||
|
PHCachingImageManager().requestAVAsset(forVideo: phAsset, options: options) { data, _, _ in
|
||||||
|
fulfill(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static func prepareAsset(source:VideoSource) -> (asset:AVURLAsset?, assetOptions:NSMutableDictionary?)? {
|
static func prepareAsset(source:VideoSource) -> (asset:AVURLAsset?, assetOptions:NSMutableDictionary?)? {
|
||||||
guard source.uri != nil && source.uri != "" else { return nil }
|
guard let sourceUri = source.uri, sourceUri != "" else { return nil }
|
||||||
var asset:AVURLAsset!
|
var asset:AVURLAsset!
|
||||||
let bundlePath = Bundle.main.path(forResource: source.uri, ofType: source.type) ?? ""
|
let bundlePath = Bundle.main.path(forResource: source.uri, ofType: source.type) ?? ""
|
||||||
let url = source.isNetwork || source.isAsset
|
let url = source.isNetwork || source.isAsset
|
||||||
|
@ -227,10 +227,20 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
RCTVideoUtils.delay()
|
RCTVideoUtils.delay()
|
||||||
.then{ [weak self] in
|
.then{ [weak self] in
|
||||||
guard let self = self else {throw NSError(domain: "", code: 0, userInfo: nil)}
|
guard let self = self else {throw NSError(domain: "", code: 0, userInfo: nil)}
|
||||||
guard let source = self._source,
|
guard let source = self._source else {
|
||||||
let assetResult = RCTVideoUtils.prepareAsset(source: source),
|
DebugLog("The source not exist")
|
||||||
let asset = assetResult.asset,
|
throw NSError(domain: "", code: 0, userInfo: nil)
|
||||||
let assetOptions = assetResult.assetOptions else {
|
}
|
||||||
|
if let uri = source.uri, uri.starts(with: "ph://") {
|
||||||
|
return Promise {
|
||||||
|
RCTVideoUtils.preparePHAsset(uri: uri).then { asset in
|
||||||
|
return self.playerItemPrepareText(asset:asset, assetOptions:nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
guard let assetResult = RCTVideoUtils.prepareAsset(source: source),
|
||||||
|
let asset = assetResult.asset,
|
||||||
|
let assetOptions = assetResult.assetOptions else {
|
||||||
DebugLog("Could not find video URL in source '\(self._source)'")
|
DebugLog("Could not find video URL in source '\(self._source)'")
|
||||||
throw NSError(domain: "", code: 0, userInfo: nil)
|
throw NSError(domain: "", code: 0, userInfo: nil)
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,11 @@ class RCTVideoPlayerViewController: AVPlayerViewController {
|
|||||||
|
|
||||||
override func viewDidDisappear(_ animated: Bool) {
|
override func viewDidDisappear(_ animated: Bool) {
|
||||||
super.viewDidDisappear(animated)
|
super.viewDidDisappear(animated)
|
||||||
rctDelegate.videoPlayerViewControllerWillDismiss(playerViewController: self)
|
|
||||||
rctDelegate.videoPlayerViewControllerDidDismiss(playerViewController: self)
|
if rctDelegate != nil {
|
||||||
|
rctDelegate.videoPlayerViewControllerWillDismiss(playerViewController: self)
|
||||||
|
rctDelegate.videoPlayerViewControllerDidDismiss(playerViewController: self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TARGET_OS_TV
|
#if !TARGET_OS_TV
|
||||||
|
Loading…
Reference in New Issue
Block a user