ls-2018

1、能用的第三方的插件

Chrome:Tampermonkey 或 Violent monkey
Firefox:Greasemonkey、Tampermonkey
或 Violentmonkey
Safari:Tampermonkey
Microsoft Edge:Tampermonkey
Opera:Tampermonkey
或 Violentmonkey
Maxthon:Violentmonkey
Dolphin:Tampermonkey
UC:Tampermonkey
Qupzilla:(不需要额外软件)
AdGuard:(不需要额外软件)

2、js功能代码

浏览此网站 查找您想尝试的用户脚本。最流行的用户脚本有:

AC-baidu:重定向优化百度搜狗谷歌搜索_去广告_favicon_双列 - 
1.繞過百度、搜狗、谷歌、好搜搜索結果中的自己的跳轉鏈接,直接訪問原始網頁-反正都能看懂
2.新增拦截百度百家号的无用推广数据-支持其他站点
3.去除百度的多余广告
4添加Favicon显示
5.页面CSS
6.添加计数
7.开关选择以上功能 超星网课助手 - 自动挂机看尔雅MOOC,支持视频、音频、文档、图书自动完成,章节测验自动答题提交,支持自动切换任务点、挂机阅读时长、自动登录等,解除各类功能限制,开放自定义参数 千图网无水印下载 - 下载无水印图 计时器掌控者|视频广告跳过|视频广告加速器 - 控制网页计时器速度|加速跳过页面计时广告|视频快进(慢放)|跳过广告|支持几乎所有网页. EX-百度云盘去加载提示版 - 网盘内和分享链接页面均显示[EX-下载]按钮,支持百度企业网盘;

 

// ==UserScript==
// @name         youtube自动切换中文字幕
// @namespace    https://github.com/crud-boy/Youtube-Automatic-Translation
// @version      0.2.4
// @description  油管自动跳广告,自动打开翻译字幕,如果打开失败,请手动点击一下字幕按钮, 不常看greasyfork,有问题请发邮件:vsq_kuangqi@qq.com
// @author       wlpha
// @match        *://www.youtube.com/watch?v=*
// @match        *://www.youtube.com
// @match        *://www.youtube.com/*
// @grant        none
// @run-at       document-end
// ==/UserScript==


// 测试环境 - 全部通过
// 其他字幕 - https://www.youtube.com/watch?v=vf542A1poBs
// 中文字幕 - https://www.youtube.com/watch?v=kLNe5c5qGGA
// 台湾字幕 - https://www.youtube.com/watch?v=UXAdlaUhrlE
// 香港字幕 - https://www.youtube.com/watch?v=lN6OU04gqpU
// 英语字幕 - https://www.youtube.com/watch?v=pWDHeAQWKAA
// 其他自动生成字幕


(function() {
    \'use strict\';
    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();

})();

分类:

技术点:

相关文章:

  • 2021-10-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-25
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-15
  • 2021-12-08
  • 2022-02-08
  • 2022-02-22
  • 2021-09-28
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案