Greasy Fork is available in English.

YouTube 影片自動刷新(僅在前6秒內檢查3次,排除主頁和搜索頁面)

在YouTube影片載入後的6秒內檢測是否暫停,如果暫停則自動刷新頁面。每2秒檢查一次,最多檢查3次。在主頁和搜索結果頁面不執行。

  1. // ==UserScript==
  2. // @name YouTube 影片自動刷新(僅在前6秒內檢查3次,排除主頁和搜索頁面)
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.0
  5. // @license MIT
  6. // @description 在YouTube影片載入後的6秒內檢測是否暫停,如果暫停則自動刷新頁面。每2秒檢查一次,最多檢查3次。在主頁和搜索結果頁面不執行。
  7. // @match https://www.youtube.com/*
  8. // @grant none
  9. // ==/UserScript==
  10. (function() {
  11. 'use strict';
  12.  
  13. // 檢查是否在主頁或搜索頁面
  14. if (window.location.href === "https://www.youtube.com/" ||
  15. window.location.href.includes("https://www.youtube.com/results?search_query=")) {
  16. return; // 如果是主頁或搜索頁面,直接結束腳本執行
  17. }
  18.  
  19. function checkVideoStatus(videoId) {
  20. // 檢查是否已經對該影片執行過檢查
  21. if (sessionStorage.getItem('checked_' + videoId)) {
  22. return; // 如果已檢查過,直接返回
  23. }
  24.  
  25. const video = document.querySelector('video');
  26. if (video) {
  27. // 如果影片已經播放超過6秒,不執行檢查
  28. if (video.currentTime > 6) {
  29. sessionStorage.setItem('checked_' + videoId, 'true');
  30. return;
  31. }
  32.  
  33. let checkCount = 0;
  34. const checkInterval = setInterval(() => {
  35. checkCount++;
  36. if (checkCount > 3 || video.currentTime > 10) {
  37. clearInterval(checkInterval);
  38. sessionStorage.setItem('checked_' + videoId, 'true');
  39. return;
  40. }
  41.  
  42. if (video.paused) {
  43. // 如果影片處於暫停狀態,刷新頁面
  44. clearInterval(checkInterval);
  45. location.reload();
  46. }
  47. }, 2000); // 每2秒檢查一次
  48.  
  49. // 如果影片開始播放,停止檢查並標記為已檢查
  50. video.addEventListener('play', () => {
  51. clearInterval(checkInterval);
  52. sessionStorage.setItem('checked_' + videoId, 'true');
  53. }, { once: true });
  54. }
  55. }
  56.  
  57. function getVideoId(url) {
  58. const urlParams = new URLSearchParams(new URL(url).search);
  59. return urlParams.get('v');
  60. }
  61.  
  62. function handleUrlChange() {
  63. const currentUrl = window.location.href;
  64. if (currentUrl.includes('watch?v=')) {
  65. const videoId = getVideoId(currentUrl);
  66. if (videoId) {
  67. // 重置檢查狀態
  68. sessionStorage.removeItem('checked_' + videoId);
  69. checkVideoStatus(videoId);
  70. }
  71. }
  72. }
  73.  
  74. // 使用 MutationObserver 監聽 URL 變化
  75. const observer = new MutationObserver((mutations) => {
  76. for (let mutation of mutations) {
  77. if (mutation.type === 'childList') {
  78. handleUrlChange();
  79. break;
  80. }
  81. }
  82. });
  83.  
  84. observer.observe(document.body, {
  85. childList: true,
  86. subtree: true
  87. });
  88.  
  89. // 初始檢查
  90. handleUrlChange();
  91. })();