Merge pull request #2639 from virgil1996/fix/support-cameraroll
Fix crash when the source is a cameraroll
This commit is contained in:
		| @@ -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,8 +227,18 @@ 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), | ||||
|                 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)'") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user