feat: release v0.0.1
This commit is contained in:
52
dist/react/video-player/components/video-js/plugins/settings/index.d.ts
vendored
Normal file
52
dist/react/video-player/components/video-js/plugins/settings/index.d.ts
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
import Component from "video.js/dist/types/component";
|
||||
import Plugin from "video.js/dist/types/plugin";
|
||||
import "./settings.css";
|
||||
import { VideoJsPlayer } from "../../types";
|
||||
interface SettingsButtonOptions {
|
||||
}
|
||||
interface PlayerWithControlBar extends VideoJsPlayer {
|
||||
controlBar: Component;
|
||||
}
|
||||
declare const BasePlugin: typeof Plugin;
|
||||
declare class SettingsButton extends BasePlugin {
|
||||
private options;
|
||||
private mainMenu;
|
||||
private settingsButton;
|
||||
private buttonInstance;
|
||||
private backButton;
|
||||
private playbackRateButton;
|
||||
private qualityRateButton;
|
||||
private audioTracksButton;
|
||||
private textTracksButton;
|
||||
constructor(player: PlayerWithControlBar, options: SettingsButtonOptions);
|
||||
/**
|
||||
* Инициализация плагина: создание кнопки настроек и привязка событий
|
||||
*/
|
||||
private initialize;
|
||||
/**
|
||||
* Привязка событий плеера (например, для обновления меню)
|
||||
*/
|
||||
private bindPlayerEvents;
|
||||
/**
|
||||
* Создание кнопки настроек и определение пунктов меню.
|
||||
* Здесь создаются фабрики для формирования кнопок и устанавливается начальное меню.
|
||||
*/
|
||||
private createSettingsButton;
|
||||
/**
|
||||
* Обёртка для создания экземпляра пункта меню.
|
||||
*
|
||||
* @param item - объект настроек пункта меню
|
||||
* @returns экземпляр TachVideoMenuItem
|
||||
*/
|
||||
private getMenuItem;
|
||||
/**
|
||||
* Устанавливает (обновляет) пункты меню плагина.
|
||||
*
|
||||
* @param items - массив пунктов меню (если не передан, используются кнопки по умолчанию)
|
||||
* @param skipBackButton - если true, не добавлять кнопку "Назад"
|
||||
* @param forceShow - если true, принудительно показать меню после обновления
|
||||
*/
|
||||
private setMenu;
|
||||
}
|
||||
export default SettingsButton;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
1
dist/react/video-player/components/video-js/plugins/settings/index.d.ts.map
vendored
Normal file
1
dist/react/video-player/components/video-js/plugins/settings/index.d.ts.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/video-player/components/video-js/plugins/settings/index.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,+BAA+B,CAAC;AAEtD,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAYhD,OAAO,gBAAgB,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,UAAU,qBAAqB;CAE9B;AAGD,UAAU,oBAAqB,SAAQ,aAAa;IACnD,UAAU,EAAE,SAAS,CAAC;CACtB;AAED,QAAA,MAAM,UAAU,EAAmC,OAAO,MAAM,CAAC;AAKjE,cAAM,cAAe,SAAQ,UAAU;IACtC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAa;IAGnC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,gBAAgB,CAA6B;gBAEzC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,qBAAqB;IAMxE;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8D5B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;OAMG;YACW,OAAO;CA8CrB;AAID,eAAe,cAAc,CAAC"}
|
||||
141
dist/react/video-player/components/video-js/plugins/settings/index.js
vendored
Normal file
141
dist/react/video-player/components/video-js/plugins/settings/index.js
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
import videojs from "video.js";
|
||||
import TachVideoMenuButton from "../components/tach-video-menu-button";
|
||||
import TachVideoMenuItem from "../components/tach-video-menu-item";
|
||||
import audioTrackSelector from "./selectors/audio-track-selector";
|
||||
import playbackRateSelector from "./selectors/playback-rate-selector";
|
||||
import qualityRateSelector from "./selectors/quality-rate-selector";
|
||||
import textTracksSelector from "./selectors/text-track-selector";
|
||||
import "./settings.css";
|
||||
const BasePlugin = videojs.getPlugin("plugin");
|
||||
// Значения опций по умолчанию
|
||||
const defaults = {};
|
||||
class SettingsButton extends BasePlugin {
|
||||
constructor(player, options) {
|
||||
super(player);
|
||||
this.mainMenu = [];
|
||||
this.options = videojs.obj.merge(defaults, options);
|
||||
this.player.ready(() => this.initialize());
|
||||
}
|
||||
/**
|
||||
* Инициализация плагина: создание кнопки настроек и привязка событий
|
||||
*/
|
||||
initialize() {
|
||||
this.createSettingsButton();
|
||||
this.bindPlayerEvents();
|
||||
}
|
||||
/**
|
||||
* Привязка событий плеера (например, для обновления меню)
|
||||
*/
|
||||
bindPlayerEvents() {
|
||||
// При необходимости можно привязать событие, например:
|
||||
// this.settingsButton.on("click", this.setMenu.bind(this, undefined, false, true));
|
||||
}
|
||||
/**
|
||||
* Создание кнопки настроек и определение пунктов меню.
|
||||
* Здесь создаются фабрики для формирования кнопок и устанавливается начальное меню.
|
||||
*/
|
||||
createSettingsButton() {
|
||||
const player = this.player;
|
||||
// Создаем кнопку настроек с помощью компонента TachVideoMenuButton
|
||||
this.settingsButton = new TachVideoMenuButton(player, "Settings", "Settings");
|
||||
this.buttonInstance = player.controlBar.addChild(this.settingsButton, {
|
||||
componentClass: "settingsButton",
|
||||
});
|
||||
this.buttonInstance.addClass("vjs-settings-button");
|
||||
// Определяем кнопку "Назад" для возврата в главное меню
|
||||
this.backButton = {
|
||||
label: "Назад",
|
||||
value: this.mainMenu,
|
||||
selectable: false,
|
||||
selected: false,
|
||||
onClick: () => this.setMenu(undefined, true, true),
|
||||
className: "settings-back",
|
||||
};
|
||||
// Создаем фабрики для дополнительных настроек
|
||||
const { menuItem: audioMenuItem, menuItems: audioMenuItems } = audioTrackSelector(player);
|
||||
this.audioTracksButton = () => ({
|
||||
...audioMenuItem(),
|
||||
onClick: () => this.setMenu(audioMenuItems(), false, true),
|
||||
});
|
||||
const { menuItem: textMenuItem, menuItems: textMenuItems } = textTracksSelector(player);
|
||||
this.textTracksButton = () => ({
|
||||
...textMenuItem(),
|
||||
onClick: () => this.setMenu(textMenuItems(), false, true),
|
||||
});
|
||||
const { menuItem: playbackMenuItem, menuItems: playbackMenuItems } = playbackRateSelector(player);
|
||||
this.playbackRateButton = () => ({
|
||||
...playbackMenuItem(),
|
||||
onClick: () => this.setMenu(playbackMenuItems(), false, true),
|
||||
});
|
||||
// В createSettingsButton замени этот участок:
|
||||
const qualitySelector = qualityRateSelector(player);
|
||||
this.qualityRateButton = () => ({
|
||||
...qualitySelector.menuItem(), // пересоздание при каждом открытии меню
|
||||
onClick: () => this.setMenu(qualitySelector.menuItems(), false, true),
|
||||
});
|
||||
// Подписка на автообновление, когда hls переключает уровень
|
||||
qualitySelector.setMenuUpdateCallback(() => {
|
||||
this.setMenu(undefined, true); // Обновить главное меню без перезахода
|
||||
});
|
||||
// Инициализируем меню с кнопками по умолчанию без показа
|
||||
this.setMenu(undefined, true, false);
|
||||
}
|
||||
/**
|
||||
* Обёртка для создания экземпляра пункта меню.
|
||||
*
|
||||
* @param item - объект настроек пункта меню
|
||||
* @returns экземпляр TachVideoMenuItem
|
||||
*/
|
||||
getMenuItem(item) {
|
||||
return new TachVideoMenuItem(this.player, item, this.settingsButton, this);
|
||||
}
|
||||
/**
|
||||
* Устанавливает (обновляет) пункты меню плагина.
|
||||
*
|
||||
* @param items - массив пунктов меню (если не передан, используются кнопки по умолчанию)
|
||||
* @param skipBackButton - если true, не добавлять кнопку "Назад"
|
||||
* @param forceShow - если true, принудительно показать меню после обновления
|
||||
*/
|
||||
async setMenu(items = [], skipBackButton = false, forceShow = false) {
|
||||
const menuButtons = [];
|
||||
if (!skipBackButton) {
|
||||
menuButtons.push(this.backButton);
|
||||
}
|
||||
if (items?.length === 0) {
|
||||
// Если не переданы конкретные пункты меню – используем кнопки по умолчанию
|
||||
const defaultButtons = [
|
||||
this.playbackRateButton,
|
||||
this.qualityRateButton,
|
||||
this.textTracksButton,
|
||||
this.audioTracksButton,
|
||||
];
|
||||
defaultButtons.forEach(createButton => {
|
||||
const btn = createButton();
|
||||
if (btn.enabled) {
|
||||
menuButtons.push(btn);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
menuButtons.push(...items);
|
||||
}
|
||||
// Формируем список пунктов меню: вместо пересоздания меню, назначаем функцию,
|
||||
// возвращающую актуальный список пунктов, и вызываем метод обновления.
|
||||
this.settingsButton.createItems = () => menuButtons.map(item => this.getMenuItem(item));
|
||||
await this.settingsButton.update();
|
||||
// Если требуется принудительно показать меню, эмулируем клик по кнопке меню
|
||||
if (forceShow) {
|
||||
const menuElement = this.buttonInstance.el().querySelector(".vjs-menu");
|
||||
const menuButton = this.buttonInstance
|
||||
.el()
|
||||
.querySelector(".vjs-menu-button");
|
||||
if (menuElement && menuButton) {
|
||||
menuButton.click();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Регистрируем плагин в Video.js
|
||||
videojs.registerPlugin("settingsMenu", SettingsButton);
|
||||
export default SettingsButton;
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
dist/react/video-player/components/video-js/plugins/settings/index.js.map
vendored
Normal file
1
dist/react/video-player/components/video-js/plugins/settings/index.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/react/video-player/components/video-js/plugins/settings/index.ts"],"names":[],"mappings":"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"}
|
||||
@@ -0,0 +1,27 @@
|
||||
import Player from "video.js/dist/types/player";
|
||||
import { TachPlayerMenuItemOptions } from "../../../types";
|
||||
interface TrackMenuOptions extends TachPlayerMenuItemOptions {
|
||||
}
|
||||
declare const audioTrack: (player: Player, options?: TrackMenuOptions) => {
|
||||
menuItems: () => {
|
||||
label: string;
|
||||
value: number;
|
||||
selected: boolean;
|
||||
onClick: () => void;
|
||||
}[] | {
|
||||
label: string;
|
||||
value: string | undefined;
|
||||
selected: boolean;
|
||||
onClick: () => void;
|
||||
}[];
|
||||
menuItem: () => {
|
||||
value: string | null;
|
||||
enabled: boolean;
|
||||
label: string;
|
||||
selectable?: boolean;
|
||||
selected?: boolean;
|
||||
className?: string;
|
||||
};
|
||||
};
|
||||
export default audioTrack;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/audio-track-selector/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAS3D,UAAU,gBAAiB,SAAQ,yBAAyB;CAAG;AAe/D,QAAA,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,UAAS,gBAA2B;;;;;;;;;;;;;;;;;;;;CAmJvE,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
||||
125
dist/react/video-player/components/video-js/plugins/settings/selectors/audio-track-selector/index.js
vendored
Normal file
125
dist/react/video-player/components/video-js/plugins/settings/selectors/audio-track-selector/index.js
vendored
Normal file
@@ -0,0 +1,125 @@
|
||||
const defaults = {
|
||||
label: "Язык",
|
||||
selected: false,
|
||||
selectable: false,
|
||||
className: "audio-selector",
|
||||
};
|
||||
const audioTrack = (player, options = defaults) => {
|
||||
const playerWithTracks = player;
|
||||
const getNativeTrackList = () => {
|
||||
if (typeof playerWithTracks.audioTracks !== "function") {
|
||||
return undefined;
|
||||
}
|
||||
return playerWithTracks.audioTracks();
|
||||
};
|
||||
const getNativeTracks = () => {
|
||||
return getNativeTrackList()?.tracks_ ?? [];
|
||||
};
|
||||
const setNativeTrack = (track) => {
|
||||
const audioTracks = getNativeTracks();
|
||||
for (let i = 0; i < audioTracks.length; ++i) {
|
||||
audioTracks[i].enabled = audioTracks[i] === track;
|
||||
}
|
||||
};
|
||||
const getSelectedNativeTrack = () => {
|
||||
const audioTracks = getNativeTracks();
|
||||
for (let i = 0; i < audioTracks.length; ++i) {
|
||||
if (audioTracks[i].enabled === true) {
|
||||
return audioTracks[i];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
const getHlsInstance = () => playerWithTracks.hlsInstance ?? null;
|
||||
const getHlsTracks = () => {
|
||||
const hls = getHlsInstance();
|
||||
return hls?.audioTracks ?? [];
|
||||
};
|
||||
const setHlsTrack = (trackId) => {
|
||||
const hls = getHlsInstance();
|
||||
if (!hls)
|
||||
return;
|
||||
hls.audioTrack = trackId;
|
||||
};
|
||||
const getSelectedHlsTrack = () => {
|
||||
const hls = getHlsInstance();
|
||||
if (!hls)
|
||||
return null;
|
||||
const tracks = getHlsTracks();
|
||||
const currentId = hls.audioTrack;
|
||||
return tracks.find(track => track.id === currentId) ?? null;
|
||||
};
|
||||
const formatHlsTrackLabel = (track, index) => {
|
||||
if (track.name?.trim()) {
|
||||
return track.name.trim();
|
||||
}
|
||||
if (track.lang?.trim()) {
|
||||
return track.lang.trim().toUpperCase();
|
||||
}
|
||||
const fallbackIndex = typeof index === "number"
|
||||
? index + 1
|
||||
: typeof track.id === "number"
|
||||
? track.id + 1
|
||||
: 1;
|
||||
return `Дорожка ${fallbackIndex}`;
|
||||
};
|
||||
const buildHlsMenuItems = () => {
|
||||
const hls = getHlsInstance();
|
||||
const hlsTracks = getHlsTracks();
|
||||
if (!hls || hlsTracks.length === 0) {
|
||||
return [];
|
||||
}
|
||||
return hlsTracks.map((track, index) => ({
|
||||
label: formatHlsTrackLabel(track, index),
|
||||
value: track.id,
|
||||
selected: track.id === hls.audioTrack,
|
||||
onClick: () => setHlsTrack(track.id),
|
||||
}));
|
||||
};
|
||||
const hasAudioTracks = () => {
|
||||
if (getHlsTracks().length > 0) {
|
||||
return true;
|
||||
}
|
||||
return getNativeTracks().length > 0;
|
||||
};
|
||||
const menuItems = () => {
|
||||
const hlsTracks = buildHlsMenuItems();
|
||||
if (hlsTracks.length > 0) {
|
||||
return hlsTracks;
|
||||
}
|
||||
const nativeTracks = getNativeTracks();
|
||||
const trackItems = [];
|
||||
for (let i = 0; i < nativeTracks?.length; ++i) {
|
||||
const trackItem = {
|
||||
label: nativeTracks[i].label || "Default",
|
||||
value: nativeTracks[i].label,
|
||||
selected: nativeTracks[i].enabled,
|
||||
onClick: () => setNativeTrack(nativeTracks[i]),
|
||||
};
|
||||
trackItems.push(trackItem);
|
||||
}
|
||||
return trackItems;
|
||||
};
|
||||
const getSelectedTrackLabel = () => {
|
||||
const selectedHlsTrack = getSelectedHlsTrack();
|
||||
if (selectedHlsTrack) {
|
||||
const tracks = getHlsTracks();
|
||||
const index = tracks.findIndex(track => track.id === selectedHlsTrack.id);
|
||||
return formatHlsTrackLabel(selectedHlsTrack, index);
|
||||
}
|
||||
return getSelectedNativeTrack()?.label ?? null;
|
||||
};
|
||||
const menuItem = () => {
|
||||
return {
|
||||
...options,
|
||||
value: getSelectedTrackLabel(),
|
||||
enabled: hasAudioTracks(),
|
||||
};
|
||||
};
|
||||
return {
|
||||
menuItems,
|
||||
menuItem,
|
||||
};
|
||||
};
|
||||
export default audioTrack;
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/audio-track-selector/index.ts"],"names":[],"mappings":"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"}
|
||||
@@ -0,0 +1,30 @@
|
||||
import Player from "video.js/dist/types/player";
|
||||
import { TachPlayerMenuItemOptions } from "../../../types";
|
||||
interface SpeedMenuOptions extends TachPlayerMenuItemOptions {
|
||||
speeds: Array<{
|
||||
label: string;
|
||||
value: number;
|
||||
}>;
|
||||
}
|
||||
declare const playbackRate: (player: Player, options?: SpeedMenuOptions) => {
|
||||
menuItems: () => {
|
||||
label: string;
|
||||
selectable: boolean;
|
||||
selected: boolean;
|
||||
onClick: () => number | undefined;
|
||||
}[];
|
||||
menuItem: () => {
|
||||
enabled: boolean;
|
||||
speeds: Array<{
|
||||
label: string;
|
||||
value: number;
|
||||
}>;
|
||||
label: string;
|
||||
value?: any;
|
||||
selectable?: boolean;
|
||||
selected?: boolean;
|
||||
className?: string;
|
||||
};
|
||||
};
|
||||
export default playbackRate;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/playback-rate-selector/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAgB3D,UAAU,gBAAiB,SAAQ,yBAAyB;IAC3D,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,QAAA,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,UAAS,gBAA2B;;;;;;;;;gBAHjE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;;;;;;;CAwB/C,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
||||
@@ -0,0 +1,35 @@
|
||||
const defaults = {
|
||||
label: "Скорость воспроизведения",
|
||||
selected: false,
|
||||
selectable: false,
|
||||
speeds: [
|
||||
{ label: "0.5x", value: 0.5 },
|
||||
{ label: "Обычная", value: 1 },
|
||||
{ label: "1.5x", value: 1.5 },
|
||||
{ label: "1.75x", value: 1.75 },
|
||||
{ label: "2x", value: 2 },
|
||||
],
|
||||
className: "speed-selector",
|
||||
};
|
||||
const playbackRate = (player, options = defaults) => {
|
||||
const menuItems = () => options.speeds.map(speed => {
|
||||
return {
|
||||
label: speed.label,
|
||||
selectable: true,
|
||||
selected: speed.value === player.playbackRate(),
|
||||
onClick: () => player.playbackRate(speed.value),
|
||||
};
|
||||
});
|
||||
const menuItem = () => {
|
||||
return {
|
||||
...options,
|
||||
enabled: true,
|
||||
};
|
||||
};
|
||||
return {
|
||||
menuItems,
|
||||
menuItem,
|
||||
};
|
||||
};
|
||||
export default playbackRate;
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/playback-rate-selector/index.ts"],"names":[],"mappings":"AAIA,MAAM,QAAQ,GAAG;IAChB,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE;QACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;QAC7B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE;QAC9B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;QAC7B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;QAC/B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;KACzB;IACD,SAAS,EAAE,gBAAgB;CAC3B,CAAC;AAMF,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,UAA4B,QAAQ,EAAE,EAAE;IAC7E,MAAM,SAAS,GAAG,GAAG,EAAE,CACtB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC1B,OAAO;YACN,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,YAAY,EAAE;YAC/C,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;SAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,OAAO;YACN,GAAG,OAAO;YACV,OAAO,EAAE,IAAI;SACb,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACN,SAAS;QACT,QAAQ;KACR,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
||||
@@ -0,0 +1,39 @@
|
||||
import Player from "video.js/dist/types/player";
|
||||
import { TachPlayerMenuItemOptions } from "../../../types";
|
||||
interface QualityMenuOptions extends TachPlayerMenuItemOptions {
|
||||
}
|
||||
declare const qualityRate: (player: Player, options?: QualityMenuOptions) => {
|
||||
menuItems: () => {
|
||||
label: string;
|
||||
value: string;
|
||||
selected: boolean;
|
||||
onClick: () => void;
|
||||
}[];
|
||||
menuItem: () => {
|
||||
enabled: boolean;
|
||||
label: string;
|
||||
value?: any;
|
||||
selectable?: boolean;
|
||||
selected?: boolean;
|
||||
className?: string;
|
||||
};
|
||||
setMenuUpdateCallback: () => void;
|
||||
} | {
|
||||
menuItem: () => {
|
||||
enabled: boolean;
|
||||
label: string;
|
||||
value?: any;
|
||||
selectable?: boolean;
|
||||
selected?: boolean;
|
||||
className?: string;
|
||||
};
|
||||
menuItems: () => {
|
||||
label: string;
|
||||
value: number;
|
||||
selected: boolean;
|
||||
onClick: () => void;
|
||||
}[];
|
||||
setMenuUpdateCallback: (cb: () => void) => void;
|
||||
};
|
||||
export default qualityRate;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/quality-rate-selector/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAgB3D,UAAU,kBAAmB,SAAQ,yBAAyB;CAAG;AAEjE,QAAA,MAAM,WAAW,GAChB,QAAQ,MAAM,EACd,UAAS,kBAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAyHH,MAAM,IAAI;CAgB7C,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
||||
@@ -0,0 +1,125 @@
|
||||
import Hls from "hls.js";
|
||||
const defaults = {
|
||||
label: "Качество",
|
||||
selected: false,
|
||||
selectable: false,
|
||||
className: "quality-selector",
|
||||
};
|
||||
const qualityRate = (player, options = defaults) => {
|
||||
const hls = player.hlsInstance;
|
||||
let onMenuUpdate = null;
|
||||
if (!hls) {
|
||||
return {
|
||||
menuItems: () => [
|
||||
{ label: "Авто", value: "auto", selected: true, onClick: () => { } },
|
||||
],
|
||||
menuItem: () => ({ ...options, enabled: false }),
|
||||
setMenuUpdateCallback: () => { },
|
||||
};
|
||||
}
|
||||
// Инициализация состояния уровней качества
|
||||
let levels = [];
|
||||
let isMenuInitialized = false;
|
||||
const updateLevels = () => {
|
||||
if (hls.levels?.length > 0) {
|
||||
levels = hls.levels;
|
||||
if (!isMenuInitialized) {
|
||||
isMenuInitialized = true;
|
||||
}
|
||||
if (onMenuUpdate) {
|
||||
onMenuUpdate();
|
||||
}
|
||||
}
|
||||
};
|
||||
// Обновляем уровни при загрузке манифеста
|
||||
hls.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
updateLevels();
|
||||
});
|
||||
// Проверяем, есть ли уже доступные уровни
|
||||
if (hls.levels && hls.levels?.length > 0) {
|
||||
levels = hls.levels;
|
||||
}
|
||||
const getPixels = (l) => (l.width > l.height ? l.height : l.width);
|
||||
const formatBitrate = (bps) => (bps / 1000000).toFixed(1).replace(/\.0$/, "") + " Мбит";
|
||||
const getCurrentAutoLevel = () => {
|
||||
const current = levels[hls.currentLevel];
|
||||
return current ? `${getPixels(current)}p` : "";
|
||||
};
|
||||
const getCurrentManualLevel = () => {
|
||||
const manual = levels[hls.manualLevel];
|
||||
return manual
|
||||
? `${getPixels(manual)}p / ${formatBitrate(manual.bitrate)}`
|
||||
: "Качество";
|
||||
};
|
||||
const menuItem = () => {
|
||||
return {
|
||||
...options,
|
||||
enabled: levels?.length > 0,
|
||||
label: levels?.length === 0
|
||||
? "Качество"
|
||||
: levels?.length === 1
|
||||
? "Авто"
|
||||
: hls.autoLevelEnabled
|
||||
? `Авто (${getCurrentAutoLevel()})`
|
||||
: getCurrentManualLevel(),
|
||||
};
|
||||
};
|
||||
const setQuality = (quality) => {
|
||||
if (!levels?.length)
|
||||
return;
|
||||
if (quality === 'auto') {
|
||||
hls.currentLevel = -1;
|
||||
}
|
||||
else if (typeof quality === 'number') {
|
||||
hls.currentLevel = quality;
|
||||
}
|
||||
};
|
||||
const menuItems = () => {
|
||||
const isAuto = hls.autoLevelEnabled;
|
||||
// Если доступен только один уровень качества, показываем только "Авто"
|
||||
if (levels?.length <= 1) {
|
||||
return [{
|
||||
label: "Авто",
|
||||
value: -1,
|
||||
selected: true,
|
||||
onClick: () => setQuality('auto'),
|
||||
}];
|
||||
}
|
||||
const items = levels.map((level, index) => {
|
||||
const label = `${getPixels(level)}p / ${formatBitrate(level.bitrate)}`;
|
||||
const selected = !isAuto && hls.currentLevel === index;
|
||||
return {
|
||||
label,
|
||||
value: index,
|
||||
selected,
|
||||
onClick: () => setQuality(index),
|
||||
};
|
||||
});
|
||||
items.sort((a, b) => b.value - a.value);
|
||||
// Добавляем "Авто" с информацией о текущем качестве только если есть выбор
|
||||
items.push({
|
||||
label: isAuto ? `Авто (${getCurrentAutoLevel()})` : "Авто",
|
||||
value: -1,
|
||||
selected: isAuto,
|
||||
onClick: () => setQuality('auto'),
|
||||
});
|
||||
return items;
|
||||
};
|
||||
// Позволяет установить внешний колбэк на обновление меню
|
||||
const setMenuUpdateCallback = (cb) => {
|
||||
onMenuUpdate = cb;
|
||||
// Если уже есть уровни качества, сразу обновляем меню
|
||||
if (levels?.length > 0) {
|
||||
requestAnimationFrame(() => cb());
|
||||
}
|
||||
};
|
||||
// Подписка на смену уровня (в т.ч. в авто режиме)
|
||||
hls.on(Hls.Events.LEVEL_SWITCHED, () => {
|
||||
if (onMenuUpdate) {
|
||||
onMenuUpdate(); // триггерим обновление главного меню
|
||||
}
|
||||
});
|
||||
return { menuItem, menuItems, setMenuUpdateCallback };
|
||||
};
|
||||
export default qualityRate;
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/quality-rate-selector/index.ts"],"names":[],"mappings":"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"}
|
||||
@@ -0,0 +1,22 @@
|
||||
import { VideoJsPlayer } from "../../../../types";
|
||||
import { TachPlayerMenuItemOptions } from "../../../types";
|
||||
interface QualityMenuOptions extends TachPlayerMenuItemOptions {
|
||||
}
|
||||
declare const textTracks: (player: VideoJsPlayer, options?: QualityMenuOptions) => {
|
||||
menuItems: () => {
|
||||
label: any;
|
||||
value: any;
|
||||
selected: boolean;
|
||||
onClick: () => void;
|
||||
}[];
|
||||
menuItem: () => {
|
||||
enabled: boolean;
|
||||
label: string;
|
||||
value?: any;
|
||||
selectable?: boolean;
|
||||
selected?: boolean;
|
||||
className?: string;
|
||||
};
|
||||
};
|
||||
export default textTracks;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/text-track-selector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAS3D,UAAU,kBAAmB,SAAQ,yBAAyB;CAAG;AAEjE,QAAA,MAAM,UAAU,GACf,QAAQ,aAAa,EACrB,UAAS,kBAA6B;;;;;;;;;;;;;;;CAgDtC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
||||
@@ -0,0 +1,49 @@
|
||||
const defaults = {
|
||||
label: "Субтитры",
|
||||
selected: false,
|
||||
selectable: false,
|
||||
className: "subs-selector",
|
||||
};
|
||||
const textTracks = (player, options = defaults) => {
|
||||
const menuItems = () => {
|
||||
const textTracks = player.textTracks().tracks_;
|
||||
const trackItems = [];
|
||||
for (let i = 0; i < textTracks?.length; ++i) {
|
||||
if (textTracks[i].mode === "hidden") {
|
||||
continue;
|
||||
}
|
||||
const trackItem = {
|
||||
label: textTracks[i].label,
|
||||
value: textTracks[i].label,
|
||||
selected: textTracks[i].mode === "showing",
|
||||
onClick: () => setTrack(textTracks[i]),
|
||||
};
|
||||
trackItems.push(trackItem);
|
||||
}
|
||||
return trackItems;
|
||||
};
|
||||
const setTrack = (track) => {
|
||||
const textTracks = player.textTracks().tracks_;
|
||||
for (let i = 0; i < textTracks?.length; ++i) {
|
||||
if (textTracks[i].mode === "hidden") {
|
||||
continue;
|
||||
}
|
||||
if (textTracks[i].label === track.label)
|
||||
textTracks[i].mode = "showing";
|
||||
else
|
||||
textTracks[i].mode = "disabled";
|
||||
}
|
||||
};
|
||||
const menuItem = () => {
|
||||
return {
|
||||
...options,
|
||||
enabled: menuItems().length > 0,
|
||||
};
|
||||
};
|
||||
return {
|
||||
menuItems,
|
||||
menuItem,
|
||||
};
|
||||
};
|
||||
export default textTracks;
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../src/react/video-player/components/video-js/plugins/settings/selectors/text-track-selector/index.ts"],"names":[],"mappings":"AAGA,MAAM,QAAQ,GAAG;IAChB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,eAAe;CAC1B,CAAC;AAIF,MAAM,UAAU,GAAG,CAClB,MAAqB,EACrB,UAA8B,QAAQ,EACrC,EAAE;IACH,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;QAC/C,MAAM,UAAU,GAAG,EAAE,CAAC;QAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YAED,MAAM,SAAS,GAAG;gBACjB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC1B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC1B,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;gBAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACtC,CAAC;YAEF,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAE,EAAE;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YAED,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;gBAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC;;gBACnE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC;QACtC,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,OAAO;YACN,GAAG,OAAO;YACV,OAAO,EAAE,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC;SAC/B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACN,SAAS;QACT,QAAQ;KACR,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
||||
93
dist/react/video-player/components/video-js/plugins/settings/settings.css
vendored
Normal file
93
dist/react/video-player/components/video-js/plugins/settings/settings.css
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
.video-js {
|
||||
.vjs-control-bar {
|
||||
.vjs-settings-button {
|
||||
.vjs-menu {
|
||||
z-index: 10 !important;
|
||||
&.vjs-lock-showing {
|
||||
width: 100%;
|
||||
|
||||
.vjs-menu-content {
|
||||
height: fit-content;
|
||||
bottom: 3em;
|
||||
width: 340px;
|
||||
left: -220px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.vjs-mobile-ui {
|
||||
.vjs-control-bar {
|
||||
.vjs-settings-button {
|
||||
.vjs-menu {
|
||||
&.vjs-lock-showing {
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
|
||||
.vjs-menu-content {
|
||||
border-radius: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
padding-top: 50vh;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
padding-bottom: 5px;
|
||||
max-height: 100vh;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
/* top: 85%;
|
||||
left: 50%; */
|
||||
/* transform: translate(-50%, -85%); */
|
||||
|
||||
background: rgba(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.5
|
||||
); /* затемнение в области паддингов */
|
||||
|
||||
&:hover {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 50vh;
|
||||
left: 20px;
|
||||
right: 20px;
|
||||
bottom: 5px;
|
||||
background: var(--Default-BgDarken);
|
||||
border-radius: 10px; /* желаемый border-radius */
|
||||
}
|
||||
|
||||
.vjs-menu-item {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
border-radius: 0;
|
||||
|
||||
&:hover {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (orientation: landscape) {
|
||||
padding-top: 20px;
|
||||
padding-left: 25vw;
|
||||
padding-right: 25vw;
|
||||
|
||||
&::before {
|
||||
top: 20px;
|
||||
left: 25vw;
|
||||
right: 25vw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user