YouTube Anti-RickRoll

Give a warning alert if video is suspected RickRoll.

目前为 2024-11-17 提交的版本。查看 最新版本

// ==UserScript==
// @name        YouTube Anti-RickRoll
// @match       *://*.youtube.com/watch*
// @grant       none
// @version     1.0
// @author      yodaluca23
// @license      GNU GPLv3
// @description Give a warning alert if video is suspected RickRoll.
// @namespace https://greasyfork.org/users/1315976
// ==/UserScript==

const jsonUrl = 'https://raw.githubusercontent.com/larssieboy18/rickroll-list/refs/heads/main/rickrolls.json';

// Function to fetch JSON and extract YouTube IDs from GitHub database
async function extractYouTubeIDs() {
    try {
        const response = await fetch(jsonUrl);
        const data = await response.json();

        const youtubeRegex = /(?:youtube\.com\/watch\?v=|youtu\.be\/|video_id=)([\w-]+)/g;

        const links = data.rickrolls || [];

        const youtubeIDs = [];
        for (const link of links) {
            let match;
            while ((match = youtubeRegex.exec(link)) !== null) {
                youtubeIDs.push(match[1]);
            }
        }

        return youtubeIDs;
    } catch (error) {
        console.error('Error fetching or processing data:', error);
        return [];
    }
}

// Function to check if the video is a Rickroll
function isRickRoll() {
    try {
        const videoTitle = unsafeWindow.ytInitialPlayerResponse.videoDetails.title.toLowerCase().replace(/\s+/g, '');
        const videoKeywords = unsafeWindow.ytInitialPlayerResponse.videoDetails.keywords.map(keyword => keyword.toLowerCase().replace(/\s+/g, ''));

        const rickrollPattern = /(rickroll|rickastley)/;

        if (videoTitle.match(rickrollPattern) || videoKeywords.some(keyword => keyword.match(rickrollPattern))) {
            return true;
        }
    } catch (e) {
        console.error('Error while checking video details:', e);
    }
    return false;
}

// Function to display warning
function warning() {
    document.querySelector('video').pause();
    alert("This is likely a RickRoll! Do you want to continue?");
}

// Main logic
extractYouTubeIDs().then((ids) => {
    const currentVideoID = window.location.href.match(/(?:youtube\.com\/watch\?v=|youtu\.be\/)([\w-]+)/);

    if (currentVideoID && ids.includes(currentVideoID[1])) {
        warning();
    } else if (isRickRoll()) {
        warning();
    }
});