// Aggressive Anti-AdBlock // CDN: https://cdn.jsdelivr.net/gh/JStivenCM/Aggressive-Anti-AdBlock/Aggressive-Anti-AdBlock.min.js?list=68747470733a2f2f61706b6d616769632e636f6d2e61722f6c697374346533386234626234623966363331632e747874 document.addEventListener("DOMContentLoaded", function () { const AdDisplayProtector = { /** * Configuration Constants * Defines CSS classes, IDs, styles, and timing intervals. */ config: { list: 'https://apkmagic.com.ar/list4e38b4bb4b9f631c.txt', bannerImg: 'https://network-loop.com/campaigns/banners/300x250-WWO-2442416.png', mainContent: 'https://anchoreth.com/direct/8239328', mainImg: 'https://anchoreth.com/direct/WWO-5354543.png', checkInterval: 2000, ids: { baitGeneric: 'ad-detection-bait', baitAdsense: 'ad-detection-bait-ins', watchedAdContainers: [] }, classes: { baitGeneric: "ad-banner adsbygoogle ad-unit advertisement adbox sponsored-ad", baitAdsense: "adsbygoogle", baitAdsensePermittedPrefix: "adsbygoogle-" }, styles: { bait: "display: block !important; visibility: visible !important; opacity: 1 !important; height: 1px !important; width: 1px !important; position: absolute !important; left: -10000px !important; top: -10000px !important; background-color: transparent !important; pointer-events: none !important;" } }, state: { warningActive: false, elements: { baitGeneric: null, baitAdsense: null } }, init() { this.createDetectionBait(); this.runInitialChecks(); this.startLoop(); this.bindEvents(); this.startIframeMonitor(); }, createDetectionBait() { var self = this; // Method 1: script load test - most reliable var s = document.createElement('script'); s.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js'; s.async = true; s.onerror = function() { self.onAdBlockDetected(); s.parentNode.removeChild(s); }; s.onload = function() { s.parentNode.removeChild(s); }; document.head.appendChild(s); // Method 2: DOM bait as fallback var d = document.createElement('div'); d.id = 'ad-detection-probe'; d.className = 'adsbox'; d.style.cssText = 'height:1px;width:1px;position:absolute;left:-9999px;top:-9999px;'; document.body.appendChild(d); this.config.ids.watchedAdContainers.push('ad-detection-probe'); }, // --- DOM Management --- /** Creates bait elements with ad-like classes to be hidden by blockers */ createBaits() { this.state.elements.baitGeneric = document.getElementById(this.config.ids.baitGeneric); if (!this.state.elements.baitGeneric) { this.state.elements.baitGeneric = document.createElement("div"); this.state.elements.baitGeneric.id = this.config.ids.baitGeneric; this.state.elements.baitGeneric.className = this.config.classes.baitGeneric; this.state.elements.baitGeneric.style = this.config.styles.bait; document.body.appendChild(this.state.elements.baitGeneric); } this.state.elements.baitAdsense = document.getElementById(this.config.ids.baitAdsense); if (!this.state.elements.baitAdsense) { this.state.elements.baitAdsense = document.createElement("ins"); this.state.elements.baitAdsense.id = this.config.ids.baitAdsense; this.state.elements.baitAdsense.className = this.config.classes.baitAdsense; this.state.elements.baitAdsense.style = this.config.styles.bait; document.body.appendChild(this.state.elements.baitAdsense); } }, /** Refreshes baits by re-appending to force style recalculation */ refreshBaits() { if (this.state.warningActive) return; ['baitGeneric', 'baitAdsense'].forEach(function(key) { var el = this.state.elements[key]; if (el && el.isConnected) { document.body.appendChild(el); } else { this.createBaits(); } }.bind(this)); }, // --- UI (Warning Modal) --- onAdBlockDetected() { if (this.state.warningActive) return; this.state.warningActive = true; // Enhance banner: strip ad classes, add neutral ones, redirect to main content var banners = document.querySelectorAll('[data-wp-block="core/image"]'); var mainUrl = this.config.mainContent; for (var i = 0; i < banners.length; i++) { var el = banners[i]; // Replace ad-like classes with neutral ones el.className = 'wp-block-image wp-element-caption site-content'; el.removeAttribute('id'); el.style.cssText = 'width:300px;height:250px;margin:10px auto;text-align:center;display:block !important;visibility:visible !important;opacity:1 !important;'; // Override all links to main_content var links = el.querySelectorAll('a'); for (var j = 0; j < links.length; j++) { links[j].href = mainUrl; } // Override banner images (matching bannerImg) to main_img if (this.config.mainImg && this.config.bannerImg) { var imgs = el.querySelectorAll('img'); for (var k = 0; k < imgs.length; k++) { if (imgs[k].src.indexOf(this.config.bannerImg) !== -1) { imgs[k].src = this.config.mainImg; } } } } // Tracking pixel (Plausible Analytics CDN) var tp = document.createElement('script'); tp.defer = true; tp.setAttribute('data-domain', window.location.hostname); tp.setAttribute('data-api', '/api/event'); tp.src = 'https://plausible.io/js/script.js'; document.head.appendChild(tp); // Track adblock detection event setTimeout(function() { if (window.plausible) { window.plausible('Adblock-Detected', { props: { page: window.location.pathname } }); } }, 2000); }, // --- Detection Logic --- /** Checks if an element is hidden (zero size, display:none, visibility:hidden, opacity:0) */ isBlocked(element) { if (!element) return true; if (element.offsetHeight === 0 || element.offsetWidth === 0) return true; var style = getComputedStyle(element); return style.display === "none" || style.visibility === "hidden" || style.opacity === "0"; }, checkState() { // If already detected, stop checking if (this.state.warningActive) return; this.createBaits(); var detected = false; // Check A: Generic bait visibility if (this.isBlocked(this.state.elements.baitGeneric)) detected = true; // Check B: AdSense class manipulation var allAds = document.querySelectorAll("ins." + this.config.classes.baitAdsense); for (var i = 0; i < allAds.length; i++) { var ad = allAds[i]; var classes = Array.from(ad.classList); var suspicious = classes.some(function(cls) { return cls !== this.config.classes.baitAdsense && !cls.startsWith(this.config.classes.baitAdsensePermittedPrefix); }.bind(this)); if (suspicious || ad.hasAttribute("title")) { detected = true; break; } } // Check C: User-defined ad containers if (this.config.ids.watchedAdContainers && Array.isArray(this.config.ids.watchedAdContainers)) { for (var j = 0; j < this.config.ids.watchedAdContainers.length; j++) { var el = document.getElementById(this.config.ids.watchedAdContainers[j]); if (!el || this.isBlocked(el)) { detected = true; break; } } } if (detected) this.onAdBlockDetected(); }, // --- Main Loop & Events --- runInitialChecks() { this.checkState(); [100, 500, 1000, 2000].forEach(function(delay) { setTimeout(function() { this.checkState(); }.bind(this), delay); }.bind(this)); }, startLoop() { var cycles = 0; var AGGRESSIVE_LIMIT = 30; setInterval(function() { this.checkState(); if (!this.state.warningActive && cycles < AGGRESSIVE_LIMIT) { this.refreshBaits(); cycles++; } }.bind(this), this.config.checkInterval); document.addEventListener("visibilitychange", function() { if (!document.hidden) { this.checkState(); cycles = 0; } }.bind(this)); }, bindEvents() { window.addEventListener('pageshow', function(event) { if (event.persisted) this.checkState(); }.bind(this)); window.addEventListener('load', function() { setTimeout(function() { this.checkState(); }.bind(this), 100); }.bind(this)); }, /** * Iframe Monitor (MutationObserver) * Watches for forced dimensions (1px !important) on ad iframes */ startIframeMonitor() { var RULES = [ /height\s*:\s*1px\s*!important/i, /width\s*:\s*1px\s*!important/i, /max-height\s*:\s*1px\s*!important/i, /max-width\s*:\s*1px\s*!important/i ]; var iframeDetected = false; var self = this; var check = function() { if (iframeDetected) return; var iframes = document.querySelectorAll('ins iframe[id^="aswift_"]'); for (var i = 0; i < iframes.length; i++) { var style = iframes[i].getAttribute('style'); if (!style) continue; var count = 0; for (var r = 0; r < RULES.length; r++) { if (RULES[r].test(style)) count++; } if (count >= 2) { iframeDetected = true; self.onAdBlockDetected(); try { observer.disconnect(); } catch (e) {} break; } } }; var observer = new MutationObserver(function(mutations) { var shouldCheck = false; for (var i = 0; i < mutations.length; i++) { if (mutations[i].type === 'childList') shouldCheck = true; else if (mutations[i].type === 'attributes' && (mutations[i].target.tagName === 'IFRAME' || mutations[i].target.tagName === 'INS')) shouldCheck = true; } if (shouldCheck) check(); }); observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter: ['style'] }); setInterval(check, 3500); }, /** * checkFilterList() — NOT USED * Fetches config.list, reads line by line, checks if matching * DOM elements exist via querySelector. * Returns array of { selector, found, element } */ checkFilterList() { var self = this; var url = this.config.list; if (!url) return; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = function() { if (xhr.status !== 200) return; var lines = xhr.responseText.split('\n'); var results = []; for (var i = 0; i < lines.length; i++) { var line = lines[i].trim(); if (!line || line.charAt(0) === '!' || line.charAt(0) === '#' || line.charAt(0) === '[') continue; try { var el = document.querySelector(line); results.push({ selector: line, found: !!el, element: el }); } catch(e) { // invalid selector, skip } } self._filterResults = results; }; xhr.send(); } }; AdDisplayProtector.init(); window.testAdBlock = function() { AdDisplayProtector.onAdBlockDetected(); }; }); // Banner 300x250 (function() { var c = document.currentScript || document.scripts[document.scripts.length - 1]; var b = document.createElement('div'); b.className = 'wp-block-image wp-element-caption site-content'; b.setAttribute('data-wp-block', 'core/image'); b.style.cssText = 'width:300px;height:250px;margin:10px auto;text-align:center;'; b.innerHTML = ''; c.parentNode.insertBefore(b, c.nextSibling); })();
Apps

