Делаем плеер с таймкодами на getcourse с помощью плагина Plyr и скриптов
Плеер с таймкодами делаем используя "Визуальный конструктор" геткурса т.е. можно разместить видео в уроках или на страницах.
- Визуальный конструктор геткурса(можно вставлять плеер на страницы и в уроки)
- Plyr плеер (Ссылка на документацию: https://github.com/sampotts/plyr )
- HTML(для вставки видео), CSS и JS(в геткурсе по умолчанию подключен JQuery)
Шаг 1. Подключаем Plyr
<!-- plyr 3.7.2 --> <link rel="stylesheet" href="https://cdn.plyr.io/3.7.2/plyr.css" /> <script src="https://cdn.plyr.io/3.7.2/plyr.polyfilled.js"></script>
Подключение Plyr на Getcourse страницу, варианты:
1. В поле страницы Теги в разделе HEAD
2. В HTML блок наверху страницы
Шаг 2. Вставляем видео в HTML
<video id="player" playsinline controls> <source src="https://fs.getcourse.ru/fileservice/file/download/a/581768/sc/356/h/ed8c52d4e70d8cc5da72ac875e88b65f.mp4" type="video/mp4" /> </video>
*где src="ССЫЛКА_НА_ВИДЕО_ИЗ_ГЕТКУРС_ХРАНИЛИЩА"
id="player" - player это идентификатор, по которому мы скриптом обращаемся к видео
Шаг 3. Вставляем JS-код
Для того, чтобы на данном этапе убедиться что мы все делаем правильно, вставляем в JS-блок код
const player = new Plyr('#player');
*Javascript-блок должен находиться ниже чем блок с видео
Если в нашем видео интерфейс плеера Plyr, значит мы подключили и инициализировали его правильно.
Очищаем JS поле, вместо него ставим
/* @name timecodesForPlyrOnGetcourse @author Maksim Kalmykov @version 1.0 */ $(function () { const timecodesArr = [ { time: "00:06", label: "Чебурашка начинает петь" }, { time: "00:25", label: "Чебурашка летит в пузыре" }, { time: "00:40", label: "Чебурашка крутит юлу" }, { time: "01:21", label: "Чебурашка и Гена играют в шахматы" } ]; initPlyr("#player", timecodesArr, ".timecodes-title"); }); function initPlyr(plyrVideoSelector, timecodesArr = [], timecodeTitleSelector = null) { const videoPlayer = document.querySelector(plyrVideoSelector); if (!videoPlayer) return; const timecodesTitle = document.querySelector(timecodeTitleSelector); const timecodesContent = document.createElement("div"); timecodesContent.className = "timecodes-ac-content"; timecodesArr.forEach(item => { timecodesContent.innerHTML += ` <p class="timecode_item"> <span class="item_time">${item.time}</span> <span class="item_desc">${item.label}</span> </p> `; }); const timecodesArrForPlyr = timecodesArr.reduce((acc, curr) => { curr.time = parseTimeInSeconds(curr.time); acc.push(curr); return acc; }, []); const player = new Plyr(videoPlayer, { markers: { enabled: true, points: timecodesArrForPlyr } }); timecodesContent.querySelectorAll(".timecode_item").forEach((timecode, i) => { timecode.addEventListener("click", function () { player.currentTime = timecodesArrForPlyr[i].time; }); }); if (timecodesTitle && timecodesArr.length) { timecodesTitle.append(timecodesContent); } if ($(timecodesTitle).hasClass("timecodes-ac-trigger")) { $(timecodesTitle).find(".f-header").on("click", function () { $(this).toggleClass("active"); $(this).next().slideToggle(); }); } } function parseTimeInSeconds(timeStr) { let s = 0; if (typeof timeStr !== "string") return s; const arrTime = timeStr.split(':'); if (arrTime.length === 2) { s = parseInt(arrTime[0]) * 60 + parseInt(arrTime[1]); } else if (arrTime.length === 3) { s = parseInt(arrTime[0]) * 60 * 60 + parseInt(arrTime[1]) * 60 + parseInt(arrTime[2]); } return s; }
P.S. Уже просматривая видео решил что лучше будет если порядок аргументов в функции будет такой:
initPlyr("#player", timecodesArr, ".timecodes-title");
(массив объектов таймкодов стал вторым а селектор заголовка 3-м)
timecodesArr - массив объектов, в котором через запятую прописаны свойства конкретного таймкода. В этом массиве мы ставим свои значения. Эти значения подтянутся скриптом в метки на видео и в html код внутри контейнера указанного заголовка таймкодов.
const timecodesArr = [ { time: "00:06", // Время таймкода label: "Чебурашка начинает петь" // Описаине таймкода } ];
initPlyr("#player", timecodesArr, ".timecodes-title");
initPlyr("*CЕЛЕКТОР_ЭЛЕМЕНТА_ВИДЕО*", *МАССИВ_ОБЪЕКТОВ_ТАЙМКОДОВ*, "*CЕЛЕКТОР_ЗАГОЛОВКА_ТАЙМКОДОВ*");
Шаг 4. Заголовок-контейнер для таймкодов на геткурс
В данном решении мы прописываем таймкоды в объекте timecodesArr, эти данные пойдут в настройки плеера, а также под них подготовится html-разметка.
Для того, чтобы вставить html-разметку таймкодов, нам нужно привязаться к какому либо контейнеру на странице. Этим контейнером будет блок геткурс с заголовком, скрипт найдет его по определенному классу(например timecodes-title)
Создаем заголовок на геткурс стандартным способом
Ставим блоку с заголовком класс - timecodes-title
Возле заголовка автоматически появилась разметка с таймкодами, и они даже работают при клике, но не хватает стилизации
Шаг 5. Добавляем стилизацию
/* Подключение шрифта Montserrat 400;700 */ @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap'); :root { /* Основной цвет плеера */ --plyr-color-main: #C96BFF; --fontTimecodes: "Montserrat", "proxima-nova", sans-serif; } .plyr__progress .plyr__tooltip { /* Ширина тултипов */ width: 160px; } .timecodes-title p, .timecode_item { font-family: var(--fontTimecodes); } .timecodes-title .f-header { font-size: 24px; padding-bottom: 15px; } .timecode_item { padding: 4px 0; font-size: 16px; display: flex; cursor: pointer; } .timecode_item span { display: inline-block; line-height: 1.2; } .timecode_item .item_time { margin-right: 8px; flex:0 0 50px; font-weight: 700; /* Цвет времени в таймкоде*/ color: #4848ee; transition: color .4s ease; } .timecode_item:hover .item_time { /* Цвет времени в таймкоде при наведении*/ color: var(--plyr-color-main); } @media (max-width: 375px) { .timecode_item { font-size: 14px; } } /* СТИЛИ АККОРДЕОНА */ .timecodes-ac-trigger { cursor: pointer; box-shadow: 0 4px 12px rgb(0 0 0 / 20%); border-radius: 4px; } .timecodes-ac-trigger .f-header { padding: 20px 16px 20px 70px; position: relative; user-select: none; } .timecodes-ac-trigger .f-header::before { content: ""; width: 40px; height: 40px; display: inline-block; position: absolute; left: 16px; top: 50%; transform: translateY(-50%); border-radius: 50px; /* Изображение стрелки */ background-image: url("https://fs.getcourse.ru/fileservice/file/download/a/581768/sc/243/h/5d184da29d96d2785c216cca452febb3.svg"); /* Цвет круглого фона стрелки */ background-color: #ffdda7; background-repeat: no-repeat; background-position: center; background-size: 20px; transition:filter .4s ease, transform .4s ease ; } .timecodes-ac-trigger .f-header.active::before { transform: translateY(-50%) rotate(180deg); } .timecodes-ac-trigger .f-header:hover::before { filter: brightness(105%); } .timecodes-ac-trigger .timecodes-ac-content { display: none; padding: 8px 16px 16px 16px; } @media (max-width: 375px) { .timecodes-ac-trigger .f-header { font-size: 18px; } .timecodes-ac-trigger .f-header::before { width: 32px; height: 32px; background-size: 16px; } .timecodes-ac-trigger .f-header { padding: 15px 15px 15px 60px; } } /* </ СТИЛИ АККОРДЕОНА */
Можно добавить в CSS-блок либо вставить и подключить через тему
На данный момент таймкоды и видео выглядят так
В скрипте и стилях предусмотрен вариант таймкодов в виде выпадающего списка
Чтобы инициализировать аккордеон добавляем класс timecodes-ac-trigger в классы заголовка
Как сделать несколько видео с таймкодами?
Самый простой способ - вызывать несколько функций инициализации плеера с уникальными параметрами
$(function () { const timecodesArr1 = [ { time: "00:06", label: "Чебурашка начинает петь" }, { time: "00:26", label: "Чебурашка летит в пузыре" }, { time: "00:40", label: "Чебурашка крутит юлу" }, { time: "01:22", label: "Чебурашка и Гена играют в шахматы" } ]; const timecodesArr2 = [ { time: "00:06", label: "2 Чебурашка начинает петь" }, { time: "00:26", label: "2 Чебурашка летит в пузыре" }, { time: "00:40", label: "2 Чебурашка крутит юлу" }, { time: "01:22", label: "2 Чебурашка и Гена играют в шахматы" } ]; initPlyr("#player", timecodesArr1, ".timecodes-title_1"); // player2 - id видео в html // timecodesArr2 - еще один массив с таймкодами // timecodes-title_2 - класс заголовка initPlyr("#player2", timecodesArr2, ".timecodes-title_2"); });
id видео ставится в html атрибуте - id
Уникальный класс для заголовка можно поставить в настройках заголовка
initPlyr("#player", timecodesArr1, ".timecodes-title_1");
Передавая параметры в функцию мы решаем, какая сущность к чему относится
т.е. #player - инициализируем тот плеер, которого id="player"
timecodesArr1 - берем именно этот массив таймкодов
".timecodes-title_1" - контейнером таймкодов будет заголовок с классом timecodes-title_1
Телеграм-канал: https://t.me/getcomponent
Youtube: https://www.youtube.com/channel/UCAVwlN_NSAEFR4mJRpzyvCg