Исправление Shuffle Playlist для Youtube API

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

Поэтому я пытаюсь создать обходной путь. Я подумал, что могу сделать случайным числом замену порядкового номера плейлиста. Это сработало нормально, и я позволил мне перетасовать список воспроизведения, если я вручную ввел Макс и Мин для генератора случайных чисел. см. здесь: http://jsfiddle.net/9kFyx/33/

Хотя я очень доволен этим, я бы предпочел иметь более динамичный код, который просто получал бы количество элементов в массиве списка воспроизведения и использовал их в качестве максимального числа для случайного фактора. Звучит достаточно легко? Я посмотрел ссылку на API для этого здесь: https://developers.google.com/youtube/js_api_reference#Retrieving_playlist_information

и нашел player.getPlaylist()

Я использовал array.length;, чтобы получить элементы числового массива и ввести их в генератор случайных чисел. Но это не работает! Я не уверен, почему. Когда я попытался записать массив, он вернулся как неопределенный.

Вы можете помочь?

http://jsfiddle.net/42S5N/

<div id="player"></div>
<div id="output" style="width:300px; height:20px; background:white; color:black;">maxNumber</div>
<script>
    var tag = document.createElement('script');

    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

    var player;

    function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
            height: '411',
            width: '548',
            events: {
                'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
            }

        });
    }


    var playlistArray;
    var playListArrayLength;
    var maxNumber;

    function onPlayerReady(event) {
        player.loadPlaylist({
            'listType': 'playlist',
                'list': 'PLhaqVbVcY6UPkbjbeJM2CwRedCrr0rPJr'
        });
        playlistArray = player.getPlaylist();
        playListArrayLength = playlistArray.length;
        maxNumber = playListArrayLength;
        document.getElementById('output').innerHTML = playListArrayLength;
        next();
    }



    function next() {
        player.loadPlaylist({
            'listType': 'playlist',
                'list': 'PLhaqVbVcY6UPkbjbeJM2CwRedCrr0rPJr',
                'index': newRandomNumber(),
                'startSeconds': '0',
                'suggestedQuality': 'small'
        });
        player.setShuffle({
            'shufflePlaylist': 'true'
        });
    }


    var oldNumber = 0;
    var NewNumber = 0;

    function newRandomNumber() {
        oldNumber = NewNumber;
        NewNumber = Math.floor(Math.random() * maxNumber);
        if (NewNumber == oldNumber) {
            newRandomNumber();
        } else {
            return NewNumber;
        }
    }

    function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.ENDED) {
            next();
        }
    }
</script>

person toms    schedule 09.05.2014    source источник
comment
developers.google.com/youtube/js_api_reference#setShuffle   -  person CSᵠ    schedule 10.04.2015


Ответы (2)


Есть задержка между вызовом player.loadPlaylist() и получением плейлиста с помощью player.getPlaylist(). Этот ответ обеспечивает исправление путем ожидания события CUED, но в моих тестах оно вообще не запускалось, поэтому Я проверил событие PLAYING, которое работало нормально.

Ваш код будет примерно таким:

function onPlayerReady(event) {
    player.loadPlaylist({
        'listType': 'playlist',
        'list': 'PLhaqVbVcY6UPkbjbeJM2CwRedCrr0rPJr'
    });
}

var firstLoad = true;
function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.ENDED) {
        next();
    } else {
        if (firstLoad && event.data == YT.PlayerState.PLAYING) {
            firstLoad = false;
            playlistArray = player.getPlaylist();
            playListArrayLength = playlistArray.length;
            maxNumber = playListArrayLength;
            document.getElementById('output').innerHTML = playListArrayLength;
            next();
        }
    }
}
person Vinicius Pinto    schedule 09.05.2014

Мое решение на PHP немного громоздкое, но работает.

function getNumberofElements() {
    $pid = $this->getPID();
    $url = "https://www.googleapis.com/youtube/v3/playlists?part=contentDetails&id=$pid&key=$yourAPIKey";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
    curl_setopt($ch, CURLOPT_POST, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_NOBODY, FALSE);
    curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
    curl_setopt($ch, CURLOPT_REFERER, "");
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 4);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");

    $numberOfElements = curl_exec($ch);  // $xml = simplexml_load_string($numberOfElements);

    $numberOfElements = substr(strstr($numberOfElements, 'itemCount":'), strlen('itemCount":'));
    $numberOfElements = str_replace("}", " ", $numberOfElements);
    $numberOfElements = str_replace("]", " ", $numberOfElements);

    return $numberOfElements;
}
person Duveral    schedule 05.02.2016