从播放列表中的视频中提取YouTube缩略图&在网页上显示

时间:2016-06-21 05:48:37

标签: html css youtube-api alignment thumbnails

我的网页播放YouTube播放列表并在底部显示曲目名称(花费了大部分时间),我认为从底部显示的播放列表中播放特定视频的缩略图会很棒到赛道标题。我了解如何针对特定视频执行此操作,但如何针对视频播放列表实施此操作?为每首播放的新歌曲刷新图像非常重要。

这是我当前工作的一个小问题:https://jsfiddle.net/ruumL5s7/

另外,我在顶部和底部栏之间垂直对齐视频和聊天div时遇到问题。我也遇到问题,当屏幕调整大小时(不同的div全部分开),底部栏没有保持“完整”栏,我尝试了几个想法来防止这种情况,但没有用。所以非常感谢任何帮助!

谢谢!

HTML:

<!DOCTYPE html>
            <html>
              <head>
                <title>Chat</title>
                <link rel="stylesheet" href="main.css">
              </head>

            <div class="all-content">

              <body>

                <div class="header-bar">
                  <div class="bar">

                      <img src="C:\Users\jlewa\Desktop\assets\affinity_fm_only_letters.png" class="top-logo" style="float: left;">

                      <ul class="standard-nav" style="float: left;">

                      <li>Home</li>
                      <li>Lyrics Hub</li>
                      <li>Affinity LIVE</li>
                      <li>Merchandise</li>

                      </ul>

                  </div>
                  <div class="dropshadow"></div>
                </div>

                <div class="container-middle-third">
                  <div class="youtube-video" style="float: left;">
                    <div class="DJ-text">Affinity FM DJ Room</div>
                    <div class="DJ-underline"></div>
                    <div id="player" style="width: 1280px; height: 720px;"></div></div>
                  </div>

                  <div class="chat" style="float: left;">
                    <div class="Chat-text">Chat</div>
                    <div class="Chat-underline"></div>
                    <input type="text" class="chat-name" placeholder="Chat">
                    <div class="info-rect">Info</div>
                    <div class="chat-messages"></div>
                    <textarea placeholder="Join the conversation..."></textarea>
                    <div class="chat-status">Status: <span>Idle</span></div>
                  </div>

                <div class="bottom-bar">

                  <div class="thumbnail" id="thumbnail" style="float: left"></div>

                  <div class="title-bar" style="float: left;">

                    <div class="title" id="title"></div>
                    <div class="dj-playing">Affinity FM is playing</div>

                    <div class="progress-background">
                      <div id="progress-bar" class="progress-bar"></div>
                    </div>

                  </div>
                  <div class="subscribe" style="float: left;">

                    <div class="g-ytsubscribe" data-channel="SAMusicPlaylist" data-layout="full" data-theme="dark" data-count="default"></div> 

                  </div>

                </div>

                <script src="http://127.0.0.1:8080/socket.io/socket.io.js"></script>

                <script src="https://apis.google.com/js/platform.js"></script>

                <script>
                  (function() {
                    var getNode = function(s) {
                      return document.querySelector(s);
                    },

                        // Get required nodes
                        status = getNode('.chat-status span'),
                        messages = getNode('.chat-messages'), 
                        textarea = getNode('.chat textarea'),
                        chatName = getNode('.chat-name'),

                        statusDefault = status.textContent,    

                        setStatus = function(s){
                          status.textContent = s;

                          if(s !== statusDefault){
                            var delay = setTimeout(function(){
                              setStatus(statusDefault);
                              clearInterval(delay);
                            }, 3000);
                          }
                        };

                    //try connection
                    try{
                      var socket = io.connect('http://127.0.0.1:8080');
                    } catch(e){
                      //Set status to warn user
                    }

                    if(socket !== undefined){

                      //Listen for output
                      socket.on('output', function(data){
                        if(data.length){
                          //Loop through results
                          for(var x = 0; x < data.length; x = x + 1){
                            var message = document.createElement('div');
                            message.setAttribute('class', 'chat-message');
                            message.textContent = ': ' + data[x].message;
                            var name=document.createElement('span');
                            name.setAttribute('class', 'userName');
                            name.textContent = data[x].name;

                            message.insertBefore(name, message.firstChild);

                            //Append
                            messages.appendChild(message);
                            messages.insertBefore(message, messages.firstChild);
                          }
                        }
                      });

                      //Listen for a status
                      socket.on('status', function(data){
                        setStatus((typeof data === 'object') ? data.message : data);

                        if(data.clear === true){
                          textarea.value = '';
                        }
                      });

                      //Listen for keydown
                      textarea.addEventListener('keydown', function(event){
                        var self = this,
                            name = chatName.value;

                        if(event.which === 13 && event.shiftKey === false){
                          socket.emit('input', {
                            name: name,
                            message: self.value
                          });
                        }
                      });
                    }

                  })();
                </script>
                <script>
                  var time_total;
                  var timeout_setter;
                  var player;
                  var tag = document.createElement("script");//This code loads the IFrame Player API code asynchronously

                  tag.src = "https://www.youtube.com/iframe_api";
                  var firstScriptTag = document.getElementsByTagName("script")[0];
                  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

                  //This function creates an <iframe> (and YouTube player) OR uses the iframe if it exists at the "player" element after the API code downloads
                  function onYouTubeIframeAPIReady()
                  {
                    player = new YT.Player("player",
                                           {
                      height: "853",
                      width: "480",
                      /* videoId: "GGmxVDXM5X2UxaP9PvWQ4Z171DXyGcq", */
                      playerVars: {
                        listType:'playlist',
                        list: 'PL_GGmxVDXM5X2UxaP9PvWQ4Z171DXyGcq',
                        controls: '0',
                        html5: '1',
                        cc_load_policy: '0',
                        disablekb: '1',
                        iv_load_policy: '3',
                        modestbranding: '1',
                        showinfo: '0',
                        rel: '0',


                      },
                      events:
                      {
                        "onReady": onPlayerReady,
                        "onStateChange": onPlayerStateChange
                      }

                    });
                  }


                var num = (1 + Math.floor(Math.random() * 10));


                  //The API will call this function when the video player is ready
                  function onPlayerReady(event)
                  {
                    event.target.playVideo();
                    time_total  = convert_to_mins_and_secs(player.getDuration(), 1);
                    loopy();


                    player.addEventListener('onStateChange', 'onPlayerStateChange');


                    player.setShuffle( {
                    'shufflePlaylist': 1
                    } );    
                  }

                  function loopy()
                  {
                    var current_time = convert_to_mins_and_secs(player.getCurrentTime(), 0);
                    document.getElementById("progress-bar").style.width = (player.getCurrentTime()/player.getDuration())*100+"%";
                    console.log( current_time + " / " + time_total);
                    timeout_setter = setTimeout(loopy, 300);
                  }

                  function convert_to_mins_and_secs(seconds, minus1)
                  {
                    var mins    = (seconds>=60) ?Math.round(seconds/60):0;
                    var secs    = (seconds%60!=0) ?Math.round(seconds%60):0;
                    var secs    = (minus1==true) ?(secs-1):secs; //Youtube always displays 1 sec less than its duration time!!! Then we have to set minus1 flag to true for converting player.getDuration()
                    var time    = mins + ":" + ((secs<10)?"0"+secs:secs);
                    return time;
                  }

                  // 5. The API calls this function when the player's state changes
                  function onPlayerStateChange(event)
                  {
                    if (event.data == YT.PlayerState.ENDED)
                    {
                      console.log("END!");
                      clearTimeout(timeout_setter);
                      document.getElementById("progress-bar").style.cssText = "transition: none;";


                    }
                    else if (event.data == YT.PlayerState.PLAYING)
                    {
                      console.log("PLAYING");
                      loopy();
                      document.getElementById("progress-bar").style.cssText = "transition: all 300ms linear 0s;";
                      console.log(player.getPlayerState());
                      if (player.getPlayerState() == 1) {
                      document.getElementById( "title" ).innerText = player.getVideoData().title;
                        }
                    }
                    else if (event.data == YT.PlayerState.PAUSED)
                    {
                        event.target.playVideo();
                        console.log("PLAUSED");
                    }
                    else
                    {
                      console.log(event.data);
                    }
                  }
                </script>

              </body>
            </div>
           </html>

