youtube双语字幕

youtube中英双语字幕

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         youtube双语字幕
// @version      0.1
// @description  youtube中英双语字幕
// @author       wwh
// @match        https://www.youtube.com/watch*
// @require      https://unpkg.com/xhook@latest/dist/xhook.min.js
// @grant        none
// @namespace https://greasyfork.org/users/293239
// ==/UserScript==

(function() {
xhook.after(function (request, response) {
    if (request.url.includes('/api/timedtext') && !request.url.includes('&tlang=')) {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', `${request.url}&tlang=zh-Hans`, false);
        xhr.send();

        if (response.xml.querySelector('head pen')) {
            xhr.responseXML.querySelectorAll('p').forEach(e => {
                let p = response.xml.querySelector(`p[t='${e.getAttribute('t')}']`);
                if (p) {
                    if (p.childElementCount && e.previousElementSibling) {
                        let previous = e.previousElementSibling;
                        previous.setAttribute('d', e.getAttribute('t') - previous.getAttribute('t'));
                    }

                    e.textContent = [p.textContent.replace('\n', ' '), e.textContent.replace('\n', ' ')].join('\n');
                }
            });
        } else {
            xhr.responseXML.querySelector('body').innerHTML = response.xml.querySelector('body').innerHTML.replace(/\n/g, ' ') +
                xhr.responseXML.querySelector('body').innerHTML.replace(/\n/g, ' ');
        }

        response.text = new XMLSerializer().serializeToString(xhr.responseXML);
    }
});
})();