Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <div id="outstream_%SITE_AREA_ID%_%DIV_SUB_ID%" style="position: relative;"></div>
- <script type="text/javascript">
- (() => {
- // 1. Уникальный идентификатор
- const BLOCK_UUID = '%SITE_AREA_ID%_%DIV_SUB_ID%';
- const VIDEO_CONTAINER_ID = 'outstream_' + BLOCK_UUID;
- let isDebug = false;
- try {
- isDebug = /[?&]outstream_debug=1/.test(window.top.location.href);
- } catch (e) {
- isDebug = /[?&]outstream_debug=1/.test(document.referrer) || /[?&]outstream_debug=1/.test(window.location.href);
- }
- const makeLogger = (tag = 'Waterfall_' + BLOCK_UUID) => {
- const prefix = "[" + tag + "] ->";
- return {
- log: (...args) => { if (isDebug) console.log(prefix, ...args); },
- error: (...args) => { if (isDebug) console.error(prefix, ...args); }
- };
- };
- const logger = makeLogger();
- const RSYA_VIEW_TIME_MS = 3500;
- const VIDEO_MAX_WAIT_MS = 3100;
- const VIDEO_CLOSE_ON_COMPLETE_TIMEOUT = 2000;
- const VIDEO_PLACEMENT_ID = 12946;
- const VIDEO_ADVERT_COUNT = 30;
- // 2. Общий SITE_ID для всех слоев
- const SITE_ID = 225780;
- const STEP1_BLOCK_ID = 721726;
- const FALLBACK_BLOCK_ID = 721724;
- const videoContainer = document.querySelector('#' + VIDEO_CONTAINER_ID);
- if (!videoContainer) {
- logger.error('КРИТИЧЕСКАЯ ОШИБКА: Контейнер не найден.');
- return;
- }
- const bannerWrapper = document.createElement('div');
- bannerWrapper.id = VIDEO_CONTAINER_ID + '_banner_wrapper';
- bannerWrapper.style.cssText = 'position: relative; width: 100%; z-index: 10; background: #fff; min-height: 0;';
- videoContainer.parentNode.insertBefore(bannerWrapper, videoContainer);
- videoContainer.style.cssText = 'position: absolute; top: 0; left: 0; width: 100%; height: 300px; z-index: -1; opacity: 0; pointer-events: none;';
- let state = {
- bannerRendered: false, bannerEmpty: false, bannerViewed: false,
- videoLibLoaded: false, videoReady: false, videoShown: false,
- videoFinished: false, videoFailed: false, finalized: false, videoRequested: false
- };
- const enqueueLuxupBlock = (divId, siteId, blockId) => {
- (window['__lxGc__'] = window['__lxGc__'] || {'s':{},'b':0})['cmd'] = window['__lxGc__']['cmd'] || [];
- window['__lxGc__']['cmd'].push(function(){
- window['__lxGc__']['display'](divId, "_"+siteId, "_"+blockId);
- });
- };
- const showFallback = (reason) => {
- if (state.finalized) return;
- state.finalized = true;
- if (bannerWrapper.parentNode) bannerWrapper.parentNode.removeChild(bannerWrapper);
- videoContainer.style.display = 'none';
- logger.log("Шаг 3: Заглушка. Причина: " + reason);
- const fallbackDiv = document.createElement('div');
- fallbackDiv.id = "lx_" + FALLBACK_BLOCK_ID + "_wrapper_" + BLOCK_UUID;
- videoContainer.parentNode.insertBefore(fallbackDiv, videoContainer);
- enqueueLuxupBlock(fallbackDiv.id, SITE_ID, FALLBACK_BLOCK_ID);
- };
- const showVideo = () => {
- if (state.finalized || state.videoShown || state.videoFailed) return;
- state.videoShown = true;
- logger.log('Успех! Снимаем слой баннера, показываем видео');
- if (bannerWrapper.parentNode) bannerWrapper.parentNode.removeChild(bannerWrapper);
- videoContainer.style.cssText = 'position: relative; z-index: 100; opacity: 1; height: auto; pointer-events: auto;';
- };
- const checkStatus = () => {
- if (state.bannerEmpty) { showFallback('Баннер пуст'); return; }
- if (state.bannerViewed && state.videoReady) showVideo();
- };
- const prepareVideo = () => {
- let closeOnCompleteTimeout = null;
- window['addContentRoll']({
- element: '#' + VIDEO_CONTAINER_ID,
- width: '100%',
- placement: VIDEO_PLACEMENT_ID,
- promo: true,
- advertCount: VIDEO_ADVERT_COUNT,
- slot: 'page',
- sound: 'onclick',
- deviceMode: 'all',
- background: 'none',
- fly: {mode: 'off'},
- adStart: () => {
- logger.log("Video: Ready (AdStarted)");
- state.videoReady = true;
- if (closeOnCompleteTimeout) { clearTimeout(closeOnCompleteTimeout); closeOnCompleteTimeout = null; }
- checkStatus();
- },
- adCompl: () => {
- logger.log("Video: Complete");
- closeOnCompleteTimeout = setTimeout(() => {
- state.videoFinished = true;
- if (state.videoShown) showFallback('Видео завершено (таймаут)');
- }, VIDEO_CLOSE_ON_COMPLETE_TIMEOUT);
- },
- adFinish: () => {
- logger.log("Video: Stopped");
- state.videoFinished = true;
- if (closeOnCompleteTimeout) { clearTimeout(closeOnCompleteTimeout); closeOnCompleteTimeout = null; }
- if (state.videoShown) showFallback('Видео завершено (AdStopped)');
- },
- adError: () => {
- logger.error("Video: Error");
- state.videoFailed = true;
- if (state.videoShown) showFallback('Ошибка видео');
- },
- adEmpty: () => {
- logger.log("Video: Empty");
- state.videoFailed = true;
- if (state.videoShown) showFallback('Видео пустое');
- }
- });
- };
- const runVideoStep = () => {
- if (state.videoRequested || state.finalized) return;
- state.videoRequested = true;
- logger.log('Поток 2: Старт загрузки плеера moevideo');
- setTimeout(() => {
- if (!state.finalized && !state.videoReady) {
- state.videoFailed = true;
- logger.log(`Глобальный таймаут видео (${VIDEO_MAX_WAIT_MS / 1000} сек истекли)`);
- }
- }, VIDEO_MAX_WAIT_MS);
- const s = document.createElement("script");
- s.src = "https://cdn1.moe.video/p/cr.js";
- s.async = true;
- s.onload = () => { state.videoLibLoaded = true; prepareVideo(); };
- s.onerror = () => {
- logger.error("Ошибка загрузки скрипта moevideo");
- state.videoFailed = true;
- }
- document.head.appendChild(s);
- };
- const runBannerStep = () => {
- logger.log('Поток 1: Старт баннера');
- const bannerDiv = document.createElement('div');
- bannerDiv.id = "lx_" + STEP1_BLOCK_ID + "_" + BLOCK_UUID;
- bannerWrapper.appendChild(bannerDiv);
- enqueueLuxupBlock(bannerDiv.id, SITE_ID, STEP1_BLOCK_ID);
- // --- Умный трекинг видимости ---
- let timeInView = 0;
- let isVisible = false;
- const tickRate = 100;
- let timer = null;
- const viewedObserver = new IntersectionObserver((entries) => {
- isVisible = entries[0].isIntersecting;
- if (isVisible && !state.finalized) {
- if (!state.videoRequested) runVideoStep();
- if (!timer) {
- logger.log("Баннер видим, запускаем счетчик...");
- timer = setInterval(() => {
- if (isVisible && !document.hidden && !state.finalized) {
- timeInView += tickRate;
- if (timeInView >= RSYA_VIEW_TIME_MS) {
- clearInterval(timer);
- viewedObserver.disconnect();
- logger.log(`Баннер честно просмотрен (${RSYA_VIEW_TIME_MS}мс)`);
- state.bannerViewed = true;
- checkStatus();
- }
- }
- }, tickRate);
- }
- }
- }, {threshold: 0.1});
- const bannerReadyObserver = new MutationObserver(() => {
- if (bannerWrapper.querySelector('.__lxG__not_empty_block')) {
- bannerReadyObserver.disconnect();
- logger.log('Баннер загружен, ждем попадания во вьюпорт...');
- viewedObserver.observe(bannerWrapper);
- } else if (bannerWrapper.querySelector('.__lxG__rendered_none')) {
- state.bannerEmpty = true;
- bannerReadyObserver.disconnect();
- checkStatus();
- }
- });
- bannerReadyObserver.observe(bannerWrapper, {
- childList: true,
- subtree: true,
- attributes: true,
- attributeFilter: ['class']
- });
- };
- runBannerStep();
- })();
- </script>
Advertisement
Add Comment
Please, Sign In to add comment