admin管理员组文章数量:1426222
I'd like to use Greasemonkey to add a subtitle download button for Openload VTT subtitles. However, I can't figure out how to access the <track> tag.
Take, for example, this French video clip with English subtitles. When I looked at the source code in Firefox, I found this:
<video id="olvideo" width="100%" height="100%" crossorigin="anonymous" controls>
<track kind="captions" src=".vtt" srclang="en" label="English" default />
</video>
Why doesn't my proof-of-concept Greasemonkey code work?
// ==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");
}
(When I ran the script I got the message "<track> NOT found!".)
I'd like to use Greasemonkey to add a subtitle download button for Openload VTT subtitles. However, I can't figure out how to access the <track> tag.
Take, for example, this French video clip with English subtitles. When I looked at the source code in Firefox, I found this:
<video id="olvideo" width="100%" height="100%" crossorigin="anonymous" controls>
<track kind="captions" src="https://thumb.oloadcdn/subtitle/rjC09fkPLYs/vt8zTaIaVqQ.vtt" srclang="en" label="English" default />
</video>
Why doesn't my proof-of-concept Greasemonkey code work?
// ==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");
}
(When I ran the script I got the message "<track> NOT found!".)
Share Improve this question edited Nov 3, 2018 at 14:13 Nemo XXX asked Oct 30, 2018 at 14:26 Nemo XXXNemo XXX 6912 gold badges15 silver badges39 bronze badges 02 Answers
Reset to default 4The link you gave doesn't ever have a <track>
node, at least for me (un logged-in, and not the video's creator).
Nevertheless, this is may be a standard AJAX problem. That is, if the node is added via javascript (AJAX), the Tampermonkey script will have finished before the target node is loaded.
Use standard ajax-aware techniques for that. One way:
// ==UserScript==
// @name Openload.co, Report on track nodes
// @match *://openload.co/embed/*
// @match *://interactive-examples.mdn.mozilla/pages/tabbed/track.html
// @require https://ajax.googleapis./ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github./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]);
}
Note that the above code works in Tampermonkey, Violentmonkey, and earlier versions of Greasemonkey. It should work in Greasemonkey 4+, but that engine is very broken, so no guarantees.
You can see that the code does find the track when it exists (even in a shadow DOM) by installing the script and visiting this MDN video demo page.
Here is a simple/basic script. I didn't know which version of GM you are using. This is written for GM4 If you are using GM 3, then change:
GM.xmlHttpRequest -> GM_xmlhttpRequest
GM.openInTab -> GM_openInTab
It opens the subtitles in a new tab so you can save it.
You can run it on both embed and normal file pages.
e.g.
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
})();
本文标签: javascriptGet an Openload VTT subtitle linkStack Overflow
版权声明:本文标题:javascript - Get an Openload VTT subtitle link - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745455028a2659061.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论