<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nielsentest.mywikis.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin3</id>
	<title>Engineering Client Portal - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://nielsentest.mywikis.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin3"/>
	<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/wiki/Special:Contributions/Admin3"/>
	<updated>2026-04-04T09:50:20Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3658</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3658"/>
		<updated>2019-05-09T16:22:39Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
|debug || Enables Nielsen console logging. Only required for testing [true,false]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
=== User Opt Out === &lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the User Opt-Out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player (or page in relation to static measurement) includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Once users have opted out via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=total&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link], their browser cookies will contain the value '''TOTAL_OPTOUT'''. This will prevent a redirect to our data provider from occurring&lt;br /&gt;
* Users can opt back in via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=cancel&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link].  When a user selects that link, their opt-out cookie will be deleted and they will be able to be measured moving forward.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The following paragraph is a template for a Privacy Statement.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== User Opt Back In ====&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsSDK600.bundle.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_Main-GTM_P&amp;amp;asn=Main-GTM&amp;amp;sessionId=8l2XGnAW6IC3Cc2MIMh0RYRTqimuU1553108759&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=NA&amp;amp;c13=asid,P00BEB680-1F1A-47BB-922D-1BD2F1BA79A7&amp;amp;c32=...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test Opt-Out&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3657</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3657"/>
		<updated>2019-05-09T16:22:27Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
|debug || Enables Nielsen console logging. Only required for testing [true,false]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
=== User Opt Out === &lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the User Opt-Out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player (or page in relation to static measurement) includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Once users have opted out via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=total&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link], their browser cookies will contain the value '''TOTAL_OPTOUT'''. This will prevent a redirect to our data provider from occurring&lt;br /&gt;
* Users can opt back in via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=cancel&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link].  When a user selects that link, their opt-out cookie will be deleted and they will be able to be measured moving forward.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The following paragraph is a template for a Privacy Statement.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== User Opt Back In ====&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsSDK600.bundle.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_Main-GTM_P&amp;amp;asn=Main-GTM&amp;amp;sessionId=8l2XGnAW6IC3Cc2MIMh0RYRTqimuU1553108759&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=NA&amp;amp;c13=asid,P00BEB680-1F1A-47BB-922D-1BD2F1BA79A7&amp;amp;c32=...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test Opt-Out&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Artifactory_Guide&amp;diff=3656</id>
		<title>Digital Measurement iOS Artifactory Guide</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Artifactory_Guide&amp;diff=3656"/>
		<updated>2019-05-09T16:21:23Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
