The Tag entity connects a channel to a template. The tag also enables setting custom placement for the player on any site utilizing CSS selectors and customizing the player loading script.
1. Login
To log in - the general login API is used. Example - https://aniviewwiki.atlassian.net/wiki/spaces/HELP/pages/155975720/Reporting+API#Login-API
...
2. Logout
To log out - the general logout API is used. Example - https://aniviewwiki.atlassian.net/wiki/spaces/HELP/pages/155975720/Reporting+API#Logout-API
...
3. Tag entity API
3.1 Get Tags List
Retrieves a list of all Tags in the network.
Request URL:
https://manage.aniview.com/api/taggenerator/playertag?format=json&expand=null&filter={"$and":[{"status":{"$in":[1]}}]}
...
Parameter | Description | Values |
---|---|---|
Type | Player type | outstream:1,instream:2 |
Status | Player status | 1:active,2:archived |
...
3.2. Create Tag
Request URL:
Request URL:
https://manage.aniview.com/api/taggenerator/playertag?format=json
Request Method:
POST
Main
Parameter | Type | Description |
description | String | Player Tag description. |
name | String | Player Tag Name.(Mandatory) |
channel | String | Channel ID. |
publisher | String | Publisher ID. |
posDfp1x1 | Boolean | Set true if there is a DFP pixel on the site. |
posType | Boolean | Set true if you would like to set custom positioning using CSS selector. |
type | 0:ID, 1:Tag, 2:Class, 3:Selector | Select the CSS selector type. |
value | String | Fill CSS Selector. Note that for ID and Class there is not need to use the # and . sings before the selector. |
ref1 | String | Use to pass one or more values for reporting and/or targeting purposes. |
template | String | Template ID. |
Mobile
Parameter | Type | Description |
_id | String | Channel ID |
posDfp1x1 | Boolean | Set true if there is a DFP pixel on the site. |
posType | Boolean | Set true if you would like to set custom positioning using CSS selector. |
type | 0:ID, 1:Tag, 2:Class, 3:Selector | Select the CSS selector type. |
value | String | Fill CSS Selector. Note that for ID and Class there is not need to use the # and . sings before the selector. |
publisher | String | Publisher ID. |
ref1 | String | Use to pass one or more values for reporting and/or targeting purposes. |
template | String | Template ID. |
A/B Testing
Parameter | Type | Description |
abTest | String | Test title. |
sp | Number between 1-100 | Traffic allocation precentage. |
channel | Int | Channel ID. |
template | Int | Template ID. |
posDfp1x1 | Boolean | Select to add a DFP pixel for targeting as an override function. |
A/B Testing: Test position (can be applied for each test)
Parameter | Type | Description |
useDifferent | Boolean | Set true to use a different position for the specific test. |
posType | Boolean | Set true if you would like to set custom positioning using CSS selector. |
type | 0:ID, 1:Tag, 2:Class, 3:Selector | Select the CSS selector type. |
value | Fill CSS Selector. Note that for ID and Class there is not need to use the # and . sings before the selector. |
...
Code Block |
---|
{ "staging": { "template": "template", "channel": "channel", "publisher": "publisher", "posDfp1x1": false, "overrideExtensions": { "isActive": false, "preloader": { "type": 0, "clickThrough": null } }, "ref1": null }, "configsArray": null, "configs": [ { "playerTag": { "template": { "name": "template_name", "id": null, "_id": { "$oid": "template_id" } }, "channel": { "name": "channel_name", "_id": { "$oid": "channel_id" } }, "publisher": null, "position": { "type": 2, "value": "class_here" } }, "abTest": "2", "sp": 100 } ], "type": 1, "usage": null, "isDeployed": true, "status": 1, "name": "tag_name", "publisherId": "publisherId" } |
3.2.1 Create Outstream Tag
Outstream tag is an ad only player.
...
Code Block |
---|
{ "staging": { "template": "template_id", "channel": "channel_id", "publisher": "publisher_id", "posDfp1x1": false, "overrideExtensions": { "isActive": false, "preloader": { "type": 0, "clickThrough": null } }, "ref1": null }, "configsArray": null, "type": 1, "usage": null, "isDeployed": true, "status": 1, "name": "tag_name", "publisherId": "publisherId" } |
Override Functions
The override function feature enables users to access the code that loads the Player. We recommend updating only the preRun and postStart functions. The preRun can be used to modify the config object and all other actions that should occur before the player loads. The postStart function should be applied whenever adjustments are made after the player loads. Please note that the postStart function loads with the player parameter represented as p.
Override function name | Type | Base code | ||
create | 4 |
| ||
findWin | 1 |
| ||
getAttr | 8 |
| ||
load | 6 |
| ||
position | 5 |
| ||
postCreate | 2 | Empty | ||
postStart | 7 | Empty | ||
preRun | 10 | Empty | ||
retry | 3 |
| ||
run | 11 |
| ||
start | 9 |
| ||
target | 12 |
| ||
track | 13 |
| ||
unique | 0 |
|
...
3.2.2 Create Instream Tag
Instream tag is an ad and content player.
...
Code Block |
---|
{ "staging": { "template": "template_id", "channel": "channel_id", "publisher": "publisher_id", "posDfp1x1": false, "overrideExtensions": { "isActive": false, "preloader": { "type": 0, "clickThrough": null } }, "ref1": null }, "configsArray": null, "type": 2, "usage": null, "isDeployed": true, "status": 1, "name": "tag_name", "publisherId": "publisherId" } |
Content
Parameter | Type | Description |
breakingAdsMode | 1:Slot, 2:Breaking Ads | Select from Ads Mode Type. Define when ads are displayed. |
breakingAds | Int | Time in seconds between waterfalls. Only when set to breaking ads mode. |
order | 1:Sequence, 2:Random | Order Type. |
randomFrom | Int | Define from which content number the player will start to randomize. Only when order:2 |
tagContent
| Boolean | Select for the player to only show content from the tag and not merge content from the tag and template. |
firstPrerollSlotEnable | Boolean | Set true to configure the first preroll slot. Only when set to breaking ads mode. |
Content: Slots
Parameter | Type | Description |
time | Int | Content time in seconds for an ad to start. |
firstAdTimeout | Int | Limit in seconds to find the first ad. Only when set to slot mode and firstPrerollSlot:true. |
preloadAdTime | Int | Limit in seconds to find an ad. |
maxAds | Int | Maximum number of ads player per slot. |
nextAdTimeout | Int | Time in seconds for the next ad. |
...
Code Block |
---|
{ "type": 2, "staging": { "overrideFunctions": { "unique": { "value": " if (!this.win.aniplayerPos)\n this.win.aniplayerPos = {};\n this.win.aniplayerPos[a.position] = true;\n return true;", "isActive": false }, "findWin": { "value": "try {\n if ((!a.posDfp1x1 && !a.posClass && !a.posSelector && !a.posId && !a.posTag) || (w === top) || !w.frameElement) {\n this.doc = document;\n this.win = w;\n } else if (a.posDfp1x1 && w.frameElement) {\n this.win = parent;\n this.doc = parent.document;\n } else {\n this.win = top;\n this.doc = top.document;\n }\n } catch (f) {\n this.doc = document;\n this.win = w;\n }", "isActive": false }, "postCreate": { "value": "", "isActive": false }, "retry": { "value": " if (this.retryCnt++ > this.timeout) {\n this.track(\"AV_M3\", \"&prbdres=nopos&sn=\" + encodeURIComponent(location.href).slice(0, 400));\n return;\n }\n var that = this;\n setTimeout(function () {\n that.position();\n }, 250);\n", "isActive": false }, "create": { "value": "var d1 = document.createElement(\"div\");\n if(a.scriptId) {\n d1.className = a.scriptId;\n }\n d1.style.width = \"100%\";\n d1.style.margin = \"0 auto\";\n d1.style.maxWidth = \"\" + a.maxWidth + \"px\";\n var d2 = document.createElement(\"div\");\n d2.id = \"aniBox\";\n var d3 = document.createElement(\"div\");\n d3.id = a.position;\n if (p === this.doc || p === this.doc.head)\n p = this.doc.body;\n if (n) {\n p.insertBefore(d1, n);\n } else {\n p.appendChild(d1);\n }\n a.refDiv = p;\n d1.appendChild(d2);\n d2.appendChild(d3);\n this.postCreate(d1);", "isActive": false }, "position": { "value": "var p = this.doc;\n var isScp = false;\n if (a.posSelector) {\n try {\n var q = this.doc.querySelectorAll(a.posSelector);\n var l = 0;\n if(a.posCounter > 0) {\n l = a.posCounter - 1;\n }\n p = q[l];\n } catch (e) {\n this.track(\"AV_M3\", \"&prbdres=badpos&sn=\" + encodeURIComponent(location.href).slice(0, 400));\n return;\n }\n if (!p) {\n this.retry();\n return;\n }\n }\n if (a.posId) {\n p = this.doc.getElementById(a.posId);\n if (!p) {\n this.retry();\n return;\n }\n }\n if (a.posTag) {\n var c = a.posTag.split(\"#\");\n if (c && c.length == 2) {\n var e = p.getElementsByTagName(c[0]);\n if (e.length == 0) {\n this.retry();\n return;\n }\n p = e[Math.min(c[1] - 1, e.length - 1)];\n }\n }\n if (a.posClass) {\n var c = a.posClass.split(\"#\");\n var e = 1;\n if (c.length == 2) {\n e = c[1];\n }\n var f = p.getElementsByClassName(c[0]);\n if (f.length > 0) {\n p = f[Math.min(e - 1, f.length - 1)];\n }\n if (!p) {\n this.retry();\n return;\n }\n }\n if (a.posDfp1x1 && window.frameElement) {\n n = window.frameElement.parentNode.parentNode;\n p = n.parentNode;\n if ((frameElement.clientHeight > 5 || document.body.clientHeight > 5) && !a.nohideIframe) {\n frameElement.style.height = \"0px\";\n }\n if (a.posType == \"after\") {\n n = n.nextElementSibling;\n }\n }\n var n;\n if (p === this.doc) {\n n = this.doc.getElementById(a.scriptId);\n if (n) {\n n.id += \"-used\";\n p = n.parentNode;\n }\n }\n if (p === this.doc.head) {\n n = null;\n p = this.doc;\n }\n if (a.posType && a.posType !== \"in\" && !n) {\n if (a.posType === \"after\" && p.nextElementSibling) {\n n = p.nextElementSibling;\n } else {\n n = null;\n }\n p = p.parentNode;\n }\n if (p) {\n if (!p.av_setpos) {\n p.av_setpos = {};\n }\n if (!p.av_setpos[a.position]) {\n p.av_setpos[a.position] = true;\n a.position += \"-\" + Date.now();\n this.create(p, n);\n this.load();\n } else {\n this.track(\"AV_M3\", \"&prbdres=duppos&sn=\" + encodeURIComponent(location.href).slice(0, 400));\n }\n }\n", "isActive": false }, "load": { "value": "var that = this;\n this.getAttr();\n var loadCounter = 0;\n var scp = this.doc.createElement(\"script\");\n scp.src = \"https://player.avplayer.com/script/2/v/avcplayer.js\";\n function checkIfLoad() {\n if(++loadCounter > 1) {\n that.start();\n }\n }\n scp.onload = function() {\n scp.onload = null;\n checkIfLoad();\n };\n scp.async = true;\n this.fetchContent(checkIfLoad);\n this.doc.body.appendChild(scp)", "isActive": false }, "postStart": { "value": "", "isActive": false }, "getAttr": { "value": "if (a.scriptId) {\n var s = document.getElementById(a.scriptId) || document.getElementById(a.scriptId + \"-used\");\n if (s) {\n for (var i = 0, t = s.attributes; i < s.attributes.length; i++) {\n if (t[i].nodeName && t[i].nodeName.indexOf(\"data-\") == 0) {\n var n = t[i].nodeName.replace(/^data-/, \"\").replace(/[-_]+?(\\w)/g, function (_, letter) { return letter.toUpperCase(); }).split(\".\");\n var lastProp = n.pop();\n try {\n var innerConfig = n.reduce(function (a, prop) { return a[prop]; }, a);\n innerConfig[lastProp] = t[i].nodeValue;\n } catch(e) {\n }\n }\n }\n if (s.src) {\n var p = s.src.indexOf(\"?\");\n if (p > 10) {\n var r = (s.src.substring(p + 1, s.src.length));\n a.adConfig.ref1 = (a.adConfig.ref1 || \"\") + \"&\" + (r || \"\");\n }\n }\n }\n }", "isActive": false }, "start": { "value": "var player;\n this.getAttr();\n try {\n if (this.win._avcp) {\n player = new this.win._avcp(a);\n } else if (window._avcp) {\n player = new _avcp(a);\n } else {\n player = new top._avcp(a);\n }\n } catch (exp) {\n player = new _avcp(a);\n }\n this.p = player;\n if (this.pbjs && this.pbjs.preparePlayer) {\n this.pbjs.preparePlayer(player, st);\n }\n if(a.playerApi && typeof this.win[a.playerApi] === \"function\" ) {\n try{\n this.win[a.playerApi](a, player);\n } catch(ex){}\n }\n player.nextContent();\n this.postStart(player);", "isActive": false }, "preRun": { "value": "", "isActive": false }, "run": { "value": " this.config = a = config = this.getConfig();\n this.a = this.config;\n this.getAttr();\n this.preRun();\n this.findWin();\n if (!this.doc.body) {\n this.doc.addEventListener(\"DOMContentLoaded\", function () {\n st.run();\n });\n if (this.bodyRetry > 0) {\n setTimeout(function () {\n st.run();\n }, 250);\n this.domRetry--;\n }\n return;\n }\n if (a.configApi && typeof this.win[a.configApi] === \"function\") {\n try {\n this.win[a.configApi](a);\n } catch (ex) {\n }\n }\n if (this.unique() && !this.loaded) {\n this.loaded = true;\n this.track(\"playerLoaded\");\n this.retryCnt = 0;\n this.timeout = a.posTimeout || 40;\n this.pbjs = window.aniviewRenderer && window.aniviewRenderer.units && window.aniviewRenderer.units[a.scriptId];\n if (this.pbjs && this.pbjs.prepareConfig) {\n this.pbjs.prepareConfig(a, st);\n }\n this.position();\n }", "isActive": false }, "target": { "value": " if (this.sp) {\n return\n }\n var ua = navigator.userAgent || navigator.vendor || window.opera;\n var uav = navigator.appVersion ? navigator.appVersion.toLowerCase() : \"\";\n var op = 2;\n if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(ua) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(ua.substr(0, 4))) {\n op = 1;\n } else {\n if (/web0s|webos|tizen/i.test(uav)) {\n op = 4;\n }\n }\n this.op = op;", "isActive": false }, "track": { "value": " if (!this.trackUrl) {\n this.trackUrl = \"https://\" + (a.trackDomain || \"track1.aniview.com\") + \"/track?pid=\" + a.adConfig.publisherId + \"&cid=\" + a.adConfig.channelId + \"&cb=\" + Date.now() + \"&r=\" + location.host + \"&stagid=\" + (a.tagId || \"\") + \"&stplid=\" + (a.templateId || \"\") + \"&d35=\" + (a.adConfig.sabTest || \"\") + \"&e=\";\n }\n m = m ? m : \"\";\n (new Image()).src = this.trackUrl + e + m;\n", "isActive": false }, "fetchContent": { "value": "if(a.content && (a.content.cmsId && a.content.cmsType)) {\n a.content.contentFeed = \"https://\" + (a.cmsFeedDomain || \"feed.avplayer.com\") + \"/backend/get?cmsType=\" + a.content.cmsType + \"&id=\" + a.content.cmsId\n }\n if (a.content.contentFeed) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", a.content.contentFeed, true);\n xhr.onload = function () {\n xhr.onload = null;\n try {\n var json = JSON.parse(xhr.responseText);\n if (json && json.playlist) {\n a.content.contents = json.playlist;\n }\n } catch (e) {\n }\n callback();\n };\n xhr.send();\n } else {\n callback();\n }", "isActive": false } }, "overrideExtensions": {}, "position": { "value": "", "number": 1 }, "publisher": "publisher", "posDfp1x1": false, "channel": "channel", "template": "template" }, "content": { "breakingAdsMode": 2, "commonSlots": [ { "time": 0 } ], "type": 0, "order": 1, "breakingAds": 15 }, "name": "test123" } |
...
3.2.3 Generate Tag Script
Short Tag
Short Tag is a script element that can be applied directly on the publisher's site. If the tag created does not include a position the player will open in the location the element is implemented at.
Code Block |
---|
<script async id="AV${Tag_ID}" type="text/javascript" src="https://tg1.aniview.com/api/adserver/spt?AV_TAGID=${Tag_ID}&AV_PUBLISHERID=${Publisher_ID}"></script> |
Full Tag
Full tag is the full script that is loading the player to the page.
...