-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.js
135 lines (121 loc) · 4.44 KB
/
main.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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const parser = new DOMParser();
// Gets date published from video's page
const get_date_published = (html) => new Date(Date.parse(html.querySelectorAll("[itemprop='datePublished']")[0].getAttribute("content")))
function replace_video_type_date(rel_elems, get_vid_id, get_date_elem) {
const absDateClass = "absolute-date";
for (const rel_elem of rel_elems) try {
const date_elem = get_date_elem(rel_elem);
if (!date_elem.classList.contains(absDateClass))
fetch(`https://www.youtube.com${ get_vid_id(rel_elem) }`)
.then(res => res.text())
.then(txt => {
const html = parser.parseFromString(txt, "text/html");
const date = get_date_published(html);
const str_date = date.toLocaleString();
date_elem.innerHTML = str_date;
date_elem.classList.add(absDateClass);
});
} catch {}
}
function replace_dates() { // IMPORTANT!!! Find out when to activate this (after youtube's rendered its dynamic content)
// Recommendation page type videos
replace_video_type_date(
document.querySelectorAll("a#video-title-link"),
rel_elem =>
rel_elem.getAttribute("href"),
rel_elem =>
rel_elem
.parentElement // h3
.parentElement // div id="meta"
.children[1] // ytd-video-meta-block
.children[0] // div id="metadata"
.children[1] // div id="metadata-line"
.children[3] //span
);
// Side bar recommendations type videos
replace_video_type_date(
document.querySelectorAll("span#video-title"),
rel_elem =>
rel_elem
.parentElement
.parentElement
.getAttribute("href"),
rel_elem =>
rel_elem
.parentElement // h3
.parentElement // a
.children[1] // div
.children[0] // ytd-video-meta-block
.children[0] // div id="metadata"
.children[1] // div id="metadata-line"
.children[3] // span
);
// Search type videos
replace_video_type_date(
document.querySelectorAll("a#video-title"),
rel_elem =>
rel_elem.getAttribute("href"),
rel_elem =>
rel_elem
.parentElement // h3
.parentElement // div id="title-wrapper"
.parentElement // div id="meta"
.children[1] // ytd-video-meta-block
.children[0] // div id="metadata"
.children[1] // div id="metadata-line"
.children[3] // span
);
// Playlist type videos
replace_video_type_date(
document.querySelectorAll("a#video-title"),
rel_elem =>
rel_elem.getAttribute("href"),
rel_elem =>
rel_elem
.parentElement // h3
.parentElement // div id="meta"
.children[1] // ytd-video-meta-block
.children[0] // div id="metadata"
.children[0] // div id="byline-container"
.children[2] // yt-formatted-string id="video-info"
.children[2] // span
);
// Channel Home page videos
replace_video_type_date(
document.querySelectorAll("a#video-title"),
rel_elem =>
rel_elem.getAttribute("href"),
rel_elem =>
rel_elem
.parentElement // h3
.parentElement // div id="meta"
.children[1] // div id="metadata-container"
.children[0] // div id="metadata"
.children[1] // div id="metadata-line"
.children[1] // span
);
for (const info_elem of document.querySelectorAll("yt-formatted-string#info")) try {
info_elem
.children[2] // Relative timestamp
.innerHTML =
get_date_published(document)
.toLocaleString();
} catch {}
}
let DOMMutated = false;
replace_dates();
const observer = new MutationObserver((mutations) => {
DOMMutated = true;
});
observer.observe(document, { childList: true, subtree: true });
// In milliseconds
const replaceDelay = 250;
setInterval(
function() {
if (!DOMMutated)
return;
replace_dates();
DOMMutated = false;
},
replaceDelay
);