Как да извикате 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