YouTube Anti-RickRoll

Give a warning alert if video is suspected RickRoll.

目前為 2024-11-18 提交的版本,檢視 最新版本

// ==UserScript==
// @name        YouTube Anti-RickRoll
// @match       *://*.youtube.com/watch*
// @grant       none
// @version     1.0.2
// @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 videoDetails = unsafeWindow.ytInitialPlayerResponse.videoDetails;
      const videoTitle = videoDetails?.title?.toLowerCase().replace(/\s+/g, '');
      const videoKeywords = videoDetails?.keywords?.map(keyword => keyword.toLowerCase().replace(/\s+/g, ''));

      const rickrollPattern = /(rickroll|rickastley|nevergoingtogiveyouup|nevergonnagiveyouup)/;

      // Check if videoTitle or videoKeywords exist and match the pattern
      if ((videoTitle && videoTitle.match(rickrollPattern)) || (videoKeywords && 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(message) {
  document.querySelector('video').pause();
  var userResponse = confirm(message);
  if (!userResponse) {
    if (document.querySelector('button[title="Mute (m)"]')) {
      document.querySelector('button[title="Mute (m)"]').click();
    }
  }
}

// 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("This is a RickRoll! Do you want to continue? (Cancel to mute)");
    } else if (isRickRoll()) {
        warning("This is likely a RickRoll! Do you want to continue? (Cancel to mute)");
    }
});