[fullstory] {metatitle}[user]sss[/user] [/fullstory]
[not_fullstory]Постер[/not_fullstory] [fullstory]Постер сериала[/fullstory]
Зачем это нужно?

• После активации вы будете сразу попадать на плеер без этой страницы
• Очень удобно, если часто смотрите сериалы здесь
• Работает только в текущем браузере
• Можно отключить в любой момент

Переход к просмотру
Вы переходите с сайта domserial.cc
[fullstory]для просмотра сериала «{title}»[/fullstory]
[fullstory]

«{title}»

{full_story}

[/fullstory]

Готовы начать просмотр прямо сейчас?

Переход выполняется только по вашему желанию
.

Включить автоматический переход?

Если активировать эту функцию, то в следующий раз вы сразу попадёте на страницу просмотра — без этой промежуточной страницы.

Это сделано только для вашего удобства и работает исключительно в текущем браузере.

Автоматический переход отключён по умолчанию, потому что поисковые системы требуют явного согласия пользователя.
Включить его можно только добровольно.

Отключить очень просто: очистите кэш и данные сайта в настройках браузера.

[obfuscation] document.addEventListener("DOMContentLoaded", function() { (function() { const encUrl = "{enc_user_url}"; const secret = "{redirect_secret}"; const ajaxUrl = "{redirect_ajax_url}"; const delayMs = 850; const els = { stayBtn: document.getElementById("stayBtn"), setupAutoBtn: document.getElementById("setupAutoBtn"), goBtn: document.getElementById("goBtn"), confirmModal: document.getElementById("confirmModal"), confirmYes: document.getElementById("confirmYes"), confirmNo: document.getElementById("confirmNo") }; function rndToken() { const arr = new Uint8Array(16); crypto.getRandomValues(arr); return Array.from(arr).map(v => ("0" + v.toString(16)).slice(-2)).join(""); } function addClickParam(url, token) { try { const u = new URL(url); u.searchParams.set("tc_click", token); return u.toString(); } catch (e) { return url; } } function b64uToBytes(v) { let s = v.replace(/-/g, "+").replace(/_/g, "/s1/"); while (s.length % 4) s += "="; const bin = atob(s); const out = []; for (let i = 0; i < bin.length; i++) out.push(bin.charCodeAt(i)); return out; } function keyBytes() { const out = []; for (let i = 0; i < secret.length; i++) out.push(secret.charCodeAt(i)); return out; } function decryptUrl(enc) { try { const data = b64uToBytes(enc); const key = keyBytes(); if (!key.length) return ""; let out = ""; for (let i = 0; i < data.length; i++) { out += String.fromCharCode(data[i] ^ key[i % key.length]); } return out; } catch (e) { return ""; } } function postClick(enc, token) { const body = "action=redirect_click&enc=" + encodeURIComponent(enc) + "&token=" + encodeURIComponent(token) + "&screen=" + encodeURIComponent((screen.width || 0) + "x" + (screen.height || 0)) + "&timezone=" + encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone || ""); try { if (navigator.sendBeacon) { navigator.sendBeacon( ajaxUrl, new Blob([body], { type: "application/x-www-form-urlencoded" }) ); return; } // закрепляем объект чтобы не был собран сразу window.__tc_img = new Image(); window.__tc_img.src = ajaxUrl + "?" + body; } catch (e) {} } function postFail(token, reason) { const body = "action=redirect_fail&token=" + encodeURIComponent(token) + "&reason=" + encodeURIComponent(reason || "client_error"); if (navigator.sendBeacon) { const blob = new Blob([body], { type: "application/x-www-form-urlencoded" }); navigator.sendBeacon(ajaxUrl, blob); return; } fetch(ajaxUrl, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body, credentials: "include" }).catch(function(){}); } /* ===== ОТКЛЮЧЕНО: проверка доступности ===== function probeTarget(url, timeoutMs) { return new Promise(function(resolve) { let done = false; const timer = setTimeout(function() { if (done) return; done = true; resolve({ ok: false, reason: "timeout" }); }, timeoutMs); fetch(url, { method: "HEAD", mode: "no-cors", cache: "no-store" }) .then(function() { if (done) return; done = true; clearTimeout(timer); resolve({ ok: true, reason: "ok" }); }) .catch(function() { if (done) return; done = true; clearTimeout(timer); resolve({ ok: false, reason: "network_error" }); }); }); } */ function redirect(btn) { if (!btn) return; btn.disabled = true; btn.textContent = "Открытие..."; const token = rndToken(); const target = decryptUrl(encUrl); if (!target) { postFail(token, "decrypt_error"); return; } /* ===== ОТКЛЮЧЕНО: проверка перед редиректом ===== probeTarget(target, 2500).then(function(pr) { if (!pr.ok) { postFail(token, pr.reason); return; } */ postClick(encUrl, token); setTimeout(function() { location.replace(addClickParam(target, token)); }, delayMs); /* }).catch(function() { postFail(token, "probe_exception"); }); */ } function createAltCheckCookie() { document.cookie = "alt_check_js=1; max-age=31536000; path=/; SameSite=Lax"; } const trap = document.createElement("a"); trap.href = "/index.php?controller=ajax&bot_page"; trap.style.cssText = "position:absolute;left:-9999px;top:-9999px;opacity:0"; trap.rel = "nofollow"; trap.textContent = "."; document.body.appendChild(trap); [checked_user] redirect(els.goBtn); [/checked_user] [not_checked_user] if (els.goBtn) els.goBtn.addEventListener("click", function() { redirect(els.goBtn); }); if (els.stayBtn) els.stayBtn.addEventListener("click", function() { els.stayBtn.textContent = "Остаёмся здесь"; els.stayBtn.disabled = true; els.stayBtn.style.background = "linear-gradient(135deg,#10b981,#047857)"; }); if (els.setupAutoBtn) els.setupAutoBtn.addEventListener("click", function() { if (els.confirmModal) els.confirmModal.style.display = "flex"; }); if (els.confirmYes) els.confirmYes.addEventListener("click", function() { createAltCheckCookie(); redirect(els.confirmYes); }); if (els.confirmNo) els.confirmNo.addEventListener("click", function() { if (els.confirmModal) els.confirmModal.style.display = "none"; }); if (els.confirmModal) els.confirmModal.addEventListener("click", function(e) { if (e.target === els.confirmModal) els.confirmModal.style.display = "none"; }); [/not_checked_user] })(); }); [/obfuscation]