{"id":28500746,"url":"https://github.com/kaltura/playkit-android-youbora","last_synced_at":"2025-07-04T12:31:32.442Z","repository":{"id":26744877,"uuid":"109007988","full_name":"kaltura/playkit-android-youbora","owner":"kaltura","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-28T09:55:09.000Z","size":513,"stargazers_count":2,"open_issues_count":0,"forks_count":3,"subscribers_count":18,"default_branch":"develop","last_synced_at":"2025-06-08T15:07:41.390Z","etag":null,"topics":["analytics","playkit","youbora"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaltura.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-31T14:32:37.000Z","updated_at":"2025-02-26T16:41:01.000Z","dependencies_parsed_at":"2023-11-23T15:30:08.840Z","dependency_job_id":"684d0864-3359-474d-9474-0d5c70baf6ac","html_url":"https://github.com/kaltura/playkit-android-youbora","commit_stats":null,"previous_names":[],"tags_count":89,"template":false,"template_full_name":null,"purl":"pkg:github/kaltura/playkit-android-youbora","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaltura%2Fplaykit-android-youbora","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaltura%2Fplaykit-android-youbora/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaltura%2Fplaykit-android-youbora/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaltura%2Fplaykit-android-youbora/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaltura","download_url":"https://codeload.github.com/kaltura/playkit-android-youbora/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaltura%2Fplaykit-android-youbora/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263539883,"owners_count":23477454,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics","playkit","youbora"],"created_at":"2025-06-08T15:07:41.214Z","updated_at":"2025-07-04T12:31:32.436Z","avatar_url":"https://github.com/kaltura.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CI Status](https://github.com/kaltura/playkit-android-youbora/actions/workflows/build.yml/badge.svg)](https://github.com/kaltura/playkit-android-youbora/actions/workflows/build.yml)\n[![Download](https://img.shields.io/maven-central/v/com.kaltura.playkit/youboraplugin?label=Download)](https://search.maven.org/artifact/com.kaltura.playkit/youboraplugin)\n[![License](https://img.shields.io/badge/license-AGPLv3-black.svg)](https://github.com/kaltura/playkit-android-kava/blob/master/LICENSE)\n![Android](https://img.shields.io/badge/platform-android-green.svg)\n\n\n# playkit-android-youbora\n\nYoubora provides a business intelligence solution for broadcasters, OTTs, telcos and media to support your business decisions and drive performance. The ability to harness data across various integrated capabilities and services has become increasingly important to support multiple organizations across a video business, including marketing, and to drive consumer engagement and loyalty.\n\nThe Youbora player plugin is integrated with the Kaltura player. The plugin listens and reports all the different player states in the current video session to Youbora Analytics. By taking all the data from inside the player, Youbora Analytics is capable of measuring the quality of the video experience from its source, the end user, and in turn analyzing the delivery process end to end. \n\n\n* Once you have a player instance you may want to be able to track playback behaviour and playback trends.\n* Using Youbora plugin you can achieve this easily.\n\n\n\n#### Setup\n\nAdd Youbora maven to your project build.gradle in repositories section\n\n`maven { url  \"https://npaw.jfrog.io/artifactory/youbora/\" }`\n\n\nAdd the Youbora plugin dependency to your `build.gradle` file:\nIn android, we keep all plugins aligned with same verison.\n\t\n`implementation 'com.kaltura.playkit:youboraplugin:4.x.x'`\n\n##### You can find the latest version here: \n\n[Releases](https://github.com/kaltura/playkit-android-youbora/releases)\n\n##### You can find the Youbora lib version which we currently use here\n\n[Youbora lib version](https://github.com/kaltura/playkit-android-youbora/blob/f1dbb0e9f8c9359c164bd32aea909927d099d087/youboraplugin/build.gradle#L33)\n\n\n#### Create Plugin Config:\n\n``` \nval playerInitOptions = PlayerInitOptions(PARTNER_ID)\nplayerInitOptions.setAutoPlay(true)\n...\n...\n\nval pkPluginConfigs = PKPluginConfigs()\npkPluginConfigs.setPluginConfig(YouboraPlugin.factory.name, getYouboraBundle())\n\nplayerInitOptions.setPluginConfigs(pkPluginConfigs)\n\nplayer = KalturaOttPlayer.create(this@MainActivity, playerInitOptions)\n\n```\n\n### Example:\n\n[Youbora plugin sample](https://github.com/kaltura/playkit-android-samples/blob/c28187bed44d20efe399cae82a48d69e193883ac/Youbora/app/src/main/java/com/kaltura/playkit/samples/youbora/MainActivity.java#L116)\n* Inorder to run the sample:\n\ndownload [Samples Repo](https://github.com/kaltura/kaltura-player-android-samples/tree/master)\nin Android Studio open the Advanced Samples folder and run the youbora sample\n\n#### Build your Youbora config using Bundle \n\n##### Example for some of the properties the App can send to Youbora plugin. The only must property to send is _your account code_. \nIn case if properties are not sent and if plugin have it internally plugin will set it automatically i.e media title, media resource and more.\n\n[Youbora Bundle Keys reference](https://bitbucket.org/npaw/lib-plugin-android/src/047a982e74b452ce2e5aeda426830f3a83da5e29/youboralib/src/main/java/com/npaw/youbora/lib6/plugin/Options.kt#lines-628)\n\n```\n    /**\n     * Bundle Youbora Configuration\n     * @return Youbora ConfigBundle\n     */\n    private fun getYouboraBundle(): Bundle {\n\n        val optBundle = Bundle()\n\n        //Youbora config bundle. Main config goes here.\n        optBundle.putString(KEY_ACCOUNT_CODE, ACCOUNT_CODE)\n        optBundle.putString(KEY_USERNAME, UNIQUE_USER_NAME)\n        optBundle.putString(KEY_USER_EMAIL, USER_EMAIL)\n\n        optBundle.putBoolean(KEY_ENABLED, true)\n        optBundle.putString(KEY_APP_NAME, \"TestApp\");\n        optBundle.putString(KEY_APP_RELEASE_VERSION, \"v1.0\");\n\n        //Media entry bundle.\n        optBundle.putString(KEY_CONTENT_TITLE, MEDIA_TITLE)\n\n        optBundle.putBoolean(KEY_PARSE_MANIFEST, PARSE_MANIFEST)\n        optBundle.putBoolean(KEY_PARSE_CDN_NODE, PARSE_CDN_NODE)\n        optBundle.putBoolean(KEY_PARSE_CDN_SWITCH_HEADER, PARSE_CDN_SWITCH_HEADER)\n        optBundle.putStringArrayList(KEY_PARSE_CDN_NODE_LIST, PARSE_CDN_NODE_LIST)\n        optBundle.putString(KEY_PARSE_CDN_NAME_HEADER, PARSE_CDN_NAME_HEADERS)\n        optBundle.putInt(KEY_PARSE_CDN_TTL, PARSE_CDN_TTL)\n\n\n        //Optional - Device bundle o/w youbora will decide by its own.\n        optBundle.putString(KEY_DEVICE_CODE, DEVICE_CODE)\n        optBundle.putString(KEY_DEVICE_BRAND, \"Xiaomi\")\n        optBundle.putString(KEY_DEVICE_MODEL, \"Mii3\")\n        optBundle.putString(KEY_DEVICE_TYPE, \"TvBox\")\n        optBundle.putString(KEY_DEVICE_OS_NAME, \"Android/Oreo\")\n        optBundle.putString(KEY_DEVICE_OS_VERSION, \"8.1\")\n\n        //Youbora ads configuration bundle.\n        optBundle.putString(KEY_AD_CAMPAIGN, CAMPAIGN)\n\n        //Configure custom properties here:\n        optBundle.putString(KEY_CONTENT_GENRE, GENRE)\n        optBundle.putString(KEY_CONTENT_TYPE, TYPE)\n        optBundle.putString(KEY_CONTENT_TRANSACTION_CODE, TRANSACTION_TYPE)\n        optBundle.putString(KEY_CONTENT_CDN, CONTENT_CDN_CODE)\n\n        optBundle.putString(KEY_CONTENT_PRICE, PRICE)\n        optBundle.putString(KEY_CONTENT_ENCODING_AUDIO_CODEC, AUDIO_TYPE)\n        optBundle.putString(KEY_CONTENT_CHANNEL, AUDIO_CHANNELS)\n\n        val contentMetadataBundle = Bundle()\n\n        contentMetadataBundle.putString(KEY_CONTENT_METADATA_YEAR, YEAR)\n        contentMetadataBundle.putString(KEY_CONTENT_METADATA_CAST, CAST)\n        contentMetadataBundle.putString(KEY_CONTENT_METADATA_DIRECTOR, DIRECTOR)\n        contentMetadataBundle.putString(KEY_CONTENT_METADATA_OWNER, OWNER)\n        contentMetadataBundle.putString(KEY_CONTENT_METADATA_PARENTAL, PARENTAL)\n        contentMetadataBundle.putString(KEY_CONTENT_METADATA_RATING, RATING)\n        contentMetadataBundle.putString(KEY_CONTENT_METADATA_QUALITY, QUALITY)\n\n        optBundle.putBundle(KEY_CONTENT_METADATA, contentMetadataBundle)\n\n        //You can add some extra params here:\n        optBundle.putString(KEY_CUSTOM_DIMENSION_1, EXTRA_PARAM_1)\n        optBundle.putString(KEY_CUSTOM_DIMENSION_2, EXTRA_PARAM_2)\n\n        return optBundle\n    }\n```\n\nFrom this point, the plugin will be functional (make sure your account code was set properly).\n\nThe plugin will send data for a single media playback.\n\nOnce you want to change media you first have to update the plugin with new bundle data using `player?.updatePluginConfig`\nthen load the new media.\n\n```\nyouboraPluginConfig?.let {\n  if (setPlugin) {\n     pkPluginConfigs.setPluginConfig(YouboraPlugin.factory.name, youboraPluginBundle)\n  } else {\n     player?.updatePluginConfig(YouboraPlugin.factory.name, youboraPluginBundle)\n  }\n}\n```\n\n#### Build YouboraConfig using JSON object (Legacy approach)\n\nApplication can create a JSON object to the Plugin config. It is not recommended approach but if you App's legacy code has in this way then you can use it,\n```kotlin\n\nprivate fun getYouboraConfig(): JsonObject {\n\n        // Youbora config json. Main config goes here.\n        val youboraConfigJson = JsonObject()\n\n        // MUST to have config\n        youboraConfigJson.addProperty(\"accountCode\", \"kalturatest\")\n\n        // Backward compatibility DEPRECATED\n//        youboraConfigJson.addProperty(\"appName\", \"Kaltura Full demo sample deprecated\");\n//        youboraConfigJson.addProperty(\"appReleaseVersion\", \"1.0.1 deprecated\");\n\n        // App JSON\n        val appJson = JsonObject()\n        appJson.addProperty(\"appName\", \"Kaltura Full demo sample\")\n        appJson.addProperty(\"appReleaseVersion\", \"1.0.1\")\n\n        // Backward compatibility DEPRECATED\n//        youboraConfigJson.addProperty(\"userEmail\", \"test@at.com DEPRECATED\");\n//        youboraConfigJson.addProperty(\"userAnonymousId\", \"my anonymousId DEPRECATED\");\n//        youboraConfigJson.addProperty(\"userType\", \"my user type DEPRECATED\");\n//        youboraConfigJson.addProperty(\"userObfuscateIp\", false);\n//        youboraConfigJson.addProperty(\"privacyProtocol\", \"https DEPRECATED\");\n\n        // USER Json\n        val userJson = JsonObject()\n        userJson.addProperty(\"email\", USER_EMAIL)\n        userJson.addProperty(\"anonymousId\", \"my anonymousId\")\n        userJson.addProperty(\"type\", \"my user type\")\n        userJson.addProperty(\"obfuscateIp\", true)\n        userJson.addProperty(\"privacyProtocol\", \"https\")\n\n        // Miscellaneous Configs\n        youboraConfigJson.addProperty(\"authToken\", \"myTokenString\")\n        youboraConfigJson.addProperty(\"authType\", \"Bearer\")\n        youboraConfigJson.addProperty(\"username\", \"youboraTest\")\n        youboraConfigJson.addProperty(\"linkedViewId\", \"my linked View ID\")\n        youboraConfigJson.addProperty(\"urlToParse\", \"http://abcasd.com\")\n\n        youboraConfigJson.addProperty(\"householdId\", \"My householdId\")\n        youboraConfigJson.addProperty(\"host\", \"a-fds.youborafds01.com\")\n        youboraConfigJson.addProperty(\"autoStart\", true)\n        youboraConfigJson.addProperty(\"autoDetectBackground\", true)\n        youboraConfigJson.addProperty(\"enabled\", true)\n        youboraConfigJson.addProperty(\"forceInit\", false)\n        youboraConfigJson.addProperty(\"offline\", false)\n        youboraConfigJson.addProperty(\"httpSecure\", true)\n        youboraConfigJson.addProperty(\"waitForMetadata\", false)\n\n        // Pending Metadata JSON\n        val pendingMetaDataArray = JsonArray()\n        pendingMetaDataArray.add(\"title\")\n        pendingMetaDataArray.add(\"userName\")\n        youboraConfigJson.add(\"pendingMetadata\", pendingMetaDataArray)\n\n        //Youbora ads configuration json.\n        val adsJson = JsonObject()\n        adsJson.addProperty(\"blockerDetected\", false)\n        // Create AdMetaData\n        val adMetaData = JsonObject()\n        adMetaData.addProperty(\"year\", \"2022\")\n        adMetaData.addProperty(\"cast\", \"cast 2022\")\n        adMetaData.addProperty(\"director\", \"director 2022\")\n        adMetaData.addProperty(\"owner\", \"owner 2022\")\n        adMetaData.addProperty(\"parental\", \"parental 2022\")\n        adMetaData.addProperty(\"rating\", \"rating 2022\")\n        adMetaData.addProperty(\"device\", \"device 2022\")\n        adMetaData.addProperty(\"audioChannels\", \"audioChannels 2022\")\n        adsJson.add(\"metadata\", adMetaData)\n\n        adsJson.addProperty(\"campaign\", \"ad campaign 2022\")\n        adsJson.addProperty(\"title\", \"ad title 2022\")\n        adsJson.addProperty(\"resource\", \"resource 2022\")\n        adsJson.addProperty(\"givenBreaks\", 5)\n        adsJson.addProperty(\"expectedBreaks\", 4)\n        // Create expectedPattern for Ads\n        val expectedPatternJson = JsonObject()\n        val preRoll = JsonArray()\n        preRoll.add(2)\n        val midRoll = JsonArray()\n        midRoll.add(1)\n        midRoll.add(4)\n        val postRoll = JsonArray()\n        postRoll.add(3)\n        expectedPatternJson.add(\"pre\", preRoll)\n        expectedPatternJson.add(\"mid\", midRoll)\n        expectedPatternJson.add(\"post\", postRoll)\n        adsJson.add(\"expectedPattern\", expectedPatternJson)\n        // create adBreaksTime\n        val adBreaksTimeArray = JsonArray()\n        adBreaksTimeArray.add(0)\n        adBreaksTimeArray.add(25)\n        adBreaksTimeArray.add(60)\n        adBreaksTimeArray.add(75)\n        adsJson.add(\"adBreaksTime\", adBreaksTimeArray)\n        adsJson.addProperty(\"adGivenAds\", 7)\n        adsJson.addProperty(\"adCreativeId\", \"ad creativeId\")\n        adsJson.addProperty(\"adProvider\", \"ad provider\")\n        // Create Ad Custom Dimensions\n        val adCustomDimensions = JsonObject()\n        adCustomDimensions.addProperty(\"param1\", \"my adCustomDimension1\")\n        adCustomDimensions.addProperty(\"10\", \"my adCustomDimension10\")\n        adsJson.add(\"adCustomDimension\", adCustomDimensions)\n\n        // Error JSON\n        val errorJson = JsonObject()\n        val ignoredErrors = JsonArray()\n        ignoredErrors.add(\"Asset Not Found.\")\n        errorJson.add(\"errorsIgnore\", ignoredErrors)\n\n        // Create Network JSON object\n        val networkJson = JsonObject()\n        networkJson.addProperty(\"networkConnectionType\", \"Wireless\")\n        networkJson.addProperty(\"networkIP\", \"18212.16218.01.012132\")\n        networkJson.addProperty(\"networkIsp\", \"XYZ TTML\")\n\n        // Create Parse JSON object\n        val parseJson = JsonObject()\n//        parseJson.addProperty(\"parseManifest\", true); // Deprecated way to pass value\n        val parseManifestJson = JsonObject() // New way to pass value\n\n        parseManifestJson.addProperty(\"manifest\", true)\n        val manifestAuthMap = JsonObject()\n        manifestAuthMap.addProperty(\"AUTH1\", \"VALUE1\")\n        manifestAuthMap.addProperty(\"AUTH2\", \"VALUE2\")\n        manifestAuthMap.addProperty(\"AUTH3\", \"VALUE3\")\n        manifestAuthMap.addProperty(\"AUTH4\", \"VALUE4\")\n        parseManifestJson.add(\"auth\", manifestAuthMap)\n        parseJson.add(\"parseManifest\", parseManifestJson)\n\n        parseJson.addProperty(\"parseCdnSwitchHeader\", true)\n\n//        parseJson.addProperty(\"parseCdnNode\", true); // Deprecated way to pass value\n//        JsonArray cdnNodeListArray = new JsonArray(); // Deprecated way to pass value\n//        cdnNodeListArray.add(\"Akamai\");\n//        cdnNodeListArray.add(\"Cloudfront\");\n//        cdnNodeListArray.add(\"NosOtt\");\n//        parseJson.add(\"parseCdnNodeList\", cdnNodeListArray);\n\n        val cdnNodeJson = JsonObject() // New way to pass value\n        cdnNodeJson.addProperty(\"requestDebugHeaders\", true)\n        val cdnNodeListJson = JsonArray()\n        cdnNodeListJson.add(\"Akamai\")\n        cdnNodeListJson.add(\"Cloudfront\")\n        cdnNodeListJson.add(\"NosOtt\")\n        cdnNodeJson.add(\"parseCdnNodeList\", cdnNodeListJson)\n\n        parseJson.add(\"cdnNode\", cdnNodeJson)\n\n        parseJson.addProperty(\"parseCdnNameHeader\", \"x-cdn\")\n        parseJson.addProperty(\"parseNodeHeader\", \"x-node\")\n        parseJson.addProperty(\"parseCdnTTL\", 60)\n\n        //Optional - Device json o/w youbora will decide by its own.\n        val deviceJson = JsonObject()\n        deviceJson.addProperty(\"deviceCode\", DEVICE_CODE)\n        deviceJson.addProperty(\"deviceBrand\", \"Brand Xiaomi\")\n        deviceJson.addProperty(\"deviceCode\", \"Code Xiaomi\")\n        deviceJson.addProperty(\"deviceId\", \"Device ID Xiaomi\")\n        deviceJson.addProperty(\"deviceEdId\", \"EdId Xiaomi\")\n        deviceJson.addProperty(\"deviceModel\", \"Model MI3\")\n        deviceJson.addProperty(\"deviceOsName\", \"Android/Oreo\")\n        deviceJson.addProperty(\"deviceOsVersion\", \"8.1\")\n        deviceJson.addProperty(\"deviceType\", \"TvBox TYPE\")\n        deviceJson.addProperty(\"deviceName\", \"TvBox\")\n        deviceJson.addProperty(\"deviceIsAnonymous\", \"TvBox\")\n\n        //Media entry json. [Content JSON]\n        val mediaEntryJson = JsonObject()\n        //mediaEntryJson.addProperty(\"isLive\", isLive); // IT's REMOVED NOW USE `isLive` class instead\n        val isLiveJson = JsonObject()\n        isLiveJson.addProperty(\"isLiveContent\", true)\n        isLiveJson.addProperty(\"noSeek\", true)\n        isLiveJson.addProperty(\"noMonitor\", true)\n        mediaEntryJson.add(\"isLive\", isLiveJson)\n\n//        mediaEntryJson.addProperty(\"isLive\", true);\n        mediaEntryJson.addProperty(\"contentBitrate\", 480000)\n        val encodingJson = JsonObject()\n        encodingJson.addProperty(\"videoCodec\", \"video codec name\")\n        mediaEntryJson.add(\"encoding\", encodingJson)\n        // Create Content MetaData\n        val contentMetaData = JsonObject()\n        contentMetaData.addProperty(\"year\", \"2022\")\n        contentMetaData.addProperty(\"cast\", \"cast 2022\")\n        contentMetaData.addProperty(\"director\", \"director 2022\")\n        contentMetaData.addProperty(\"owner\", \"owner 2022\")\n        contentMetaData.addProperty(\"parental\", \"parental 2022\")\n        contentMetaData.addProperty(\"rating\", \"rating 2022\")\n        contentMetaData.addProperty(\"device\", \"device 2022\")\n        contentMetaData.addProperty(\"audioChannels\", \"audioChannels 2022\")\n        mediaEntryJson.add(\"metadata\", contentMetaData)\n        // Create Content Custom Dimensions\n        val contentCustomDimensions = JsonObject()\n        contentCustomDimensions.addProperty(\"param1\", \"param1\")\n        contentCustomDimensions.addProperty(\"param2\", \"param2\")\n        mediaEntryJson.add(\"customDimensions\", contentCustomDimensions)\n\n        val sessionMetricsMap = JsonObject()\n        sessionMetricsMap.addProperty(\"sessionKey\", \"sessionValue\")\n        val sessionJson = JsonObject()\n        sessionJson.add(\"metrics\", sessionMetricsMap)\n\n        //Configure custom properties here: DEPRECATED in the Youbora Plugin\n//        JsonObject propertiesJson = new JsonObject();\n//        propertiesJson.addProperty(\"genre\", \"\");\n//        propertiesJson.addProperty(\"type\", \"\");\n//        propertiesJson.addProperty(\"transactionType\", \"TransactionType-1\");\n//        propertiesJson.addProperty(\"year\", \"\");\n//        propertiesJson.addProperty(\"cast\", \"\");\n//        propertiesJson.addProperty(\"director\", \"\");\n//        propertiesJson.addProperty(\"owner\", \"\");\n//        propertiesJson.addProperty(\"parental\", \"\");\n//        propertiesJson.addProperty(\"price\", \"\");\n//        propertiesJson.addProperty(\"rating\", \"\");\n//        propertiesJson.addProperty(\"audioType\", \"\");\n//        propertiesJson.addProperty(\"audioChannels\", \"\");\n//        propertiesJson.addProperty(\"device\", \"\");\n//        propertiesJson.addProperty(\"quality\", \"\");\n//        propertiesJson.addProperty(\"contentCdnCode\", CONTENT_CDN_CODE);\n\n        //You can add some extra params here: DEPRECATED in the plugin\n//        JsonObject extraParamJson = new JsonObject();\n//        extraParamJson.addProperty(\"1\", \"param1\");\n//        extraParamJson.addProperty(\"2\", \"param2\");\n\n        //Add all the json objects created before to the pluginEntry json.\n        youboraConfigJson.add(\"user\", userJson)\n        youboraConfigJson.add(\"parse\", parseJson)\n        youboraConfigJson.add(\"network\", networkJson)\n        youboraConfigJson.add(\"device\", deviceJson)\n        youboraConfigJson.add(\"media\", mediaEntryJson)\n        youboraConfigJson.add(\"ad\", adsJson)\n        youboraConfigJson.add(\"app\", appJson)\n        youboraConfigJson.add(\"errors\", errorJson)\n        youboraConfigJson.add(\"session\", sessionJson)\n//        youboraConfigJson.add(\"properties\", propertiesJson);\n//        youboraConfigJson.add(\"extraParams\", extraParamJson);\n\n        return youboraConfigJson\n    }\n\n\n```\n\n### Ads\n\nOnce the player is configured with IMA Plugin, Youbora Plugin will also report Ads playback analytics.\n\n\n### Plugin LifeCycle\n\nThe Youbora plugin is tied to the player's life cycle and listens to player onPause/onResume calls and player destruction event.\n\n[Example](https://github.com/kaltura/playkit-android-youbora/blob/4b66ffd4855dcfc887a13678bc20f00c1e1e711e/youboraplugin/src/main/java/com/kaltura/playkit/plugins/youbora/YouboraPlugin.java#L258)\n\n#### Samples:\n\n[Kaltura Player Youbora Sample](https://github.com/kaltura/kaltura-player-android-samples/blob/4da67739589a46f49f41c5a94297b363ce00cc37/AdvancedSamples/Youbora/app/src/main/java/com/kaltura/playkit/samples/youbora/MainActivity.kt#L231)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaltura%2Fplaykit-android-youbora","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaltura%2Fplaykit-android-youbora","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaltura%2Fplaykit-android-youbora/lists"}