Как получить плейлист youtube с помощью javascript API и json

Это часть моего проекта youtube. Я пытаюсь извлечь видео информацию из формата JSON, но у меня проблема в этой строке:

var videoId = data.feed.entry[i].link[1].href;

Когда я делаю это в одной строке, а не в cikle evrithing, это нормально, но в цикле для или пока у меня есть ошибка.

//get youtube ID

function extract(url){
    pos1=url.indexOf("videos/");
    pos2=url.substr(42,11);
    return pos2;
}

//My playlist LINK
var url2="http://gdata.youtube.com/feeds/api/playlists/B2A4E1367126848D?v=2&alt=json";
function playlistinfo(url1) {
    $.ajax({
        url: url1,
        dataType: "jsonp",
        success: function (data) { parseresults(data); }
    });
}

//whit this get playlist data
function parseresults(data) {

    //return playlist clip number
    var klipove= data.feed.openSearch$totalResults.$t;
    //put clips in  <li>

    for(i=0;i<=klipove-1;i++) {
        var videoId = data.feed.entry[i].link[1].href;
        //get video id  ID
        var id= extract(videoId);
        thumb = data.feed.entry[i].media$group.media$thumbnail[0].url;
        $('<li><img src="'+thumb+'" alt="'+id+'" class="thumb"/></li>').appendTo('.cont');
    }
}

Ответ 1

ИМХО, вы можете значительно сократить код, если используете $.getJSON, $.each
Попробуйте это.

var playListURL = 'http://gdata.youtube.com/feeds/api/playlists/B2A4E1367126848D?v=2&alt=json&callback=?';
var videoURL= 'http://www.youtube.com/watch?v=';
$.getJSON(playListURL, function(data) {
    var list_data="";
    $.each(data.feed.entry, function(i, item) {
        var feedTitle = item.title.$t;
        var feedURL = item.link[1].href;
        var fragments = feedURL.split("/");
        var videoID = fragments[fragments.length - 2];
        var url = videoURL + videoID;
        var thumb = "http://img.youtube.com/vi/"+ videoID +"/default.jpg";
        if (videoID !='videos') {
list_data += '<li><a href="'+ url +'" title="'+ feedTitle +'"><img alt="'+ feedTitle+'" src="'+ thumb +'"</a></li>';
}
    });
    $(list_data).appendTo(".cont");
});

Демо: Скриншот для списка воспроизведения, который вы предоставили

P.S: Имейте в виду, что миниатюра для видео с YouTube можно найти в

http://img.youtube.com/vi/{video-id}/default.jpg 

(Подробнее здесь)

Ответ 2

Я обнаружил, что эти строки:

var feedURL = item.link[1].href;
var fragments = feedURL.split("/");
var videoID = fragments[fragments.length - 2];

ожидают, что item.link [1].href будет в этом формате:

http://gdata.youtube.com/feeds/api/videos/NAs5it-xjnQ/responses?v=2

Однако это не обязательно работает, поскольку иногда item.link [1] дает URL-адрес, например

http://www.youtube.com/watch?v=Vcp7xz6dfWE&feature=youtube_gdata

Фрагменты [fragments.length - 2] в конечном итоге будут "www.youtube.com" вместо идентификатора видео.

Я изменил его, чтобы получить ссылку из item.content.src, которая всегда имеет фиксированный формат в URL, например.

http://www.youtube.com/v/NAs5it-xjnQ?version=3&f=playlists&app=youtube_gdata

Таким образом, окончательный фрагмент кода выглядит примерно так:

var tmp = item.content.src.split("/").reverse()[0];
var videoID = tmp.substring(0, tmp.indexOf("?"));

который пока еще не подвел меня.

Надеюсь, это поможет тем, кто застрял или у вас проблемы с получением идентификатора видео.

С уважением
СК

Ответ 3

Упрощенное решение и избавилось от материала манипуляции с строкой.

var playListURL = 'http://gdata.youtube.com/feeds/api/playlists/B2A4E1367126848D?v=2&alt=json&callback=?';
var videoURL= 'http://www.youtube.com/watch?v=';

var vids = new Array();

$.getJSON(playListURL, function(data) {
    $.each(data.feed.entry, function(i, item) {
        vids.push( item["media$group"]["yt$videoid"]["$t"] );
    });

    console.log( vids );
});