TimeHookerLite

Set adjustable playback speed on selected websites

  1. // ==UserScript==
  2. // @name TimeHookerLite
  3. // @namespace https://cozian.timehooker.com
  4. // @version 1.4
  5. // @description Set adjustable playback speed on selected websites
  6. // @author cozian
  7. // @license MIT
  8. // @include *
  9. // @run-at document-start
  10. // @grant GM_registerMenuCommand
  11. // @grant GM_getValue
  12. // @grant GM_setValue
  13. // ==/UserScript==
  14.  
  15. (function() {
  16. 'use strict';
  17.  
  18. // Retrieve include list and playback speed, or initialize defaults
  19. let includeList = GM_getValue("includeList", []);
  20. let playbackSpeed = GM_getValue("playbackSpeed", 10); // Default speed of 10x
  21.  
  22. // Function to add the current site to the include list
  23. function addToIncludeList() {
  24. const currentSite = window.location.hostname;
  25. if (!includeList.includes(currentSite)) {
  26. includeList.push(currentSite);
  27. GM_setValue("includeList", includeList);
  28. alert(`Added ${currentSite} to include list.`);
  29. } else {
  30. alert(`${currentSite} is already in the include list.`);
  31. }
  32. }
  33.  
  34. // Function to set a new playback speed
  35. function setPlaybackSpeed() {
  36. const newSpeed = prompt("Enter the new playback speed (e.g., 10 for 10x):", playbackSpeed);
  37. if (newSpeed && !isNaN(newSpeed)) {
  38. playbackSpeed = parseFloat(newSpeed);
  39. GM_setValue("playbackSpeed", playbackSpeed);
  40. alert(`Playback speed set to ${playbackSpeed}x.`);
  41. } else {
  42. alert("Invalid speed value. Please enter a numeric value.");
  43. }
  44. }
  45.  
  46. // Register menu commands for adding sites and setting playback speed
  47. GM_registerMenuCommand("Add this site to TimeHookerLite Include List", addToIncludeList);
  48. GM_registerMenuCommand("Set TimeHookerLite Playback Speed", setPlaybackSpeed);
  49.  
  50. // Check if the current site is in the include list before running the script
  51. if (!includeList.includes(window.location.hostname)) {
  52. return;
  53. }
  54.  
  55. // Override setInterval to accelerate intervals based on the playback speed
  56. const originalSetInterval = window.setInterval;
  57. window.setInterval = function(callback, delay, ...args) {
  58. return originalSetInterval(callback, delay / playbackSpeed, ...args);
  59. };
  60.  
  61. // Override setTimeout to accelerate timeouts based on the playback speed
  62. const originalSetTimeout = window.setTimeout;
  63. window.setTimeout = function(callback, delay, ...args) {
  64. return originalSetTimeout(callback, delay / playbackSpeed, ...args);
  65. };
  66.  
  67. // Override Date.now to simulate accelerated time
  68. const originalDateNow = Date.now;
  69. Date.now = function() {
  70. return originalDateNow() * playbackSpeed;
  71. };
  72.  
  73. // Override performance.now to simulate accelerated time
  74. const originalPerformanceNow = performance.now.bind(performance);
  75. performance.now = function() {
  76. return originalPerformanceNow() * playbackSpeed;
  77. };
  78. })();