-
Notifications
You must be signed in to change notification settings - Fork 1
/
EnlargeYouTubeChatProfilePictures.user.js
120 lines (109 loc) · 4.19 KB
/
EnlargeYouTubeChatProfilePictures.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// ==UserScript==
// @name Enlarge YouTube Chat Profile Pictures (HD Version with Caching)
// @namespace https://github.com/Nick2bad4u/UserStyles
// @version 2.0
// @description Enlarges YouTube chat profile pictures on mouse over, shows HD version, Caches HD images for faster display using Tampermonkey caching.
// @author Nick2bad4u
// @match https://www.youtube.com/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// @updateURL https://github.com/Nick2bad4u/UserStyles/raw/refs/heads/main/EnlargeYouTubeChatProfilePictures.user.js
// @downloadURL https://github.com/Nick2bad4u/UserStyles/raw/refs/heads/main/EnlargeYouTubeChatProfilePictures.user.js
// @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @license UnLicense
// @tag youtube
// ==/UserScript==
(function () {
'use strict';
let debounceTimeout;
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
const preloadedImages = new Map();
// Load cache from Tampermonkey storage
function loadCache() {
const cache = GM_getValue('profilePicCache', {});
const now = Date.now();
// Clear out expired cache entries
Object.keys(cache).forEach((key) => {
if (now - cache[key].timestamp > CACHE_TTL_MS) {
delete cache[key]; // Remove expired entry
}
});
GM_setValue('profilePicCache', cache); // Update cache after removing expired entries
return cache;
}
// Save cache to Tampermonkey storage
function saveCache(cache) {
GM_setValue('profilePicCache', cache);
}
let cache = loadCache(); // Load the cache once when the script runs
// Preload HD image
function preloadHDImage(src) {
const hdSrc = src.replace(/=s32-c/, '=s800-c'); // Adjust as needed for HD
if (!preloadedImages.has(hdSrc)) {
if (cache[hdSrc]) {
// If in persistent cache, load directly from cache
preloadedImages.set(hdSrc, cache[hdSrc].url);
} else {
// Preload HD image and store in cache
const img = new Image();
img.src = hdSrc;
preloadedImages.set(hdSrc, hdSrc); // Store in memory
cache[hdSrc] = {
url: hdSrc,
timestamp: Date.now(),
}; // Cache with timestamp
saveCache(cache); // Save the updated cache
}
}
}
// Function to enlarge profile pictures, show HD image, add black outline, and shift to the right
function enlargeProfilePic(event) {
clearTimeout(debounceTimeout);
debounceTimeout = setTimeout(() => {
const img = event.target;
const originalSrc = img.src;
const hdSrc = originalSrc.replace(/=s32-c/, '=s800-c'); // Increase the size to 800px
img.dataset.originalSrc = originalSrc; // Store the original src
// Swap in the HD version, check preloadedImages cache
img.src = preloadedImages.get(hdSrc) || hdSrc;
img.style.transform = 'scale(6) translateX(20px)';
img.style.transition = 'transform 0.2s ease';
img.style.border = '1px solid black';
img.style.zIndex = '9999';
img.style.position = 'relative';
// Reset after 3 seconds
setTimeout(() => {
resetProfilePic(img);
}, 3000);
}, 100);
}
// Function to reset profile pictures to original size and source
function resetProfilePic(img) {
img.src = img.dataset.originalSrc || img.src; // Restore the original src if it was replaced
img.style.transform = 'scale(1) translateX(0)';
img.style.border = 'none';
img.style.zIndex = 'auto';
img.style.position = 'static';
}
// Add event listeners to profile pictures
function addEventListeners() {
const profilePics = document.querySelectorAll(
'.h-5.w-5.inline.align-middle.rounded-full.flex-none'
);
profilePics.forEach((pic) => {
preloadHDImage(pic.src); // Preload HD image
pic.addEventListener('mouseover', enlargeProfilePic);
});
}
// Observe changes in the chat to dynamically add event listeners
const observer = new MutationObserver(() => {
addEventListeners();
});
observer.observe(document.body, {
childList: true,
subtree: true,
});
// Initial call to add event listeners
addEventListeners();
})();