Force Simple Player

Bypasses ad-filled video sites by extracting the video element and launching it in a clean, standalone player.

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name        Force Simple Player
// @namespace   https://greasyfork.org/users/simple-player
// @version     1.3
// @description Bypasses ad-filled video sites by extracting the video element and launching it in a clean, standalone player.
// @author      anon
// @license     MIT
// @match       *://*/*
// @grant       none
// ==/UserScript==

(function () {
    const box = document.body.appendChild(document.createElement('div'));
    const list = box.appendChild(document.createElement('div'));
    const btn = box.appendChild(document.createElement('button'));

    Object.assign(box.style, { position: 'fixed', bottom: '16px', right: '16px', zIndex: 9e7, background: '#fff', border: '1px solid #ccc', padding: '4px', display: 'none', flexDirection: 'column', alignItems: 'flex-end' });
    Object.assign(list.style, { display: 'none', width: '240px', maxHeight: '200px', overflowY: 'auto' });
    btn.textContent = 'Launch Video';

    box.onmouseenter = () => list.style.display = 'flex';
    box.onmouseleave = () => list.style.display = 'none';

    setInterval(() => {
        const vids = [...document.querySelectorAll('video')].filter(v => v.duration > 1 && !v.dataset.v);
        if (!vids.length) return;

        box.style.display = 'flex';
        vids.forEach((v) => {
            v.dataset.v = 1;
            const item = list.appendChild(document.createElement('div'));
            const name = (v.currentSrc || v.src).split('/').pop().split('?')[0].slice(0, 20);
            item.innerHTML = `<div style="font-weight:bold;font-size:11px">${name}</div>
                              <div style="font-size:10px">${v.videoWidth}x${v.videoHeight} • ${~~(v.duration / 60)}:${(~~(v.duration % 60)).toString().padStart(2, 0)}</div>`;
            item.style.cssText = 'padding:6px;border-bottom:1px solid #eee;cursor:pointer';
            item.onclick = () => {
                document.documentElement.innerHTML = '';
                v.controls = 1;
                Object.assign(v.style, { maxWidth: '100vw', maxHeight: '100vh' });
                document.body.appendChild(v);
                v.play();
            };
        });
    }, 1000);
})();