Получить ссылку на загрузку OpenT VTT - PullRequest
0 голосов
/ 30 октября 2018

Я бы хотел использовать Greasemonkey, чтобы добавить кнопку загрузки субтитров для OpenTT субтитров. Однако я не могу понять, как получить доступ к тегу .

Взять, к примеру, этот французский видеоклип с английскими субтитрами. Когда я посмотрел на исходный код в 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");
}

(Когда я запустил скрипт, я получил сообщение "

НЕ найдено!".)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вот простой / базовый скрипт. Я не знал, какую версию GM вы используете. Это написано для 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
})();
0 голосов
/ 31 октября 2018

Ссылка , которую вы дали , никогда не имеет <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. Он должен работать в Greasemonkey 4+, но этот двигатель сильно сломан, поэтому никаких гарантий.

Вы можете увидеть, что код находит трек, когда он существует (даже в теневом DOM), установив скрипт и посетив эту демонстрационную страницу видео MDN .

...