// ==UserScript==
// @name YouTube Recommendations be Gone: Cleaner YouTube
// @name:zh-CN 干净油管:Youtube 去推荐(YouTube Recommendations be Gone)
// @version 1.3.10
// @description Youtube homepage and recommendations are a waste of time and addictive. We will try to remove homepage and as many recommendations as possible to give you a cleaner youtube, so you can focus on your own subscriptions.
// @description:zh-cn YouTube主页极具上瘾性,刷主页和推荐完全是在浪费时间。本脚本将你重定向到你自己的订阅内容并屏蔽其他推荐入口,这样你就可以专注于你自己的订阅内容。
// @author benderbd42
// @match https://www.youtube.com/*
// @match https://m.youtube.com/*
// @grant GM_addStyle
// @license MIT
// @namespace https://greasyfork.org/
// @supportURL https://greasyfork.org/scripts/475942-youtube-recommendations-be-gone-cleaner-youtube/feedback
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
var version = "1.3.10";
var updateDate = "20231214";
var redirectionProtection2s = false;
// 创建一个弹出窗口
function createOptionsWindow() {
// 创建一个新的窗口对象
var optionsWindow = window.open('', '_blank', 'width=400,height=300');
// 在弹出窗口中加载选项设置页面
optionsWindow.document.write(`
Setup
选项设置
`);
}
// 检查用户是否首次使用
function checkFirstTimeUser() {
var isFirstTime = localStorage.getItem('isFirstTimeUser');
if (!isFirstTime) {
// 用户首次使用,弹出选项设置窗口
createOptionsWindow();
// 将首次使用标记设置为 true
localStorage.setItem('isFirstTimeUser', 'true');
}
}
// Function to check if the current page is the home page
function isHomePage() {
var url = window.location.href;
return url === "https://www.youtube.com/" || url === "https://www.youtube.com";
}
// Function to check if the current page is the subscriptions page
function isSubscriptionsPage() {
var url = window.location.href;
return url === "https://www.youtube.com/feed/subscriptions";
}
// Redirect to Subscriptions page if on the home page and not already on the subscriptions page
function checkRedirect() {
if (isHomePage() && !isSubscriptionsPage()) {
window.location.href = "https://www.youtube.com/feed/subscriptions";
}
}
function redirectionProtection2sOff(){
redirectionProtection2s = false;
}
// Redirect v2
function checkRedirectV2() {
console.log("checkRedirectV2()");
//var redirectCompatibility;//default: null, can be: 'true'
//redirectCompatibility = localStorage.getItem('redirectCompatible');
if (isHomePage() && !redirectionProtection2s) {
//else{
redirectMonitor.incrementCallCount();
redirectionProtection2s = true;
//}
}
}
// hide related videos
function hideRelatedVideos() {
console.log("hideRelatedVideos()");
var relatedVideos = document.querySelector("#app > div.page-container > ytm-watch > div.watch-below-the-player > ytm-single-column-watch-next-results-renderer > ytm-item-section-renderer");
var endVideoContent = document.querySelector('div.ytp-endscreen-content');
///html/body/ytd-app/div[1]/ytd-page-manager/ytd-watch-flexy/div[3]/div[1]/div[2]/ytd-player/div/div/div[20]/div
if (relatedVideos) {
relatedVideos.style.display = 'none';
}
if (endVideoContent){
endVideoContent.remove();
}
/*
var secondaryDiv = document.getElementById("secondary");
if (secondaryDiv) {
secondaryDiv.remove();
}*/
}
// Check if the current page is a YouTube video page
function checkVideoRecommendations(){
console.log("checkVideoRecommendations()");
if (window.location.href.includes('youtube.com/watch')) {
// Call the function to hide related videos
hideRelatedVideos();
}
}
// Function to remove elements with show more button
function removeElementsWithShowMoreButton() {
var elements = document.querySelectorAll('ytd-rich-section-renderer');
//var elements = document.querySelectorAll('ytd-rich-section-renderer[use-show-more-button]');
if (elements) {
console.log('removeElementsWithShowMoreButton(): element exists'); // 检查元素是否存在
console.log(elements.style); // 检查元素的样式属性
if (elements && elements.style) {
elements.style.display = 'none';
} else {
console.log('removeElementsWithShowMoreButton(): 没有找到对应元素或元素的样式属性不存在');
}
} else {
console.log('removeElementsWithShowMoreButton(): element with showmore button not found.');
}
}
// Function to remove "ytd-rich-grid-renderer" parts
function removeElementsWithYtdrichgridrenderer() {
console.log("removeElementsWithYtdrichgridrenderer()");
GM_addStyle(`
ytd-rich-section-renderer {
display: none !important;
}
`);
}
// Function to check if the current page is a subscription page and remove Shorts recommendations
function removeShortsOnSubscriptionPage() {
// Check if the current page is a subscription page
console.log("removeShortsOnSubscriptionPage(): checking");
if (window.location.href.includes('youtube.com/feed/subscriptions')) {
// Call the function to remove Shorts recommendations
console.log("removeShortsOnSubscriptionPage(): checked");
removeElementsWithYtdrichgridrenderer();
//removeElementsWithShowMoreButton();
}
}
// 检测是否开启划水日
function isTodayCheatDay() {
var currentDate = getCurrentDate();
var clicked = localStorage.getItem('cheatDayDateV1');
return clicked === currentDate;
}
// 在页面加载完成后调用 checkFirstTimeUser() 函数
// to be finished
//createOptionsWindow();
if(!isTodayCheatDay()){
var redirectCheckingInterval = 500;
setInterval(checkRedirectV2, redirectCheckingInterval); // Check for redirect every 500 milliseconds
var redirectMonitor = monitorRedirect();
setInterval(checkVideoRecommendations, 500);//detete recommendations on video play page
setInterval(removeShortsOnSubscriptionPage, 1000);//remove shorts (and other recommendations, defined by if a "show more"button is displayed) on subscription page
// Hide Home button
GM_addStyle(`
html body ytd-app div#content.style-scope.ytd-app ytd-mini-guide-renderer.style-scope.ytd-app div#items.style-scope.ytd-mini-guide-renderer > *:first-child {
display: none !important;
}
`);
// Hide Home button (side bar)
GM_addStyle(`
html body.lock-scrollbar ytd-app div#content.style-scope.ytd-app tp-yt-app-drawer#guide.style-scope.ytd-app div#contentContainer.style-scope.tp-yt-app-drawer div#guide-wrapper.style-scope.ytd-app div#guide-content.style-scope.ytd-app div#guide-inner-content.style-scope.ytd-app ytd-guide-renderer#guide-renderer.style-scope.ytd-app div#sections.style-scope.ytd-guide-renderer ytd-guide-section-renderer.style-scope.ytd-guide-renderer div#items.style-scope.ytd-guide-section-renderer > *:first-child {
display: none !important;
}
`);
// Hide Shorts buttons in the sidebar
GM_addStyle(`
a[title="Shorts"] {
display: none !important;
}
`);
// incase that didnt work...
// Hide Home buttons in the sidebar
GM_addStyle(`
a[title="Home"] {
display: none !important;
}
`);
// Hide 主页 buttons in the sidebar
GM_addStyle(`
a[title="首页"] {
display: none !important;
}
`);
// hide "sections" left sidebar recommendation
GM_addStyle(`
ytd-guide-section-renderer.style-scope.ytd-guide-renderer:nth-child(3) {
display: none !important;
}
`);
// hide "more from youtube" left sidebar recommendation
GM_addStyle(`
ytd-guide-section-renderer.style-scope.ytd-guide-renderer:nth-child(4) {
display: none !important;
}
`);
}
//获取原网页字体颜色,匹配暗色模式
var selfAdjustTextColor = getComputedStyle(document.documentElement).getPropertyValue('--yt-spec-text-disabled');//about section text color
var selfAdjustTextColorPrimary = getComputedStyle(document.documentElement).getPropertyValue('--yt-spec-text-primary');//title text color
console.log('selfAdjustTextColor:');
console.log(selfAdjustTextColor);
// 创建按钮元素
var buttonstop = document.createElement('button');
if (navigator.language === 'zh-CN') {
buttonstop.innerText = '暂停 YouTube';
}
else{
buttonstop.innerText = 'YouTube Time-out';
}
// 创建按钮元素提示
var buttonstoptip = document.createElement('div');
buttonstoptip.style.color = selfAdjustTextColor;
if (navigator.language === 'zh-CN') {
buttonstoptip.innerText = '暂停 YouTube:点击按钮,禁止访问YouTube直至明日。【警告】:明日以前你将不能访问 youtube.com,且没有取消选项!!';
}
else{
buttonstoptip.innerText = 'YouTube Time-out: click to completely block your access to YouTube today. WARNING: You won\'t be able to access youtube.com until tomorrow, and there\'s no option to cancel this!!';
}
var titlebuttontip = document.createElement('div');
titlebuttontip.style.fontWeight = 'bold';
titlebuttontip.style.fontSize = '16px';
titlebuttontip.style.color = selfAdjustTextColorPrimary;
titlebuttontip.style.marginBottom = '10px';
if (navigator.language === 'zh-CN') {
titlebuttontip.innerText = '干净油管:YouTube 去推荐';
}
else{
titlebuttontip.innerText = 'YouTube Recommendations Be Gone: Cleaner YouTube';
}
//版本信息
var versioninfo = document.createElement('div');
versioninfo.style.color = selfAdjustTextColor;
if (navigator.language === 'zh-CN') {
versioninfo.innerText = '-----\n版本:'+version+"\n更新日期:"+updateDate;
}
else{
versioninfo.innerText = '-----\nVersion:'+version+"\nUpdateDate:"+updateDate;
}
// 创建按钮元素
var buttonabout = document.createElement('button');
if (navigator.language === 'zh-CN') {
buttonabout.innerText = '关于与反馈';
}
else{
buttonabout.innerText = 'About & feedback';
}
// 创建按钮元素提示
var buttonabouttip = document.createElement('div');
buttonabouttip.style.color = selfAdjustTextColor;
if (navigator.language === 'zh-CN') {
buttonabouttip.innerText = '关于与反馈:关于这个脚本的信息,以及问题反馈地址';
}
else{
buttonabouttip.innerText = 'About & feedback: All about this script & feedback website';
}
// 创建按钮元素
var buttoncheatday = document.createElement('button');
if (!isTodayCheatDay()){
if (navigator.language === 'zh-CN') {
buttoncheatday.innerText = '开启划水日';
}
else{
buttoncheatday.innerText = 'Begin Cheat Day';
}
}
else{
if (navigator.language === 'zh-CN') {
buttoncheatday.innerText = '结束划水日';
}
else{
buttoncheatday.innerText = 'End Cheat Day';
}
}
// 创建按钮元素提示
var buttoncheatdaytip = document.createElement('div');
buttoncheatdaytip.style.color = selfAdjustTextColor;
if (navigator.language === 'zh-CN') {
buttoncheatdaytip.innerText = '开启划水日:今日不再限制推荐内容\n结束划水日:重新限制推荐内容';
}
else{
buttoncheatdaytip.innerText = 'Begin Cheat Day: Allow recommendations for today\nEnd Cheat Day: Block recommendations again';
}
// 创建按钮包裹元素
var buttonWrapper = document.createElement('div');
buttonWrapper.className = 'button-wrapper';
buttonWrapper.appendChild(titlebuttontip);
buttonWrapper.appendChild(buttonstop);
buttonWrapper.appendChild(buttonstoptip);
buttonWrapper.appendChild(buttoncheatday);
buttonWrapper.appendChild(buttoncheatdaytip);
buttonWrapper.appendChild(buttonabout);
buttonWrapper.appendChild(buttonabouttip);
buttonWrapper.appendChild(versioninfo);
// 创建文字元素
var textBlockTitle = document.createElement('div');
textBlockTitle.style.color = selfAdjustTextColorPrimary;
textBlockTitle.style.fontSize = '24px';
if (navigator.language === 'zh-CN') {
textBlockTitle.innerText = '今日已暂停访问 YouTube';
}
else{
textBlockTitle.innerText = 'Access to YouTube paused for today';
}
textBlockTitle.style.fontWeight = 'bold';
// 查找目标位置并添加按钮
function addButtonToContainer() {
var container = document.getElementById('guide-links-primary');
if (container) {
console.log("function addButtonToContainer(): container found.");
console.log(container);
//var firstChild2 = container.firstElementChild;
//container.insertBefore(buttontip, firstChild2);
var firstChild = container.firstElementChild;
container.insertBefore(buttonWrapper, firstChild);
//按钮样式
var buttonwrapperstyle = document.createElement('style');
buttonwrapperstyle.innerHTML = `
.button-wrapper {
border: 1px solid black; /* 添加黑色边框 */
margin: 20px; /* 设置外边距 */
padding: 10px; /* 设置内边距 */
}
`;
document.head.appendChild(buttonwrapperstyle);
} else {
setTimeout(addButtonToContainer, 1000); // 等待1000ms后重新尝试添加按钮
}
}
// 获取当前日期
function getCurrentDate() {
var today = new Date();
var year = today.getFullYear();
var month = String(today.getMonth() + 1).padStart(2, '0');
var day = String(today.getDate()).padStart(2, '0');
return year + '-' + month + '-' + day;
}
// 获取明日日期
function getNextDay(currentDate) {
var date = new Date(currentDate);
date.setDate(date.getDate() + 1);
var year = date.getFullYear();
var month = String(date.getMonth() + 1).padStart(2, '0');
var day = String(date.getDate()).padStart(2, '0');
return year + '-' + month + '-' + day;
}
// 检测是否为指定页面
function isTargetDomain() {
return (
window.location.href === 'https://www.youtube.com/feed/subscriptions/' ||
window.location.href === 'https://www.youtube.com/feed/subscriptions'
);
}
// 屏蔽网页内所有内容
function blockAllContent() {
if (!isHomePage()){
var currentDate = getCurrentDate();
// 显示文字提示
document.body.innerHTML = '';
// 显示日期提示
var dateText = document.createElement('div');
dateText.style.color = selfAdjustTextColor;
dateText.style.fontSize = '16px';
if (navigator.language === 'zh-CN') {
dateText.innerText = '您已暂停 YouTube,按照您的要求现已阻断访问该网站。您可以于明日(' + getNextDay(currentDate) + ')重新访问。\n ';
} else {
dateText.innerText = 'You have activated YouTube Time-out, which has resulted in the blocking of your access to this website.\n You will be able to access YouTube again tomorrow (' + getNextDay(currentDate) + ')\n ';
}
// 帮助与反馈添加
var timeouthelp = document.createElement('button');
if (navigator.language === 'zh-CN') {
timeouthelp.innerText = '帮助与反馈';
} else {
timeouthelp.innerText = 'Help & Support';
}
// 添加文字与按钮控件
var centerContainerForBlockpage = document.createElement('div');
centerContainerForBlockpage.style.display = 'flex';
centerContainerForBlockpage.style.justifyContent = 'center';
centerContainerForBlockpage.style.alignItems = 'center';
centerContainerForBlockpage.style.height = '100vh';
var blockpageTextWrapper = document.createElement('div');
blockpageTextWrapper.appendChild(textBlockTitle);
blockpageTextWrapper.appendChild(dateText);
blockpageTextWrapper.appendChild(timeouthelp);
centerContainerForBlockpage.appendChild(blockpageTextWrapper);
document.body.appendChild(centerContainerForBlockpage);
//帮助反馈按钮功能设置
timeouthelp.addEventListener('click', function () {
window.open('https://greasyfork.org/scripts/475942/feedback', '_blank');
});
}
}
// 检测是否已点击暂停按钮
function hasClickedPauseButton() {
var currentDate = getCurrentDate();
var clicked = localStorage.getItem('pauseButtonClickedDateV1');
return clicked === currentDate;
}
// 点击暂停访问按钮事件处理程序
buttonstop.addEventListener('click', function () {
// 记录点击日期
var currentDate = getCurrentDate();
localStorage.setItem('pauseButtonClickedDateV1', currentDate);
// 屏蔽网页内容
blockAllContent();
});
// 点击划水日事件处理程序
buttoncheatday.addEventListener('click', function () {
// 记录点击日期
var currentDate = getCurrentDate();
if (isTodayCheatDay()){
localStorage.setItem('cheatDayDateV1', '0');
}
else{
localStorage.setItem('cheatDayDateV1', currentDate);
}
// 刷新
location.reload();
});
// 检测是否为指定域名,添加按钮
if (isTargetDomain()) {
addButtonToContainer();
}
// 检测是否已点击暂停按钮,屏蔽内容
if (hasClickedPauseButton()) {
blockAllContent();
}
//button:about & feedback 点击跳转
buttonabout.addEventListener('click', function() {
//window.location.href = 'https://greasyfork.org/scripts/475942/feedback';
window.open('https://greasyfork.org/scripts/475942/feedback', '_blank');
});
function monitorRedirect() {
var callCount = 0;
var refreshInterval = 5000; // 刷新间隔,单位为毫秒,默认是5000ms,实际为强制跳转检测周期的6倍
if(redirectCheckingInterval!=null){refreshInterval = 10*redirectCheckingInterval;}
var maxCallCount = 5; // 最大调用次数阈值
setInterval(function() {
callCount = 0;
}, refreshInterval);
function checkCallCount() {
callCount++;
console.log("callCount=", callCount);
if (callCount >= maxCallCount) {
var confirmRedirectAltText;
if (navigator.language === 'zh-CN') {
confirmRedirectAltText = '脚本检测到强制跳转订阅页面过于频繁,可能是由网络连接不畅或网页改版导致。\n\n您可以尝试更换网络环境或等待脚本更新。在此同时,您也可以尝试手动跳转。';
//window.close()
}
else{
confirmRedirectAltText = 'From YouTube Recommendations be Gone: we have noticed irregularly fast redirection to the subscription page, which may be caused by a relatively slow network connection or changes in the source code of youtube.com.\n\nYou can try using a different network or wait for this script to be updated. In the meantime, you can also manually redirect.';
}
var confirmRedirect = confirm(confirmRedirectAltText);
if (confirmRedirect) {
window.open('https://www.youtube.com/feed/subscriptions', '_blank');
window.close();
}
}
}
return {
incrementCallCount: function() {
checkCallCount();
}
};
}
})();