API проигрывателя YouTube вызывает onReady слишком рано для больших плейлистов - PullRequest
0 голосов
/ 09 июля 2020

Следующий код не работает для больших плейлистов:

    var player;
    function onYouTubePlayerAPIReady() {
        player = new YT.Player('ytplayer', {
            height: '45vw',
            width: '80vw',
            playerVars: {
                listType: 'playlist',
                list: list,
                loop: 1,
                rel: 0
            },
            events: {
                onError: playerError,
                onReady: playerReady,
                onStateChange: playerStateChange
            }
        });
    }

function playerReady() {
        player.setShuffle(true);
        player.playVideoAt(0);
}

И это успешно, хотя это очень сильно зависит от браузера, поэтому не идеально:

    var player;
    function onYouTubePlayerAPIReady() {
        player = new YT.Player('ytplayer', {
            height: '45vw',
            width: '80vw',
            playerVars: {
                listType: 'playlist',
                list: list,
                loop: 1,
                rel: 0
            },
            events: {
                onError: playerError,
                onReady: playerReady,
                onStateChange: playerStateChange
            }
        });
    }

function playerReady() { setTimeout( function () {
        player.setShuffle(true);
        player.playVideoAt(0);},2000);
}

Плеер загружается, но когда список воспроизведения большой (кажется, более 200 видео), он сокращает список до 200 записей. Прежде чем это произойдет, срабатывает onReady, который, в свою очередь, запускает playerReady() в моем примере. К сожалению, проигрыватель на этом этапе не готов, поэтому функция ничего не делает, и об ошибках не сообщается. Задержка позволяет игроку на самом деле готовиться сам.

Для справки:

onReady: setTimeout( playerReady,2000 )

Это нарушает widgetapi, что бы это ни было, что похоже, срабатывает также, когда onReady вызывается и жалуется в журнале консоли.

Использование playeraddEventListener( "onReady", foo(bar) ) не работает по той же причине. Также кажется, что блокируется получение видеоинформации, потому что плеер не готов.

...