youtube HTML5 Auto Loop

youtubeHTML5プレイヤー再生時に自動ループする

目前为 2018-09-28 提交的版本。查看 最新版本

// ==UserScript==
// @name           youtube HTML5 Auto Loop
// @namespace      youtube HTML5 Auto Loop
// @grant          none
// @description    youtubeHTML5プレイヤー再生時に自動ループする
// @author         TNB
// @match          https://www.youtube.com/*
// @version        1.4
// ==/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() {
    var mo = new MutationObserver(() => {
      if (document.getElementById('items') || document.querySelector('html[data-cast-api-enabled]')) {
        this.loop = this.isLoop();
        this.loopOn();
        mo.disconnect();
      }
    });
    mo.observe(document, {childList: true, subtree: true});
  },
  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]');
      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 video = document.getElementsByTagName('video')[0];
      if (video && !flg) {
        flg = true;
        this.initLoop();
        var mo = new MutationObserver(() => {this.initLoop();});
        mo.observe(video, {attributes: true, attributeFilter: ['style', 'src']});
        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();

QingJ © 2025

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