В данной статье рассмотрим работу с API YouTube v.3, а именно инициализацию проигрывателя плейлиста и добавление кнопок для контроля воспроизведения.
Вот некоторые особенности данного примера:
- Плейлист формируется из фрагментов видео-роликов, то есть для каждого видео указаны время начала воспроизведения и его окончания;
- При управлении проигрывателем происходит изменение состояния кнопок управления, то есть если видео находится в статусе воспроизведения, то кнопка «Play» становится не активной и наоборот — когда воспроизведение приостановлено кнопка паузы так же становится не активной. Если проигрывается последнее видео в плейлисте — кнопка «Next» становится недоступной для нажатий.
Демонстрация:
Исходный код
Исходный код для блока с элементами воспроизведения (кнопки «Play», «Pause», «Next», «Previous»):
<div id="ytplayer"></div> <div class="buttons"> <div class="button" id="play-button"><img src="/wp-content/uploads/2019/11/play.png"/></div> <div class="button" id="pause-button"><img src="/wp-content/uploads/2019/11/pause.png"/></div> <div class="button" id="previous-button"><img src="/wp-content/uploads/2019/11/prev.png"/></div> <div class="button" id="next-button"><img src="/wp-content/uploads/2019/11/next.png"/></div> </div>
JavaScript с функциями плеера с комментариями:
<script> var tag = document.createElement('script'); tag.src = "https://www.youtube.com/player_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var i = 0; // Далее 3 массива: videoId_arr - массив с ID'шниками видео с YouTube. // Каждому элементу этого массива соответствуют элементы массивов startSeconds_arr и endSeconds_arr // в которых содержатся секунды начала и конца каждого ролика. // В данном примере используется один и тот же ID. var videoId_arr = ["Oz6AB_tWvaA", "Oz6AB_tWvaA", "Oz6AB_tWvaA", "Oz6AB_tWvaA"]; var startSeconds_arr = ["6", "24", "33", "40"]; var endSeconds_arr = ["16", "29", "37", "54"]; var player; // Подробнее о параметрах конфигурации плеера можно // узнать в документации https://developers.google.com/youtube/player_parameters#Parameters var playerConfig = { height: '360', width: '640', videoId: videoId_arr[i], playerVars: { autoplay: 1, controls: 0, modestbranding: 0, fs: 1, cc_load_policy: 0, iv_load_policy: 3, start: startSeconds_arr[i], end: endSeconds_arr[i], autohide: 0, }, events: { 'onStateChange': onStateChange, 'onReady': onPlayerReady } }; function onYouTubePlayerAPIReady() { player = new YT.Player('ytplayer', playerConfig); } function onPlayerReady(event) { // Далее код отвечающий за функционированиие // кнопок управления воспроизведением // Кнопка "Play" (Начать воспроизведение) var playButton = document.getElementById("play-button"); playButton.addEventListener("click", function() { player.playVideo(); }); // Кнопка "Pause" (Приостановить воспроизведение) var pauseButton = document.getElementById("pause-button"); pauseButton.addEventListener("click", function() { player.pauseVideo(); }); // Кнопка "Next" (Следующий фрагмент) var nextButton = document.getElementById("next-button"); nextButton.addEventListener("click", function() { player.seekTo(endSeconds_arr[i], true); }); // Кнопка "Previous" (Предыдущий фрагмент) var previousButton = document.getElementById("previous-button"); previousButton.addEventListener("click", function() { i = i-1; player.loadVideoById({ videoId: videoId_arr[i], startSeconds: startSeconds_arr[i], endSeconds: endSeconds_arr[i] }); }); } // Функция которая срабатывает при изменении статуса проигрывания function onStateChange(state) { var _video_url = state.target.getVideoUrl(); var _video_id = _video_url.split('v=')[1]; var _current_index = videoId_arr.indexOf(_video_id) +1; var _end_play_time = player.getCurrentTime(); if (state.data === YT.PlayerState.ENDED && _end_play_time >= endSeconds_arr[i]) { console.log('State: ', _video_id, _current_index, player.getCurrentTime(), startSeconds_arr[i], endSeconds_arr[i], (endSeconds_arr[i] - startSeconds_arr[i]), state ); i++; if (typeof videoId_arr[i] === 'undefined'){ i = 0; return; } player.loadVideoById({ videoId: videoId_arr[i], startSeconds: startSeconds_arr[i], endSeconds: endSeconds_arr[i] }); } else { console.log('State: ', _video_id, _current_index, state ); } // Далее код изменяющий состояние кнопок // например делает неактивной кнопку "Play" // если видео уже воспроизводится if (state.data === YT.PlayerState.PLAYING) { jQuery('#play-button').css('opacity', '0.4'); jQuery('#pause-button').css('opacity', '1.0'); } else { jQuery('#play-button').css('opacity', '1.0'); jQuery('#pause-button').css('opacity', '0.4'); } if (i === 0) { jQuery('#previous-button').css('opacity', '0.4'); jQuery('#previous-button').css('pointer-events', 'none'); } else { jQuery('#previous-button').css('opacity', '1.0'); jQuery('#previous-button').css('pointer-events', 'auto'); } if (typeof videoId_arr[i+1] === 'undefined' || i === 0 && state.data != YT.PlayerState.PLAYING) { jQuery('#next-button').css('opacity', '0.4'); jQuery('#next-button').css('pointer-events', 'none'); } else { jQuery('#next-button').css('opacity', '1.0'); jQuery('#next-button').css('pointer-events', 'auto'); } } </script>
Совсем чуть-чуть стилизуем блок с элементами:
<style> .buttons { display: flex; justify-content: center; } </style>