console.log("[MemberFilter] content script loaded"); const seen = new WeakSet(); function findMemberVideos(root = document) { const badges = root.querySelectorAll( 'badge-shape, ytd-badge-supported-renderer' ); badges.forEach(badge => { if (!badge.textContent?.includes("Nur für Kanalmitglieder")) return; const video = badge.closest("ytd-rich-item-renderer, ytd-video-renderer, ytd-grid-video-renderer"); if (!video) return; if (seen.has(video)) return; seen.add(video); // ---- extract data ---- const titleEl = video.querySelector("#video-title"); const channelEl = video.querySelector("ytd-channel-name a") || video.querySelector(".ytd-channel-name a"); const title = titleEl?.textContent?.trim() ?? "(no title)"; const url = titleEl?.href ?? "(no url)"; const channel = channelEl?.textContent?.trim() ?? "(no channel)"; console.group("[MemberFilter] Member-only video found"); console.log("Title :", title); console.log("Channel:", channel); console.log("URL :", url); console.log("Node :", video); console.groupEnd(); }); } // Initial scan findMemberVideos(); // Observe dynamic changes const observer = new MutationObserver(mutations => { for (const m of mutations) { for (const node of m.addedNodes) { if (!(node instanceof HTMLElement)) continue; findMemberVideos(node); } } }); observer.observe(document.body, { childList: true, subtree: true });