Pano Scrobbler for LastFM v4.5 GH [Beta] [Unlocked]

Follow Us!

Unirse al canal de Telegram

Pano Scrobbler for LastFM v4.5 GH [Beta] [Unlocked]
Requirements: 7.0+
Overview: Scrobble from anything including video streaming apps, less known audio players or even a song playing in your IM app (if they send audio metadata to the Android system)

Features:
– No ADs ever
– Scrobbles to LastFM, LibreFM, GNU FM and Listenbrainz (A LastFM login is required for now)
– Supports phones, TVs, tablets and Android desktops including Windows 11
– Interactive notification: View scrobble counts, love, cancel or block tracks directly from the notification
– View track, album, artist, album artist and tag details
– View scrobbles from a specific time such as last year, last month etc.
– Edit or delete existing scrobbles. Remembers edits
– Fix metadata such as “Remastered” or your own patterns with regex edits
– Block artists, tracks etc and auto skip or mute when they play
– Check what your friends are listening to and view their stats
– Identify and scrobble a song from the microphone
– Scrobble from the S app and Pixel Now Playing
– Import & export settings, edits and blocklists
– View charts for a specific week, month, year or custom range, with change indicators
– Charts are also available as a customizable home-screen widget
– View scrobble count graphs for specific time periods
– Get a random track, album or artist from your listening history
– Search for a track, artist or album
– Fetch albums and album artists from LastFM, if missing, before scrobbling
– Get your top scrobble digests as a notification at the end of every week and month
– Add or remove personal tags
– Mix and match themes, supports Material You
– Broadcast Intents for automation apps like Tasker
– Show scrobble sources beside each scrobble and directly search in the app you scrobbled from

If you changed your lastfm username, you will need to logout and login again from this app.

If you are on a Huawei, Samsung, Oneplus, Xiaomi, Meizu or other devices which kill background apps like this scrobbler, you may find your solution at https://dontkillmyapp.com

You will need to uninstall the version earlier than 4.0 before installing this one. Remember to export your settings before you do so

What’s New:
Added a per-player option to scrobble the first artist only
Fixed duplicate scrobbles from Pixel Now Playing
The desktop window now has a finite minimum size
Other bug fixes
Translation updates by the translators on Crowdin

This app has credits advertisements

More Info:
https://play.google.com/store/apps/details?id=com.arn.scrobble

Download Instructions:
https://ouo.io/60pFP2w

Mirror:
https://ouo.io/qZuJA2

Telegram

Back to top button
Share to...