package com.kaltura.playersdk; import android.net.Uri; import com.kaltura.playersdk.config.KProxyData; import com.kaltura.playersdk.players.KMediaFormat; import com.kaltura.playersdk.utils.Utilities; import org.json.JSONException; import org.json.JSONObject; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import static com.kaltura.playersdk.utils.LogUtils.LOGD; public class KPPlayerConfig implements Serializable{ public static class CacheConfig { List<Pattern> includePatterns = new ArrayList<>(); public void addIncludePattern(String pattern) { includePatterns.add(Pattern.compile(pattern)); } public void addIncludePattern(Pattern pattern) { includePatterns.add(pattern); } public void reset() { includePatterns.clear(); } } public static String TAG = "KPPlayerConfig"; /// Key names of the video request private static final String sKsKey = "ks"; private static final String sWidKey = "wid"; private static final String sUiConfIdKey = "uiconf_id"; private static final String sEntryIdKey = "entry_id"; private double mMediaPlayFrom = 0; private String mServerURL; private String mEntryId; private String mUiConfId; private String mPartnerId; private String mLocalContentId = ""; private float mCacheSize = 100f; // 100mb is a sane default. private String mKS; private String mAdMimeType; private int mAdPreferredBitrate; private int mContentPreferredBitrate; private Map<String, String> mExtraConfig = new HashMap<>(); private boolean mAutoPlay = false; private boolean isWebDialogEnabled = false; private final CacheConfig mCacheConfig = new CacheConfig(); static { // Use System.out to print even when Log.X() are disabled. System.out.println("Kaltura Player Android SDK, version " + BuildConfig.VERSION_NAME); } public static String getPlayerSdkVersion() { return BuildConfig.VERSION_NAME; } public CacheConfig getCacheConfig() { return mCacheConfig; } public String getPartnerId() { return mPartnerId; } public String getServerURL() { return mServerURL; } public KPPlayerConfig(String serverURL, String uiConfId, String partnerId) { mServerURL = serverURL; mUiConfId = uiConfId; mPartnerId = partnerId; mAdMimeType = KMediaFormat.mp4_clear.mimeType; mAdPreferredBitrate = -1; // in bits mContentPreferredBitrate = -1; // in KBits addConfig("nativeVersion", BuildConfig.VERSION_NAME); } private KPPlayerConfig() {} /** * Creates a KPPlayerConfig object that wraps the given EmbedFrame URL. * The returned object is immutable, except for cache size. The other fields are not even set, * so their getters will return null. * @param url EmbedFrame URL. * @return new KPPlayerConfig. */ public static KPPlayerConfig fromEmbedFrameURL(String url) { final String embedFrameURL = url; KPPlayerConfig config = new KPPlayerConfig() { @Override public String getVideoURL() { // just return the input embedFrameURL, don't build it. //adding # so in native callout will have the hash of supported mimetypes return embedFrameURL + "#"; } // Block the setters that would change the url. @Override public KPPlayerConfig setEntryId(String entryId) { throw new UnsupportedOperationException("Can't set entryId"); } @Override public KPPlayerConfig setKS(String KS) { throw new UnsupportedOperationException("Can't set ks"); } @Override public KPPlayerConfig addConfig(String key, String value) { throw new UnsupportedOperationException("Can't add config"); } }; Uri uri = Uri.parse(embedFrameURL); config.mServerURL = uri.getScheme() + "://" + uri.getAuthority(); return config; } public static KPPlayerConfig fromJSONObject(JSONObject configJSON) throws JSONException { JSONObject base = configJSON.getJSONObject("base"); KPPlayerConfig config = new KPPlayerConfig( base.getString("server"), base.getString("uiConfId"), base.getString("partnerId")); config.setEntryId(Utilities.optString(base, "entryId")); config.setKS(Utilities.optString(base, "ks")); if (!configJSON.isNull("extra")) { JSONObject extra = configJSON.getJSONObject("extra"); for (Iterator<String> it = extra.keys(); it.hasNext(); ) { String key = it.next(); Object value = extra.opt(key); if (value != null) { config.addConfig(key, value.toString()); } } } config.addConfig("nativeVersion", BuildConfig.VERSION_NAME); return config; } public KPPlayerConfig addConfig(String key, String value) { if (key != null && key.length() > 0 && value != null && value.length() > 0) { if (key.equals("mediaProxy.mediaPlayFrom")) { mMediaPlayFrom = Double.parseDouble(value); return this; } if (key.equals("mediaProxy.preferedFlavorBR") || key.equals("mediaProxy.preferredFlavorBR")) { // in web it is preferedFlavorBR if it is fixed will keep working mContentPreferredBitrate = Integer.valueOf(value); return this; } mExtraConfig.put(key, value); } return this; } public KPPlayerConfig addProxyData(KProxyData proxyData) { LOGD(TAG, "addProxyData - proxyData = " + proxyData.toJson().toString()); return addConfig("proxyData", proxyData.toJson().toString()); } public boolean isAutoPlay() { return mAutoPlay; } public void setAutoPlay(boolean autoPlay) { mAutoPlay = autoPlay; addConfig("autoPlay", autoPlay ? "true" : "false"); } public void setWebDialogEnabled(boolean isEnabled) { isWebDialogEnabled = isEnabled; } public boolean isWebDialogEnabled() { return isWebDialogEnabled; } public String getQueryString() { Uri.Builder builder = new Uri.Builder(); // First add basic fields if (mPartnerId != null) { builder.appendQueryParameter(sWidKey, "_" + mPartnerId); } if (mUiConfId != null) { builder.appendQueryParameter(sUiConfIdKey, mUiConfId); } if (mEntryId != null) { builder.appendQueryParameter(sEntryIdKey, mEntryId); } if (mKS != null) { builder.appendQueryParameter(sKsKey, mKS); } // Then the extras for (Map.Entry<String, String> entry : mExtraConfig.entrySet()) { builder.appendQueryParameter("flashvars[" + entry.getKey() + "]", entry.getValue()); } return builder.build().getEncodedQuery(); } public void setChromecastEnabled(boolean chromecastEnabled) { addConfig("chromecast.plugin", String.valueOf(chromecastEnabled)); } public void setHideControlsOnPlay(boolean hide) { addConfig("controlBarContainer.hover", Boolean.toString(hide)); } public String getLocalContentId() { return mLocalContentId; } public void setLocalContentId(String localContentId) { mLocalContentId = localContentId; } public void setCacheSize (float cacheSize) { mCacheSize = cacheSize; } public float getCacheSize() { return mCacheSize; } public String getVideoURL() { Uri.Builder builder = Uri.parse(mServerURL).buildUpon(); builder.appendPath("p").appendPath(mPartnerId).appendPath("sp").appendPath(mPartnerId + "00") .appendPath("embedIframeJs").appendPath("uiconf_id").appendPath(mUiConfId); if (mEntryId != null) { builder.appendPath(sEntryIdKey).appendPath(mEntryId); } builder.appendQueryParameter("iframeembed", "true"); return builder.build().toString() + "&" + getQueryString() + "#localContentId=" + mLocalContentId + "&"; } public String getEntryId() { return mEntryId; } public KPPlayerConfig setEntryId(String entryId) { mEntryId = entryId; return this; } public String getUiConfId() { return mUiConfId; } public KPPlayerConfig setKS(String KS) { mKS = KS; return this; } public String getKS() { return mKS; } public double getMediaPlayFrom() { return mMediaPlayFrom; } public String getConfigValueString(String key) { return mExtraConfig.get(key); } /* This method give the ability to change the default MP4 ad plyback to some other mimetypes: //mimeTypes.add("application/x-mpegURL"); //mimeTypes.add("video/mp4"); //mimeTypes.add("video/3gpp"); */ public void setAdMimeType(String adMimeType) { mAdMimeType = adMimeType; } public String getAdMimeType() { return mAdMimeType; } /* This method defines the preferred bitrate threshold in bits 1Mbit = 1000000bit the IMAAdPlayer will taske bitratethat match this threshold and is <= from it */ public void setAdPreferredBitrate(int adPreferredBitrate) { mAdPreferredBitrate = adPreferredBitrate; } public int getAdPreferredBitrate() { return mAdPreferredBitrate; } public int getContentPreferredBitrate() { return mContentPreferredBitrate; } }