CSS:

 body {
          background-color: #0f0f17;
          margin: 0px;
          width: 100%;
        }

        .container-middle-third{
          margin-top: 20px;
          margin-left: 70px;
        }

        body,
        textarea,
        input {
          font: 13px "Raleway", sans-serif;
          color: #ffffff;

        }

        .all-content{
            width: 1920px;
            display: block;
            margin-left: auto;
            margin-right: auto;
        }

        .bar{
          height: 90px;
          width: 1920px;
          background-color: #15151d;   
        }

        .top-logo{
            max-height: 100%;
            max-width: 100%;
            margin-left: 4%
        }

        /*li{
            display: inline;
            padding-right: 20px;
        }

        .standard-nav {
            list-style: none;
            padding: 0;
            text-transform: uppercase;
            line-height: 13px;
            font-weight: 700;
            margin-left: 63%;
            max-height: 100%;
        } */

        .DJ-text{
          font-weight: 700;
          /*position:relative;*/
          text-transform: uppercase;
        }

        .Chat-text{
          font-weight: 700;
          text-transform: uppercase;
        }

        .DJ-underline{
          width: 1280px;
          height: 1px;
          position:relative;top:10px;
          background-color: #3f3f45;
          margin: 0px 0px 40px;
        }

        .Chat-underline{
          width: 100%;
          position:relative;
          /*left:-140px;*/
          float:right;
          height: 1px;
          position:relative;top:10px;
          background-color: #3f3f45;
          margin: 0px 0px 40px;
        }

        .youtube-video{
        position: relative;
        }
        .transparent-layer{
          width: 850px;
          height: 477px;
          pointer-events: none;
          background-color: #ffffff;
        }

        .ad{
          width: 728px;
          height: 90px;
          border: 1px solid #000000;
          margin-left: 11px;
          margin-top: 20px;
        }

        .chat {
          position: relative;
          min-width: 400px;
          margin: 0px 0px 0px 112px;
        }
        .chat-messages,
        .chat-textarea,
        .chat-name {
          border: 1px solid #1a1a23;
          background-color: #1a1a23;
        }

        .userName{
          font-weight: 700;
          color: #079ce0;
        }

        .chat-messages {
          width:380px;
          height:586px;
          overflow-y:scroll;
          padding:10px;
        }

        .chat-message {
          margin-bottom:10px;
        }

        .info-rect{
          height: 40px;
          width: 180px;
          padding:10px;
          max-width: 100%;
          margin:0;
          border:0;
          display: flex; 
          align-items: center;
          justify-content: center;  
          font-weight: 700;
          text-transform: uppercase;
          background-color: #15151d
        }

        .chat-name{
          height: 40px;
          max-width: 100%;
          width: 180px;
          padding:10px;
          border:0;
          margin:0;
          font-weight: 700;
          text-transform: uppercase;
          float:left;
          text-align: center;
        }

        .chat textarea {
          width:380px;
          padding:10px;
          margin:0;
          border-top:0;
          max-width:100%;
          border-top: 1px solid #0f0f17;
          border-bottom: 1px solid #1a1a23;
          border-right: 1px solid #1a1a23;
          border-left: 1px solid #1a1a23;
          background-color: #1a1a23;

        }

        .chat-status {
          color: #bbb;
          opacity: 0;
          background-color: #0f0f17;
        }

        .info-rect,
        .chat textarea,
        .chat-name { 
          max-width: 100%; 
        }


        .bottom-bar{
          position: absolute;
          bottom: 0;  
            display:table;

        }

        .thumbnail{
          width: 90px;
          height: 80px;
          opacity: 0.2;
          background-color: #ffffff;
        }   

        .title-bar{
          width:1372px;
          height: 80px;
          background-color: #1a1a23;
        }
        .title{
          font-weight: 700;
          text-transform: uppercase;
          margin-left: 30px;
          margin-top: 25px;
        }
        .dj-playing{
          margin-left: 30px;
        }
        .progress-background{
          width: 1372px;
          height: 3px;
          background-color: #313139;
          position: fixed;
          bottom: 0;
        }
        .progress-bar{
          height: 3px;
          width: 0px;
          transition: all 300ms linear;
          background-color: #fa1d57;
          bottom: 0;
        }
        .subscribe{
          width: 458px;
          height: 80px;
          background-color: #15151d;
            display:table-cell;
        }
        .g-ytsubscribe{
            width: 450px;
            display: block;
            margin-left: auto;
            margin-right: auto;
        }

