Merge pull request #805 from emrah88/master
added optional request headers for remote assests (android & ios)
This commit is contained in:
commit
5f1ce1a429
24
Video.js
24
Video.js
@ -27,6 +27,29 @@ export default class Video extends Component {
|
|||||||
this._root.setNativeProps(nativeProps);
|
this._root.setNativeProps(nativeProps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toTypeString(x) {
|
||||||
|
switch (typeof x) {
|
||||||
|
case "object":
|
||||||
|
return x instanceof Date
|
||||||
|
? x.toISOString()
|
||||||
|
: JSON.stringify(x); // object, null
|
||||||
|
case "undefined":
|
||||||
|
return "";
|
||||||
|
default: // boolean, number, string
|
||||||
|
return x.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stringsOnlyObject(obj) {
|
||||||
|
const strObj = {};
|
||||||
|
|
||||||
|
Object.keys(obj).forEach(x => {
|
||||||
|
strObj[x] = this.toTypeString(obj[x]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return strObj;
|
||||||
|
}
|
||||||
|
|
||||||
seek = (time, tolerance = 100) => {
|
seek = (time, tolerance = 100) => {
|
||||||
if (Platform.OS === 'ios') {
|
if (Platform.OS === 'ios') {
|
||||||
this.setNativeProps({
|
this.setNativeProps({
|
||||||
@ -202,6 +225,7 @@ export default class Video extends Component {
|
|||||||
type: source.type || '',
|
type: source.type || '',
|
||||||
mainVer: source.mainVer || 0,
|
mainVer: source.mainVer || 0,
|
||||||
patchVer: source.patchVer || 0,
|
patchVer: source.patchVer || 0,
|
||||||
|
requestHeaders: source.headers ? this.stringsOnlyObject(source.headers) : {}
|
||||||
},
|
},
|
||||||
onVideoLoadStart: this._onLoadStart,
|
onVideoLoadStart: this._onLoadStart,
|
||||||
onVideoLoad: this._onLoad,
|
onVideoLoad: this._onLoad,
|
||||||
|
@ -17,6 +17,8 @@ import com.google.android.exoplayer2.util.Util;
|
|||||||
import okhttp3.Cookie;
|
import okhttp3.Cookie;
|
||||||
import okhttp3.JavaNetCookieJar;
|
import okhttp3.JavaNetCookieJar;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
public class DataSourceUtil {
|
public class DataSourceUtil {
|
||||||
|
|
||||||
@ -49,9 +51,10 @@ public class DataSourceUtil {
|
|||||||
DataSourceUtil.rawDataSourceFactory = factory;
|
DataSourceUtil.rawDataSourceFactory = factory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DataSource.Factory getDefaultDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) {
|
|
||||||
if (defaultDataSourceFactory == null) {
|
public static DataSource.Factory getDefaultDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) {
|
||||||
defaultDataSourceFactory = buildDataSourceFactory(context, bandwidthMeter);
|
if (defaultDataSourceFactory == null || (requestHeaders != null && !requestHeaders.isEmpty())) {
|
||||||
|
defaultDataSourceFactory = buildDataSourceFactory(context, bandwidthMeter, requestHeaders);
|
||||||
}
|
}
|
||||||
return defaultDataSourceFactory;
|
return defaultDataSourceFactory;
|
||||||
}
|
}
|
||||||
@ -64,17 +67,21 @@ public class DataSourceUtil {
|
|||||||
return new RawResourceDataSourceFactory(context.getApplicationContext());
|
return new RawResourceDataSourceFactory(context.getApplicationContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DataSource.Factory buildDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) {
|
private static DataSource.Factory buildDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) {
|
||||||
return new DefaultDataSourceFactory(context, bandwidthMeter,
|
return new DefaultDataSourceFactory(context, bandwidthMeter,
|
||||||
buildHttpDataSourceFactory(context, bandwidthMeter));
|
buildHttpDataSourceFactory(context, bandwidthMeter, requestHeaders));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HttpDataSource.Factory buildHttpDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) {
|
private static HttpDataSource.Factory buildHttpDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) {
|
||||||
OkHttpClient client = OkHttpClientProvider.getOkHttpClient();
|
OkHttpClient client = OkHttpClientProvider.getOkHttpClient();
|
||||||
CookieJarContainer container = (CookieJarContainer) client.cookieJar();
|
CookieJarContainer container = (CookieJarContainer) client.cookieJar();
|
||||||
ForwardingCookieHandler handler = new ForwardingCookieHandler(context);
|
ForwardingCookieHandler handler = new ForwardingCookieHandler(context);
|
||||||
container.setCookieJar(new JavaNetCookieJar(handler));
|
container.setCookieJar(new JavaNetCookieJar(handler));
|
||||||
return new OkHttpDataSourceFactory(client, getUserAgent(context), bandwidthMeter);
|
OkHttpDataSourceFactory okHttpDataSourceFactory = new OkHttpDataSourceFactory(client, getUserAgent(context), bandwidthMeter);
|
||||||
}
|
|
||||||
|
|
||||||
|
if (requestHeaders != null)
|
||||||
|
okHttpDataSourceFactory.getDefaultRequestProperties().set(requestHeaders);
|
||||||
|
|
||||||
|
return okHttpDataSourceFactory;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ import java.net.CookieHandler;
|
|||||||
import java.net.CookieManager;
|
import java.net.CookieManager;
|
||||||
import java.net.CookiePolicy;
|
import java.net.CookiePolicy;
|
||||||
import java.lang.Math;
|
import java.lang.Math;
|
||||||
|
import java.util.Map;
|
||||||
import java.lang.Object;
|
import java.lang.Object;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@ -117,6 +118,7 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
private float mProgressUpdateInterval = 250.0f;
|
private float mProgressUpdateInterval = 250.0f;
|
||||||
private boolean playInBackground = false;
|
private boolean playInBackground = false;
|
||||||
private boolean useTextureView = false;
|
private boolean useTextureView = false;
|
||||||
|
private Map<String, String> requestHeaders;
|
||||||
// \ End props
|
// \ End props
|
||||||
|
|
||||||
// React
|
// React
|
||||||
@ -416,7 +418,7 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
* @return A new DataSource factory.
|
* @return A new DataSource factory.
|
||||||
*/
|
*/
|
||||||
private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) {
|
private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) {
|
||||||
return DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, useBandwidthMeter ? BANDWIDTH_METER : null);
|
return DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, useBandwidthMeter ? BANDWIDTH_METER : null, requestHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
// AudioManager.OnAudioFocusChangeListener implementation
|
// AudioManager.OnAudioFocusChangeListener implementation
|
||||||
@ -660,14 +662,15 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
|
|
||||||
// ReactExoplayerViewManager public api
|
// ReactExoplayerViewManager public api
|
||||||
|
|
||||||
public void setSrc(final Uri uri, final String extension) {
|
public void setSrc(final Uri uri, final String extension, Map<String, String> headers) {
|
||||||
if (uri != null) {
|
if (uri != null) {
|
||||||
boolean isOriginalSourceNull = srcUri == null;
|
boolean isOriginalSourceNull = srcUri == null;
|
||||||
boolean isSourceEqual = uri.equals(srcUri);
|
boolean isSourceEqual = uri.equals(srcUri);
|
||||||
|
|
||||||
this.srcUri = uri;
|
this.srcUri = uri;
|
||||||
this.extension = extension;
|
this.extension = extension;
|
||||||
this.mediaDataSourceFactory = DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, BANDWIDTH_METER);
|
this.requestHeaders = headers;
|
||||||
|
this.mediaDataSourceFactory = DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, BANDWIDTH_METER, this.requestHeaders);
|
||||||
|
|
||||||
if (!isOriginalSourceNull && !isSourceEqual) {
|
if (!isOriginalSourceNull && !isSourceEqual) {
|
||||||
reloadSource();
|
reloadSource();
|
||||||
|
@ -13,6 +13,7 @@ import com.facebook.react.uimanager.ViewGroupManager;
|
|||||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||||
import com.google.android.exoplayer2.upstream.RawResourceDataSource;
|
import com.google.android.exoplayer2.upstream.RawResourceDataSource;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@ -24,6 +25,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi
|
|||||||
private static final String PROP_SRC = "src";
|
private static final String PROP_SRC = "src";
|
||||||
private static final String PROP_SRC_URI = "uri";
|
private static final String PROP_SRC_URI = "uri";
|
||||||
private static final String PROP_SRC_TYPE = "type";
|
private static final String PROP_SRC_TYPE = "type";
|
||||||
|
private static final String PROP_SRC_HEADERS = "requestHeaders";
|
||||||
private static final String PROP_RESIZE_MODE = "resizeMode";
|
private static final String PROP_RESIZE_MODE = "resizeMode";
|
||||||
private static final String PROP_REPEAT = "repeat";
|
private static final String PROP_REPEAT = "repeat";
|
||||||
private static final String PROP_SELECTED_TEXT_TRACK = "selectedTextTrack";
|
private static final String PROP_SELECTED_TEXT_TRACK = "selectedTextTrack";
|
||||||
@ -80,6 +82,8 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi
|
|||||||
Context context = videoView.getContext().getApplicationContext();
|
Context context = videoView.getContext().getApplicationContext();
|
||||||
String uriString = src.hasKey(PROP_SRC_URI) ? src.getString(PROP_SRC_URI) : null;
|
String uriString = src.hasKey(PROP_SRC_URI) ? src.getString(PROP_SRC_URI) : null;
|
||||||
String extension = src.hasKey(PROP_SRC_TYPE) ? src.getString(PROP_SRC_TYPE) : null;
|
String extension = src.hasKey(PROP_SRC_TYPE) ? src.getString(PROP_SRC_TYPE) : null;
|
||||||
|
Map<String, String> headers = src.hasKey(PROP_SRC_HEADERS) ? toStringMap(src.getMap(PROP_SRC_HEADERS)) : null;
|
||||||
|
|
||||||
|
|
||||||
if (TextUtils.isEmpty(uriString)) {
|
if (TextUtils.isEmpty(uriString)) {
|
||||||
return;
|
return;
|
||||||
@ -89,7 +93,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi
|
|||||||
Uri srcUri = Uri.parse(uriString);
|
Uri srcUri = Uri.parse(uriString);
|
||||||
|
|
||||||
if (srcUri != null) {
|
if (srcUri != null) {
|
||||||
videoView.setSrc(srcUri, extension);
|
videoView.setSrc(srcUri, extension, headers);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int identifier = context.getResources().getIdentifier(
|
int identifier = context.getResources().getIdentifier(
|
||||||
@ -208,4 +212,28 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi
|
|||||||
}
|
}
|
||||||
return ResizeMode.RESIZE_MODE_FIT;
|
return ResizeMode.RESIZE_MODE_FIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* toStringMap converts a {@link ReadableMap} into a HashMap.
|
||||||
|
*
|
||||||
|
* @param readableMap The ReadableMap to be conveted.
|
||||||
|
* @return A HashMap containing the data that was in the ReadableMap.
|
||||||
|
* @see 'Adapted from https://github.com/artemyarulin/react-native-eval/blob/master/android/src/main/java/com/evaluator/react/ConversionUtil.java'
|
||||||
|
*/
|
||||||
|
public static Map<String, String> toStringMap(@Nullable ReadableMap readableMap) {
|
||||||
|
if (readableMap == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
com.facebook.react.bridge.ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
|
||||||
|
if (!iterator.hasNextKey())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Map<String, String> result = new HashMap<>();
|
||||||
|
while (iterator.hasNextKey()) {
|
||||||
|
String key = iterator.nextKey();
|
||||||
|
result.put(key, readableMap.getString(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import com.android.vending.expansion.zipfile.APKExpansionSupport;
|
|||||||
import com.android.vending.expansion.zipfile.ZipResourceFile;
|
import com.android.vending.expansion.zipfile.ZipResourceFile;
|
||||||
import com.facebook.react.bridge.Arguments;
|
import com.facebook.react.bridge.Arguments;
|
||||||
import com.facebook.react.bridge.LifecycleEventListener;
|
import com.facebook.react.bridge.LifecycleEventListener;
|
||||||
|
import com.facebook.react.bridge.ReadableMap;
|
||||||
import com.facebook.react.bridge.WritableMap;
|
import com.facebook.react.bridge.WritableMap;
|
||||||
import com.facebook.react.uimanager.ThemedReactContext;
|
import com.facebook.react.uimanager.ThemedReactContext;
|
||||||
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
||||||
@ -30,6 +31,8 @@ import java.util.Map;
|
|||||||
import java.lang.Math;
|
import java.lang.Math;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
@SuppressLint("ViewConstructor")
|
@SuppressLint("ViewConstructor")
|
||||||
public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnPreparedListener, MediaPlayer
|
public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnPreparedListener, MediaPlayer
|
||||||
.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnInfoListener, LifecycleEventListener, MediaController.MediaPlayerControl {
|
.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnInfoListener, LifecycleEventListener, MediaController.MediaPlayerControl {
|
||||||
@ -89,6 +92,7 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
|
|||||||
|
|
||||||
private String mSrcUriString = null;
|
private String mSrcUriString = null;
|
||||||
private String mSrcType = "mp4";
|
private String mSrcType = "mp4";
|
||||||
|
private ReadableMap mRequestHeaders = null;
|
||||||
private boolean mSrcIsNetwork = false;
|
private boolean mSrcIsNetwork = false;
|
||||||
private boolean mSrcIsAsset = false;
|
private boolean mSrcIsAsset = false;
|
||||||
private ScalableType mResizeMode = ScalableType.LEFT_TOP;
|
private ScalableType mResizeMode = ScalableType.LEFT_TOP;
|
||||||
@ -206,16 +210,17 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset) {
|
public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders) {
|
||||||
setSrc(uriString,type,isNetwork,isAsset,0,0);
|
setSrc(uriString, type, isNetwork, isAsset, requestHeaders, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final int expansionMainVersion, final int expansionPatchVersion) {
|
public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders, final int expansionMainVersion, final int expansionPatchVersion) {
|
||||||
|
|
||||||
mSrcUriString = uriString;
|
mSrcUriString = uriString;
|
||||||
mSrcType = type;
|
mSrcType = type;
|
||||||
mSrcIsNetwork = isNetwork;
|
mSrcIsNetwork = isNetwork;
|
||||||
mSrcIsAsset = isAsset;
|
mSrcIsAsset = isAsset;
|
||||||
|
mRequestHeaders = requestHeaders;
|
||||||
mMainVer = expansionMainVersion;
|
mMainVer = expansionMainVersion;
|
||||||
mPatchVer = expansionPatchVersion;
|
mPatchVer = expansionPatchVersion;
|
||||||
|
|
||||||
@ -244,7 +249,15 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
|
|||||||
headers.put("Cookie", cookie);
|
headers.put("Cookie", cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
setDataSource(uriString);
|
if (mRequestHeaders != null) {
|
||||||
|
headers.putAll(toStringMap(mRequestHeaders));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* According to https://github.com/react-native-community/react-native-video/pull/537
|
||||||
|
* there is an issue with this where it can cause a IOException.
|
||||||
|
* TODO: diagnose this exception and fix it
|
||||||
|
*/
|
||||||
|
setDataSource(mThemedReactContext, parsedUrl, headers);
|
||||||
} else if (isAsset) {
|
} else if (isAsset) {
|
||||||
if (uriString.startsWith("content://")) {
|
if (uriString.startsWith("content://")) {
|
||||||
Uri parsedUrl = Uri.parse(uriString);
|
Uri parsedUrl = Uri.parse(uriString);
|
||||||
@ -290,8 +303,13 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
|
|||||||
}
|
}
|
||||||
|
|
||||||
WritableMap src = Arguments.createMap();
|
WritableMap src = Arguments.createMap();
|
||||||
|
|
||||||
|
WritableMap wRequestHeaders = Arguments.createMap();
|
||||||
|
wRequestHeaders.merge(mRequestHeaders);
|
||||||
|
|
||||||
src.putString(ReactVideoViewManager.PROP_SRC_URI, uriString);
|
src.putString(ReactVideoViewManager.PROP_SRC_URI, uriString);
|
||||||
src.putString(ReactVideoViewManager.PROP_SRC_TYPE, type);
|
src.putString(ReactVideoViewManager.PROP_SRC_TYPE, type);
|
||||||
|
src.putMap(ReactVideoViewManager.PROP_SRC_HEADERS, wRequestHeaders);
|
||||||
src.putBoolean(ReactVideoViewManager.PROP_SRC_IS_NETWORK, isNetwork);
|
src.putBoolean(ReactVideoViewManager.PROP_SRC_IS_NETWORK, isNetwork);
|
||||||
if(mMainVer>0) {
|
if(mMainVer>0) {
|
||||||
src.putInt(ReactVideoViewManager.PROP_SRC_MAINVER, mMainVer);
|
src.putInt(ReactVideoViewManager.PROP_SRC_MAINVER, mMainVer);
|
||||||
@ -581,10 +599,10 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
|
|||||||
super.onAttachedToWindow();
|
super.onAttachedToWindow();
|
||||||
|
|
||||||
if(mMainVer>0) {
|
if(mMainVer>0) {
|
||||||
setSrc(mSrcUriString, mSrcType, mSrcIsNetwork,mSrcIsAsset,mMainVer,mPatchVer);
|
setSrc(mSrcUriString, mSrcType, mSrcIsNetwork, mSrcIsAsset, mRequestHeaders, mMainVer, mPatchVer);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setSrc(mSrcUriString, mSrcType, mSrcIsNetwork,mSrcIsAsset);
|
setSrc(mSrcUriString, mSrcType, mSrcIsNetwork, mSrcIsAsset, mRequestHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -618,4 +636,25 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
|
|||||||
@Override
|
@Override
|
||||||
public void onHostDestroy() {
|
public void onHostDestroy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* toStringMap converts a {@link ReadableMap} into a HashMap.
|
||||||
|
*
|
||||||
|
* @param readableMap The ReadableMap to be conveted.
|
||||||
|
* @return A HashMap containing the data that was in the ReadableMap.
|
||||||
|
* @see 'Adapted from https://github.com/artemyarulin/react-native-eval/blob/master/android/src/main/java/com/evaluator/react/ConversionUtil.java'
|
||||||
|
*/
|
||||||
|
public static Map<String, String> toStringMap(@Nullable ReadableMap readableMap) {
|
||||||
|
Map<String, String> result = new HashMap<>();
|
||||||
|
if (readableMap == null)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
com.facebook.react.bridge.ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
|
||||||
|
while (iterator.hasNextKey()) {
|
||||||
|
String key = iterator.nextKey();
|
||||||
|
result.put(key, readableMap.getString(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ public class ReactVideoViewManager extends SimpleViewManager<ReactVideoView> {
|
|||||||
public static final String PROP_SRC = "src";
|
public static final String PROP_SRC = "src";
|
||||||
public static final String PROP_SRC_URI = "uri";
|
public static final String PROP_SRC_URI = "uri";
|
||||||
public static final String PROP_SRC_TYPE = "type";
|
public static final String PROP_SRC_TYPE = "type";
|
||||||
|
public static final String PROP_SRC_HEADERS = "requestHeaders";
|
||||||
public static final String PROP_SRC_IS_NETWORK = "isNetwork";
|
public static final String PROP_SRC_IS_NETWORK = "isNetwork";
|
||||||
public static final String PROP_SRC_MAINVER = "mainVer";
|
public static final String PROP_SRC_MAINVER = "mainVer";
|
||||||
public static final String PROP_SRC_PATCHVER = "patchVer";
|
public static final String PROP_SRC_PATCHVER = "patchVer";
|
||||||
@ -86,6 +87,7 @@ public class ReactVideoViewManager extends SimpleViewManager<ReactVideoView> {
|
|||||||
src.getString(PROP_SRC_TYPE),
|
src.getString(PROP_SRC_TYPE),
|
||||||
src.getBoolean(PROP_SRC_IS_NETWORK),
|
src.getBoolean(PROP_SRC_IS_NETWORK),
|
||||||
src.getBoolean(PROP_SRC_IS_ASSET),
|
src.getBoolean(PROP_SRC_IS_ASSET),
|
||||||
|
src.getMap(PROP_SRC_HEADERS),
|
||||||
mainVer,
|
mainVer,
|
||||||
patchVer
|
patchVer
|
||||||
);
|
);
|
||||||
@ -95,8 +97,9 @@ public class ReactVideoViewManager extends SimpleViewManager<ReactVideoView> {
|
|||||||
src.getString(PROP_SRC_URI),
|
src.getString(PROP_SRC_URI),
|
||||||
src.getString(PROP_SRC_TYPE),
|
src.getString(PROP_SRC_TYPE),
|
||||||
src.getBoolean(PROP_SRC_IS_NETWORK),
|
src.getBoolean(PROP_SRC_IS_NETWORK),
|
||||||
src.getBoolean(PROP_SRC_IS_ASSET)
|
src.getBoolean(PROP_SRC_IS_ASSET),
|
||||||
);
|
src.getMap(PROP_SRC_HEADERS)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,14 +324,21 @@ static NSString *const timedMetadata = @"timedMetadata";
|
|||||||
bool isAsset = [RCTConvert BOOL:[source objectForKey:@"isAsset"]];
|
bool isAsset = [RCTConvert BOOL:[source objectForKey:@"isAsset"]];
|
||||||
NSString *uri = [source objectForKey:@"uri"];
|
NSString *uri = [source objectForKey:@"uri"];
|
||||||
NSString *type = [source objectForKey:@"type"];
|
NSString *type = [source objectForKey:@"type"];
|
||||||
|
NSDictionary *headers = [source objectForKey:@"requestHeaders"];
|
||||||
|
|
||||||
NSURL *url = (isNetwork || isAsset) ?
|
NSURL *url = (isNetwork || isAsset) ?
|
||||||
[NSURL URLWithString:uri] :
|
[NSURL URLWithString:uri] :
|
||||||
[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:uri ofType:type]];
|
[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:uri ofType:type]];
|
||||||
|
|
||||||
if (isNetwork) {
|
if (isNetwork) {
|
||||||
|
NSMutableDictionary *assetOptions = [[NSMutableDictionary alloc]init];
|
||||||
|
if ([headers count] > 0) {
|
||||||
|
[assetOptions setObject:headers forKey:@"AVURLAssetHTTPHeaderFieldsKey"];
|
||||||
|
}
|
||||||
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
|
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
|
||||||
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:@{AVURLAssetHTTPCookiesKey : cookies}];
|
[assetOptions setObject:cookies forKey:AVURLAssetHTTPCookiesKey];
|
||||||
|
|
||||||
|
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:assetOptions];
|
||||||
return [AVPlayerItem playerItemWithAsset:asset];
|
return [AVPlayerItem playerItemWithAsset:asset];
|
||||||
}
|
}
|
||||||
else if (isAsset) {
|
else if (isAsset) {
|
||||||
|
Loading…
Reference in New Issue
Block a user