Greasy Fork is available in English.

Block YouTube on Player Card for Twitter

Blocks loading of YouTube videos on Player Card on Twitter

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         Block YouTube on Player Card for Twitter
// @namespace    https://foooomio.net/
// @version      0.3
// @description  Blocks loading of YouTube videos on Player Card on Twitter
// @author       foooomio
// @license      MIT License
// @match        https://twitter.com/i/cards-frame/*
// @connect      youtube.com
// @run-at       document-end
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(() => {
  'use strict';

  const $ = document.querySelector.bind(document);
  const h = (tag, attr) => Object.assign(document.createElement(tag), attr);

  function fetchImage(url, timeout = 1000) {
    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        url,
        method: 'GET',
        responseType: 'blob',
        timeout,
        ontimeout: () => reject(),
        onload: (data) => data.status === 200 ? resolve(data.response) : reject(),
      });
    });
  }

  async function getThumbnail(videoId) {
    const sizes = ['maxres', 'sd', 'hq', 'mq', ''];
    const urls = sizes.map((size) => `https://img.youtube.com/vi/${videoId}/${size}default.jpg`);
    const results = await Promise.allSettled(urls.map((url) => fetchImage(url, 200)));
    const fulfilled = results.find((result) => result.status === 'fulfilled');
    return fulfilled?.value ?? fetchImage('https://www.youtube.com/img/desktop/yt_1200.png');
  }

  const iframe = $('iframe');
  const src = new URL(iframe.dataset.src);

  if (src.hostname === 'www.youtube.com') {
    iframe.remove();

    const videoId = src.pathname.replace('/embed/', '');

    const img = h('img', {
      style: 'width: 100%; height: 100%; object-fit: cover;',
    });

    getThumbnail(videoId).then((blob) => {
      const url = URL.createObjectURL(blob);
      img.onload = () => URL.revokeObjectURL(url);
      img.src = url;
    });

    const a = h('a', {
      href: 'https://www.youtube.com/watch?v=' + videoId,
      rel: 'noopener noreferrer',
      target: '_blank',
    });

    a.append(img);
    document.body.append(a);
  }
})();