Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Youtube Api JSON错误地排列结果_Json_Video_Youtube_Youtube Api - Fatal编程技术网

Youtube Api JSON错误地排列结果

Youtube Api JSON错误地排列结果,json,video,youtube,youtube-api,Json,Video,Youtube,Youtube Api,我使用的是视频选择器应用程序(作者:LockeVN:),我得到的结果不像youtube网站(或github上的任何其他搜索应用程序)上的结果那样有序 例如: 我输入:“奇异公司的壮举安吉·布朗,我会抓住你的”。 我在youtube上看到的第一个视频是:“奇异公司的壮举安吉·布朗——我要抓到你(1992)”。 我在video Picker应用程序中得到的第一个视频是:“奇异公司-我会找到你(SAVERY&MILLER混搭)” 注意:两者都设置为orderby=relevance,当我更改max r

我使用的是视频选择器应用程序(作者:LockeVN:),我得到的结果不像youtube网站(或github上的任何其他搜索应用程序)上的结果那样有序

例如: 我输入:“奇异公司的壮举安吉·布朗,我会抓住你的”。 我在youtube上看到的第一个视频是:“奇异公司的壮举安吉·布朗——我要抓到你(1992)”。 我在video Picker应用程序中得到的第一个视频是:“奇异公司-我会找到你(SAVERY&MILLER混搭)”

注意:两者都设置为orderby=relevance,当我更改max results时,视频顺序会更改;仅当“最大结果”设置为1时,结果的顺序才正确

有人知道如何解决这个问题吗

代码:

