# VO Player (Nowtilus SSAI)

## STEP 0

Please find the Sample reference application under&#x20;

<https://mediamelon-builds.s3.amazonaws.com/MM-RELEASE-BUILDS/SDK_RELEASES/Android/2023-05-11/voPlayer/VO-Player-SSAI-Release-(09.05.00).zip>

## STEP 1

Add the following lines to access the SDK&#x20;

In the Sample Application this is added in CustomPlayerActivity.java<br>

```java
//MM1
import com.mediamelon.smartstreaming.MMPlayerState;
import com.mediamelon.smartstreaming.MMSmartStreamingNowtilusSSAIPlugin;
import com.mediamelon.smartstreaming.mmAd;
import com.mediamelon.smartstreaming.mmAdTimelineInfo;
import com.mediamelon.smartstreaming.MMSSAIEventsListeners;
import com.mediamelon.smartstreaming.MMSmartStreaming;
import com.mediamelon.smartstreaming.MMSmartStreamingVOAdaptor;
//MM1
```

## STEP 2

startMediaMelonSDK() API calls all MediaMelon SDK Integration API's. To start MediaMelon SDK, please call startMediaMelonSDK() API.And register MediaMelon SDK using your assigned customerID in StartMediaMelonSDK() API. Please refer code block below.

{% hint style="info" %}
**Note:**

Please provide the exact correct details in all fields like CUSTOMER\_ID, ASSET\_ID, ASSET\_TITLE, VIDEO\_ID, PLAYER\_BRAND, PLAYER\_MODEL, PLAYER\_VERSION, PLAYER\_NAME, DOMAIN\_NAME, SUBSCRIBER\_ID, SUBSCRIBER\_TYPE & SUBSCRIBER\_TAG.\
\
This data helps in debugging through MediaMelon SmartSight if anything goes wrong.
{% endhint %}

```java
    //MM2
    boolean sdkIntegration = false;
    public void startMediaMelonSDK() {

        //MM2A
            sdkIntegration = true;
            mmVoPlayerAdapter = new MMSmartStreamingVOAdaptor(getApplicationContext(), mMyVOPlayer);
            mmVoPlayerAdapter.enableLogTrace(true); // Set false in production
    
            if (!MMSmartStreaming.getRegistrationStatus()) {
                mmVoPlayerAdapter.registerMMSmartStreaming("VoPlayer", "1922042005", "subscriber_id", "Domain", "subscriber_type", "subscriber_tag");
            }
    
            Log.d("MM Reg", "MM Reg:" + MMSmartStreaming.getRegistrationStatus());
            mmVoPlayerAdapter.reportPlayerInfo("VO", "VoPlayers", "1.0");
            //MM2A
             
    }
    //MM2
```

### Parameters passed in Registration call

| Variable        | Description                                                                                                                                                                          |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| $PLAYERNAME     | Player Name as in ExoPlayer, KalturaPlayer etc.                                                                                                                                      |
| $CUSTOMERID     | String containing your MediaMelon-assigned Customer ID.                                                                                                                              |
| $SUBSCRIBERID   | String containing your subscriber’s ID. If you do not use subscriber IDs, leave it as it is.                                                                                         |
| $DOMAINNAME     | String containing your section of your subscriber or assets. (Optional)                                                                                                              |
| $SUBSCRIBERTYPE | String containing the subscriber type (e.g. “Free”, “Paid”). If you do not use subscriber types, leave it as it is.                                                                  |
| $SUBSCRIBERTAG  | String containing an additional subscriber-specific information. This is sent in clear (not hashed) to SmartSight and it is advised to not send sensitive information in this field. |

## STEP 3

Add the below lines following the registration to enable the Nowtilus SSAI Ad Manager in startMediaMelonSDK() API.&#x20;

\
\&#xNAN;***NOTE*** - `boolean enablePollingforSSAI`  variable indicates whether the Mediamelon SDK needs to poll for the VAST URL or not. Please set it to true if you want to opt for polling else set it to false.

For VOD Streams , set isLive Parameter false and stores AD information in vodResponseData and sends to NowtilusAdManager&#x20;

Refer `getURLDetails` function in the sample application to get the mediaURL and AD Data from the curl request for both live and VoD streams. If the stream is VoD, set the `isLive` variable to `false`. If the stream is Live, set the `isLive` variable to `true`.  <br>

```java
       //MM2
       public void startMediaMelonSDK(){
            //MM2A
            .......
            //MM2A
            
            //MM2B
            //PROVIDE THE VIDEO ASSET INFORMATION HERE
            JSONObject mVideoAssetInfo = new JSONObject();
            try {
                 mVideoAssetInfo.put("assetName","SampleAsset");
                 mVideoAssetInfo.put("assetId","0001") ;
                 mVideoAssetInfo.put("videoId","0002") ;
                 mVideoAssetInfo.put("contentType","contentType");
                 mVideoAssetInfo.put("drmProtection","drm");
                 mVideoAssetInfo.put("episodeNumber","episode");
                 mVideoAssetInfo.put("genre","genre");
                 mVideoAssetInfo.put("seriesTitle","series");
                 mVideoAssetInfo.put("season","season");
                 mVideoAssetInfo.put("videoType","video");

                 //For CustomTags
                 JSONObject customTags = new JSONObject();
                 customTags.put("ABC","123");
                 customTags.put("DEF","456");
     
                 mVideoAssetInfo.put("customTags", customTags);
     
             } catch (JSONException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
            // mMyUri - Media URL
            //$ISLIVE - FOR LIVE STREAMS TRUE ELSE FALSE
             mmVoPlayerAdapter.initializeSession(mMyVOPlayer, mMyUri,mVideoAssetInfo,$ISLIVE);
             
             // vastURL - URL for VAST
            // vodResponseData - 
            // isLive(third parameter) - True for Live streams and false for VOD
            // The last parameter setupNowtilusAdManager enablePollingforSSAI is alsways
            
             mmVoPlayerAdapter.setupNowtilusAdManager(mMyUri, vastURL,vodResponseData, true, true);
             
             mmVoPlayerAdapter.reportUserInitiatedPlayback();
            //MM2B
       
       }
       //MM2
       
  
```

