您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Logs the current YouTube stream URL, timestamp, and timestamped URL in shortened format
- // ==UserScript==
- // @name YouTube Stream Timestamp Logger
- // @namespace http://tampermonkey.net/
- // @version 420.69
- // @description Logs the current YouTube stream URL, timestamp, and timestamped URL in shortened format
- // @author Kai Amamiya / ModernDisappointment | using the help of ChatGPT 3.0
- // @license MIT
- // @match *://www.youtube.com/watch*
- // ==/UserScript==
- (function() {
- 'use strict';
- // Function to convert seconds to HH:MM:SS.sss format
- function formatTime(seconds) {
- let hours = Math.floor(seconds / 3600);
- let minutes = Math.floor((seconds % 3600) / 60);
- let secs = (seconds % 60).toFixed(3);
- return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(6, '0')}`;
- }
- // Function to convert seconds to URL timestamp format
- function secondsToURLTimestamp(seconds) {
- return Math.floor(seconds); // Round down to the nearest whole number
- }
- // Function to copy text to clipboard
- function copyToClipboard(text) {
- const textarea = document.createElement('textarea');
- textarea.value = text;
- document.body.appendChild(textarea);
- textarea.select();
- document.execCommand('copy');
- document.body.removeChild(textarea);
- }
- // Function to log and copy the current media time and video URL
- function logVideoDetails() {
- const ytPlayer = document.querySelector('video');
- if (ytPlayer) {
- const currentTime = ytPlayer.currentTime;
- const videoURL = window.location.href;
- const timestamp = formatTime(currentTime);
- const urlTimestamp = secondsToURLTimestamp(currentTime);
- // Extract video ID from the URL
- const videoIdMatch = videoURL.match(/[?&]v=([a-zA-Z0-9_-]+)/);
- const videoId = videoIdMatch ? videoIdMatch[1] : '';
- const timestampedURL = `https://youtu.be/${videoId}?t=${urlTimestamp}`;
- const output = `Note: \nVideo URL: ${videoURL}\nTimestamp: ${timestamp}\nVideo URL w/ Time: ${timestampedURL}`;
- console.log(output);
- copyToClipboard(output);
- alert('Video URL, Timestamp, and Timestamped URL copied to clipboard!');
- } else {
- console.log('YouTube video element not found.');
- }
- }
- // Function to create or remove the button based on the page state
- function updateButton() {
- // Check if we are on a YouTube video or stream page
- const isYouTubeVideoPage = /\/watch\?v=/.test(window.location.href) || /\/live/.test(window.location.href);
- const isVideoPage = document.querySelector('video') !== null;
- const isFullscreen = document.fullscreenElement !== null;
- if (isYouTubeVideoPage && isVideoPage && !isFullscreen) {
- if (!document.getElementById('copyTimestampButton')) {
- const button = document.createElement('button');
- button.id = 'copyTimestampButton';
- button.innerHTML = 'Timestamp';
- button.style.position = 'fixed';
- button.style.bottom = '10px';
- button.style.left = '10px';
- button.style.zIndex = '9999';
- button.style.padding = '10px';
- button.style.backgroundColor = '#404040';
- button.style.color = '#FFFFFF';
- button.style.border = 'none';
- button.style.cursor = 'pointer';
- button.addEventListener('click', logVideoDetails);
- document.body.appendChild(button);
- }
- } else {
- const button = document.getElementById('copyTimestampButton');
- if (button) {
- button.remove();
- }
- }
- }
- // Set up observers to check for changes
- function setupObservers() {
- // Monitor for changes in the page that might indicate a video or fullscreen state change
- const observer = new MutationObserver(updateButton);
- observer.observe(document.body, {
- childList: true,
- subtree: true
- });
- // Also check for fullscreen changes
- document.addEventListener('fullscreenchange', updateButton);
- }
- // Initialize observers when the page loads
- window.addEventListener('load', setupObservers);
- // Also check initially if on a video page
- window.addEventListener('load', updateButton);
- })();