☰

Rule34 + Realbooru AutoPlay + Loop

Autoplay and loop videos on Rule34 and Realbooru

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

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

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

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

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

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

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

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

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

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

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

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

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

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

このスクリプトの質問や評価の投稿はこちら、通報はこちらへお寄せください
// ==UserScript==
// @name         Rule34 + Realbooru AutoPlay + Loop
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Autoplay and loop videos on Rule34 and Realbooru
// @match        https://rule34.xxx/*
// @match        https://www.rule34.xxx/*
// @match        https://realbooru.com/*
// @match        https://www.realbooru.com/*
// @grant        none
// @license      DallasGWS
// ==/UserScript==

(function () {
    'use strict';

    function log(...msg) {
        console.log('[Bo​oru-Auto]', ...msg);
    }

    function autoplay(video) {
        const play = () => {
            if (!video.isConnected) return;

            video.play().catch(() => {
                setTimeout(play, 200);
            });
        };

        play();
    }

    function setup(video) {
        if (!video || video.dataset.autoplaySetup === 'true') return;

        video.dataset.autoplaySetup = 'true';

        log('Video found:', video);

        // Enable looping
        video.loop = true;

        // Autoplay
        autoplay(video);
    }

    function findVideos() {
        return document.querySelectorAll('video');
    }

    function checkVideos() {
        findVideos().forEach(setup);
    }

    // Initial load
    checkVideos();

    // Detect videos loaded later
    const observer = new MutationObserver(() => {
        checkVideos();
    });

    observer.observe(document.documentElement, {
        childList: true,
        subtree: true
    });

    // Also check periodically in case the site's player replaces
    // the video without generating a useful mutation.
    setInterval(checkVideos, 1000);

})();