Merge pull request #2639 from virgil1996/fix/support-cameraroll
Fix crash when the source is a cameraroll
This commit is contained in:
commit
bb6b347ef0
@ -7,6 +7,7 @@
|
||||
- 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)
|
||||
- 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
|
||||
|
||||
|
2
Video.js
2
Video.js
@ -284,7 +284,7 @@ export default class Video extends Component {
|
||||
}
|
||||
|
||||
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;
|
||||
const RCTVideoInstance = this.getViewManagerConfig('RCTVideo');
|
||||
|
@ -1,5 +1,6 @@
|
||||
import AVFoundation
|
||||
import Promises
|
||||
import Photos
|
||||
|
||||
/*!
|
||||
* 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?)? {
|
||||
guard source.uri != nil && source.uri != "" else { return nil }
|
||||
guard let sourceUri = source.uri, sourceUri != "" else { return nil }
|
||||
var asset:AVURLAsset!
|
||||
let bundlePath = Bundle.main.path(forResource: source.uri, ofType: source.type) ?? ""
|
||||
let url = source.isNetwork || source.isAsset
|
||||
|
@ -227,10 +227,20 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
||||
RCTVideoUtils.delay()
|
||||
.then{ [weak self] in
|
||||
guard let self = self else {throw NSError(domain: "", code: 0, userInfo: nil)}
|
||||
guard let source = self._source,
|
||||
let assetResult = RCTVideoUtils.prepareAsset(source: source),
|
||||
let asset = assetResult.asset,
|
||||
let assetOptions = assetResult.assetOptions else {
|
||||
guard let source = self._source else {
|
||||
DebugLog("The source not exist")
|
||||
throw NSError(domain: "", code: 0, userInfo: nil)
|
||||
}
|
||||
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)'")
|
||||
throw NSError(domain: "", code: 0, userInfo: nil)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user