【问题标题】:youtube api get current video titleyoutube api 获取当前视频标题
【发布时间】:2014-05-08 17:56:47
【问题描述】:

我有一个 chromeless Youtube iframe api 播放器,可以播放 Youtube 播放列表洗牌。 一切正常,但我想在 div 中显示当前播放视频的标题 在播放器下方,但我不知道如何做到这一点,任何帮助将不胜感激。

我尝试过 stackoverflow 中的其他示例,但它们是用于内嵌播放列表的,不切实际 对于一个包含 100 多个视频的 youtube 播放列表,并且我的脚本知识非常有限,无论如何我从来没有让它们工作 并且 google api 网站似乎没有涵盖我正在寻找的内容。 我尝试了获取标题的 jwplayer,但随机播放功能很差,并且一遍又一遍地播放相同的视频 有时又是一个视频多次。我找到了一个解决随机播放问题的脚本,但我失去了获取标题 功能。我决定坚持使用 youtube,并希望有人可以帮助我。

再次感谢您的帮助。 这就是我所拥有的

<!DOCTYPE html>
<html>
<body>

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

    <script>

    var tag = document.createElement('script');

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

    var player;
    function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', {
    height: '390',
    width: '640',
    playerVars : { 'rel' : 0,  'showinfo' :0, 'autoplay': 1, 'controls': 0 },
    events: {
    'onReady': onPlayerReady 
    }
    });
    }

    var getRandom = function(min, max) {
    return Math.random() * (max - min) + min;
    `enter code here`};


      var playRandomTrack = function() {
      num = getRandom(0, 99);
      player.playVideoAt(num);  
      };

  function onPlayerReady(event) {
  player.loadPlaylist({'listType': 'playlist', 'list': 'PLmc_AnfxCB6t6Lwwgx3x5OxfNOWwHluU-','index': '99','startSeconds': '0','suggestedQuality': 'hd720'});
  player.setShuffle({'shufflePlaylist' : 1});
  }

</script>

</body>
</html>

【问题讨论】:

    标签: javascript html youtube-api


    【解决方案1】:

    对于第一个视频,将其添加到 onPlayerReady():

    var intId = setInterval( function() {
        // Check if player is initialized and the video is loaded
        if ( player ) {
            // States: 1: playing, 2: paused, 5: stopped
            if ( [ 1, 2, 5 ].indexOf( player.getPlayerState() ) >= 0 ) {
                // Set the innerText of div with id="title" to player title
                document.getElementById( "title" ).innerText = player.getVideoData().title;
                clearInterval( intId );
            }
        }
    }, 100 );
    

    并将其添加到 playRandomTrack():

    // Delay the loop because otherwise player.getPlayerState() still returns 1 because the previous video is not unloaded yet
    setTimeout( function() {
        var intId = setInterval( function() {
            if ( [ 1, 2, 5 ].indexOf( player.getPlayerState() ) >= 0 ) {
                document.getElementById( "title" ).innerText = player.getVideoData().title;
                clearInterval( intId );
            }
        }, 100 );
    }, 100 );
    

    所以你的整个代码变成:

    <!DOCTYPE html>
    <html>
    <body>
    
        <div id="player"></div>
        <div id="title"></div>
        <script>
            var tag = document.createElement( 'script' );
    
            tag.src = "https://www.youtube.com/iframe_api";
            var firstScriptTag = document.getElementsByTagName( 'script' )[0];
            firstScriptTag.parentNode.insertBefore( tag, firstScriptTag );
    
            var player;
            function onYouTubeIframeAPIReady() {
                player = new YT.Player( 'player', {
                    height: '390',
                    width: '640',
                    playerVars: {
                        'rel': 0,
                        'showinfo': 0,
                        'autoplay': 1,
                        'controls': 0
                    },
                    events: {
                        'onReady': onPlayerReady
                    }
                } );
            }
    
            var getRandom = function( min, max ) {
                return Math.random() * ( max - min ) + min;
            };
    
            var playRandomTrack = function() {
                num = getRandom( 0, 99 );
                player.playVideoAt( num );
                setTimeout( function() {
                    var intId = setInterval( function() {
                        if ( [ 1, 2, 5 ].indexOf( player.getPlayerState() ) >= 0 ) {
                            document.getElementById( "title" ).innerText = player.getVideoData().title;
                            clearInterval( intId );
                        }
                    }, 100 );
                }, 100 );
            };
    
            function onPlayerReady( event ) {
                player.loadPlaylist( {
                    'listType': 'playlist',
                    'list': 'PLmc_AnfxCB6t6Lwwgx3x5OxfNOWwHluU-',
                    'index': '99',
                    'startSeconds': '0',
                    'suggestedQuality': 'hd720'
                } );
                player.setShuffle( {
                    'shufflePlaylist': 1
                } );
                var intId = setInterval( function() {
                    if ( player ) {
                        if ( [ 1, 2, 5 ].indexOf( player.getPlayerState() ) >= 0 ) {
                            document.getElementById( "title" ).innerText = player.getVideoData().title;
                            clearInterval( intId );
                        }
                    }
                }, 100 );
            }
        </script>
    
    </body>
    </html>
    

    【讨论】:

    • 干杯,完全符合我的要求。感谢您分享您的知识和您的快速响应。完整的示例再次感谢您。
    • player.getVideoData() 正是我所需要的。为什么没有记录? developers.google.com/youtube/js_api_reference
    • 我猜 getVideoData() 没有记录,因为人们不应该使用它。它已于 2017 年 11 月 13 日昨天被删除:/
    • 是的,我现在有一个损坏的网站,因为这个.....你现在如何获得标题?
    • getVideoData 似乎又出现了,但没有记录。
    【解决方案2】:

    我发现上面的实现对我不起作用,所以我想出了我自己的版本,我认为它更优雅。

    var tag = document.createElement( 'script' );
    tag.src = "https://www.youtube.com/iframe_api";
    
    var firstScriptTag = document.getElementsByTagName( 'script' )[0];
    firstScriptTag.parentNode.insertBefore( tag, firstScriptTag );
    
    
    var player;
    function onYouTubeIframeAPIReady() {
        player = new YT.Player( 'player', {
            height: '390',
            width: '640',
            playerVars: {
                'rel': 0,
                'showinfo': 0,
                'autoplay': 1,
                'loop': 1,
                'autohide': 1,
                'color': 'white',
                'theme': 'light',
                'controls': 1
            },
            events: {
                'onReady': onPlayerReady
            }
        } );
    }
    
    var num = (1 + Math.floor(Math.random() * 10));
    
    function onPlayerReady( event ) {
        /*player.addEventListener('onStateChange', function(e) {
            console.log('State is:', e.data);
        });*/
    
        player.addEventListener('onStateChange', 'onPlayerStateChange');
    
        player.loadPlaylist( {
            'listType': 'playlist',
            'list': 'PLbfrQv4OD4BDMDrxuFv3uxwZeOKzkTkut',
            'index': num,
            'startSeconds': '0',
            'suggestedQuality': 'hd720'
        } );
    
        player.setShuffle( {
            'shufflePlaylist': 1
        } );
    }
    
    function onPlayerStateChange( event ) {
        console.log(player.getPlayerState()) 
        if (player.getPlayerState() == 1) {
        document.getElementById( "title" ).innerText = player.getVideoData().title;
        }
    }
    

    【讨论】:

    • 我同意这比原始答案要好得多,并且带有一点样式看起来也非常好。感谢分享
    猜你喜欢
    • 2015-10-23
    • 2017-10-14
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2013-03-23
    • 2015-08-09
    相关资源
    最近更新 更多