/** * amp-redirect.js - Mobile Redirect to AMP Page * * Skrip ini mendeteksi pengguna perangkat mobile dan mengalihkan mereka * ke halaman AMP yang telah ditentukan. Juga memastikan tag * ada dan benar. * * @author: Your Name/Company * @version: 2.0 (Developed & Fixed) */ (function() { 'use strict'; // --- KONFIGURASI --- // Ganti dengan URL halaman AMP Anda var AMP_URL = "https://iptvsubscriptiontv.com/amp/"; var AMP_PARAM_NAME = "via"; var AMP_PARAM_VALUE = "mobile-redirect"; // Parameter di URL untuk mencegah redirect (misal: website.com?no_redirect=1) var NO_REDIRECT_PARAM = "no_redirect"; // Maksimal dimensi (lebar atau tinggi) untuk dianggap sebagai mobile var MOBILE_MAX_DIM = 768; // --- FUNGSI PEMBANTU --- /** * Memastikan tag ada dan href-nya benar. */ function ensureAmpLink() { try { var linkAmp = document.querySelector('link[rel="amphtml"]'); if (linkAmp) { // Jika sudah ada, perbarui href jika tidak sesuai if (linkAmp.href !== AMP_URL) { linkAmp.href = AMP_URL; } } else { // Jika belum ada, buat baru linkAmp = document.createElement('link'); linkAmp.rel = "amphtml"; linkAmp.href = AMP_URL; document.head.appendChild(linkAmp); } } catch (e) { console.error("AMP Redirect: Gagal memperbarui link amphtml.", e); } } /** * Membuat URL target AMP dengan menambahkan parameter pelacakan. */ function buildAmpTargetWithParam(target) { try { var url = new URL(target, location.href); if (!url.searchParams.has(AMP_PARAM_NAME)) { url.searchParams.set(AMP_PARAM_NAME, AMP_PARAM_VALUE); } return url.href; } catch (e) { // Fallback untuk browser lama yang tidak mendukung URL API var separator = target.indexOf('?') === -1 ? '?' : '&'; return target + separator + encodeURIComponent(AMP_PARAM_NAME) + '=' + encodeURIComponent(AMP_PARAM_VALUE); } } /** * Melakukan redirect dengan aman menggunakan location.replace() * agar tidak menambahkan halaman saat ini ke history browser. */ function safeReplace(href) { try { location.replace(href); } catch (e) { // Fallback jika location.replace gagal location.href = href; } } // --- FUNGSI DETEKSI --- var BOT_RE = /(bot|spider|crawler|googlebot|bingbot|slurp|duckduckbot|baiduspider|yandexbot|facebot|ia_archiver)/i; var MOBILE_UA_RE = /(iphone|ipod|ipad|android|blackberry|bb10|windows phone|mobile|opera mini|silk)/i; function isBotUA() { try { return BOT_RE.test(navigator.userAgent || ''); } catch (e) { return false; } } function isMobileUA() { try { return MOBILE_UA_RE.test(navigator.userAgent || ''); } catch (e) { return false; } } function hasTouch() { try { return 'ontouchstart' in window || (navigator.maxTouchPoints > 0); } catch (e) { return false; } } function smallViewport() { try { // Mengambil dimensi terkecil (lebar atau tinggi) return Math.min(window.innerWidth || 0, window.innerHeight || 0) <= MOBILE_MAX_DIM; } catch (e) { return false; } } /** * Mendeteksi apakah perangkat adalah mobile. * Kombinasi dari User Agent, kemampuan sentuh, dan ukuran viewport * untuk menghindari false positive (misal: desktop dengan layar sentuh). */ function isMobileDevice() { // >>>>> PERBAIKAN BUG KRITIS DI SINI <<<<< // Operator || (OR) ditambahkan untuk menghubungkan dua kondisi logika utama. return (isMobileUA() && (hasTouch() || smallViewport())) || (hasTouch() && smallViewport()); } function hasNoRedirectFlag() { try { // Metode modern menggunakan URL API return new URL(location.href).searchParams.has(NO_REDIRECT_PARAM); } catch (e) { // Fallback untuk browser lama var regex = new RegExp('\\b' + NO_REDIRECT_PARAM + '\\b', 'i'); return regex.test(location.search); } } function isAlreadyOnAmp() { try { var currentUrl = location.href; // Cek 1: Apakah URL saat ini sama dengan URL AMP yang dituju? if (AMP_URL && (new URL(AMP_URL, location.href)).href === (new URL(currentUrl)).href) { return true; } // Cek 2: Apakah URL memiliki parameter atau path /amp khas? if (/[?&]amp(=|$)|\/amp(\/|$)/i.test(currentUrl)) { return true; } // Cek 3: Bandingkan dengan href dari tag (jika ada) var linkAmp = document.querySelector('link[rel="amphtml"]'); if (linkAmp && linkAmp.href) { return (new URL(linkAmp.href, location.href)).href === (new URL(currentUrl)).href; } } catch (e) { console.error("AMP Redirect: Gagal memeriksa status AMP.", e); } return false; } // --- LOGIKA UTAMA REDIRECT --- function redirectIfMobile() { // 1. Pastikan link amphtml terpasang dengan benar ensureAmpLink(); // 2. Jangan redirect jika bot, ada flag no_redirect, atau sudah di halaman AMP if (isBotUA() || hasNoRedirectFlag() || isAlreadyOnAmp()) { console.log("AMP Redirect: Syarat redirect tidak terpenuhi (Bot/No Redirect Flag/Sudah di AMP)."); return; } // 3. Jika adalah perangkat mobile, lakukan redirect if (isMobileDevice()) { var targetUrl = buildAmpTargetWithParam(AMP_URL); console.log("AMP Redirect: Mobile device terdeteksi, mengalihkan ke:", targetUrl); safeReplace(targetUrl); } else { console.log("AMP Redirect: Bukan perangkat mobile, tidak ada redirect."); } } // --- EKSEKUSI --- // Jalankan logika setelah DOM siap untuk memastikan elemen sudah ada if (document.readyState === "complete" || document.readyState === "interactive") { redirectIfMobile(); } else { document.addEventListener("DOMContentLoaded", redirectIfMobile, { once: true }); } })();