1 个答案:

答案 0 :(得分:0)

这次你必须在Youtube API 3中使用

你可以用js或Php。

来做到这一点

<强>腓

<?
    $api_key        = "AIzaSyDRfgPj9a2vnckVkSGoKktNfrozbMvjkdw";
    $play_list_id   = "PLcV3JzAz3r32-on4upkyAv0VtvYXAl-Nz";
    $url            = "https://www.googleapis.com/youtube/v3/playlists?part=snippet&id=" . $play_list_id;

    $ch         = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    $response_raw = curl_exec($ch);
    $response = json_decode($response_raw);

    echo "default image :" . $response->items[0]->snippet->thumbnails->default->url;
    echo "<br />\n<br />\n";
    echo "medium image :" . $response->items[0]->snippet->thumbnails->medium->url;
    echo "<br />\n<br />\n";
    echo "maxres image :" . $response->items[0]->snippet->thumbnails->maxres->url;
    echo "<br />\n<br />\n";
    echo print_r($response, 1);
?>

脚本中最重要的是带有查询参数的 url 。只需记住将 $ api_key $ play_list_id 替换为您自己的。

现在使用javascript,它几乎是一样的。

<强> JS

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script>
function make_request()
{
    var response        = "";
    var response1       = "";
    var api_key         = "AIzaSyBaS4_vwohJW7Ndb9EkjSqsoD75O4f4jXI";
    var play_list_id    = "PLcV3JzAz3r32-on4upkyAv0VtvYXAl-Nz";
    var url             = "https://www.googleapis.com/youtube/v3/playlists?part=snippet&id=" + play_list_id + "&key=" + api_key;

    $.ajax
    ({
        url: url,
        dataType: "json",
        type: "get",
        async: false,
        success: function(data)
        {
            response = JSON.stringify(data);
            response1 = data;
        }
    });
    alert(response1.items[0].snippet.thumbnails.default.url);
    console.log(response1.items[0].snippet.thumbnails.default.url);
    console.log(response);
}

function init()
{
    gapi.client.setApiKey("AIzaSyBaS4_vwohJW7Ndb9EkjSqsoD75O4f4jXI");
    gapi.client.load('youtube', 'v3').then(make_request);
}
</script>
<script src="https://apis.google.com/js/client.js?onload=init"></script>

看一看实际行动:

但请记住:当您使用Php执行此操作时,您必须创建一个Google服务器密钥。当你用js做的时候,你猜怎么着?您可以使用浏览器键执行此操作。但最重要的是,请记住在开发人员控制台中启用Youtube数据api 3!

参考获得一个KEY: https://developers.google.com/api-client-library/javascript/start/start-js#choose-google-services