YouTube

YouTube Daha Kolay Kullan

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

Advertisement:

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

Advertisement:

// ==UserScript==
// @name         YouTube
// @namespace    http://tampermonkey.net
// @version      7
// @description  YouTube Daha Kolay Kullan
// @author       Atilla
// @match        https://www.youtube.com/*
// @icon         https://www.gstatic.com/youtube/img/branding/favicon/favicon_192x192_v2.png
// @grant        GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @grant GM_addStyle
// @noframes
// @require https://cdnjs.cloudflare.com/ajax/libs/arrive/2.5.2/arrive.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/notyf.min.js
// @license      MIT
// ==/UserScript==
(async () => {
  if (window.trustedTypes && !window.trustedTypes.defaultPolicy) {
    window.trustedTypes.createPolicy("default", {
      createHTML: (string) => string,
    });
  }

  window.addEventListener("keydown", async (ev) => {
    if (
      ev.ctrlKey &&
      ev.key.toLowerCase() === "f" &&
      location.href.includes("live_chat")
    ) {
      ev.preventDefault();
      let targetName = "";
      try {
        targetName = ytInitialData.contents.liveChatRenderer.viewerName;
      } catch (e) {
        console.error("❌ Kullanıcı adı ytInitialData içinden alınamadı!");
        return;
      }
      if (!targetName) {
        console.error("❌ Kullanıcı adı boş döndü.");
        return;
      }
      console.log(`🔍 Aranan isim: "${targetName}"`);
      const chatItems = document.querySelectorAll(
        "yt-live-chat-text-message-renderer",
      );
      let processedCount = 0;
      for (const item of chatItems) {
        const authorNameEl = item.querySelector("#author-name");
        if (authorNameEl && authorNameEl.textContent.trim() === targetName) {
          const menuButton = item.querySelector("#menu button");
          if (menuButton) {
            menuButton.click();
            await new Promise((resolve) => setTimeout(resolve, 150));
            const menuItems = document.querySelectorAll(
              "ytd-menu-navigation-item-renderer, ytd-menu-service-item-renderer",
            );
            for (const menuItem of menuItems) {
              const stringEl = menuItem.querySelector("yt-formatted-string");
              if (stringEl && stringEl.textContent.trim() === "Kaldır") {
                menuItem.click();
                processedCount++;
                await new Promise((resolve) => setTimeout(resolve, 150));
                break;
              }
            }
          }
        }
      }
      console.log(
        `✅ İşlem tamamlandı! Toplam ${processedCount} adet element için "Kaldır" tıklandı.`,
      );
      if (processedCount > 0) {
        new Notyf({
          duration: 15000,
          position: { x: "right", y: "top" },
          dismissible: true,
        }).success(
          `✅ İşlem tamamlandı! Toplam ${processedCount} adet element için "Kaldır" tıklandı.`,
        );
      } else {
        new Notyf({
          duration: 3000,
          position: { x: "left", y: "top" },
          dismissible: true,
        }).error("Kaldırılacak element bulunamadı");
      }
    }
  });

  let notyfCSS = document.createElement("link");
  notyfCSS.href = "https://cdn.jsdelivr.net/npm/[email protected]/notyf.min.css";
  notyfCSS.rel = "stylesheet";
  document.head.prepend(notyfCSS);

  // Depolama
  let DATA_addTimestampToUrl = GM_getValue("addTimestampToUrl", true);
  //==Depolama==

  GM_registerMenuCommand("Ayarlar: Video Süresini URL'Ye Kaydet", () => {
    let newData = !GM_getValue("addTimestampToUrl", true);
    GM_setValue("addTimestampToUrl", newData);
    console.log(
      "%c 'addTimestampToUrl' Veri Başarıyla Kaydedildi",
      "color: green;",
    );
    new Notyf({
      duration: 3000,
      dismissible: true,
      position: { x: "right", y: "top" },
    }).success(
      `${GM_getValue("addTimestampToUrl", true)} 'addTimestampToUrl' Veri Başarıyla Kaydedildi`,
    );
  });

  // Video Süresini URL'ye Kaydet
  if (DATA_addTimestampToUrl === true) {
    const addTimestampToUrl = () => {
      window.addEventListener("keydown", (e) => {
        if (
          (e.ctrlKey || e.metaKey) &&
          e.key.toLowerCase() === "s" &&
          location.href.includes("watch?v")
        ) {
          e.preventDefault();

          const video = document.querySelector("video");
          if (!video) return;

          const seconds = Math.floor(video.currentTime);
          const url = new URL(window.location.href);

          url.searchParams.set("t", seconds);
          window.history.pushState(null, "", url.toString());
        }
      });
    };

    addTimestampToUrl();
  }

  // Video ön izlemesini kaldır
  document.querySelectorAll("#video-preview").forEach((value) => {
    if (!location.href.includes("shorts") || !location.href.includes("watch")) {
      value.remove();
      console.log(value);
    }
  });

  document.arrive("#video-preview", (newElem) => {
    if (!location.href.includes("shorts") || !location.href.includes("watch")) {
      newElem.remove();
      console.log(newElem);
    }
  });

  document.querySelectorAll("*").forEach((value) => {
    if (value.tagName.startsWith("ANIMATED-THUMBNAIL")) {
      value.remove();
      console.log(value);
    }
  });
  document.arrive("*", (newElem) => {
    if (newElem.tagName.startsWith("ANIMATED-THUMBNAIL")) {
      newElem.remove();
      console.log(newElem);
    }
  });
  //==Video ön izlemesini kaldır==

  // Canlı sohbet hızlı yanıtlama
  const insertUserTag = (authorName) => {
    const inputContainer = document.querySelector(
      '#input.yt-live-chat-text-input-field-renderer, #textarea, [contenteditable="true"]',
    );
    if (!inputContainer) return;

    const tag = authorName.startsWith("@")
      ? authorName + "\u00A0"
      : "@" + authorName + "\u00A0";

    inputContainer.focus();

    if (inputContainer.firstChild) {
      inputContainer.firstChild.textContent =
        tag + inputContainer.firstChild.textContent;
    } else {
      inputContainer.textContent = tag;
    }

    try {
      const range = document.createRange();
      const sel = window.getSelection();

      const textNode = inputContainer.firstChild || inputContainer;

      range.setStart(textNode, tag.length);
      range.collapse(true);

      sel.removeAllRanges();
      sel.addRange(range);
    } catch (err) {
      console.error("İmleç hareketiyle ilgili hata:", err);
    }

    inputContainer.dispatchEvent(
      new InputEvent("input", {
        bubbles: true,
        cancelable: true,
        inputType: "insertText",
        data: tag,
      }),
    );
    inputContainer.dispatchEvent(new KeyboardEvent("keyup", { bubbles: true }));
  };

  document.addEventListener(
    "click",
    (e) => {
      const authorElement = e.target.closest(
        "#author-name, .yt-live-chat-author-chip",
      );

      if (authorElement) {
        const authorName = authorElement.textContent.trim();

        if (authorName) {
          e.preventDefault();
          e.stopPropagation();

          insertUserTag(authorName);
        }
      }
    },
    true,
  );
  //==Canlı sohbet hızlı yanıtlama==

  // Yorumlar sağ panelde
  GM_addStyle(`
#secondary{height:calc(100vh - 80px);overflow:scroll;overflow-x:hidden;overscroll-behavior:contain}#secondary::-webkit-scrollbar{display:block;width:16px}#secondary::-webkit-scrollbar-thumb{height:56px;border-radius:8px;border:4px solid transparent;background-clip:content-box;background-color:var(--yt-opalescence-dark-grey)}#secondary::-webkit-scrollbar-thumb:hover,#secondary::-webkit-scrollbar-thumb:active{background-color:var(--yt-spec-icon-disabled)}
    `);

  const getComments = () => document.getElementById("comments");
  const getWatchNext = () => document.getElementById("related");
  const getRightPanel = () => document.getElementById("secondary-inner");
  const getLeftPanel = () => document.getElementById("primary-inner");

  const panelsContainNodes = () => {
    const commentsNode = getComments();
    const watchNextNode = getWatchNext();
    return !!(
      commentsNode &&
      watchNextNode &&
      getLeftPanel()?.contains(commentsNode) &&
      getRightPanel()?.contains(watchNextNode)
    );
  };

  const swapCommentsAndWatchNext = () => {
    const commentsNode = getComments();
    const watchNextNode = getWatchNext();

    if (!commentsNode || !watchNextNode) return;

    const leftParent = commentsNode.parentElement;
    const rightParent = watchNextNode.parentElement;

    if (leftParent && rightParent && panelsContainNodes()) {
      try {
        const removedComments = leftParent.removeChild(commentsNode);
        const removedWatchNext = rightParent.removeChild(watchNextNode);

        leftParent.appendChild(removedWatchNext);
        rightParent.appendChild(removedComments);
      } catch (error) {
        console.error(`YouTube Yorum Taşıma Hatası: ${error.message}`);
      }
    }
  };

  let timeoutId = null;
  const observer = new MutationObserver(() => {
    if (panelsContainNodes()) {
      swapCommentsAndWatchNext();
    } else if (getComments() && getWatchNext() && !timeoutId) {
      timeoutId = setTimeout(() => {
        if (panelsContainNodes()) swapCommentsAndWatchNext();
        timeoutId = null;
      }, 300);
    }
  });

  const commentsInit = () => {
    const targetNode =
      document.querySelector("ytd-page-manager") || document.body;
    observer.observe(targetNode, { childList: true, subtree: true });

    if (panelsContainNodes()) {
      swapCommentsAndWatchNext();
    }
  };

  commentsInit();
  //==Yorumlar sağ panelde==
})();