## STEP 4

Subscribe to AD EVENTS in startMediaMelonSDK() API. Please refer code block below

```java
//MM2
public void startMediaMelonSDK(){
    
     //MM2A
        ......
     //MM2A
     
            
     //MM2B
        .......
     //MM2B     
     
     //MM2C    
        // Subscribe to AD EVENTS
        MMSSAIEventsListeners mmssaiEventsListeners = new MMSSAIEventsListeners() {
            @Override
            public void onAdImpression(mmAd ssaiAdInfo) {
                Log.d("APP SSAI", "onAdImpression:" + ssaiAdInfo.adId);
            }

            @Override
            public void onAdComplete(mmAd ssaiAdInfo) {
                Log.d("APP SSAI", "onAdComplete:" + ssaiAdInfo.adId);
            }

            @Override
            public void onCueTimelineAdded(mmAdTimelineInfo timelineInfo) {
                Log.d("APP SSAI", "onCueTimelineAdded totalAds: " + timelineInfo.totalAds);
            }

            @Override
            public void onCueTimelineEnter(mmAd ssaiAdInfo) {
                Log.d("APP SSAI", "onCueTimelineEnter:" + ssaiAdInfo.adId);
            }

            @Override
            public void onCueTimelineExit(mmAd ssaiAdInfo) {
                Log.d("APP SSAI", "onCueTimelineExit:" + ssaiAdInfo.adId);
            }
        };
        mmVoPlayerAdapter.getSSAIAdManager().addListener(mmssaiEventsListeners);
    //MM2C
}
//MM2
```

## STEP 5

ADD API for stopping MediaMelon SDK.To stop MediaMelon SDK please call stopMediaMelonSDK(). Please refer code block below&#x20;

```java

    //MM3
        public void stopMediaMelonSDK(){
           if(sdkIntegration) mmVoPlayerAdapter.closeMediaMelonSDK(); 
        }
    //MM3
```

## STEP 6 : To Stop the SSAI Ad Manager

Report the player state has ENDED, when the player was destroyed

ADD closeSSAIAdManager() API in onDestroy() listener in CustomPlayerActivity.java

```java
@Override
protected void onDestroy() {
    
    //MM4
    this.mmSmartStreamingNowtilusSSAIPlugin.closeSSAIAdManager(); // Added for stopping VastInfo after player destroyed
    
    //...........

}
```

## List of AD EVENTS

```
onAdImpression
onAdStarted
onAdFirstQuartile
onAdMidpoint
onAdThirdQuartile
onAdProgress
onAdComplete
onCueTimelineAdded 
onCueTimelineEnter
onCueTimelineExit
```

| Event Callback     | Description                                                               |
| ------------------ | ------------------------------------------------------------------------- |
| onAdImpression     | Fired when an Ad Impression occurs                                        |
| onAdStarted        | Fired when Ad starts playing                                              |
| onAdFirstQuartile  | Fired when Ad playback reaches the First Quartile point                   |
| onAdMidpoint       | Fired when Ad playback reaches the Midpoint                               |
| onAdThirdQuartile  | Fired when Ad playback reaches the Third Quartile point                   |
| onAdProgress       | Fired every second during Ad Playback, used to track Ad Playback progress |
| onAdComplete       | Fired when Ad Playback completes                                          |
| onCueTimelineAdded | Fired when an Ad break information gets added                             |
| onCueTimelineEnter | Fired when an Ad break ( which can contain multiple Ads) starts           |
| onCueTimeLineExit  | Fired when an Ad break ( which can contain multiple Ads) ends             |

## Get Ad Related Information

You can use the below commands from inside any of the AD Events(listed above) that you subscribe to.

1. &#x20;**`ssaiAdInfo.getTotalAds()`**- returns a `int` which signifies the number of Ads in the current Ad break.
2. &#x20;**`ssaiAdInfo.getClickTrackingURLs()`**-returns the click tracking URLs as a *List\<String>.*
3. **`ssaiAdInfo.getClickThroughURLs()`** -returns the clickthrough URLs as a *List\<String>.*
4. **`ssaiAdInfo.getAdSkipOffset()`-** returns the   AD offset in  `seconds.`
5. **`ssaiAdInfo.getCompleteTrackers()`**` ``-` returns the  AD Complete Tracking URLs as a *List\<String>.*
6. **`ssaiAdInfo.getMidpointTrackers()`**` ``-` returns the  AD Midpoint Tracking URLs as a *List\<String>.*
7. **`ssaiAdInfo.getThirdQuartileTrackers()`**` ``-` returns the  AD ThirdQuartile Tracking URLs as a *List\<String>.*
8. **`ssaiAdInfo.getFirstQuartileTrackers()`**` ``-` returns the  AD FirstQuartile Tracking URLs as a *List\<String>.*
9. **`ssaiAdInfo.getImpressionTrackers()`**` ``-` returns the  AD Impression URLs as a *List\<String>.*
10. **`ssaiAdInfo.getAdIndex()`**` ``-` returns the index of the current AD in the AD break.
11. **`ssaiAdInfo.getStartPos()`**` ``-` returns the start position of the Ad Break relative to the first manifest program time
12. **`ssaiAdInfo.getEndPos()`**` ``-` returns the end position of the Ad Break relative to the first manifest program time

##