&lt;br /&gt;
= How to install Nielsen SDK in iOS  =&lt;br /&gt;
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 30 thousand libraries and is used in over 1.9 million apps. The Nielsen SDK now uses this distribution framework for improved version management and provides a Static and Dynamic Framework.&lt;br /&gt;
&lt;br /&gt;
== Initial Configuration ==&lt;br /&gt;
The Nielsen SDK integration requires Cocoapods.  &lt;br /&gt;
* The Dynamic Framework which requires Cocoapods Version 1.6.1 or higher.&lt;br /&gt;
* The Static Framework requires Cocoapods version 1.4.0. or higher.&lt;br /&gt;
&lt;br /&gt;
The full installation guide for this framework is provided on the [https://guides.cocoapods.org/using/getting-started.html Getting Started] page, and how to set up the Podfile is mentioned in [https://guides.cocoapods.org/using/using-cocoapods.html Using Cocoapods] page.&lt;br /&gt;
&lt;br /&gt;
== Repository Credentials ==&lt;br /&gt;
The first step is to add the credentials received from Nielsen into your .netrc file.&lt;br /&gt;
Navigate to your home folder and create a file called .netrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
cd ~/&lt;br /&gt;
vi .netrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Within this file you need to add your credentials in the following format:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
machine raw.githubusercontent.com&lt;br /&gt;
login &amp;lt;Nielsen App SDK client&amp;gt;&lt;br /&gt;
password &amp;lt;Auth token&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Credentials ===&lt;br /&gt;
Obtain credentials '''[[Digital Downloads| → here ←]]'''&lt;br /&gt;
&lt;br /&gt;
== Verify version of Cocoapods ==&lt;br /&gt;
First verify that Cocoapods is installed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If it is not, then install.&amp;lt;br &amp;gt;&lt;br /&gt;
===== Install via gem =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
sudo gem install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Install using homebrew ===== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
brew install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Add Cocoapod repository ==&lt;br /&gt;
=== Dynamic Framework (Cocoapods 1.6.1+) ===&lt;br /&gt;
If using '''Dynamic Framework''' (preferred approach), from the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '11.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
 use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For Static Framework (Cocoapods 1.4+) ===&lt;br /&gt;
From the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/nielsendigitalsdk/nielsenappsdk-ios-specs.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''NOTE: You can have multiple pods within the Podfile''&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== For Cocoapods Versions &amp;lt; 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
If you are using a version of Cocoapods that is less than 1.6.0, you have a Swift Project and your pod has '''use_frameworks!''' please use the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
# Uncomment the next line to define a global platform for your project&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks&lt;br /&gt;
use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
&lt;br /&gt;
static_frameworks = ['NielsenAppSDK']&lt;br /&gt;
# make all the other frameworks into static frameworks by overriding the static_framework? function to return true&lt;br /&gt;
pre_install do |installer|&lt;br /&gt;
    installer.pod_targets.each do |pod|&lt;br /&gt;
        if static_frameworks.include?(pod.name)&lt;br /&gt;
            puts &amp;quot;Overriding the static_framework? method for #{pod.name}&amp;quot;&lt;br /&gt;
            def pod.static_framework?;&lt;br /&gt;
            true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Execute Install ==&lt;br /&gt;
Once that has been edited, you can now execute the install:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
pod install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Cocoapods will automatically create a new file with extension “.xcworkspace”. From this moment, that file should be used for using the target project instead of previous one with extension “.xcodeproj”. Inside of this workspace you will see “Pods” target which will include ready to use NielsenAppApi framework.&lt;br /&gt;
&lt;br /&gt;
Open the file with the extension of &amp;lt;code&amp;gt;.xcworkspace&amp;lt;/code&amp;gt; file using Xcode.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Build Notes ==&lt;br /&gt;
Please note that the Nielsen dynamic framework contains slices for devices and simulators.  When building your project it is recommended that Simulator slices are removed before sending the app to the AppStore.   An example of the shell script that should be added as a Run Script phase in the application is attached&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
APP_PATH=&amp;quot;${TARGET_BUILD_DIR}/${WRAPPER_NAME}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# This script loops through the frameworks embedded in the application and&lt;br /&gt;
# removes unused architectures.&lt;br /&gt;
find &amp;quot;$APP_PATH&amp;quot; -name '*.framework' -type d | while read -r FRAMEWORK&lt;br /&gt;
do&lt;br /&gt;
FRAMEWORK_EXECUTABLE_NAME=$(defaults read &amp;quot;$FRAMEWORK/Info.plist&amp;quot; CFBundleExecutable)&lt;br /&gt;
FRAMEWORK_EXECUTABLE_PATH=&amp;quot;$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
echo &amp;quot;Executable is $FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EXTRACTED_ARCHS=()&lt;br /&gt;
&lt;br /&gt;
for ARCH in $ARCHS&lt;br /&gt;
do&lt;br /&gt;
echo &amp;quot;Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
lipo -extract &amp;quot;$ARCH&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot; -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;&lt;br /&gt;
EXTRACTED_ARCHS+=(&amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Merging extracted architectures: ${ARCHS}&amp;quot;&lt;br /&gt;
lipo -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; -create &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
rm &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Replacing original executable with thinned version&amp;quot;&lt;br /&gt;
rm &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
mv &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pod Versions ==&lt;br /&gt;
The following Pod versions are now available:&lt;br /&gt;
* NielsenAppSDK&lt;br /&gt;
* NielsenTVOSAppSDK &lt;br /&gt;
* VRIAppSDK &lt;br /&gt;
&lt;br /&gt;
=== Regional Builds ===&lt;br /&gt;
* NielsenAGFAppSDK&lt;br /&gt;
*  NielsenAGFTVOSAppSDK&lt;br /&gt;
* NielsenAGFNoAdAppSDK&lt;br /&gt;
*  NielsenAGFNoAdTVOSAppSDK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Additional Resources ===&lt;br /&gt;
&lt;br /&gt;
For more information on [https://guides.cocoapods.org/using/getting-started.html) CocoaPods] or How to set up the Profile in the [https://guides.cocoapods.org/using/using-cocoapods.html) Using Cocoapods] page.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Artifactory_Guide&amp;diff=3655</id>
		<title>Digital Measurement iOS Artifactory Guide</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Artifactory_Guide&amp;diff=3655"/>
		<updated>2019-05-09T16:19:24Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
&lt;br /&gt;
= How to install Nielsen SDK in iOS  =&lt;br /&gt;
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 30 thousand libraries and is used in over 1.9 million apps. The Nielsen SDK now uses this distribution framework for improved version management and provides a Static and Dynamic Framework.&lt;br /&gt;
&lt;br /&gt;
== Initial Configuration ==&lt;br /&gt;
The Nielsen SDK integration requires Cocoapods.  &lt;br /&gt;
* The Dynamic Framework which requires Cocoapods Version 1.6.1 or higher.&lt;br /&gt;
* The Static Framework requires Cocoapods version 1.4.0. or higher.&lt;br /&gt;
&lt;br /&gt;
The full installation guide for this framework is provided on the [https://guides.cocoapods.org/using/getting-started.html Getting Started] page, and how to set up the Podfile is mentioned in [https://guides.cocoapods.org/using/using-cocoapods.html Using Cocoapods] page.&lt;br /&gt;
&lt;br /&gt;
== Repository Credentials ==&lt;br /&gt;
The first step is to add the credentials received from Nielsen into your .netrc file.&lt;br /&gt;
Navigate to your home folder and create a file called .netrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
cd ~/&lt;br /&gt;
vi .netrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Within this file you need to add your credentials in the following format:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
machine raw.githubusercontent.com&lt;br /&gt;
login &amp;lt;Nielsen App SDK client&amp;gt;&lt;br /&gt;
password &amp;lt;Auth token&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Credentials ===&lt;br /&gt;
Obtain credentials '''[[Digital Downloads| → here ←]]'''&lt;br /&gt;
&lt;br /&gt;
== Verify version of Cocoapods ==&lt;br /&gt;
First verify that Cocoapods is installed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If it is not, then install.&amp;lt;br &amp;gt;&lt;br /&gt;
===== Install via gem =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
sudo gem install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Install using homebrew ===== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
brew install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Add Cocoapod repository ==&lt;br /&gt;
=== Dynamic Framework (Cocoapods 1.6.1+) ===&lt;br /&gt;
If using '''Dynamic Framework''' (preferred approach), from the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '11.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
 use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For Static Framework (Cocoapods 1.4+) ===&lt;br /&gt;
From the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/nielsendigitalsdk/nielsenappsdk-ios-specs.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== For Cocoapods Versions &amp;lt; 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
If you are using a version of Cocoapods that is less than 1.6.0, you have a Swift Project and your pod has '''use_frameworks!''' please use the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
# Uncomment the next line to define a global platform for your project&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks&lt;br /&gt;
use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
&lt;br /&gt;
static_frameworks = ['NielsenAppSDK']&lt;br /&gt;
# make all the other frameworks into static frameworks by overriding the static_framework? function to return true&lt;br /&gt;
pre_install do |installer|&lt;br /&gt;
    installer.pod_targets.each do |pod|&lt;br /&gt;
        if static_frameworks.include?(pod.name)&lt;br /&gt;
            puts &amp;quot;Overriding the static_framework? method for #{pod.name}&amp;quot;&lt;br /&gt;
            def pod.static_framework?;&lt;br /&gt;
            true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Execute Install ==&lt;br /&gt;
Once that has been edited, you can now execute the install:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
pod install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Cocoapods will automatically create a new file with extension “.xcworkspace”. From this moment, that file should be used for using the target project instead of previous one with extension “.xcodeproj”. Inside of this workspace you will see “Pods” target which will include ready to use NielsenAppApi framework.&lt;br /&gt;
&lt;br /&gt;
Open the file with the extension of &amp;lt;code&amp;gt;.xcworkspace&amp;lt;/code&amp;gt; file using Xcode.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Build Notes ==&lt;br /&gt;
Please note that the Nielsen dynamic framework contains slices for devices and simulators.  When building your project it is recommended that Simulator slices are removed before sending the app to the AppStore.   An example of the shell script that should be added as a Run Script phase in the application is attached&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
APP_PATH=&amp;quot;${TARGET_BUILD_DIR}/${WRAPPER_NAME}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# This script loops through the frameworks embedded in the application and&lt;br /&gt;
# removes unused architectures.&lt;br /&gt;
find &amp;quot;$APP_PATH&amp;quot; -name '*.framework' -type d | while read -r FRAMEWORK&lt;br /&gt;
do&lt;br /&gt;
FRAMEWORK_EXECUTABLE_NAME=$(defaults read &amp;quot;$FRAMEWORK/Info.plist&amp;quot; CFBundleExecutable)&lt;br /&gt;
FRAMEWORK_EXECUTABLE_PATH=&amp;quot;$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
echo &amp;quot;Executable is $FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EXTRACTED_ARCHS=()&lt;br /&gt;
&lt;br /&gt;
for ARCH in $ARCHS&lt;br /&gt;
do&lt;br /&gt;
echo &amp;quot;Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
lipo -extract &amp;quot;$ARCH&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot; -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;&lt;br /&gt;
EXTRACTED_ARCHS+=(&amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Merging extracted architectures: ${ARCHS}&amp;quot;&lt;br /&gt;
lipo -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; -create &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
rm &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Replacing original executable with thinned version&amp;quot;&lt;br /&gt;
rm &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
mv &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pod Versions ==&lt;br /&gt;
The following Pod versions are now available:&lt;br /&gt;
* NielsenAppSDK&lt;br /&gt;
* NielsenTVOSAppSDK &lt;br /&gt;
* VRIAppSDK &lt;br /&gt;
&lt;br /&gt;
=== Regional Builds ===&lt;br /&gt;
* NielsenAGFAppSDK&lt;br /&gt;
*  NielsenAGFTVOSAppSDK&lt;br /&gt;
* NielsenAGFNoAdAppSDK&lt;br /&gt;
*  NielsenAGFNoAdTVOSAppSDK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Additional Resources ===&lt;br /&gt;
&lt;br /&gt;
For more information on [https://guides.cocoapods.org/using/getting-started.html) CocoaPods] or How to set up the Profile in the [https://guides.cocoapods.org/using/using-cocoapods.html) Using Cocoapods] page.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Artifactory_Guide&amp;diff=3654</id>
		<title>Digital Measurement Android Artifactory Guide</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Artifactory_Guide&amp;diff=3654"/>
		<updated>2019-05-09T16:03:20Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly from the [http://engineeringportal.nielsen.com Engineering Portal], or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
&lt;br /&gt;
== How to install the Nielsen AppSDK using Gradle for Android ==&lt;br /&gt;
Below are the steps which need to be performed by app developers to integrate the Nielsen App SDK within an Android application.&lt;br /&gt;
&lt;br /&gt;
=== Update grade.properties ===&lt;br /&gt;
The first step is to add the credentials received from Nielsen into your '''gradle.properties''' file, typically near the end of the file.  We recommend using the version in your home folder (Global Properties).  Gradle looks for  '''gradle.properties''' files in this sequence:&lt;br /&gt;
* &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; in project root directory.&lt;br /&gt;
* &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; in GRADLE_USER_HOME directory.&lt;br /&gt;
* system properties, e.g. when &amp;lt;code&amp;gt;-Dgradle.user.home&amp;lt;/code&amp;gt; is set on the command line.&lt;br /&gt;
&lt;br /&gt;
Properties from one file will override the properties from the previous ones (so file in gradle user home has precedence over the others, and file in sub-project has precedence over the one in project root).&lt;br /&gt;
&lt;br /&gt;
Reference: https://gradle.org/docs/current/userguide/build_environment.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;machine raw.githubusercontent.com&lt;br /&gt;
nielsen_user=&amp;lt;Nielsen App SDK client&amp;gt;&lt;br /&gt;
nielsen_authCode=&amp;lt;Auth token&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Credentials ===&lt;br /&gt;
Obtain credentials '''[[Digital Downloads| → here ←]]'''&lt;br /&gt;
&lt;br /&gt;
=== Add Nielsen Maven Repository ===&lt;br /&gt;
&lt;br /&gt;
Please add the Nielsen maven repository inside the repositories section of your app's module build.gradle file like below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;android{ &lt;br /&gt;
repositories {&lt;br /&gt;
   //Copy below code inside repository section of app’s build.gradle file&lt;br /&gt;
maven { url 'https://raw.githubusercontent.com/NielsenDigitalSDK/nielsenappsdk-android/master/'&lt;br /&gt;
   credentials {&lt;br /&gt;
      //Make sure you add nielsen_user and nielsen_passwd with respective nielsen provided&lt;br /&gt;
     // values to global gradle.properties file&lt;br /&gt;
       username = project.property(&amp;quot;nielsen_user&amp;quot;)&lt;br /&gt;
       password = project.property(&amp;quot;nielsen_authCode&amp;quot;)&lt;br /&gt;
   }&lt;br /&gt;
   authentication {&lt;br /&gt;
       basic(BasicAuthentication)&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add gradle dependency ===&lt;br /&gt;
&lt;br /&gt;
Please add Nielsen app SDK as compile time dependency inside build.gradle file as below&lt;br /&gt;
==== grade 4.x and above ====&lt;br /&gt;
For gradle version starting with 4.x add below line inside dependencies section of build.gradle file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;implementation 'com.nielsenappsdk:${flavour}:${version}'&amp;lt;/source&amp;gt;&lt;br /&gt;
==== grade prior to 4.x ====&lt;br /&gt;
For gradle version previous to 4.x add below line inside dependencies section of build.gradle file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;compile 'com.nielsenappsdk:${flavour}:${version}'&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Version Control ====&lt;br /&gt;
Please replace ${version} with required Nielsen App SDK release version given in below table Please replace ${flavour} with one of below flavour type value&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Flavour Type !! Description &lt;br /&gt;
|-&lt;br /&gt;
| global||For Global Clients||&lt;br /&gt;
|-&lt;br /&gt;
|agf||For AGF(EU) Clients||&lt;br /&gt;
|-&lt;br /&gt;
|vri||For VRI| based nielsen app sdk clients (Japan)||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Below is an example for dependency&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
implementation 'com.nielsenappsdk:global:+'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ensuring you have the latest release information ===&lt;br /&gt;
It is recommended to use the most recent version of the NielsenSDK by using the following:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
implementation 'com.nielsenappsdk:global:+'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition, please add below gradle task inside your &amp;lt;code&amp;gt; build.gradle (Module:app)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;build.gradle(Project:My-app)&amp;lt;/code&amp;gt; file to fetch latest release details of nielsen app sdk as below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Please note: The &amp;lt;code&amp;gt; build.gradle (Module:app)&amp;lt;/code&amp;gt;  can overwrite the &amp;lt;code&amp;gt;build.gradle(Project:My-app)&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;task NielsenSdkReleaseCheck {&lt;br /&gt;
   def login_details = project.property(&amp;quot;nielsen_user&amp;quot;)+&amp;quot;:&amp;quot;+project.property(&amp;quot;nielsen_authCode&amp;quot;)&lt;br /&gt;
   def p = ['curl', '-u',login_details ,&amp;quot;https://raw.githubusercontent.com/NielsenDigitalSDK/nielsenappsdk-android/master/com/nielsenappsdk/global/NielsenAppSdk-ReadMe.md&amp;quot;].execute().text&lt;br /&gt;
   project.logger.log(LogLevel.ERROR,p)&lt;br /&gt;
}&lt;br /&gt;
preBuild.dependsOn('NielsenSdkReleaseCheck')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sync ===&lt;br /&gt;
&lt;br /&gt;
If you are finished with all previous steps then you can sync your build.gradle and after successful build you are ready to use Nielsen App SDK library in your code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br &amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3645</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3645"/>
		<updated>2019-05-08T00:56:11Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
__NOTOC__ &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
= Using the Simplified SDK for Static Measurement for Browser =&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_API_Supplements Additional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate the code required for static measurement.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
    /***************** Static Queue Snippet *********************/&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][c] = t[n][c] || {&lt;br /&gt;
                        g: o || {},&lt;br /&gt;
                        ggPM: function(e, o, r, s, i) {&lt;br /&gt;
                            (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
                        },&lt;br /&gt;
                        trackEvent: function(e) {&lt;br /&gt;
                            (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][c]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
    &amp;lt;script &amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * SDK Initialization to engtestsite.com domain&lt;br /&gt;
     */&lt;br /&gt;
    // Initialize instance &lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ('P00BEB680-1F1A-47BB-922D-1BXXXXXXXXXX', 'dcrVideoInstance', {&lt;br /&gt;
        containerID: &amp;quot;my-sdkplayer&amp;quot;,&lt;br /&gt;
        nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
var pathArray = window.location.pathname.split('/');&lt;br /&gt;
NURL = pathArray[2];&lt;br /&gt;
&lt;br /&gt;
var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'static',&lt;br /&gt;
    playheadPosition: '',&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;content&amp;quot;: {},&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
        &amp;quot;static&amp;quot;: {&lt;br /&gt;
            type: 'static',&lt;br /&gt;
            section: NURL,&lt;br /&gt;
            assetid: 'AID885-9984',&lt;br /&gt;
            segA: 'NielsenEnt',&lt;br /&gt;
            segB: 'CustomSegB',&lt;br /&gt;
            segC: 'CustomSegC',&lt;br /&gt;
            crossId1: &amp;quot;crossReference11&amp;quot;,&lt;br /&gt;
            reportSuite: &amp;quot;123&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.trackEvent(obj);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Artifactory_Guide&amp;diff=3609</id>
		<title>Digital Measurement Android Artifactory Guide</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Artifactory_Guide&amp;diff=3609"/>
		<updated>2019-04-11T20:31:29Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly from the [http://engineeringportal.nielsen.com Engineering Portal], or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
&lt;br /&gt;
== How to install the Nielsen AppSDK using Gradle for Android ==&lt;br /&gt;
Below are the steps which need to be performed by app developers to integrate the Nielsen App SDK within an Android application.&lt;br /&gt;
&lt;br /&gt;
=== Update grade.properties ===&lt;br /&gt;
The first step is to add the credentials received from Nielsen into your '''gradle.properties''' file, typically near the end of the file.  We recommend using the version in your home folder (Global Properties).  Gradle looks for  '''gradle.properties''' files in this sequence:&lt;br /&gt;
* &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; in project root directory.&lt;br /&gt;
* &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; in GRADLE_USER_HOME directory.&lt;br /&gt;
* system properties, e.g. when &amp;lt;code&amp;gt;-Dgradle.user.home&amp;lt;/code&amp;gt; is set on the command line.&lt;br /&gt;
&lt;br /&gt;
Properties from one file will override the properties from the previous ones (so file in gradle user home has precedence over the others, and file in sub-project has precedence over the one in project root).&lt;br /&gt;
&lt;br /&gt;
Reference: https://gradle.org/docs/current/userguide/build_environment.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;machine raw.githubusercontent.com&lt;br /&gt;
nielsen_user=&amp;lt;Nielsen App SDK client&amp;gt;&lt;br /&gt;
nielsen_authCode=&amp;lt;Auth token&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Credentials ===&lt;br /&gt;
Obtain credentials '''[[Digital Downloads| → here ←]]'''&lt;br /&gt;
&lt;br /&gt;
=== Add Nielsen Maven Repository ===&lt;br /&gt;
&lt;br /&gt;
Please add the Nielsen maven repository inside the repositories section of your app's module build.gradle file like below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;android{ &lt;br /&gt;
repositories {&lt;br /&gt;
   //Copy below code inside repository section of app’s build.gradle file&lt;br /&gt;
maven { url 'https://raw.githubusercontent.com/NielsenDigitalSDK/nielsenappsdk-android/master/'&lt;br /&gt;
   credentials {&lt;br /&gt;
      //Make sure you add nielsen_user and nielsen_passwd with respective nielsen provided&lt;br /&gt;
     // values to global gradle.properties file&lt;br /&gt;
       username = project.property(&amp;quot;nielsen_user&amp;quot;)&lt;br /&gt;
       password = project.property(&amp;quot;nielsen_authCode&amp;quot;)&lt;br /&gt;
   }&lt;br /&gt;
   authentication {&lt;br /&gt;
       basic(BasicAuthentication)&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add gradle dependency ===&lt;br /&gt;
&lt;br /&gt;
Please add Nielsen app SDK as compile time dependency inside build.gradle file as below&lt;br /&gt;
==== grade 4.x and above ====&lt;br /&gt;
For gradle version starting with 4.x add below line inside dependencies section of build.gradle file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;implementation 'com.nielsenappsdk:${flavour}:${version}'&amp;lt;/source&amp;gt;&lt;br /&gt;
==== grade prior to 4.x ====&lt;br /&gt;
For gradle version previous to 4.x add below line inside dependencies section of build.gradle file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;compile 'com.nielsenappsdk:${flavour}:${version}'&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Version Control ====&lt;br /&gt;
Please replace ${version} with required Nielsen App SDK release version given in below table Please replace ${flavour} with one of below flavour type value&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Flavour Type !! Description &lt;br /&gt;
|-&lt;br /&gt;
| global||For Global Clients (US/AU/TH/CZ)||&lt;br /&gt;
|-&lt;br /&gt;
|agf||For AGF(EU) Clients||&lt;br /&gt;
|-&lt;br /&gt;
|vri||For VRI| based nielsen app sdk clients (Japan)||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Below is an example for dependency&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
implementation 'com.nielsenappsdk:global:+'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ensuring you have the latest release information ===&lt;br /&gt;
It is recommended to use the most recent version of the NielsenSDK by using the following:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
implementation 'com.nielsenappsdk:global:+'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition, please add below gradle task inside your &amp;lt;code&amp;gt; build.gradle (Module:app)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;build.gradle(Project:My-app)&amp;lt;/code&amp;gt; file to fetch latest release details of nielsen app sdk as below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Please note: The &amp;lt;code&amp;gt; build.gradle (Module:app)&amp;lt;/code&amp;gt;  can overwrite the &amp;lt;code&amp;gt;build.gradle(Project:My-app)&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;task NielsenSdkReleaseCheck {&lt;br /&gt;
   def login_details = project.property(&amp;quot;nielsen_user&amp;quot;)+&amp;quot;:&amp;quot;+project.property(&amp;quot;nielsen_authCode&amp;quot;)&lt;br /&gt;
   def p = ['curl', '-u',login_details ,&amp;quot;https://raw.githubusercontent.com/NielsenDigitalSDK/nielsenappsdk-android/master/com/nielsenappsdk/global/NielsenAppSdk-ReadMe.md&amp;quot;].execute().text&lt;br /&gt;
   project.logger.log(LogLevel.ERROR,p)&lt;br /&gt;
}&lt;br /&gt;
preBuild.dependsOn('NielsenSdkReleaseCheck')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sync ===&lt;br /&gt;
&lt;br /&gt;
If you are finished with all previous steps then you can sync your build.gradle and after successful build you are ready to use Nielsen App SDK library in your code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br &amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Android_SDK&amp;diff=3606</id>
		<title>DCR Video Android SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Android_SDK&amp;diff=3606"/>
		<updated>2019-04-09T20:27:15Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), and [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android Studio utilizing the Standard Nielsen SDK for DCR.&lt;br /&gt;
=== How to obtain the NielsenAppApi ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_Android_Artifactory_Guide|Select to obtain Gradle implementation guide]]&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring Android Development Environment ===&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click &amp;quot;+&amp;quot; button and select &amp;lt;code&amp;gt;&amp;quot;com.google.android.gms:play-services&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. &lt;br /&gt;
* When four SDK instances exist, you must destroy an old instance before creating a new one.&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). The appid is a GUID data type and is specific to the application.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type.|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || Optional; automatically detected in SDK 6.0.0.4 and above || Nielsen Sample App&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || dcr-cert&lt;br /&gt;
|-&lt;br /&gt;
|containerID || View ID of the UI element used as player view in application for Viewability ||Client-defined||Optional||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Debug flag for development environment ==&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . The permitted values are:&lt;br /&gt;
&lt;br /&gt;
* '''INFO''': Displays the API calls and the input data from the application (validate player name, app ID, etc.). It can be used as certification Aid.&lt;br /&gt;
* '''WARN''': Indicates potential integration / configuration errors or SDK issues.&lt;br /&gt;
* '''ERROR''': Indicates important integration errors or non-recoverable SDK issues.&lt;br /&gt;
* '''DEBUG''': Debug logs, used by the developers to debug more complex issues.&lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
[[AppSDK()]] is no longer a singleton object and should be initialized as below.&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
  // Prepare AppSdk configuration object (JSONObject)&lt;br /&gt;
  JSONObject appSdkConfig = new JSONObject()&lt;br /&gt;
          .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;containerID&amp;quot;: &amp;quot;2131558561&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;DEBUG&amp;quot;); // only for debug builds&lt;br /&gt;
&lt;br /&gt;
// Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e)&lt;br /&gt;
{&lt;br /&gt;
  Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here, &amp;lt;code&amp;gt;appContext&amp;lt;/code&amp;gt; is the App context object and &amp;lt;code&amp;gt;appSdkConfig&amp;lt;/code&amp;gt; is JSON object for holding the parameters (&amp;lt;code&amp;gt;appid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sfcode&amp;lt;/code&amp;gt;) the App passes to the Nielsen App SDK via a JSON string. The appid is obtained from Nielsen operational support and is unique to the app.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The integration of Nielsen App SDK will depend on type of client app.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Ensure that SDK files (AppSdk.jar and libAppSdk.so [App SDK 1.2 Only]) are included under the App’s project and the App SDK is linked to the App (the setting to link App SDK to the App can be found on property page of the App’s project).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Configure Payload ==&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
All the SDK methods handles only two types of objects: NSString, NSDictionary. The parameters passed must be either a JSON formatted string or a NSDictionary object. The JSON passed in the SDK must be well-formed.&lt;br /&gt;
* NSDictionary object&lt;br /&gt;
** If an object of unexpected type is passed to the method, the error message will be logged.&lt;br /&gt;
** If string has invalid JSON format, the error message will be logged.&lt;br /&gt;
* JSON value must be string value.&lt;br /&gt;
** This includes boolean and numeric values. For example, a value of true should be represented with &amp;quot;true&amp;quot;, number value 123 should be &amp;quot;123&amp;quot;.&lt;br /&gt;
** All the Variable Names like appid, appname, sfcode, dataSrc, title, type etc. are case-sensitive. Use the correct variable name as specified in the documentation.&lt;br /&gt;
* JSON string can be prepared using either raw NSString or serialized NSDictionary.&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject contentMetadata = new JSONObject()&lt;br /&gt;
//SDK Metadata&lt;br /&gt;
    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;assetid&amp;quot;, &amp;quot;vid345-67483&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;program&amp;quot;, &amp;quot;Program Name&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;title&amp;quot;, &amp;quot;Program S3, EP1&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;length&amp;quot;, &amp;quot;3600&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;segB&amp;quot;, &amp;quot;CustomSegmentValueB&amp;quot;)  //optional&lt;br /&gt;
    .put(&amp;quot;segC&amp;quot;, &amp;quot;CustomSegmentValueC&amp;quot;)  //optional&lt;br /&gt;
    .put(&amp;quot;isfullepisode&amp;quot;, &amp;quot;yes&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;airdate&amp;quot;, &amp;quot;20161013 20:00:00&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
{{DCR Content Metadata}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
== Sequence of Calls ==&lt;br /&gt;
=== play ===&lt;br /&gt;
Use [[DCR_Video_APP_SDK#play|play]] to pass the channel descriptor information through channelName parameter when the user taps the '''Play''' button on the player.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    public void play(JSONObject channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadMetadata ===&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void loadMetadata(JSONObject contentMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== playheadPosition ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void setPlayheadPosition(long position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stop ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void stop()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== end ===&lt;br /&gt;
When content stop is initiated and content cannot be resumed from the same position (it can only be restarted from the beginning of stream).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void end()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example Ad Object ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls ==&lt;br /&gt;
&lt;br /&gt;
=== Sample API Sequence ===&lt;br /&gt;
A Sample API sequence could follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
|On App Start||&amp;lt;code&amp;gt;[nielsenMeter loadMetadata: contentMetadata];&amp;lt;/code&amp;gt; || // contentMetadata Object contains the JSON metadata for the impression&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;[nielsenMeter play: channelName];&amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[nielsenMeter loadMetadata: contentMetadataObject];&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;[nielsenMeter setplayheadPosition: position];&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;[nielsenMeter end];&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: || current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'setPlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call when content or ads complete playing and pass playhead position&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: For livestream, send the Unix timestamp; for VOD send the time in seconds as integer. The final playhead position must be sent for the current asset being played before calling &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; or&amp;lt;code&amp;gt; '''loadmetadata'''&amp;lt;/code&amp;gt;,.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Life cycle of SDK instance ===&lt;br /&gt;
Life cycle of SDK instance includes four general states:&lt;br /&gt;
# '''Initial state''' – The SDK is not initialized and hence, not ready to process playing information. Once the SDK is moved out of this state, it needs instantiation of the new SDK instance in order to get the instance in the '''Initial state'''.&lt;br /&gt;
# '''Idle state''' – The SDK is initialized and is ready to process playing information. Once Initialized, the SDK instance is not processing any data, but is listening for the play event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. The &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; calls move the SDK instance into this state. In this state, the SDK instance will be able to process the following calls.&lt;br /&gt;
## &amp;lt;code&amp;gt;'''setplayheadPosition'''&amp;lt;/code&amp;gt; – Call this API every one second when playhead position timer is fired.  If a LIVE event, use the current Unix timestamp (seconds since Jan-1-1970 UTC).&lt;br /&gt;
## &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt; – Call this API when the playback is paused, switches between content and ad (within the same content playback) or encounters interruptions.&lt;br /&gt;
## &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; – SDK instance exits from Processing state when this API is called.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. SDK instance moves into this state in one of the following scenarios.&lt;br /&gt;
## Initialization fails&lt;br /&gt;
## &amp;lt;code&amp;gt;'''appDisableApi'''&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' For API Version 5.1 and above, App SDK will fire data pings and continue measurement even after the user has opted out from Nielsen measurement on a device. The data ping will be marked as opted-out ping.&lt;br /&gt;
&lt;br /&gt;
'''Note''': In case of any interruptions during playback due to alarm, calendar, call, flight mode, Wi-Fi toggle, channel change, etc., call [[stop]] to stop the measurement.&lt;br /&gt;
* As soon as the playback resumes, call &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; and   &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Call Sequence ===&lt;br /&gt;
==== Use Case 1: Content has no Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for content as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;vid345-67483&amp;quot;,&lt;br /&gt;
  &amp;quot;program&amp;quot;: &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
  &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
  ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop.&lt;br /&gt;
Use the sample API sequence below as a reference to identify the specific events that need to be called during content playback without ads.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Use Case 2: Content has Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for ad as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
   &amp;quot;assetid&amp;quot;: &amp;quot;ad=123&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: In case the individual ad details are not available, send ad pod (presence) details through the [[loadMetadata]] and playhead position through [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop / another [[loadMetadata()]] is called. Playhead should be passed for the entire duration of ad pod, if the ad pod details are passed as part of [[loadMetadata()]].&lt;br /&gt;
&lt;br /&gt;
'''Ad Content'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    long pos = mAdPlayer.videoPosition() / 1000;&lt;br /&gt;
   if (mAppSdk != null)&lt;br /&gt;
   {&lt;br /&gt;
     mAppSdk.setPlayheadPosition(pos);&lt;br /&gt;
   }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: The playhead positions for ad and content should be maintained separately.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The sample API sequence can be used as a reference to identify the specific events that need to be called during content and ad playback.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Preroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(prerollMetadataObject);&amp;lt;/code&amp;gt; || // prerollMetadataObject contains the JSON metadata for the preroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the preroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after preroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after the content is paused (ad starts)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | Midroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // midrollMetadataObject contains the JSON metadata for the midroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the midroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // App moves to background(midroll pauses) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // App moves to foreground (midroll resumes) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the midroll ad is being played &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after midroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content (End of stream) || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Always call stop irrespective of postroll is followed or not&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Call end() at the end of content&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Postroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(postrollMetaDataObject);&amp;lt;/code&amp;gt; || // postrollMetadataObject contains the JSON metadata for the postroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the postroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after postroll occurs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: Each Ad playhead should reset or begin from 0 at ad start. When content has resumed following an ad break, playhead position must continue from where previous content segment was left off.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients. (You will need to copy/paste the code provided into a file).&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Interruptions during playback ==&lt;br /&gt;
As part of integrating Nielsen App SDK with the player application, the Audio / Video app developer needs to handle the following possible interruption scenarios:&lt;br /&gt;
* Pause / Play&lt;br /&gt;
* Network Loss (Wi-Fi / Airplane / Cellular)&lt;br /&gt;
* Call Interrupt (SIM or Third party Skype / Hangout call)&lt;br /&gt;
* Alarm Interrupt&lt;br /&gt;
* Content Buffering&lt;br /&gt;
* Device Lock / Unlock (Video players only, not for Audio players)&lt;br /&gt;
* App going in the Background/Foreground (Video players only, not for Audio players)&lt;br /&gt;
* Channel / Station Change Scenario&lt;br /&gt;
* Unplugging of headphone&lt;br /&gt;
In case of encountering one of the above interruptions, the player application needs to&lt;br /&gt;
* Call [[stop]] immediately (except when content is buffering) and withhold sending playhead position.&lt;br /&gt;
* Start sending pings – &amp;lt;code&amp;gt;'loadMetadata'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'playheadPosition'&amp;lt;/code&amp;gt; for the new viewing session, once the playback resumes.&lt;br /&gt;
Please see the [https://engineeringportal.nielsen.com/docs/Digital_Measurement_Interruption_Scenarios Interruption Scenarios Page] for more details&lt;br /&gt;
&lt;br /&gt;
== Pre-Certification Checklists ==&lt;br /&gt;
After the application is ready to be sent for Nielsen Certification, please go through the [[Digital Pre-Certification Checklist App SDK]] and ensure the app behaves as expected, before submitting to Nielsen.&lt;br /&gt;
&lt;br /&gt;
{{Template:Android_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make one update to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
'''Note''': before going live you have to inform Nielsen team - this is necessary, because Nielsen team has to adjust internal configuration parameter to enable data collection. Without that notification no data will be collected and no data will be reported.&lt;br /&gt;
&lt;br /&gt;
== Sample Applications ==&lt;br /&gt;
The below sample applications have been designed to show the API's functionality and are broken into two distinct categories:&lt;br /&gt;
* '''Basic''' - To show the functionality of the Nielsen  API using a standard no-frills player.&lt;br /&gt;
** [[Swift Basic Sample|Swift 4.0 Sample]]&lt;br /&gt;
** [[Objective-c Basic example|Objective-C Sample]]&lt;br /&gt;
** [[Android Basic example|Android Studio Example]]&lt;br /&gt;
&lt;br /&gt;
* '''Advanced''' - Nielsen API integrated into a custom video player is bundled with the SDK.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Android_SDK&amp;diff=3605</id>
		<title>DCR Video Android SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Android_SDK&amp;diff=3605"/>
		<updated>2019-04-09T20:00:43Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), and [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
* '''sfcode:''' Unique identifier for the environment that the SDK should point to.&lt;br /&gt;
* '''Nielsen SDK:''' The Nielsen SDK package contains a variety of sample players for your reference.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android Studio utilizing the Standard Nielsen SDK for DCR.&lt;br /&gt;
=== How to obtain the NielsenAppApi ===&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
* [[Special:Downloads|Select to Download Directly]]&lt;br /&gt;
* [[Digital_Measurement_Android_Artifactory_Guide|Select to obtain Gradle implementation guide]]&lt;br /&gt;
&lt;br /&gt;
== Setting up your  Development Environment  ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring Android Development Environment ===&lt;br /&gt;
*The Nielsen App SDK (located in the [https://engineeringportal.nielsen.com/docs/Special:Downloads Downloads section] of the website) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
*The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
&lt;br /&gt;
'''Nielsen App SDK is compatible with Android OS versions 2.3+. Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.'''&lt;br /&gt;
&lt;br /&gt;
The requirement for the Java ''AppSdk.jar'' library and the ''libAppSdk.so'' native library will depend on the type of host application that will make use of them.&lt;br /&gt;
* '''For Video player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively).&lt;br /&gt;
** If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* '''For Audio player applications'''&lt;br /&gt;
** The Android OS hosting the App SDK should be at version 2.3 and later since the SDK depends on the Google Play support to work properly.&lt;br /&gt;
Once SDK is downloaded ensure to unzip the Nielsen SDK and copy the AppSdk.jar in your app (Android Studio) libs folder, then right click the AppSdk.jar and select '''Add As Library'''.&lt;br /&gt;
Ensure the AppSdk.jar file is added in 'build.grade (App Level) file.&lt;br /&gt;
* App SDK 1.2 provides support for x86, mips, and armeabi-7a architecture.&lt;br /&gt;
&lt;br /&gt;
==== Google Play Services ====&lt;br /&gt;
Add the Google Play Services in the project,&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click &amp;quot;+&amp;quot; button and select &amp;lt;code&amp;gt;&amp;quot;com.google.android.gms:play-services&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Ensure it is added in build.gradle (App level) file&lt;br /&gt;
&lt;br /&gt;
==== Manifest File ==== &lt;br /&gt;
* Add the following permissions on the project’s ''AndroidManifest.xml'' file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For more details to handle runtime permissions in Android versions, please visit [https://developer.android.com/training/permissions/requesting.html].   &lt;br /&gt;
&lt;br /&gt;
* In &amp;lt;code&amp;gt;AndroidManifest.xml &amp;lt;/code&amp;gt;under &amp;lt;application&amp;gt; node add the following metadata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;meta-data &lt;br /&gt;
android:name=&amp;quot;com.google.android.gms.version&amp;quot; &lt;br /&gt;
android:value=&amp;quot;@integer/google_play_services_version&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated.&lt;br /&gt;
* If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
==== Library ====&lt;br /&gt;
Nielsen App SDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
* google-play-services_lib&lt;br /&gt;
&lt;br /&gt;
==== Classes/package ====&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
== SDK Initialization ==&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. The sharedInstance API that creates a singleton object was deprecated prior to version 5.1.1. (Version 4.0 for Android)&lt;br /&gt;
&lt;br /&gt;
* A maximum of four SDK instances per appid are supported. &lt;br /&gt;
* When four SDK instances exist, you must destroy an old instance before creating a new one.&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that can be passed via the AppInfo JSON schema.&lt;br /&gt;
&lt;br /&gt;
* The appid is provided by the Nielsen Technical Account Manager (TAM). The appid is a GUID data type and is specific to the application.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type.|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || Optional; automatically detected in SDK 6.0.0.4 and above || Nielsen Sample App&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
'''DTVR'''&lt;br /&gt;
* &amp;quot;us&amp;quot;&lt;br /&gt;
'''Digital Audio'''&lt;br /&gt;
* &amp;quot;drm&amp;quot;&lt;br /&gt;
'''DCR'''&lt;br /&gt;
* &amp;quot;dcr&amp;quot; &lt;br /&gt;
|| Nielsen-specified || Yes || dcr-cert&lt;br /&gt;
|-&lt;br /&gt;
|containerID || View ID of the UI element used as player view in application for Viewability ||Client-defined||Optional||&amp;quot;1234567&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_devDebug || Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|| Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Debug flag for development environment ==&lt;br /&gt;
Player application developers / integrators can use Debug flag to check whether an App SDK API call made is successful. To activate the Debug flag,&lt;br /&gt;
Pass the argument &amp;lt;code&amp;gt;@&amp;quot;nol_devDebug&amp;quot;:@&amp;quot;INFO&amp;quot;&amp;lt;/code&amp;gt;, in the JSON string . The permitted values are:&lt;br /&gt;
&lt;br /&gt;
* '''INFO''': Displays the API calls and the input data from the application (validate player name, app ID, etc.). It can be used as certification Aid.&lt;br /&gt;
* '''WARN''': Indicates potential integration / configuration errors or SDK issues.&lt;br /&gt;
* '''ERROR''': Indicates important integration errors or non-recoverable SDK issues.&lt;br /&gt;
* '''DEBUG''': Debug logs, used by the developers to debug more complex issues.&lt;br /&gt;
&lt;br /&gt;
Once the flag is active, it logs each API call made and the data passed. The log created by this flag is minimal.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': DO NOT activate the Debug flag in a production environment.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
[[AppSDK()]] is no longer a singleton object and should be initialized as below.&lt;br /&gt;
&lt;br /&gt;
'''Initialization of App SDK object through a JSON object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
  // Prepare AppSdk configuration object (JSONObject)&lt;br /&gt;
  JSONObject appSdkConfig = new JSONObject()&lt;br /&gt;
          .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-XXXX-XXXX-2A788BCXXXCA&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;sfcode&amp;quot;, &amp;quot;dcr&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;containerID&amp;quot;: &amp;quot;2131558561&amp;quot;)&lt;br /&gt;
          .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;DEBUG&amp;quot;); // only for debug builds&lt;br /&gt;
&lt;br /&gt;
// Pass appSdkConfig to the AppSdk constructor&lt;br /&gt;
mAppSdk = new AppSdk(appContext, appSdkConfig, appSdkListener);&lt;br /&gt;
}&lt;br /&gt;
catch (JSONException e)&lt;br /&gt;
{&lt;br /&gt;
  Log.e(TAG, &amp;quot;Couldn’t prepare JSONObject for appSdkConfig&amp;quot;, e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here, &amp;lt;code&amp;gt;appContext&amp;lt;/code&amp;gt; is the App context object and &amp;lt;code&amp;gt;appSdkConfig&amp;lt;/code&amp;gt; is JSON object for holding the parameters (&amp;lt;code&amp;gt;appid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sfcode&amp;lt;/code&amp;gt;) the App passes to the Nielsen App SDK via a JSON string. The appid is obtained from Nielsen operational support and is unique to the app.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The integration of Nielsen App SDK will depend on type of client app.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Ensure that SDK files (AppSdk.jar and libAppSdk.so [App SDK 1.2 Only]) are included under the App’s project and the App SDK is linked to the App (the setting to link App SDK to the App can be found on property page of the App’s project).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Initializing the Nielsen AppSDK to measure the Viewability ==&lt;br /&gt;
The integrator to support the viewability metrics in the application has to provide a tag value of the player view to let Nielsen AppSDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in application info dictionary as string while initializing the Nielsen AppSDK.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||View ID of the UI element used as player view in application. getId() method of View class can be used to get this value.	||A positive integer used to identify the view. || 2131558561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! #	!! Parameter Name	!! Description !! Supported Values !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 1	|| containerId ||The tag of the UIView that represents the Player View	||The string value representing the NSInteger value with maximum value of NSIntegerMax that is related on 32- or 64-bit applications. || &amp;quot;100&amp;quot; &amp;lt;br&amp;gt; &amp;quot;2131558561&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For iOS it is required to link additional frameworks that are needed for viewability engine:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;JavaScriptCore.framework&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;WebKit.framework&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK uses a tracking WebView (TWV) approach.  For more information on Viewability, please refer to [https://engineeringportal.nielsen.com/docs/Implementing_Viewability_with_AppSDK Implementing Viewability with AppSDK.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APP SDK Error &amp;amp; Event Codes ==&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Configure Payload ==&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
All the SDK methods handles only two types of objects: NSString, NSDictionary. The parameters passed must be either a JSON formatted string or a NSDictionary object. The JSON passed in the SDK must be well-formed.&lt;br /&gt;
* NSDictionary object&lt;br /&gt;
** If an object of unexpected type is passed to the method, the error message will be logged.&lt;br /&gt;
** If string has invalid JSON format, the error message will be logged.&lt;br /&gt;
* JSON value must be string value.&lt;br /&gt;
** This includes boolean and numeric values. For example, a value of true should be represented with &amp;quot;true&amp;quot;, number value 123 should be &amp;quot;123&amp;quot;.&lt;br /&gt;
** All the Variable Names like appid, appname, sfcode, dataSrc, title, type etc. are case-sensitive. Use the correct variable name as specified in the documentation.&lt;br /&gt;
* JSON string can be prepared using either raw NSString or serialized NSDictionary.&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject contentMetadata = new JSONObject()&lt;br /&gt;
//SDK Metadata&lt;br /&gt;
    .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;assetid&amp;quot;, &amp;quot;vid345-67483&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;program&amp;quot;, &amp;quot;Program Name&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;title&amp;quot;, &amp;quot;Program S3, EP1&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;length&amp;quot;, &amp;quot;3600&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;segB&amp;quot;, &amp;quot;CustomSegmentValueB&amp;quot;)  //optional&lt;br /&gt;
    .put(&amp;quot;segC&amp;quot;, &amp;quot;CustomSegmentValueC&amp;quot;)  //optional&lt;br /&gt;
    .put(&amp;quot;isfullepisode&amp;quot;, &amp;quot;yes&amp;quot;)&lt;br /&gt;
    .put(&amp;quot;airdate&amp;quot;, &amp;quot;20161013 20:00:00&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
{{DCR Content Metadata}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
== Sequence of Calls ==&lt;br /&gt;
=== play ===&lt;br /&gt;
Use [[DCR_Video_APP_SDK#play|play]] to pass the channel descriptor information through channelName parameter when the user taps the '''Play''' button on the player.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    public void play(JSONObject channelInfo);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadMetadata ===&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void loadMetadata(JSONObject contentMetadata);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== playheadPosition ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void setPlayheadPosition(long position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stop ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void stop()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== end ===&lt;br /&gt;
When content stop is initiated and content cannot be resumed from the same position (it can only be restarted from the beginning of stream).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public void end()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example Ad Object ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure API Calls ==&lt;br /&gt;
&lt;br /&gt;
=== Sample API Sequence ===&lt;br /&gt;
A Sample API sequence could follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
|On App Start||&amp;lt;code&amp;gt;[nielsenMeter loadMetadata: contentMetadata];&amp;lt;/code&amp;gt; || // contentMetadata Object contains the JSON metadata for the impression&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;[nielsenMeter play: channelName];&amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[nielsenMeter loadMetadata: contentMetadataObject];&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;[nielsenMeter setplayheadPosition: position];&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;[nielsenMeter end];&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: || current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'setPlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call when content or ads complete playing and pass playhead position&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: For livestream, send the Unix timestamp; for VOD send the time in seconds as integer. The final playhead position must be sent for the current asset being played before calling &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; or&amp;lt;code&amp;gt; '''loadmetadata'''&amp;lt;/code&amp;gt;,.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Life cycle of SDK instance ===&lt;br /&gt;
Life cycle of SDK instance includes four general states:&lt;br /&gt;
# '''Initial state''' – The SDK is not initialized and hence, not ready to process playing information. Once the SDK is moved out of this state, it needs instantiation of the new SDK instance in order to get the instance in the '''Initial state'''.&lt;br /&gt;
# '''Idle state''' – The SDK is initialized and is ready to process playing information. Once Initialized, the SDK instance is not processing any data, but is listening for the play event to occur.&lt;br /&gt;
# '''Processing state''' – The SDK instance is processing playing information. The &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; calls move the SDK instance into this state. In this state, the SDK instance will be able to process the following calls.&lt;br /&gt;
## &amp;lt;code&amp;gt;'''setplayheadPosition'''&amp;lt;/code&amp;gt; – Call this API every one second when playhead position timer is fired.  If a LIVE event, use the current Unix timestamp (seconds since Jan-1-1970 UTC).&lt;br /&gt;
## &amp;lt;code&amp;gt;'''stop'''&amp;lt;/code&amp;gt; – Call this API when the playback is paused, switches between content and ad (within the same content playback) or encounters interruptions.&lt;br /&gt;
## &amp;lt;code&amp;gt;'''end'''&amp;lt;/code&amp;gt; – SDK instance exits from Processing state when this API is called.&lt;br /&gt;
# '''Disabled state''' – The SDK instance is disabled and is not processing playing information. SDK instance moves into this state in one of the following scenarios.&lt;br /&gt;
## Initialization fails&lt;br /&gt;
## &amp;lt;code&amp;gt;'''appDisableApi'''&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' For API Version 5.1 and above, App SDK will fire data pings and continue measurement even after the user has opted out from Nielsen measurement on a device. The data ping will be marked as opted-out ping.&lt;br /&gt;
&lt;br /&gt;
'''Note''': In case of any interruptions during playback due to alarm, calendar, call, flight mode, Wi-Fi toggle, channel change, etc., call [[stop]] to stop the measurement.&lt;br /&gt;
* As soon as the playback resumes, call &amp;lt;code&amp;gt;'''play'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''loadMetadata''' &amp;lt;/code&amp;gt; and   &amp;lt;code&amp;gt;'''playheadPosition'''&amp;lt;/code&amp;gt; &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Call Sequence ===&lt;br /&gt;
==== Use Case 1: Content has no Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for content as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;vid345-67483&amp;quot;,&lt;br /&gt;
  &amp;quot;program&amp;quot;: &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Program S3, EP1&amp;quot;,&lt;br /&gt;
  &amp;quot;length&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
  ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop.&lt;br /&gt;
Use the sample API sequence below as a reference to identify the specific events that need to be called during content playback without ads.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| Content || &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Content playback is completed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Use Case 2: Content has Advertisements ====&lt;br /&gt;
Call [[play()]] with channelName JSON as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;channelName&amp;quot;: &amp;quot;TheMovieTitle&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Call [[loadMetadata()]] with JSON metadata for ad as below.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
   &amp;quot;assetid&amp;quot;: &amp;quot;ad=123&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: In case the individual ad details are not available, send ad pod (presence) details through the [[loadMetadata]] and playhead position through [[playheadPosition]].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Call [[setPlayheadPosition()]] every one second until a pause / stop / another [[loadMetadata()]] is called. Playhead should be passed for the entire duration of ad pod, if the ad pod details are passed as part of [[loadMetadata()]].&lt;br /&gt;
&lt;br /&gt;
'''Ad Content'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;    long pos = mAdPlayer.videoPosition() / 1000;&lt;br /&gt;
   if (mAppSdk != null)&lt;br /&gt;
   {&lt;br /&gt;
     mAppSdk.setPlayheadPosition(pos);&lt;br /&gt;
   }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: The playhead positions for ad and content should be maintained separately.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The sample API sequence can be used as a reference to identify the specific events that need to be called during content and ad playback.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Sample code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Start of stream || &amp;lt;code&amp;gt;mAppSdk.play(channelName); &amp;lt;/code&amp;gt; || // channelName contains JSON metadata of channel/video name being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Preroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(prerollMetadataObject);&amp;lt;/code&amp;gt; || // prerollMetadataObject contains the JSON metadata for the preroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the preroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after preroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after the content is paused (ad starts)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | Midroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // midrollMetadataObject contains the JSON metadata for the midroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the midroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // App moves to background(midroll pauses) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.loadMetadata(midrollMetaDataObject);&amp;lt;/code&amp;gt; || // App moves to foreground (midroll resumes) &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // playheadPosition is position of the playhead while the midroll ad is being played &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after midroll occurs&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Content (End of stream) || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(contentMetaDataObject);&amp;lt;/code&amp;gt; || // contentMetadataObject contains the JSON metadata for the content being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the content is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Always call stop irrespective of postroll is followed or not&lt;br /&gt;
|-&lt;br /&gt;
| End of Stream || &amp;lt;code&amp;gt;mAppSdk.end();&amp;lt;/code&amp;gt; || // Call end() at the end of content&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Postroll || &amp;lt;code&amp;gt;mAppSdk.loadMetadata(postrollMetaDataObject);&amp;lt;/code&amp;gt; || // postrollMetadataObject contains the JSON metadata for the postroll ad&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.setPlayheadPosition(playheadPosition);&amp;lt;/code&amp;gt; || // position is position of the playhead while the postroll ad is being played&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mAppSdk.stop();&amp;lt;/code&amp;gt; || // Call stop after postroll occurs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Note: Each Ad playhead should reset or begin from 0 at ad start. When content has resumed following an ad break, playhead position must continue from where previous content segment was left off.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handling Foreground and Background states ==&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation which is especially crucial for static measurement. It may be implemented in multiple ways for Android. This includes&lt;br /&gt;
* Enable the Nielsen SDK to measure background/foreground state by makingthe relevant update to the AndroidManifest.&lt;br /&gt;
* Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class.&lt;br /&gt;
* Custom implementation of the required methods within your application.&lt;br /&gt;
&lt;br /&gt;
=== ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients. (You will need to copy/paste the code provided into a file).&lt;br /&gt;
&lt;br /&gt;
=== Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
sdk.appInForeground(getApplicationContext());&lt;br /&gt;
sdk.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Correct measurement of the foreground/background state is crucial to Static App measurement within Nielsen Digital Content Ratings (DCR).&lt;br /&gt;
&lt;br /&gt;
== Interruptions during playback ==&lt;br /&gt;
As part of integrating Nielsen App SDK with the player application, the Audio / Video app developer needs to handle the following possible interruption scenarios:&lt;br /&gt;
* Pause / Play&lt;br /&gt;
* Network Loss (Wi-Fi / Airplane / Cellular)&lt;br /&gt;
* Call Interrupt (SIM or Third party Skype / Hangout call)&lt;br /&gt;
* Alarm Interrupt&lt;br /&gt;
* Content Buffering&lt;br /&gt;
* Device Lock / Unlock (Video players only, not for Audio players)&lt;br /&gt;
* App going in the Background/Foreground (Video players only, not for Audio players)&lt;br /&gt;
* Channel / Station Change Scenario&lt;br /&gt;
* Unplugging of headphone&lt;br /&gt;
In case of encountering one of the above interruptions, the player application needs to&lt;br /&gt;
* Call [[stop]] immediately (except when content is buffering) and withhold sending playhead position.&lt;br /&gt;
* Start sending pings – &amp;lt;code&amp;gt;'loadMetadata'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'playheadPosition'&amp;lt;/code&amp;gt; for the new viewing session, once the playback resumes.&lt;br /&gt;
Please see the [https://engineeringportal.nielsen.com/docs/Digital_Measurement_Interruption_Scenarios Interruption Scenarios Page] for more details&lt;br /&gt;
&lt;br /&gt;
== Pre-Certification Checklists ==&lt;br /&gt;
After the application is ready to be sent for Nielsen Certification, please go through the [[Digital Pre-Certification Checklist App SDK]] and ensure the app behaves as expected, before submitting to Nielsen.&lt;br /&gt;
&lt;br /&gt;
{{Template:Android_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
Following Nielsen testing, users need to make one update to the initialization call to ensure that the site is being measured properly.&lt;br /&gt;
&lt;br /&gt;
# '''Debug Logging''': Disable logging by deleting &amp;lt;code&amp;gt;{nol_sdkDebug: 'DEBUG'}&amp;lt;/code&amp;gt; from initialization call.&lt;br /&gt;
'''Note''': before going live you have to inform Nielsen team - this is necessary, because Nielsen team has to adjust internal configuration parameter to enable data collection. Without that notification no data will be collected and no data will be reported.&lt;br /&gt;
&lt;br /&gt;
== Sample Applications ==&lt;br /&gt;
The below sample applications have been designed to show the API's functionality and are broken into two distinct categories:&lt;br /&gt;
* '''Basic''' - To show the functionality of the Nielsen  API using a standard no-frills player.&lt;br /&gt;
** [[Swift Basic Sample|Swift 4.0 Sample]]&lt;br /&gt;
** [[Objective-c Basic example|Objective-C Sample]]&lt;br /&gt;
** [[Android Basic example|Android Studio Example]]&lt;br /&gt;
&lt;br /&gt;
* '''Advanced''' - Nielsen API integrated into a custom video player is bundled with the SDK.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=International&amp;diff=3601</id>
		<title>International</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=International&amp;diff=3601"/>
		<updated>2019-03-28T19:03:39Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
{{CategoryIcon|International.png|International}}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Please contact your Nielsen representative for documentation if the guides for your country aren't listed.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Downloads&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 90px;&amp;quot; |{{SmallIcon|DownloadIcon.png|alt=Cloud API}} &lt;br /&gt;
|style=&amp;quot;width: 90px;&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| '''[[Digital Downloads|SDK Downloads]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Italy&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | {{SmallIcon|ITFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Video App SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Video Browser SDK (6.0.0)]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR Italy Video Browser SDK (6.0.1)]] Object Video only'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | {{OSIcon|StaticIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Static App SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Italy Static Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|FacebookIcon.png|alt=Facebook Instant Articles}}&lt;br /&gt;
| '''[[DCR Italy Static Facebook Instant Articles Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|AMPIcon.png|alt=Google AMP}}&lt;br /&gt;
| '''[[DCR Italy Static Google AMP Cloud API]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Norway&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|norway-flag-xs.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Norway Audio App SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Norway Audio Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | India&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|INFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR India Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR India Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR India Video Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Czech&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | {{SmallIcon|CZFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Czech Video App SDK]]'''&lt;br /&gt;
'''[[Czech Digital Measurement iOS Simplified SDK|DCR Czech Simplified SDK for iOS (Trackevent)]]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[[Czech Digital Measurement Android Simplified SDK|DCR Czech Simplified SDK for Android (Trackevent)]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Czech Video Browser SDK]]'''&lt;br /&gt;
'''[[Czech Digital Measurement Browser Simplified SDK|DCR Czech Simplified SDK for Browser (Trackevent)]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{OSIcon|StaticIcon.png}}&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Czech Static Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
| '''[[Czech SDK Metadata]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Czech Changing Approved Player]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Czech Contacts]]'''&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;background-color:white;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Thailand&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|THFlagIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|SDKIcon.png}}&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png}}&lt;br /&gt;
| '''[[DCR Thailand Video iOS SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png}}&lt;br /&gt;
| '''[[DCR Thailand Video Android SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png}}&lt;br /&gt;
| '''[[DCR Thailand Video Browser SDK]]'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3600</id>
		<title>Czech Digital Measurement iOS Simplified SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3600"/>
		<updated>2019-03-28T18:55:40Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please see [https://engineeringportal.nielsen.com/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Step 1 : Get SDK ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For AppSDK versions, release dates and release notes - refer to [https://engineeringportal.nielsen.com/docs/iOS_SDK_Release_Notes iOS AppSDK release notes]. &amp;lt;br&amp;gt;&lt;br /&gt;
Always keep latest and greatest AppSDK version inside your app.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK can either be&lt;br /&gt;
* integrated directly within an application through the use of a CocoaPod (iOS) or Gradle (Android) - select to read [https://engineeringportal.nielsen.com/docs/Digital_Measurement_iOS_Artifactory_Guide CocoaPod implementation guide] - '''Recommended solution''' that will keep your SDK copy latest by each build. Once finished continue to Step 3.&lt;br /&gt;
* or downloaded as ZIP package at [https://engineeringportal.nielsen.com/docs/Special:Downloads Nielsen Downloads]. Package contains NielsenAppApi.framework (Static and Dynamic versions) as well as sample applications. You will have to update SDK manually always when new version of AppSDK is released. Once finished continue to Step 2.&lt;br /&gt;
&lt;br /&gt;
== Step 2 : Setting up your xCode Development Environment  ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Applicable only if using downloaded Framework package&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''From AppSDK version 6.2 (5.2.2018) - Dynamic Framework'''&amp;lt;br&amp;gt;&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the iOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release.&amp;lt;br&amp;gt;&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required: [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++].&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Proceed : &amp;lt;br&amp;gt;&lt;br /&gt;
1) From Nielsen SDK package - inside DynamicFramework dir - extract “NielsenAppApi.Framework” and copy it to Frameworks folder of the Xcode project.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Add Framework - In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&amp;lt;br&amp;gt;&lt;br /&gt;
3) Add Path - Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Before AppSDK version 6.2 (5.2.2018) - Static Framework - Depreciated'''&amp;lt;br&amp;gt;&lt;br /&gt;
From Nielsen SDK package - inside StaticFramework dir - extract “NielsenAppApi.Framework”. For futher steps refer to Step 1: Setting up your Development Environment inside [https://engineeringportal.nielsen.com/docs/DCR_Czech_Video_App_SDK DCR Czech Video App SDK (standard API)]. &lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Nielsen App SDK is compatible with Apple iOS versions 9.0 and above.&lt;br /&gt;
* The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
* All communications between the SDK and the Census (Collection Facility) use HTTPS&lt;br /&gt;
&lt;br /&gt;
== Step 3: Import SDK ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Add SDK import&lt;br /&gt;
&lt;br /&gt;
a) Using Objective-C :&amp;lt;br&amp;gt;&lt;br /&gt;
Add the code to the View Controller’s header file&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
b) Using Swift :&amp;lt;br&amp;gt;&lt;br /&gt;
Add the code to the ViewController.swift&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Alternatively using Objective-C bridging header : to import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&amp;lt;br&amp;gt;&lt;br /&gt;
Select File/New File/Objective-C File, Xcode will prompt you to create a bridging header.&amp;lt;br&amp;gt;&lt;br /&gt;
Once this bridging header file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4 : SDK Initialization ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type&lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;cz&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample SDK Initialization Code  - Swift ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;cz&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot; &lt;br /&gt;
            ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Sample SDK Initialization Code  - Objective C ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NielsenInit.m&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;cz&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;DEBUG&amp;quot;&lt;br /&gt;
 };  &lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NielsenInit.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Init SDK inside ViewController.m&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController ()&lt;br /&gt;
    @property (nonatomic, strong) NielsenAppApi *nielsenAppApi;&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    NSLog(@&amp;quot;viewDidLoad - app started&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== APP SDK Error &amp;amp; Event Codes ===&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Step 5 : Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
self.nielsenEventTracker?.trackEvent(TrackEventData)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== TrackEvent JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passed parametres ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For Live Stream : Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;For VOD : Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UTC timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play. For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. Send content metadata for every playheadposition update.&amp;lt;br&amp;gt;When content is playing, pass only metadata for content - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
let metadata:[String: String] = [&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins. For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic].&amp;lt;br&amp;gt;&lt;br /&gt;
When ad is playing, pass metadata for ad and its content as well - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
let metadata:[String: String] = [&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
Note : static is currently used in Czech Republic only for Browser implementations, not apps. Please leave metadata empty - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
let metadata:[String: String] = [&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together (example for ad) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// content&lt;br /&gt;
let metaDataContent:[String: String] = [&lt;br /&gt;
        &amp;quot;assetid&amp;quot; : &amp;quot;c1&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot; : &amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot; : &amp;quot;myProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot; : &amp;quot;Anime Movie&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot; : &amp;quot;52&amp;quot;,&lt;br /&gt;
        &amp;quot;mediaUrl&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot; : &amp;quot;20161013 20:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot; : &amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;crossId1&amp;quot; : &amp;quot;9827411&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c1&amp;quot; : &amp;quot;p1,&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c2&amp;quot; : &amp;quot;p2,TVident&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot; : &amp;quot;Programový typ&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot; : &amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;hasAds&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
// ad&lt;br /&gt;
let metaDataAd:[String: String] = [&lt;br /&gt;
        &amp;quot;assetid&amp;quot;: &amp;quot;ad1&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;postroll&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: &amp;quot;Ad Tostoriros&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c4&amp;quot;: &amp;quot;p4,ASMEA code for ad&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c5&amp;quot;: &amp;quot;p5,Atribut for ad&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c6&amp;quot;: &amp;quot;p6,postroll&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_ac&amp;quot;: &amp;quot;ad&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
// metaData&lt;br /&gt;
let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : metaDataContent,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : metaDataAd,&lt;br /&gt;
        &amp;quot;static&amp;quot; : &amp;quot;&amp;quot;&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
&lt;br /&gt;
// trackEventObject&lt;br /&gt;
let trackEventObject = [&lt;br /&gt;
         &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
         &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
         &amp;quot;playheadPosition&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
self.nielsenEventTracker.trackEvent(trackEventObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 6 : API Call sequence ==&lt;br /&gt;
&lt;br /&gt;
=== Use Case 1: Content has no Advertisements ===&lt;br /&gt;
Playlist : single content, no ads.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. Video start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Video playing .. || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Video ends ||  event complete, type : content, metadata : content_metaDataObject, playheadPosition : lastPlayheadValue || call complete&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use Case 2: Content has Advertisements ===&lt;br /&gt;
Playlist : ad preroll - content - ad midroll - content continues - ad postroll.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. '''Ad Preroll''' start || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Ad Preroll playing .. || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Ad Preroll ends || event '''adStop''', type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 4. '''Content''' start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 5. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 6. Content interupted by midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || last playhead &lt;br /&gt;
|-&lt;br /&gt;
| 7. '''Ad Midroll''' start || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 8. Ad Midroll playing .. || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 9. Ad Midroll ends  || event '''adStop''', type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 10. '''Content''' continues after midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 11. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 12. Content ends  || event '''complete''', type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || call complete for content &lt;br /&gt;
|-&lt;br /&gt;
| 13. '''Ad Postroll''' start || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 14. Ad Postroll playing .. || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 15. Ad Postroll ends || event '''adStop''', type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 3: Advertisement Pool ===&lt;br /&gt;
where there are more ads in each ad pool.&amp;lt;br&amp;gt;&lt;br /&gt;
Playlist : ad preroll1 - preroll 2 - content - ad midroll 1 - ad midroll 2 - content continues - ad postroll 1 - ad postroll 2.&amp;lt;br&amp;gt;&lt;br /&gt;
Use adldx parametr to assign position of ad in ad pool (starting from 0)&lt;br /&gt;
Ad in pool MetaData Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject adMetadata = new JSONObject()&lt;br /&gt;
   .put(&amp;quot;assetid&amp;quot;, &amp;quot;assetid_example_postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;type&amp;quot;, &amp;quot;postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;length&amp;quot;, &amp;quot;30&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;title&amp;quot;, &amp;quot;Nielsen postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c4&amp;quot;, &amp;quot;p4,ASMEAcode&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c5&amp;quot;, &amp;quot;p5,AtributForAd&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c6&amp;quot;, &amp;quot;p6,postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;adldx&amp;quot; : “0” );  // position in ad pool - 0,1,2..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Reset the playhead position to 0 for each ad.&amp;lt;br&amp;gt;&lt;br /&gt;
Call the adStop event at the end of each ad or increment the adldx&amp;lt;br&amp;gt;&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Then once the next ad is started the adIdx parameter should be changed and provided - like below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Handling Foreground and Background states ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple].&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation.&lt;br /&gt;
&lt;br /&gt;
Call API call pause when app is entering Background.&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Privacy and Opt-Out ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. &lt;br /&gt;
Users must have access to &amp;quot;About Nielsen Measurement&amp;quot; web page - see below, or have similar text available within the native app. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Include link or text to&lt;br /&gt;
* app settings screen&lt;br /&gt;
* or to your Privacy Policy / EULA section&lt;br /&gt;
* or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/browser/cz/cs/optout.html for more information&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDK will be sending the data pings to census even though SDK is opted out (In earlier releases all the traffic from SDK to census will be ceased). However, all the outgoing pings will have the parameter uoo=true using which backend can ignore this data.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== 1. Get Url of privacy page ===&lt;br /&gt;
URL for the Nielsen Privacy web page should be retrieved using API call optOutURL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
optOutUrlfromSKD = self.nielsenEventTracker!.optOutURL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the App SDK returns NULL in the optOutURL, handle the exception gracefully and retry later.&lt;br /&gt;
Example of returned Url is http://priv-policy.imrworldwide.com/priv/mobile/cz/cs/optout.html followed by unique hash.&lt;br /&gt;
&lt;br /&gt;
=== 2. Open URL in webView ===&lt;br /&gt;
Recieved URL should be opened in 'WebView' / External browser. App should provide a UI control like 'close' or 'back' button to close the 'WebView' / External browser.&lt;br /&gt;
&lt;br /&gt;
=== 3. Get current Opt-Out status (voluntarily) ===&lt;br /&gt;
To retrieve the current Opt-Out status of a device, use the [[optOutStatus]] method.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
let optOutStatusDetected = nielsenEventTracker!.optOutStatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
if returns false = no OptOut, if true = OptOut is active.&lt;br /&gt;
&lt;br /&gt;
== Step 9 : Test your player by your self ==&lt;br /&gt;
&lt;br /&gt;
=== Guide ===&lt;br /&gt;
# Connect your PC and test device (tablet or phone) via same router.&lt;br /&gt;
# PC side: run Proxy sw (like Charles) and get local IP&lt;br /&gt;
# Test device: modify Wifi setting to pass throug Proxy IP from add 2&lt;br /&gt;
# Test device: run your player, launch video&lt;br /&gt;
# PC side: filter trafic by &amp;quot;imr&amp;quot; and confirm presence of GN pings&lt;br /&gt;
for Android see https://youtu.be/zOKOinb-zdc, for iOS see https://youtu.be/Gk0YQttiXRI&lt;br /&gt;
&lt;br /&gt;
=== Example of GN ping ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
https://secure-cert.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=cz-509218&amp;amp;ch=cz-509218_c04_P&amp;amp;asn=defChnAsset&amp;amp;sessionId=OasHSz6TtBLlBK7m8L63h3cEihKCL1553591192&lt;br /&gt;
&amp;amp;tl=Ad%2520preroll%2520Renault&amp;amp;prv=1&amp;amp;c6=vc,c04&amp;amp;ca=cz-509218_c04_id_ad1&amp;amp;cg=myProgram&lt;br /&gt;
&amp;amp;c13=asid,P9E9DAEAE-BDEE-461B-8263-54CD2DCBDA22&amp;amp;c32=segA,NA&amp;amp;c33=segB,Programov%25C3%25BD%2520typ&lt;br /&gt;
&amp;amp;c34=segC,NA&amp;amp;c15=apn,CZ%20demo%20TrackEvent&amp;amp;plugv=&amp;amp;playerv=&amp;amp;sup=1&amp;amp;segment2=-1&amp;amp;segment1=cze&lt;br /&gt;
&amp;amp;forward=0&amp;amp;ad=1&amp;amp;cr=4_00_99_D1_00000&amp;amp;c9=devid,&amp;amp;enc=true&amp;amp;c1=nuid,&amp;amp;at=timer&amp;amp;rt=video&amp;amp;c16=sdkv,ai.6.0.0&lt;br /&gt;
&amp;amp;c27=cln,15&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid,P9E9DAEAE-BDEE-461B-8263-54CD2DCBDA22&amp;amp;c30=bldv,ai.6.2.0.0_gada&amp;amp;st=dcr&lt;br /&gt;
&amp;amp;c7=osgrp,IOS&amp;amp;c8=devgrp,TAB&amp;amp;c10=plt,MBL&amp;amp;c40=adbid,&amp;amp;c14=osver,iOS12_1_4&amp;amp;c26=dmap,1&amp;amp;dd=&lt;br /&gt;
&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,9827411&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,15&lt;br /&gt;
&amp;amp;c52=noad,1&amp;amp;sd=34&amp;amp;devtypid=iPad5,3&amp;amp;pc=NA&amp;amp;c53=fef,n&amp;amp;c54=oad,&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=id_ad1&amp;amp;c3=st,a&lt;br /&gt;
&amp;amp;c64=starttm,1553591199&amp;amp;adid=id_ad1&amp;amp;c58=isLive,false&amp;amp;c59=sesid,mmk4Mnl3tXLhVD7Conqn7sBNMtn4o1553591199&lt;br /&gt;
&amp;amp;c61=createtm,1553591214&amp;amp;c63=pipMode,&amp;amp;c60=cvarall,p0%252Cdcrcz~~~~~~st%252Ca~~p4%252CASMEA%2520code%2520for&lt;br /&gt;
%2520ad~~p5%252CAtribut%2520for%2520ad~~p6%252Cpreroll&amp;amp;c62=sendTime,1553591214&lt;br /&gt;
&amp;amp;c68=bndlid,cz.admosphere.iOSdemo.TrackEvent.Josef&amp;amp;c69=cvw,&amp;amp;nodeTM=&amp;amp;logTM=&amp;amp;c73=phtype,Tablet&lt;br /&gt;
&amp;amp;c74=dvcnm,Apple+iPad&amp;amp;c76=adbsnid,&amp;amp;df=-1&amp;amp;uoo=true&amp;amp;c44=progen,&amp;amp;davty=1&amp;amp;si=&amp;amp;c66=mediaurl,&amp;amp;vtoff=0&amp;amp;rnd=1553591214683&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 10: Provide your app for certification ==&lt;br /&gt;
Once ready please send your application to Nielsen local staff for verification - see [http://dayrhesdkp001z.enterprisenet.org/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Step 11: Going Live ==&lt;br /&gt;
After the integration has been certified (but not prior that), disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call - see Step 4.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3599</id>
		<title>Czech Digital Measurement iOS Simplified SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3599"/>
		<updated>2019-03-28T18:54:26Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please see [https://engineeringportal.nielsen.com/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
For iOS SDK framework package will contain 2 public header files. One header file will contain old SDK interface and will be used by existing clients (NielsenAppApi.h). New API will be defined in a new public header file (NielsenEventTracker.h).&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for iOS using Xcode.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Step 1 : Get SDK ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For AppSDK versions, release dates and release notes - refer to [https://engineeringportal.nielsen.com/docs/iOS_SDK_Release_Notes iOS AppSDK release notes]. &amp;lt;br&amp;gt;&lt;br /&gt;
Always keep latest and greatest AppSDK version inside your app.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Nielsen AppSDK can either be&lt;br /&gt;
* integrated directly within an application through the use of a CocoaPod (iOS) or Gradle (Android) - select to read [https://engineeringportal.nielsen.com/docs/Digital_Measurement_iOS_Artifactory_Guide CocoaPod implementation guide] - '''Recommended solution''' that will keep your SDK copy latest by each build. Once finished continue to Step 3.&lt;br /&gt;
* or downloaded as ZIP package at [https://engineeringportal.nielsen.com/docs/Special:Downloads Nielsen Downloads]. Package contains NielsenAppApi.framework (Static and Dynamic versions) as well as sample applications. You will have to update SDK manually always when new version of AppSDK is released. Once finished continue to Step 2.&lt;br /&gt;
&lt;br /&gt;
== Step 2 : Setting up your xCode Development Environment  ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Applicable only if using downloaded Framework package&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''From AppSDK version 6.2 (5.2.2018) - Dynamic Framework'''&amp;lt;br&amp;gt;&lt;br /&gt;
Prior to SDK Version 6.2.0.0 the iOS framework has been distributed as a static library packaged into framework bundle format. Apple recommends to use dynamic framework, it has some benefits over static libraries like less executable file size of an app, faster startup time and native support in xCode IDE. Nielsen AppSDK has been transformed into dynamic framework in this release.&amp;lt;br&amp;gt;&lt;br /&gt;
If migrating from the static library to this new dynamic framework, once implemented, unless your specific application requires, you can remove the following Frameworks that were once required: [AdSupport, JavascriptCore, SystemConfiguration, Security, AVFoundation, libc++].&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Proceed : &amp;lt;br&amp;gt;&lt;br /&gt;
1) From Nielsen SDK package - inside DynamicFramework dir - extract “NielsenAppApi.Framework” and copy it to Frameworks folder of the Xcode project.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Add Framework - In the General tab for app configuration add NielsenAppApi.framework in the list of Embedded Binaries.&amp;lt;br&amp;gt;&lt;br /&gt;
3) Add Path - Add path to the NielsenAppApi.framework in the Framework Search Paths build setting.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Before AppSDK version 6.2 (5.2.2018) - Static Framework - Depreciated'''&amp;lt;br&amp;gt;&lt;br /&gt;
From Nielsen SDK package - inside StaticFramework dir - extract “NielsenAppApi.Framework”. For futher steps refer to Step 1: Setting up your Development Environment inside [https://engineeringportal.nielsen.com/docs/DCR_Czech_Video_App_SDK DCR Czech Video App SDK (standard API)]. &lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Nielsen App SDK is compatible with Apple iOS versions 9.0 and above.&lt;br /&gt;
* The SDK uses the NSURLSession instead of the deprecated NSURLConnection.&lt;br /&gt;
* All communications between the SDK and the Census (Collection Facility) use HTTPS&lt;br /&gt;
&lt;br /&gt;
== Step 3: Import SDK ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Add SDK import&lt;br /&gt;
&lt;br /&gt;
a) Using Objective-C :&amp;lt;br&amp;gt;&lt;br /&gt;
Add the code to the View Controller’s header file&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
b) Using Swift :&amp;lt;br&amp;gt;&lt;br /&gt;
Add the code to the ViewController.swift&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Alternatively using Objective-C bridging header : to import a set of Objective-C files in the same app target as your Swift code, you rely on an Objective-C bridging header to expose those files to Swift. Xcode offers to create this header file when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.&amp;lt;br&amp;gt;&lt;br /&gt;
Select File/New File/Objective-C File, Xcode will prompt you to create a bridging header.&amp;lt;br&amp;gt;&lt;br /&gt;
Once this bridging header file has been created, you need to add the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenAppApi.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4 : SDK Initialization ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen. It is GUID data type&lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;cz&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample SDK Initialization Code  - Swift ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;NielsenInit.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Foundation&lt;br /&gt;
import NielsenAppApi&lt;br /&gt;
&lt;br /&gt;
class NielsenInit : NSObject {&lt;br /&gt;
    class func createEventTracker(delegate: NielsenEventTrackerDelegate) -&amp;gt; NielsenEventTracker?{&lt;br /&gt;
    &lt;br /&gt;
        //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
        &lt;br /&gt;
        var nielsenEventTracker: NielsenEventTracker?&lt;br /&gt;
        &lt;br /&gt;
        let appInformation = [  &lt;br /&gt;
            &amp;quot;appid&amp;quot;: &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
            &amp;quot;appversion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
            &amp;quot;appname&amp;quot;: &amp;quot;Amazing app&amp;quot;,&lt;br /&gt;
            &amp;quot;sfcode&amp;quot;: &amp;quot;cz&amp;quot;,&lt;br /&gt;
            &amp;quot;nol_devDebug&amp;quot;: &amp;quot;DEBUG&amp;quot; &lt;br /&gt;
            ]&lt;br /&gt;
        &lt;br /&gt;
        nielsenEventTracker = NielsenEventTracker(appInfo:appInformation1, delegate:delegate)&lt;br /&gt;
        return nielsenEventTracker&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ViewController.swift&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    override func viewDidLoad() {&lt;br /&gt;
        super.viewDidLoad()&lt;br /&gt;
        &lt;br /&gt;
        //Getting the instance of NielsenEventTracker&lt;br /&gt;
        self.nielsenEventTracker = NielsenInit.createEventTracker(delegate: self)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Sample SDK Initialization Code  - Objective C ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Initialize the Nielsen App object within the viewDidLoad view controller delegate method using initWithAppInfo:delegate:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If App SDK is initialized using init or new methods, it will ignore the API calls resulting in no measurement. The SDK will not return any errors.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NielsenInit.m&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
#import &amp;lt;NielsenAppApi/NielsenEventTracker.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@implementation NielsenInit&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate&lt;br /&gt;
{&lt;br /&gt;
    //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
    &lt;br /&gt;
    NSDictionary *appInformation = @{ @&amp;quot;appid&amp;quot;: @&amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appversion&amp;quot;: @&amp;quot;1.0&amp;quot;,&lt;br /&gt;
                            @&amp;quot;appname&amp;quot;: @&amp;quot;Objc Test app&amp;quot;,&lt;br /&gt;
                            @&amp;quot;sfcode&amp;quot;: @&amp;quot;cz&amp;quot;,&lt;br /&gt;
                            @&amp;quot;nol_devDebug&amp;quot;: @&amp;quot;DEBUG&amp;quot;&lt;br /&gt;
 };  &lt;br /&gt;
    &lt;br /&gt;
    return [[NielsenEventTracker alloc] initWithAppInfo:appInformation delegate:delegate];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NielsenInit.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@class NielsenEventTracker;&lt;br /&gt;
@protocol NielsenEventTrackerDelegate;&lt;br /&gt;
&lt;br /&gt;
@interface NielsenInit : NSObject&lt;br /&gt;
&lt;br /&gt;
+ (NielsenEventTracker *)createNielsenEventTrackerWithDelegate:(id&amp;lt;NielsenEventTrackerDelegate&amp;gt;)delegate;&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Init SDK inside ViewController.m&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;#import &amp;quot;ViewController.h&amp;quot;&lt;br /&gt;
#import &amp;quot;NielsenInit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@interface ViewController ()&lt;br /&gt;
    @property (nonatomic, strong) NielsenAppApi *nielsenAppApi;&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@implementation ViewController&lt;br /&gt;
- (void)viewDidLoad {&lt;br /&gt;
    [super viewDidLoad];&lt;br /&gt;
    NSLog(@&amp;quot;viewDidLoad - app started&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Getting the instance of NielsenEventTracker&lt;br /&gt;
    nielsenEventTracker = [NielsenInit createNielsenEventTrackerWithDelegate:nil];&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== APP SDK Error &amp;amp; Event Codes ===&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Step 5 : Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objective-c&amp;quot;&amp;gt;&lt;br /&gt;
self.nielsenEventTracker?.trackEvent(TrackEventData)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== TrackEvent JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passed parametres ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For Live Stream : Position value is UTC timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;For VOD : Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UTC timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play. For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. Send content metadata for every playheadposition update.&amp;lt;br&amp;gt;When content is playing, pass only metadata for content - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
let metadata:[String: String] = [&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins. For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic].&amp;lt;br&amp;gt;&lt;br /&gt;
When ad is playing, pass metadata for ad and its content as well - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
let metadata:[String: String] = [&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
Note : static is currently used in Czech Republic only for Browser implementations, not apps. Please leave metadata empty - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
let metadata:[String: String] = [&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together (example for ad) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// content&lt;br /&gt;
let metaDataContent:[String: String] = [&lt;br /&gt;
        &amp;quot;assetid&amp;quot; : &amp;quot;c1&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot; : &amp;quot;content&amp;quot;,&lt;br /&gt;
        &amp;quot;program&amp;quot; : &amp;quot;myProgram&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot; : &amp;quot;Anime Movie&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot; : &amp;quot;52&amp;quot;,&lt;br /&gt;
        &amp;quot;mediaUrl&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;airdate&amp;quot; : &amp;quot;20161013 20:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;isfullepisode&amp;quot; : &amp;quot;y&amp;quot;,&lt;br /&gt;
        &amp;quot;crossId1&amp;quot; : &amp;quot;9827411&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c1&amp;quot; : &amp;quot;p1,&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c2&amp;quot; : &amp;quot;p2,TVident&amp;quot;,&lt;br /&gt;
        &amp;quot;segB&amp;quot; : &amp;quot;Programový typ&amp;quot;,&lt;br /&gt;
        &amp;quot;segC&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;adloadtype&amp;quot; : &amp;quot;2&amp;quot;,&lt;br /&gt;
        &amp;quot;hasAds&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
// ad&lt;br /&gt;
let metaDataAd:[String: String] = [&lt;br /&gt;
        &amp;quot;assetid&amp;quot;: &amp;quot;ad1&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;postroll&amp;quot;,&lt;br /&gt;
        &amp;quot;length&amp;quot;: &amp;quot;15&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: &amp;quot;Ad Tostoriros&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c4&amp;quot;: &amp;quot;p4,ASMEA code for ad&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c5&amp;quot;: &amp;quot;p5,Atribut for ad&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_c6&amp;quot;: &amp;quot;p6,postroll&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_ac&amp;quot;: &amp;quot;ad&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
// metaData&lt;br /&gt;
let metadata = [&lt;br /&gt;
        &amp;quot;content&amp;quot; : metaDataContent,&lt;br /&gt;
        &amp;quot;ad&amp;quot; : metaDataAd,&lt;br /&gt;
        &amp;quot;static&amp;quot; : &amp;quot;&amp;quot;&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
&lt;br /&gt;
// trackEventObject&lt;br /&gt;
let trackEventObject = [&lt;br /&gt;
         &amp;quot;metadata&amp;quot; : metadata,&lt;br /&gt;
         &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
         &amp;quot;playheadPosition&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;,&lt;br /&gt;
            ] as [String : Any]&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
self.nielsenEventTracker.trackEvent(trackEventObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 6 : API Call sequence ==&lt;br /&gt;
&lt;br /&gt;
=== Use Case 1: Content has no Advertisements ===&lt;br /&gt;
Playlist : single content, no ads.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. Video start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Video playing .. || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Video ends ||  event complete, type : content, metadata : content_metaDataObject, playheadPosition : lastPlayheadValue || call complete&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use Case 2: Content has Advertisements ===&lt;br /&gt;
Playlist : ad preroll - content - ad midroll - content continues - ad postroll.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. '''Ad Preroll''' start || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Ad Preroll playing .. || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Ad Preroll ends || event '''adStop''', type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 4. '''Content''' start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 5. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 6. Content interupted by midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || last playhead &lt;br /&gt;
|-&lt;br /&gt;
| 7. '''Ad Midroll''' start || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 8. Ad Midroll playing .. || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 9. Ad Midroll ends  || event '''adStop''', type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 10. '''Content''' continues after midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 11. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 12. Content ends  || event '''complete''', type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || call complete for content &lt;br /&gt;
|-&lt;br /&gt;
| 13. '''Ad Postroll''' start || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 14. Ad Postroll playing .. || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 15. Ad Postroll ends || event '''adStop''', type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 3: Advertisement Pool ===&lt;br /&gt;
where there are more ads in each ad pool.&amp;lt;br&amp;gt;&lt;br /&gt;
Playlist : ad preroll1 - preroll 2 - content - ad midroll 1 - ad midroll 2 - content continues - ad postroll 1 - ad postroll 2.&amp;lt;br&amp;gt;&lt;br /&gt;
Use adldx parametr to assign position of ad in ad pool (starting from 0)&lt;br /&gt;
Ad in pool MetaData Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject adMetadata = new JSONObject()&lt;br /&gt;
   .put(&amp;quot;assetid&amp;quot;, &amp;quot;assetid_example_postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;type&amp;quot;, &amp;quot;postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;length&amp;quot;, &amp;quot;30&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;title&amp;quot;, &amp;quot;Nielsen postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c4&amp;quot;, &amp;quot;p4,ASMEAcode&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c5&amp;quot;, &amp;quot;p5,AtributForAd&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c6&amp;quot;, &amp;quot;p6,postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;adldx&amp;quot; : “0” );  // position in ad pool - 0,1,2..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Reset the playhead position to 0 for each ad.&amp;lt;br&amp;gt;&lt;br /&gt;
Call the adStop event at the end of each ad or increment the adldx&amp;lt;br&amp;gt;&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Then once the next ad is started the adIdx parameter should be changed and provided - like below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Handling Foreground and Background states ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For iOS, background/foreground detection is handled by the app lifecylce APIs which are provided by [https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html Apple].&lt;br /&gt;
&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation.&lt;br /&gt;
&lt;br /&gt;
Call API call pause when app is entering Background.&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Privacy and Opt-Out ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. &lt;br /&gt;
Users must have access to &amp;quot;About Nielsen Measurement&amp;quot; web page - see below, or have similar text available within the native app. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Include link or text to&lt;br /&gt;
* app settings screen&lt;br /&gt;
* or to your Privacy Policy / EULA section&lt;br /&gt;
* or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/browser/cz/cs/optout.html for more information&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDK will be sending the data pings to census even though SDK is opted out (In earlier releases all the traffic from SDK to census will be ceased). However, all the outgoing pings will have the parameter uoo=true using which backend can ignore this data.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the iOS's ''Limit Ad Tracking'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Limit Ad Tracking&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for Android) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== 1. Get Url of privacy page ===&lt;br /&gt;
URL for the Nielsen Privacy web page should be retrieved using API call optOutURL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
optOutUrlfromSKD = self.nielsenEventTracker!.optOutURL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the App SDK returns NULL in the optOutURL, handle the exception gracefully and retry later.&lt;br /&gt;
Example of returned Url is http://priv-policy.imrworldwide.com/priv/mobile/cz/cs/optout.html followed by unique hash.&lt;br /&gt;
&lt;br /&gt;
=== 2. Open URL in webView ===&lt;br /&gt;
Recieved URL should be opened in 'WebView' / External browser. App should provide a UI control like 'close' or 'back' button to close the 'WebView' / External browser.&lt;br /&gt;
&lt;br /&gt;
=== 3. Get current Opt-Out status (voluntarily) ===&lt;br /&gt;
To retrieve the current Opt-Out status of a device, use the [[optOutStatus]] method.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
let optOutStatusDetected = nielsenEventTracker!.optOutStatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
if returns false = no OptOut, if true = OptOut is active.&lt;br /&gt;
&lt;br /&gt;
== Step 9 : Test your player by your self ==&lt;br /&gt;
&lt;br /&gt;
=== Guide ===&lt;br /&gt;
# Connect your PC and test device (tablet or phone) via same router.&lt;br /&gt;
# PC side: run Proxy sw (like Charles) and get local IP&lt;br /&gt;
# Test device: modify Wifi setting to pass throug Proxy IP from add 2&lt;br /&gt;
# Test device: run your player, launch video&lt;br /&gt;
# PC side: filter trafic by &amp;quot;imr&amp;quot; and confirm presence of GN pings&lt;br /&gt;
for Android see https://youtu.be/zOKOinb-zdc, for iOS see https://youtu.be/Gk0YQttiXRI&lt;br /&gt;
&lt;br /&gt;
=== Example of GN ping ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
https://secure-cert.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=cz-509218&amp;amp;ch=cz-509218_c04_P&amp;amp;asn=defChnAsset&amp;amp;sessionId=OasHSz6TtBLlBK7m8L63h3cEihKCL1553591192&amp;amp;tl=Ad%2520preroll%2520Renault&amp;amp;prv=1&amp;amp;c6=vc,c04&amp;amp;ca=cz-509218_c04_id_ad1&amp;amp;cg=myProgram&amp;amp;c13=asid,P9E9DAEAE-BDEE-461B-8263-54CD2DCBDA22&amp;amp;c32=segA,NA&amp;amp;c33=segB,Programov%25C3%25BD%2520typ&amp;amp;c34=segC,NA&amp;amp;c15=apn,CZ%20demo%20TrackEvent&amp;amp;plugv=&amp;amp;playerv=&amp;amp;sup=1&amp;amp;segment2=-1&amp;amp;segment1=cze&amp;amp;forward=0&amp;amp;ad=1&amp;amp;cr=4_00_99_D1_00000&amp;amp;c9=devid,&amp;amp;enc=true&amp;amp;c1=nuid,&amp;amp;at=timer&amp;amp;rt=video&amp;amp;c16=sdkv,ai.6.0.0&amp;amp;c27=cln,15&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid,P9E9DAEAE-BDEE-461B-8263-54CD2DCBDA22&amp;amp;c30=bldv,ai.6.2.0.0_gada&amp;amp;st=dcr&amp;amp;c7=osgrp,IOS&amp;amp;c8=devgrp,TAB&amp;amp;c10=plt,MBL&amp;amp;c40=adbid,&amp;amp;c14=osver,iOS12_1_4&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,9827411&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,15&amp;amp;c52=noad,1&amp;amp;sd=34&amp;amp;devtypid=iPad5,3&amp;amp;pc=NA&amp;amp;c53=fef,n&amp;amp;c54=oad,&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=id_ad1&amp;amp;c3=st,a&amp;amp;c64=starttm,1553591199&amp;amp;adid=id_ad1&amp;amp;c58=isLive,false&amp;amp;c59=sesid,mmk4Mnl3tXLhVD7Conqn7sBNMtn4o1553591199&amp;amp;c61=createtm,1553591214&amp;amp;c63=pipMode,&amp;amp;c60=cvarall,p0%252Cdcrcz~~~~~~st%252Ca~~p4%252CASMEA%2520code%2520for%2520ad~~p5%252CAtribut%2520for%2520ad~~p6%252Cpreroll&amp;amp;c62=sendTime,1553591214&amp;amp;c68=bndlid,cz.admosphere.iOSdemo.TrackEvent.Josef&amp;amp;c69=cvw,&amp;amp;nodeTM=&amp;amp;logTM=&amp;amp;c73=phtype,Tablet&amp;amp;c74=dvcnm,Apple+iPad&amp;amp;c76=adbsnid,&amp;amp;df=-1&amp;amp;uoo=true&amp;amp;c44=progen,&amp;amp;davty=1&amp;amp;si=&amp;amp;c66=mediaurl,&amp;amp;vtoff=0&amp;amp;rnd=1553591214683&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 10: Provide your app for certification ==&lt;br /&gt;
Once ready please send your application to Nielsen local staff for verification - see [http://dayrhesdkp001z.enterprisenet.org/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Step 11: Going Live ==&lt;br /&gt;
After the integration has been certified (but not prior that), disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call - see Step 4.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_Browser_Simplified_SDK&amp;diff=3598</id>
		<title>Czech Digital Measurement Browser Simplified SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_Browser_Simplified_SDK&amp;diff=3598"/>
		<updated>2019-03-28T18:53:17Z</updated>

		<summary type="html">&lt;p&gt;Admin3: Created page with &amp;quot;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}} Category:Digital == Overview == The Nielsen SDK is one of multiple framework SDK...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please see [https://engineeringportal.nielsen.com/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Implementation==&lt;br /&gt;
This guide covers implementation steps in JavaScript.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Step 1 : Configure SDK ==&lt;br /&gt;
Add the following script tag (to Static Queue Snippet) the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
==Step 2 : Create SDK Instance==&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3 : Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TrackEvent JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passed parametres ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For live stream : Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For VOD : Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For static : pass only 1st position:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event identifiers ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play. Send content metadata for every playheadposition update.&amp;lt;br&amp;gt;When content is playing, pass only metadata for content - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins. &lt;br /&gt;
When ad is playing, pass metadata for ad and its content as well - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
As static measurement is indepentent from video measurement, keep content and ad metadata empty and pass only static metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
  &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together - example for video (ad) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// content&lt;br /&gt;
var content_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;content&amp;quot;,&lt;br /&gt;
	&amp;quot;program&amp;quot; : &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Bunny in woods&amp;quot;,&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;579&amp;quot;,&lt;br /&gt;
	&amp;quot;mediaUrl&amp;quot; : &amp;quot;&amp;quot;, // empty&lt;br /&gt;
	&amp;quot;airdate&amp;quot; : &amp;quot;20190313 20:00:00&amp;quot;,&lt;br /&gt;
	&amp;quot;isfullepisode&amp;quot; : &amp;quot;y&amp;quot;,&lt;br /&gt;
	&amp;quot;crossId1&amp;quot; : &amp;quot;IDEC&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c1&amp;quot; : &amp;quot;p1,&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c2&amp;quot; : &amp;quot;p2,TV ident&amp;quot;,&lt;br /&gt;
	&amp;quot;segB&amp;quot; : &amp;quot;Program type&amp;quot;,&lt;br /&gt;
	&amp;quot;segC&amp;quot; : &amp;quot;&amp;quot;, // empty&lt;br /&gt;
	&amp;quot;adloadtype&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
	&amp;quot;hasAds&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ad&lt;br /&gt;
var ad_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example_preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;preroll&amp;quot;,  // or midroll, postroll&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;30&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Nielsen preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c4&amp;quot; : &amp;quot;p4,ASMEAcode&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c5&amp;quot; : &amp;quot;p5,AtributForAd&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c6&amp;quot; : &amp;quot;p6,preroll&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var trackObject = {&lt;br /&gt;
	&amp;quot;event&amp;quot;: 'playhead',&lt;br /&gt;
	&amp;quot;type&amp;quot;: 'ad',&lt;br /&gt;
	&amp;quot;playheadPosition&amp;quot;: '1',&lt;br /&gt;
	&amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                &amp;quot;content&amp;quot;: content_metadataObject,&lt;br /&gt;
                &amp;quot;ad&amp;quot;: ad_metadataObject,&lt;br /&gt;
                &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
          				}&lt;br /&gt;
	   		  };&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
nSdkInstance.trackEvent(trackObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together - example for static ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// static&lt;br /&gt;
var static_metadataObject = {&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;static&amp;quot;,  &lt;br /&gt;
	&amp;quot;section&amp;quot; : &amp;quot;static_section1&amp;quot;,  &lt;br /&gt;
	&amp;quot;segA&amp;quot; : &amp;quot;segA example&amp;quot;,  &lt;br /&gt;
	&amp;quot;segB&amp;quot; : &amp;quot;segB example&amp;quot;,  &lt;br /&gt;
	&amp;quot;segC&amp;quot; : &amp;quot;segC example&amp;quot;,  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var trackObject = {&lt;br /&gt;
	&amp;quot;event&amp;quot;: 'playhead',&lt;br /&gt;
	&amp;quot;type&amp;quot;: 'static',&lt;br /&gt;
	&amp;quot;playheadPosition&amp;quot;: '1',&lt;br /&gt;
	&amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;static&amp;quot;: static_metadataObject&lt;br /&gt;
          				}&lt;br /&gt;
	   		  };&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
nSdkInstance.trackEvent(trackObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4 : API Call sequence ==&lt;br /&gt;
=== Use Case 1: Video - Content has no Advertisements ===&lt;br /&gt;
Playlist : single content, no ads.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. Video start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Video playing .. || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Video ends ||  event complete, type : content, metadata : content_metaDataObject, playheadPosition : lastPlayheadValue || call complete&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 2: Video - Content has Advertisements ===&lt;br /&gt;
Playlist : ad preroll - content - ad midroll - content continues - ad postroll.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. '''Ad Preroll''' start || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Ad Preroll playing .. || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Ad Preroll ends || event '''adStop''', type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 4. '''Content''' start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 5. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 6. Content interupted by midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || last playhead &lt;br /&gt;
|-&lt;br /&gt;
| 7. '''Ad Midroll''' start || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 8. Ad Midroll playing .. || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 9. Ad Midroll ends  || event '''adStop''', type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 10. '''Content''' continues after midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 11. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 12. Content ends  || event '''complete''', type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || call complete for content &lt;br /&gt;
|-&lt;br /&gt;
| 13. '''Ad Postroll''' start || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 14. Ad Postroll playing .. || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 15. Ad Postroll ends || event '''adStop''', type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 3: Video - more ads in each ad pool ===&lt;br /&gt;
Playlist : ad preroll1 - preroll 2 - content - ad midroll 1 - ad midroll 2 - content continues - ad postroll 1 - ad postroll 2.&amp;lt;br&amp;gt;&lt;br /&gt;
Use adldx parametr to assign position of ad in ad pool (starting from 0)&lt;br /&gt;
&lt;br /&gt;
Ad in pool MetaData Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var ad_pool_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example_preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;preroll&amp;quot;,  // or midroll, postroll&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;30&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Nielsen preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c4&amp;quot; : &amp;quot;p4,ASMEAcode&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c5&amp;quot; : &amp;quot;p5,AtributForAd&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c6&amp;quot; : &amp;quot;p6,preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;adldx&amp;quot; : &amp;quot;0&amp;quot; // position in ad pool - 0,1,2..&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Reset the playhead position to 0 for each ad.&amp;lt;br&amp;gt;&lt;br /&gt;
Call the adStop event at the end of each ad or increment the adldx&amp;lt;br&amp;gt;&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
=== Use Case 4: Static ===&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. User enters page (or HbbTV section) || event playhead, type : static, metadata : static_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. User stays within section ..  ||  n/a ||  no call needed, SDK counts seconds 2,3,4,..&lt;br /&gt;
|-&lt;br /&gt;
| 3. User leaves section ||  n/a || no call needed, SDK automatically ends measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5 : Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
=== User Opt-Out ===&lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the opt-out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie. Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for an opt-out statement (in Czech).&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Tato aplikace obsahuje proprietární měřicí software společnosti Nielsen, který uživatelům umožní přispívat k průzkumu trhu. Chcete-li se dozvědět více o informacích, které může software Nielsen shromažďovat a o Vaší možnosti měření deaktivovat, přečtěte si zásady ochrany osobních údajů Nielsen Digital Measurement na [http://priv-policy.imrworldwide.com/priv/browser/cz/cs/optout.html Nielsen Digital Measurement Privacy Policy].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialization Opt-Out ===&lt;br /&gt;
To configure Opt-Out during SDK initialization.  Add parametr outout into SDK init syntax - see step2. &amp;lt;br&amp;gt;&lt;br /&gt;
Use value &amp;quot;true&amp;quot; or &amp;quot;Yes&amp;quot; or &amp;quot;1&amp;quot; to OptOut, or value &amp;quot;false&amp;quot;, &amp;quot;No&amp;quot; or &amp;quot;0&amp;quot; to not OptOut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Opt-out status ===&lt;br /&gt;
Optional : to retrieve Opt-Out status call getOptOutStatus() , result is boolean value true (OptOuted = not measuring) or false (not OptOuted = measuring).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.getOptOutStatus();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 6 : Test your player by yourself ==&lt;br /&gt;
see how to test player at https://www.youtube.com/watch?v=t9eUsf9yh8w&amp;amp;feature=youtu.be&lt;br /&gt;
&lt;br /&gt;
=== Test SKD API calls === &lt;br /&gt;
to verify SDK API calls use Chrome and install add-on called &amp;quot;Nielsen SDK Inspector&amp;quot; (https://chrome.google.com/webstore/search/%20Nielsen%20SDK%20Inspector)&lt;br /&gt;
&lt;br /&gt;
=== Test outgoing pings === &lt;br /&gt;
to verify outgoing pings use Charles Proxy or any other proxy sw capable to sniff your network traffic. Filter URLs to &amp;quot;imrworld&amp;quot;. Example of such ping :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
http://secure-eu-cert.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=de-205177&lt;br /&gt;
&amp;amp;ch=de-205177_c01_static-123_P&amp;amp;asn=static-123&amp;amp;prv=1&amp;amp;c6=vc,c01&amp;amp;ca=NA&lt;br /&gt;
&amp;amp;c13=asid,T74896328-A13B-4985-8798-0AEBFA228D3E&amp;amp;c32=segA,segA%20example&amp;amp;c33=segB,segB%20example&lt;br /&gt;
&amp;amp;c34=segC,segC%20example&amp;amp;c15=apn,&amp;amp;sup=1&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=0&amp;amp;ad=0&amp;amp;cr=V&amp;amp;c9=devid,&lt;br /&gt;
&amp;amp;enc=true&amp;amp;c1=nuid,88b7cd07-f83d-45b1-8db1-20b4e2caae55&lt;br /&gt;
&amp;amp;at=view&amp;amp;rt=text&amp;amp;c16=sdkv,bj.6.0.0&amp;amp;c27=cln,0&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid,14966485169569829&lt;br /&gt;
&amp;amp;c30=bldv,6.0.0.1&amp;amp;st=dcr&amp;amp;c7=osgrp,&amp;amp;c8=devgrp,&amp;amp;c10=plt,&amp;amp;c40=adbid,&amp;amp;c14=osver,NA&lt;br /&gt;
&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,0&lt;br /&gt;
&amp;amp;c52=noad,0&amp;amp;devtypid=&amp;amp;pc=NA&amp;amp;c53=fef,n&amp;amp;c54=oad,&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=static-123&amp;amp;c3=st,c&amp;amp;c64=starttm,1496648518&lt;br /&gt;
&amp;amp;adid=static-123&amp;amp;c58=isLive,false&amp;amp;c59=sesid,&amp;amp;c61=createtm,1496648517&lt;br /&gt;
&amp;amp;c63=pipMode,&amp;amp;c68=bndlid,&amp;amp;c73=phtype,&amp;amp;c74=dvcnm,&amp;amp;c76=adbsnid,&amp;amp;df=0&amp;amp;sessionId=14966485169569829&lt;br /&gt;
&amp;amp;c44=progen,&amp;amp;davty=0&amp;amp;si=http%3A%2F%2Fsdkdemo.admosphere.cz%2FBrowserSdk6static%2Fdemo1cz%2F&lt;br /&gt;
&amp;amp;c66=mediaurl,&amp;amp;c62=sendTime,1496648517&amp;amp;rnd=496564&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Provide your app for certification ==&lt;br /&gt;
Once ready please send your application to Nielsen local staff for verification - see [http://dayrhesdkp001z.enterprisenet.org/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call - see step 2.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_Android_Simplified_SDK&amp;diff=3596</id>
		<title>Czech Digital Measurement Android Simplified SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_Android_Simplified_SDK&amp;diff=3596"/>
		<updated>2019-03-28T18:51:26Z</updated>

		<summary type="html">&lt;p&gt;Admin3: Created page with &amp;quot;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}} Category:Digital  == Overview == The Nielsen SDK is one of multiple framework SD...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following details are required:&lt;br /&gt;
* '''App ID (appid):''' Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please see [https://engineeringportal.nielsen.com/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
&lt;br /&gt;
[[File:Co-Existance.jpg|center|700px]]&lt;br /&gt;
&lt;br /&gt;
For Android, a new wrapper class for AppSdk will be introduced (AppSdkTrackEvent). This class will be responsible for handling and translating new API calls into calls of the existing Nielsen App SDK API methods. A new public API will be introduced in this class, that accepts a JSONObject parameter.&lt;br /&gt;
&lt;br /&gt;
==  Implementation ==&lt;br /&gt;
This guide covers implementation steps for Android using Android Studio.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Step 1 : Get SDK ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For AppSDK versions, release dates and release notes - refer to [https://engineeringportal.nielsen.com/docs/Android_SDK_Release_Notes Android AppSDK release notes]. &amp;lt;br&amp;gt;Always keep latest and greatest AppSDK version inside your app.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The Nielsen AppSDK can either be&lt;br /&gt;
* integrated within an application through the use of Gradle - read [https://engineeringportal.nielsen.com/docs/Digital_Measurement_Android_Artifactory_Guide Gradle implementation guide] - '''Recommended solution''' that will keep your SDK copy latest&lt;br /&gt;
* or downloaded directly as jar file - download ZIP package at [https://engineeringportal.nielsen.com/docs/Special:Downloads Nielsen Downloads]. Package contains SDK appsdk.jar as well as sample applications. You will have to update SDK manually always when new version of AppSDK is released.&lt;br /&gt;
&lt;br /&gt;
== Step 2 : Setting up your  Development Environment  ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Configuring Android Development Environment&lt;br /&gt;
&lt;br /&gt;
1) (if using downloaded package) - Ensure to unzip the Nielsen App SDK sample app and copy the AppSdk.jar into the app/libs folder on the App’s project. Add it as dependency.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  dependencies {&lt;br /&gt;
    ...&lt;br /&gt;
    // Nielsen AppSDK &lt;br /&gt;
    implementation files('libs/appsdk.jar')&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2) Add the following permissions on the project’s AndroidManifest.xml file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_COARSE_LOCATION&amp;quot; android:required=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3) Add Google Play Services lib into dependencies as Nielsen AppSDK uses the following packages/classes from the Google Play service.&lt;br /&gt;
Steps: Android Studio -&amp;gt; File -&amp;gt; Project Structure -&amp;gt;(In module selection) select App -&amp;gt; Dependencies (tab) -&amp;gt; Click “+” button and select &amp;lt;code&amp;gt;“com.google.android.gms:play-services”&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensure it is added in build.gradle (App level) file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;  dependencies {&lt;br /&gt;
    ...&lt;br /&gt;
    implementation 'com.google.gms:google-services:+'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Requiered Google Play Service Classes and Packages :&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient;&lt;br /&gt;
* com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;&lt;br /&gt;
* com.google.android.gms.common.ConnectionResult;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesUtil;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesRepairableException;&lt;br /&gt;
* com.google.android.gms.common.GooglePlayServicesNotAvailableException;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4) Once the files are in place, import com.nielsen.app.sdk to the java source code and start accessing the public interface.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; import com.nielsen.app.sdk.*;&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes : &lt;br /&gt;
* The Nielsen App SDK (located in the com.nielsen.app.sdk package) class is the primary application interface to the Nielsen App SDK on Android.&lt;br /&gt;
* The Nielsen App SDK class is defined as the only public class belonging to the com.nielsen.app.sdk package.&lt;br /&gt;
* Nielsen App SDK is compatible with Android OS versions 2.3+.&lt;br /&gt;
* Clients can control / configure the protocol to be used – HTTPS or HTTP to suit their needs.&lt;br /&gt;
* For video players :  The Android OS hosting the App SDK should use a media player supporting HLS streaming (Android 3.0 and later will support it natively). If the player application uses a 3rd party media player implementing its own HLS, then the minimum Android version will be limited to version 2.3, since the SDK depends on Google Play support to work properly.&lt;br /&gt;
* App SDK checks to see if there is a Google service available and updated. If not available or updated, App SDK will not use this service when executing its functions and will make reference to missing imports and the app will not be compiled.&lt;br /&gt;
&lt;br /&gt;
== Step 3 : SDK Initialization ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The latest version of the Nielsen App SDK allows instantiating multiple instances of the SDK object, which can be used simultaneously without any issue. A maximum of four SDK instances per appid are supported. When a fifth SDK instance is launched, the SDK will return “nil” from [[initWithAppInfo:delegate:]]&lt;br /&gt;
&lt;br /&gt;
The following table contains the list of arguments that should be passed during initialization via the AppInfo JSON schema.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter / Argument !! Description !! Source !! Required? !! Example&lt;br /&gt;
|-&lt;br /&gt;
| appid || Unique id for the application assigned by Nielsen.&lt;br /&gt;
It is GUID data type.&lt;br /&gt;
|| Nielsen-specified || Yes || PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
| appname || Name of the application || Client-defined || No|| &amp;quot;Nielsen Sample App&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| appversion || Current version of the app used || Client-defined || No || &amp;quot;1.0.2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| sfcode || Nielsen collection facility to which the SDK should connect.&lt;br /&gt;
|| Nielsen-specified || Yes || &amp;quot;cz&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nol_devDebug || Enables Nielsen console logging. Only required for testing ||Nielsen-specified || Optional || &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==== Sample SDK Initialization Code ====&lt;br /&gt;
&lt;br /&gt;
Initialization of App SDK object through a JSON object&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;import android.content.Context;&lt;br /&gt;
import com.nielsen.app.sdk.IAppNotifier;&lt;br /&gt;
import com.nielsen.app.sdk.NielsenEventTracker;&lt;br /&gt;
import org.json.JSONException;&lt;br /&gt;
import org.json.JSONObject;&lt;br /&gt;
&lt;br /&gt;
public class NielsenInit {&lt;br /&gt;
    private NielsenEventTracker mEventTracker = null;&lt;br /&gt;
    public NielsenEventTracker initEventTracker(Context mContext, IAppNotifier appNotifier){&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //Initialising the NielsenEventTracker class by passing app information which returns the instance of NielsenEventTracker.&lt;br /&gt;
&lt;br /&gt;
            JSONObject appInformation = new JSONObject()&lt;br /&gt;
                    .put(&amp;quot;appid&amp;quot;, &amp;quot;PDA7D5EE6-B1B8-4123-9277-2A788XXXXXXX&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appversion&amp;quot;, &amp;quot;1.0&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;appname&amp;quot;, &amp;quot;Android Test app&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;sfcode&amp;quot;, &amp;quot;cz&amp;quot;)&lt;br /&gt;
                    .put(&amp;quot;nol_devDebug&amp;quot;, &amp;quot;DEBUG&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            mEventTracker = new NielsenEventTracker(mContext, appInformation, appNotifier);&lt;br /&gt;
        } catch (JSONException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return mEventTracker;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== APP SDK Error &amp;amp; Event Codes ===&lt;br /&gt;
To view the Error and Event codes for iOS and Android, please review the [[APP SDK Event Codes|App SDK Event Code]] Reference page.&lt;br /&gt;
&lt;br /&gt;
== Step 4 : Simplified API Syntax ==&lt;br /&gt;
In the new simplified API, all calls are replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mEventTracker.trackEvent(data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TrackEvent JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passed parametres ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Detailed in tables below&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Playhead value&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For LiveStream : Position value is Unix timestamp (seconds since Jan-1-1970 UTC)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1501225191747&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;For VOD : Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event identifiers ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UNIX timestamp (seconds since Jan-1-1970 UTC) or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used to in the following cases:&lt;br /&gt;
application enters background,&lt;br /&gt;
any application interruptions,&lt;br /&gt;
content playback is paused.  (Pause is detected by SDK automatically only if time gap between commands in more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play. For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. Send content metadata for every playheadposition update.&amp;lt;br&amp;gt;When content is playing, pass only metadata for content - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject metadata= new JSONObject()&lt;br /&gt;
  .put(&amp;quot;content&amp;quot;, content_metadataObject)&lt;br /&gt;
  .put(&amp;quot;ad&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
  .put(&amp;quot;static&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins. For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic].&amp;lt;br&amp;gt;&lt;br /&gt;
When ad is playing, pass metadata for ad and its content as well - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject metadata= new JSONObject()&lt;br /&gt;
  .put(&amp;quot;content&amp;quot;, content_metadataObject)&lt;br /&gt;
  .put(&amp;quot;ad&amp;quot;, ad_metadataObject)&lt;br /&gt;
  .put(&amp;quot;static&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
Note : static is currently used in Czech Republic only for Browser implementations, not apps. Please leave metadata empty - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject metadata= new JSONObject()&lt;br /&gt;
   .....&lt;br /&gt;
  .put(&amp;quot;static&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together (example for ad) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;// content metadata - we should pass content dictionary also in Ad video.&lt;br /&gt;
JSONObject content_metadataObject = new JSONObject()&lt;br /&gt;
   .put(&amp;quot;assetid&amp;quot;, &amp;quot;assetid_example&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;type&amp;quot;, &amp;quot;content&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;program&amp;quot;, &amp;quot;ProgramName&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;title&amp;quot;, &amp;quot;Bunny in Woods&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;length&amp;quot;, &amp;quot;579&amp;quot;) &lt;br /&gt;
   .put(&amp;quot;mediaUrl&amp;quot;, &amp;quot;&amp;quot;) // empty&lt;br /&gt;
   .put(&amp;quot;airdate&amp;quot;, &amp;quot;20171013 20:00:00&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;isfullepisode&amp;quot;, &amp;quot;y&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;crossId1&amp;quot;, &amp;quot;IDEC&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c1&amp;quot;, &amp;quot;p1,&amp;quot;) // empty for VOD&lt;br /&gt;
   .put(&amp;quot;nol_c2&amp;quot;, &amp;quot;p2,TV ident&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;segB&amp;quot;, &amp;quot;Program type&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;segC&amp;quot;, &amp;quot;&amp;quot;) // empty&lt;br /&gt;
   .put(&amp;quot;adloadtype&amp;quot;, &amp;quot;1&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;hasAds&amp;quot;,  &amp;quot;1&amp;quot;);&lt;br /&gt;
          &lt;br /&gt;
// ad metadata&lt;br /&gt;
JSONObject ad_metadataObject = new JSONObject()&lt;br /&gt;
   .put(&amp;quot;assetid&amp;quot;, &amp;quot;assetid_example_postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;type&amp;quot;, &amp;quot;postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;length&amp;quot;, &amp;quot;30&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;title&amp;quot;, &amp;quot;Nielsen postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c4&amp;quot;, &amp;quot;p4,ASMEAcode&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c5&amp;quot;, &amp;quot;p5,AtributForAd&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c6&amp;quot;, &amp;quot;p6,postroll&amp;quot;);       &lt;br /&gt;
&lt;br /&gt;
// all metadatas in one object&lt;br /&gt;
JSONObject metaData = new JSONObject()&lt;br /&gt;
   .put(&amp;quot;content&amp;quot;, content_metadataObject)&lt;br /&gt;
   .put(&amp;quot;ad&amp;quot;, ad_metadataObject)&lt;br /&gt;
   .put(&amp;quot;static&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// dataObject for TrackEvent&lt;br /&gt;
JSONObject trackEventData = new JSONObject()&lt;br /&gt;
   .put(&amp;quot;metadata&amp;quot;, metaData)&lt;br /&gt;
   .put(&amp;quot;event&amp;quot;, &amp;quot;playhead&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;type&amp;quot;, &amp;quot;ad&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;playheadPosition&amp;quot;, &amp;quot;0&amp;quot;); // change every second 0,1,2,3...&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
mEventTracker.trackEvent(trackEventData);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 5 : API Call sequence ==&lt;br /&gt;
=== Use Case 1: Content has no Advertisements ===&lt;br /&gt;
Playlist : single content, no ads.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. Video start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Video playing .. || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Video ends ||  event complete, type : content, metadata : content_metaDataObject, playheadPosition : lastPlayheadValue || call complete&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 2: Content has Advertisements ===&lt;br /&gt;
Playlist : ad preroll - content - ad midroll - content continues - ad postroll.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. '''Ad Preroll''' start || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Ad Preroll playing .. || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Ad Preroll ends || event '''adStop''', type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 4. '''Content''' start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 5. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 6. Content interupted by midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || last playhead &lt;br /&gt;
|-&lt;br /&gt;
| 7. '''Ad Midroll''' start || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 8. Ad Midroll playing .. || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 9. Ad Midroll ends  || event '''adStop''', type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 10. '''Content''' continues after midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 11. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 12. Content ends  || event '''complete''', type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || call complete for content &lt;br /&gt;
|-&lt;br /&gt;
| 13. '''Ad Postroll''' start || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 14. Ad Postroll playing .. || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 15. Ad Postroll ends || event '''adStop''', type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 3: Advertisement Pool ===&lt;br /&gt;
where there are more ads in each ad pool.&amp;lt;br&amp;gt;&lt;br /&gt;
Playlist : ad preroll1 - preroll 2 - content - ad midroll 1 - ad midroll 2 - content continues - ad postroll 1 - ad postroll 2.&amp;lt;br&amp;gt;&lt;br /&gt;
Use adldx parametr to assign position of ad in ad pool (starting from 0)&lt;br /&gt;
Ad in pool MetaData Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
JSONObject adMetadata = new JSONObject()&lt;br /&gt;
   .put(&amp;quot;assetid&amp;quot;, &amp;quot;assetid_example_postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;type&amp;quot;, &amp;quot;postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;length&amp;quot;, &amp;quot;30&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;title&amp;quot;, &amp;quot;Nielsen postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c4&amp;quot;, &amp;quot;p4,ASMEAcode&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c5&amp;quot;, &amp;quot;p5,AtributForAd&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;nol_c6&amp;quot;, &amp;quot;p6,postroll&amp;quot;)&lt;br /&gt;
   .put(&amp;quot;adldx&amp;quot; : “0” );  // position in ad pool - 0,1,2..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Reset the playhead position to 0 for each ad.&amp;lt;br&amp;gt;&lt;br /&gt;
Call the adStop event at the end of each ad or increment the adldx&amp;lt;br&amp;gt;&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
== Step 6 : Handling Foreground and Background states ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Foreground/Background state measurement is a requirement of Nielsen AppSDK implementation. &lt;br /&gt;
&lt;br /&gt;
Call API call pause when app is entering Background.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Handling Foreground and Background states may be implemented in multiple ways for Android :&lt;br /&gt;
&lt;br /&gt;
=== 1) ForeGround/Background Measurement via AndroidManifest ===&lt;br /&gt;
Enable the Nielsen SDK to measure background/foreground state by making the relevant update to the AndroidManifest. The simplest way to measure the app background/foreground state is to add the following application tag to the Manifest XML. Integrating this into the Manifest XML will enable the SDK to measure app state directly. This approach is supported for Android 4.0 and up only; it requires that the application class is not in use for some other purpose.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;application android:name=&amp;quot;com.nielsen.app.sdk.AppSdkApplication&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2) Using the Android SdkBgFbDetectionUtility Class ===&lt;br /&gt;
Integrate Nielsen’s SdkBgFgDetectionUtility class within your Custom Application Class. For developers who are already using the application class, it is recommended that background/foreground state is implemented using the  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class].  The  [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] is compatible with Android 4+ and has been made available to Nielsen clients.&lt;br /&gt;
&lt;br /&gt;
=== 3) Manual Background/ForeGround State Management ===&lt;br /&gt;
In cases where the developer is not able to use the AndroidManifest.xml solution nor the Nielsen provided   [https://engineeringportal.nielsen.com/docs/Android_Background_Foreground SdkBgFgDetectionUtility class] the developer will need to manually identify the change of state through the application and call the respective API (appInForeground() or appInBackground()) to inform the SDK regarding the change of state from background to foreground or foreground to background.&lt;br /&gt;
&lt;br /&gt;
The SDK is informed about app state using the below methods.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
AppLaunchMeasurementManager.appInForeground(getApplicationContext());&lt;br /&gt;
AppLaunchMeasurementManager.appInBackground(getApplicationContext());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Within the lifecycle of individual activities, onResume() and onPause() are best suited to providing indication of the app state.&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Privacy and Opt-Out ==&lt;br /&gt;
A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. &lt;br /&gt;
Users must have access to &amp;quot;About Nielsen Measurement&amp;quot; web page - see below, or have similar text available within the native app. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Include link or text to&lt;br /&gt;
* app settings screen&lt;br /&gt;
* or to your Privacy Policy / EULA section&lt;br /&gt;
* or as a button near the link to the app's Privacy Policy.&lt;br /&gt;
&lt;br /&gt;
In addition, the following text must be included in your app store description.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Please note: This app features Nielsen’s proprietary measurement software which contributes to market research, like Nielsen’s TV Ratings. Please see http://priv-policy.imrworldwide.com/priv/browser/cz/cs/optout.html for more information&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDK will be sending the data pings to census even though SDK is opted out (In earlier releases all the traffic from SDK to census will be ceased). However, all the outgoing pings will have the parameter uoo=true using which backend can ignore this data.&lt;br /&gt;
&lt;br /&gt;
The Nielsen SDK automatically leverages the Android's ''Opt out of Ads Personalization'' setting. The user is opted out of demographic measurement if the OS-level ''&amp;quot;Opt out of Ads Personalization&amp;quot;'' (&amp;quot;Limit Ad Tracking&amp;quot; for iOS) setting is ''enabled''. As a publisher, you cannot override this setting.&lt;br /&gt;
&lt;br /&gt;
=== 1. Get Url of privacy page ===&lt;br /&gt;
URL for the Nielsen Privacy web page should be retrieved using API call userOptOutURLString()&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mEventTracker.userOptOutURLString();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the App SDK returns NULL in the optOutURL, handle the exception gracefully and retry later.&lt;br /&gt;
Example of returned Url is http://priv-policy.imrworldwide.com/priv/mobile/cz/cs/optout.html followed by unique hash.&lt;br /&gt;
&lt;br /&gt;
=== 2. Open URL in webView ===&lt;br /&gt;
Recieved URL should be opened in 'WebView' / External browser. App should provide a UI control like 'close' or 'back' button to close the 'WebView' / External browser.&lt;br /&gt;
&lt;br /&gt;
=== 3. Get current Opt-Out status (voluntarily) ===&lt;br /&gt;
To retrieve the current Opt-Out status of a device, use the [[getOptOutStatus()]] method.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mEventTracker.getOptOutStatus();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
if returns false = no OptOut, if true = OptOut is active.&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Test your player by your self ==&lt;br /&gt;
=== Guide ===&lt;br /&gt;
# Connect your PC and test device (tablet or phone) via same router.&lt;br /&gt;
# PC side: run Proxy sw (like Charles) and get local IP&lt;br /&gt;
# Test device: modify Wifi setting to pass throug Proxy IP from add 2&lt;br /&gt;
# Test device: run your player, launch video&lt;br /&gt;
# PC side: filter trafic by &amp;quot;imr&amp;quot; and confirm presence of GN pings&lt;br /&gt;
for Android see https://youtu.be/zOKOinb-zdc, for iOS see https://youtu.be/Gk0YQttiXRI&lt;br /&gt;
&lt;br /&gt;
=== Example of GN ping ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
http://secure-eu-cert.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=de-205177&lt;br /&gt;
&amp;amp;ch=de-205177_c01_P&amp;amp;asn=defChnAsset&amp;amp;tl=Bunny%2520in%2520Woods&amp;amp;prv=1&amp;amp;c6=vc,c01&lt;br /&gt;
&amp;amp;ca=de-205177_c01_assetid&amp;amp;cg=ProgramName&amp;amp;c13=asid,T885AAE54-AFE4-431D-B60B-FF4C75FCA357&lt;br /&gt;
&amp;amp;c32=segA,NA&amp;amp;c33=segB,CustomSegmentValueB&amp;amp;c34=segC,CustomSegmentValueC&lt;br /&gt;
&amp;amp;c15=apn,CZ%20demo%20player&amp;amp;sup=1&amp;amp;segment2=-1&amp;amp;segment1=cze&amp;amp;forward=0&amp;amp;ad=1&lt;br /&gt;
&amp;amp;cr=4_00_99_V1_00000&amp;amp;c9=devid,d6df553edcc70bf62812069af7252d5e905399c711378b6ee0a1f0a9381fdec6&lt;br /&gt;
&amp;amp;enc=true&amp;amp;c1=nuid,62ef4e4aeb2c3d390c224e3aaf686ec063895e9dd9a64f4d2b84059e1148e29c&amp;amp;at=view&lt;br /&gt;
&amp;amp;rt=video&amp;amp;c16=sdkv,aa.5.1.1&amp;amp;c27=cln,0&amp;amp;crs=0&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid,T885AAE54-AFE4-431D-B60B-FF4C75FCA357&lt;br /&gt;
&amp;amp;c30=bldv,aa.5.1.1.18&amp;amp;st=dcr&amp;amp;c7=osgrp,DROID&amp;amp;c8=devgrp,TAB&amp;amp;c10=plt,MBL&amp;amp;c40=adbid,&lt;br /&gt;
&amp;amp;c14=osver,Android6.0.1&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,IDEC&amp;amp;c37=cref2,&lt;br /&gt;
&amp;amp;c11=agg,1&amp;amp;c12=apv,1.0.1&amp;amp;c51=adl,0&amp;amp;c52=noad,0&amp;amp;sd=596&amp;amp;devtypid=asus-Nexus-7&amp;amp;pc=NA&amp;amp;c53=fef,y&lt;br /&gt;
&amp;amp;c54=oad,20171013%2020%3A00%3A00&amp;amp;c55=cref3,&amp;amp;c57=adldf,1&amp;amp;ai=assetid&amp;amp;c3=st%252Cc&lt;br /&gt;
&amp;amp;c64=starttm,1500474035&amp;amp;adid=assetid&amp;amp;c58=isLive,false&amp;amp;c59=sesid,1500474032&amp;amp;c61=createtm,1500474037&lt;br /&gt;
&amp;amp;c63=pipMode,&amp;amp;c60=agfall,p0%252C~~p1%252Ccontent%2520-%2520ID%2520for%2520content%2520matching%2520TVIDENT~~p2%252Ccontent%2520-%2520Reserved%2520for%2520future%2520use~~st%252Cc~~~~~~&amp;amp;c62=sendTime,1500474123&lt;br /&gt;
&amp;amp;c68=bndlid,com.example.kunalbhatia.hlsexomy&amp;amp;nodeTM=&amp;amp;logTM=&amp;amp;c73=phtype,Tablet&amp;amp;c74=dvcnm,Google+Nexus+7&lt;br /&gt;
&amp;amp;c76=adbsnid,&amp;amp;df=-1&amp;amp;c77=adsuprt,1&amp;amp;evdata=&amp;amp;c71=ottflg,0&amp;amp;c72=otttyp,&amp;amp;sessionId=&amp;amp;c44=progen,&amp;amp;davty=0&amp;amp;si=&lt;br /&gt;
&amp;amp;c66=mediaurl,&amp;amp;uoo=&amp;amp;vtoff=86&amp;amp;rnd=1500474122131&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 9: Provide your app for certification ==&lt;br /&gt;
Once ready please send your application to Nielsen local staff for verification - see [http://dayrhesdkp001z.enterprisenet.org/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Step 10: Going Live ==&lt;br /&gt;
After the integration has been certified (but not prior that), disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call - see Step 3.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3593</id>
		<title>Czech Digital Measurement iOS Simplified SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3593"/>
		<updated>2019-03-28T18:44:09Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|International}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please see [https://engineeringportal.nielsen.com/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Implementation==&lt;br /&gt;
This guide covers implementation steps in JavaScript.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Step 1 : Configure SDK ==&lt;br /&gt;
Add the following script tag (to Static Queue Snippet) the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
==Step 2 : Create SDK Instance==&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3 : Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TrackEvent JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passed parametres ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For live stream : Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For VOD : Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For static : pass only 1st position:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event identifiers ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play. Send content metadata for every playheadposition update.&amp;lt;br&amp;gt;When content is playing, pass only metadata for content - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins. &lt;br /&gt;
When ad is playing, pass metadata for ad and its content as well - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
As static measurement is indepentent from video measurement, keep content and ad metadata empty and pass only static metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
  &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together - example for video (ad) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// content&lt;br /&gt;
var content_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;content&amp;quot;,&lt;br /&gt;
	&amp;quot;program&amp;quot; : &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Bunny in woods&amp;quot;,&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;579&amp;quot;,&lt;br /&gt;
	&amp;quot;mediaUrl&amp;quot; : &amp;quot;&amp;quot;, // empty&lt;br /&gt;
	&amp;quot;airdate&amp;quot; : &amp;quot;20190313 20:00:00&amp;quot;,&lt;br /&gt;
	&amp;quot;isfullepisode&amp;quot; : &amp;quot;y&amp;quot;,&lt;br /&gt;
	&amp;quot;crossId1&amp;quot; : &amp;quot;IDEC&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c1&amp;quot; : &amp;quot;p1,&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c2&amp;quot; : &amp;quot;p2,TV ident&amp;quot;,&lt;br /&gt;
	&amp;quot;segB&amp;quot; : &amp;quot;Program type&amp;quot;,&lt;br /&gt;
	&amp;quot;segC&amp;quot; : &amp;quot;&amp;quot;, // empty&lt;br /&gt;
	&amp;quot;adloadtype&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
	&amp;quot;hasAds&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ad&lt;br /&gt;
var ad_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example_preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;preroll&amp;quot;,  // or midroll, postroll&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;30&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Nielsen preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c4&amp;quot; : &amp;quot;p4,ASMEAcode&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c5&amp;quot; : &amp;quot;p5,AtributForAd&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c6&amp;quot; : &amp;quot;p6,preroll&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var trackObject = {&lt;br /&gt;
	&amp;quot;event&amp;quot;: 'playhead',&lt;br /&gt;
	&amp;quot;type&amp;quot;: 'ad',&lt;br /&gt;
	&amp;quot;playheadPosition&amp;quot;: '1',&lt;br /&gt;
	&amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                &amp;quot;content&amp;quot;: content_metadataObject,&lt;br /&gt;
                &amp;quot;ad&amp;quot;: ad_metadataObject,&lt;br /&gt;
                &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
          				}&lt;br /&gt;
	   		  };&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
nSdkInstance.trackEvent(trackObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together - example for static ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// static&lt;br /&gt;
var static_metadataObject = {&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;static&amp;quot;,  &lt;br /&gt;
	&amp;quot;section&amp;quot; : &amp;quot;static_section1&amp;quot;,  &lt;br /&gt;
	&amp;quot;segA&amp;quot; : &amp;quot;segA example&amp;quot;,  &lt;br /&gt;
	&amp;quot;segB&amp;quot; : &amp;quot;segB example&amp;quot;,  &lt;br /&gt;
	&amp;quot;segC&amp;quot; : &amp;quot;segC example&amp;quot;,  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var trackObject = {&lt;br /&gt;
	&amp;quot;event&amp;quot;: 'playhead',&lt;br /&gt;
	&amp;quot;type&amp;quot;: 'static',&lt;br /&gt;
	&amp;quot;playheadPosition&amp;quot;: '1',&lt;br /&gt;
	&amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;static&amp;quot;: static_metadataObject&lt;br /&gt;
          				}&lt;br /&gt;
	   		  };&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
nSdkInstance.trackEvent(trackObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4 : API Call sequence ==&lt;br /&gt;
=== Use Case 1: Video - Content has no Advertisements ===&lt;br /&gt;
Playlist : single content, no ads.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. Video start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Video playing .. || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Video ends ||  event complete, type : content, metadata : content_metaDataObject, playheadPosition : lastPlayheadValue || call complete&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 2: Video - Content has Advertisements ===&lt;br /&gt;
Playlist : ad preroll - content - ad midroll - content continues - ad postroll.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. '''Ad Preroll''' start || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Ad Preroll playing .. || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Ad Preroll ends || event '''adStop''', type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 4. '''Content''' start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 5. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 6. Content interupted by midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || last playhead &lt;br /&gt;
|-&lt;br /&gt;
| 7. '''Ad Midroll''' start || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 8. Ad Midroll playing .. || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 9. Ad Midroll ends  || event '''adStop''', type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 10. '''Content''' continues after midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 11. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 12. Content ends  || event '''complete''', type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || call complete for content &lt;br /&gt;
|-&lt;br /&gt;
| 13. '''Ad Postroll''' start || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 14. Ad Postroll playing .. || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 15. Ad Postroll ends || event '''adStop''', type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 3: Video - more ads in each ad pool ===&lt;br /&gt;
Playlist : ad preroll1 - preroll 2 - content - ad midroll 1 - ad midroll 2 - content continues - ad postroll 1 - ad postroll 2.&amp;lt;br&amp;gt;&lt;br /&gt;
Use adldx parametr to assign position of ad in ad pool (starting from 0)&lt;br /&gt;
&lt;br /&gt;
Ad in pool MetaData Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var ad_pool_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example_preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;preroll&amp;quot;,  // or midroll, postroll&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;30&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Nielsen preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c4&amp;quot; : &amp;quot;p4,ASMEAcode&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c5&amp;quot; : &amp;quot;p5,AtributForAd&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c6&amp;quot; : &amp;quot;p6,preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;adldx&amp;quot; : &amp;quot;0&amp;quot; // position in ad pool - 0,1,2..&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Reset the playhead position to 0 for each ad.&amp;lt;br&amp;gt;&lt;br /&gt;
Call the adStop event at the end of each ad or increment the adldx&amp;lt;br&amp;gt;&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
=== Use Case 4: Static ===&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. User enters page (or HbbTV section) || event playhead, type : static, metadata : static_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. User stays within section ..  ||  n/a ||  no call needed, SDK counts seconds 2,3,4,..&lt;br /&gt;
|-&lt;br /&gt;
| 3. User leaves section ||  n/a || no call needed, SDK automatically ends measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5 : Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
=== User Opt-Out ===&lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the opt-out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie. Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for an opt-out statement (in Czech).&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Tato aplikace obsahuje proprietární měřicí software společnosti Nielsen, který uživatelům umožní přispívat k průzkumu trhu. Chcete-li se dozvědět více o informacích, které může software Nielsen shromažďovat a o Vaší možnosti měření deaktivovat, přečtěte si zásady ochrany osobních údajů Nielsen Digital Measurement na [http://priv-policy.imrworldwide.com/priv/browser/cz/cs/optout.html Nielsen Digital Measurement Privacy Policy].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialization Opt-Out ===&lt;br /&gt;
To configure Opt-Out during SDK initialization.  Add parametr outout into SDK init syntax - see step2. &amp;lt;br&amp;gt;&lt;br /&gt;
Use value &amp;quot;true&amp;quot; or &amp;quot;Yes&amp;quot; or &amp;quot;1&amp;quot; to OptOut, or value &amp;quot;false&amp;quot;, &amp;quot;No&amp;quot; or &amp;quot;0&amp;quot; to not OptOut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Opt-out status ===&lt;br /&gt;
Optional : to retrieve Opt-Out status call getOptOutStatus() , result is boolean value true (OptOuted = not measuring) or false (not OptOuted = measuring).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.getOptOutStatus();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 6 : Test your player by yourself ==&lt;br /&gt;
see how to test player at https://www.youtube.com/watch?v=t9eUsf9yh8w&amp;amp;feature=youtu.be&lt;br /&gt;
&lt;br /&gt;
=== Test SKD API calls === &lt;br /&gt;
to verify SDK API calls use Chrome and install add-on called &amp;quot;Nielsen SDK Inspector&amp;quot; (https://chrome.google.com/webstore/search/%20Nielsen%20SDK%20Inspector)&lt;br /&gt;
&lt;br /&gt;
=== Test outgoing pings === &lt;br /&gt;
to verify outgoing pings use Charles Proxy or any other proxy sw capable to sniff your network traffic. Filter URLs to &amp;quot;imrworld&amp;quot;. Example of such ping :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
http://secure-eu-cert.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=de-205177&lt;br /&gt;
&amp;amp;ch=de-205177_c01_static-123_P&amp;amp;asn=static-123&amp;amp;prv=1&amp;amp;c6=vc,c01&amp;amp;ca=NA&lt;br /&gt;
&amp;amp;c13=asid,T74896328-A13B-4985-8798-0AEBFA228D3E&amp;amp;c32=segA,segA%20example&amp;amp;c33=segB,segB%20example&lt;br /&gt;
&amp;amp;c34=segC,segC%20example&amp;amp;c15=apn,&amp;amp;sup=1&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=0&amp;amp;ad=0&amp;amp;cr=V&amp;amp;c9=devid,&lt;br /&gt;
&amp;amp;enc=true&amp;amp;c1=nuid,88b7cd07-f83d-45b1-8db1-20b4e2caae55&lt;br /&gt;
&amp;amp;at=view&amp;amp;rt=text&amp;amp;c16=sdkv,bj.6.0.0&amp;amp;c27=cln,0&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid,14966485169569829&lt;br /&gt;
&amp;amp;c30=bldv,6.0.0.1&amp;amp;st=dcr&amp;amp;c7=osgrp,&amp;amp;c8=devgrp,&amp;amp;c10=plt,&amp;amp;c40=adbid,&amp;amp;c14=osver,NA&lt;br /&gt;
&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,0&lt;br /&gt;
&amp;amp;c52=noad,0&amp;amp;devtypid=&amp;amp;pc=NA&amp;amp;c53=fef,n&amp;amp;c54=oad,&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=static-123&amp;amp;c3=st,c&amp;amp;c64=starttm,1496648518&lt;br /&gt;
&amp;amp;adid=static-123&amp;amp;c58=isLive,false&amp;amp;c59=sesid,&amp;amp;c61=createtm,1496648517&lt;br /&gt;
&amp;amp;c63=pipMode,&amp;amp;c68=bndlid,&amp;amp;c73=phtype,&amp;amp;c74=dvcnm,&amp;amp;c76=adbsnid,&amp;amp;df=0&amp;amp;sessionId=14966485169569829&lt;br /&gt;
&amp;amp;c44=progen,&amp;amp;davty=0&amp;amp;si=http%3A%2F%2Fsdkdemo.admosphere.cz%2FBrowserSdk6static%2Fdemo1cz%2F&lt;br /&gt;
&amp;amp;c66=mediaurl,&amp;amp;c62=sendTime,1496648517&amp;amp;rnd=496564&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Provide your app for certification ==&lt;br /&gt;
Once ready please send your application to Nielsen local staff for verification - see [http://dayrhesdkp001z.enterprisenet.org/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call - see step 2.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3592</id>
		<title>Czech Digital Measurement iOS Simplified SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Czech_Digital_Measurement_iOS_Simplified_SDK&amp;diff=3592"/>
		<updated>2019-03-28T18:43:15Z</updated>

		<summary type="html">&lt;p&gt;Admin3: Created page with &amp;quot;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}} Category:Digital == Overview == The Nielsen SDK is one of multiple framework SDKs t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have any of these prerequisites or if you have any questions, please see [https://engineeringportal.nielsen.com/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Implementation==&lt;br /&gt;
This guide covers implementation steps in JavaScript.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Step 1 : Configure SDK ==&lt;br /&gt;
Add the following script tag (to Static Queue Snippet) the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
==Step 2 : Create SDK Instance==&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3 : Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TrackEvent JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passed parametres ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For live stream : Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For VOD : Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;For static : pass only 1st position:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Event identifiers ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play. Send content metadata for every playheadposition update.&amp;lt;br&amp;gt;When content is playing, pass only metadata for content - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins. &lt;br /&gt;
When ad is playing, pass metadata for ad and its content as well - like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad_metadataObject&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
For detailed information of metadata and custom variables see [https://engineeringportal.nielsen.com/docs/Czech_SDK_Metadata specitication of Content Metadata for Czech Republic]. &amp;lt;br&amp;gt;&lt;br /&gt;
As static measurement is indepentent from video measurement, keep content and ad metadata empty and pass only static metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var metadata = { &lt;br /&gt;
  &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static_metadataObject&amp;gt;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together - example for video (ad) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// content&lt;br /&gt;
var content_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;content&amp;quot;,&lt;br /&gt;
	&amp;quot;program&amp;quot; : &amp;quot;ProgramName&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Bunny in woods&amp;quot;,&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;579&amp;quot;,&lt;br /&gt;
	&amp;quot;mediaUrl&amp;quot; : &amp;quot;&amp;quot;, // empty&lt;br /&gt;
	&amp;quot;airdate&amp;quot; : &amp;quot;20190313 20:00:00&amp;quot;,&lt;br /&gt;
	&amp;quot;isfullepisode&amp;quot; : &amp;quot;y&amp;quot;,&lt;br /&gt;
	&amp;quot;crossId1&amp;quot; : &amp;quot;IDEC&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c1&amp;quot; : &amp;quot;p1,&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c2&amp;quot; : &amp;quot;p2,TV ident&amp;quot;,&lt;br /&gt;
	&amp;quot;segB&amp;quot; : &amp;quot;Program type&amp;quot;,&lt;br /&gt;
	&amp;quot;segC&amp;quot; : &amp;quot;&amp;quot;, // empty&lt;br /&gt;
	&amp;quot;adloadtype&amp;quot; : &amp;quot;1&amp;quot;,&lt;br /&gt;
	&amp;quot;hasAds&amp;quot; : &amp;quot;1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ad&lt;br /&gt;
var ad_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example_preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;preroll&amp;quot;,  // or midroll, postroll&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;30&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Nielsen preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c4&amp;quot; : &amp;quot;p4,ASMEAcode&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c5&amp;quot; : &amp;quot;p5,AtributForAd&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c6&amp;quot; : &amp;quot;p6,preroll&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var trackObject = {&lt;br /&gt;
	&amp;quot;event&amp;quot;: 'playhead',&lt;br /&gt;
	&amp;quot;type&amp;quot;: 'ad',&lt;br /&gt;
	&amp;quot;playheadPosition&amp;quot;: '1',&lt;br /&gt;
	&amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                &amp;quot;content&amp;quot;: content_metadataObject,&lt;br /&gt;
                &amp;quot;ad&amp;quot;: ad_metadataObject,&lt;br /&gt;
                &amp;quot;static&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
          				}&lt;br /&gt;
	   		  };&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
nSdkInstance.trackEvent(trackObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Putting it all together - example for static ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// static&lt;br /&gt;
var static_metadataObject = {&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;static&amp;quot;,  &lt;br /&gt;
	&amp;quot;section&amp;quot; : &amp;quot;static_section1&amp;quot;,  &lt;br /&gt;
	&amp;quot;segA&amp;quot; : &amp;quot;segA example&amp;quot;,  &lt;br /&gt;
	&amp;quot;segB&amp;quot; : &amp;quot;segB example&amp;quot;,  &lt;br /&gt;
	&amp;quot;segC&amp;quot; : &amp;quot;segC example&amp;quot;,  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var trackObject = {&lt;br /&gt;
	&amp;quot;event&amp;quot;: 'playhead',&lt;br /&gt;
	&amp;quot;type&amp;quot;: 'static',&lt;br /&gt;
	&amp;quot;playheadPosition&amp;quot;: '1',&lt;br /&gt;
	&amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;ad&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;static&amp;quot;: static_metadataObject&lt;br /&gt;
          				}&lt;br /&gt;
	   		  };&lt;br /&gt;
&lt;br /&gt;
// fire TrackEvent&lt;br /&gt;
nSdkInstance.trackEvent(trackObject)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4 : API Call sequence ==&lt;br /&gt;
=== Use Case 1: Video - Content has no Advertisements ===&lt;br /&gt;
Playlist : single content, no ads.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. Video start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Video playing .. || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Video ends ||  event complete, type : content, metadata : content_metaDataObject, playheadPosition : lastPlayheadValue || call complete&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 2: Video - Content has Advertisements ===&lt;br /&gt;
Playlist : ad preroll - content - ad midroll - content continues - ad postroll.&amp;lt;br&amp;gt;&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. '''Ad Preroll''' start || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. Ad Preroll playing .. || event playhead, type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 3. Ad Preroll ends || event '''adStop''', type : ad, metadata : ad_preroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 4. '''Content''' start || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 5. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 6. Content interupted by midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || last playhead &lt;br /&gt;
|-&lt;br /&gt;
| 7. '''Ad Midroll''' start || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 8. Ad Midroll playing .. || event playhead, type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 9. Ad Midroll ends  || event '''adStop''', type : ad, metadata : ad_midroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
|-&lt;br /&gt;
| 10. '''Content''' continues after midroll || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 11. Content playing ..  || event playhead, type : content, metadata : content_metaDataObject, playheadPosition : 2,3,4.. etc  || playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 12. Content ends  || event '''complete''', type : content, metadata : content_metaDataObject, playheadPosition :  lastPlayheadValue || call complete for content &lt;br /&gt;
|-&lt;br /&gt;
| 13. '''Ad Postroll''' start || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 14. Ad Postroll playing .. || event playhead, type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : 2,3,4.. etc&lt;br /&gt;
  ||  playhead every second &lt;br /&gt;
|-&lt;br /&gt;
| 15. Ad Postroll ends || event '''adStop''', type : ad, metadata : ad_postroll_metaDataObject + content_metaDataObject, playheadPosition : lastPosition&lt;br /&gt;
  ||  call adStop at the end of add&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Use Case 3: Video - more ads in each ad pool ===&lt;br /&gt;
Playlist : ad preroll1 - preroll 2 - content - ad midroll 1 - ad midroll 2 - content continues - ad postroll 1 - ad postroll 2.&amp;lt;br&amp;gt;&lt;br /&gt;
Use adldx parametr to assign position of ad in ad pool (starting from 0)&lt;br /&gt;
&lt;br /&gt;
Ad in pool MetaData Example &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var ad_pool_metadataObject = {&lt;br /&gt;
	&amp;quot;assetid&amp;quot; : &amp;quot;assetid_example_preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot; : &amp;quot;preroll&amp;quot;,  // or midroll, postroll&lt;br /&gt;
	&amp;quot;length&amp;quot; : &amp;quot;30&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Nielsen preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c4&amp;quot; : &amp;quot;p4,ASMEAcode&amp;quot;, // empty for VOD&lt;br /&gt;
	&amp;quot;nol_c5&amp;quot; : &amp;quot;p5,AtributForAd&amp;quot;,&lt;br /&gt;
	&amp;quot;nol_c6&amp;quot; : &amp;quot;p6,preroll&amp;quot;,&lt;br /&gt;
	&amp;quot;adldx&amp;quot; : &amp;quot;0&amp;quot; // position in ad pool - 0,1,2..&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Reset the playhead position to 0 for each ad.&amp;lt;br&amp;gt;&lt;br /&gt;
Call the adStop event at the end of each ad or increment the adldx&amp;lt;br&amp;gt;&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the adldx value, and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
=== Use Case 4: Static ===&lt;br /&gt;
A Sample API sequence follow this flow:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Playlist !! API call TrackEvent !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1. User enters page (or HbbTV section) || event playhead, type : static, metadata : static_metaDataObject, playheadPosition : 1  || 1st call playhead&lt;br /&gt;
|-&lt;br /&gt;
| 2. User stays within section ..  ||  n/a ||  no call needed, SDK counts seconds 2,3,4,..&lt;br /&gt;
|-&lt;br /&gt;
| 3. User leaves section ||  n/a || no call needed, SDK automatically ends measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5 : Privacy and Opt-Out ==&lt;br /&gt;
&lt;br /&gt;
=== User Opt-Out ===&lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the opt-out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie. Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for an opt-out statement (in Czech).&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Tato aplikace obsahuje proprietární měřicí software společnosti Nielsen, který uživatelům umožní přispívat k průzkumu trhu. Chcete-li se dozvědět více o informacích, které může software Nielsen shromažďovat a o Vaší možnosti měření deaktivovat, přečtěte si zásady ochrany osobních údajů Nielsen Digital Measurement na [http://priv-policy.imrworldwide.com/priv/browser/cz/cs/optout.html Nielsen Digital Measurement Privacy Policy].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialization Opt-Out ===&lt;br /&gt;
To configure Opt-Out during SDK initialization.  Add parametr outout into SDK init syntax - see step2. &amp;lt;br&amp;gt;&lt;br /&gt;
Use value &amp;quot;true&amp;quot; or &amp;quot;Yes&amp;quot; or &amp;quot;1&amp;quot; to OptOut, or value &amp;quot;false&amp;quot;, &amp;quot;No&amp;quot; or &amp;quot;0&amp;quot; to not OptOut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Opt-out status ===&lt;br /&gt;
Optional : to retrieve Opt-Out status call getOptOutStatus() , result is boolean value true (OptOuted = not measuring) or false (not OptOuted = measuring).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.getOptOutStatus();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 6 : Test your player by yourself ==&lt;br /&gt;
see how to test player at https://www.youtube.com/watch?v=t9eUsf9yh8w&amp;amp;feature=youtu.be&lt;br /&gt;
&lt;br /&gt;
=== Test SKD API calls === &lt;br /&gt;
to verify SDK API calls use Chrome and install add-on called &amp;quot;Nielsen SDK Inspector&amp;quot; (https://chrome.google.com/webstore/search/%20Nielsen%20SDK%20Inspector)&lt;br /&gt;
&lt;br /&gt;
=== Test outgoing pings === &lt;br /&gt;
to verify outgoing pings use Charles Proxy or any other proxy sw capable to sniff your network traffic. Filter URLs to &amp;quot;imrworld&amp;quot;. Example of such ping :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
http://secure-eu-cert.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=de-205177&lt;br /&gt;
&amp;amp;ch=de-205177_c01_static-123_P&amp;amp;asn=static-123&amp;amp;prv=1&amp;amp;c6=vc,c01&amp;amp;ca=NA&lt;br /&gt;
&amp;amp;c13=asid,T74896328-A13B-4985-8798-0AEBFA228D3E&amp;amp;c32=segA,segA%20example&amp;amp;c33=segB,segB%20example&lt;br /&gt;
&amp;amp;c34=segC,segC%20example&amp;amp;c15=apn,&amp;amp;sup=1&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=0&amp;amp;ad=0&amp;amp;cr=V&amp;amp;c9=devid,&lt;br /&gt;
&amp;amp;enc=true&amp;amp;c1=nuid,88b7cd07-f83d-45b1-8db1-20b4e2caae55&lt;br /&gt;
&amp;amp;at=view&amp;amp;rt=text&amp;amp;c16=sdkv,bj.6.0.0&amp;amp;c27=cln,0&amp;amp;crs=&amp;amp;lat=&amp;amp;lon=&amp;amp;c29=plid,14966485169569829&lt;br /&gt;
&amp;amp;c30=bldv,6.0.0.1&amp;amp;st=dcr&amp;amp;c7=osgrp,&amp;amp;c8=devgrp,&amp;amp;c10=plt,&amp;amp;c40=adbid,&amp;amp;c14=osver,NA&lt;br /&gt;
&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,0&lt;br /&gt;
&amp;amp;c52=noad,0&amp;amp;devtypid=&amp;amp;pc=NA&amp;amp;c53=fef,n&amp;amp;c54=oad,&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=static-123&amp;amp;c3=st,c&amp;amp;c64=starttm,1496648518&lt;br /&gt;
&amp;amp;adid=static-123&amp;amp;c58=isLive,false&amp;amp;c59=sesid,&amp;amp;c61=createtm,1496648517&lt;br /&gt;
&amp;amp;c63=pipMode,&amp;amp;c68=bndlid,&amp;amp;c73=phtype,&amp;amp;c74=dvcnm,&amp;amp;c76=adbsnid,&amp;amp;df=0&amp;amp;sessionId=14966485169569829&lt;br /&gt;
&amp;amp;c44=progen,&amp;amp;davty=0&amp;amp;si=http%3A%2F%2Fsdkdemo.admosphere.cz%2FBrowserSdk6static%2Fdemo1cz%2F&lt;br /&gt;
&amp;amp;c66=mediaurl,&amp;amp;c62=sendTime,1496648517&amp;amp;rnd=496564&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 7 : Provide your app for certification ==&lt;br /&gt;
Once ready please send your application to Nielsen local staff for verification - see [http://dayrhesdkp001z.enterprisenet.org/docs/Czech_Contacts Contact list for Czech Republic].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Step 8 : Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call - see step 2.&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3557</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3557"/>
		<updated>2019-03-20T19:06:56Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
|debug || Enables Nielsen console logging. Only required for testing [true,false]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
== Privacy and Opt-Out ==&lt;br /&gt;
=== User Opt Out === &lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the User Opt-Out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player (or page in relation to static measurement) includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Once users have opted out via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=total&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link], their browser cookies will contain the value '''TOTAL_OPTOUT'''. This will prevent a redirect to our data provider from occurring&lt;br /&gt;
* Users can opt back in via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=cancel&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link].  When a user selects that link, their opt-out cookie will be deleted and they will be able to be measured moving forward.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The following paragraph is a template for a Privacy Statement.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== User Opt Back In ====&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsSDK600.bundle.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_Main-GTM_P&amp;amp;asn=Main-GTM&amp;amp;sessionId=8l2XGnAW6IC3Cc2MIMh0RYRTqimuU1553108759&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=NA&amp;amp;c13=asid,P00BEB680-1F1A-47BB-922D-1BD2F1BA79A7&amp;amp;c32=...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test Opt-Out&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3556</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3556"/>
		<updated>2019-03-20T19:05:29Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
|debug || Enables Nielsen console logging. Only required for testing [true,false]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsSDK600.bundle.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_Main-GTM_P&amp;amp;asn=Main-GTM&amp;amp;sessionId=8l2XGnAW6IC3Cc2MIMh0RYRTqimuU1553108759&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=NA&amp;amp;c13=asid,P00BEB680-1F1A-47BB-922D-1BD2F1BA79A7&amp;amp;c32=...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test Opt-Out&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3555</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3555"/>
		<updated>2019-03-20T19:05:09Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
|debug || Enables Nielsen console logging. Only required for testing [true,false]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsSDK600.bundle.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_Main-GTM_P&amp;amp;asn=Main-GTM&amp;amp;sessionId=8l2XGnAW6IC3Cc2MIMh0RYRTqimuU1553108759&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=NA&amp;amp;c13=asid,P00BEB680-1F1A-47BB-922D-1BD2F1BA79A7&amp;amp;c32=...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3554</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3554"/>
		<updated>2019-03-20T19:04:03Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
|debug || Enables Nielsen console logging. Only required for testing [true,false]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsSDK600.bundle.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_Main-GTM_P&amp;amp;asn=Main-GTM&amp;amp;sessionId=8l2XGnAW6IC3Cc2MIMh0RYRTqimuU1553108759&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=NA&amp;amp;c13=asid,P00BEB680-1F1A-47BB-922D-1BD2F1BA79A7&amp;amp;c32=segA,Home%20Page&amp;amp;c33=segB,66544&amp;amp;c34=segC,77-998&amp;amp;c15=apn,&amp;amp;sup=0&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=1&amp;amp;plugv=&amp;amp;playerv=&amp;amp;ad=0&amp;amp;cr=V&amp;amp;c9=devid,&amp;amp;enc=true&lt;br /&gt;
&amp;amp;c1=nuid,L5irM6mfVnslC0QL5yQULerKmllGr1532719747&amp;amp;at=view&amp;amp;rt=text&amp;amp;c16=sdkv,bj.6.0.0&amp;amp;c27=cln,0&amp;amp;crs=&amp;amp;&lt;br /&gt;
lat=&amp;amp;lon=&amp;amp;c29=plid,15531087595252370&amp;amp;c30=bldv,6.0.0.326&amp;amp;st=dcr&amp;amp;c7=osgrp,&amp;amp;c8=devgrp,&amp;amp;c10=plt,&amp;amp;c40=adbid,&lt;br /&gt;
&amp;amp;c14=osver,NA&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,0&lt;br /&gt;
&amp;amp;c52=noad,0&amp;amp;devtypid=&amp;amp;pc=NA&amp;amp;c53=fef,n&amp;amp;c54=oad,&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=BN77YT&amp;amp;c3=st,c&amp;amp;c64=starttm,1553108761&lt;br /&gt;
&amp;amp;adid=BN77YT&amp;amp;c58=isLive,false&amp;amp;c59=sesid,&amp;amp;c61=createtm,1553108760&amp;amp;c63=pipMode,&amp;amp;uoo=&amp;amp;c68=bndlid,&amp;amp;nodeTM=&amp;amp;&lt;br /&gt;
logTM=&amp;amp;c73=phtype,&amp;amp;c74=dvcnm,&amp;amp;c76=adbsnid,&amp;amp;c44=progen,&amp;amp;davty=0&amp;amp;si=&lt;br /&gt;
http%3A%2F%2Fnielsenonlinesupport.com%2Fcolin%2Fsdk3%2Fgtm%2Fgtm.htm&amp;amp;c66=mediaurl,&amp;amp;c62=sendTime,1553108760&amp;amp;rnd=313533&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3553</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3553"/>
		<updated>2019-03-20T19:03:05Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsSDK600.bundle.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;https://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;ci=us-500207&amp;amp;ch=us-500207_c77_Main-GTM_P&amp;amp;asn=Main-GTM&amp;amp;sessionId=8l2XGnAW6IC3Cc2MIMh0RYRTqimuU1553108759&amp;amp;prv=1&amp;amp;c6=vc,c77&amp;amp;ca=NA&amp;amp;c13=asid,P00BEB680-1F1A-47BB-922D-1BD2F1BA79A7&amp;amp;c32=segA,Home%20Page&amp;amp;c33=segB,66544&amp;amp;c34=segC,77-998&amp;amp;c15=apn,&amp;amp;sup=0&amp;amp;segment2=&amp;amp;segment1=&amp;amp;forward=1&amp;amp;plugv=&amp;amp;playerv=&amp;amp;ad=0&amp;amp;cr=V&amp;amp;c9=devid,&amp;amp;enc=true&lt;br /&gt;
&amp;amp;c1=nuid,L5irM6mfVnslC0QL5yQULerKmllGr1532719747&amp;amp;at=view&amp;amp;rt=text&amp;amp;c16=sdkv,bj.6.0.0&amp;amp;c27=cln,0&amp;amp;crs=&amp;amp;&lt;br /&gt;
lat=&amp;amp;lon=&amp;amp;c29=plid,15531087595252370&amp;amp;c30=bldv,6.0.0.326&amp;amp;st=dcr&amp;amp;c7=osgrp,&amp;amp;c8=devgrp,&amp;amp;c10=plt,&amp;amp;c40=adbid,&lt;br /&gt;
&amp;amp;c14=osver,NA&amp;amp;c26=dmap,1&amp;amp;dd=&amp;amp;hrd=&amp;amp;wkd=&amp;amp;c35=adrsid,&amp;amp;c36=cref1,&amp;amp;c37=cref2,&amp;amp;c11=agg,1&amp;amp;c12=apv,&amp;amp;c51=adl,0&lt;br /&gt;
&amp;amp;c52=noad,0&amp;amp;devtypid=&amp;amp;pc=NA&amp;amp;c53=fef,n&amp;amp;c54=oad,&amp;amp;c55=cref3,&amp;amp;c57=adldf,2&amp;amp;ai=BN77YT&amp;amp;c3=st,c&amp;amp;c64=starttm,1553108761&lt;br /&gt;
&amp;amp;adid=BN77YT&amp;amp;c58=isLive,false&amp;amp;c59=sesid,&amp;amp;c61=createtm,1553108760&amp;amp;c63=pipMode,&amp;amp;uoo=&amp;amp;c68=bndlid,&amp;amp;nodeTM=&amp;amp;&lt;br /&gt;
logTM=&amp;amp;c73=phtype,&amp;amp;c74=dvcnm,&amp;amp;c76=adbsnid,&amp;amp;c44=progen,&amp;amp;davty=0&amp;amp;si=&lt;br /&gt;
http%3A%2F%2Fnielsenonlinesupport.com%2Fcolin%2Fsdk3%2Fgtm%2Fgtm.htm&amp;amp;c66=mediaurl,&amp;amp;c62=sendTime,1553108760&amp;amp;rnd=313533&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3552</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3552"/>
		<updated>2019-03-20T19:00:07Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: AssetID, section, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsDcrLite510.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&lt;br /&gt;
&amp;amp;sup=0&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-5XXXX&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&amp;amp;&lt;br /&gt;
c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&lt;br /&gt;
&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=view&amp;amp;cr=V&amp;amp;c27=cln,0&amp;amp;rnd=690517&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3551</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3551"/>
		<updated>2019-03-20T18:59:25Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: Assetname, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| nol_assetid || Unique ID for each article &lt;br /&gt;
|-&lt;br /&gt;
|section || section of each site (e.g. section value should be first level in page URL: website.com/section). Limit to 25 unique values&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || custom segment for reporting: Limit to 25 unique values across custom segments (segA + segB + segC)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
//  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsDcrLite510.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&lt;br /&gt;
&amp;amp;sup=0&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-5XXXX&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&amp;amp;&lt;br /&gt;
c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&lt;br /&gt;
&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=view&amp;amp;cr=V&amp;amp;c27=cln,0&amp;amp;rnd=690517&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3550</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3550"/>
		<updated>2019-03-20T18:55:27Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: Assetname, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description !! Example&lt;br /&gt;
|-&lt;br /&gt;
| nol_assetname || Unique Value assigned to page/site section || entertainment&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || First Breakout || news&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || Second Breakout || celebrities&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || Third Breakout || slideshow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetname&amp;quot; : &amp;quot;entertainment-video&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsDcrLite510.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&lt;br /&gt;
&amp;amp;sup=0&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-5XXXX&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&amp;amp;&lt;br /&gt;
c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&lt;br /&gt;
&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=view&amp;amp;cr=V&amp;amp;c27=cln,0&amp;amp;rnd=690517&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3549</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3549"/>
		<updated>2019-03-20T18:54:33Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: Assetname, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description !! Example&lt;br /&gt;
|-&lt;br /&gt;
| nol_assetname || Unique Value assigned to page/site section || entertainment&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || First Breakout || news&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || Second Breakout || celebrities&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || Third Breakout || slideshow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetname&amp;quot; : &amp;quot;entertainment-video&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_assetid&amp;quot;: &amp;quot;XXXXXXX&amp;quot;,&lt;br /&gt;
        &amp;quot;nol_section&amp;quot;: &amp;quot;Main-GTM&amp;quot;&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsDcrLite510.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&lt;br /&gt;
&amp;amp;sup=0&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-5XXXX&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&amp;amp;&lt;br /&gt;
c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&lt;br /&gt;
&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=view&amp;amp;cr=V&amp;amp;c27=cln,0&amp;amp;rnd=690517&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3548</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3548"/>
		<updated>2019-03-20T18:53:21Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
[[File:dcr-logo.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: Assetname, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description !! Example&lt;br /&gt;
|-&lt;br /&gt;
| nol_assetname || Unique Value assigned to page/site section || entertainment&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || First Breakout || news&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || Second Breakout || celebrities&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || Third Breakout || slideshow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetname&amp;quot; : &amp;quot;entertainment-video&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsDcrLite510.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&lt;br /&gt;
&amp;amp;sup=0&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-5XXXX&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&amp;amp;&lt;br /&gt;
c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&lt;br /&gt;
&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=view&amp;amp;cr=V&amp;amp;c27=cln,0&amp;amp;rnd=690517&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=File:dcr-logo.jpg&amp;diff=3547</id>
		<title>File:dcr-logo.jpg</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=File:dcr-logo.jpg&amp;diff=3547"/>
		<updated>2019-03-20T18:52:13Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;dcr-logo&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3546</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3546"/>
		<updated>2019-03-20T18:50:55Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
Paste this code as high in the &amp;lt;head&amp;gt; of the page as possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-KMN8NG4');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, paste this code immediately after the opening &amp;lt;body&amp;gt; tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-KMN8NG4&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: Assetname, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description !! Example&lt;br /&gt;
|-&lt;br /&gt;
| nol_assetname || Unique Value assigned to page/site section || entertainment&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || First Breakout || news&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || Second Breakout || celebrities&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || Third Breakout || slideshow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetname&amp;quot; : &amp;quot;entertainment-video&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsDcrLite510.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&lt;br /&gt;
&amp;amp;sup=0&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-5XXXX&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&amp;amp;&lt;br /&gt;
c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&lt;br /&gt;
&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=view&amp;amp;cr=V&amp;amp;c27=cln,0&amp;amp;rnd=690517&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=File:Untitled-gtm.jpg&amp;diff=3545</id>
		<title>File:Untitled-gtm.jpg</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=File:Untitled-gtm.jpg&amp;diff=3545"/>
		<updated>2019-03-20T18:48:18Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Untitled-gtm&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3544</id>
		<title>DCR Static Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Static_Google_Tag_Manager&amp;diff=3544"/>
		<updated>2019-03-20T18:47:06Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
'''Overview'''&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager provides easy-to-use tag templates for many Google and non-Google tools.&lt;br /&gt;
* The Google Tag Manager framework is place on a publisher’s web page making it easy to add and maintain tags across sites without additional code.&lt;br /&gt;
* All tag modification/additions, are performed via a point and click User Interface.&lt;br /&gt;
&lt;br /&gt;
== Quick Start - Adding DCR Static Measurement ==&lt;br /&gt;
=== Login to your Google Tag Manager Account ===&lt;br /&gt;
* Signup for free at https://www.google.com/analytics/tag-manager/&lt;br /&gt;
&lt;br /&gt;
=== Create the Container Script ===&lt;br /&gt;
* Container script setup instructions are located here.&lt;br /&gt;
* Once created, the snippet needs to be embedded within each webpage on your site.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;//www.googletagmanager.com/ns.html?id=GTM-5XXXXX&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':&lt;br /&gt;
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=&lt;br /&gt;
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,'script','dataLayer','GTM-5XXXXX');&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add the DCR Tag ===&lt;br /&gt;
* In Google Tag Manager, select an account and default workspace.&lt;br /&gt;
* To add a tag: Click NEW. Select the tag type (DCR Static Lite) and specify the trigger to be on Page View.&lt;br /&gt;
* Populate DCR Static template with Nielsen variables.&lt;br /&gt;
&lt;br /&gt;
=== Tag Parameters ===&lt;br /&gt;
Detailed information on the parameters for the script tag can be found on [[Digital Measurement Metadata]]. These parameters will automatically sent to Nielsen once the page is loaded completely. Please contact your Technical Account Manager for more details.&lt;br /&gt;
&lt;br /&gt;
[[File:Bsdk600-gtm.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
You should now be presented with a screen such as the one below:&lt;br /&gt;
&lt;br /&gt;
Once these fields have been populated, you can Preview, and finally Publish. You have now fully implemented DCR Static Page Measurement to your site.&lt;br /&gt;
&lt;br /&gt;
== Dynamic Parameters ==&lt;br /&gt;
=== Dynamic Variables ===&lt;br /&gt;
There may be times when you will want to dynamically pass values to the DCR Static Lite tag, and this can be accomplished for the following fields: Assetname, Segment A, Segment B and Segment C.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Example ===&lt;br /&gt;
Immediately before the Google Tag Manager Container code, you can declare some variables and pass dynamic values. GTM currently supports the four following dynamic parameters. If no value is sent for the below variables, the values provided during the tag setup in GTM will take priority.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Description !! Example&lt;br /&gt;
|-&lt;br /&gt;
| nol_assetname || Unique Value assigned to page/site section || entertainment&lt;br /&gt;
|-&lt;br /&gt;
| nol_segA || First Breakout || news&lt;br /&gt;
|-&lt;br /&gt;
| nol_segB || Second Breakout || celebrities&lt;br /&gt;
|-&lt;br /&gt;
| nol_segC || Third Breakout || slideshow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
  // param override&lt;br /&gt;
  window.NOLLite = {&lt;br /&gt;
  debug: true,&lt;br /&gt;
 	&amp;quot;nol_assetname&amp;quot; : &amp;quot;entertainment-video&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segA&amp;quot;: &amp;quot;SegA_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segB&amp;quot;: &amp;quot;SegB_value_here&amp;quot;,&lt;br /&gt;
 	&amp;quot;nol_segC&amp;quot;: &amp;quot;SegC_value_here&amp;quot;	 &lt;br /&gt;
 &lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': If you do not select to pass any values dynamically, the values you placed in the Google Tag Manager Template will be used instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting Structure ===&lt;br /&gt;
The figures below show the reporting structures for Static content:&lt;br /&gt;
&lt;br /&gt;
[[File:static_reporting.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
'''Monitoring Tools'''&lt;br /&gt;
Testing the Browser Implementation&lt;br /&gt;
&lt;br /&gt;
The steps to test the implementation are given below.&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
Filter HTTP traffic with the string &amp;quot;imr&amp;quot; to capture traffic from the SDK. This will capture traffic going to Nielsen servers.&lt;br /&gt;
&lt;br /&gt;
'''Step 2'''&lt;br /&gt;
&lt;br /&gt;
Verify that the Nielsen SDK is being downloaded correctly and is the correct version.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://cdn-gl.imrworldwide.com/novms/js/2/nlsDcrLite510.min.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Step 3'''&lt;br /&gt;
&lt;br /&gt;
When the page is loaded for the first time, the Browser SDK fires a View ping as soon as content is loaded. Utilizing your HTTP traffic filter tool, you can now validate the metadata that is being sent to the Nielsen collection servers.&lt;br /&gt;
&lt;br /&gt;
Example View Ping Below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&lt;br /&gt;
&amp;amp;sup=0&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-5XXXX&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&amp;amp;&lt;br /&gt;
c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&lt;br /&gt;
&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=view&amp;amp;cr=V&amp;amp;c27=cln,0&amp;amp;rnd=690517&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 4'''&lt;br /&gt;
&lt;br /&gt;
The first duration ping is fired after 5 minutes of content is viewed and is indicated by the cr value containing a D. This should fire every 5 minutes but only when the page is in focus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;http://secure-dcr.imrworldwide.com/cgi-bin/gn?prd=dcr&amp;amp;st=dcr&amp;amp;rt=text&amp;amp;forward=0&amp;amp;sup=0&lt;br /&gt;
&amp;amp;ad=0&amp;amp;asn=%2Fsdk2%2Findex2.html&amp;amp;ci=us-500270&amp;amp;c6=vc,c77&amp;amp;c9=devid,&amp;amp;c11=agg,1&lt;br /&gt;
&amp;amp;c12=apv,3&amp;amp;c13=asid,PAA3A8EF7-E6D2-4A9E-9787-BDXXXXXXXXXX&amp;amp;c15=apn,Test2&lt;br /&gt;
&amp;amp;c16=sdkv,bj.5.1.5&amp;amp;c26=dmap,1&amp;amp;c29=plid,14767465028039340&amp;amp;c30=bldv,1.0.0.15&amp;amp;c32=segA,USA&lt;br /&gt;
&amp;amp;c33=segB,CA&amp;amp;c34=segC,RSM&amp;amp;at=timer&amp;amp;cr=D&amp;amp;c27=cln,300&amp;amp;rnd=857576&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 5'''&lt;br /&gt;
&lt;br /&gt;
Test the [[Browser SDK API Reference#Browser Opt-Out Implementation|Opt-Out implementation]]&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=File:Bsdk600-gtm.png&amp;diff=3543</id>
		<title>File:Bsdk600-gtm.png</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=File:Bsdk600-gtm.png&amp;diff=3543"/>
		<updated>2019-03-20T18:46:35Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bsdk600-gtm&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=File:GTM-DCR.jpg&amp;diff=3542</id>
		<title>File:GTM-DCR.jpg</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=File:GTM-DCR.jpg&amp;diff=3542"/>
		<updated>2019-03-20T18:42:31Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GTM-DCR&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3540</id>
		<title>DCR Video Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3540"/>
		<updated>2019-03-13T19:15:17Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following items are required:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-&lt;br /&gt;
|| ☑ || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Nielsen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
=== Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==== Example SDK Initialization with Viewability ====&lt;br /&gt;
If you decide to implement the Nielsen Viewability Module, the SDK will track the viewability of the targeted player/element, log the viewable percentage and record in seconds the time the player/element was in that viewable state.  The only additional information required is the HTML element ID of the element being tracked (which is passed during SDK Initialization), and the volume level (passed as an event).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If no &amp;quot;volume&amp;quot; event is passed, a default value of '1' will be used. (IE: 100%).  If the volume level is adjusted, the modified value can be passed to the SDK using the standard ggPM() API along with the new &amp;quot;volume&amp;quot; event.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, &amp;lt;volume level&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event Name	!! Event #	!! Purpose !! Possible Values !!Example&lt;br /&gt;
|-&lt;br /&gt;
| volume	|| 61  ||ggPM event that will allow clients to pass in the volume levels.	||Supports decimal values in range from 0 - 1||instance.ggPM(&amp;quot;61&amp;quot;, 0); =&amp;gt; muted&lt;br /&gt;
instance.ggPM(&amp;quot;61&amp;quot;, .5) =&amp;gt; not muted&lt;br /&gt;
intance.ggPM(&amp;quot;61&amp;quot;, 1) =&amp;gt; not muted&lt;br /&gt;
|}&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, 0); // muted&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Metadata Objects ===&lt;br /&gt;
There are two types of asset metadata:&lt;br /&gt;
*content: identify video&lt;br /&gt;
*ad: identify each ad&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. User will need to set up content and ad objects with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
==== Content Metadata ====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| clientid	|| &lt;br /&gt;
parent ID – value is automatically populated through provided App ID.&amp;lt;br/&amp;gt;&lt;br /&gt;
In order to override the brand configured to the App ID, pass parent &amp;lt;br/&amp;gt;&lt;br /&gt;
value here and the sub-brand ID associated to that brand in the subbrand &amp;lt;br/&amp;gt;&lt;br /&gt;
key (e.g. multiple brands in App)	&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| vcid	|| sub-brand ID – value is automatically populated through provided&amp;lt;br/&amp;gt;&lt;br /&gt;
App ID. In order to override the sub-brand configured to the App ID, value can &amp;lt;br/&amp;gt;&lt;br /&gt;
be passed here (e.g. multiple sub-brands in App)&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| type ||	type of asset	|| &amp;quot;content&amp;quot;	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid	|| unique ID assigned to asset 	|| custom&amp;lt;br&amp;gt;(no [[Special Characters]]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program	|| name of program (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| title	|| episode title (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| length	|| length of content in seconds	|| seconds (0 for live stream)||	✓&lt;br /&gt;
|-&lt;br /&gt;
| mediaURL	|| URL location of the content being streamed	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| segB	|| custom segment B	|| custom	||&lt;br /&gt;
|-&lt;br /&gt;
| segC	|| custom segment C	|| custom	 ||&lt;br /&gt;
|-&lt;br /&gt;
| airdate	|| the airdate in the linear TV ||	YYYYMMDD HH:MI:SS	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode	|| full episode flag ||	&lt;br /&gt;
*&amp;quot;y&amp;quot;– full episode&lt;br /&gt;
*&amp;quot;n&amp;quot;– non full episode	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId1	|| standard episode ID	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId2	|| content originator (only required for distributors)	|| Nielsen provided	||&lt;br /&gt;
|-&lt;br /&gt;
|adloadtype	|| type of ad load:&lt;br /&gt;
* 1) Linear – matches TV ad load &lt;br /&gt;
* 2) Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;1&amp;quot; – content with linear ads &lt;br /&gt;
*&amp;quot;2&amp;quot; – content with dynamic ads	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var contentMetadataObject =&lt;br /&gt;
{  &lt;br /&gt;
  type:           'content',&lt;br /&gt;
  assetid:        'VID123-123456',&lt;br /&gt;
  program:        'program name',&lt;br /&gt;
  title:          'episode title',&lt;br /&gt;
  length:         'length in seconds',&lt;br /&gt;
  mediaURL:       'http://www.site.com/videoAsset',&lt;br /&gt;
  segB:           'custom segment B',&lt;br /&gt;
  segC:           'custom segment C',&lt;br /&gt;
  airdate:        'YYYYMMDD HH:MI:SS',&lt;br /&gt;
  isfullepisode:  'y',&lt;br /&gt;
  crossId1:       'Standard Episode ID',&lt;br /&gt;
  crossId2:       'Content Originator',&lt;br /&gt;
  adloadtype:     '2'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Object ===&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Call Nielsen APIs ====&lt;br /&gt;
The method for calling events is ggPM().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('event', parameter, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt Scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== Pause Event ===&lt;br /&gt;
The setPlayheadPostion event is used for handling pause. To indicate pause, stop passing the playhead position to the SDK. Once the content resumes, begin sending the playhead again with the correct playhead value.&lt;br /&gt;
&lt;br /&gt;
=== Other Interrupt Scenarios ===&lt;br /&gt;
The following possible browser interruption scenarios must be handled:&lt;br /&gt;
&lt;br /&gt;
* Browser/Tab close&lt;br /&gt;
* Leaving the page to another destination&lt;br /&gt;
* Pressing the stop button&lt;br /&gt;
&lt;br /&gt;
There are many cases where the player itself has the ability to detect such situations. If not, these interruption scenarios can be handled through JavaScript. The events that are called will depend on the asset being played (e.g. midroll vs. content).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener('beforeunload', function(event) &lt;br /&gt;
{&lt;br /&gt;
  // Only inside a midroll indicate &amp;lt;stop&amp;gt; for the ad&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
  &lt;br /&gt;
  // Indicate &amp;lt;end&amp;gt; and &amp;lt;stop&amp;gt; for the content&lt;br /&gt;
  nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' User may need to add code to support specific browser versions (e.g. older versions of Internet Explorer).&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: || current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'setPlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call when content or ads complete playing and pass playhead position&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK Playhead Event Sequence ==&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject); &lt;br /&gt;
 &lt;br /&gt;
// PREROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', prerollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', midrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// POSTROLL&lt;br /&gt;
nSdkInstance.ggPM('loadmetadata', postrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* 'setPlayheadPosition' is used for calculating duration and must be passed every second. The final playhead position must be sent for the current asset being played before calling 'stop', 'end', or 'loadmetadata'.&lt;br /&gt;
&lt;br /&gt;
* For Ad Pods, events must be called for each individual Ad. Each Ad playhead position should begin at ‘0’ when ad starts.&lt;br /&gt;
&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where previous content segment left off. The playhead position should be passed as a rounded number with no decimals.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_Bundled_SDK&amp;diff=3539</id>
		<title>DCR Video Browser Bundled SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_Bundled_SDK&amp;diff=3539"/>
		<updated>2019-03-13T19:14:00Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have an AppID , please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Everything passed via trackevent() ==&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UNIX timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be passed when the&lt;br /&gt;
content playback is paused.  &lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;86400&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate a very simple video implementation, with a single preroll and single content block.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
  // Setup videojs sample player&lt;br /&gt;
  var nielsenid = document.getElementById(&amp;quot;my-sdkplayer&amp;quot;);&lt;br /&gt;
var coolPlayer = videojs('my-sdkplayer', {&lt;br /&gt;
  controls: true,&lt;br /&gt;
  autoplay: true,&lt;br /&gt;
  preload: 'auto',&lt;br /&gt;
});&lt;br /&gt;
var prevPos = null;&lt;br /&gt;
&lt;br /&gt;
coolPlayer.preroll({&lt;br /&gt;
  src: {&lt;br /&gt;
    src: &amp;quot;assets/CleaningCrew.mp4&amp;quot;,&lt;br /&gt;
    type: &amp;quot;video/mp4&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  href: &amp;quot;http://videojs.com&amp;quot;,&lt;br /&gt;
  adsOptions: {&lt;br /&gt;
    debug: true&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
videojs('my-sdkplayer').ready(function() {&lt;br /&gt;
  // EXAMPLE: Start playing the video.&lt;br /&gt;
&lt;br /&gt;
  coolPlayer.play();&lt;br /&gt;
  var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'content',&lt;br /&gt;
    playheadPosition: '0',&lt;br /&gt;
    metadata: {&lt;br /&gt;
      content: {&lt;br /&gt;
        type: 'content',&lt;br /&gt;
        assetid: 'VID98-2B88',&lt;br /&gt;
        program: 'Put a programname here ',&lt;br /&gt;
        section: 'section name here'&lt;br /&gt;
        title: 'S01E02',&lt;br /&gt;
        length: '180',&lt;br /&gt;
        airdate: '20190101 10:01:00',&lt;br /&gt;
        isfullepisode: 'y',&lt;br /&gt;
        crossId1: 'Standard Episode ID',&lt;br /&gt;
        crossID2: 'Content Originator',&lt;br /&gt;
        adloadtype: '2'&lt;br /&gt;
      },&lt;br /&gt;
      ad: {},&lt;br /&gt;
      static: {}&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  coolPlayer.on('timeupdate', function() {&lt;br /&gt;
    var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
    var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
    if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos) {&lt;br /&gt;
      // check for playhead change so it's only called once per second &lt;br /&gt;
      console.log('PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
      obj.event = 'playhead';&lt;br /&gt;
      obj.type = 'content';&lt;br /&gt;
      obj.metadata.ad = {};&lt;br /&gt;
      prevPos = intPlayedTime;&lt;br /&gt;
      obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
      nSdkInstance.trackEvent(obj);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adstart', function() {&lt;br /&gt;
    console.log('ADSTART EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'ad';&lt;br /&gt;
    obj.metadata.ad = {&lt;br /&gt;
      type: 'preroll',&lt;br /&gt;
      assetid: 'AD9455',&lt;br /&gt;
      adldx: '1',&lt;br /&gt;
      program: 'Cant Skip Campaign',&lt;br /&gt;
      title: 'Cleaning Crew',&lt;br /&gt;
      length: '36',&lt;br /&gt;
    };&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('contentresumed', function() {&lt;br /&gt;
    console.log('CONTENT RESUMED EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'content';&lt;br /&gt;
    obj.event = 'playhead';&lt;br /&gt;
    obj.metadata.ad = {};&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('pause', function() {&lt;br /&gt;
    console.log('PAUSE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'pause';&lt;br /&gt;
    obj.playheadPosition = Math.round(coolPlayer.currentTime());&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adtimeupdate', function() {&lt;br /&gt;
    var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
    var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
    if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos) {&lt;br /&gt;
      // check for playhead change so it's only called once per second &lt;br /&gt;
      console.log('AD PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
      console.log(Math.round(getcurrentTime));&lt;br /&gt;
      prevPos = intPlayedTime;&lt;br /&gt;
      obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
      nSdkInstance.trackEvent(obj);&lt;br /&gt;
    };&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adend', function() {&lt;br /&gt;
    console.log('AD STOP EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'adstop';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('ended', function() {&lt;br /&gt;
    console.log('COMPLETE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'complete';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_Bundled_SDK&amp;diff=3538</id>
		<title>DCR Video Browser Bundled SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_Bundled_SDK&amp;diff=3538"/>
		<updated>2019-03-13T19:13:48Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), [[Digital Ad Ratings]] (DAR), [[Digital Audio]]. Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have an AppID , please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://dayrhesdkp001z.enterprisenet.org/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Everything passed via trackevent() ==&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UNIX timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be passed when the&lt;br /&gt;
content playback is paused.  &lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''assetName''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;MyTest789&amp;quot;&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segB''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment B +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''segC''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom segment C +&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''section''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Unique Value assigned to page/site section &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; HomePage &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; standard episode ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen provided	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetName&amp;quot;:&amp;quot;Big Buck Bunny&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;:&amp;quot;CustomSegmentValueB&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;:&amp;quot;segmentC&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;section&amp;quot;:&amp;quot;cloudApi_app&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
+ '''Custom segments''' (segB and segC) can be used to aggregate video and/or static content within a single Brand to receive more granular reports within a brand.&amp;lt;br&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;86400&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate a very simple video implementation, with a single preroll and single content block.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
  // Setup videojs sample player&lt;br /&gt;
  var nielsenid = document.getElementById(&amp;quot;my-sdkplayer&amp;quot;);&lt;br /&gt;
var coolPlayer = videojs('my-sdkplayer', {&lt;br /&gt;
  controls: true,&lt;br /&gt;
  autoplay: true,&lt;br /&gt;
  preload: 'auto',&lt;br /&gt;
});&lt;br /&gt;
var prevPos = null;&lt;br /&gt;
&lt;br /&gt;
coolPlayer.preroll({&lt;br /&gt;
  src: {&lt;br /&gt;
    src: &amp;quot;assets/CleaningCrew.mp4&amp;quot;,&lt;br /&gt;
    type: &amp;quot;video/mp4&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  href: &amp;quot;http://videojs.com&amp;quot;,&lt;br /&gt;
  adsOptions: {&lt;br /&gt;
    debug: true&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
videojs('my-sdkplayer').ready(function() {&lt;br /&gt;
  // EXAMPLE: Start playing the video.&lt;br /&gt;
&lt;br /&gt;
  coolPlayer.play();&lt;br /&gt;
  var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'content',&lt;br /&gt;
    playheadPosition: '0',&lt;br /&gt;
    metadata: {&lt;br /&gt;
      content: {&lt;br /&gt;
        type: 'content',&lt;br /&gt;
        assetid: 'VID98-2B88',&lt;br /&gt;
        program: 'Put a programname here ',&lt;br /&gt;
        section: 'section name here'&lt;br /&gt;
        title: 'S01E02',&lt;br /&gt;
        length: '180',&lt;br /&gt;
        airdate: '20190101 10:01:00',&lt;br /&gt;
        isfullepisode: 'y',&lt;br /&gt;
        crossId1: 'Standard Episode ID',&lt;br /&gt;
        crossID2: 'Content Originator',&lt;br /&gt;
        adloadtype: '2'&lt;br /&gt;
      },&lt;br /&gt;
      ad: {},&lt;br /&gt;
      static: {}&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  coolPlayer.on('timeupdate', function() {&lt;br /&gt;
    var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
    var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
    if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos) {&lt;br /&gt;
      // check for playhead change so it's only called once per second &lt;br /&gt;
      console.log('PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
      obj.event = 'playhead';&lt;br /&gt;
      obj.type = 'content';&lt;br /&gt;
      obj.metadata.ad = {};&lt;br /&gt;
      prevPos = intPlayedTime;&lt;br /&gt;
      obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
      nSdkInstance.trackEvent(obj);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adstart', function() {&lt;br /&gt;
    console.log('ADSTART EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'ad';&lt;br /&gt;
    obj.metadata.ad = {&lt;br /&gt;
      type: 'preroll',&lt;br /&gt;
      assetid: 'AD9455',&lt;br /&gt;
      adldx: '1',&lt;br /&gt;
      program: 'Cant Skip Campaign',&lt;br /&gt;
      title: 'Cleaning Crew',&lt;br /&gt;
      length: '36',&lt;br /&gt;
    };&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('contentresumed', function() {&lt;br /&gt;
    console.log('CONTENT RESUMED EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'content';&lt;br /&gt;
    obj.event = 'playhead';&lt;br /&gt;
    obj.metadata.ad = {};&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('pause', function() {&lt;br /&gt;
    console.log('PAUSE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'pause';&lt;br /&gt;
    obj.playheadPosition = Math.round(coolPlayer.currentTime());&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adtimeupdate', function() {&lt;br /&gt;
    var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
    var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
    if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos) {&lt;br /&gt;
      // check for playhead change so it's only called once per second &lt;br /&gt;
      console.log('AD PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
      console.log(Math.round(getcurrentTime));&lt;br /&gt;
      prevPos = intPlayedTime;&lt;br /&gt;
      obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
      nSdkInstance.trackEvent(obj);&lt;br /&gt;
    };&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adend', function() {&lt;br /&gt;
    console.log('AD STOP EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'adstop';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('ended', function() {&lt;br /&gt;
    console.log('COMPLETE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'complete';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3537</id>
		<title>Digital Measurement Browser Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3537"/>
		<updated>2019-03-13T19:13:26Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), and [[Digital Ad Ratings]] (DAR). Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have an AppID , please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Everything passed via trackevent() ==&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UNIX timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be passed when the&lt;br /&gt;
content playback is paused.  &lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Gracenote ID or Enterprise ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator or network (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique asset ID for DCR; can be set to &amp;quot;0&amp;quot; for DTVR &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;EP732481&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;86400&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate a very simple video implementation, with a single preroll and single content block.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
  // Setup videojs sample player&lt;br /&gt;
  var nielsenid = document.getElementById(&amp;quot;my-sdkplayer&amp;quot;);&lt;br /&gt;
var coolPlayer = videojs('my-sdkplayer', {&lt;br /&gt;
  controls: true,&lt;br /&gt;
  autoplay: true,&lt;br /&gt;
  preload: 'auto',&lt;br /&gt;
});&lt;br /&gt;
var prevPos = null;&lt;br /&gt;
&lt;br /&gt;
coolPlayer.preroll({&lt;br /&gt;
  src: {&lt;br /&gt;
    src: &amp;quot;assets/CleaningCrew.mp4&amp;quot;,&lt;br /&gt;
    type: &amp;quot;video/mp4&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  href: &amp;quot;http://videojs.com&amp;quot;,&lt;br /&gt;
  adsOptions: {&lt;br /&gt;
    debug: true&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
videojs('my-sdkplayer').ready(function() {&lt;br /&gt;
  // EXAMPLE: Start playing the video.&lt;br /&gt;
&lt;br /&gt;
  coolPlayer.play();&lt;br /&gt;
  var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'content',&lt;br /&gt;
    playheadPosition: '0',&lt;br /&gt;
    metadata: {&lt;br /&gt;
      content: {&lt;br /&gt;
        type: 'content',&lt;br /&gt;
        assetid: 'VID98-2B88',&lt;br /&gt;
        program: 'Put a programname here ',&lt;br /&gt;
        title: 'S01E02',&lt;br /&gt;
        length: '180',&lt;br /&gt;
        airdate: '20190101 10:01:00',&lt;br /&gt;
        isfullepisode: 'y',&lt;br /&gt;
        crossId1: 'Standard Episode ID',&lt;br /&gt;
        crossID2: 'Content Originator',&lt;br /&gt;
        adloadtype: '2'&lt;br /&gt;
      },&lt;br /&gt;
      ad: {},&lt;br /&gt;
      static: {}&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
    coolPlayer.on('timeupdate', function() {&lt;br /&gt;
        var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
        var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
        if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos &amp;amp;&amp;amp; !coolPlayer.scrubbing()) {&lt;br /&gt;
            // check for playhead change so it's only called once per second &lt;br /&gt;
            console.log('PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
            console.log(Math.round(getcurrentTime));&lt;br /&gt;
            obj.event = 'playhead';&lt;br /&gt;
            obj.type = 'content';&lt;br /&gt;
            obj.metadata.ad = {};&lt;br /&gt;
            prevPos = intPlayedTime;&lt;br /&gt;
            obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
            nSdkInstance.trackEvent(obj);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adstart', function() {&lt;br /&gt;
    console.log('ADSTART EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'ad';&lt;br /&gt;
    obj.metadata.ad = {&lt;br /&gt;
      type: 'preroll',&lt;br /&gt;
      assetid: 'AD9455',&lt;br /&gt;
      adldx: '1',&lt;br /&gt;
      program: 'Cant Skip Campaign',&lt;br /&gt;
      title: 'Cleaning Crew',&lt;br /&gt;
      length: '36',&lt;br /&gt;
    };&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('contentresumed', function() {&lt;br /&gt;
    console.log('CONTENT RESUMED EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'content';&lt;br /&gt;
    obj.event = 'playhead';&lt;br /&gt;
    obj.metadata.ad = {};&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('pause', function() {&lt;br /&gt;
    console.log('PAUSE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'pause';&lt;br /&gt;
    obj.playheadPosition = Math.round(coolPlayer.currentTime());&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adtimeupdate', function() {&lt;br /&gt;
    var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
    var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
    if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos) {&lt;br /&gt;
      // check for playhead change so it's only called once per second &lt;br /&gt;
      console.log('AD PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
      console.log(Math.round(getcurrentTime));&lt;br /&gt;
      prevPos = intPlayedTime;&lt;br /&gt;
      obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
      nSdkInstance.trackEvent(obj);&lt;br /&gt;
    };&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adend', function() {&lt;br /&gt;
    console.log('AD STOP EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'adstop';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('ended', function() {&lt;br /&gt;
    console.log('COMPLETE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'complete';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3536</id>
		<title>Digital Measurement Browser Simplified API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Browser_Simplified_API&amp;diff=3536"/>
		<updated>2019-03-13T19:13:11Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen SDK is one of multiple framework SDKs that Nielsen provides to enable measuring linear (live) and on-demand TV viewing using TVs, mobile devices, etc.&lt;br /&gt;
The App SDK is the framework for mobile application developers to integrate Nielsen Measurement into their media player applications. It supports a variety of Nielsen Measurement Products like Digital in TV Ratings, Digital Content Ratings ([[DCR &amp;amp; DTVR]]), and [[Digital Ad Ratings]] (DAR). Nielsen SDKs are also equipped to measure static content and can track key life cycle events of an application like:&lt;br /&gt;
*Application launch events and how long app was running&lt;br /&gt;
*Time of viewing a sub section / page in the application.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the Simplified SDK for Browser, you will need an '''Appid.'''  This is a Unique ID assigned to the player/site and configured by product.&lt;br /&gt;
If you do not have an AppID , please contact our SDK sales support team.&lt;br /&gt;
Refer to [[Digital Measurement Onboarding]] guide for information on how to get a Nielsen App SDK and appid.&lt;br /&gt;
&lt;br /&gt;
== Simplified SDK API ==&lt;br /&gt;
As part of making the SDK more user friendly and reduce the number of app integration touch points, Nielsen has designed a simple interface to pass metadata to the sdk while reducing the number of API calls.  The new &amp;lt;code&amp;gt; trackevent() &amp;lt;/code&amp;gt; API has been implemented as a wrapper for the existing SDK and will be responsible for handling new API calls, performing validation, and translation of new API calls to the existing Nielsen App SDK API methods.  Applications which are already integrated with the existing SDK API, are unaffected by this new API.&lt;br /&gt;
[[File:SimplifiedAPI_vs_StandardAPI_New.jpg|2048px|link=http://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg]]&lt;br /&gt;
[http://engineeringportal.nielsen.com/w/images/9/91/SimplifiedAPI_vs_StandardAPI_New.jpg Click here to zoom in on image]&lt;br /&gt;
&lt;br /&gt;
== Manages the order of metadata (ad vs content and playheads) ==&lt;br /&gt;
Existing API has a number of methods used for reporting player and application state changes to the SDK. Order of calls is important for the SDK in the existing API. In the new enhanced API all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the existing API in separate calls will be provided in one single call. SDK will analyse the data received in the dictionary object, compare it with the data received previously and generate a sequence of calls for the existing API.&lt;br /&gt;
== Everything passed via trackevent() ==&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, UNIX timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be passed when the&lt;br /&gt;
content playback is paused.  &lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DCR and DTVR require various levels of data.  Please select the TAB of the product you are interested in reviewing.&lt;br /&gt;
{{DCRDTVRTabs&lt;br /&gt;
|DCR=&lt;br /&gt;
=== Digital Content Ratings===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object &lt;br /&gt;
that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique ID assigned to asset &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''program''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''title''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;name of program (100 character limit) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''airdate''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; the airdate in the linear TV ++&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; YYYYMMDD HH24:MI:SS &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''isfullepisode''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; full episode flag &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId1'''	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Gracenote ID or Enterprise ID	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''crossId2	'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; content originator or network (only required for distributors)	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; custom	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For USA all times should be EST, for all other countries Local Time.&lt;br /&gt;
Below is a sample event for DCR. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;B66473&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;:&amp;quot;MyProgram&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;S2,E3&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;:&amp;quot;20180120 10:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;:&amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;:&amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot; :&amp;quot;Content Originator&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;2&amp;quot;},&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|DTVR=&lt;br /&gt;
=== Digital TV Ratings info ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,pause,complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;channelName&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Any string representing the.channel/stream&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Below is a sample event for DTVR.  If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;channelname&amp;quot;:&amp;quot;channel1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;quot;ad&amp;quot;: {},&lt;br /&gt;
&amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|DCRDTVR=&lt;br /&gt;
=== Applies to DCR and DTVR ===&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;  Parameter&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Supported values&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; &amp;lt;b&amp;gt;Example&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;event&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Event identifier&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&lt;br /&gt;
playhead,&lt;br /&gt;
pause,&lt;br /&gt;
complete,&lt;br /&gt;
adStop&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;event&amp;quot;:&amp;quot;playhead&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;type&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Determines the metadata object that should be used for crediting.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt; String:&amp;lt;br /&amp;gt;&lt;br /&gt;
content,&lt;br /&gt;
ad,&lt;br /&gt;
static&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;metadata&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds metadata values of specific types&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt; Detailed in tables below&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;playheadPosition&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Playhead value in seconds or Unix timestamp&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Position value is Unix timestamp:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;1543437655&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Position value is playhead:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;:&amp;quot;10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;id3Data&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Nielsen ID3 payload string&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
id3Data: www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg&lt;br /&gt;
==/_EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60&lt;br /&gt;
kZO_Ejkcn2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzC&lt;br /&gt;
yBEoIDv2kA2g1QJmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxa&lt;br /&gt;
hBcQP5tqbjhyMzdVqrMKuvvJO1jhtSXa9AroChb11ZUnG1W&lt;br /&gt;
VJx2O4M=/33648/22847/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;ottData&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Object that holds ott information&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
ottData:{&lt;br /&gt;
ottStatus:1,&lt;br /&gt;
ottType:casting,&lt;br /&gt;
ottDevice:chromecast,&lt;br /&gt;
ottDeviceName:Google ChromeCast,&lt;br /&gt;
ottDeviceID:1234,&lt;br /&gt;
ottDeviceModel:ChromeCast,&lt;br /&gt;
ottDeviceVersion:1.0.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
=== Content Metadata ===&lt;br /&gt;
Content metadata sent for every playheadposition update.&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Keys &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Description &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Example &amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Required&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''assetid''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; unique asset ID for DCR; can be set to &amp;quot;0&amp;quot; for DTVR &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;EP732481&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; '''length''' &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; length of content in seconds &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (86400 for live stream) &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;'''type'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;'content', 'ad', 'static'&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;code&amp;gt; 'content'&amp;lt;/code&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Yes&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adModel&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; linear vs dynamic ad model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;b&amp;gt;adloadtype&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; DCR Ad Model&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; 1=Linear&lt;br /&gt;
2=Dynamic Ads&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;custom&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
++ Acceptable '''Air Date''' Formats:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
YYYYMMDD HH24:MI:SS&lt;br /&gt;
YYYYMMDDHH24MISS&lt;br /&gt;
YYYY-MM-DDTHH:MI:SS&lt;br /&gt;
YYYY-MM-DDHH:MI:SS &lt;br /&gt;
YYYYMMDDHH:MI:SS&lt;br /&gt;
MM-DD-YYYY&lt;br /&gt;
YYYYMMDD HH:MI:SS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Below is a sample event for DCR/DTVR joint integration. If no ad or static values, these can be left as blank/null.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
&amp;quot;metadata&amp;quot;: { &lt;br /&gt;
  &amp;quot;content&amp;quot;:{&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;86400&amp;quot;,&lt;br /&gt;
    &amp;quot;adModel&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;:&amp;quot;1&amp;quot;},&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
  &amp;quot;static&amp;quot;: {}&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;id3Data&amp;quot;: &amp;quot;www.nielsen.com/065H2g6E7ZyQ5UdmMAbbpg==/_&lt;br /&gt;
EMc37zfVgq_8KB7baUYfg==/ADQCAmgV1Xyvnynyg60kZO_Ejkcn&lt;br /&gt;
2KLSrTzyJpZZ-QeRn8GpMGTWI7-HrEKzghxyzCyBEoIDv2kA2g1Q&lt;br /&gt;
JmeYOl5GnwfrLDVK2bNLTbQxr1z9VBfxahBcQP5tqbjhyMzdVqrMK&lt;br /&gt;
uvvJO1jhtSXa9AroChb11ZUnG1WVJx2O4M=/33648/22847/00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata ===&lt;br /&gt;
The ad metadata (if applicable) should be passed for each individual ad, if ads are available during or before the stream begins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Example&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom &amp;lt;br&amp;gt;(no [[Special Characters]])	|| &amp;lt;code&amp;gt;'AD1234'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || unique name assigned to ad || custom ||&amp;lt;code&amp;gt;'ADtitle'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|adldx || Ad Index (*See Note below*) || custom || &amp;lt;code&amp;gt; &amp;quot;66478364&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' || &amp;lt;code&amp;gt;'preroll'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|length || length of ad || In Seconds ||&amp;lt;code&amp;gt; '20' &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
=== Ad Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ad&amp;quot;: {&lt;br /&gt;
    &amp;quot;assetid&amp;quot;:&amp;quot;AD12345&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;:&amp;quot;ADTestTitle&amp;quot;,&lt;br /&gt;
    &amp;quot;adldx&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;type&amp;quot;:&amp;quot;preroll&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;:&amp;quot;20&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Managing Ads ===&lt;br /&gt;
If there is an Ad block within the playing content (such as a midroll) you need to:&lt;br /&gt;
* Reset the playhead position to 0 for each ad.&lt;br /&gt;
* Call the '''adStop''' event at the end of each ad or increment the adldx&lt;br /&gt;
&lt;br /&gt;
The Simplified SDK will can automatically detect the change from ad to content, or even ad to ad if the assetID changes; however, there could be situations where the same ad is played back to back.  You can either increment/change the '''adldx value''', and/or call adStop at the end of each Ad.&lt;br /&gt;
&lt;br /&gt;
Sometimes it is not possible for integrators to provide different assetId value for individual ads in a sequence of ads. Taking this into account the Nielsen Simplified API will support a new parameter for ad metadata: '''adIdx.''' This parameter is just an index of an individual ad in a sequence of ads. Once the next ad is started the '''adIdx''' parameter should be changed and provided as part of ad metadata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot;&amp;gt;&lt;br /&gt;
            // Example of passing both values&lt;br /&gt;
            self.data.updateValue(&amp;quot;adStop&amp;quot;, forKey: &amp;quot;event&amp;quot;)&lt;br /&gt;
            self.data.updateValue(&amp;quot;223&amp;quot;, forKey: &amp;quot;adldx&amp;quot;)&lt;br /&gt;
            self.nielsenEventTracker.trackEvent(data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate a very simple video implementation, with a single preroll and single content block.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
  // Setup videojs sample player&lt;br /&gt;
  var nielsenid = document.getElementById(&amp;quot;my-sdkplayer&amp;quot;);&lt;br /&gt;
var coolPlayer = videojs('my-sdkplayer', {&lt;br /&gt;
  controls: true,&lt;br /&gt;
  autoplay: true,&lt;br /&gt;
  preload: 'auto',&lt;br /&gt;
});&lt;br /&gt;
var prevPos = null;&lt;br /&gt;
&lt;br /&gt;
coolPlayer.preroll({&lt;br /&gt;
  src: {&lt;br /&gt;
    src: &amp;quot;assets/CleaningCrew.mp4&amp;quot;,&lt;br /&gt;
    type: &amp;quot;video/mp4&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  href: &amp;quot;http://videojs.com&amp;quot;,&lt;br /&gt;
  adsOptions: {&lt;br /&gt;
    debug: true&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
videojs('my-sdkplayer').ready(function() {&lt;br /&gt;
  // EXAMPLE: Start playing the video.&lt;br /&gt;
&lt;br /&gt;
  coolPlayer.play();&lt;br /&gt;
  var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'content',&lt;br /&gt;
    playheadPosition: '0',&lt;br /&gt;
    metadata: {&lt;br /&gt;
      content: {&lt;br /&gt;
        type: 'content',&lt;br /&gt;
        assetid: 'VID98-2B88',&lt;br /&gt;
        program: 'Put a programname here ',&lt;br /&gt;
        title: 'S01E02',&lt;br /&gt;
        length: '180',&lt;br /&gt;
        airdate: '20190101 10:01:00',&lt;br /&gt;
        isfullepisode: 'y',&lt;br /&gt;
        crossId1: 'Standard Episode ID',&lt;br /&gt;
        crossID2: 'Content Originator',&lt;br /&gt;
        adloadtype: '2'&lt;br /&gt;
      },&lt;br /&gt;
      ad: {},&lt;br /&gt;
      static: {}&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
    coolPlayer.on('timeupdate', function() {&lt;br /&gt;
        var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
        var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
        if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos &amp;amp;&amp;amp; !coolPlayer.scrubbing()) {&lt;br /&gt;
            // check for playhead change so it's only called once per second &lt;br /&gt;
            console.log('PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
            console.log(Math.round(getcurrentTime));&lt;br /&gt;
            obj.event = 'playhead';&lt;br /&gt;
            obj.type = 'content';&lt;br /&gt;
            obj.metadata.ad = {};&lt;br /&gt;
            prevPos = intPlayedTime;&lt;br /&gt;
            obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
            nSdkInstance.trackEvent(obj);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adstart', function() {&lt;br /&gt;
    console.log('ADSTART EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'ad';&lt;br /&gt;
    obj.metadata.ad = {&lt;br /&gt;
      type: 'preroll',&lt;br /&gt;
      assetid: 'AD9455',&lt;br /&gt;
      adldx: '1',&lt;br /&gt;
      program: 'Cant Skip Campaign',&lt;br /&gt;
      title: 'Cleaning Crew',&lt;br /&gt;
      length: '36',&lt;br /&gt;
    };&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('contentresumed', function() {&lt;br /&gt;
    console.log('CONTENT RESUMED EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'content';&lt;br /&gt;
    obj.event = 'playhead';&lt;br /&gt;
    obj.metadata.ad = {};&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('pause', function() {&lt;br /&gt;
    console.log('PAUSE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'pause';&lt;br /&gt;
    obj.playheadPosition = Math.round(coolPlayer.currentTime());&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adtimeupdate', function() {&lt;br /&gt;
    var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
    var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
    if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos) {&lt;br /&gt;
      // check for playhead change so it's only called once per second &lt;br /&gt;
      console.log('AD PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
      console.log(Math.round(getcurrentTime));&lt;br /&gt;
      prevPos = intPlayedTime;&lt;br /&gt;
      obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
      nSdkInstance.trackEvent(obj);&lt;br /&gt;
    };&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adend', function() {&lt;br /&gt;
    console.log('AD STOP EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'adstop';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('ended', function() {&lt;br /&gt;
    console.log('COMPLETE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'complete';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3535</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3535"/>
		<updated>2019-03-13T19:12:46Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate the code required for static measurement.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
    /***************** Static Queue Snippet *********************/&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][c] = t[n][c] || {&lt;br /&gt;
                        g: o || {},&lt;br /&gt;
                        ggPM: function(e, o, r, s, i) {&lt;br /&gt;
                            (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
                        },&lt;br /&gt;
                        trackEvent: function(e) {&lt;br /&gt;
                            (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][c]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
    &amp;lt;script &amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * SDK Initialization to engtestsite.com domain&lt;br /&gt;
     */&lt;br /&gt;
    // Initialize instance &lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ('P00BEB680-1F1A-47BB-922D-1BXXXXXXXXXX', 'dcrVideoInstance', {&lt;br /&gt;
        containerID: &amp;quot;my-sdkplayer&amp;quot;,&lt;br /&gt;
        nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
var pathArray = window.location.pathname.split('/');&lt;br /&gt;
NURL = pathArray[2];&lt;br /&gt;
&lt;br /&gt;
var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'static',&lt;br /&gt;
    playheadPosition: '',&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;content&amp;quot;: {},&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
        &amp;quot;static&amp;quot;: {&lt;br /&gt;
            type: 'static',&lt;br /&gt;
            section: NURL,&lt;br /&gt;
            assetid: 'AID885-9984',&lt;br /&gt;
            segA: 'NielsenEnt',&lt;br /&gt;
            segB: 'CustomSegB',&lt;br /&gt;
            segC: 'CustomSegC',&lt;br /&gt;
            crossId1: &amp;quot;crossReference11&amp;quot;,&lt;br /&gt;
            reportSuite: &amp;quot;123&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.trackEvent(obj);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3534</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3534"/>
		<updated>2019-03-13T19:12:31Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate the code required for static measurement.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
    /***************** Static Queue Snippet *********************/&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][c] = t[n][c] || {&lt;br /&gt;
                        g: o || {},&lt;br /&gt;
                        ggPM: function(e, o, r, s, i) {&lt;br /&gt;
                            (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
                        },&lt;br /&gt;
                        trackEvent: function(e) {&lt;br /&gt;
                            (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][c]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
    &amp;lt;script &amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * SDK Initialization to engtestsite.com domain&lt;br /&gt;
     */&lt;br /&gt;
    // Initialize instance &lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ('P00BEB680-1F1A-47BB-922D-1BXXXXXXXXXX', 'dcrVideoInstance', {&lt;br /&gt;
        containerID: &amp;quot;my-sdkplayer&amp;quot;,&lt;br /&gt;
        nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
var pathArray = window.location.pathname.split('/');&lt;br /&gt;
NURL = pathArray[2];&lt;br /&gt;
&lt;br /&gt;
var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'static',&lt;br /&gt;
    playheadPosition: '',&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;content&amp;quot;: {},&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
        &amp;quot;static&amp;quot;: {&lt;br /&gt;
            type: 'static',&lt;br /&gt;
            section: NURL,&lt;br /&gt;
            assetid: 'AID885-9984',&lt;br /&gt;
            segA: 'NielsenEnt',&lt;br /&gt;
            segB: 'CustomSegB',&lt;br /&gt;
            segC: 'CustomSegC',&lt;br /&gt;
            crossId1: &amp;quot;crossReference11&amp;quot;,&lt;br /&gt;
            reportSuite: &amp;quot;123&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.trackEvent(obj);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3533</id>
		<title>DCR Video Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3533"/>
		<updated>2019-03-13T19:10:39Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following items are required:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-&lt;br /&gt;
|| ☑ || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Nielsen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
=== Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==== Example SDK Initialization with Viewability ====&lt;br /&gt;
If you decide to implement the Nielsen Viewability Module, the SDK will track the viewability of the targeted player/element, log the viewable percentage and record in seconds the time the player/element was in that viewable state.  The only additional information required is the HTML element ID of the element being tracked (which is passed during SDK Initialization), and the volume level (passed as an event).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If no &amp;quot;volume&amp;quot; event is passed, a default value of '1' will be used. (IE: 100%).  If the volume level is adjusted, the modified value can be passed to the SDK using the standard ggPM() API along with the new &amp;quot;volume&amp;quot; event.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, &amp;lt;volume level&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event Name	!! Event #	!! Purpose !! Possible Values !!Example&lt;br /&gt;
|-&lt;br /&gt;
| volume	|| 61  ||ggPM event that will allow clients to pass in the volume levels.	||Supports decimal values in range from 0 - 1||instance.ggPM(&amp;quot;61&amp;quot;, 0); =&amp;gt; muted&lt;br /&gt;
instance.ggPM(&amp;quot;61&amp;quot;, .5) =&amp;gt; not muted&lt;br /&gt;
intance.ggPM(&amp;quot;61&amp;quot;, 1) =&amp;gt; not muted&lt;br /&gt;
|}&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, 0); // muted&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Metadata Objects ===&lt;br /&gt;
There are two types of asset metadata:&lt;br /&gt;
*content: identify video&lt;br /&gt;
*ad: identify each ad&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. User will need to set up content and ad objects with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
==== Content Metadata ====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| clientid	|| &lt;br /&gt;
parent ID – value is automatically populated through provided App ID.&amp;lt;br/&amp;gt;&lt;br /&gt;
In order to override the brand configured to the App ID, pass parent &amp;lt;br/&amp;gt;&lt;br /&gt;
value here and the sub-brand ID associated to that brand in the subbrand &amp;lt;br/&amp;gt;&lt;br /&gt;
key (e.g. multiple brands in App)	&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| vcid	|| sub-brand ID – value is automatically populated through provided&amp;lt;br/&amp;gt;&lt;br /&gt;
App ID. In order to override the sub-brand configured to the App ID, value can &amp;lt;br/&amp;gt;&lt;br /&gt;
be passed here (e.g. multiple sub-brands in App)&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| type ||	type of asset	|| &amp;quot;content&amp;quot;	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid	|| unique ID assigned to asset 	|| custom&amp;lt;br&amp;gt;(no [[Special Characters]]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program	|| name of program (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| title	|| episode title (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| length	|| length of content in seconds	|| seconds (0 for live stream)||	✓&lt;br /&gt;
|-&lt;br /&gt;
| mediaURL	|| URL location of the content being streamed	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| segB	|| custom segment B	|| custom	||&lt;br /&gt;
|-&lt;br /&gt;
| segC	|| custom segment C	|| custom	 ||&lt;br /&gt;
|-&lt;br /&gt;
| airdate	|| the airdate in the linear TV ||	YYYYMMDD HH:MI:SS	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode	|| full episode flag ||	&lt;br /&gt;
*&amp;quot;y&amp;quot;– full episode&lt;br /&gt;
*&amp;quot;n&amp;quot;– non full episode	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId1	|| standard episode ID	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId2	|| content originator (only required for distributors)	|| Nielsen provided	||&lt;br /&gt;
|-&lt;br /&gt;
|adloadtype	|| type of ad load:&lt;br /&gt;
* 1) Linear – matches TV ad load &lt;br /&gt;
* 2) Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;1&amp;quot; – content with linear ads &lt;br /&gt;
*&amp;quot;2&amp;quot; – content with dynamic ads	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var contentMetadataObject =&lt;br /&gt;
{  &lt;br /&gt;
  type:           'content',&lt;br /&gt;
  assetid:        'VID123-123456',&lt;br /&gt;
  program:        'program name',&lt;br /&gt;
  title:          'episode title',&lt;br /&gt;
  length:         'length in seconds',&lt;br /&gt;
  mediaURL:       'http://www.site.com/videoAsset',&lt;br /&gt;
  segB:           'custom segment B',&lt;br /&gt;
  segC:           'custom segment C',&lt;br /&gt;
  airdate:        'YYYYMMDD HH:MI:SS',&lt;br /&gt;
  isfullepisode:  'y',&lt;br /&gt;
  crossId1:       'Standard Episode ID',&lt;br /&gt;
  crossId2:       'Content Originator',&lt;br /&gt;
  adloadtype:     '2'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Object ===&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Call Nielsen APIs ====&lt;br /&gt;
The method for calling events is ggPM().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('event', parameter, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt Scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== Pause Event ===&lt;br /&gt;
The setPlayheadPostion event is used for handling pause. To indicate pause, stop passing the playhead position to the SDK. Once the content resumes, begin sending the playhead again with the correct playhead value.&lt;br /&gt;
&lt;br /&gt;
=== Other Interrupt Scenarios ===&lt;br /&gt;
The following possible browser interruption scenarios must be handled:&lt;br /&gt;
&lt;br /&gt;
* Browser/Tab close&lt;br /&gt;
* Leaving the page to another destination&lt;br /&gt;
* Pressing the stop button&lt;br /&gt;
&lt;br /&gt;
There are many cases where the player itself has the ability to detect such situations. If not, these interruption scenarios can be handled through JavaScript. The events that are called will depend on the asset being played (e.g. midroll vs. content).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener('beforeunload', function(event) &lt;br /&gt;
{&lt;br /&gt;
  // Only inside a midroll indicate &amp;lt;stop&amp;gt; for the ad&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
  &lt;br /&gt;
  // Indicate &amp;lt;end&amp;gt; and &amp;lt;stop&amp;gt; for the content&lt;br /&gt;
  nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' User may need to add code to support specific browser versions (e.g. older versions of Internet Explorer).&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: || current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'setPlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call when content or ads complete playing and pass playhead position&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK Playhead Event Sequence ==&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject); &lt;br /&gt;
 &lt;br /&gt;
// PREROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', prerollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', midrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// POSTROLL&lt;br /&gt;
nSdkInstance.ggPM('loadmetadata', postrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* 'setPlayheadPosition' is used for calculating duration and must be passed every second. The final playhead position must be sent for the current asset being played before calling 'stop', 'end', or 'loadmetadata'.&lt;br /&gt;
&lt;br /&gt;
* For Ad Pods, events must be called for each individual Ad. Each Ad playhead position should begin at ‘0’ when ad starts.&lt;br /&gt;
&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where previous content segment left off. The playhead position should be passed as a rounded number with no decimals.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { optout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3532</id>
		<title>DCR Video Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3532"/>
		<updated>2019-03-13T19:08:59Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following items are required:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-&lt;br /&gt;
|| ☑ || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Nielsen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
=== Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==== Example SDK Initialization with Viewability ====&lt;br /&gt;
If you decide to implement the Nielsen Viewability Module, the SDK will track the viewability of the targeted player/element, log the viewable percentage and record in seconds the time the player/element was in that viewable state.  The only additional information required is the HTML element ID of the element being tracked (which is passed during SDK Initialization), and the volume level (passed as an event).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If no &amp;quot;volume&amp;quot; event is passed, a default value of '1' will be used. (IE: 100%).  If the volume level is adjusted, the modified value can be passed to the SDK using the standard ggPM() API along with the new &amp;quot;volume&amp;quot; event.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, &amp;lt;volume level&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event Name	!! Event #	!! Purpose !! Possible Values !!Example&lt;br /&gt;
|-&lt;br /&gt;
| volume	|| 61  ||ggPM event that will allow clients to pass in the volume levels.	||Supports decimal values in range from 0 - 1||instance.ggPM(&amp;quot;61&amp;quot;, 0); =&amp;gt; muted&lt;br /&gt;
instance.ggPM(&amp;quot;61&amp;quot;, .5) =&amp;gt; not muted&lt;br /&gt;
intance.ggPM(&amp;quot;61&amp;quot;, 1) =&amp;gt; not muted&lt;br /&gt;
|}&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, 0); // muted&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Metadata Objects ===&lt;br /&gt;
There are two types of asset metadata:&lt;br /&gt;
*content: identify video&lt;br /&gt;
*ad: identify each ad&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. User will need to set up content and ad objects with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
==== Content Metadata ====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| clientid	|| &lt;br /&gt;
parent ID – value is automatically populated through provided App ID.&amp;lt;br/&amp;gt;&lt;br /&gt;
In order to override the brand configured to the App ID, pass parent &amp;lt;br/&amp;gt;&lt;br /&gt;
value here and the sub-brand ID associated to that brand in the subbrand &amp;lt;br/&amp;gt;&lt;br /&gt;
key (e.g. multiple brands in App)	&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| vcid	|| sub-brand ID – value is automatically populated through provided&amp;lt;br/&amp;gt;&lt;br /&gt;
App ID. In order to override the sub-brand configured to the App ID, value can &amp;lt;br/&amp;gt;&lt;br /&gt;
be passed here (e.g. multiple sub-brands in App)&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| type ||	type of asset	|| &amp;quot;content&amp;quot;	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid	|| unique ID assigned to asset 	|| custom&amp;lt;br&amp;gt;(no [[Special Characters]]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program	|| name of program (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| title	|| episode title (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| length	|| length of content in seconds	|| seconds (0 for live stream)||	✓&lt;br /&gt;
|-&lt;br /&gt;
| mediaURL	|| URL location of the content being streamed	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| segB	|| custom segment B	|| custom	||&lt;br /&gt;
|-&lt;br /&gt;
| segC	|| custom segment C	|| custom	 ||&lt;br /&gt;
|-&lt;br /&gt;
| airdate	|| the airdate in the linear TV ||	YYYYMMDD HH:MI:SS	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode	|| full episode flag ||	&lt;br /&gt;
*&amp;quot;y&amp;quot;– full episode&lt;br /&gt;
*&amp;quot;n&amp;quot;– non full episode	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId1	|| standard episode ID	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId2	|| content originator (only required for distributors)	|| Nielsen provided	||&lt;br /&gt;
|-&lt;br /&gt;
|adloadtype	|| type of ad load:&lt;br /&gt;
* 1) Linear – matches TV ad load &lt;br /&gt;
* 2) Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;1&amp;quot; – content with linear ads &lt;br /&gt;
*&amp;quot;2&amp;quot; – content with dynamic ads	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var contentMetadataObject =&lt;br /&gt;
{  &lt;br /&gt;
  type:           'content',&lt;br /&gt;
  assetid:        'VID123-123456',&lt;br /&gt;
  program:        'program name',&lt;br /&gt;
  title:          'episode title',&lt;br /&gt;
  length:         'length in seconds',&lt;br /&gt;
  mediaURL:       'http://www.site.com/videoAsset',&lt;br /&gt;
  segB:           'custom segment B',&lt;br /&gt;
  segC:           'custom segment C',&lt;br /&gt;
  airdate:        'YYYYMMDD HH:MI:SS',&lt;br /&gt;
  isfullepisode:  'y',&lt;br /&gt;
  crossId1:       'Standard Episode ID',&lt;br /&gt;
  crossId2:       'Content Originator',&lt;br /&gt;
  adloadtype:     '2'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Object ===&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Call Nielsen APIs ====&lt;br /&gt;
The method for calling events is ggPM().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('event', parameter, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt Scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== Pause Event ===&lt;br /&gt;
The setPlayheadPostion event is used for handling pause. To indicate pause, stop passing the playhead position to the SDK. Once the content resumes, begin sending the playhead again with the correct playhead value.&lt;br /&gt;
&lt;br /&gt;
=== Other Interrupt Scenarios ===&lt;br /&gt;
The following possible browser interruption scenarios must be handled:&lt;br /&gt;
&lt;br /&gt;
* Browser/Tab close&lt;br /&gt;
* Leaving the page to another destination&lt;br /&gt;
* Pressing the stop button&lt;br /&gt;
&lt;br /&gt;
There are many cases where the player itself has the ability to detect such situations. If not, these interruption scenarios can be handled through JavaScript. The events that are called will depend on the asset being played (e.g. midroll vs. content).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener('beforeunload', function(event) &lt;br /&gt;
{&lt;br /&gt;
  // Only inside a midroll indicate &amp;lt;stop&amp;gt; for the ad&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
  &lt;br /&gt;
  // Indicate &amp;lt;end&amp;gt; and &amp;lt;stop&amp;gt; for the content&lt;br /&gt;
  nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' User may need to add code to support specific browser versions (e.g. older versions of Internet Explorer).&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: || current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'setPlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call when content or ads complete playing and pass playhead position&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK Playhead Event Sequence ==&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject); &lt;br /&gt;
 &lt;br /&gt;
// PREROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', prerollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', midrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// POSTROLL&lt;br /&gt;
nSdkInstance.ggPM('loadmetadata', postrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* 'setPlayheadPosition' is used for calculating duration and must be passed every second. The final playhead position must be sent for the current asset being played before calling 'stop', 'end', or 'loadmetadata'.&lt;br /&gt;
&lt;br /&gt;
* For Ad Pods, events must be called for each individual Ad. Each Ad playhead position should begin at ‘0’ when ad starts.&lt;br /&gt;
&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where previous content segment left off. The playhead position should be passed as a rounded number with no decimals.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3531</id>
		<title>DCR Video Browser SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Browser_SDK&amp;diff=3531"/>
		<updated>2019-03-13T19:08:39Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To start using the App SDK, the following items are required:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 30px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 15%;&amp;quot; | Item&lt;br /&gt;
! Description&lt;br /&gt;
! Source&lt;br /&gt;
|-&lt;br /&gt;
|| ☑ || '''App ID (appid)''' || Unique ID assigned to the player/site and configured by product. || Contact Nielsen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
=== Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==== Example SDK Initialization with Viewability ====&lt;br /&gt;
If you decide to implement the Nielsen Viewability Module, the SDK will track the viewability of the targeted player/element, log the viewable percentage and record in seconds the time the player/element was in that viewable state.  The only additional information required is the HTML element ID of the element being tracked (which is passed during SDK Initialization), and the volume level (passed as an event).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If no &amp;quot;volume&amp;quot; event is passed, a default value of '1' will be used. (IE: 100%).  If the volume level is adjusted, the modified value can be passed to the SDK using the standard ggPM() API along with the new &amp;quot;volume&amp;quot; event.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, &amp;lt;volume level&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event Name	!! Event #	!! Purpose !! Possible Values !!Example&lt;br /&gt;
|-&lt;br /&gt;
| volume	|| 61  ||ggPM event that will allow clients to pass in the volume levels.	||Supports decimal values in range from 0 - 1||instance.ggPM(&amp;quot;61&amp;quot;, 0); =&amp;gt; muted&lt;br /&gt;
instance.ggPM(&amp;quot;61&amp;quot;, .5) =&amp;gt; not muted&lt;br /&gt;
intance.ggPM(&amp;quot;61&amp;quot;, 1) =&amp;gt; not muted&lt;br /&gt;
|}&lt;br /&gt;
Sample:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM(&amp;quot;volume&amp;quot;, 0); // muted&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  // Add Static Queue Snippet&lt;br /&gt;
 !function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Metadata Objects ===&lt;br /&gt;
There are two types of asset metadata:&lt;br /&gt;
*content: identify video&lt;br /&gt;
*ad: identify each ad&lt;br /&gt;
&lt;br /&gt;
The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
Metadata can be passed through key-values using the Nielsen reserved keys. User will need to set up content and ad objects with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
==== Content Metadata ====&lt;br /&gt;
Content metadata should remain constant throughout the completion of an episode / clip including the ads play.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !!	Values	 !! Required&lt;br /&gt;
|-&lt;br /&gt;
| clientid	|| &lt;br /&gt;
parent ID – value is automatically populated through provided App ID.&amp;lt;br/&amp;gt;&lt;br /&gt;
In order to override the brand configured to the App ID, pass parent &amp;lt;br/&amp;gt;&lt;br /&gt;
value here and the sub-brand ID associated to that brand in the subbrand &amp;lt;br/&amp;gt;&lt;br /&gt;
key (e.g. multiple brands in App)	&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| vcid	|| sub-brand ID – value is automatically populated through provided&amp;lt;br/&amp;gt;&lt;br /&gt;
App ID. In order to override the sub-brand configured to the App ID, value can &amp;lt;br/&amp;gt;&lt;br /&gt;
be passed here (e.g. multiple sub-brands in App)&lt;br /&gt;
||&lt;br /&gt;
Nielsen provided	&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| type ||	type of asset	|| &amp;quot;content&amp;quot;	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid	|| unique ID assigned to asset 	|| custom&amp;lt;br&amp;gt;(no [[Special Characters]]) || ✓&lt;br /&gt;
|-&lt;br /&gt;
| program	|| name of program (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| title	|| episode title (100 character limit)	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| length	|| length of content in seconds	|| seconds (0 for live stream)||	✓&lt;br /&gt;
|-&lt;br /&gt;
| mediaURL	|| URL location of the content being streamed	|| custom	|| &lt;br /&gt;
|-&lt;br /&gt;
| segB	|| custom segment B	|| custom	||&lt;br /&gt;
|-&lt;br /&gt;
| segC	|| custom segment C	|| custom	 ||&lt;br /&gt;
|-&lt;br /&gt;
| airdate	|| the airdate in the linear TV ||	YYYYMMDD HH:MI:SS	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode	|| full episode flag ||	&lt;br /&gt;
*&amp;quot;y&amp;quot;– full episode&lt;br /&gt;
*&amp;quot;n&amp;quot;– non full episode	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId1	|| standard episode ID	|| custom	|| ✓&lt;br /&gt;
|-&lt;br /&gt;
| crossId2	|| content originator (only required for distributors)	|| Nielsen provided	||&lt;br /&gt;
|-&lt;br /&gt;
|adloadtype	|| type of ad load:&lt;br /&gt;
* 1) Linear – matches TV ad load &lt;br /&gt;
* 2) Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
||&lt;br /&gt;
*&amp;quot;1&amp;quot; – content with linear ads &lt;br /&gt;
*&amp;quot;2&amp;quot; – content with dynamic ads	&lt;br /&gt;
||&lt;br /&gt;
✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Content Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var contentMetadataObject =&lt;br /&gt;
{  &lt;br /&gt;
  type:           'content',&lt;br /&gt;
  assetid:        'VID123-123456',&lt;br /&gt;
  program:        'program name',&lt;br /&gt;
  title:          'episode title',&lt;br /&gt;
  length:         'length in seconds',&lt;br /&gt;
  mediaURL:       'http://www.site.com/videoAsset',&lt;br /&gt;
  segB:           'custom segment B',&lt;br /&gt;
  segC:           'custom segment C',&lt;br /&gt;
  airdate:        'YYYYMMDD HH:MI:SS',&lt;br /&gt;
  isfullepisode:  'y',&lt;br /&gt;
  crossId1:       'Standard Episode ID',&lt;br /&gt;
  crossId2:       'Content Originator',&lt;br /&gt;
  adloadtype:     '2'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad Metadata Object ===&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys	!! Description	!! Values	!! Required&lt;br /&gt;
|-&lt;br /&gt;
| type	|| type of ad	|| 'preroll', 'midroll', or 'postroll' ||	✓&lt;br /&gt;
|-&lt;br /&gt;
| assetid ||	unique ID assigned to ad	|| custom	|| ✓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Ad Object ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var adMetadataObject = &lt;br /&gt;
{  &lt;br /&gt;
  assetid: 'AD-1',&lt;br /&gt;
  type:    'preroll'&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt; URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Call Nielsen APIs ====&lt;br /&gt;
The method for calling events is ggPM().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
nSdkInstance.ggPM('event', parameter, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupt Scenarios ==&lt;br /&gt;
&lt;br /&gt;
=== Pause Event ===&lt;br /&gt;
The setPlayheadPostion event is used for handling pause. To indicate pause, stop passing the playhead position to the SDK. Once the content resumes, begin sending the playhead again with the correct playhead value.&lt;br /&gt;
&lt;br /&gt;
=== Other Interrupt Scenarios ===&lt;br /&gt;
The following possible browser interruption scenarios must be handled:&lt;br /&gt;
&lt;br /&gt;
* Browser/Tab close&lt;br /&gt;
* Leaving the page to another destination&lt;br /&gt;
* Pressing the stop button&lt;br /&gt;
&lt;br /&gt;
There are many cases where the player itself has the ability to detect such situations. If not, these interruption scenarios can be handled through JavaScript. The events that are called will depend on the asset being played (e.g. midroll vs. content).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener('beforeunload', function(event) &lt;br /&gt;
{&lt;br /&gt;
  // Only inside a midroll indicate &amp;lt;stop&amp;gt; for the ad&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
  &lt;br /&gt;
  // Indicate &amp;lt;end&amp;gt; and &amp;lt;stop&amp;gt; for the content&lt;br /&gt;
  nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
  nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note:''' User may need to add code to support specific browser versions (e.g. older versions of Internet Explorer).&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Events ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !!	Parameter	!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 'loadMetadata'	|| content/ad metadata object	|| Needs to be called at the beginning of each asset&lt;br /&gt;
|-&lt;br /&gt;
| 'setPlayheadPosition'	|| playhead position as integer&amp;lt;br/&amp;gt;&lt;br /&gt;
VOD: || current position in seconds &amp;lt;br/&amp;gt;&lt;br /&gt;
Live: current Unix timestamp (seconds since Jan-1-1970 UTC) &amp;lt;br/&amp;gt;&lt;br /&gt;
Note: 'setPlayheadPosition' has to be called every second&lt;br /&gt;
||&lt;br /&gt;
Pass playhead position every second during playback&lt;br /&gt;
|-&lt;br /&gt;
| 'stop' ||	playhead position	|| Call when content or ads complete playing and pass playhead position&lt;br /&gt;
|-&lt;br /&gt;
| 'end'	|| playhead position in seconds	|| Call when the current video asset completes playback and pass the playhead position. &amp;lt;br/&amp;gt;&lt;br /&gt;
Example: At the end of the content stream, if the user switches to another piece of content, when the browser is refreshed or closed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK Playhead Event Sequence ==&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// START OF STREAM&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject); &lt;br /&gt;
 &lt;br /&gt;
// PREROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', prerollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', midrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// CONTENT&lt;br /&gt;
nSdkInstance.ggPM('loadMetadata', contentMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('end', playheadPosition);&lt;br /&gt;
 &lt;br /&gt;
// POSTROLL&lt;br /&gt;
nSdkInstance.ggPM('loadmetadata', postrollMetadataObject);&lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
//  &lt;br /&gt;
//   pass playhead every second&lt;br /&gt;
//   &lt;br /&gt;
nSdkInstance.ggPM('setPlayheadPosition', playheadPosition);&lt;br /&gt;
nSdkInstance.ggPM('stop', playheadPosition);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* 'setPlayheadPosition' is used for calculating duration and must be passed every second. The final playhead position must be sent for the current asset being played before calling 'stop', 'end', or 'loadmetadata'.&lt;br /&gt;
&lt;br /&gt;
* For Ad Pods, events must be called for each individual Ad. Each Ad playhead position should begin at ‘0’ when ad starts.&lt;br /&gt;
&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where previous content segment left off. The playhead position should be passed as a rounded number with no decimals.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Template:Browser_Privacy_and_Opt-Out&amp;diff=3530</id>
		<title>Template:Browser Privacy and Opt-Out</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Template:Browser_Privacy_and_Opt-Out&amp;diff=3530"/>
		<updated>2019-03-13T18:59:15Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# [[#User Opt Out|User Opt Out]] - Provide a link to the Nielsen Privacy Policy page when a User can make their selection&lt;br /&gt;
# [[#Initialization Opt Out|Initialization Opt Out]] - Global OptOut Parameter&lt;br /&gt;
&lt;br /&gt;
=== User Opt Out === &lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the User Opt-Out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player (or page in relation to static measurement) includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to receive an opt-out cookie.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Once users have opted out via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=total&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link], their browser cookies will contain the value '''TOTAL_OPTOUT'''. This will prevent a redirect to our data provider from occurring&lt;br /&gt;
* Users can opt back in via this [http://server-us.imrworldwide.com/cgi-bin/o?oo=cancel&amp;amp;tu=http://www.nielsen.com/content/corporate/policy/en/cookie-policy.html link].  When a user selects that link, their opt-out cookie will be deleted and they will be able to be measured moving forward.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The following paragraph is a template for a Privacy Statement.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://priv-policy.imrworldwide.com/priv/browser/us/en/optout.html&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== User Opt Back In ====&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, their opt-out cookie will be deleted and they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
=== Initialization Opt Out ===&lt;br /&gt;
The BSDK600 now supports the ability to optout on initialization of the SDK by allowing an optout global parameter to be passed.  This optout will be maintained through the session of the SDK instance. Specifications and limitations are specified below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Supported Values&lt;br /&gt;
! Notes&lt;br /&gt;
! Optout&lt;br /&gt;
|-&lt;br /&gt;
||optout||True, Yes, or 1|| Case is insensitive and can be string or bool&lt;br /&gt;
Example: nlsQ(&amp;quot;XXXXXXXX-BH45-JKY6-BKH7-67GJKY68GJK7&amp;quot;, &amp;quot;myInstance&amp;quot;, { optout: true});&lt;br /&gt;
|| Ping parameter will set uoo=true.&lt;br /&gt;
|-&lt;br /&gt;
||optout|| False, No, or 0 || Case is insensitive and can be string or bool&lt;br /&gt;
Example: nlsQ(&amp;quot;XXXXXXXX-BH45-JKY6-BKH7-67GJKY68GJK7&amp;quot;, &amp;quot;myInstance&amp;quot;, { optout: false});&lt;br /&gt;
|| Ping parameter will set uoo to blank.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
==== Example of using OptOut ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Artifactory_Guide&amp;diff=3529</id>
		<title>Digital Measurement iOS Artifactory Guide</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_iOS_Artifactory_Guide&amp;diff=3529"/>
		<updated>2019-03-13T18:57:35Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
&lt;br /&gt;
= How to install Nielsen SDK in iOS  =&lt;br /&gt;
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 30 thousand libraries and is used in over 1.9 million apps. The Nielsen SDK now uses this distribution framework for improved version management and provides a Static and Dynamic Framework.&lt;br /&gt;
&lt;br /&gt;
== Initial Configuration ==&lt;br /&gt;
The Nielsen SDK integration requires Cocoapods.  &lt;br /&gt;
* The Dynamic Framework which requires Cocoapods Version 1.6.1 or higher.&lt;br /&gt;
* The Static Framework requires Cocoapods version 1.4.0. or higher.&lt;br /&gt;
&lt;br /&gt;
The full installation guide for this framework is provided on the [https://guides.cocoapods.org/using/getting-started.html Getting Started] page, and how to set up the Podfile is mentioned in [https://guides.cocoapods.org/using/using-cocoapods.html Using Cocoapods] page.&lt;br /&gt;
&lt;br /&gt;
== Repository Credentials ==&lt;br /&gt;
The first step is to add the credentials received from Nielsen into your .netrc file.&lt;br /&gt;
Navigate to your home folder and create a file called .netrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
cd ~/&lt;br /&gt;
vi .netrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Within this file you need to add your credentials in the following format:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
machine raw.githubusercontent.com&lt;br /&gt;
login &amp;lt;Nielsen App SDK client&amp;gt;&lt;br /&gt;
password &amp;lt;Auth token&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Credentials ===&lt;br /&gt;
Obtain credentials '''[[Digital Downloads| → here ←]]'''&lt;br /&gt;
&lt;br /&gt;
== Verify version of Cocoapods ==&lt;br /&gt;
First verify that Cocoapods is installed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If it is not, then install.&amp;lt;br &amp;gt;&lt;br /&gt;
===== Install via gem =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
sudo gem install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Install using homebrew ===== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
brew install cocoapods&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Add Cocoapod repository ==&lt;br /&gt;
=== Dynamic Framework (Cocoapods 1.6.1+) ===&lt;br /&gt;
If using '''Dynamic Framework''' (preferred approach), from the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs-dynamic.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
 use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For Static Framework (Cocoapods 1.4+) ===&lt;br /&gt;
From the command line, type the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod repo add NielsenAppSDK https://github.com/nielsendigitalsdk/nielsenappsdk-ios-specs.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure you run the pod init command in your **project's directory.**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
pod init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You now need to slightly modify the PodFile that was created in this directory.  From the command line, you can use vi or vim to edit. &amp;lt;br&amp;gt; The following must be in the PodFile:&lt;br /&gt;
==== Podfile ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Javascript&amp;gt;&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== For Cocoapods Versions &amp;lt; 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
If you are using a version of Cocoapods that is less than 1.6.0, you have a Swift Project and your pod has '''use_frameworks!''' please use the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
# Uncomment the next line to define a global platform for your project&lt;br /&gt;
platform :ios, '8.0'&lt;br /&gt;
source 'https://github.com/NielsenDigitalSDK/nielsenappsdk-ios-specs.git'&lt;br /&gt;
&lt;br /&gt;
target 'YourProjectsNameHere' do&lt;br /&gt;
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks&lt;br /&gt;
use_frameworks!&lt;br /&gt;
    #Pods for ApplicationTarget&lt;br /&gt;
    pod 'NielsenAppSDK'&lt;br /&gt;
&lt;br /&gt;
static_frameworks = ['NielsenAppSDK']&lt;br /&gt;
# make all the other frameworks into static frameworks by overriding the static_framework? function to return true&lt;br /&gt;
pre_install do |installer|&lt;br /&gt;
    installer.pod_targets.each do |pod|&lt;br /&gt;
        if static_frameworks.include?(pod.name)&lt;br /&gt;
            puts &amp;quot;Overriding the static_framework? method for #{pod.name}&amp;quot;&lt;br /&gt;
            def pod.static_framework?;&lt;br /&gt;
            true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Execute Install ==&lt;br /&gt;
Once that has been edited, you can now execute the install:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
pod install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Cocoapods will automatically create a new file with extension “.xcworkspace”. From this moment, that file should be used for using the target project instead of previous one with extension “.xcodeproj”. Inside of this workspace you will see “Pods” target which will include ready to use NielsenAppApi framework.&lt;br /&gt;
&lt;br /&gt;
Open the file with the extension of &amp;lt;code&amp;gt;.xcworkspace&amp;lt;/code&amp;gt; file using Xcode.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Build Notes ==&lt;br /&gt;
Please note that the Nielsen dynamic framework contains slices for devices and simulators.  When building your project it is recommended that Simulator slices are removed before sending the app to the AppStore.   An example of the shell script that should be added as a Run Script phase in the application is attached&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Swift&amp;gt;&lt;br /&gt;
APP_PATH=&amp;quot;${TARGET_BUILD_DIR}/${WRAPPER_NAME}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# This script loops through the frameworks embedded in the application and&lt;br /&gt;
# removes unused architectures.&lt;br /&gt;
find &amp;quot;$APP_PATH&amp;quot; -name '*.framework' -type d | while read -r FRAMEWORK&lt;br /&gt;
do&lt;br /&gt;
FRAMEWORK_EXECUTABLE_NAME=$(defaults read &amp;quot;$FRAMEWORK/Info.plist&amp;quot; CFBundleExecutable)&lt;br /&gt;
FRAMEWORK_EXECUTABLE_PATH=&amp;quot;$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
echo &amp;quot;Executable is $FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EXTRACTED_ARCHS=()&lt;br /&gt;
&lt;br /&gt;
for ARCH in $ARCHS&lt;br /&gt;
do&lt;br /&gt;
echo &amp;quot;Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME&amp;quot;&lt;br /&gt;
lipo -extract &amp;quot;$ARCH&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot; -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;&lt;br /&gt;
EXTRACTED_ARCHS+=(&amp;quot;$FRAMEWORK_EXECUTABLE_PATH-$ARCH&amp;quot;)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Merging extracted architectures: ${ARCHS}&amp;quot;&lt;br /&gt;
lipo -o &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; -create &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
rm &amp;quot;${EXTRACTED_ARCHS[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Replacing original executable with thinned version&amp;quot;&lt;br /&gt;
rm &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
mv &amp;quot;$FRAMEWORK_EXECUTABLE_PATH-merged&amp;quot; &amp;quot;$FRAMEWORK_EXECUTABLE_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pod Versions ==&lt;br /&gt;
The following Pod versions are now available:&lt;br /&gt;
* NielsenAppSDK&lt;br /&gt;
* NielsenTVOSAppSDK &lt;br /&gt;
* VRIAppSDK &lt;br /&gt;
&lt;br /&gt;
=== Regional Builds ===&lt;br /&gt;
* NielsenAGFAppSDK&lt;br /&gt;
*  NielsenAGFTVOSAppSDK&lt;br /&gt;
* NielsenAGFNoAdAppSDK&lt;br /&gt;
*  NielsenAGFNoAdTVOSAppSDK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Additional Resources ===&lt;br /&gt;
&lt;br /&gt;
For more information on [https://guides.cocoapods.org/using/getting-started.html) CocoaPods] or How to set up the Profile in the [https://guides.cocoapods.org/using/using-cocoapods.html) Using Cocoapods] page.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_%26_DTVR&amp;diff=3525</id>
		<title>DCR &amp; DTVR</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_%26_DTVR&amp;diff=3525"/>
		<updated>2019-03-08T00:37:17Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
{{CategoryIcon|DCR.png|Digital Content Ratings (DCR) &amp;amp; Digital in TV Ratings (DTVR)}}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 42%;&amp;quot; | General Reference&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | {{SmallIcon|DigitalIcon.png}}&lt;br /&gt;
| '''[[Digital Measurement Onboarding]]'''&lt;br /&gt;
| '''[[Digital Measurement Metadata]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement Testing]]'''&lt;br /&gt;
| '''[[Digital Measurement Interruption Scenarios]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Measurement FAQ]]'''&lt;br /&gt;
| '''[[Implementing Viewability with AppSDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist App SDK]]'''&lt;br /&gt;
| '''[[Digital Pre-Certification Checklist Browser SDK]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Digital Measurement - Simplified SDK ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | On-boarding a brand new app or website with ''DCR'', ''DTVR'', ''DAR'', ''Digital Audio'', ''Video'' or ''Static''? Try the new, simple integration options below.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[Digital Measurement iOS Simplified SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[Digital Measurement Android Simplified SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
|[[Digital Measurement Browser Simplified SDK|'''Digital Measurement Browser Simplified Content Measurement''']]&amp;lt;br&amp;gt;[[Browser Simplified SDK Static Metadata|'''Digital Measurement Browser Simplified Static Measurement''']]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|'''[[Digital Measurement Simplified SDK Supplements]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Video ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Maintaining an existing ''DCR'' or ''DTVR'' App integration? Continue to reference the API you're already using with the guides below.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 30%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
! style=&amp;quot;width: 25%;&amp;quot; | DTVR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Video iOS SDK]]'''&lt;br /&gt;
| '''[[DTVR iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Video Android SDK]]'''&lt;br /&gt;
| '''[[DTVR Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Video Browser SDK]]'''&lt;br /&gt;
| '''[[DTVR Browser SDK]]'''&lt;br /&gt;
| [[Browser SDK API Reference]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SDK - Static ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
! style=&amp;quot;width: 55%;&amp;quot; | DCR Implementation Guide&lt;br /&gt;
!| SDK Documentation&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | {{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR Static iOS SDK]]'''&lt;br /&gt;
| [[iOS SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR Static Android SDK]]'''&lt;br /&gt;
| [[Android SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR Static Browser SDK]]'''&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | [[Browser SDK API Reference]]&lt;br /&gt;
|-&lt;br /&gt;
| '''[[DCR Static Lite Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|GoogleTagManagerIcon.png|alt=Google Tag Manager}}&lt;br /&gt;
| '''[[DCR Static Google Tag Manager]]'''&lt;br /&gt;
|-&lt;br /&gt;
|  {{OSIcon|FacebookIcon.png|alt=Facebook Instant Articles}}&lt;br /&gt;
| '''[[DCR Static Facebook Instant Articles Browser SDK]]'''&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|  {{OSIcon|AMPIcon.png|alt=Google AMP}}&lt;br /&gt;
| '''[[DCR Static Google AMP Cloud API]]'''&lt;br /&gt;
| N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cloud API ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| DCR Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{SmallIcon|CloudAPIIcon.png|alt=Cloud API}} &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |&lt;br /&gt;
{{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{OSIcon|StaticIcon.png|alt=Static Content}}&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Cloud API ]]''' &lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|APIIcon.png|alt=Cloud API}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Mobile Cloud API ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|RokuIcon.png|alt=Roku}}&lt;br /&gt;
| '''[[DCR Video &amp;amp; Static Roku Cloud API]]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Adobe Launch Extensions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; | Leverage Launch by Adobe? The guides below describe how to integrate DCR and DTVR with Nielsen's Adobe Launch extension&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 90px;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS&lt;br /&gt;
!| Implementation Guide&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | {{SmallIcon|SDKIcon.png|alt=SDK}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | '''[[Digital Measurement Onboarding Adobe ]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | {{OSIcon|VideoIcon.png|alt=Video}}&lt;br /&gt;
| {{OSIcon|macOSIcon.png|alt=iOS}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR iOS Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|AndroidIcon.png|alt=Android}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Android Adobe Launch Extension]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{OSIcon|BrowserIcon.png|alt=Browser}}&lt;br /&gt;
| '''[[DCR &amp;amp; DTVR Browser Adobe Launch Extension]]'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3524</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3524"/>
		<updated>2019-03-08T00:25:49Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate the code required for static measurement.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
    /***************** Static Queue Snippet *********************/&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][c] = t[n][c] || {&lt;br /&gt;
                        g: o || {},&lt;br /&gt;
                        ggPM: function(e, o, r, s, i) {&lt;br /&gt;
                            (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
                        },&lt;br /&gt;
                        trackEvent: function(e) {&lt;br /&gt;
                            (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][c]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
    &amp;lt;script &amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * SDK Initialization to engtestsite.com domain&lt;br /&gt;
     */&lt;br /&gt;
    // Initialize instance &lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ('P00BEB680-1F1A-47BB-922D-1BXXXXXXXXXX', 'dcrVideoInstance', {&lt;br /&gt;
        containerID: &amp;quot;my-sdkplayer&amp;quot;,&lt;br /&gt;
        nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
var pathArray = window.location.pathname.split('/');&lt;br /&gt;
NURL = pathArray[2];&lt;br /&gt;
&lt;br /&gt;
var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'static',&lt;br /&gt;
    playheadPosition: '',&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;content&amp;quot;: {},&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
        &amp;quot;static&amp;quot;: {&lt;br /&gt;
            type: 'static',&lt;br /&gt;
            section: NURL,&lt;br /&gt;
            assetid: 'AID885-9984',&lt;br /&gt;
            segA: 'NielsenEnt',&lt;br /&gt;
            segB: 'CustomSegB',&lt;br /&gt;
            segC: 'CustomSegC',&lt;br /&gt;
            crossId1: &amp;quot;crossReference11&amp;quot;,&lt;br /&gt;
            reportSuite: &amp;quot;123&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.trackEvent(obj);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3523</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3523"/>
		<updated>2019-03-08T00:25:12Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate the code required for static measurement.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
    /***************** Static Queue Snippet *********************/&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][c] = t[n][c] || {&lt;br /&gt;
                        g: o || {},&lt;br /&gt;
                        ggPM: function(e, o, r, s, i) {&lt;br /&gt;
                            (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
                        },&lt;br /&gt;
                        trackEvent: function(e) {&lt;br /&gt;
                            (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][c]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
    &amp;lt;script &amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * SDK Initialization to engtestsite.com domain&lt;br /&gt;
     */&lt;br /&gt;
    // Initialize instance &lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ('P00BEB680-1F1A-47BB-922D-1BXXXXXXXXXX', 'dcrVideoInstance', {&lt;br /&gt;
        containerID: &amp;quot;my-sdkplayer&amp;quot;,&lt;br /&gt;
        nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
var pathArray = window.location.pathname.split('/');&lt;br /&gt;
NURL = pathArray[2];&lt;br /&gt;
&lt;br /&gt;
var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'static',&lt;br /&gt;
    playheadPosition: '',&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;content&amp;quot;: {},&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
        &amp;quot;static&amp;quot;: {&lt;br /&gt;
            type: 'static',&lt;br /&gt;
            section: NURL,&lt;br /&gt;
            assetid: 'AID885-9984',&lt;br /&gt;
            segA: 'NielsenEnt',&lt;br /&gt;
            segB: 'CustomSegB',&lt;br /&gt;
            segC: 'CustomSegC',&lt;br /&gt;
            crossId1: &amp;quot;crossReference11&amp;quot;,&lt;br /&gt;
            reportSuite: &amp;quot;123&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.trackEvent(obj);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3522</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3522"/>
		<updated>2019-03-08T00:24:35Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate a very simple video implementation, with a single preroll and single content block.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
    /***************** Static Queue Snippet *********************/&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][c] = t[n][c] || {&lt;br /&gt;
                        g: o || {},&lt;br /&gt;
                        ggPM: function(e, o, r, s, i) {&lt;br /&gt;
                            (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
                        },&lt;br /&gt;
                        trackEvent: function(e) {&lt;br /&gt;
                            (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][c]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
    &amp;lt;script &amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * SDK Initialization to engtestsite.com domain&lt;br /&gt;
     */&lt;br /&gt;
    // Initialize instance &lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ('P00BEB680-1F1A-47BB-922D-1BXXXXXXXXXX', 'dcrVideoInstance', {&lt;br /&gt;
        containerID: &amp;quot;my-sdkplayer&amp;quot;,&lt;br /&gt;
        nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
var pathArray = window.location.pathname.split('/');&lt;br /&gt;
NURL = pathArray[2];&lt;br /&gt;
&lt;br /&gt;
var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'static',&lt;br /&gt;
    playheadPosition: '',&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;content&amp;quot;: {},&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
        &amp;quot;static&amp;quot;: {&lt;br /&gt;
            type: 'static',&lt;br /&gt;
            section: NURL,&lt;br /&gt;
            assetid: 'AID885-9984',&lt;br /&gt;
            segA: 'NielsenEnt',&lt;br /&gt;
            segB: 'CustomSegB',&lt;br /&gt;
            segC: 'CustomSegC',&lt;br /&gt;
            crossId1: &amp;quot;crossReference11&amp;quot;,&lt;br /&gt;
            reportSuite: &amp;quot;123&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.trackEvent(obj);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3521</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3521"/>
		<updated>2019-03-08T00:23:34Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate a very simple video implementation, with a single preroll and single content block.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;&lt;br /&gt;
script &amp;gt;&lt;br /&gt;
    /***************** Static Queue Snippet *********************/&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][c] = t[n][c] || {&lt;br /&gt;
                        g: o || {},&lt;br /&gt;
                        ggPM: function(e, o, r, s, i) {&lt;br /&gt;
                            (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
                        },&lt;br /&gt;
                        trackEvent: function(e) {&lt;br /&gt;
                            (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][c]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;); &amp;lt;&lt;br /&gt;
/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&lt;br /&gt;
/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&lt;br /&gt;
body &amp;gt;&lt;br /&gt;
    &amp;lt;&lt;br /&gt;
    script &amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * SDK Initialization to engtestsite.com domain&lt;br /&gt;
     */&lt;br /&gt;
    // Initialize instance &lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ('P00BEB680-1F1A-47BB-922D-1BXXXXXXXXXX', 'dcrVideoInstance', {&lt;br /&gt;
        containerID: &amp;quot;my-sdkplayer&amp;quot;,&lt;br /&gt;
        nol_sdkDebug: &amp;quot;debug&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
var pathArray = window.location.pathname.split('/');&lt;br /&gt;
NURL = pathArray[2];&lt;br /&gt;
&lt;br /&gt;
var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'static',&lt;br /&gt;
    playheadPosition: '',&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;content&amp;quot;: {},&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
        &amp;quot;static&amp;quot;: {&lt;br /&gt;
            type: 'static',&lt;br /&gt;
            section: NURL,&lt;br /&gt;
            assetid: 'AID885-9984',&lt;br /&gt;
            segA: 'NielsenEnt',&lt;br /&gt;
            segB: 'CustomSegB',&lt;br /&gt;
            segC: 'CustomSegC',&lt;br /&gt;
            crossId1: &amp;quot;crossReference11&amp;quot;,&lt;br /&gt;
            reportSuite: &amp;quot;123&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
nSdkInstance.trackEvent(obj);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3520</id>
		<title>Browser Simplified API Static Metadata</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_Simplified_API_Static_Metadata&amp;diff=3520"/>
		<updated>2019-03-08T00:19:55Z</updated>

		<summary type="html">&lt;p&gt;Admin3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|DCR &amp;amp; DTVR}}  {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To get started, an App ID is needed. The App ID is a unique ID assigned to the player/site/app. This will be provided upon starting the integration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;'PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure SDK ==&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
* Add Static Queue Snippet&lt;br /&gt;
* Create SDK Instance&lt;br /&gt;
=== Add Static Queue Snippet ===&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
===Create SDK Instance===&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
==== Initialization API Call ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;, optout: &amp;quot;false&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When creating an instance, pass the following values: (&amp;lt;code&amp;gt;nol_sdkDebug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;optout&amp;lt;/code&amp;gt; are optional)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter	!! Description	!! Values&lt;br /&gt;
|-&lt;br /&gt;
| apid	|| Unique ID assigned to player/site ||	'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName ||	Name of SDK instance ||	&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug	|| Enables Nielsen console logging. Only required for testing	|| &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout || OptOut global parameter (Optional Parameter) || &amp;lt;code&amp;gt;1/0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example SDK Initialization ====&lt;br /&gt;
When the initialization call is made, a unique static configuration file, &amp;lt;apid&amp;gt;.js, will be downloaded based on the apid and will be cached on the user’s browser.&lt;br /&gt;
&lt;br /&gt;
Once the configuration is downloaded, the SDK itself will be downloaded and initialized. All SDK modules are included in one file: “nlsSDK600.bundle.min.js”.&lt;br /&gt;
&lt;br /&gt;
More information on OptOut Parameter under [[DCR Video Browser Bundled SDK#Privacy_and_Opt-Out|Privacy and Opt-Out.]]&lt;br /&gt;
&lt;br /&gt;
=== Example SDK Configuration ===&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type = &amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;
  /***************** Static Queue Snippet *********************/&lt;br /&gt;
  ! function(t, n) {&lt;br /&gt;
    t[n] = t[n] || {&lt;br /&gt;
      nlsQ: function(e, c, o, r, s, i) {&lt;br /&gt;
        return s = t.document,&lt;br /&gt;
          r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
          r.async = 1,&lt;br /&gt;
          r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + c + &amp;quot;&amp;amp;ns=&amp;quot; + n, i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0], i.parentNode.insertBefore(r, i),&lt;br /&gt;
          t[n][c] = t[n][c] || {&lt;br /&gt;
            g: o || {},&lt;br /&gt;
            ggPM: function(e, o, r, s, i) {&lt;br /&gt;
              (t[n][c].q = t[n][c].q || []).push([e, o, r, s, i])&lt;br /&gt;
            },&lt;br /&gt;
            trackEvent: function(e) {&lt;br /&gt;
              (t[n][c].te = t[n][c].te || []).push(e)&lt;br /&gt;
            }&lt;br /&gt;
          }, t[n][c]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window, &amp;quot;NOLBUNDLE&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  outout: &amp;quot;false&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simplified API Syntax ==&lt;br /&gt;
The existing API has a number of methods used for reporting player and application state changes to the SDK. The order of calls is important for the SDK in the existing API. In the new simplified API, all these calls will be replaced with one API call that will get one dictionary object with many key-value pairs, where any value could be another complex dictionary object. All the data provided in the older API in separate calls will be provided in one single call. &lt;br /&gt;
 &lt;br /&gt;
Main API call for the new NielsenEventTracker API:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt; nSdkInstance.trackEvent({metadata})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling JSON Metadata ===&lt;br /&gt;
Parameter “data” is a JSON object with many key-value pairs that holds all information required by SDK.&lt;br /&gt;
&lt;br /&gt;
Format of input object is the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
 &amp;quot;event&amp;quot;: &amp;lt;event identifier&amp;gt;,&lt;br /&gt;
 &amp;quot;type&amp;quot;: &amp;lt;type of metadata&amp;gt;,&lt;br /&gt;
 &amp;quot;metadata&amp;quot;:{ &lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;lt;content metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;ad&amp;quot;: &amp;lt;ad metadata object&amp;gt;,&lt;br /&gt;
   &amp;quot;static&amp;quot;: &amp;lt;static metadata object&amp;gt;&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;playheadPosition&amp;quot;:&amp;lt;playhead value | UNIX timestamp (seconds since Jan-1-1970 UTC) &amp;gt;,&lt;br /&gt;
 &amp;quot;id3Data&amp;quot;: &amp;lt;id3 payload&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== Event Types ===&lt;br /&gt;
The New API method supports the following event types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|'''playhead'''||&lt;br /&gt;
It is used to pass content, ad or static metadata, the current playhead value, Unix timestamp or id3 payload, ott information to the SDK.&lt;br /&gt;
|-&lt;br /&gt;
|'''pause'''||&lt;br /&gt;
This event should be used when&lt;br /&gt;
content playback is paused. &amp;lt;br &amp;gt; (Pause is detected by SDK automatically when the time gap between commands is more than 30 minutes.)&lt;br /&gt;
|-&lt;br /&gt;
|'''complete'''||&lt;br /&gt;
It is called when session is completed or ends.&lt;br /&gt;
|-&lt;br /&gt;
|'''adStop'''||&lt;br /&gt;
Should be called at the end of each ad. This event type is required to handle the case when advertisements could not be distinguished, as its assetId is the same.&lt;br /&gt;
|}&lt;br /&gt;
'''NOTE:  Since only recording static data, playheadposition = &amp;quot;&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata ===&lt;br /&gt;
The values passed through the Nielsen keys will determine the breakouts that are seen in reporting. The custom segments (A, B &amp;amp; C) will roll into the sub-brand. To not use custom segments A, B and C, do not pass any value in these keys.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Description !! Data Type !! Value !! Required?&lt;br /&gt;
|-&lt;br /&gt;
| assetid || Unique ID for each article || dynamic || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| section || Section of each site which is limited to 25 unique values&amp;lt;br&amp;gt; (e.g. section value should be first level in page URL: website.com/section).  || dynamic || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segA || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment for reporting: Limit to 25 unique values across custom segments&amp;lt;br&amp;gt; (segA + segB + segC) || dynamic || custom || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Aggregation Limits'''&lt;br /&gt;
There are limits on the number of unique values that can be aggregated on in reporting. The specific limitations by key are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Aggregation Limit&lt;br /&gt;
|-&lt;br /&gt;
| section || maximum of 25 unique values (section &amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segA || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segB || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|-&lt;br /&gt;
| segC || Maximum number of unique values allowed across segA, segB, and segC is 25 (segA + segB + segC&amp;lt;= 25)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Static Metadata Sample ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
// Sample input Object for static metadata&lt;br /&gt;
// Since only recording static data, playheadposition = &amp;quot;&amp;quot;&lt;br /&gt;
{ &lt;br /&gt;
   &amp;quot;metadata&amp;quot;: { &lt;br /&gt;
      &amp;quot;content&amp;quot;: {},&lt;br /&gt;
      &amp;quot;ad&amp;quot;: {},&lt;br /&gt;
      &amp;quot;static&amp;quot;: { &lt;br /&gt;
         &amp;quot;type&amp;quot;:&amp;quot;static&amp;quot;,&lt;br /&gt;
         &amp;quot;assetid&amp;quot;:&amp;quot;Static1&amp;quot;,&lt;br /&gt;
         &amp;quot;section&amp;quot;:&amp;quot;Page&amp;quot;,&lt;br /&gt;
         &amp;quot;segA&amp;quot;:&amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
         &amp;quot;segB&amp;quot;:&amp;quot;teams&amp;quot;,&lt;br /&gt;
         &amp;quot;segC&amp;quot;:&amp;quot;Atlanta&amp;quot;,&lt;br /&gt;
         &amp;quot;crossId1&amp;quot;:&amp;quot;Reference&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;,&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;static&amp;quot;,&lt;br /&gt;
   &amp;quot;playheadPosition&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Json Examples ===&lt;br /&gt;
[https://engineeringportal.nielsen.com/docs/Digital_Measurement_Simplified_SDK_Supplements Addtional JSON input object examples.]&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
== Going Live ==&lt;br /&gt;
After the integration has been certified, users will need to make a couple of updates to the initialization call to ensure that player will be measured properly.&lt;br /&gt;
Disable debug logging by deleting {nol_sdkDebug: 'DEBUG'} from initialization call.&lt;br /&gt;
Example Production Initialization Call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, { outout: &amp;quot;false&amp;quot;});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
This code is for example purposes only to demonstrate a very simple video implementation, with a single preroll and single content block.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;lt;script &amp;gt;&lt;br /&gt;
  // Setup videojs sample player&lt;br /&gt;
  var nielsenid = document.getElementById(&amp;quot;my-sdkplayer&amp;quot;);&lt;br /&gt;
var coolPlayer = videojs('my-sdkplayer', {&lt;br /&gt;
  controls: true,&lt;br /&gt;
  autoplay: true,&lt;br /&gt;
  preload: 'auto',&lt;br /&gt;
});&lt;br /&gt;
var prevPos = null;&lt;br /&gt;
&lt;br /&gt;
coolPlayer.preroll({&lt;br /&gt;
  src: {&lt;br /&gt;
    src: &amp;quot;assets/CleaningCrew.mp4&amp;quot;,&lt;br /&gt;
    type: &amp;quot;video/mp4&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  href: &amp;quot;http://videojs.com&amp;quot;,&lt;br /&gt;
  adsOptions: {&lt;br /&gt;
    debug: true&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
videojs('my-sdkplayer').ready(function() {&lt;br /&gt;
  // EXAMPLE: Start playing the video.&lt;br /&gt;
&lt;br /&gt;
  coolPlayer.play();&lt;br /&gt;
  var obj = {&lt;br /&gt;
    event: 'playhead', // playhead,pause,complete,adstop&lt;br /&gt;
    type: 'content',&lt;br /&gt;
    playheadPosition: '0',&lt;br /&gt;
    metadata: {&lt;br /&gt;
      content: {&lt;br /&gt;
        type: 'content',&lt;br /&gt;
        assetid: 'VID98-2B88',&lt;br /&gt;
        program: 'Put a programname here ',&lt;br /&gt;
        title: 'S01E02',&lt;br /&gt;
        length: '180',&lt;br /&gt;
        airdate: '20190101 10:01:00',&lt;br /&gt;
        isfullepisode: 'y',&lt;br /&gt;
        crossId1: 'Standard Episode ID',&lt;br /&gt;
        crossID2: 'Content Originator',&lt;br /&gt;
        adloadtype: '2'&lt;br /&gt;
      },&lt;br /&gt;
      ad: {},&lt;br /&gt;
      static: {}&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
    coolPlayer.on('timeupdate', function() {&lt;br /&gt;
        var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
        var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
        if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos &amp;amp;&amp;amp; !coolPlayer.scrubbing()) {&lt;br /&gt;
            // check for playhead change so it's only called once per second &lt;br /&gt;
            console.log('PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
            console.log(Math.round(getcurrentTime));&lt;br /&gt;
            obj.event = 'playhead';&lt;br /&gt;
            obj.type = 'content';&lt;br /&gt;
            obj.metadata.ad = {};&lt;br /&gt;
            prevPos = intPlayedTime;&lt;br /&gt;
            obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
            nSdkInstance.trackEvent(obj);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adstart', function() {&lt;br /&gt;
    console.log('ADSTART EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'ad';&lt;br /&gt;
    obj.metadata.ad = {&lt;br /&gt;
      type: 'preroll',&lt;br /&gt;
      assetid: 'AD9455',&lt;br /&gt;
      adldx: '1',&lt;br /&gt;
      program: 'Cant Skip Campaign',&lt;br /&gt;
      title: 'Cleaning Crew',&lt;br /&gt;
      length: '36',&lt;br /&gt;
    };&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('contentresumed', function() {&lt;br /&gt;
    console.log('CONTENT RESUMED EVENT **************************************************************');&lt;br /&gt;
    obj.type = 'content';&lt;br /&gt;
    obj.event = 'playhead';&lt;br /&gt;
    obj.metadata.ad = {};&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('pause', function() {&lt;br /&gt;
    console.log('PAUSE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'pause';&lt;br /&gt;
    obj.playheadPosition = Math.round(coolPlayer.currentTime());&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adtimeupdate', function() {&lt;br /&gt;
    var getcurrentTime = coolPlayer.currentTime();&lt;br /&gt;
    var intPlayedTime = parseInt(getcurrentTime, 10);&lt;br /&gt;
    if (intPlayedTime &amp;gt; 0 &amp;amp;&amp;amp; intPlayedTime !== prevPos) {&lt;br /&gt;
      // check for playhead change so it's only called once per second &lt;br /&gt;
      console.log('AD PLAYHEAD EVENT **************************************************************');&lt;br /&gt;
      console.log(Math.round(getcurrentTime));&lt;br /&gt;
      prevPos = intPlayedTime;&lt;br /&gt;
      obj.playheadPosition = Math.round(getcurrentTime);&lt;br /&gt;
      nSdkInstance.trackEvent(obj);&lt;br /&gt;
    };&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('adend', function() {&lt;br /&gt;
    console.log('AD STOP EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'adstop';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.on('ended', function() {&lt;br /&gt;
    console.log('COMPLETE EVENT **************************************************************');&lt;br /&gt;
    obj.event = 'complete';&lt;br /&gt;
    nSdkInstance.trackEvent(obj);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin3</name></author>
	</entry>
</feed>