Region loop

2024/5/15 14:39:50

目前为 2024-05-15 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Region loop
  3. // @namespace Violentmonkey Scripts
  4. // @match https://www.bilibili.com/video/*
  5. // @grant unsafeWindow
  6. // @version 1.0.1
  7. // @author 5ec1cff
  8. // @run-at document-body
  9. // @description 2024/5/15 14:39:50
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. ((window) => {
  14. let document = window.document;
  15. let enableCheck;
  16. let leftBtn;
  17. let leftResetBtn;
  18. let rightBtn;
  19. let rightResetBtn;
  20.  
  21. let left = null, right = null, enabled = false;
  22. function install(dom, video) {
  23. let root = dom.querySelector('#my_play_control');
  24. if (root == null) root = document.createElement('div');
  25. root.id = 'my_play_control';
  26. dom.appendChild(root);
  27. root.innerHTML = `
  28. <input type="checkbox" id="enable_loop">
  29. <label for="enable_loop">开启循环</label>
  30. <input type="button" value="[x" id="reset_left" />
  31. <input type="button" value="[" id="set_left" />
  32. <input type="button" value="]" id="set_right" />
  33. <input type="button" value="x]" id="reset_right" />
  34. `;
  35. enableCheck = root.querySelector('#enable_loop');
  36. leftBtn = root.querySelector('#set_left');
  37. leftResetBtn = root.querySelector('#reset_left');
  38. rightBtn = root.querySelector('#set_right');
  39. rightResetBtn = root.querySelector('#reset_right');
  40. enableCheck.addEventListener('change', () => {
  41. enabled = enableCheck.checked;
  42. })
  43. leftBtn.addEventListener('click', () => {
  44. let newLeft = video.currentTime;
  45. if (newLeft >= (right ?? Infinity)) return;
  46. left = newLeft;
  47. leftBtn.value='['+left;
  48. })
  49. rightBtn.addEventListener('click', () => {
  50. let newRight = video.currentTime;
  51. if (newRight <= (left ?? 0)) return;
  52. right = newRight;
  53. rightBtn.value=right+']';
  54. })
  55. leftResetBtn.addEventListener('click', () => {
  56. left = null;
  57. leftBtn.value='[';
  58. })
  59. rightResetBtn.addEventListener('click', () => {
  60. right = null;
  61. rightBtn.value=']';
  62. })
  63. video.addEventListener('timeupdate', () => {
  64. if (!enabled) return;
  65. let current = video.currentTime;
  66. if (current >= (right ?? Infinity) || current < left) video.currentTime = left ?? 0;
  67. })
  68. video.addEventListener('ended', () => {
  69. if (!enabled) return;
  70. video.currentTime = left ?? 0;
  71. video.play();
  72. })
  73. }
  74. let intv = 0;
  75. intv = setInterval(() => {
  76. let root = document.querySelector('#viewbox_report'), video = document.querySelector('video');
  77. if (root == null || video == null) return;
  78. install(root, video);
  79. console.log('install success on', root, video)
  80. clearInterval(intv);
  81. }, 1000)
  82.  
  83. })(unsafeWindow)