// ==UserScript== // @name 全网VIP视频免费破解去广告;【百度文库破解】内容复制|文档下载;知乎视频下载;YouTube油管播放助手 // @namespace fengdiansanren_video_text_helper // @version 2.0.2 // @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/jquery@3.2.1/dist/jquery.min.js // @grant GM_info // @grant GM_download // @grant GM_getValue // @grant GM_setValue // @grant GM_openInTab // @run-at document-end // @downloadURL none // ==/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"+css+"") 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 = "
"+ "
"+ "
"+ "
"; $("body").append(html); $("#fengdiansanren_objectvideo_player_jump").on("click", function(){ var playbackWebsite="https://www.xixicai.top/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 = "
"+ "
下载
"+ "
复制
"+ "
"; $("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 = '
复制此页面内容
'; $('.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 = '
复制此页面内容
'; 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 = '
'+ '
点击文本外关闭弹框
'+ '
'+
						  '
"'; $('#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 = '
'+str+'
'; $('#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 = "
____图(#)____
"; //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 = "
____图(#)____
"; $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://greasyfork.org/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 = ''; 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://greasyfork.org/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(); })();