// ==UserScript==
// @name 全网VIP视频免费破解去广告;【百度文库破解】内容复制|文档下载;知乎视频下载;YouTube油管播放助手
// @namespace fengdiansanren_video_text_helper
// @version 2.0.1
// @description 常用功能专属集合: 一、百度文库文档内容自由复制,文档免费下载;二、一键破解:爱奇艺|腾讯视频|优酷|芒果TV等VIP特权或会员视频,普通视频去广告高速播放,解析接口贵在稳定够用。支持:Tampermonkey|Violentmonkey|Greasymonkey,版本4.0+以上最佳(每个网站解析按钮位置可自定义,避免遮挡);三、爱奇艺、优酷、腾讯视频原网站广告过滤; 四、为知乎的视频播放器添加下载功能;五、YouTube油管自动跳广告,自动打开翻译字幕,如果打开失败,请手动点击一下字幕按钮。
// @author 人鬼情未了、王超、crud-boy
// @copyright 人鬼情未了, 王超 、crud-boy
// @include *://wenku.baidu.com/*
// @include https://*.youku.com/v_*
// @include https://*.iqiyi.com/v_*
// @include https://*.iqiyi.com/w_*
// @include https://*.iqiyi.com/a_*
// @include https://*.le.com/ptv/vplay/*
// @include https://v.qq.com/x/cover/*
// @include https://v.qq.com/x/page/*
// @include https://*.tudou.com/listplay/*
// @include https://*.tudou.com/albumplay/*
// @include https://*.tudou.com/programs/view/*
// @include https://*.mgtv.com/b/*
// @include https://film.sohu.com/album/*
// @include https://tv.sohu.com/v/*
// @include https://*.baofeng.com/play/*
// @include https://vip.pptv.com/show/*
// @include https://v.pptv.com/show/*
// @include *://www.zhihu.com/*
// @include *://v.vzuu.com/video/*
// @include *://video.zhihu.com/video/*
// @include *://www.youtube.com/watch?v=*
// @connect zhihu.com
// @connect vzuu.com
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @grant GM_info
// @grant GM_download
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_openInTab
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
var $ = $ || window.$;
var window_url = window.location.href;
var website_host = window.location.host;
if(window.top != window.self){
return;
}
var fengdiansanren_object={};
fengdiansanren_object.isRunCurrentPart=function(){
var host = window.location.host;
var videoWebsites = ["iqiyi.com","v.qq.com","youku.com", "le.com","tudou.com","mgtv.com","sohu.com","acfun.cn","baofeng.com","pptv.com"];
for(var b=0; b<videoWebsites.length; b++){
if(host.indexOf(videoWebsites[b]) != -1){
return true;
}
}
return false;
};
fengdiansanren_object.getWebsiteName=function(){
var name="other";
if(website_host.indexOf("iqiyi.com")!=-1){
name="iqiyi";
}else if(website_host.indexOf("qq.com")!=-1){
name="qq";
}else if(website_host.indexOf("youku.com")!=-1){
name="youku";
}else if(website_host.indexOf("mgtv.com")!=-1){
name="mgtv";
}else if(website_host.indexOf("tudou.com")!=-1){
name="tudou";
}else if(website_host.indexOf("sohu.com")!=-1){
name="sohu";
}
return name;
};
fengdiansanren_object.generateHtmlAndEvent = function(){
var left=0;
var top=300;
//初始化位置信息
var playerBoxPosition = GM_getValue("playerBoxPosition_"+this.getWebsiteName());
if(!!playerBoxPosition){
left=playerBoxPosition.left;
top=playerBoxPosition.top;
}
var css = "#fengdiansanren_objectvideo_player_box{position:fixed; top:"+top+"px; left:"+left+"px; z-index:999; width:25px;background-color:red;};"
css += "#fengdiansanren_objectvideo_player_box>div{width:100%; height:20px;}";
css += "#fengdiansanren_objectvideo_player_box>div>img{width:90%;}";
css += "#fengdiansanren_objectvideo_player_jump{cursor:pointer;text-align:center;padding-top:5px;}"
css += "#fengdiansanren_objectvideo_player_box_move{cursor:move;margin-top:5px;text-align:center;padding:5px 0px;}"
$("head").append("<style>"+css+"</style>")
var moveImage="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADjUlEQVRoQ+2YTYiVVRjHf38ESQXXVhsHl4IIJRpumsGFWo2jtZnGtrqSMTC36SYQg/ADomiVXxs/SvyghTqroahAW7QbdJNKmyAwR0QfeeC5cubl3vuemXve5A73rO573/Oe8/+d85zn44g+b+pz/QwAXvUODnZg0e6AmU0CXwLPgQ2S/mgCthETMrONwC1gWYh+BGyR9HNpiOIAZjYMnAFer4h9CExIulkSoiiAmb0HnAVWdhD5b0BcKQVRDMDMtgOXgSUh7j9gefx+nJjTM+AjST+UgCgJ4Db/boiaBc4Du+P5tIsGXovnKUluaj23kgATgAu9B3wKrAc+D4WHgTvASeANB5Pk56TnVgzAlZjZakkO4L8PpQCS/HlOn57VQ3O5UCeAEqLTMYruQDrwYgD4BPg+oIYlTZVefR+vsR0Ie98G/C3p9ybEzwsg/PxnwHelPEgVysz2AOPAUUnXcqCzdiAi7I9JkBpqeZucSXL6uAcD7kZfD3Y7JF2t+7YWIHIbj5qt9OCepKG6gRfy3swcwEG8edoxJskDZMfWFSCyyktJYuYRdjwnDTCzncCB2LVJSb/UQZnZGHAuidgPgJ3dvu0IYGbrgGlgRUzsuc1FYKYixNOCOR7GzPYBxyv91kr6s+Jq3eY9MqdtDbAryaN83gOSvm63AN0AngBL61Yt3r+dehoz87zfa4K0/SRpa+sPMxsF/FzltKeS2mopBbBd0vVEXDuAaUmbkz6e+HW174RsVlKrOJoD3A1gP/BFkgZ7SnyhjQnNSDpVMY2DwJHK0u6S5OfpZTOzt4AP2pjQh8m8bkLvdCpJ6w7xJsAnXRWT+CH+uCqkagNm5qv7foj7xys0SSfqbCUOvhdErbTbqzg/xB1L0Rw3OhIQLTd6X9KbdWIW8t7M/koOtbtRF9+1BK0FcCFm5qvpsaBVbf0fgcxjQG3pmQUQEO6j/arknKRvF7LCdd8kqcSxnFjj42UD1E3e7n2chZWSvFZupDUGEB7mt1C9t6ldaxKgbUlZehsGAJXA1L9FfXiQb7pcq9wGvop0udiZKGZCZtb3F1vdrhbTa0avtkZzS8a6Q19sByLY5Vzuei5VWyrWCW+9LwoQEJ2u17268uv13BQ6i6E4QEB4MXOjUs2N5JSVWaqTTo0ABISXpL9GuuI1cduScL6Cq/0bA+hVWO73A4DclWqq32AHmlrZ3HH7fgdeAL7GSUBqsOkSAAAAAElFTkSuQmCC";
var playerImage="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABtklEQVRoQ+2YTytFQRjGn+czKBtbK7u79jl8CFtLK3auhYWFJEmS5EY3KQtlIZIotyRJkhQLIUWRbkdT79RZUHf+n1Nz1jPz/n7vM9OZc4iaP6w5P7JA6gRzAjkBxw7kLeTYQOfpxgkURTECYBzAAIB1AFMkH51JLBewEbgBMFiqdycSC5YMTtNsBIp/Km6LyLETkeFknwKqdFdJiMiHIYvVcN8CGqIDoElSnZGgTygBDb0qaVyGsggtoLjfRGI6hEQMAc19ICK7PkViCmjuORF58CGSQkBx34vEvKtEKgHNvSMiR7YiqQUUt3oxNkXk3VSkCgKa+UIk1kwkqiSguSdJTvQqUUWBV5J9dRbokGzUVeAFwCjJVh0FVuQQX/UKr8ZV4QycC/iGCbgem1LgR74d1LX70wY+ZQJt6fqJLXiqBG4FfNEVPIXArMA/+YKPtYX2BXzPJ3iMBJ4FfCYEeGiBZYG/DgkfYgudCfhmaHDfCXyX/gd9xYK3TeAQwHAJcku6fhoT3CWBIQBjAPoBtEkupQC3FkgJ+1dt47tQFvDcgZyA54YaL5cTMG6Z5wk5Ac8NNV7uF+15tDGwBHN+AAAAAElFTkSuQmCC";
var html = "<div id='fengdiansanren_objectvideo_player_box'>"+
"<div id='fengdiansanren_objectvideo_player_jump' name='跳转到解析'><img src='"+playerImage+"'></div>"+
"<div id='fengdiansanren_objectvideo_player_box_move' name='移动按钮'><img src='"+moveImage+"'></div>"+
"</div>";
$("body").append(html);
$("#fengdiansanren_objectvideo_player_jump").on("click", function(){
var playbackWebsite="https://www.showxi.xyz/mov/s/?url="+window_url;
GM_openInTab(playbackWebsite, {active: true});
});
this.listenerMouse();
};
fengdiansanren_object.point={"x":0,"y":0,"l":0,"t":0};
fengdiansanren_object.isDown=false;
fengdiansanren_object.$box=null;
fengdiansanren_object.listenerMouse = function(){
var that = this;
this.$box = document.getElementById('fengdiansanren_objectvideo_player_box_move');
this.$box.onmousedown = function(e) {
//阻止默认事件
e.preventDefault();
e.stopPropagation();
//获取x坐标和y坐标
that.point.x = e.clientX;
that.point.y = e.clientY;
//获取左部和顶部的偏移量
that.point.l = that.$box.parentNode.offsetLeft;
that.point.t = that.$box.parentNode.offsetTop;
//开关打开
that.isDown = true;
//设置样式
that.$box.style.cursor = 'move';
};
window.onmousemove = function(e) {
//阻止默认事件
e.preventDefault();
e.stopPropagation();
if (that.isDown == false) {
return;
}
//获取x和y
var nx = e.clientX;
var ny = e.clientY;
//计算移动后的左偏移量和顶部的偏移量
var nl = nx - (that.point.x - that.point.l);
var nt = ny - (that.point.y - that.point.t);
//更新位置
that.$box.parentNode.style.left = nl + 'px';
that.$box.parentNode.style.top = nt + 'px';
GM_setValue("playerBoxPosition_"+that.getWebsiteName(),{"left":nl, "top":nt})
}
fengdiansanren_object.$box.onmouseup = function() {
//开关关闭
that.isDown = false;
that.$box.style.cursor = 'move';
}
};
fengdiansanren_object.removeAD = function(){
var videoWebsiteADRemove_={};
videoWebsiteADRemove_.method1=function(){
window._setTimeout = window.setTimeout
window.setTimeout = function (handler, timeout, ...arg) {
window._setTimeout(handler, timeout / 30, ...arg)
}
};
videoWebsiteADRemove_.method2=function(){
window._setInterval = window.setInterval
window.setInterval = function (handler, timeout, ...arg) {
window._setInterval(handler, timeout / 30, ...arg)
}
};
videoWebsiteADRemove_.method3=function(){
window.rate = 0
window.Date.now = ()=>{return new window.Date().getTime() + (window.rate += 10000)}
setInterval(()=>{window.rate = 0}, 600000)
};
videoWebsiteADRemove_.youku=function(){
var $that=this;
window.onload = function () {
if (!document.querySelectorAll('video')[1]) {
setInterval(()=>{document.querySelectorAll('video')[1].playbackRate = 16},100)
} else {
$that.method1()
}
}
};
videoWebsiteADRemove_.iqiyi=function(){
this.method3();
};
videoWebsiteADRemove_.qq=function(){
// setInterval(()=>{
// if (document.querySelectorAll('video')[0].status == 'IDLE') {
// setInterval(()=>{
// document.querySelectorAll('video')[2].playbackRate = 16
// document.querySelectorAll('video')[3].playbackRate = 16
// },100)
// }
// },100);
};
videoWebsiteADRemove_.start=function(){
switch (website_host) {
case 'v.youku.com':
this.youku();
break
case 'v.qq.com' :
this.qq()
break
case 'www.iqiyi.com' :
this.iqiyi()
break
default :
break
}
};
videoWebsiteADRemove_.start();
};
fengdiansanren_object.start=function(){
if(this.isRunCurrentPart()){
this.generateHtmlAndEvent();
this.removeAD();
}
};
fengdiansanren_object.start();
/**
* 百度文库开始
*/
const baiduwenkuHelper_={};
baiduwenkuHelper_.wenkudownloadUrl = "http://www.tool77.com/tampermonkey/doc/download?wenku_url=";
baiduwenkuHelper_.isRun = function(){
if(website_host.indexOf("wenku.baidu.com") != -1){
return true;
}
return false;
};
baiduwenkuHelper_.removeAD=function(){
if(website_host.indexOf("wenku.baidu.com") != -1){
setInterval(function(){
$(".banner-ad").hide();
$(".union-ad-bottom").hide();
$("iframe").hide();
//VIP去广告小按钮
$(".ggbtm-vip-close").hide();
$(".ad-vip-close-bottom").hide();
$(".ad-vip-close").hide();
//搜索页面
$("#fengchaoad").hide();
$(".search-aside-adWrap").hide();
},300);
}
};
baiduwenkuHelper_.generateHtml=function(){
var $that = this;
if((window_url.indexOf("wenku.baidu.com/view")==-1 && window_url.indexOf("wenku.baidu.com/link")==-1)
|| website_host!="wenku.baidu.com"){
return;
}
this.openAllPage(); //折叠的文档全部展开
var topBox = "<div style='position:fixed;z-index:999999;background-color:#ccc;cursor:pointer;top:150px;left:0px;'>"+
"<div id='baiduwenku_helper_download_btn' style='font-size:12px;padding:8px 2px;color:#FFF;background-color:#25AE84;'>下载</div>"+
"<div id='baiduwenku_helper_copyall_btn' style='font-size:12px;padding:8px 2px;color:#FFF;background-color:#FE8A23;'>复制</div>"+
"</div>";
$("body").append(topBox);
//解析下载
$("body").on("click","#baiduwenku_helper_download_btn",function(){
var wenkuUrl = $that.wenkudownloadUrl+encodeURIComponent(window_url);
GM_openInTab(wenkuUrl, { active: true });
});
if($("#reader-container").length == 0){ //这是旧的文档展示页面
var onePageCopyContentHtml = '<div class="baiduwenku_helper_copy_onepage" style="float:left;padding:3px 8px;background:green;z-index:999;position:relative;top:60px;color:#fff;background-color:#FE8A23;font-size:13px;cursor:pointer;">复制此页面内容</div>';
$('.mod.reader-page.complex, .ppt-page-item, .mod.reader-page-mod.complex, .reader-page-wrap').each(function() {
$(this).prepend(onePageCopyContentHtml);
});
//复制全部文档内容
$("body").on("click","#baiduwenku_helper_copyall_btn",function(){
$that.copybaiduWenkuAll();
});
//复制每一页内容
$("body").on("click",".baiduwenku_helper_copy_onepage",function(){
var $inner = $(this).parent(".mod").find(".inner")
$that.copybaiduWenkuOne($inner, true);
});
}else{ //新的付费页面
var onePageCopyContentHtml = '<div class="baiduwenku_helper_copy_onepage" style="float:left;padding:3px 8px;background:green;z-index:999;position:relative;top:60px;color:#fff;background-color:#FE8A23;font-size:13px;cursor:pointer;">复制此页面内容</div>';
setInterval(function(){ //添加复制按钮
$('.reader-page').each(function() {
if($(this).find(".baiduwenku_helper_copy_onepage").length==0){
$(this).prepend(onePageCopyContentHtml);
}
});
},200);
//复制全部文档内容
$("body").on("click","#baiduwenku_helper_copyall_btn",function(){
$that.copybaiduWenkuAll_VIP();
});
//复制每一页内容
$("body").on("click", ".baiduwenku_helper_copy_onepage", function(){
$that.copybaiduWenkuOne_VIP($(this).parents(".reader-page"), true);
});
}
};
baiduwenkuHelper_.showBaiduCopyContentBox=function(str){
var ua = navigator.userAgent;
var opacity = '0.95';
if (ua.indexOf("Edge") >= 0) {
opacity = '0.6';
} else{
opacity = '0.95';
}
var copyTextBox = '<div id="baiduwenku_helper_copy_text_box" style="width:100%;height:100%;position: fixed;z-index: 9999;display: block;top: 0px;left: 0px;background:rgba(255,255,255,' + opacity + ');-webkit-backdrop-filter: blur(20px);display: flex;justify-content:center;align-items:center;">'+
'<div id="baiduwenku_helper_copy_box_close" style="width:100%;height:100%;position:fixed;top:0px;left:0px;"><div style="font-size:16px;margin-top:20px;text-align:center;"><b>点击文本外关闭弹框</b></div></div>'+
'<pre id="baiduwenku_helper_copy_text_content" style="padding:20px;border:1px solid #CCC;border-radius:4px;width:60%;font-size:16px;line-height:22px;z-index:10000;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;word-break:break-all;max-height:70%;overflow:auto;"></pre>'+
'</div>"';
$('#baiduwenku_helper_copy_text_box').remove();
$('body').append(copyTextBox);
$('#baiduwenku_helper_copy_text_content').html(str);
$('#baiduwenku_helper_copy_box_close').click(function() {
$('#baiduwenku_helper_copy_text_box').remove();
});
};
baiduwenkuHelper_.showDialog=function(str){
var dialogHtml = '<div id="baiduwenku_helper_dialog" style="margin:0px auto;opacity:0.8;padding:5px 10px;position:fixed;z-index: 10001;display: block;bottom:30px;left:44%;color:#fff;background-color:#CE480F;font-size:13px;border-radius:3px;">'+str+'</div>';
$('#baiduwenku_helper_dialog').remove();
$('body').append(dialogHtml);
setTimeout(function(){
$('#baiduwenku_helper_dialog').remove();
}, 1500);
};
baiduwenkuHelper_.openAllPage=function(){
//2021-07-19 破解需要VIP才能打开的限制
// var $foldPageText = $(".fold-page-text");
// $foldPageText.on("click", function(e){
// window.stop();
// });
//2021-09-18 只有登录(不可用)用户才能浏览器全部
};
baiduwenkuHelper_.copybaiduWenkuAll_VIP=function(){ /*** 新页面内容提取 ****/
var contentHtml = "";
var that = this;
$(".reader-page").each(function(){
contentHtml += that.copybaiduWenkuOne_VIP($(this), false);
});
if(!!contentHtml){
this.showBaiduCopyContentBox(contentHtml);
}else{
this.showDialog("提取文档内容失败了");
}
};
baiduwenkuHelper_.copybaiduWenkuOne_VIP=function($page, isappend){
var $that = this;
var contentHtml = ""; //提取文字
var picNum = 0; //图片数目
var picTemplate = "<div style='margin:10px 0px;text-align:center;'><img src='@' width='90%'><div>____图(#)____</div></div>";
//word,xlsx类型的文档
$page.find(".reader-pic-layer,.reader-txt-layer").each(function(){
if($(this).hasClass("reader-pic-layer")){
$(this).find("img").each(function(){
var imageurl = $(this).attr("src");
if(!!imageurl){
picNum++;
var imageHtml = picTemplate;
imageHtml = imageHtml.replace(/#/g,picNum);
imageHtml = imageHtml.replace(/@/g,imageurl);
contentHtml += imageHtml;
}
});
}else{
$(this).find(".reader-word-layer").each(function(){
contentHtml += $(this).text().replace(/\u2002/g, ' ');
});
}
});
//txt类型的文档
$page.find(".p-txt").each(function(){
contentHtml += $(this).text().replace(/\u2002/g, ' ');
});
contentHtml = contentHtml.replace(/。\s/g, '。\r\n');
if(!!contentHtml){
if(isappend){
$that.showBaiduCopyContentBox(contentHtml);
}
return contentHtml;
}else{
if(isappend){
$that.showDialog("提取文档内容失败了");
}
return "";
}
};
baiduwenkuHelper_.copybaiduWenkuAll=function(){ /*** 旧页面内容提取 ****/
var contentHtml = "";
var that = this;
$(".inner").each(function(){
contentHtml += that.copybaiduWenkuOne($(this), false);
});
if(!!contentHtml){
this.showBaiduCopyContentBox(contentHtml);
}else{
this.showDialog("提取文档内容失败了");
}
};
baiduwenkuHelper_.copybaiduWenkuOne=function($inner, isappend){
var $that = this;
var str = ""; //提取文字
$inner.find('.reader-word-layer').each(function(){
str += $(this).text().replace(/\u2002/g, ' ');
});
$inner.find('.p-txt').each(function(){
str += $(this).text().replace(/\u2002/g, ' ');
});
str = str.replace(/。\s/g, '。\r\n');
//提取css中的图片
var picHtml = "";
var picUrlReg = /\(((\'|\")?https.*?)\)/i;
var cssUrl = "";
var picNum = 0;
var picUrlLengthMin = 65;
var picTemplate = "<div style='margin:10px 0px;text-align:center;'><img src='@' width='90%'><div>____图(#)____</div></div>";
$inner.find('.reader-pic-item').each(function(){
cssUrl= $(this).css("background-image");
if(!!cssUrl && (cssUrl.indexOf("https")!=-1 || cssUrl.indexOf("HTTPS")!=-1)){
var array = cssUrl.match(picUrlReg);
if(array.length>1){
cssUrl = array[1].replace(/\"/g, "");
if(!!cssUrl && cssUrl.length>picUrlLengthMin){
picNum ++;
var onePic = picTemplate;
onePic = onePic.replace(/#/g,picNum);
onePic = onePic.replace(/@/g,cssUrl);
picHtml += onePic;
}
}
}
});
var srcUrl = "";
$inner.find('img').each(function(){
srcUrl = $(this).attr("src");
if(!!srcUrl && srcUrl.length>picUrlLengthMin && srcUrl.indexOf("https://wkretype")!=-1){
picNum ++;
var onePic = picTemplate;
onePic = onePic.replace(/#/g,picNum);
onePic = onePic.replace(/@/g,srcUrl);
picHtml += onePic;
}
});
//追加内容
var contentHtml = str+picHtml;
if(!!contentHtml && contentHtml.length>0){
if(isappend){
$that.showBaiduCopyContentBox(contentHtml);
}
return contentHtml;
}else{
if(isappend){
$that.showDialog("提取文档内容失败了");
}
return "";
}
};
baiduwenkuHelper_.start=function(){
if(this.isRun()){
this.generateHtml();
this.removeAD();
}
};
baiduwenkuHelper_.start();
})();
/**
* 作者备注:
* 王超先生的知乎视频下载脚本代码非常精炼,我认为此功能不需要再二次编写了
* 此部分代码已获得原作者授权同意,并符合MIT协议,请知悉!
*
* 下载知乎视频,作者:王超, 脚本链接:https://gf.qytechs.cn/zh-CN/scripts/39206
* 版本:1.30
* 版权归原作者所有
*/
(async () => {
if (window.location.host == 'www.zhihu.com') return;
console.log('知乎视频下载:');
const playlistBaseUrl = 'https://lens.zhihu.com/api/v4/videos/';
// const videoBaseUrl = 'https://video.zhihu.com/video/';
const videoId = window.location.pathname.split('/').pop(); // 视频id
const menuStyle = 'transform:none !important; left:auto !important; right:-0.5em !important;';
const playerId = 'player';
const coverSelector = '#' + playerId + ' > div:first-child > div:first-child > div:nth-of-type(2)';
const controlBarSelector = '#' + playerId + ' > div:first-child > div:first-child > div:last-child > div:last-child > div:first-child';
const svgDownload = '<path d="M9.5,4 H14.5 V10 H17.8 L12,15.8 L6.2,10 H9.5 Z M6.2,18 H17.8 V20 H6.2 Z"></path>';
const player = document.getElementById(playerId);
// const resolutions = {'普清': 'ld', '标清': 'sd', '高清': 'hd', '超清': 'fhd'};
const resolutions = [
{ename: 'ld', cname: '普清'},
{ename: 'sd', cname: '标清'},
{ename: 'hd', cname: '高清'},
{ename: 'fhd', cname: '超清'}
];
let videos = []; // 存储各分辨率的视频信息
function fetchRetry (url, options = {}, times = 1, delay = 1000, checkStatus = true) {
return new Promise((resolve, reject) => {
// fetch 成功处理函数
function success (res) {
if (checkStatus && !res.ok) {
failure(res);
}
else {
resolve(res);
}
}
// 单次失败处理函数
function failure (error) {
if (--times) {
setTimeout(fetchUrl, delay);
}
else {
reject(error);
}
}
// 总体失败处理函数
function finalHandler (error) {
throw error;
}
function fetchUrl () {
return fetch(url, options)
.then(success)
.catch(failure)
.catch(finalHandler);
}
fetchUrl();
});
}
// 下载指定url的资源
async function downloadUrl (url, name = (new Date()).valueOf() + '.mp4') {
// Greasemonkey 需要把 url 转为 blobUrl
if (GM_info.scriptHandler === 'Greasemonkey') {
const res = await fetchRetry(url);
const blob = await res.blob();
url = URL.createObjectURL(blob);
}
// Chrome 可以使用 Tampermonkey 的 GM_download 函数绕过 CSP(Content Security Policy) 的限制
if (window.GM_download) {
GM_download({url, name});
}
else {
// firefox 需要禁用 CSP, about:config -> security.csp.enable => false
let a = document.createElement('a');
a.href = url;
a.download = name;
a.style.display = 'none';
// a.target = '_blank';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(() => URL.revokeObjectURL(url), 100);
}
}
// 格式化文件大小
function humanSize (size) {
let n = Math.log(size) / Math.log(1024) | 0;
return (size / Math.pow(1024, n)).toFixed(0) + ' ' + (n ? 'KMGTPEZY'[--n] + 'B' : 'Bytes');
}
if (!player) return;
// 获取视频信息
const res = await fetchRetry(playlistBaseUrl + videoId, {
headers: {
'referer': 'refererBaseUrl + videoId',
'authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20' // in zplayer.min.js of zhihu
}
}, 3);
const videoInfo = await res.json();
// 获取不同分辨率视频的信息
for (const [key, video] of Object.entries(videoInfo.playlist)) {
video.name = key.toLowerCase();
video.cname = resolutions.find(v => v.ename === video.name)?.cname
if (!videos.find(v => v.size === video.size)) {
videos.push(video);
}
}
// 按格式大小排序
videos = videos.sort(function (v1, v2) {
const v1Index = resolutions.findIndex(v => v.ename === v1.name);
const v2Index = resolutions.findIndex(v => v.ename === v2.name);
return v1Index === v2Index ? 0 : (v1Index > v2Index ? 1 : -1);
// return v1.size === v2.size ? 0 : (v1.size > v2.size ? 1 : -1);
}).reverse();
document.addEventListener('DOMNodeInserted', (evt) => {
const domControlBar = evt.relatedNode.querySelector(':scope > div:last-child > div:first-child > div:nth-of-type(2)');
if (!domControlBar || domControlBar.querySelector('.download')) return;
const domButtonsBar = domControlBar.querySelector(':scope > div:last-child');
const domFullScreenBtn = domButtonsBar.querySelector(':scope > div:nth-last-of-type(2)');
const domResolutionBtn = Array.from(domButtonsBar.querySelectorAll(':scope > div')).filter(el => el.innerText.substr(1, 1) === '清')[0];
let domDownloadBtn, defaultResolution, buttons;
if (!domFullScreenBtn || !domFullScreenBtn.querySelector('button')) return;
// 克隆分辨率菜单或全屏按钮为下载按钮
domDownloadBtn = (domResolutionBtn && (domResolutionBtn.className === domFullScreenBtn.className))
? domResolutionBtn.cloneNode(true)
: domFullScreenBtn.cloneNode(true);
defaultResolution = domDownloadBtn.querySelector('button').innerText;
// 生成下载按钮图标
domDownloadBtn.querySelector('button:first-child').outerHTML = domFullScreenBtn.cloneNode(true).querySelector('button').outerHTML;
domDownloadBtn.querySelector('svg').innerHTML = svgDownload;
domDownloadBtn.className = domDownloadBtn.className + ' download';
buttons = domDownloadBtn.querySelectorAll('button');
// button 元素添加对应的下载地址属性
buttons.forEach(dom => {
const video = videos.find(v => v.cname === dom.innerText) || videos[videos.length - 1];
dom.dataset.video = video.play_url;
if (dom.innerText) {
(dom.innerText = `${dom.innerText} (${humanSize(video.size)})`);
}
else if (buttons.length == 1) {
dom.nextSibling.querySelector('div').innerText = humanSize(video.size);
}
});
// 鼠标事件 - 显示菜单
domDownloadBtn.addEventListener('pointerenter', () => {
const domMenu = domDownloadBtn.querySelector('div:nth-of-type(1)');
if (domMenu) {
domMenu.style.cssText = menuStyle + 'opacity:1 !important; visibility:visible !important';
}
});
// 鼠标事件 - 隐藏菜单
domDownloadBtn.addEventListener('pointerleave', () => {
const domMenu = domDownloadBtn.querySelector('div:nth-of-type(1)');
if (domMenu) {
domMenu.style.cssText = menuStyle;
}
});
// 鼠标事件 - 选择菜单项
domDownloadBtn.addEventListener('pointerup', event => {
let e = event.srcElement || event.target;
while (e.tagName !== 'BUTTON') {
e = e.parentNode;
}
downloadUrl(e.dataset.video);
});
// 显示下载按钮
domButtonsBar.appendChild(domDownloadBtn);
});
})();
//https://gf.qytechs.cn/zh-CN/scripts/382426
//youtube自动切换中文字幕
(function() {
'use strict';
var window_url = window.location.href;
var website_host = window.location.host;
if(website_host.indexOf("youtube.com")==-1){ //不是youtube就不执行
return;
}
var lang = null;
function i8nInit(){
try{
lang = document.querySelector('html').getAttribute('lang').trim();
}catch(err){
};
}
function tr(text) {
switch(lang) {
case 'zh-CN':
case 'zh':
return i8nZhHans(text);
case 'zh-TW':
case 'zh-HK':
return i8nZhHant(text);
case 'en-US':
case 'en':
case 'en-GB':
return i8nEnUS(text);
default:
return text;
}
}
function i8nZhHans(text) {
switch(text){
case '开启翻译字幕':
case '关闭翻译字幕':
case '字幕':
case '添加字幕':
case '关闭':
case '中文':
case '简体':
case '繁体':
case '台湾':
case '香港':
case '自动翻译':
case '自动生成':
default:
break;
}
return text;
}
function i8nZhHant(text) {
switch(text){
case '开启翻译字幕':
return '開啟翻譯字幕';
case '关闭翻译字幕':
return '關閉翻譯字幕';
case '字幕':
return '字幕';
case '添加字幕':
return '新增字幕';
case '关闭':
return '關閉';
case '中文':
return '中文';
case '简体':
return '簡體';
case '繁体':
return '繁體';
case '台湾':
return '台灣';
case '香港':
return '香港';
case '自动翻译':
return '自動翻譯';
case '自动生成':
return '自動產生'
default:
break;
}
return text;
}
function i8nEnUS(text) {
switch(text){
case '开启翻译字幕':
return 'Turn on subtitles';
case '关闭翻译字幕':
return 'Turn off subtitles';
case '字幕':
return 'Subtitles/CC';
case '添加字幕':
return 'add subtitles/CC';
case '关闭':
return 'off';
case '中文':
return 'Chinese (Simplified)';
case '简体':
return 'Chinese (Simplified)';
case '繁体':
return 'Chinese (Traditional)';
case '台湾':
return 'Chinese (Taiwan)';
case '香港':
return 'Chinese (Hong Kong)';
case '自动翻译':
return 'Auto-translate';
case '自动生成':
return 'auto-generated'
default:
break;
}
return text;
}
function getAbsPosition(el){
var el2 = el;
var curtop = 0;
var curleft = 0;
if (document.getElementById || document.all) {
do {
curleft += el.offsetLeft-el.scrollLeft;
curtop += el.offsetTop-el.scrollTop;
el = el.offsetParent;
el2 = el2.parentNode;
while (el2 != el) {
curleft -= el2.scrollLeft;
curtop -= el2.scrollTop;
el2 = el2.parentNode;
}
} while (el.offsetParent);
} else if (document.layers) {
curtop += el.y;
curleft += el.x;
}
return [curtop, curleft];
};
function getPlayer() {
var player = document.querySelector('#ytd-player') || document.querySelector('#player');
// 如果播放器的设置不在可视区域,就停止自动开启翻译
var [x, y] = [0, 0]
try {
[x, y] = getAbsPosition(player);
} catch(e) {
return;
}
var visible_area = y + player.clientHeight - 250;
if (document.scrollingElement.scrollTop > visible_area) {
return null;
}
return player;
}
// 添加开关
function InitTranslateButton(){
var coltrol_place = document.querySelector('.ytp-chrome-controls .ytp-right-controls');
if(coltrol_place && coltrol_place.querySelector('.plugins-trans-btn') == null) {
var trans_coltrol_btn = document.createElement('button');
trans_coltrol_btn.className = 'plugins-trans-btn';
trans_coltrol_btn.style = 'position: relative;top: -36%; margin-right:10px; border-radius: 25px;border: none; opacity: 0.95; background-color: #fff; outline:none;';
trans_coltrol_btn.onclick = function(){
var trans_coltrol_state = window.localStorage.getItem('plugins-trans-state');
if(trans_coltrol_state == 'on') {
window.localStorage.setItem('plugins-trans-state', 'off');
trans_coltrol_btn.innerText = tr('开启翻译字幕');
removeSubtitlesTrans();
} else {
window.localStorage.setItem('plugins-trans-state', 'on');
trans_coltrol_btn.innerText = tr('关闭翻译字幕');
}
}
if(isEnableTranslate()){
trans_coltrol_btn.innerText = tr('关闭翻译字幕');
} else {
trans_coltrol_btn.innerText = tr('开启翻译字幕');
}
// 屏蔽youtube强行添加的事件
trans_coltrol_btn.addEventListener = function() {};
coltrol_place.prepend(trans_coltrol_btn);
}
}
function isEnableTranslate(){
var transState = window.localStorage.getItem('plugins-trans-state');
return transState == 'on';
}
function hasOpenVideoSettings(){
var menu = document.querySelector('.ytp-popup.ytp-settings-menu');
return menu && menu.style.display != 'none';
}
function closeVideoSettingsPlace(){
var menuPlace = document.querySelector('.ytp-settings-menu');
var menuPlaceBtn = document.querySelector('.ytp-settings-button');
if(menuPlace && menuPlace.style.display != 'none') {
menuPlaceBtn.click();
}
}
function openVideoSettingsPlace(callback){
if(!hasOpenVideoSettings()) {
var menuPlaceBtn = document.querySelector('.ytp-settings-button');
if(menuPlaceBtn) {
menuPlaceBtn.click();
callback();
}
} else {
callback();
}
}
function hasVideoSubtitles(){
var dom = document.querySelector('.ytp-subtitles-button.ytp-button');
return dom != null && dom.style.display != 'none';
}
// 需要修改
function openVideoSubtitles(){
var settingsPlaceItems = document.querySelectorAll('.ytp-popup.ytp-settings-menu .ytp-menuitem');
settingsPlaceItems.forEach(function(item) {
if(item.innerText && item.innerText.indexOf(tr('字幕')) > -1 && item.innerText.indexOf(tr('添加字幕')) == -1) {
item.click();
return;
}
});
// 内置简体字幕
settingsPlaceItems.forEach(function(item) {
if(item.innerText && item.innerText.indexOf(tr('简体')) > -1) {
item.click();
// 防止无限点击菜单
setSubtitlesTrans('zh-Hans');
closeVideoSettingsPlace();
return;
}
});
var curLnag = getSubtitlesTrans();
if(curLnag == 'inner-Substitle') {
// 如果没有简体字,就打开自动翻译
settingsPlaceItems.forEach(function(item) {
if(item.innerText && item.innerText.indexOf(tr('自动翻译')) > -1) {
item.click();
setSubtitlesTrans('inner-Substitle');
return;
}
});
} else if(curLnag != 'zh-Hans') {
// 如果没有就打开繁体字
settingsPlaceItems.forEach(function(item) {
if(item.innerText) {
['繁体', '台湾', '香港', '中文'].forEach(function(langText) {
langText = tr(langText)
if(item.innerText.indexOf(langText) > -1) {
item.click();
setSubtitlesTrans('inner-Substitle');
closeVideoSettingsPlace();
return;
}
});
}
});
var title = document.querySelector('.ytp-button.ytp-panel-title').innerText.trim();
if(title.indexOf(tr('字幕')) >= -1) {
// 没有中文相关字幕,就随便选一个字幕,然后才自动翻译
settingsPlaceItems.forEach(function(item) {
if(item.innerText) {
var langText = item.innerText.trim();
if(langText.indexOf(tr('添加字幕')) == -1 && langText.indexOf(tr('关闭')) == -1) {
setSubtitlesTrans('inner-Substitle');
closeVideoSettingsPlace();
return;
}
}
});
settingsPlaceItems.forEach(function(item) {
if(item.innerText && item.innerText.indexOf(tr('自动生成')) > -1) {
item.click();
setSubtitlesTrans('inner-Substitle');
closeVideoSettingsPlace();
return;
}
});
}
}
}
function displaySubtitles() {
var subtitle = document.querySelector('.ytp-subtitles-button.ytp-button[aria-pressed="false"]');
if(subtitle) {
subtitle.click();
}
}
function isSubtitlesTrans(){
// curLang == 'zh-Hant'
// 统一所有语言设置翻译为简体中文
// en-UK: en-gb
// en-US: en
// zh-CN zh-Hans zh-Hant
return getSubtitlesTrans() == 'zh-Hans';
}
function removeSubtitlesTrans() {
try {
document.querySelector('.ytp-player-content').removeAttribute('translate-zh-hans');
}catch(err) {
}
}
function getSubtitlesTrans(){
try {
return document.querySelector('.ytp-player-content').getAttribute('translate-zh-hans');
}catch(err) {
return lang;
}
}
function setSubtitlesTrans(lang) {
document.querySelector('.ytp-player-content').setAttribute('translate-zh-hans', lang);
}
function openSubtitles(){
if(hasVideoSubtitles()) {
displaySubtitles();
var isTrans = isSubtitlesTrans();
console.log(isTrans);
if(isTrans == false) {
// 采用callback方式打开和关闭,防止settimeout导致的问题
openVideoSettingsPlace(function() {
// 切换字幕
openVideoSubtitles();
});
}
} else {
try {
// 防止切换视频过程,打开字幕,不关闭
var title = document.querySelector('.ytp-button.ytp-panel-title').innerText.trim();
if(title.indexOf(tr('字幕')) >= -1) {
closeVideoSettingsPlace();
}
}catch(err) {
}
}
}
function updateColtrolButtonState() {
var transState = window.localStorage.getItem('plugins-trans-state');
var transBtn = document.querySelector('.plugins-trans-btn')
if(transBtn) {
if(transState == 'on' && transBtn.innerText != tr('关闭翻译字幕')) {
transBtn.innerText = tr('关闭翻译字幕');
} else if(transState == 'off' && transBtn.innerText != tr('开启翻译字幕')) {
transBtn.innerText = tr('开启翻译字幕');
}
}
}
function hidePageAds()
{
['.video-ads', '#player-ads'].forEach(function(selector) {
document.querySelectorAll(selector).forEach(function(elment){
elment.style.display = 'none';
});
});
}
function isVideoAdsTime(){
var ad = document.querySelector('.ad-showing');
var skipAdButton = document.querySelector('.ytp-ad-skip-button');
var volumeOpenState = document.querySelector("#ytp-svg-volume-animation-mask");
var volumeButton = document.querySelector('.ytp-mute-button');
// 判断有没有广告
if(ad){
// 关闭音量
if(volumeOpenState && volumeButton)
{
volumeButton.click();
}
} else {
// 正常视频,打开音量
if(volumeOpenState == null && volumeButton){
volumeButton.click();
}
}
// 跳过广告
if(skipAdButton)
{
skipAdButton.click();
}
return ad != null;
}
function main() {
i8nInit();
setInterval(
function() {
// 不显示错误信息
try{
getPlayer() && (function(){
InitTranslateButton();
updateColtrolButtonState();
if(isEnableTranslate()){
hidePageAds();
if(!isVideoAdsTime()) {
openSubtitles();
}
}
})();
}catch(err) {
}
},
500
)
};
main();
})();