1(function() { 2 'use strict'; 3 4 var CONFIG = { 5 liveStreamUrl: 'https://tvr-moldova.lg.mncdn.com/tvrmoldova/smil:tvrmoldova.smil/playlist.m3u8', 6 livePoster: 'https://tvrmoldova.md/media/live_bg.png', 7 preRollTag: 'https://inv-nets.admixer.net/dsp.aspx?rct=3&zone=b9526e5e-79d0-4c09-b1e9-0ae6d17a7c5f&zoneInt=132239§=60816&site=53758&rnd=[CACHEBUSTING]&page=tvrmoldova.md&domain=tvrmoldova.md', 8 postRollTag: 'https://inv-nets.admixer.net/dsp.aspx?rct=3&zone=27e58a61-a645-4e44-be89-bd09da52424a&zoneInt=132240§=60816&site=53758&rnd=[CACHEBUSTING]&page=tvrmoldova.md&domain=tvrmoldova.md' 9 }; 10 11 var adBlockDetected = (typeof google === 'undefined' || typeof google.ima === 'undefined'); 12 13 // VMAP XML generator for IMA SDK 14 function generateVMAP(preRollUrl, postRollUrl) { 15 var cb = Math.floor(Math.random() * 1e10); 16 var preRoll = preRollUrl.replace('[CACHEBUSTING]', cb); 17 var xml = '<?xml version="1.0" encoding="UTF-8"?>' + 18 '<vmap:VMAP xmlns:vmap="http://www.iab.net/videosuite/vmap" version="1.0">' + 19 '<vmap:AdBreak timeOffset="start" breakType="linear" breakId="preroll">' + 20 '<vmap:AdSource id="preroll-ad" allowMultipleAds="false" followRedirects="true">' + 21 '<vmap:AdTagURI templateType="vast3"><![CDATA[' + preRoll + ']]></vmap:AdTagURI>' + 22 '</vmap:AdSource>' + 23 '</vmap:AdBreak>'; 24 if (postRollUrl) { 25 var postRoll = postRollUrl.replace('[CACHEBUSTING]', cb); 26 xml += '<vmap:AdBreak timeOffset="end" breakType="linear" breakId="postroll">' + 27 '<vmap:AdSource id="postroll-ad" allowMultipleAds="false" followRedirects="true">' + 28 '<vmap:AdTagURI templateType="vast3"><![CDATA[' + postRoll + ']]></vmap:AdTagURI>' + 29 '</vmap:AdSource>' + 30 '</vmap:AdBreak>'; 31 } 32 xml += '</vmap:VMAP>'; 33 return xml; 34 } 35 36 // Attach IMA ads to a player instance 37 function attachAds(player, vastMode) { 38 if (adBlockDetected) return; 39 var postRoll = (vastMode === 'preroll+postroll') ? CONFIG.postRollTag : null; 40 player.ima({ 41 adsResponse: generateVMAP(CONFIG.preRollTag, postRoll) 42 }); 43 } 44 45 // Initialize sidebar live player (compact, pre-roll ad) 46 function initSidebarLivePlayer(el) { 47 var player = videojs(el, { 48 liveui: true, 49 html5: { 50 vhs: { 51 overrideNative: true 52 } 53 } 54 }); 55 56 if (typeof player.qualityMenu === 'function') { 57 player.qualityMenu(); 58 } 59 60 attachAds(player, 'preroll'); 61 return player; 62 } 63 64 // Initialize main live player (full-size, pre-roll ad, quality menu, live badge) 65 function initLivePlayer(el, vastMode) { 66 var player = videojs(el, { 67 liveui: true, 68 html5: { 69 vhs: { 70 overrideNative: true 71 } 72 } 73 }); 74 75 if (typeof player.qualityMenu === 'function') { 76 player.qualityMenu(); 77 } 78 79 attachAds(player, vastMode || 'preroll'); 80 return player; 81 } 82 83 // Initialize VoD player (pre-roll + optional post-roll) 84 function initVodPlayer(el, vastMode) { 85 var player = videojs(el); 86 87 attachAds(player, vastMode || 'preroll+postroll'); 88 return player; 89 } 90 91 // Initialize YouTube player (via videojs-youtube plugin) 92 function initYouTubePlayer(el) { 93 var autoplay = el.getAttribute('data-tvrm-autoplay') === 'true'; 94 var vastMode = el.getAttribute('data-tvrm-vast') || 'preroll'; 95 96 var player = videojs(el, { 97 techOrder: ['youtube'], 98 youtube: { 99 ytControls: 0, 100 modestbranding: 1, 101 rel: 0, 102 iv_load_policy: 3 103 } 104 }); 105 106 attachAds(player, vastMode); 107 108 if (autoplay) { 109 player.ready(function() { 110 player.muted(true); 111 player.play(); 112 }); 113 114 // Re-try play on visibility change (browser autoplay policy) 115 document.addEventListener('visibilitychange', function() { 116 if (!document.hidden && player.paused()) { 117 player.muted(true); 118 player.play(); 119 } 120 }); 121 } 122 123 return player; 124 } 125 126 // Auto-init: find all video elements with data-tvrm-player attribute 127 function initAllPlayers() { 128 var elements = document.querySelectorAll('[data-tvrm-player]'); 129 for (var i = 0; i < elements.length; i++) { 130 var el = elements[i]; 131 var type = el.getAttribute('data-tvrm-player'); 132 var vastMode = el.getAttribute('data-tvrm-vast') || 'none'; 133 134 if (type === 'live-main') { 135 initLivePlayer(el, vastMode); 136 } else if (type === 'live') { 137 initSidebarLivePlayer(el); 138 } else if (type === 'vod') { 139 initVodPlayer(el, vastMode); 140 } else if (type === 'youtube') { 141 initYouTubePlayer(el); 142 } 143 } 144 } 145 146 // Init on DOM ready 147 if (document.readyState === 'loading') { 148 document.addEventListener('DOMContentLoaded', initAllPlayers
148); 149 } else { 150 initAllPlayers(); 151 } 152})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.