Получить продолжительность видео с API данных YouTube?

В принципе, я пытаюсь получить продолжительность видео каждого видео, которое отображается в результатах при их поиске. У меня есть аккуратная небольшая демо-версия, с которой вы можете общаться!

ТАКЖЕ - Когда я говорю "продолжительность", я имею в виду длину видео в формате M/S (0:00).

DEMO http://codepen.io/mistkaes/pen/6b6a347c7d24edee15b3491420db4ecd

JQuery

var apikey = '<API KEY>';

$(function() {
    var searchField = $('#search-input');

    $('#search-form').submit(function(e) {
        e.preventDefault();
    });
});

function search() {
    $('#results').html('');

    q = $('#search-input').val();

    $.get(
        "https://www.googleapis.com/youtube/v3/search", {
            part: 'snippet, id',
            q: q,
            maxResults: 50,
            type: 'video',
            key: apikey
        },
        function(data) {
            $.each(data.items, function(i, item) {
                var output = getResults(item);

                $('#results').append(output);
            });
        });
}

function getResults(item) {
    var videoID = item.id.videoId;
    var title = item.snippet.title;
    var thumb = item.snippet.thumbnails.high.url;
    var channelTitle = item.snippet.channelTitle;

    var output = '<li>' +
        '<div class="list-left">' +
        '<img src="' + thumb + '">' +
        '</div>' +
        '<div class="list-right">' +
        '<h3><a href="#" onclick="location.href='http://youtube.com/embed/' + videoID + '?rel=0'; return false;">' + title + '</a></h3>' +
        '<p class="cTitle">' + channelTitle + '</p>' +
        '</div>' +
        '</li>' +
        '<div class="clearfix"></div>' +
        '';

    return output;
}

Ответ 1

Я искал ваш запрос и нашел там issue с поиском api.

Альтернативой является вызов видео ресурса Youtube Data API после того, как вы выполните запрос на поиск. Вы можете установить до 50 идентификаторов видео в поиске, поэтому вам не нужно будет вызывать его для каждого элемента

Я обновил ваш codepen, и я сделал следующее:

1) Получить URL-адрес каждого видео, которое вы получили от поиска.

2) Отправьте еще один вызов Ajax, чтобы получить продолжительность: -

for (var i = 0; i < data.items.length; i++) {
    var url1 = "https://www.googleapis.com/youtube/v3/videos?id=" + data.items[i].id.videoId + "&key=AIzaSyDYwPzLevXauI-kTSVXTLroLyHEONuF9Rw&part=snippet,contentDetails";
    $.ajax({
        async: false,
        type: 'GET',
        url: url1,
        success: function(data) {
            if (data.items.length > 0) {
                var output = getResults(data.items[0]);
                $('#results').append(output);
            }
        }
    });
}

3) API дает время в формате ISO, поэтому я преобразовал его в формат mm:ss (как вам было нужно).

function convert_time(duration) {
    var a = duration.match(/\d+/g);

    if (duration.indexOf('M') >= 0 && duration.indexOf('H') == -1 && duration.indexOf('S') == -1) {
        a = [0, a[0], 0];
    }

    if (duration.indexOf('H') >= 0 && duration.indexOf('M') == -1) {
        a = [a[0], 0, a[1]];
    }
    if (duration.indexOf('H') >= 0 && duration.indexOf('M') == -1 && duration.indexOf('S') == -1) {
        a = [a[0], 0, 0];
    }

    duration = 0;

    if (a.length == 3) {
        duration = duration + parseInt(a[0]) * 3600;
        duration = duration + parseInt(a[1]) * 60;
        duration = duration + parseInt(a[2]);
    }

    if (a.length == 2) {
        duration = duration + parseInt(a[0]) * 60;
        duration = duration + parseInt(a[1]);
    }

    if (a.length == 1) {
        duration = duration + parseInt(a[0]);
    }
    var h = Math.floor(duration / 3600);
    var m = Math.floor(duration % 3600 / 60);
    var s = Math.floor(duration % 3600 % 60);
    return ((h > 0 ? h + ":" + (m < 10 ? "0" : "") : "") + m + ":" + (s < 10 ? "0" : "") + s);
}

4) Добавьте свой результат с заголовком своего видео.

'<p class="cTitle">' + channelTitle + '  --->' + duration + '</p>'