您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
youtube再生時に自動ループする
当前为
// ==UserScript== // @name youtube HTML5 Auto Loop // @namespace youtube HTML5 Auto Loop // @grant none // @description youtube再生時に自動ループする // @author TNB // @match https://www.youtube.com/* // @version 1.5.1 // @run-at document-start // ==/UserScript== 'use strict'; const loop_off = { when_enable_next_video_autoplay: false, when_playlist: false, with_embedded_video: false }; const YoutubeHTML5AutoLoop = { loop: true, video: null, prevSrc: null, button: null, eventcache: false, cancelInit: false, ele: { when_enable_next_video_autoplay: '.ytp-button:not([style*="display"]) .ytp-autonav-toggle-button[aria-checked="true"]', when_playlist: '#secondary-inner > #playlist:not([hidden])', with_embedded_video: 'html[data-cast-api-enabled="true"]' }, init: function() { this.addListener(); }, isLoop: function() { return !Object.keys(loop_off).some(a => loop_off[a] && document.querySelector(this.ele[a])); }, goLoop: function() { this.video.currentTime = 0; this.video.play; }, loopOn: function() { if (this.loop) this.video.setAttribute('loop', this.loop); else this.video.removeAttribute('loop'); }, initLoop: function() { this.loop = this.isLoop(); this.loopOn(); }, loopToggle: function() { this.loop = !this.loop; this.loopOn(); }, loopDisplay: function() { const video = document.querySelector('video:hover'); if (!video) return; const checkBox = document.querySelector('.ytp-contextmenu [aria-checked]'); checkBox.setAttribute('aria-checked', this.loop); if (!this.eventcache) { checkBox.addEventListener('click', this, true); this.eventcache = true; } }, watchAjax: function() { if (window != window.parent && document.getElementById('chat')) return; const mm = new MutationObserver(() => { const player = document.getElementById('movie_player'); if (!player) return; this.video = player.querySelector('video'); const mo = new MutationObserver(() => { if (this.video.src != this.prevSrc) this.cancelInit = false; if (!this.cancelInit) this.initLoop(); if (this.loop && player.classList.contains('ended-mode')) this.goLoop(); this.prevSrc = this.video.src; }); mo.observe(player, {attributes: true, attributeFilter: ['class']}); if (loop_off.when_enable_next_video_autoplay) this.addToggleEvent(); this.initLoop(); mm.disconnect(); }); mm.observe(document.body, {childList: true, subtree: true}); }, addToggleEvent: function() { this.button = document.querySelector('.ytp-autonav-toggle-button'); if (!this.button) return; this.button.addEventListener('click', () => { this.loop = JSON.parse(this.button.getAttribute('aria-checked')); this.cancelInit = true }); }, addListener: function() { window.addEventListener('DOMContentLoaded', this); window.addEventListener('contextmenu', this); }, handleEvent: function(e) { switch (e.type) { case 'DOMContentLoaded': this.watchAjax(); break; case 'contextmenu': this.loopDisplay(); break; case 'click': this.loopToggle(); document.body.click(); if (this.button && !document.querySelector('#secondary-inner > #playlist:not([hidden])')) this.button.click(); this.cancelInit = true e.stopPropagation(); break; } } }; YoutubeHTML5AutoLoop.init();