-
Notifications
You must be signed in to change notification settings - Fork 3
/
content.js
178 lines (172 loc) · 5.24 KB
/
content.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
const keywords = [
"Best",
"100% music, 0% nudity",
"Who's here in ",
"Who's listening to this in ",
"Like if you're watching this in ",
"Who's here after watching ",
"This song never gets old",
"This brings back memories",
"This song hits different at 3 am",
"This is real music, not like today’s trash.",
"Anyone else getting nostalgic vibes?",
"This deserves more views/likes!",
"How many people are still listening to this in [year]?",
"I’m in [current year], but this song is timeless.",
"If you're reading this, I hope you have a great day!",
"Who’s still watching in [year]?",
"Here before this blows up!",
"RIP to those who haven’t found this gem yet.",
"This comment section is a vibe.",
"This song is a masterpiece, change my mind.",
"If you're reading this, you're a legend.",
"Anyone in",
"You’re a legend if you’re watching this in",
"Who's listening in",
"Who's watching in",
"Who's here in",
"Who's still listening in",
"You are allowed to like",
"Edit: Thanks for the likes!",
"Edit: I can't believe this blew up!",
"I see you scrolling through the comments",
"You are allowed to like",
"I am not asking for likes",
"If you like this comment",
"If you are reading this",
"If you don't like this comment",
"Wow this blew",
"WHO's Still here",
"2019 anyone?",
" Who else is just randomly listening to some old songs",
"I'm not asking for likes",
"0% Porn",
"100% Music",
"See you in 2030",
"The older i get",
"The worst thing about this song is that it ends",
"This song is my childhood",
"This song is my life",
"This song is my love",
"This song is my soul",
"This song is my heart",
"The worst thing about this",
"Lets get this to",
"[year] anyone?",
"[year] [month]",
"el comentario con más likes es gay",
"el comentario con más likes es puto",
"Subscribe to my channel",
"use me as a mark",
"느낌 좋은 여자들",
"이부분때문에",
"lets pray for those",
"button",
"el que lea esto",
"el comentario con",
"first",
"second",
"third",
"im here early",
"amen jesus",
"only love",
"free fire",
"laek share",
"only legends",
"first comment",
"those who ",
"english or spanish",
"can i get a",
"why so many dislikes",
"why so serious",
"infinite aura",
"hawk tuah",
];
/**
* Replaces placeholders in a keyword with regex patterns.
* @param {string} keyword - The keyword containing placeholders.
* @returns {string} - The keyword with placeholders replaced by regex patterns.
*/
function replacePlaceholders(keyword) {
return keyword
.replace(/\[year\]/g, "(20\\d{2})")
.replace(/\[month\]/g, "(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)");
}
/**
* Creates a regex pattern from a keyword.
* @param {string} keyword - The keyword to create a regex pattern from.
* @returns {RegExp} - The regex pattern.
*/
function createPattern(keyword) {
const patternWithPlaceholders = replacePlaceholders(keyword);
const escapedPattern = patternWithPlaceholders.replace(
/[.*+?^${}()|[\]\\]/g,
"\\$&",
);
return new RegExp(`\\b${escapedPattern.replace(/\s+/g, "\\s*")}\\b`, "i");
}
/**
* Checks if a text contains any of the keywords.
* @param {string} text - The text to check.
* @returns {boolean} - True if the text contains any of the keywords, false otherwise.
*/
function containsKeyword(text) {
return keywords.some((keyword) => createPattern(keyword).test(text));
}
/**
* Checks and hides or replaces comments that contain any of the keywords.
* @param {Array<string>} keywords - The list of keywords to check against.
* @param {boolean} replaceComments - Whether to replace comments with "[Blocked Comment]" or hide them.
*/
function blockComments(keywords, replaceComments) {
const comments = document.querySelectorAll("#content-text");
comments.forEach((comment) => {
if (containsKeyword(comment.innerText.toLowerCase(), keywords)) {
if (replaceComments) {
comment.innerText = "[Blocked Comment]";
} else {
comment.closest("ytd-comment-thread-renderer").style.display = "none";
}
}
});
}
/**
* Initializes the observer to monitor and block comments.
* @param {Array<string>} keywords - The list of keywords to check against.
* @param {boolean} replaceComments - Whether to replace comments with "[Blocked Comment]" or hide them.
*/
function initObserver(keywords, replaceComments) {
const commentsSection = document.querySelector("#comments");
if (commentsSection) {
blockComments(keywords, replaceComments);
const observer = new MutationObserver(() =>
blockComments(keywords, replaceComments),
);
observer.observe(commentsSection, {
childList: true,
subtree: true,
});
} else {
console.error("Comments section not found.");
}
}
/**
* Loads keywords and toggle states from storage and initializes the observer when the page loads.
*/
window.addEventListener("load", () => {
chrome.storage.sync.get(
["keywords", "isEnabled", "replaceComments"],
(data) => {
const keywords = data.keywords || [];
const isEnabled = data.isEnabled !== false; // Default to enabled if not set
const replaceComments = data.replaceComments === true; // Default to remove if not set
if (isEnabled) {
setTimeout(() => {
initObserver(keywords, replaceComments);
}, 3000);
} else {
console.log("NPC Comment Blocker is disabled");
}
},
);
});