Jquery和Youtube API 2.0-从播放列表获取视频链接

Jquery和Youtube API 2.0-从播放列表获取视频链接,jquery,youtube-api,Jquery,Youtube Api,我更喜欢使用smplayer这样的程序来观看youtube视频。然而,为了在播放列表中使用smplayer,我需要右键单击并复制每个单独的链接,并将每个链接粘贴到smplayer中 我想要一个简单的应用程序,它获取youtube播放列表链接,并获得播放列表中各个视频的URL列表。然后我可以简单地复制粘贴URL列表到程序中并完成 这显然是极难做到的 我几乎找到了一个已经存在的解决方案。但对于真正庞大的播放列表,它似乎失败了 所以,在谷歌上搜索之后,我发现。从中,我能够创建一个解决方案。。。然而,这

我更喜欢使用smplayer这样的程序来观看youtube视频。然而,为了在播放列表中使用smplayer,我需要右键单击并复制每个单独的链接,并将每个链接粘贴到smplayer中

我想要一个简单的应用程序,它获取youtube播放列表链接,并获得播放列表中各个视频的URL列表。然后我可以简单地复制粘贴URL列表到程序中并完成

这显然是极难做到的

我几乎找到了一个已经存在的解决方案。但对于真正庞大的播放列表,它似乎失败了

所以,在谷歌上搜索之后,我发现。从中,我能够创建一个解决方案。。。然而,这些请求似乎在任何时候都可以完成,并以它们选择的任何顺序进入输出

while(keepGoing&&index<absoluteMax){
        $.getJSON(playListURL, {}).done(function(data) {
            var list_data="";
            if (data.feed.entry.length<resultsPerPage){
                keepGoing=false;
            }
            $.each(data.feed.entry, function(i, item) {
                var feedURL = item.link[1].href;
                var fragments = feedURL.split("/");
                var videoID = fragments[fragments.length - 2];
                var url = videoURL + videoID;
                list_data += url + '\n';
            });
            var results = $('#results').val();
            $('#results').val(results+=list_data);
        });
        index+=resultsPerPage;
        playListURL = 'http://gdata.youtube.com/feeds/api/playlists/PLpclVninnGnu9a9qQphjPsK95kkZsNS_z?alt=json&v=2&max-results='+resultsPerPage+'&start-index='+index+'&callback=?';
    }
while(保持和索引)

你会注意到我必须循环才能拉入视频链接,因为API不允许你一次拉入超过50个视频。这里的问题是,每组50个视频的返回顺序与调用时不同。单击小提琴中的开始按钮,你会注意到URL每次都以不同的顺序返回

我想知道的是,为什么这些结果会以随机顺序返回?我错过了什么?我曾尝试添加一个等待计时器,但不起作用。我曾尝试简单地将每个结果附加到一个数组并在最后显示该数组,但也不起作用。由于某些原因,在firebug调试中,我似乎无法进入“getJSON”函数…事实上,它甚至从未进入内部。该函数唯一有效的时候是我根本不调试的时候


我正处于正确操作的关键时刻,我花了太多的时间来破解它……如果任何更熟悉它的人有更好的想法,请让我知道:)

问题在于您使用的是while循环。因为对YT API的调用是异步的,所以脚本到达while循环的末尾,并在第一次调用返回结果之前触发下一次迭代。有很多方法可以避免这种情况;一个简单的方法可能是将其包装在函数中而不是循环中:

$('#startButton').on("click",function(){
  $('#results').val('');
  var youtubeUrl = $('#youtubeUrl').val();
  var fromListOnwards = youtubeUrl.substring(youtubeUrl.indexOf('list=')).split('&');
  var playlistID = fromListOnwards[0].substring(5);
  var resultsPerPage=50;
  var index=1;
  var absoluteMax=999;
  var ytkey="{YOUR API KEY}";
  var videoURL= 'http://www.youtube.com/watch?v=';
  function getYtPage(pageToken) {
   playListURL= 'https://www.googleapis.com/youtube/v3/playlistItemspart=snippet&maxResults='+resultsPerPage+'&playlistId='+playlistID+'&key='+ytkey;
   if (typeof pageToken !== 'undefined') {
         playListURL +="&pageToken="+pageToken;
   }
   $.get(playListURL, {}).done(function(data) {
      var list_data="";
      $.each(data.items, function(i, item) {
         var url = videoURL + item.snippet.resourceId.videoId;
         list_data += url + '\n';
      });
      var results = $('#results').val();
      $('#results').val(results+=list_data);
      if (data.items.length===resultsPerPage&&index<absoluteMax) {
         getYtPage(data.nextPageToken);
      }
   });
  }
  getYtPage();
});
$(“#开始按钮”)。打开(“单击”,函数(){
$(“#结果”).val(“”);
var youtubeUrl=$('#youtubeUrl').val();
var fromlistforwards=youtubeUrl.substring(youtubeUrl.indexOf('list=')).split('&');
var playlaid=fromlistforwards[0]。子字符串(5);
var resultsPerPage=50;
var指数=1;
var absoluteMax=999;
var ytkey=“{YOUR API KEY}”;
var videoURL=http://www.youtube.com/watch?v=';
函数getYtPage(pageToken){
播放URL=https://www.googleapis.com/youtube/v3/playlistItemspart=snippet&maxResults=“+resultsPerPage+”&playlyid=”+playlyid+“&key=”+ytkey;
if(pageToken的类型!=“未定义”){
playliURL+=”&pageToken=“+pageToken;
}
$.get(playliURL,{}).done(函数(数据){
var列表_数据=”;
$.each(data.items,function(i,item){
var url=videoURL+item.snippet.resourceId.videoId;
列表_data+=url+'\n';
});
var results=$('#results').val();
$('结果').val(结果+=列表数据);

如果(data.items.length==resultsPerPage&&indexI尝试了这个方法,我似乎也遇到了同样的问题。我甚至很难开始使用api的v3…似乎需要设置和配置太多的东西,所有这些都是为了在url上运行简单的get…我只是尝试制作一个可以使用loca的html文件lly.差不多了;你唯一的问题是你把重新调用函数的检查放在了get请求的回调之外。当你这样做时,你会产生和以前一样的问题;请求是异步的,所以它不会等到它回来再去触发器重新调用函数。这是你编辑过的小提琴评估在ajax回调中移动final if子句将如何给您带来一致的结果(记住,正如我前面所说的,在第一组请求完全完成之前,您不能再次按下按钮)。那就行了!非常感谢!那么jquery本质上是异步的,还是这是一个youtube特有的东西?AJAX本质上是异步的,因此任何执行AJAX调用的jquery函数($.get只是$.AJAX的快捷方式,方法设置为get)都将继承它。您可以始终设置$.ajaxSetup({'async':false})当然,最好的解决方案是使用javascript承诺,因为它们是为实现同步而创建的(将另一个函数的操作推迟到承诺对象被解析为止),但这需要对函数进行更多的重写。