Shows speed-adjusted time for YouTube videos
目前為
// ==UserScript==
// @name YouTube Speed-Adjusted Time Display
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Shows speed-adjusted time for YouTube videos
// @author kavinned
// @match https://www.youtube.com/*
// @grant none
// @icon https://www.google.com/s2/favicons?sz=64&domain=YouTube.com
// @license MIT
// ==/UserScript==
(function() {
'use strict';
function updateTimeDisplay() {
const video = document.querySelector('video');
if (!video) return;
const currentTimeDisplay = document.querySelector('.ytp-time-current');
const durationDisplay = document.querySelector('.ytp-time-duration');
if (!currentTimeDisplay || !durationDisplay) return;
const currentTime = video.currentTime;
const duration = video.duration;
const playbackRate = video.playbackRate;
const adjustedCurrentTime = currentTime / playbackRate;
const adjustedDuration = duration / playbackRate;
function formatTime(seconds) {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = Math.floor(seconds % 60);
if (hours > 0) {
return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
} else {
return `${minutes}:${secs.toString().padStart(2, '0')}`;
}
}
currentTimeDisplay.textContent = formatTime(adjustedCurrentTime);
durationDisplay.textContent = formatTime(adjustedDuration);
}
function createSpeedTimeDisplay() {
const timeDisplay = document.querySelector('.ytp-time-display');
if (!timeDisplay || document.querySelector('.speed-adjusted-time')) return;
const speedTimeDiv = document.createElement('div');
speedTimeDiv.className = 'speed-adjusted-time ytp-time-display';
speedTimeDiv.style.marginLeft = '10px';
speedTimeDiv.style.color = '#fff';
speedTimeDiv.style.fontSize = '14px';
timeDisplay.parentNode.insertBefore(speedTimeDiv, timeDisplay.nextSibling);
}
const observer = new MutationObserver((mutations) => {
if (document.querySelector('video')) {
createSpeedTimeDisplay();
updateTimeDisplay();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
setInterval(updateTimeDisplay, 1000);
document.addEventListener('ratechange', updateTimeDisplay, true);
})();