【问题标题】:Always get latest video in YouTube playlist始终在 YouTube 播放列表中获取最新视频
【发布时间】:2023-03-23 11:12:01
【问题描述】:

我希望始终显示播放列表中的最新视频。因此,只在页面上显示一个视频,但始终显示最新的播放列表。当用户在 YouTube 上上传新视频时,该最新视频必须显示在网页上。

到目前为止我所拥有的:

HTML

<div id="yt-player"></div>

JS

<script src="http://www.youtube.com/player_api"></script>
<script>
    // create youtube player
    var player;
    function onYouTubePlayerAPIReady() {
        player = new YT.Player("yt-player", {
            height: "480",
            width: "853",
            videoId: "br6xOdlyRbM"
        });
    }
</script>

但是,这只会发布具有特定 ID 的视频,而不会来自播放列表。然后我尝试了以下JS。

        var player;
        function onYouTubePlayerAPIReady() {
            player = new YT.Player("yt-player", {
              height: "480",
              width: "853",
              playerVars: {
                  listType: "playlist",
                  list: "PLiXK3ub3Pc8_Tk0WiPpVTVmuzoZs8_SaY",
                  color: "white",
                  modestbranding: 1,
                  theme: "light"
              },
              events: {
                "onStateChange": onPlayerStateChange
              }
            });
        }

不幸的是,这也不起作用。显示 YouTube 播放器,但显示的是第一个视频,而不是最后一个。现场示例here

【问题讨论】:

    标签: youtube-api youtube-javascript-api youtube-iframe-api


    【解决方案1】:

    获取播放列表的“最后一个元素”可能并不总是您想要的 - 它基本上取决于播放列表中视频的顺序。 “最近上传”(显然)按上传日期降序排列(最新在前),其他按日期升序排列(最旧在前)。
    在后一种情况下,您必须遍历播放列表的所有页面,直到到达最后一项。

    有一个示例几乎可以将您带到https://developers.google.com/youtube/v3/code_samples/javascript 上的目标(从那里复制的代码摘录):

    // Retrieve the list of videos in the specified playlist.
    function requestVideoPlaylist(playlistId, pageToken) {
      $('#video-container').html('');
      var requestOptions = {
        playlistId: playlistId,
        part: 'snippet',
        maxResults: 10
      };
      if (pageToken) {
        requestOptions.pageToken = pageToken;
      }
      var request = gapi.client.youtube.playlistItems.list(requestOptions);
      request.execute(function(response) {
        // Only show pagination buttons if there is a pagination token for the
        // next or previous page of results.
        nextPageToken = response.result.nextPageToken;
        var nextVis = nextPageToken ? 'visible' : 'hidden';
        $('#next-button').css('visibility', nextVis);
        prevPageToken = response.result.prevPageToken
        var prevVis = prevPageToken ? 'visible' : 'hidden';
        $('#prev-button').css('visibility', prevVis);
    
        var playlistItems = response.result.items;
        if (playlistItems) {
          $.each(playlistItems, function(index, item) {
            displayResult(item.snippet);
          });
        } else {
          $('#video-container').html('Sorry you have no uploaded videos');
        }
      });
    }
    

    结果值nextPageToken 是最有趣的。您必须按顺序获取所有页面,直到到达最后一页 - 在此示例中,您必须多次调用 requestVideoPlaylist 直到 response.result.nextPageToken 为空(因为这表明您已到达最后一页)。结果列表response.result.items 中的最后一个视频是播放列表的最后一个视频(即按日期降序排列的最新视频)。

    要减少请求的数量(它们往往需要一些时间......),您应该将 requestOptions 中的 maxResults 增加到 50(这是最大值)。

    这导致如下代码:

    function requestLastVideo(playlistId, callback, pageToken) {
      var requestOptions = {
        playlistId: playlistId,
        part: 'snippet',
        maxResults: 50
      };
      if (pageToken) {
        requestOptions.pageToken = pageToken;
      }
      var request = gapi.client.youtube.playlistItems.list(requestOptions);
      request.execute(function(response) {
        var nextPageToken = response.result.nextPageToken;
        if (nextPageToken) {
          // we didn't reach the last page yet, fetch next one
          requestLastVideo(playlistId, callback, nextPageToken);
          return;
        }
    
        var playlistItems = response.result.items;
        if (playlistItems) {
          var lastPlaylistItem = playlistItems[playlistItems.length - 1];
          callback(lastPlaylistItem.snippet);
        } else {
          alert('There are no videos');
        }
      });
    }
    

    你会这样称呼它:

    requestLastVideo("PL91BF7E9AD6889246", function(snippet) {
      console.log('Last video id was ', snippet.resourceId.videoId);
    });
    

    您可以使用requestOptions.part 来减少通话占用空间。使用此参数,您可以控制响应中存在哪些字段。您可以在YouTube API docs for this call 中找到详细说明可能值的更多信息。

    【讨论】:

      【解决方案2】:

      您需要通过 API 获取最新视频,然后将其插入您的第二个解决方案中,例如

        var player;
          function onYouTubePlayerAPIReady() {
              player = new YT.Player("yt-player", {
                height: "480",
                width: "853",
                videoId: {lastVideoIDinPLAYLIST},
                playerVars: {
                    listType: "playlist",
                    list: "PLiXK3ub3Pc8_Tk0WiPpVTVmuzoZs8_SaY",
                    color: "white",
                    modestbranding: 1,
                    theme: "light"
                },
                events: {
                  "onStateChange": onPlayerStateChange
                }
              });
          }
      

      【讨论】:

      • 您如何获得lastVideoIDinPLAYLIST?我在api中找不到。
      猜你喜欢
      • 2013-09-12
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多