您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Show full upload dates in DD/MM/YYYY HH:MMam/pm format
当前为
// ==UserScript== // @name Full Date format for Youtube // @version 0.4 // @description Show full upload dates in DD/MM/YYYY HH:MMam/pm format // @author Ignacio Albiol // @namespace https://greasyforks.org/en/users/1304094 // @match https://www.youtube.com/* // @iconURL https://seekvectors.com/files/download/youtube-icon-yellow-01.jpg // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; function getUploadDate() { let el = document.body.querySelector('player-microformat-renderer script'); if (el) { let parts = el.textContent.split('"startDate":"',2); if (parts.length == 2) { return parts[1].split('"',1)[0]; } parts = el.textContent.split('"uploadDate":"',2); if (parts.length == 2) { return parts[1].split('"',1)[0]; } } return null; } function getIsLiveBroadcast() { let el = document.body.querySelector('player-microformat-renderer script'); if (!el) { return null; } let parts = el.textContent.split('"isLiveBroadcast":',2); if (parts.length != 2) { return false; } let isLiveBroadcast = !!parts[1].split(',',1)[0]; if (!isLiveBroadcast) { return false; } parts = el.textContent.split('"endDate":"',2); if (parts.length == 2) { return false; } return true; } function urlToVideoId(url) { let parts = url.split('/shorts/',2); if (parts.length === 2) { url = parts[1]; } else { url = parts[0]; } parts = url.split('v=',2); if (parts.length === 2) { url = parts[1]; } else { url = parts[0]; } return url.split('&',1)[0]; } function getRemoteUploadDate(videoId, callback) { let body = {"context":{"client":{"clientName":"WEB","clientVersion":"2.20240416.01.00"}},"videoId":videoId}; fetch('https://www.youtube.com/youtubei/v1/player?prettyPrint=false', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => { let object = data.microformat.playerMicroformatRenderer; if (object.liveBroadcastDetails?.isLiveNow) { callback(object.liveBroadcastDetails.startTimestamp); return; } else if (object.publishDate) { callback(object.publishDate); return; } callback(object.uploadDate); }) .catch(error => { console.error('There was a problem with the fetch operation:', error); }); } function isoToDate(iso) { let date = new Date(iso); // Format date components let day = ("0" + date.getDate()).slice(-2); let month = ("0" + (date.getMonth() + 1)).slice(-2); let year = date.getFullYear(); // Format time components let hours = date.getHours(); let minutes = ("0" + date.getMinutes()).slice(-2); let ampm = hours >= 12 ? 'pm' : 'am'; // Convert hours to 12-hour format hours = hours % 12; hours = hours ? hours : 12; // Convert 0 to 12 // Combine all components return `${day}/${month}/${year} ${hours}:${minutes}${ampm}`; } function startTimers() { /* video page description */ setInterval(() => { let uploadDate = getUploadDate(); if (!uploadDate) { return; } uploadDate = isoToDate(uploadDate); let isLiveBroadcast = getIsLiveBroadcast(); if (isLiveBroadcast) { document.body.classList.add('ytud-description-live'); } else { document.body.classList.remove('ytud-description-live'); } let el = document.querySelector('#info-container > #info > b'); if (!el) { let span = document.querySelector('#info-container > #info > span:nth-child(1)'); if (!span) { return; } el = document.createElement('b'); el.textContent = uploadDate; span.insertAdjacentElement('afterend', el); } else { if (el.parentNode.children[1] !== el) { let container = el.parentNode; el = container.removeChild(el); container.children[0].insertAdjacentElement('afterend', el); } if (el.firstChild.nodeValue === uploadDate) { return; } el.firstChild.nodeValue = uploadDate; } }, 1000); /* video page sidebar list */ setInterval(() => { let vids = document.querySelectorAll('#items.ytd-watch-next-secondary-results-renderer ytd-compact-video-renderer'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#metadata-line > span'); let holder; if (holders.length === 1) { let copy = document.createElement('span'); copy.className = 'inline-metadata-item style-scope ytd-video-meta-block'; let textNode = document.createTextNode(''); copy.appendChild(textNode); holders[0].insertAdjacentElement('afterend', copy); holder = copy; } else { holder = holders[1]; } let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text == dateText) { return; } el.setAttribute('data-text', dateText); let link = el.querySelector('a#thumbnail').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* homepage list - videos */ setInterval(() => { let vids = document.querySelectorAll('#content > ytd-rich-grid-media > #dismissible > #details > #meta > ytd-video-meta-block > #metadata'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#metadata-line > span'); if (holders.length === 0) { return; } let holder; if (holders.length === 1) { let copy = document.createElement('span'); copy.className = 'inline-metadata-item style-scope ytd-video-meta-block'; let textNode = document.createTextNode(''); copy.appendChild(textNode); holders[0].insertAdjacentElement('afterend', copy); holder = copy; } else { holder = holders[1]; } let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.closest('#meta').querySelector('h3 > a#video-title-link').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* homepage list - shorts */ setInterval(() => { let vids = document.querySelectorAll('#content > ytd-rich-grid-slim-media > #dismissible > #details > ytd-video-meta-block > #metadata'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#metadata-line > span'); if (holders.length === 0) { return; } let holder; if (holders.length === 1) { let copy = document.createElement('span'); copy.className = 'inline-metadata-item style-scope ytd-video-meta-block'; let textNode = document.createTextNode(''); copy.appendChild(textNode); holders[0].insertAdjacentElement('afterend', copy); holder = copy; } else { holder = holders[1]; } let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.closest('#details').querySelector('h3 > a').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* search list - videos */ setInterval(() => { let vids = document.querySelectorAll('#contents ytd-video-renderer #metadata'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#metadata-line > span'); if (holders.length === 0) { return; } let holder; if (holders.length === 1) { let copy = document.createElement('span'); copy.className = 'inline-metadata-item style-scope ytd-video-meta-block'; let textNode = document.createTextNode(''); copy.appendChild(textNode); holders[0].insertAdjacentElement('afterend', copy); holder = copy; } else { holder = holders[1]; } let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.closest('#dismissible').querySelector('a#thumbnail').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* search list - shorts */ setInterval(() => { let vids = document.querySelectorAll('#scroll-container > #items > ytd-reel-item-renderer > #dismissible > #details > ytd-video-meta-block > #metadata'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#metadata-line > span'); if (holders.length === 0) { return; } let holder; if (holders.length === 1) { let copy = document.createElement('span'); copy.className = 'inline-metadata-item style-scope ytd-video-meta-block'; let textNode = document.createTextNode(''); copy.appendChild(textNode); holders[0].insertAdjacentElement('afterend', copy); holder = copy; } else { holder = holders[1]; } let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.closest('#details').querySelector('h3 > a').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* search list - topic in sidebar */ setInterval(() => { let vids = document.querySelectorAll('#contents > ytd-universal-watch-card-renderer > #sections > ytd-watch-card-section-sequence-renderer > #lists > ytd-vertical-watch-card-list-renderer > #items > ytd-watch-card-compact-video-renderer'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('div.text-wrapper > yt-formatted-string.subtitle'); if (holders.length === 0) { return; } let holder = holders[0]; let separator = ' • '; let parts = holder.firstChild.nodeValue.split(separator, 2); if (parts.length < 2) { return; } let prefix = parts[0] + separator; let dateText = parts[1]; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.querySelector('a#thumbnail').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = prefix + uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* channel page - home (featured video) */ setInterval(() => { let vids = document.querySelectorAll('#contents > ytd-channel-video-player-renderer > #content > #metadata-container > ytd-video-meta-block > #metadata'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#metadata-line > span'); if (holders.length === 0) { return; } let holder = holders[1]; let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.closest('#metadata-container').querySelector('yt-formatted-string > a').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* channel page - home (for you videos) */ setInterval(() => { let vids = document.querySelectorAll('#dismissible > #details > #text-metadata > #meta > #metadata-container > #metadata'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#metadata-line > span'); if (holders.length === 0) { return; } let holder; if (holders.length === 1) { let copy = document.createElement('span'); copy.className = 'style-scope ytd-grid-video-renderer'; let textNode = document.createTextNode(''); copy.appendChild(textNode); holders[0].insertAdjacentElement('afterend', copy); holder = copy; } else { holder = holders[1]; } let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.closest('#meta').querySelector('h3 > a#video-title').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); /* video playlist */ setInterval(() => { let vids = document.querySelectorAll('#content > #container > #meta > ytd-video-meta-block > #metadata > #byline-container'); if (vids.length === 0) { return; } vids.forEach((el) => { let holders = el.querySelectorAll('#video-info > span'); if (holders.length <= 1) { return; } let holder; let prefix = ''; if (holders.length === 2) { let copy = document.createElement('span'); copy.className = 'style-scope yt-formatted-string'; copy.setAttribute('dir', 'auto'); let textNode = document.createTextNode(''); copy.appendChild(textNode); holders[1].insertAdjacentElement('afterend', copy); holder = copy; prefix = ' • '; } else { holder = holders[2]; } let dateText = holder.firstChild.nodeValue; let text = el.getAttribute('data-text'); if (text !== null && text === dateText) { return; } el.setAttribute('data-text', dateText); let link = el.closest('#meta').querySelector('h3 > a').getAttribute('href'); let videoId = urlToVideoId(link); getRemoteUploadDate(videoId, (uploadDate) => { uploadDate = prefix + isoToDate(uploadDate); holder.firstChild.nodeValue = uploadDate; el.setAttribute('data-text', uploadDate); }); }) }, 1000); } startTimers(); let styleTag = document.createElement('style'); let cssCode = "#info > span:nth-child(3) {display:none !important;}" + "#info > span:nth-child(4) {display:none !important;}" + "#info > b {font-weight:500 !important;margin-left:6px !important;}" + "#date-text {display:none !important;}" + ".ytud-description-live #info > span:nth-child(1) {display:none !important;}" + ".ytud-description-live #info > b {margin-left:0 !important;margin-right:6px !important;}"; styleTag.textContent = cssCode; document.head.appendChild(styleTag); })();