feat: add video widget (#287)
* feat: add nestjs replacement, remove nestjs * feat: add video widget * feat: add notice about youtube not supported with video.js * fix: format issue * fix: format issue
This commit is contained in:
@@ -98,7 +98,7 @@ const BoardItem = ({ item, ...dimensions }: ItemProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ItemMenu offset={8} item={newItem} />
|
<ItemMenu offset={4} item={newItem} />
|
||||||
<Comp
|
<Comp
|
||||||
options={options as never}
|
options={options as never}
|
||||||
integrations={item.integrations}
|
integrations={item.integrations}
|
||||||
@@ -155,6 +155,7 @@ const ItemMenu = ({ offset, item }: { offset: number; item: Item }) => {
|
|||||||
pos="absolute"
|
pos="absolute"
|
||||||
top={offset}
|
top={offset}
|
||||||
right={offset}
|
right={offset}
|
||||||
|
style={{ zIndex: 1 }}
|
||||||
>
|
>
|
||||||
<IconDotsVertical />
|
<IconDotsVertical />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
export const widgetKinds = ["clock", "weather", "app"] as const;
|
export const widgetKinds = ["clock", "weather", "app", "video"] as const;
|
||||||
export type WidgetKind = (typeof widgetKinds)[number];
|
export type WidgetKind = (typeof widgetKinds)[number];
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ export default {
|
|||||||
confirm: "Confirm",
|
confirm: "Confirm",
|
||||||
previous: "Previous",
|
previous: "Previous",
|
||||||
next: "Next",
|
next: "Next",
|
||||||
|
checkoutDocs: "Check out the documentation",
|
||||||
},
|
},
|
||||||
multiSelect: {
|
multiSelect: {
|
||||||
placeholder: "Pick one or more values",
|
placeholder: "Pick one or more values",
|
||||||
@@ -435,6 +436,30 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
video: {
|
||||||
|
name: "Video Stream",
|
||||||
|
description: "Embed a video stream or video from a camera or a website",
|
||||||
|
option: {
|
||||||
|
feedUrl: {
|
||||||
|
label: "Feed URL",
|
||||||
|
},
|
||||||
|
hasAutoPlay: {
|
||||||
|
label: "Autoplay",
|
||||||
|
description:
|
||||||
|
"Autoplay only works when muted because of browser restrictions",
|
||||||
|
},
|
||||||
|
isMuted: {
|
||||||
|
label: "Muted",
|
||||||
|
},
|
||||||
|
hasControls: {
|
||||||
|
label: "Show controls",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
error: {
|
||||||
|
noUrl: "No Video URL provided",
|
||||||
|
forYoutubeUseIframe: "For YouTube videos use the iframe option",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
widgetPreview: {
|
widgetPreview: {
|
||||||
toggle: {
|
toggle: {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||||
|
"@types/video.js": "^7.3.57",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"typescript": "^5.4.5"
|
"typescript": "^5.4.5"
|
||||||
},
|
},
|
||||||
@@ -43,6 +44,7 @@
|
|||||||
"@homarr/redis": "workspace:^0.1.0",
|
"@homarr/redis": "workspace:^0.1.0",
|
||||||
"@homarr/translation": "workspace:^0.1.0",
|
"@homarr/translation": "workspace:^0.1.0",
|
||||||
"@homarr/ui": "workspace:^0.1.0",
|
"@homarr/ui": "workspace:^0.1.0",
|
||||||
"@homarr/validation": "workspace:^0.1.0"
|
"@homarr/validation": "workspace:^0.1.0",
|
||||||
|
"video.js": "^8.10.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import * as app from "./app";
|
|||||||
import * as clock from "./clock";
|
import * as clock from "./clock";
|
||||||
import type { WidgetComponentProps } from "./definition";
|
import type { WidgetComponentProps } from "./definition";
|
||||||
import type { WidgetImportRecord } from "./import";
|
import type { WidgetImportRecord } from "./import";
|
||||||
|
import * as video from "./video";
|
||||||
import * as weather from "./weather";
|
import * as weather from "./weather";
|
||||||
|
|
||||||
export { reduceWidgetOptionsWithDefaultValues } from "./options";
|
export { reduceWidgetOptionsWithDefaultValues } from "./options";
|
||||||
@@ -21,6 +22,7 @@ export const widgetImports = {
|
|||||||
clock,
|
clock,
|
||||||
weather,
|
weather,
|
||||||
app,
|
app,
|
||||||
|
video,
|
||||||
} satisfies WidgetImportRecord;
|
} satisfies WidgetImportRecord;
|
||||||
|
|
||||||
export type WidgetImports = typeof widgetImports;
|
export type WidgetImports = typeof widgetImports;
|
||||||
|
|||||||
6
packages/widgets/src/video/component.module.css
Normal file
6
packages/widgets/src/video/component.module.css
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
.video {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: var(--mantine-radius-md);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
98
packages/widgets/src/video/component.tsx
Normal file
98
packages/widgets/src/video/component.tsx
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useEffect, useRef } from "react";
|
||||||
|
import combineClasses from "clsx";
|
||||||
|
import videojs from "video.js";
|
||||||
|
|
||||||
|
import { useI18n } from "@homarr/translation/client";
|
||||||
|
import {
|
||||||
|
Anchor,
|
||||||
|
Center,
|
||||||
|
Group,
|
||||||
|
IconBrandYoutube,
|
||||||
|
IconDeviceCctvOff,
|
||||||
|
Stack,
|
||||||
|
Title,
|
||||||
|
} from "@homarr/ui";
|
||||||
|
|
||||||
|
import type { WidgetComponentProps } from "../definition";
|
||||||
|
import classes from "./component.module.css";
|
||||||
|
|
||||||
|
import "video.js/dist/video-js.css";
|
||||||
|
|
||||||
|
export default function VideoWidget({
|
||||||
|
options,
|
||||||
|
}: WidgetComponentProps<"video">) {
|
||||||
|
if (options.feedUrl.trim() === "") {
|
||||||
|
return <NoUrl />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.feedUrl.trim().startsWith("https://www.youtube.com/watch")) {
|
||||||
|
return <ForYoutubeUseIframe />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Feed options={options} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NoUrl = () => {
|
||||||
|
const t = useI18n();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Center h="100%">
|
||||||
|
<Stack align="center">
|
||||||
|
<IconDeviceCctvOff />
|
||||||
|
<Title order={4}>{t("widget.video.error.noUrl")}</Title>
|
||||||
|
</Stack>
|
||||||
|
</Center>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ForYoutubeUseIframe = () => {
|
||||||
|
const t = useI18n();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Center h="100%">
|
||||||
|
<Stack align="center" gap="xs">
|
||||||
|
<IconBrandYoutube />
|
||||||
|
<Title order={4}>{t("widget.video.error.forYoutubeUseIframe")}</Title>
|
||||||
|
<Anchor href="https://homarr.dev/docs/widgets/iframe/">
|
||||||
|
{t("common.action.checkoutDocs")}
|
||||||
|
</Anchor>
|
||||||
|
</Stack>
|
||||||
|
</Center>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const Feed = ({ options }: Pick<WidgetComponentProps<"video">, "options">) => {
|
||||||
|
const videoRef = useRef<HTMLVideoElement>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!videoRef.current) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize Video.js player if it's not already initialized
|
||||||
|
if (!("player" in videoRef.current)) {
|
||||||
|
videojs(
|
||||||
|
videoRef.current,
|
||||||
|
{
|
||||||
|
autoplay: options.hasAutoPlay,
|
||||||
|
muted: options.isMuted,
|
||||||
|
controls: options.hasControls,
|
||||||
|
},
|
||||||
|
() => undefined,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, [videoRef]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Group justify="center" w="100%" h="100%" pos="relative">
|
||||||
|
<video
|
||||||
|
className={combineClasses("video-js", classes.video)}
|
||||||
|
ref={videoRef}
|
||||||
|
>
|
||||||
|
<source src={options.feedUrl} />
|
||||||
|
</video>
|
||||||
|
</Group>
|
||||||
|
);
|
||||||
|
};
|
||||||
20
packages/widgets/src/video/index.ts
Normal file
20
packages/widgets/src/video/index.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { IconDeviceCctv } from "@homarr/ui";
|
||||||
|
|
||||||
|
import { createWidgetDefinition } from "../definition";
|
||||||
|
import { optionsBuilder } from "../options";
|
||||||
|
|
||||||
|
export const { definition, componentLoader } = createWidgetDefinition("video", {
|
||||||
|
icon: IconDeviceCctv,
|
||||||
|
options: optionsBuilder.from((factory) => ({
|
||||||
|
feedUrl: factory.text({
|
||||||
|
defaultValue: "",
|
||||||
|
}),
|
||||||
|
hasAutoPlay: factory.switch({
|
||||||
|
withDescription: true,
|
||||||
|
}),
|
||||||
|
isMuted: factory.switch({
|
||||||
|
defaultValue: true,
|
||||||
|
}),
|
||||||
|
hasControls: factory.switch(),
|
||||||
|
})),
|
||||||
|
}).withDynamicImport(() => import("./component"));
|
||||||
198
pnpm-lock.yaml
generated
198
pnpm-lock.yaml
generated
@@ -816,6 +816,9 @@ importers:
|
|||||||
'@homarr/validation':
|
'@homarr/validation':
|
||||||
specifier: workspace:^0.1.0
|
specifier: workspace:^0.1.0
|
||||||
version: link:../validation
|
version: link:../validation
|
||||||
|
video.js:
|
||||||
|
specifier: ^8.10.0
|
||||||
|
version: 8.10.0
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@homarr/eslint-config':
|
'@homarr/eslint-config':
|
||||||
specifier: workspace:^0.2.0
|
specifier: workspace:^0.2.0
|
||||||
@@ -826,6 +829,9 @@ importers:
|
|||||||
'@homarr/tsconfig':
|
'@homarr/tsconfig':
|
||||||
specifier: workspace:^0.1.0
|
specifier: workspace:^0.1.0
|
||||||
version: link:../../tooling/typescript
|
version: link:../../tooling/typescript
|
||||||
|
'@types/video.js':
|
||||||
|
specifier: ^7.3.57
|
||||||
|
version: 7.3.57
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^8.57.0
|
specifier: ^8.57.0
|
||||||
version: 8.57.0
|
version: 8.57.0
|
||||||
@@ -3253,6 +3259,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
|
resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@types/video.js@7.3.57:
|
||||||
|
resolution: {integrity: sha512-CKAaJ9p/myadqT/FAnlzVvHMVj35ynl86eGgqPM9paTCWbFtq9JUZATUzOir+bLjRyXqrjA10e5KgHc7dRR38g==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/ws@8.5.10:
|
/@types/ws@8.5.10:
|
||||||
resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
|
resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3394,6 +3404,48 @@ packages:
|
|||||||
/@ungap/structured-clone@1.2.0:
|
/@ungap/structured-clone@1.2.0:
|
||||||
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
|
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
|
||||||
|
|
||||||
|
/@videojs/http-streaming@3.10.0(video.js@8.10.0):
|
||||||
|
resolution: {integrity: sha512-Lf1rmhTalV4Gw0bJqHmH4lfk/FlepUDs9smuMtorblAYnqDlE2tbUOb7sBXVYoXGdbWbdTW8jH2cnS+6HWYJ4Q==}
|
||||||
|
engines: {node: '>=8', npm: '>=5'}
|
||||||
|
peerDependencies:
|
||||||
|
video.js: ^7 || ^8
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
'@videojs/vhs-utils': 4.0.0
|
||||||
|
aes-decrypter: 4.0.1
|
||||||
|
global: 4.4.0
|
||||||
|
m3u8-parser: 7.1.0
|
||||||
|
mpd-parser: 1.3.0
|
||||||
|
mux.js: 7.0.2
|
||||||
|
video.js: 8.10.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@videojs/vhs-utils@3.0.5:
|
||||||
|
resolution: {integrity: sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==}
|
||||||
|
engines: {node: '>=8', npm: '>=5'}
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
global: 4.4.0
|
||||||
|
url-toolkit: 2.2.5
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@videojs/vhs-utils@4.0.0:
|
||||||
|
resolution: {integrity: sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==}
|
||||||
|
engines: {node: '>=8', npm: '>=5'}
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
global: 4.4.0
|
||||||
|
url-toolkit: 2.2.5
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@videojs/xhr@2.6.0:
|
||||||
|
resolution: {integrity: sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==}
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
global: 4.4.0
|
||||||
|
is-function: 1.0.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@vitejs/plugin-react@4.2.1(vite@5.2.6):
|
/@vitejs/plugin-react@4.2.1(vite@5.2.6):
|
||||||
resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==}
|
resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
@@ -3487,6 +3539,11 @@ packages:
|
|||||||
pretty-format: 29.7.0
|
pretty-format: 29.7.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@xmldom/xmldom@0.8.10:
|
||||||
|
resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
|
||||||
|
engines: {node: '>=10.0.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@xterm/addon-canvas@0.7.0(@xterm/xterm@5.5.0):
|
/@xterm/addon-canvas@0.7.0(@xterm/xterm@5.5.0):
|
||||||
resolution: {integrity: sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==}
|
resolution: {integrity: sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -3528,6 +3585,15 @@ packages:
|
|||||||
engines: {node: '>=0.4.0'}
|
engines: {node: '>=0.4.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
/aes-decrypter@4.0.1:
|
||||||
|
resolution: {integrity: sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==}
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
'@videojs/vhs-utils': 3.0.5
|
||||||
|
global: 4.4.0
|
||||||
|
pkcs7: 1.0.4
|
||||||
|
dev: false
|
||||||
|
|
||||||
/agent-base@6.0.2:
|
/agent-base@6.0.2:
|
||||||
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
||||||
engines: {node: '>= 6.0.0'}
|
engines: {node: '>= 6.0.0'}
|
||||||
@@ -4465,6 +4531,10 @@ packages:
|
|||||||
csstype: 3.1.3
|
csstype: 3.1.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/dom-walk@0.1.2:
|
||||||
|
resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/dot-case@2.1.1:
|
/dot-case@2.1.1:
|
||||||
resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==}
|
resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -5518,6 +5588,13 @@ packages:
|
|||||||
once: 1.4.0
|
once: 1.4.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/global@4.4.0:
|
||||||
|
resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
|
||||||
|
dependencies:
|
||||||
|
min-document: 2.19.0
|
||||||
|
process: 0.11.10
|
||||||
|
dev: false
|
||||||
|
|
||||||
/globals@11.12.0:
|
/globals@11.12.0:
|
||||||
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
|
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
@@ -5752,6 +5829,10 @@ packages:
|
|||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/individual@2.0.0:
|
||||||
|
resolution: {integrity: sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/inflight@1.0.6:
|
/inflight@1.0.6:
|
||||||
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
|
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -5926,6 +6007,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
/is-function@1.0.2:
|
||||||
|
resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/is-generator-function@1.0.10:
|
/is-generator-function@1.0.10:
|
||||||
resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
|
resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -6278,6 +6363,10 @@ packages:
|
|||||||
object.values: 1.1.7
|
object.values: 1.1.7
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/keycode@2.2.0:
|
||||||
|
resolution: {integrity: sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/keygrip@1.1.0:
|
/keygrip@1.1.0:
|
||||||
resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==}
|
resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
@@ -6448,6 +6537,14 @@ packages:
|
|||||||
es5-ext: 0.10.62
|
es5-ext: 0.10.62
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/m3u8-parser@7.1.0:
|
||||||
|
resolution: {integrity: sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==}
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
'@videojs/vhs-utils': 3.0.5
|
||||||
|
global: 4.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/magic-string@0.30.7:
|
/magic-string@0.30.7:
|
||||||
resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==}
|
resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@@ -6577,6 +6674,12 @@ packages:
|
|||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/min-document@2.19.0:
|
||||||
|
resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
|
||||||
|
dependencies:
|
||||||
|
dom-walk: 0.1.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
/minimatch@3.1.2:
|
/minimatch@3.1.2:
|
||||||
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -6656,6 +6759,16 @@ packages:
|
|||||||
ufo: 1.4.0
|
ufo: 1.4.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/mpd-parser@1.3.0:
|
||||||
|
resolution: {integrity: sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
'@videojs/vhs-utils': 4.0.0
|
||||||
|
'@xmldom/xmldom': 0.8.10
|
||||||
|
global: 4.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/mrmime@2.0.0:
|
/mrmime@2.0.0:
|
||||||
resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
|
resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -6672,6 +6785,24 @@ packages:
|
|||||||
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
|
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/mux.js@7.0.2:
|
||||||
|
resolution: {integrity: sha512-CM6+QuyDbc0qW1OfEjkd2+jVKzTXF+z5VOKH0eZxtZtnrG/ilkW/U7l7IXGtBNLASF9sKZMcK1u669cq50Qq0A==}
|
||||||
|
engines: {node: '>=8', npm: '>=5'}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
global: 4.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/mux.js@7.0.3:
|
||||||
|
resolution: {integrity: sha512-gzlzJVEGFYPtl2vvEiJneSWAWD4nfYRHD5XgxmB2gWvXraMPOYk+sxfvexmNfjQUFpmk6hwLR5C6iSFmuwCHdQ==}
|
||||||
|
engines: {node: '>=8', npm: '>=5'}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
global: 4.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/mysql2@3.9.2:
|
/mysql2@3.9.2:
|
||||||
resolution: {integrity: sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==}
|
resolution: {integrity: sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==}
|
||||||
engines: {node: '>= 8.0'}
|
engines: {node: '>= 8.0'}
|
||||||
@@ -7170,6 +7301,13 @@ packages:
|
|||||||
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
|
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
|
||||||
engines: {node: '>=8.6'}
|
engines: {node: '>=8.6'}
|
||||||
|
|
||||||
|
/pkcs7@1.0.4:
|
||||||
|
resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
dev: false
|
||||||
|
|
||||||
/pkg-types@1.0.3:
|
/pkg-types@1.0.3:
|
||||||
resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
|
resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -7309,6 +7447,11 @@ packages:
|
|||||||
resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
|
resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/process@0.11.10:
|
||||||
|
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
|
||||||
|
engines: {node: '>= 0.6.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/prop-types@15.8.1:
|
/prop-types@15.8.1:
|
||||||
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
|
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -7817,6 +7960,12 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
queue-microtask: 1.2.3
|
queue-microtask: 1.2.3
|
||||||
|
|
||||||
|
/rust-result@1.0.0:
|
||||||
|
resolution: {integrity: sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==}
|
||||||
|
dependencies:
|
||||||
|
individual: 2.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/rxjs@6.6.7:
|
/rxjs@6.6.7:
|
||||||
resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
|
resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
|
||||||
engines: {npm: '>=2.0.0'}
|
engines: {npm: '>=2.0.0'}
|
||||||
@@ -7843,6 +7992,12 @@ packages:
|
|||||||
/safe-buffer@5.2.1:
|
/safe-buffer@5.2.1:
|
||||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||||
|
|
||||||
|
/safe-json-parse@4.0.0:
|
||||||
|
resolution: {integrity: sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==}
|
||||||
|
dependencies:
|
||||||
|
rust-result: 1.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/safe-regex-test@1.0.3:
|
/safe-regex-test@1.0.3:
|
||||||
resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
|
resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -8723,6 +8878,10 @@ packages:
|
|||||||
requires-port: 1.0.0
|
requires-port: 1.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/url-toolkit@2.2.5:
|
||||||
|
resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/use-callback-ref@1.3.1(@types/react@18.2.76)(react@18.2.0):
|
/use-callback-ref@1.3.1(@types/react@18.2.76)(react@18.2.0):
|
||||||
resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==}
|
resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -8819,6 +8978,45 @@ packages:
|
|||||||
builtins: 5.0.1
|
builtins: 5.0.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/video.js@8.10.0:
|
||||||
|
resolution: {integrity: sha512-7UeG/flj/pp8tNGW8WKPP1VJb3x2FgLoqUWzpZqkoq5YIyf6MNzmIrKtxprl438T5RVkcj+OzV8IX4jYSAn4Sw==}
|
||||||
|
dependencies:
|
||||||
|
'@babel/runtime': 7.23.9
|
||||||
|
'@videojs/http-streaming': 3.10.0(video.js@8.10.0)
|
||||||
|
'@videojs/vhs-utils': 4.0.0
|
||||||
|
'@videojs/xhr': 2.6.0
|
||||||
|
aes-decrypter: 4.0.1
|
||||||
|
global: 4.4.0
|
||||||
|
keycode: 2.2.0
|
||||||
|
m3u8-parser: 7.1.0
|
||||||
|
mpd-parser: 1.3.0
|
||||||
|
mux.js: 7.0.3
|
||||||
|
safe-json-parse: 4.0.0
|
||||||
|
videojs-contrib-quality-levels: 4.0.0(video.js@8.10.0)
|
||||||
|
videojs-font: 4.1.0
|
||||||
|
videojs-vtt.js: 0.15.5
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/videojs-contrib-quality-levels@4.0.0(video.js@8.10.0):
|
||||||
|
resolution: {integrity: sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==}
|
||||||
|
engines: {node: '>=14', npm: '>=6'}
|
||||||
|
peerDependencies:
|
||||||
|
video.js: ^8
|
||||||
|
dependencies:
|
||||||
|
global: 4.4.0
|
||||||
|
video.js: 8.10.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/videojs-font@4.1.0:
|
||||||
|
resolution: {integrity: sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/videojs-vtt.js@0.15.5:
|
||||||
|
resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==}
|
||||||
|
dependencies:
|
||||||
|
global: 4.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/vite-node@1.5.0(@types/node@20.12.7):
|
/vite-node@1.5.0(@types/node@20.12.7):
|
||||||
resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==}
|
resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==}
|
||||||
engines: {node: ^18.0.0 || >=20.0.0}
|
engines: {node: ^18.0.0 || >=20.0.0}
|
||||||
|
|||||||
Reference in New Issue
Block a user