youtube HTML5 Auto Loop

youtube再生時に自動ループする

目前為 2019-04-14 提交的版本,檢視 最新版本

// ==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.5
// @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,
  clickEventCache: false,
  init: function() {
    this.addListener();
    this.initLoop();
  },
  isLoop: function() {
    const 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 (let i in loop_off) {
      const target = document.querySelector(ele[i]);
      if (loop_off[i]) {
        if (i == 'when_enable_next_video_autoplay') {
          const 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() {
    const video = document.querySelector('#movie_player video');
    console.log(video)
    if (video) {
      if (this.loop) {
        video.setAttribute('loop', '');
      } else {
        video.removeAttribute('loop');
      }
    }
  },
  loopToggle: function() {
    this.loop = this.loop? false: true;
    this.loopOn();
  },
  loopDisplay: function() {
    const video = document.querySelector('video:hover');
    if (video) {
      const 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() {
    const mm = new MutationObserver(() => {
      const video = document.querySelector('#movie_player video');
      if (video) {
        const mo = new MutationObserver(() => {
          this.initLoop();
        });
        mo.observe(video, {attributes: true, attributeFilter: ['src']});
        mm.disconnect();
        this.initLoop();
      }
    });
    mm.observe(document.body, {childList: true, subtree: true});
  },
  addListener: function() {
    window.addEventListener('DOMContentLoaded', this, false);
    window.addEventListener('contextmenu', this, false);
  },
  handleEvent: function(e) {
    switch (e.type) {
      case 'DOMContentLoaded':
        this.watchAjax();
        break;
      case 'contextmenu':
        this.loopDisplay();
        break;
      case 'click':
        this.loopToggle();
        break;
    }
  }
};

YoutubeHTML5AutoLoop.init();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址