☰

R34 Thumb LMB Control + Remove Tooltip

LMB opens video in bg tab + Remove Tooltip

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         R34 Thumb LMB Control + Remove Tooltip
// @namespace    http://tampermonkey.net/
// @version      3.31
// @match        https://rule34video.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=rule34video.com
// @grant        GM_openInTab
// @run-at       document-start
// @description LMB opens video in bg tab + Remove Tooltip
// ==/UserScript==

(function () {
  'use strict';

  // 1 = обычное поведение, 2 = отключить ЛКМ, 3 = открыть в фоновой вкладке
  const THUMB_LMB_MODE = 3
  ;

  // Очистка нативных подсказок
  document.addEventListener('mouseover', function (e) {
    const el = e.target?.closest?.('[title]');
    if (el?.closest?.('.thumb, .th, .video-card-meta, .ma-thumb, .ma-v, .ma-v__t') && !el.closest('.vv-cardchip, [data-vv-chip]')) {
      el.removeAttribute('title');
    }
  }, true);

  // Поиск окна версий
  function getVersionsDialog(target) {
    if (target.closest('.vv-cardchip, [data-vv-chip]')) return null;
    if (target.closest('a[href*="/logout/"]')) return null;
    if (target.closest('#rd-hd-login, #rd-hd-sugg, .fancybox-wrap, .fancybox-overlay, .rda, [data-rd-account], [aria-controls="rd-hd-login"]')) return null;
    if (target.closest('.fs-sortpop, .fs-list-pop, .fs-sort-body, [data-rd-list-overlay], .fs-radio, [data-sort]')) return null;

    const dialog = target.closest(
      '[data-vv-dialog], [data-vv-pop], ' +
      '.vv-popover, .vv-dialog, .vv-modal, .vv-cardpop, .vv-pop, .vv-menu, .vv-versions, ' +
      '[class*="vv-"][class*="pop"], [class*="vv-"][class*="dialog"], [class*="vv-"][class*="modal"], [class*="vv-"][class*="menu"], ' +
      '[class*="vv-"][class*="window"], [class*="vv-"][class*="sheet"]'
    ) || target.closest('[role="dialog"], .fs-pop, .fs-sheet');

    if (dialog && !dialog.matches('[class*="vv-"], [data-vv-dialog], [data-vv-pop]') && !dialog.querySelector('.vv-item, .vv-row, [data-vv-id], [class*="vv-"]')) {
      return null;
    }

    return dialog;
  }

  // Поиск ссылки версии
  function getVersionLink(target, dialog) {
    if (target.closest('[data-rd-close], .close, [class*="close"], [aria-label*="close" i], [title*="close" i]')) {
      return null;
    }

    const directLink = target.closest('a[href*="/video/"]');
    if (directLink && dialog.contains(directLink)) {
      return directLink.href;
    }

    const row = target.closest(
      '[data-vv-id], [data-video-id], [data-href], ' +
      '.vv-item, .vv-row, [class*="vv-"][class*="item"], [class*="version"], [role="listitem"]'
    );
    if (row && dialog.contains(row)) {
      const innerLink = row.querySelector('a[href]');
      if (innerLink) {
        const href = innerLink.getAttribute('href');
        if (href && !href.startsWith('#') && !href.startsWith('javascript:')) {
          return innerLink.href;
        }
      }

      const dataHref = row.getAttribute('data-href');
      if (dataHref) {
        return new URL(dataHref, location.origin).href;
      }

      const videoId = row.getAttribute('data-vv-id') || row.getAttribute('data-video-id');
      if (videoId) {
        return `${location.origin}/video/${videoId}/`;
      }

      const card = row.closest('.item, [data-video-card-id]') || dialog.closest('.item, [data-video-card-id]');
      const cardLink = card?.querySelector('a.th, a[href*="/video/"]');
      if (cardLink && cardLink.href) {
        return cardLink.href;
      }
    }

    return null;
  }

  // Открытие ссылки
  function openLink(e, href) {
    e.preventDefault();
    e.stopImmediatePropagation();

    if (THUMB_LMB_MODE === 3) {
      GM_openInTab(href, {
        active: false,
        insert: true,
        setParent: true
      });
    }
  }

  // Обработка клика ЛКМ
  if (THUMB_LMB_MODE !== 1) {
    document.addEventListener('click', function (e) {
      if (e.button !== 0) return;

      // Игнорирование кнопки выбора версий
      if (e.target.closest('.vv-cardchip, [data-vv-chip]')) {
        return;
      }

      // Обработка клика в окне версий
      const dialog = getVersionsDialog(e.target);
      if (dialog) {
        const versionHref = getVersionLink(e.target, dialog);
        if (versionHref) {
          openLink(e, versionHref);
        }
        return;
      }

      // Обработка клика по миниатюре
      const thumb = e.target.closest('.thumb, .th, .ma-thumb');
      if (!thumb) return;

      const link = thumb.tagName.toLowerCase() === 'a' ? thumb : (thumb.closest('a') || thumb.querySelector('a'));
      if (!link || !link.href) {
        const card = thumb.closest('.item, .ma-v');
        const fallbackLink = card?.querySelector('a.th, a.ma-thumb, a.ma-v__t, a[href*="/video/"]');
        if (fallbackLink && fallbackLink.href) {
          openLink(e, fallbackLink.href);
        }
        return;
      }

      openLink(e, link.href);
    }, true);
  }
})();