Как вызвать Youtube-Flash-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');
}

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


person Thomas Kekeisen    schedule 01.11.2011    source источник
comment
Невозможно сделать это с Greasemonkey; вам придется написать расширение/надстройку Firefox.   -  person Brock Adams    schedule 02.11.2011
comment
Greasemonkey не имеет достаточных системных привилегий для взаимодействия с Winamp. Кроме того, в приведенном выше коде есть несколько ошибок.   -  person Brock Adams    schedule 02.11.2011
comment
Я буду использовать WifiAmp для взаимодействия с winamp, проблема только в прослушивателе onStateChange.   -  person Thomas Kekeisen    schedule 02.11.2011


Ответы (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);
}
person Brock Adams    schedule 02.11.2011
comment
Спасибо за этот фрагмент, вы проверяли это? Я отредактировал свой вопрос выше, он все еще падает при добавлении прослушивателя событий. Я что-то забыл? - person Thomas Kekeisen; 05.11.2011
comment
Да, я тестировал. Вы увидите, как State = сообщения мелькают в консоли Firebug. В отредактированном вопросе есть многочисленные ошибки транскрипции: объявления var, которых там быть не должно, лишние кавычки и т. д. Начните с моего кода, ТОЧНО. Просмотрите результаты в консоли FF или, что еще лучше, установите Firebug и используйте его консоль. - person Brock Adams; 06.11.2011
comment
Спасибо, это сработало! Одна из моих проблем заключалась в том, что я использовал ‹object› вместо ‹embed›, после того, как я это изменил, все заработало нормально! Я опубликую свой окончательный код как скрипт Greasemonkey, если найду время, чтобы закончить его... - person Thomas Kekeisen; 06.02.2012
comment
Вам следует обновить пример кода, так как E4X был удален из Firefox. - person Rob W; 01.06.2013