YouTube Current Timestamp and Duration to Seconds

Displays the current YouTube video timestamp and full video length as total seconds, updating every second.

// ==UserScript==
// @name         YouTube Current Timestamp and Duration to Seconds
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Displays the current YouTube video timestamp and full video length as total seconds, updating every second.
// @author       Deepseek AI (propagated by Cris M)
// @license      gpl-3.0
// @match        *://www.youtube.com/watch*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Function to convert H:mm:ss or mm:ss to total seconds
    function convertTimestampToSeconds(timestamp) {
        const parts = timestamp.split(':').map(Number);
        if (parts.some(isNaN)) return null; // Return null for invalid timestamps
        if (parts.length === 3) { // HH:MM:SS
            return parts[0] * 3600 + parts[1] * 60 + parts[2];
        } else if (parts.length === 2) { // MM:SS
            return parts[0] * 60 + parts[1];
        } else if (parts.length === 1) { // SS
            return parts[0];
        }
        return null;
    }

    // Function to create or update a custom display for seconds
    function createOrUpdateDisplay(element, seconds) {
        let customDisplay = element.nextElementSibling;
        if (!customDisplay || !customDisplay.classList.contains('custom-seconds-display')) {
            customDisplay = document.createElement('span');
            customDisplay.classList.add('custom-seconds-display');
            customDisplay.style.marginLeft = '5px';
            customDisplay.style.color = '#aaa';
            element.insertAdjacentElement('afterend', customDisplay);
        }
        customDisplay.textContent = `(${seconds}s)`;
    }

    // Function to update the timestamp and duration display
    function updateTimestampDisplay() {
        // Find the current timestamp and duration elements in the YouTube player
        const timeDisplay = document.querySelector('.ytp-time-current');
        const durationDisplay = document.querySelector('.ytp-time-duration');
        if (!timeDisplay || !durationDisplay) return;

        // Get the current timestamp and duration text (e.g., "4:55" or "1:20:38")
        const currentTimestamp = timeDisplay.textContent.trim();
        const durationTimestamp = durationDisplay.textContent.trim();

        // Convert the timestamps to total seconds
        const currentSeconds = convertTimestampToSeconds(currentTimestamp);
        const durationSeconds = convertTimestampToSeconds(durationTimestamp);

        // Update the custom displays for current time and duration
        if (currentSeconds !== null) {
            createOrUpdateDisplay(timeDisplay, currentSeconds);
        }
        if (durationSeconds !== null) {
            createOrUpdateDisplay(durationDisplay, durationSeconds);
        }
    }

    // Start observing the video player for changes
    const observer = new MutationObserver(() => {
        // Check if the video is playing
        const video = document.querySelector('video');
        if (video && !video.paused) {
            // Update the timestamp display every second
            setInterval(updateTimestampDisplay, 1000);
        }
    });

    // Observe the YouTube player container for changes
    const playerContainer = document.querySelector('#movie_player');
    if (playerContainer) {
        observer.observe(playerContainer, { childList: true, subtree: true });
    }

    // Initial run to start the timer if the video is already playing
    const video = document.querySelector('video');
    if (video && !video.paused) {
        setInterval(updateTimestampDisplay, 1000);
    }

    // Convert the duration on page load
    updateTimestampDisplay();
})();