我想使用Greasemonkey为Openload VTT字幕添加一个字幕下载按钮。但是,我不知道如何访问<曲目>标签。
以这段带有英文字幕的法语视频片段为例。当我在Firefox中查看源代码时,我发现:
<video id="olvideo" width="100%" height="100%" crossorigin="anonymous" controls>
<track kind="captions" src="https://thumb.oloadcdn.net/subtitle/rjC09fkPLYs/vt8zTaIaVqQ.vtt" srclang="en" label="English" default />
</video>
为什么我的概念验证Greasemonkey代码不起作用?
// ==UserScript==
// @name Openload
// @include *openload.co*
// @run-at document-idle
// ==/UserScript==
var video = document.querySelector("video");
if (video) {
var track = video.querySelector("track");
if (track) {
alert ("<track> FOUND.");
} else {
alert ("<track> NOT found!");
}
} else {
alert ("<video> tag not found");
}
(当我运行脚本时,我收到消息"<track>未找到!"。(
您提供的链接从来没有<track>
节点,至少对我来说是这样(未登录,而不是视频的创建者(。
尽管如此,这可能是一个标准的AJAX问题。也就是说,如果节点是通过javascript(AJAX(添加的,那么Tampermonkey脚本将在加载目标节点之前完成。
使用标准的ajax感知技术。单向:
// ==UserScript==
// @name Openload.co, Report on track nodes
// @match *://openload.co/embed/*
// @match *://interactive-examples.mdn.mozilla.net/pages/tabbed/track.html
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
waitForKeyElements ("track", reportTrackNode);
//-- For Mozilla page, which uses shadow DOM:
waitForKeyElements ("shadow-output", reportTrackNodeWithinShadowDOM);
function reportTrackNode (jNode) {
console.log ("Found <track>:", jNode[0]);
}
function reportTrackNodeWithinShadowDOM (jNode) {
var sr = jNode[0].shadowRoot;
var trck = $(sr.childNodes).find ("track");
if (trck.length === 0) return true; // Keep waiting.
console.log ("Found <track>:", trck[0]);
}
请注意,以上代码适用于Tampermonkey、Violentmonkey和Greasemonkey的早期版本。它应该在Greasemonkey4+中工作,但发动机已经坏了,所以不能保证。
通过安装脚本并访问此MDN视频演示页面,您可以看到代码确实找到了存在的轨迹(即使是在阴影DOM中(。
这里有一个简单/基本的脚本。我不知道你用的是哪种通用汽车。这是为GM4编写的如果您使用的是GM 3,则更改:
GM.xmlHttpRequest -> GM_xmlhttpRequest
GM.openInTab -> GM_openInTab
它会在一个新的选项卡中打开字幕,这样你就可以保存它。您可以在嵌入和普通文件页上运行它。例如
https://openload.co/embed/rjC09fkPLYs
https://openload.co/f/rjC09fkPLYs
// ==UserScript==
// @name Openload Subtitle Download
// @namespace erosman
// @description Openload Subtitle Download
// @include https://openload.co/f/*
// @include https://openload.co/embed/*
// @grant GM.xmlHttpRequest
// @grant GM_xmlhttpRequest
// @grant GM.openInTab
// @grant GM_openInTab
// @author erosman
// @version 1.0
// ==/UserScript==
/* --------- Note ---------
This script download Openload Subtitles.
It runs on both embed and normal file pages.
--------- History ---------
1.0 Initial release
*/
(() => { // anonymous function wrapper, for error checking & limiting scope, async FF52+
'use strict';
if (frameElement || !location || !document.body) { return; } // end execution if in a frame/object/embedding points
// --- get the document
GM.xmlHttpRequest({
method: 'GET',
url: location.href,
onload: result => processResult(result.responseText),
onerror: error => console.log(error)
});
function processResult(str) {
// convert to DOM
const doc = new DOMParser().parseFromString(str, 'text/html');
// get tracks with source, convert to array for forEach,
// open each subtitle (if there are more than one) in a new tab
// you can save it from there
[...doc.querySelectorAll('track[src]')].forEach(item => GM.openInTab(item.src));
}
// end of anonymous function
})();