PageSourceSearch

https://tvrmoldova.md/assets/js/tvrm-player.js?v=435192

js tvrmoldova.md collected 2026-09-24 18:05:28 UTC 4,853 bytes, 152 lines download raw bytes

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&sect=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&sect=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.