您需要先安装一个扩展,例如 篡改猴、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.4.2 // ==/UserScript== 'use strict'; var loop_off = { when_enable_next_video_autoplay: false, when_playlist: false, with_embedded_video: false }; var YoutubeHTML5AutoLoop = { loop: true, clickEventCache: false, init: function() { this.initLoop(); this.addListener(); }, isLoop: function() { var ele = { when_enable_next_video_autoplay: '#improved-toggle[aria-pressed="true"]', when_playlist: '#playlist:not([hidden])', with_embedded_video: 'html[data-cast-api-enabled]' }; for (var i in loop_off) { var target = document.querySelector(ele[i]); if (loop_off[i]) { if (i == 'when_enable_next_video_autoplay') { var toggle = document.querySelector('#improved-toggle'); if (toggle) toggle.addEventListener('click', this, false); } if (target) return false; } } return true; }, initLoop: function() { this.loop = this.isLoop(); this.loopOn(); }, loopOn: function() { var video = document.getElementsByTagName('video')[0]; if (video) { if (this.loop) { video.setAttribute('loop', ''); } else { video.removeAttribute('loop'); } } }, loopToggle: function() { this.loop = this.loop? false: true; this.loopOn(); }, loopDisplay: function() { var video = document.querySelector('video:hover'); if (video) { var checkBox = document.querySelector('.ytp-contextmenu [aria-checked]'); if (checkBox) { checkBox.setAttribute('aria-checked', this.loop); if (!this.clickEventCache) { checkBox.addEventListener('click', this, false); this.clickEventCache = true; } } } }, watchAjax: function() { var flg = false, mm = new MutationObserver(() => { var videoContents = document.getElementById('movie_player'); if (videoContents && !flg) { flg = true; var mo = new MutationObserver(() => { if (videoContents.classList.contains('playing-mode')) this.initLoop(); }); mo.observe(videoContents, {attributes: true, attributeFilter: ['class']}); mm.disconnect(); } }); mm.observe(document.body, {childList: true, subtree: true}); }, addListener: function() { window.addEventListener('load', this, false); window.addEventListener('contextmenu', this, false); }, handleEvent: function(e) { switch (e.type) { case 'load': this.watchAjax(); break; case 'contextmenu': this.loopDisplay(); break; case 'click': this.loopToggle(); break; } } }; YoutubeHTML5AutoLoop.init();