/
alexxhub
/
playerjs
Обзор
Документация
Войти
/
alexxhub
/
playerjs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
patch
src/js/urlTime.js
146 строк
4 KB
apavlov3rednet
doca
02 фев 2026, 20:44
02 фев 2026, 20:44
1368ae9
Код
Авторство
О чём код?
// urlTime.js import { parseTimeFromParam } from "./format.js"; /** * @param player * @return void | Promise<void> - если нужно подождать загрузки видео */ export function applyStartTimeFromUrl(player) { const url = new URL(window.location.href); const tParam = url.searchParams.get("t"); const seconds = parseTimeFromParam(tParam); if (seconds == null) return; const setTime = () => { const target = Math.min(player.video.duration || seconds, seconds); player.video.currentTime = target; }; if (Number.isFinite(player.video.duration) && player.video.duration > 0) { setTime(); } else { player.video.addEventListener("loadedmetadata", () => setTime(), { once: true, }); } } /** * Биндинги * @param player * @return void | Promise<void> - если нужно подождать загрузки видео */ export function bindUrlTimeEvents(player) { player._updateUrlTime = _updateUrlTime.bind(player); player._getBaseUrl = _getBaseUrl.bind(player); player._getShareUrlWithTime = _getShareUrlWithTime.bind(player); player._getShareUrlWithoutTime = _getShareUrlWithoutTime.bind(player); player.getShareLinkWithCurrentTime = getShareLinkWithCurrentTime.bind(player); player.getShareLinkWithoutTime = getShareLinkWithoutTime.bind(player); if (!player.updateUrlByTime) return; player.video?.addEventListener("seeked", _onSeeked.bind(player)); player.video?.addEventListener("ended", _onEnded.bind(player)); } /** * Отписка от биндингов * @param _player - player * @return void | Promise<void> - если нужно подождать загрузки видео */ export function destroyUrlTimeEvents(_player) { // при желании можно сохранять ссылки на биндинги и отписываться от seeked/ended } /** * @internal * @private * @param event - seeked * @return void */ function _onSeeked() { this._updateUrlTime(this.video.currentTime); } /** * @internal * @private * @param event - ended * @return void */ function _onEnded() { this._updateUrlTime(this.video.currentTime); } /** * @internal * @param time - время * @private * @return void */ function _updateUrlTime(time) { if (!history.replaceState) return; const url = new URL(window.location.href); const seconds = Math.floor(time); if (seconds <= 0) { url.searchParams.delete("t"); } else { url.searchParams.set("t", String(seconds)); } history.replaceState(null, "", url.toString()); } /** * @internal * @returns {URL} - базовый урл * @private */ function _getBaseUrl() { const url = new URL(window.location.href); url.searchParams.delete("t"); return url; } /** * @internal * @param seconds - время в секундах * @returns {string} - урл с временем * @private */ function _getShareUrlWithTime(seconds) { const url = this._getBaseUrl(); const t = Math.floor(seconds); url.searchParams.set("t", String(t)); return url.toString(); } /** * @internal * @returns {string} - урл без времени * @private */ function _getShareUrlWithoutTime() { const url = this._getBaseUrl(); return url.toString(); } /** * @returns {string} - урл с временем * @returns {*} - если не удалось получить время */ function getShareLinkWithCurrentTime() { const seconds = this.video?.currentTime ?? 0; return this._getShareUrlWithTime(seconds); } /** * @returns {string} - урл без времени * @returns {*} */ function getShareLinkWithoutTime() { return this._getShareUrlWithoutTime(); }