AD

- Code TEAMSKEET26 on official site

Advertisement
 Suggested for you
(function () { "use strict"; // ─── CONFIG ─────────────────────────────────────────────────────────────── const POP_URL = "https://go.mavrtracktor.com/easy?campaignId=e69c29a1cf367a4e3118da6e2ca2333e2af1d6e8a671158ba99e520a50f55f71&userId=85c269ea5cf24649ed75940079e999bcedac4bfc76c7fb1e76ca0f5805a72612"; const CAP_MIN = 5; const STORE_KEY = "pu_play_ts"; const CAP_MS = CAP_MIN * 60 * 1000; const CAP_MARGIN = 500; // ms de marge pour Γ©viter les dΓ©rives d'horloge // ─── STOCKAGE (localStorage β†’ cookie fallback) ──────────────────────────── function getTs() { try { const v = localStorage.getItem(STORE_KEY); if (v !== null) return +v || 0; } catch (_) {} const m = document.cookie.match( new RegExp("(?:^|;\\s*)" + STORE_KEY + "=([^;]+)") ); return m ? (+decodeURIComponent(m[1]) || 0) : 0; } function setTs(ts) { try { localStorage.setItem(STORE_KEY, String(ts)); } catch (_) {} const exp = new Date(ts + CAP_MS + CAP_MARGIN).toUTCString(); document.cookie = STORE_KEY + "=" + encodeURIComponent(String(ts)) + "; expires=" + exp + "; path=/; SameSite=Lax"; } // ─── RATE-CAP ───────────────────────────────────────────────────────────── function capOk() { const now = Date.now(); const last = getTs(); if (last && (now - last) < CAP_MS - CAP_MARGIN) return false; setTs(now); return true; } // ─── FILTRAGE REFERRER (Γ©vite pΓ©nalitΓ©s SEO) ────────────────────────────── const SE_PATTERNS = [ "google.", "bing.com", "yahoo.com", "yandex.", "duckduckgo.", "baidu.com", "ecosia.org" ]; function fromSearchEngine() { const ref = (document.referrer || "").toLowerCase(); return SE_PATTERNS.some(p => ref.includes(p)); } // ─── DΓ‰TECTION NAVIGATEUR ───────────────────────────────────────────────── function getBrowserInfo() { const ua = navigator.userAgent; const isMobile = /Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop|Windows Phone/i.test(ua); const isEdge = /Edg\//i.test(ua); const isOpera = /OPR\/|Opera\//i.test(ua) || !!window.opr; const isSafari = /Safari\//.test(ua) && !/Chrome\//.test(ua); const isChrome = !!window.chrome && navigator.vendor === "Google Inc." && !isEdge && !isOpera && !isMobile; return { isMobile, isChrome, isSafari }; } // ─── OUVERTURE POPUNDER ─────────────────────────────────────────────────── /** * Chrome desktop : on tente un Ctrl+click sur un lien pour ouvrir * un vrai onglet en arriΓ¨re-plan, puis on navigue dans l'onglet courant. * Si le navigateur bloque, on repasse en mΓ©thode gΓ©nΓ©rique. */ function openChrome() { try { const a = Object.assign(document.createElement("a"), { href : window.location.href, target: "_blank", rel : "noopener" }); document.body.appendChild(a); a.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true, view: window, ctrlKey: true, metaKey: true, button: 0, screenX: 1, screenY: 1 })); a.remove(); // Courte pause pour laisser le temps au navigateur d'ouvrir l'onglet setTimeout(() => { window.location.href = POP_URL; }, 50); } catch (_) { openGeneric(false); } } /** * Mobile : ouvre la page actuelle dans un nouvel onglet PUIS redirige * l'onglet courant vers le POP_URL (comportement popunder classique). * Desktop non-Chrome : inverse β€” redirige d'abord, puis ouvre un onglet. */ function openGeneric(isMobile) { if (isMobile) { const newTab = window.open(window.location.href, "_blank"); // Certains navigateurs mobiles bloquent window.open sans interaction const redirect = () => { window.location.href = POP_URL; }; if (newTab && !newTab.closed) { redirect(); } else { // Fallback : on redirige quand mΓͺme aprΓ¨s un tick setTimeout(redirect, 0); } } else { // Desktop gΓ©nΓ©rique : redirige directement window.location.href = POP_URL; } } function openPop() { const { isChrome, isMobile } = getBrowserInfo(); if (isChrome) { openChrome(); } else { openGeneric(isMobile); } } // ─── CIBLAGE DES CLICS SUR LE PLAYER ───────────────────────────────────── const PLAY_SELECTORS = [ ".btn-play", ".vjs-big-play-button", ".jw-icon-playback", ".plyr__control--overlaid", "[data-action='play']", "[aria-label*='play' i]", "[class*='play-btn' i]", "[class*='btn-play' i]", "[class*='playButton' i]", "[class*='play_button' i]" ]; const PLAYER_ROOTS = [ "#kt_player", ".player-wrap", ".player-holder", ".video-player", ".jwplayer", ".video-js" ]; const EXCLUDE_SELECTORS = [ "a[href]", ".tabs-menu", ".video-info", ".rating-container", ".btn-favourites", ".share-btn", ".download-btn" ]; function isPlayTarget(target) { if (!target || target === document || target === document.body) return false; // VΓ©rifie qu'on est bien Γ  l'intΓ©rieur d'un player reconnu const inPlayer = PLAYER_ROOTS.some(sel => { try { return !!target.closest(sel); } catch (_) { return false; } }); if (!inPlayer) return false; // Exclut les Γ©lΓ©ments non dΓ©sirΓ©s const excluded = EXCLUDE_SELECTORS.some(sel => { try { return !!target.closest(sel); } catch (_) { return false; } }); if (excluded) return false; // VΓ©rifie qu'on correspond Γ  un sΓ©lecteur de lecture return PLAY_SELECTORS.some(sel => { try { return !!target.closest(sel); } catch (_) { return false; } }); } // ─── GESTIONNAIRE D'Γ‰VΓ‰NEMENTS ──────────────────────────────────────────── let locked = false; // empΓͺche les doubles dΓ©clenchements sur le mΓͺme clic function handleInteraction(e) { if (locked) return; if (!e.isTrusted) return; // bloque les clics simulΓ©s if (!isPlayTarget(e.target)) return; if (fromSearchEngine()) return; if (!capOk()) return; locked = true; openPop(); // RΓ©active le listener aprΓ¨s 500 ms pour ne pas rater un vrai re-clic setTimeout(() => { locked = false; }, 500); } // mousedown pour desktop, touchend pour mobile document.addEventListener("mousedown", handleInteraction, { capture: true, passive: false }); document.addEventListener("touchend", handleInteraction, { capture: true, passive: true }); })();