Как вызвать Youtube-Flash-API существующих видео с помощью Greasemonkey

#javascript #youtube-api #greasemonkey #userscripts

#javascript #youtube-api #greasemonkey #пользовательские скрипты

Вопрос:

Я хочу написать скрипт Greasemonkey для определения того, когда видео YouTube на веб-сайте начинает воспроизводиться, чтобы остановить воспроизведение музыки на моем winamp. Все работает нормально, мой скрипт обнаруживает видео, включает API, а также onYouTubePlayerReady вызывает событие. Но я понятия не имею, как зарегистрировать onStateChange обратный вызов, это мой код:

 unsafeWindow.onYouTubePlayerReady = function (playerId)
{
    alert('Visible');

    document.getElementById(playerId).addEventListener('onStateChange', 'stateChanged');    

    alert('Not visible, so the line above crashes');
}

unsafeWindow.stateChanged = function (state)
{
    alert('never called, too');
}
 

Есть ли решение этой проблемы или это просто невозможно?

Комментарии:

1. Вы не можете сделать это с помощью Greasemonkey; вам придется написать расширение / дополнение для Firefox.

2. У Greasemonkey недостаточно системных привилегий для взаимодействия с Winamp. Кроме того, в приведенном выше коде есть несколько ошибок.

3. Я буду использовать WifiAmp для взаимодействия с winamp, проблема заключается только в прослушивателе «onStateChange»

Ответ №1:

«проблема только в слушателе на «onStateChange» «

Итак, чтобы обойти некоторые проблемы с определением области действия, лучше всего просто ввести код, который взаимодействует с API YouTube.

Следующее работает в Firefox Greasemonkey, а также в Chrome или Chrome Tampermonkey. Он также должен работать в любом браузере, поддерживающем пользовательские скрипты:

 function GM_main () {
    window.stateChanged = function (state) {
        console.log ('GM: In stateChanged().  State = ', state);
    }

    window.onYouTubePlayerReady = function (playerId) {
        /*-- playerId is not being set by Youtube. Use
            hard-coded id (movie_player) instead.
        */
        var playerNode  = document.getElementById ("movie_player");
        if (playerNode) {
            /*--- Note, inside onYouTubePlayerReady ONLY, the YouTube API
                seems to override addEventListener. Hence the nonstandard
                parameters.
            */
            playerNode.addEventListener ('onStateChange', 'stateChanged');

            console.log ('GM: Listener installed just fine.');
        }
        else
            console.error ("GM: Player node not found!");
    }
}

addJS_Node (null, null, GM_main);

function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '('   funcToRun.toString()   ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}
 

Комментарии:

1. Спасибо за этот фрагмент, вы это тестировали? Я отредактировал свой вопрос выше, он по-прежнему вылетает при добавлении прослушивателя событий. Я что-то забыл?

2. Да, я это тестировал. Вы увидите State = , как сообщения будут мигать на консоли Firebug. В отредактированном вопросе есть многочисленные ошибки транскрипции: var объявления, которых там не должно быть, дополнительные кавычки и т. Д. Начните именно с моего кода. Просмотрите результаты на консоли FF или, что еще лучше, установите Firebug и используйте его консоль.

3. Спасибо, это сработало! Одна из моих проблем заключалась в том, что я использовал <object> вместо <embed> , после того, как я это изменил, все работало нормально! Я опубликую свой окончательный код в виде скрипта greasemonkey, если найду время его закончить…

4. Вы должны обновить свой пример кода, потому что E4X был удален из Firefox.