(函数($){
$.fn.YouTubePicker=函数(选项){
//默认选项
var默认值={
MaxResults:10/*每个“页面”的YouTube结果数*/
,OrderBy:“相关性”/*结果的排序依据*/
,作者:null/*视频作者*/
,playerNumber:1
,ShowNumOfViews:true/*显示视频的视图数*/
,缩略图:“小”/*小:120x90 |大:480 x 360*/
,ControlIdSuffix:“/*如果您有YouTubePicker的乘法,则此处应给出唯一的字符串。
使用此插件中的元素将通过“id+ControlIdSuffix”获取*/
,ControlQueryHolder:'.YouTubePickerQuery'/*选择器,以获取作为查询持有者的元素(其中获取字符串以查询YouTube)*/
,ControlSearchButton:“.YouTubePickerSearch”/*选择器以获取要搜索的元素按钮。单击此元素以开始搜索*/
,ControlVideoPlayerHolder:“.YouTubePickerVideoPlayer”/*选择器,用于获取元素以渲染VideoPlayer*/
,ControlVideoTitleHolder:“.YouTubePickerVideoTitle”
,ControlVideoList:'.YouTubePickerVideoList'/*选择器以获取元素以呈现VideoList*/
,ControlSelectedUrlHolder:'.YouTube EpickerSelectedUrl'/*当用户单击选择视频时,将视频的url分配给此输入*/
,InitVideoUrl:“/*Init如果不存在搜索查询,您可以将YouTubeVideoId放在此处或完整Url*/
,PlayerWidth:'240'/*玩家设置*/
,PlayerHeight:'220'/*玩家设置*/
,AutoPlay:false/*用户单击列表中的项目后立即自动播放视频*/
,ShowRelated:false/*播放结束后显示相关视频*/
,AllowFullScreen:true/*启用播放器的全屏按钮*/
,EnableJsApi:true/*启用Javascript Api*/
};
选项=$.extend(默认值,选项);
返回此。每个(函数(){
var$container=$(这个);
$(options.ControlSearchButton)。单击(函数(){
/// 
///点击搜索按钮
/// 
var requestUrl=http://gdata.YouTube.com/feeds/api/videos?alt=json&max-results='+options.MaxResults;
试一试{
_RequestYouTubeVideos(requestUrl);
}捕获(ex){}
返回false;
});
$(options.ControlQueryHolder).keydown(函数(事件){
/// 
///在查询文本框中按Enter键
/// 
if((event.which&&event.which==13)| |(event.keyCode&&event.keyCode==13)){
$(options.ControlSearchButton).trigger('click');
返回false;
}
否则{
返回true;
}
});
//-------------------------------------------------------//
//拍摄init视频并播放(如果有)
//擦掉这部分
//$(options.ControlVideoPlayerHolder+).html(_GetPlayerHtml(_GetYouTubeIdFromUrl(options.InitVideoUrl));
//\u AssignValueToDivOrTextBox(options.ControlSelectedUrlHolder,options.InitVideoUrl);
$('a.navigation')。单击(函数(){
/// 
///每当用户单击更改页面时,重新绑定列表
/// 
试一试{
_RequestYouTubeVideos($(this.attr('href'));
}捕获(ex){}
返回false;
});
/**
*Util函数,为元素赋值。元素可以是div、span或input
*/
函数(将值分配给科特迪瓦文本框)(选择或删除元素,值分配){
试一试{
$(selectorToElement).val(要分配的值);
}捕获(ex){}
试一试{
$(selectorToElement).text(要分配的值);
}捕获(ex){}
}
函数_RequestYouTubeVideos(requestUrl){
/// 
///激发jsonp请求以从YouTube搜索API获取数据
/// 
var query=$(options.ControlQueryHold.val();
if(options.Author!=null){
requestUrl+='&author='+选项。author;
}
if(options.OrderBy!=null){
requestUrl+='&orderby='+options.orderby;
}
if(查询!=null){
requestUrl+='&q='+查询;
}
$.ajax({
键入:“获取”,
url:requestUrl,
cache:false,
数据类型:“jsonp”,
全球:错,
成功:_OnYouTubeSuccess,
错误:函数(res
(function ($) {
$.fn.YouTubePicker = function (options) {
    // default option
    var defaults = {
        MaxResults: 10                                      /* number of YouTube results, per "page" */
        , OrderBy: 'relevance'                                     /* what to order the results by */
        , Author: null                                      /* Author of the video */

        , PlayerNumberOp: 1

        , ShowNumOfViews: true                             /* show number of views for the video */
        , Thumbnail: 'small'                                /* small: 120x90 | large: 480 x 360 */

        , ControlIdSuffix: ''                           /* should give the unique string here if you have multiply of YouTubePicker. 
                                                            Using elements in this plugin will fetch by "id + ControlIdSuffix" */
        , ControlQueryHolder: '.YouTubePickerQuery'              /* selector to take a element to be query holder (where we take string to query                                                                   YouTube) */
        , ControlSearchButton: '.YouTubePickerSearch'            /* selector to take a element to be SearchButton. Click this element to start search. */
        , ControlVideoPlayerHolder: '.YouTubePickerVideoPlayer'  /* selector to take a element to render VideoPlayer */
        , ControlVideoTitleHolder: '.YouTubePickerVideoTitle'
        , ControlVideoList: '.YouTubePickerVideoList'           /* selector to take a element to render VideoList */
        , ControlSelectedUrlHolder: '.YouTubePickerSelectedUrl'  /* When user click to select a video, assign the video's url to this input */

        , InitVideoUrl: ''                                  /* Init if no search query existed, you can put YouTubeVideoId here or the full Url */
        , PlayerWidth: '240'                                /* setting for player */
        , PlayerHeight: '220'                               /* setting for player */
        , AutoPlay: false                                    /* AutoPlay video right after user click an item in the list */
        , ShowRelated: false                                 /* show relate video after finish playing */
        , AllowFullScreen: true                            /* enable FullScreen button of Player */
        , EnableJsApi: true                             /* enable Javascript Api*/
    };
    options = $.extend(defaults, options);

    return this.each(function () {
        var $container = $(this);

        $(options.ControlSearchButton).click(function () {
            /// <summary>
            /// handler click on search button
            /// </summary>

            var requestUrl = 'http://gdata.YouTube.com/feeds/api/videos?alt=json&max-results=' + options.MaxResults;
            try {
                _RequestYouTubeVideos(requestUrl);
            } catch (ex) { }

            return false;
        });

        $(options.ControlQueryHolder).keydown(function (event) {
            /// <summary>
            /// handler press Enter in query textbox
            /// </summary>

            if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
                $(options.ControlSearchButton).trigger('click');
                return false;
            }
            else {
                return true;
            }
        });

        //-------------------------------------------------------//
        // take the init video and play it if any

        // ERASED THIS PART
        // $(options.ControlVideoPlayerHolder + "").html(_GetPlayerHtml(_GetYouTubeIdFromUrl(options.InitVideoUrl)));
        // _AssignValueToDivOrTextBox(options.ControlSelectedUrlHolder, options.InitVideoUrl);


        $('a.navigation').click(function () {
            /// <summary>
            /// rebind the list whenever user click to change page
            /// </summary>
            try {
                _RequestYouTubeVideos($(this).attr('href'));
            } catch (ex) { }

            return false;
        });


        /**
        * Util function, assign value to element. Element can be div, span, or input
        */
        function _AssignValueToDivOrTextBox(selectorToElement, valueToAssign) {
            try {
                $(selectorToElement).val(valueToAssign);
            } catch (ex) { }
            try {
                $(selectorToElement).text(valueToAssign);
            } catch (ex) { }
        }


        function _RequestYouTubeVideos(requestUrl) {
            /// <summary>
            /// fire the jsonp request to get data from YouTube Search API
            /// </summary>
            var query = $(options.ControlQueryHolder).val();
            if (options.Author != null) {
                requestUrl += '&author=' + options.Author;
            }
            if (options.OrderBy != null) {
                requestUrl += '&orderby=' + options.OrderBy;
            }
            if (query != null) {
                requestUrl += '&q=' + query;
            }

            $.ajax({
                type: "GET",
                url: requestUrl,
                cache: false,
                dataType: 'jsonp',
                global: false,
                success: _OnYouTubeSuccess,
                error: function (result) {
                    $(options.ControlVideoList).html('<p>Please fill in a search term</p>');
                }
                    ,
                ajaxComplete: function (data) {
                    return false;
                }
            });
        }


        function _BuildNavigation(feed) {
            /// <summary>
            /// Build the navigation link Prev and Next base on the return url in the feed (if existed)
            /// </summary>
            if (feed.link) {
                var nextLink = null;
                var prevLink = null;

                for (var i = 0; i < feed.link.length; i++) {
                    var link = feed.link[i];
                    if (link.rel == 'next') {
                        nextLink = link.href;
                    }
                    else if (link.rel == 'previous') {
                        prevLink = link.href;
                    }
                }

                if (nextLink) {
                    $('.navigation.next').attr('href', nextLink).show();
                }
                else {
                    $('.navigation.next').hide();
                }
                if (prevLink) {
                    $('.navigation.prev').attr('href', prevLink).show();
                }
                else {
                    $('.navigation.prev').hide();
                }
            }
        }

        function formatSecondsAsTime(secs) {
        var hr = Math.floor(secs / 3600);
        var min = Math.floor((secs - (hr * 3600)) / 60);
        var sec = Math.floor(secs - (hr * 3600) - (min * 60));

        if (hr < 10) {
        hr = "0" + hr;
        }
        if (min < 10) {
        min = "0" + min;
        }
        if (sec < 10) {
        sec = "0" + sec;
        }
        if (hr) {
        hr = "00";
        }

        return hr + ':' + min + ':' + sec;
        }

        function _ParseYouTubeFeedItem(feedData) {
            /// <summary>
            /// Extract what we want from YouTube feedData                
            /// </summary>
            var dto = [];

            dto.id = _StripFeature(feedData.link[0].href.substring(feedData.link[0].href.indexOf('=') + 1, feedData.link[0].href.length));
            dto.url = feedData.link[0].href;
            dto.title = feedData.title.$t;
            if (options.Thumbnail == 'large') {
                var index = 0;  // first thumb is large size
            } else {
                var index = feedData.media$group.media$thumbnail.length - 1; // take the last small thumb
            }
            dto.thumbnail = feedData.media$group.media$thumbnail[index].url;
            dto.description = feedData.media$group.media$description.$t;
            dto.author = feedData.author[0].name.$t;
            dto.duration = formatSecondsAsTime(feedData.media$group.media$content[0].duration);

            if (feedData.yt$statistics) {
                dto.views = feedData.yt$statistics.viewCount;
            }
            else if (!feedData.yt$statistics) {
                dto.views = '0';
            }

            return dto;
        }


        /**
        * Process the json result, render the list
        */
        function _OnYouTubeSuccess(result) {
            var feed = result.feed;
            var rfeed = feed.entry || [];
            var relVideos = [];

            var $ctrVideoList = $(options.ControlVideoList);

            // build the navigation
            _BuildNavigation(feed);

            if (rfeed.length > 0) {
                $(rfeed).each(function (i) {
                    /// <summary>
                    /// from feeditem from YouTube, build the video data object
                    /// </summary>

                    relVideos[i] = _ParseYouTubeFeedItem(rfeed[i]);

                }).ready(function () {
                    relVideos.sort(_ArraySort);
                    var $itemsHtml = $('<div>');    // temporary DOM node to append VideoItem to

                    $(relVideos).each(function (i) {
                        /// <summary>
                        /// Create each list item
                        /// </summary>

                        $itemsHtml.append('<li class="VideoItem">');
                        videoItem = $itemsHtml.find('.VideoItem:last');

                        videoItem.append('<div class="VideoThumb">');
                        videoThumb = videoItem.find('.VideoThumb');
                        $('<a>').addClass('YouTubelink').attr('href', relVideos[i].url).append('<img src="' + relVideos[i].thumbnail + '">').appendTo(videoThumb);

                        videoItem.append('<div class="VideoInfo">');
                        videoInfo = videoItem.find('.VideoInfo');
                        videoInfo.append('<a href="' + relVideos[i].url + '" title="' + relVideos[i].description + '" class="VideoTitle YouTubelink"><strong>' + relVideos[i].title + ' </strong><br /><span class="VideoNumOfViews">' + relVideos[i].views + ' views</span><br /><span></span>' + relVideos[i].duration + '<br /></a>');


                    });

                    // clear the list
                    $ctrVideoList.empty().append($itemsHtml.children());
                });



                // load inital video after finish rendering the list
                // take the first video in the list, take it link, take it href, assign to the Player

                // ERASED THIS PART
                //var firstVid = $ctrVideoList.children("li:first-child").addClass("selected").find("a").eq(1).attr("href");
                //$(options.ControlVideoPlayerHolder + "").html(_GetPlayerHtml(_GetYouTubeIdFromUrl(firstVid)));


                $ctrVideoList.find("li a").unbind('click').bind('click', function () {

                    /// <summary>
                    /// load video on click of a in li
                    /// </summary>
                    try {
                        var selectedUrl = $(this).attr("href");

                        // return the selectedUrl to outside (try catch to avoid error in IE)
                        _AssignValueToDivOrTextBox(options.ControlSelectedUrlHolder, selectedUrl);

                        $(options.ControlVideoPlayerHolder + "").html(_GetPlayerHtml(_GetYouTubeIdFromUrl(selectedUrl)));

                        // DIT IS EEN TEST
                        $(options.ControlVideoTitleHolder + "").html(_GetTitleHtml(_GetYouTubeIdFromUrl(selectedUrl)));

                        $(this).parent().parent().parent("ul").find("li.selected").removeClass("selected");
                        $(this).parent().parent("li").addClass("selected");
                    } catch (ex) { }

                    return false;
                });

            } else {
                /* if we have no YouTube videos returned, let's tell user */
                $ctrVideoList.html('<p>There is no result</p>');
            }
        }   // end _OnYouTubeSuccess




        function _ArraySort(a, b) {
            if (a.title < b.title) {
                return -1;
            }
            else if (a.title > b.title) {
                return 1;
            }
            else {
                return 0;
            }
        }

        function _StripFeature(vidID) {
            var featureLoc = vidID.indexOf('&feature=YouTube_gdata');
            if (featureLoc >= 0) {
                return vidID.substring(0, featureLoc);
            } else {
                return vidID;
            }
        }


        /**
        * Create a Player HTML code to play an YouTubeID, and return it HTML string
        */
        function _GetPlayerHtml(YouTubeVideoId) {
            // if YouTubeVideoId is null or empty, we provide an empty div with same dimension of the Player
            // This will fix a bug of IE (IE will load the swf forever if object movie is empty and/or embbed src is empty              
            if (!YouTubeVideoId) {
                return '<div style="width:240px;height:220px">';
            }

            var html = '';
            var PlayerNumber = options.PlayerNumberOp;

            html += '<object height="220" width="240">';
            html += '<param name="movie" value="http://www.YouTube.com/v/'+YouTubeVideoId+'?enablejsapi=1&rel=0&showinfo=2&iv_load_policy=3&modestbranding=1"> </param>';
            html += '<param name="wmode" value="transparent"> </param>';
            // I HAVE CHANGED THIS
            html += '<iframe onload="floaded'+PlayerNumber+'()" id="player'+PlayerNumber+'" width="240" height="220" src="http://www.youtube.com/embed/'+YouTubeVideoId+'?enablejsapi=1&rel=0&showinfo=2&iv_load_policy=3&modestbranding=1" frameborder="0" allowfullscreen> </iframe>';
            html += '</object>';

            return html;
        };

        function _GetTitleHtml(YouTubeVideoId) {

            var html = '';
            var PlayerNumber = options.PlayerNumberOp;

        $.getJSON('http://gdata.youtube.com/feeds/api/videos/'+YouTubeVideoId+'?v=2&alt=jsonc',function(data,status,xhr){

        var video_title1=data.data.title;
        var finaltext1="<div id='title1'><h5 class='redtext'>USER SELECTED</h5><h5>"+video_title1+"</h5></div>";
        $('#YouTubePickerVideoTitle'+PlayerNumber+'').html(finaltext1);

        });

            return html;
        };


        function _GetYouTubeIdFromUrl(url) {
            /// <summary>
            /// use RegEx too grab a YouTube id from a (clean, no querystring) url (thanks to     http://jquery-howto.blogspot.com/2009/05/jYouTube-jquery-YouTube-thumbnail.html)
            /// <return>empty string if cannot match.</return>
            /// </summary>
            if (url && url != '') {
                try {
                    var ytid = url.match("[\\?&]v=([^&#]*)");
                    ytid = ytid[1];
                    return ytid;
                }
                catch (ex) { }
            }
            return '';
        };
    });
};
})(jQuery);