【问题标题】:Jquery and Youtube API 2.0 - Getting Video Links from PlaylistsJquery 和 Youtube API 2.0 - 从播放列表中获取视频链接
【发布时间】:2014-03-02 22:41:51
【问题描述】:

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

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

这显然是极难实现的......

我差一点就找到了一个已经存在的解决方案here。但是对于非常大的播放列表,它似乎失败了。

所以,在谷歌上搜索后,我发现了this post。从中,我能够创建一个解决方案......但是这些请求似乎随时完成,并以他们选择的任何顺序输入输出。

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=?';
    }

Link to jsfiddle

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

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

我即将解决这个问题,我已经花了太多时间来破解它......如果任何更熟悉它的人有更好的主意,请告诉我:)

【问题讨论】:

    标签: jquery youtube-api


    【解决方案1】:

    问题是您正在使用 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();
    });
    

    (请注意,我使用 API 的 v3 来处理代码示例,因为它使获取 videoID 和分页更容易,但相同的范例很容易应用于 v2)。

    这样,您的调用将在下一个函数执行之前返回并处理。

    还请注意,再次,因为它是 ajax,如果您单击开始按钮一次,然后在页面等待结果的过程中(即在一切完成之前)再次这样做,那么该调用将不会取消......所以你可能会得到一些后来的结果页面的重复。但是顺序总是一致的。如果您在再次单击按钮之前完成一个完整的循环,您的结果将是相同的。

    【讨论】:

    • 我试过了,我似乎遇到了同样的问题。 jsfiddle.net/z9LT2/1 我什至很难开始使用 api 的 v3... 似乎我需要设置和配置的东西太多了,以便在一个 url 上运行一个简单的 get ......我我只是想制作一个我可以在本地使用的 html 文件。
    • 快到了;您唯一的问题是您已将重新调用函数的检查放在 get 请求的回调之外。当您这样做时,您会产生与以前相同的问题;该请求是异步的,因此它不会等待它返回,然后再转到该触发器以重新调用该函数。这是您编辑的小提琴,它演示了如何在 ajax 回调中移动最后的 if 子句将为您提供一致的结果(请记住,正如我之前所说,在第一组请求完全完成之前,您不能再次点击按钮) . jsfiddle.net/z9LT2/2
    • 行得通!非常感谢!那么 jquery 本质上是异步的,还是 youtube 特有的?
    • AJAX 本质上是异步的,因此任何执行 ajax 调用的 jQuery 函数($.get 只是 $.ajax 的快捷方式,方法设置为 GET)都会继承它。您也可以随时设置 $.ajaxSetup({'async':false}) 以强制同步。当然,最好的解决方案是使用 javascript Promise,因为它们就是为此而创建的(推迟另一个函数的操作,直到解决了 Promise 对象),但这需要更多地重写你的函数。
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 2015-08-20
    • 2011-06-04
    • 2018-09-05
    • 2013-09-12
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多