This plugin gives seamless access of your medias ingested in Kaltura backend with Playkit or Kaltura-Player. By using this plugin, developers don't need to care about Network calls, Thread Management etc. Simply pass the media Id and respective KS (Kaltura Session Token) and you are good to go for the playback.
Providers are designed for Kaltura OVP or Kaltura OTT customers. One can have a question what is the difference between OVP and OTT !
OVP BE takes care of storage, transcoding, delivery, packaging and distribution. It is media preparation part.
OTT BE takes care of Auth, Subscription and other distribution related services.
Apart from this, plugin provides Concurrency measurement feature. Plugin uses PhoenixAnalytics
for this.
For more info, please connect with Kaltura CSM.
If You are a Kaltura-Player developer then no setup is required. Kaltura-Player dependency is enough to use the Providers.
implementation 'com.kaltura.player:tvplayer:x.x.x'
Add Provider plugin dependency to build.gradle
. In android, we keep all plugins aligned with same version.
implementation 'com.kaltura.playkit:playkitproviders:x.x.x'
You can find the latest version here:
Moving ahead about the plugin,
Create OTTMediaAsset
object. It can be created using OTTMediaAsset()
and `OTTMediaAsset(@NonNull String assetId, List formats, @NonNull String protocol)'.
After creating OTTMediaAsset
, this object needs to be passed to OTTMediaOptions
.
var ottMediaAsset = OTTMediaAsset()
ottMediaAsset.assetId = "Asset_Id"
ottMediaAsset.assetType = "Asset_Type"
ottMediaAsset.contextType = "Context_Type"
ottMediaAsset.assetReferenceType = "Asset_Reference_Type"
ottMediaAsset.protocol = "Protocol"
ottMediaAsset.ks = "Kaltura_Session_Token"
ottMediaAsset.urlType = "URL_Type"
ottMediaAsset.streamerType = "Streamer_Type"
ottMediaAsset.adapterData = "Adapter_Type"
if (ottMedia.format != null) {
ottMediaAsset.setFormats("List_of_formats")
}
if (ottMedia.fileId != null) {
ottMediaAsset.setMediaFileIds("List_of_file_ids")
}
val ottMediaOptions = OTTMediaOptions(ottMediaAsset)
ottMediaAsset.contextType = APIDefines.PlaybackContextType.Playback
ottMediaAsset.assetType = APIDefines.KalturaAssetType.Media
ottMediaAsset.assetReferenceType = APIDefines.AssetReferenceType.Media
ottMediaAsset.contextType = APIDefines.PlaybackContextType.Catchup
ottMediaAsset.assetType = APIDefines.KalturaAssetType.Epg
ottMediaAsset.assetReferenceType = APIDefines.AssetReferenceType.InternalEpg //APIDefines.AssetReferenceType.ExternalEpg
ottMediaAsset.contextType = APIDefines.PlaybackContextType.StartOver
ottMediaAsset.assetType = APIDefines.KalturaAssetType.Epg
ottMediaAsset.assetReferenceType = APIDefines.AssetReferenceType.InternalEpg //APIDefines.AssetReferenceType.ExternalEpg
ottMediaAsset.contextType = APIDefines.PlaybackContextType.Playback
ottMediaAsset.assetType = APIDefines.KalturaAssetType.Recording
ottMediaAsset.assetReferenceType = APIDefines.AssetReferenceType.Npvr
ottMediaAsset.contextType = APIDefines.PlaybackContextType.Trailer
ottMediaAsset.assetType = APIDefines.KalturaAssetType.Media
ottMediaAsset.assetReferenceType = APIDefines.AssetReferenceType.Media
For more details about the parameters, please check the APIs in the later part of the document.
And finally OTTMediaOptions
should be passed to the Player for the playback in loadMedia(@NonNull final OTTMediaOptions mediaOptions, @NonNull final KalturaPlayer.OnEntryLoadListener onEntryLoadListener)
API.
player?.loadMedia(ottMediaOptions) { mediaOptions, entry, error ->
var entryId = ""
if (entry != null) {
entryId = entry.getId()
}
log.d("OTTMedia onEntryLoadComplete; $entryId ; $error")
handleOnEntryLoadComplete(error)
}
Create OVPMediaAsset
object. It can be created using OVPMediaAsset()
.
After creating OVPMediaAsset
, this object needs to be passed to OVPMediaOptions
.
var ovpMediaAsset = OVPMediaAsset()
ovpMediaAsset.entryId = "Entry_Id"
//ovpMediaAsset.referenceId = "Reference_Id"
ovpMediaAsset.redirectFromEntryId = "RedirectFromEntryId"
ovpMediaAsset.ks = "KS"
val ovpMediaOptions = OVPMediaOptions(ovpMediaAsset)
For more details about the parameters, please check the APIs in the later part of the document.
And finally OVPMediaOptions
should be passed to the Player for the playback in loadMedia(@NonNull final OVPMediaOptions mediaOptions, @NonNull final KalturaPlayer.OnEntryLoadListener onEntryLoadListener)
API.
player?.loadMedia(ovpMediaOptions) { mediaOptions, entry, error ->
var entryId = ""
if (entry != null) {
entryId = entry.getId()
}
log.d("OVPMedia onEntryLoadComplete; $entryId; $error")
handleOnEntryLoadComplete(error)
}
PhoenixMediaProvider
class handles the API calls for the OTT.
PhoenixMediaProvider(final String baseUrl, final int partnerId, final String ks)
baseURL
: URL for the BE calls. You can get it from OPC or TVM.
partnerID
: Unique partner id is generated after the account creation.
ks
: Kaltura Session Token. It can be user level auth token.
MANDATORY! provides the baseUrl and the session token(ks) for the API calls.
SessionProvider
can be create as below,
SessionProvider ksSessionProvider = new SessionProvider() {
@Override
public String baseUrl() {
String phoenixBaseUrl = "STRING_Base_URL";
return phoenixBaseUrl;
}
@Override
public void getSessionToken(OnCompletion<PrimitiveResult> completion) {
String ks = "STRING_KS";
if (completion != null) {
completion.onComplete(new PrimitiveResult(ks));
}
}
@Override
public int partnerId() {
int OttPartnerId = INT_Partner_Id;
return OttPartnerId;
}
};
How to create a OTT Provider (PhoenixMediaProvider) request and get the response for the media playback.
SessionProvider ksSessionProvider = new SessionProvider() {
@Override
public String baseUrl() {
String phoenixBaseUrl = "STRING_Base_URL";
return phoenixBaseUrl;
}
@Override
public void getSessionToken(OnCompletion<PrimitiveResult> completion) {
String ks = "STRING_KS";
if (completion != null) {
completion.onComplete(new PrimitiveResult(ks));
}
}
@Override
public int partnerId() {
int OttPartnerId = INT_Partner_Id;
return OttPartnerId;
}
};
String mediaIdPhoenix = mediaId;
MediaEntryProvider mediaProvider = new PhoenixMediaProvider()
.setSessionProvider(ksSessionProvider)
.setAssetId(mediaIdPhoenix)
.setPKStreamerType(APIDefines.KalturaStreamerType.Mpegdash)
.setProtocol(PhoenixMediaProvider.HttpProtocol.Https)
.setContextType(APIDefines.PlaybackContextType.Playback)
.setAssetType(APIDefines.KalturaAssetType.Media)
.setPKUrlType(APIDefines.KalturaUrlType.Direct);
Create a OnMediaLoadCompletion
object.
OnMediaLoadCompletion playLoadedEntry = new OnMediaLoadCompletion() {
@Override
public void onComplete(ResultElement<PKMediaEntry> response) {
context.runOnUiThread(new Runnable() {
@Override
public void run() {
if (response.isSuccess()) {
// Prepare player
} else {
// Diagnose the error
}
}
});
}
};
And pass this object it to PhoenixMediaProvider
object created in Step-1.
mediaProvider.load(playLoadedEntry);
KalturaOvpMediaProvider
class handles the API calls for the OTT.
KalturaOvpMediaProvider(final String baseUrl, final int partnerId, final String ks)
baseURL
: URL for the BE calls. You can get it from KMC.
partnerID
: Unique partner id is generated after the account creation.
ks
: Kaltura Session Token. It can be user level auth token.
MANDATORY! provides the baseUrl and the session token(ks) for the API calls.
Create object using SimpleSessionProvider(String baseUrl, int partnerId, String ks)
Build an OVP SessionProvider
with the specified parameters.
baseUrl
Kaltura Server URL, such as "https://cdnapisec.kaltura.com".
partnerId
Kaltura partner id
ks
Kaltura Session token
How to create a OVP Provider (KalturaOvpMediaProvider) request and get the response for the media playback.
MediaEntryProvider mediaProvider = new KalturaOvpMediaProvider()
.setSessionProvider(new SimpleSessionProvider("OVP_BASE_URL", "OVP_PARNTER_ID", "KS"))
.setEntryId("ENTRYID_FOR_MEDIA");
Create a OnMediaLoadCompletion
object.
OnMediaLoadCompletion playLoadedEntry = new OnMediaLoadCompletion() {
@Override
public void onComplete(ResultElement<PKMediaEntry> response) {
context.runOnUiThread(new Runnable() {
@Override
public void run() {
if (response.isSuccess()) {
// Prepare player
} else {
// Diagnose the error
}
}
});
}
};
And pass this object it to KalturaOvpMediaProvider
object created in Step-1.
mediaProvider.load(playLoadedEntry);
MANDATORY! the media asset id, to fetch the data for.
ESSENTIAL in EPG!! defines the playing AssetReferenceType especially in case of epg. Default is APIDefines.KalturaAssetType.Media
. Other values could be APIDefines.KalturaAssetType.Epg
, APIDefines.KalturaAssetType.Recording
.
ESSENTIAL!! defines the playing asset group type. Default is APIDefines.KalturaAssetType.Media
. Other values could be APIDefines.KalturaAssetType.Epg
, APIDefines.KalturaAssetType.Recording
.
ESSENTIAL!! defines the playing context: Trailer, Catchup, Playback etc. Default is APIDefines.PlaybackContextType.Playback
. Other calues could be APIDefines.PlaybackContextType.Trailer
, APIDefines.PlaybackContextType.Catchup
, APIDefines.PlaybackContextType.StartOver
.
NOT MANDATORY! The referrer url, to fetch the data for.
OPTIONAL! Values could be APIDefines.KalturaUrlType.PlayManifest
or APIDefines.KalturaUrlType.Direct
.
OPTIONAL! Value could be APIDefines.KalturaStreamerType.Applehttp
, APIDefines.KalturaStreamerType.Mpegdash
, APIDefines.KalturaStreamerType.Url
, APIDefines.KalturaStreamerType.Smothstreaming
, APIDefines.KalturaStreamerType.Multicast
, APIDefines.KalturaStreamerType.None
.
OPTIONAL! The desired protocol (http/https) for the playback sources. The default is null
, which makes the provider filter by server protocol.
OPTIONAL! Defines which of the sources to consider on PKMediaEntry
creation.
1 or more content format definition. can be: Hd, Sd, Download, Trailer etc like priority.
OPTIONAL! If not available all sources will be fetched. Provide a list of media files ids. will be used in the getPlaybackContext
API request.
Pass the list of MediaFile ids to narrow sources fetching from API to the specific files.
OPTIONAL! Provide a Map<String,String>
for providers adapter data .
MANDATORY! if referenceId
not set - the entryId
, to fetch the data for. Basically this is the id for a playable media.
MANDATORY! if entryId
not set - the referenceId
, to fetch the data for.
Basically this is the id for a playable media.
NOT MANDATORY! The referrer url, to fetch the data for.
NOT MANDATORY! The redirectFromEntryId. Application filter by redirectFromEntryId of EntryId default is true
.
Let's suppose you want to track how many concurrent users are logged-in or playing the media. Means Stream level concurrency, here you can take benefit of this feature.
For this first you need to register the plugin,
PlayKitManager.registerPlugins(this, PhoenixAnalyticsPlugin.factory);
After this, simply setup the Phoenix Analytics,
String ks = "Kaltura_Session_Token";
PhoenixAnalyticsConfig phoenixAnalyticsConfig = new PhoenixAnalyticsConfig(INT_PARTNER_ID, "BASE_URL", ks, INT_timerInterval);
config.setPluginConfig(PhoenixAnalyticsPlugin.factory.getName(), phoenixAnalyticsConfig);
Here timerInterval
field is the frequency of "Hit" or "Ping" going to the server for tracking. Value should be passed in 'Seconds'.
There are other options in PhoenixAnalyticsConfig
to set, can be found here.
After using the analytics, you can listen to the events which will tell when the concurrency is exceeded, if there is a bookmmark event error.
player?.addListener(this, PhoenixAnalyticsEvent.concurrencyError) { event ->
// Event payload has errorCode and errorMessage
}
player?.addListener(this, PhoenixAnalyticsEvent.bookmarkError) { event ->
// Event payload has errorCode and errorMessage
}
player?.addListener(this, PhoenixAnalyticsEvent.error) { event ->
// Event payload has errorCode and errorMessage
}
player?.addListener(this, PhoenixAnalyticsEvent.reportSent) { event ->
// Event payload has the reported event name
}
For more info, please connect with your CSM.
Kaltura Player Samples
Playkit Samples
Please take our FullDemo Sample. It has module playkitdemo which can be imported in Android Studio. It has examples for OVP and OTT media samples. It can be a quick starter code.