Youtube Iframe Playlist Slider
Youtube Iframe Playlist Slider
by Nick Hulea
HTML
<script src="//www.youtube.com/player_api"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/jquery.slick/1.5.6/slick.css">
<script src="https://cdn.jsdelivr.net/jquery.slick/1.5.6/slick.min.js"></script>
<!--
<div class="video--flex-container">
<div class="video--flex-top">
<div class="player--wrapper sliderMain">
<div id="player"></div>
</div>
</div>
<div class="video--flex-bottom sliderSidebar">
<div id="images"></div>
</div>
</div>
-->
<div id="slideBox">
<div id="main-image" class="sliderMain">
<div class="player--wrapper">
<div id="player"></div>
</div>
</div>
<div id="images" class="sliderSidebar"></div>
</div>
CSS
.buttons {
position: relative;
margin: 0 auto 20px auto;
padding: 20px;
display: flex;
border-radius: 4px;
justify-content: space-evenly;
}
.button {
padding: 10px 20px;
font-weight: bold;
letter-spacing: 5px;
outline: none;
cursor: pointer;
color: white;
background-color: #7F8C8D;
border: none;
border-radius: 4px;
}
#play-button {
background-color: #2ECC71;
}
#play-button:hover {
background-color: #27AE60;
}
#pause-button {
background-color: #E67E22;
}
#pause-button:hover {
background-color: #D35400;
}
#stop-button {
background-color: #E74C3C;
}
#stop-button:hover {
background-color: #C0392B;
}
#pause-button,
#stop-button {
margin-left: 15px;
}
.player--wrapper {
position: relative;
padding-bottom: 56.25%;
/* 16:9 */
height: 0;
}
.player--wrapper iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
#images {}
.image-item {
margin-left: 10px;
margin-bottom: 10px;
cursor: pointer;
border: 2px solid transparent;
}
.image-item img {
width: 100%;
height: auto;
}
.image-item:hover {
border: 2px solid #2ECC71;
}
.image-item:active {
border: 2px solid red;
}
.image-item.active {
border: 2px solid dodgerblue;
position: relative;
}
.image-item.active::after {
content: "playing";
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.75);
color: #fff;
display: flex;
justify-content: center;
align-items: center;
}
.video--flex-container {
display: flex;
flex-direction: row;
width: 100%;
background-color: #222;
}
.video--flex-top {
flex: 3;
margin-right: 10px;
}
.video--flex-bottom {
flex: 1;
overflow-y: scroll;
height: 60vh;
}
#slideBox {
width: 100%;
overflow: hidden;
position: relative;
background-color: #54585A;
display: flex;
}
video {
background-color: black;
}
#slideBox .slick-vertical .slick-slide {
border: none;
}
.sliderSidebar {
...
JavaScript
var player, currentVideoId = 0;
var haveIDs = false;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
playerVars: {
controls: 1,
showinfo: 0,
rel: 0,
showsearch: 0,
iv_load_policy: 3,
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerReady(event) {
// event.target.loadPlaylist(['4Ivdp8kj_0U','4MJRS-cLozU']);
console.log(player);
event.target.cuePlaylist({
listType: 'playlist',
list: 'PLBs6_t5NjudQ4mYQGNbUVrH8Vef_QmkPg',
suggestedQuality: 'small',
autoplay: 1,
index: 0,
});
// bind events
/*var playButton = document.getElementById("play-button");
playButton.addEventListener("click", function() {
player.playVideo();
});
var pauseButton = document.getElementById("pause-button");
pauseButton.addEventListener("click", function() {
player.pauseVideo();
});
var stopButton = document.getElementById("stop-button");
stopButton.addEventListener("click", function() {
player.stopVideo();
});
var next = document.getElementById("next");
next.addEventListener("click", function() {
player.nextVideo();
});
var pre = document.getElementById("previous");
pre.addEventListener("click", function() {
player.previousVideo();
});
*/
/* player.loadPlaylist({
playlist: videoIDs
}); */
event.target.setLoop();
}
function playVideo(id) {
player.cueVideoById(id);
}
function onPlayerStateChange(event) {
console.log(event)
if (event.data == YT.PlayerState.CUED) {
if (!haveIDs) {
videoList = event.target.getPlaylist();
videoCount = videoList.length;
sendIds(videoList, player);
}
event.target.playVideo();
}
if (event.data == YT.PlayerState.ENDED) {
// player.nextVideo();
// currentVideoId++;
// if (currentVideoId < videoIDs.length) {
//...