diff --git a/next-i18next.config.js b/next-i18next.config.js index 32d339fe9..99a975092 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -30,6 +30,7 @@ module.exports = { fallbackLng: 'en', localeDetection: true, returnEmptyString: false, + debug: process.env.NODE_ENV === 'development', }, reloadOnPrerender: process.env.NODE_ENV === 'development', }; diff --git a/package.json b/package.json index 6a5469457..309c79323 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "@types/ping": "^0.4.1", "@types/react": "17.0.1", "@types/uuid": "^8.3.4", + "@types/video.js": "^7.3.51", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.30.7", "babel-loader": "^9.1.2", @@ -99,7 +100,8 @@ "jest": "^28.1.3", "prettier": "^2.7.1", "sass": "^1.56.1", - "typescript": "^4.7.4" + "typescript": "^4.7.4", + "video.js": "^8.0.3" }, "resolutions": { "@types/react": "17.0.2", diff --git a/public/locales/en/modules/video-stream.json b/public/locales/en/modules/video-stream.json new file mode 100644 index 000000000..3b84c3574 --- /dev/null +++ b/public/locales/en/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "Video Stream", + "description": "Embed a video stream or video from a camera or a website", + "settings": { + "title": "Settings for video stream widget", + "cameraFeedUrl": { + "label": "Camera feed url" + }, + "autoPlay": { + "label": "Auto play" + }, + "muted": { + "label": "Muted audio" + }, + "controls": { + "label": "Video player controls" + } + } + }, + "errors": { + "invalidStream": "Invalid stream" + } +} \ No newline at end of file diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index b20595f4f..4b10110a6 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -26,6 +26,7 @@ import { ServerSidePackageAttributesType, } from '../tools/server/getPackageVersion'; import { usePackageAttributesStore } from '../tools/client/zustands/usePackageAttributesStore'; +import 'video.js/dist/video-js.css'; import '../styles/global.scss'; import '@uiw/react-textarea-code-editor/dist.css'; diff --git a/src/tools/server/translation-namespaces.ts b/src/tools/server/translation-namespaces.ts index dab3acea9..daa866df2 100644 --- a/src/tools/server/translation-namespaces.ts +++ b/src/tools/server/translation-namespaces.ts @@ -33,6 +33,7 @@ export const dashboardNamespaces = [ 'modules/dashdot', 'modules/overseerr', 'modules/common-media-cards', + 'modules/video-stream', ]; export const loginNamespaces = ['authentication/login']; diff --git a/src/widgets/index.ts b/src/widgets/index.ts index e38a2ba53..aac770ead 100644 --- a/src/widgets/index.ts +++ b/src/widgets/index.ts @@ -5,6 +5,7 @@ import usenet from './useNet/UseNetTile'; import weather from './weather/WeatherTile'; import torrent from './torrent/TorrentTile'; import torrentNetworkTraffic from './download-speed/TorrentNetworkTrafficTile'; +import videoStream from './video/VideoStreamTile'; export default { calendar, @@ -14,4 +15,5 @@ export default { 'torrents-status': torrent, dlspeed: torrentNetworkTraffic, date, + 'video-stream': videoStream, }; diff --git a/src/widgets/video/VideoFeed.tsx b/src/widgets/video/VideoFeed.tsx new file mode 100644 index 000000000..604426c70 --- /dev/null +++ b/src/widgets/video/VideoFeed.tsx @@ -0,0 +1,68 @@ +import { LoadingOverlay } from '@mantine/core'; +import { createStyles } from '@mantine/styles'; +import { useEffect, useRef, useState } from 'react'; +import videojs from 'video.js'; +import 'video.js/dist/video-js.css'; + +interface VideoFeedProps { + source: string; + muted: boolean; + autoPlay: boolean; + controls: boolean; +} + +const VideoFeed = ({ source, controls, autoPlay, muted }: VideoFeedProps) => { + const videoRef = useRef(null); + const [player, setPlayer] = useState>(); + + const { classes, cx } = useStyles(); + + useEffect(() => { + // make sure Video.js player is only initialized once + if (player) { + return; + } + + const videoElement = videoRef.current; + if (!videoElement) { + return; + } + + setPlayer(videojs(videoElement, { autoplay: autoPlay, muted, controls }, () => {})); + }, [videoRef]); + + useEffect( + () => () => { + if (!player) { + return; + } + + if (player.isDisposed()) { + return; + } + + player.dispose(); + }, + [player] + ); + + return ( + <> + + {/* eslint-disable-next-line jsx-a11y/media-has-caption */} + + + ); +}; + +const useStyles = createStyles(({ radius }) => ({ + video: { + height: '100%', + borderRadius: radius.md, + overflow: 'hidden', + }, +})); + +export default VideoFeed; diff --git a/src/widgets/video/VideoStreamTile.tsx b/src/widgets/video/VideoStreamTile.tsx new file mode 100644 index 000000000..873af47c8 --- /dev/null +++ b/src/widgets/video/VideoStreamTile.tsx @@ -0,0 +1,68 @@ +import { Center, Group, Stack, Title } from '@mantine/core'; +import { IconDeviceCctv, IconHeartBroken } from '@tabler/icons'; +import { useTranslation } from 'react-i18next'; +import { defineWidget } from '../helper'; +import { IWidget } from '../widgets'; +import VideoFeed from './VideoFeed'; + +const definition = defineWidget({ + id: 'video-stream', + icon: IconDeviceCctv, + options: { + cameraFeedUrl: { + type: 'text', + defaultValue: '', + }, + autoPlay: { + type: 'switch', + defaultValue: true, + }, + muted: { + type: 'switch', + defaultValue: true, + }, + controls: { + type: 'switch', + defaultValue: false, + }, + }, + gridstack: { + minWidth: 3, + minHeight: 2, + maxWidth: 12, + maxHeight: 12, + }, + component: VideoStreamWidget, +}); + +export type VideoStreamWidget = IWidget<(typeof definition)['id'], typeof definition>; + +interface VideoStreamWidgetProps { + widget: VideoStreamWidget; +} + +function VideoStreamWidget({ widget }: VideoStreamWidgetProps) { + const { t } = useTranslation('modules/video-stream'); + if (!widget.properties.cameraFeedUrl) { + return ( +
+ + + {t('errors.invalidStream')} + +
+ ); + } + return ( + + + + ); +} + +export default definition; diff --git a/yarn.lock b/yarn.lock index bcd5cf7e8..66dc9f29c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -371,7 +371,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.19.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.19.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.20.13 resolution: "@babel/runtime@npm:7.20.13" dependencies: @@ -2268,6 +2268,13 @@ __metadata: languageName: node linkType: hard +"@types/video.js@npm:^7.3.51": + version: 7.3.51 + resolution: "@types/video.js@npm:7.3.51" + checksum: 95b8e75da82b401965bd2b31648f7917495b9f2eda3773e1c50f027ed1f457760731912c71cf2c4e8c4b3087b29844bdcc92577bb56ae5c49b771039f7da819e + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -2420,6 +2427,64 @@ __metadata: languageName: node linkType: hard +"@videojs/http-streaming@npm:3.0.0": + version: 3.0.0 + resolution: "@videojs/http-streaming@npm:3.0.0" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": 4.0.0 + aes-decrypter: 4.0.1 + global: ^4.4.0 + m3u8-parser: ^6.0.0 + mpd-parser: ^1.0.1 + mux.js: 6.2.0 + video.js: ^7 || ^8 + peerDependencies: + video.js: ^7 || ^8 + checksum: e479cd981a067e9b28c9c90f41936b5587939060690f4eabdbbe5ca54adb509515e03270297a03b545087d76dfd1ab7b9461e5e1ef62a8e0ed57d80fa52bbe2c + languageName: node + linkType: hard + +"@videojs/vhs-utils@npm:4.0.0, @videojs/vhs-utils@npm:^4.0.0": + version: 4.0.0 + resolution: "@videojs/vhs-utils@npm:4.0.0" + dependencies: + "@babel/runtime": ^7.12.5 + global: ^4.4.0 + url-toolkit: ^2.2.1 + checksum: a824900d0173478c80ee9683f67cc041e204d79ac280ae369adb03357d51d8a51b296bd6aff96b2cce66633a63f05a10d11d53da6ec063ee7c4d6e38dabd826e + languageName: node + linkType: hard + +"@videojs/vhs-utils@npm:^3.0.5": + version: 3.0.5 + resolution: "@videojs/vhs-utils@npm:3.0.5" + dependencies: + "@babel/runtime": ^7.12.5 + global: ^4.4.0 + url-toolkit: ^2.2.1 + checksum: 637dc9a8848027eab4213d6e85439d216577d0cb0346767c15bbb07a5a730aa30545f0b5d7bfd636f40212e490f34bf103e331f0bc180b4d3c245e77f30b437f + languageName: node + linkType: hard + +"@videojs/xhr@npm:2.6.0": + version: 2.6.0 + resolution: "@videojs/xhr@npm:2.6.0" + dependencies: + "@babel/runtime": ^7.5.5 + global: ~4.4.0 + is-function: ^1.0.1 + checksum: 217d3d49f8088461959840f93f0b45d713e6d03254d89352e2eb4bfca9501eee03bac25d0ad878e976c9cbec902039210a86906ef57a5f8d86bfdfa1a3999def + languageName: node + linkType: hard + +"@xmldom/xmldom@npm:^0.8.3": + version: 0.8.6 + resolution: "@xmldom/xmldom@npm:0.8.6" + checksum: f17ac6d99a971a6aeb831fcfc5cfa86f367664e45815046548814b2deb17ccc421fef4e0d5ba29e66179d112b552f6caa5680064f8e7bd8a389b788a60404c8e + languageName: node + linkType: hard + "abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -2452,6 +2517,18 @@ __metadata: languageName: node linkType: hard +"aes-decrypter@npm:4.0.1, aes-decrypter@npm:^4.0.1": + version: 4.0.1 + resolution: "aes-decrypter@npm:4.0.1" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": ^3.0.5 + global: ^4.4.0 + pkcs7: ^1.0.4 + checksum: c09f47e928d88af2387690e47e60001be74095c10007fe44ef57663db17ee8e391310c6f0b023bc63257afe442900cc916f55fba7dd27ec1c394d616b062d664 + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -3327,14 +3404,14 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": +"color-name@npm:1.1.3, color-name@npm:^1.0.0": version: 1.1.3 resolution: "color-name@npm:1.1.3" checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": +"color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 @@ -3573,14 +3650,7 @@ __metadata: languageName: node linkType: hard -"d3-format@npm:1 - 2": - version: 2.0.0 - resolution: "d3-format@npm:2.0.0" - checksum: c4d3c8f9941d097d514d3986f54f21434e08e5876dc08d1d65226447e8e167600d5b9210235bb03fd45327225f04f32d6e365f08f76d2f4b8bff81594851aaf7 - languageName: node - linkType: hard - -"d3-format@npm:^1.4.4": +"d3-format@npm:1 - 2, d3-format@npm:^1.4.4": version: 1.4.5 resolution: "d3-format@npm:1.4.5" checksum: 1b8b2c0bca182173bccd290a43e8b635a83fc8cfe52ec878c7bdabb997d47daac11f2b175cebbe73f807f782ad655f542bdfe18180ca5eb3498a3a82da1e06ab @@ -3644,7 +3714,14 @@ __metadata: languageName: node linkType: hard -"d3-time@npm:1 - 2, d3-time@npm:^2.1.1": +"d3-time@npm:1 - 2, d3-time@npm:^1.0.11": + version: 1.1.0 + resolution: "d3-time@npm:1.1.0" + checksum: 33fcfff94ff093dde2048c190ecca8b39fe0ec8b3c61e9fc39c5f6072ce5b86dd2b91823f086366995422bbbac7f74fd9abdb7efe4f292a73b1c6197c699cc78 + languageName: node + linkType: hard + +"d3-time@npm:^2.1.1": version: 2.1.1 resolution: "d3-time@npm:2.1.1" dependencies: @@ -3653,13 +3730,6 @@ __metadata: languageName: node linkType: hard -"d3-time@npm:^1.0.11": - version: 1.1.0 - resolution: "d3-time@npm:1.1.0" - checksum: 33fcfff94ff093dde2048c190ecca8b39fe0ec8b3c61e9fc39c5f6072ce5b86dd2b91823f086366995422bbbac7f74fd9abdb7efe4f292a73b1c6197c699cc78 - languageName: node - linkType: hard - "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -3894,6 +3964,13 @@ __metadata: languageName: node linkType: hard +"dom-walk@npm:^0.1.0": + version: 0.1.2 + resolution: "dom-walk@npm:0.1.2" + checksum: 19eb0ce9c6de39d5e231530685248545d9cd2bd97b2cb3486e0bfc0f2a393a9addddfd5557463a932b52fdfcf68ad2a619020cd2c74a5fe46fbecaa8e80872f3 + languageName: node + linkType: hard + "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" @@ -4983,7 +5060,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.7": +"glob@npm:7.1.7, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.1.7 resolution: "glob@npm:7.1.7" dependencies: @@ -4997,20 +5074,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - "glob@npm:^8.0.1": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -5024,6 +5087,16 @@ __metadata: languageName: node linkType: hard +"global@npm:4.4.0, global@npm:^4.3.1, global@npm:^4.4.0, global@npm:~4.4.0": + version: 4.4.0 + resolution: "global@npm:4.4.0" + dependencies: + min-document: ^2.19.0 + process: ^0.11.10 + checksum: 9c057557c8f5a5bcfbeb9378ba4fe2255d04679452be504608dd5f13b54edf79f7be1db1031ea06a4ec6edd3b9f5f17d2d172fb47e6c69dae57fd84b7e72b77f + languageName: node + linkType: hard + "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -5374,6 +5447,7 @@ __metadata: "@types/ping": ^0.4.1 "@types/react": 17.0.1 "@types/uuid": ^8.3.4 + "@types/video.js": ^7.3.51 "@typescript-eslint/eslint-plugin": ^5.30.7 "@typescript-eslint/parser": ^5.30.7 "@uiw/react-textarea-code-editor": v1.4.4 @@ -5418,6 +5492,7 @@ __metadata: systeminformation: ^5.12.1 typescript: ^4.7.4 uuid: ^8.3.2 + video.js: ^8.0.3 yarn: ^1.22.19 zustand: ^4.1.4 languageName: unknown @@ -5661,6 +5736,13 @@ __metadata: languageName: node linkType: hard +"individual@npm:^2.0.0": + version: 2.0.0 + resolution: "individual@npm:2.0.0" + checksum: 34f071ade77365e2cdb9e034e7dc92930450ce427415b9ef975a2c2a455b40aa9e071ae7888972f3d2ec7d977a32cf1af46e0b8d602d70d05da5b9bbc9e23392 + languageName: node + linkType: hard + "infer-owner@npm:^1.0.4": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" @@ -5857,6 +5939,13 @@ __metadata: languageName: node linkType: hard +"is-function@npm:^1.0.1": + version: 1.0.2 + resolution: "is-function@npm:1.0.2" + checksum: 7d564562e07b4b51359547d3ccc10fb93bb392fd1b8177ae2601ee4982a0ece86d952323fc172a9000743a3971f09689495ab78a1d49a9b14fc97a7e28521dc0 + languageName: node + linkType: hard + "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -6665,6 +6754,13 @@ __metadata: languageName: node linkType: hard +"keycode@npm:2.2.0": + version: 2.2.0 + resolution: "keycode@npm:2.2.0" + checksum: cb91c2940a892f1444a41fc08339b8831445a6b095af9103e3061ea7d4bdbfc420135dcb5d9257020e35c374468bb7d4495ea9fcea54e5760196daff3c874fa4 + languageName: node + linkType: hard + "keyv@npm:^4.0.0, keyv@npm:^4.5.2": version: 4.5.2 resolution: "keyv@npm:4.5.2" @@ -6821,6 +6917,17 @@ __metadata: languageName: node linkType: hard +"m3u8-parser@npm:^6.0.0": + version: 6.0.0 + resolution: "m3u8-parser@npm:6.0.0" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": ^3.0.5 + global: ^4.4.0 + checksum: b305dede0595688b32ddfbafe2fc53c650eb89be4f2ceabf717596c3bf5b33e62d3c9b83264846e47f5afb2e863dc6890a2b574d09071083c6f696daa8488ec9 + languageName: node + linkType: hard + "make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -6931,7 +7038,16 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"min-document@npm:^2.19.0": + version: 2.19.0 + resolution: "min-document@npm:2.19.0" + dependencies: + dom-walk: ^0.1.0 + checksum: da6437562ea2228041542a2384528e74e22d1daa1a4ec439c165abf0b9d8a63e17e3b8a6dc6e0c731845e85301198730426932a0e813d23f932ca668340c9623 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -7049,6 +7165,20 @@ __metadata: languageName: node linkType: hard +"mpd-parser@npm:^1.0.1": + version: 1.0.1 + resolution: "mpd-parser@npm:1.0.1" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/vhs-utils": ^3.0.5 + "@xmldom/xmldom": ^0.8.3 + global: ^4.4.0 + bin: + mpd-to-m3u8-json: bin/parse.js + checksum: a82c4ba7335d193aa248f4e39d4ad58359c5ff055a50fd574980b2a29318fbaccda9741f2106fe933a46ff5d092a6a78a542912bd3f1046e70b8ae63f80482ee + languageName: node + linkType: hard + "mrmime@npm:^1.0.0": version: 1.0.1 resolution: "mrmime@npm:1.0.1" @@ -7056,14 +7186,14 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": +"ms@npm:2.1.2, ms@npm:^2.1.1": version: 2.1.2 resolution: "ms@npm:2.1.2" checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f languageName: node linkType: hard -"ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -7080,6 +7210,18 @@ __metadata: languageName: node linkType: hard +"mux.js@npm:6.2.0, mux.js@npm:^6.2.0": + version: 6.2.0 + resolution: "mux.js@npm:6.2.0" + dependencies: + "@babel/runtime": ^7.11.2 + global: ^4.4.0 + bin: + muxjs-transmux: bin/transmux.js + checksum: ecf54ead3480351967cbf6e54b57e38406b0ac5bc6dc194ae59e77e80ae6e6f6ab6fa42c15f0b0938cd0cce866fb7249c571be41d6cf78ee4531ecdfe65cfef9 + languageName: node + linkType: hard + "nan@npm:^2.15.0, nan@npm:^2.16.0": version: 2.17.0 resolution: "nan@npm:2.17.0" @@ -7675,6 +7817,17 @@ __metadata: languageName: node linkType: hard +"pkcs7@npm:^1.0.4": + version: 1.0.4 + resolution: "pkcs7@npm:1.0.4" + dependencies: + "@babel/runtime": ^7.5.5 + bin: + pkcs7: bin/cli.js + checksum: 926a713263c7656883d1fcc9fa709e08c26babc76d535dd76ccdf5ad1bc1c5931ecbbe2d7ae6075ad54897e1184be4ec304d295e28953c2ec0f1a04c27f4e838 + languageName: node + linkType: hard + "pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -7780,6 +7933,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -8295,6 +8455,15 @@ __metadata: languageName: node linkType: hard +"rust-result@npm:^1.0.0": + version: 1.0.0 + resolution: "rust-result@npm:1.0.0" + dependencies: + individual: ^2.0.0 + checksum: ccad2bdf79d3ff29e9f163db3121342b31e6d3008714851900c59da20489175f389dc3309cb92bfa5fa4d8f8842f0287567021912d37afbe5d379880af4bb95b + languageName: node + linkType: hard + "sabnzbd-api@npm:^1.5.0": version: 1.5.0 resolution: "sabnzbd-api@npm:1.5.0" @@ -8319,6 +8488,15 @@ __metadata: languageName: node linkType: hard +"safe-json-parse@npm:4.0.0": + version: 4.0.0 + resolution: "safe-json-parse@npm:4.0.0" + dependencies: + rust-result: ^1.0.0 + checksum: dab69dee6cfeeb5735447e4bb79da06054ff46954f9ef7504ade0ae8afe4984d44afb16adbd24adf89a83088fac8cdb07cf4ec0abc94422a1f54a4484cdb5c1a + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -8902,19 +9080,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - -"tar-fs@npm:~2.0.1": +"tar-fs@npm:^2.0.0, tar-fs@npm:~2.0.1": version: 2.0.1 resolution: "tar-fs@npm:2.0.1" dependencies: @@ -8926,6 +9092,18 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^2.1.1": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: ^1.1.1 + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^2.1.4 + checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + languageName: node + linkType: hard + "tar-stream@npm:^2.0.0, tar-stream@npm:^2.1.4": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" @@ -9334,6 +9512,13 @@ __metadata: languageName: node linkType: hard +"url-toolkit@npm:^2.2.1": + version: 2.2.5 + resolution: "url-toolkit@npm:2.2.5" + checksum: c784040bd4dbd78647a62218b6b8c1abd9a2f7fd8adce1851daf21dc2d98e2a5d69b78a628ec07dcfa112c16a112a182e109b7c872b6e8a1e4a1547b49b81f7b + languageName: node + linkType: hard + "use-composed-ref@npm:^1.3.0": version: 1.3.0 resolution: "use-composed-ref@npm:1.3.0" @@ -9437,6 +9622,55 @@ __metadata: languageName: node linkType: hard +"video.js@npm:^7 || ^8, video.js@npm:^8.0.3": + version: 8.0.3 + resolution: "video.js@npm:8.0.3" + dependencies: + "@babel/runtime": ^7.12.5 + "@videojs/http-streaming": 3.0.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: ^6.0.0 + mpd-parser: ^1.0.1 + mux.js: ^6.2.0 + safe-json-parse: 4.0.0 + videojs-contrib-quality-levels: 3.0.0 + videojs-font: 3.2.0 + videojs-vtt.js: 0.15.4 + checksum: 3bb4b334192116c8bcbe254a67fee1655cb829155845afaf274efe5bf8019f9a32081156f697b68b322af91853f0b843ffbbed572cefb307d5f47ea61c6c78b4 + languageName: node + linkType: hard + +"videojs-contrib-quality-levels@npm:3.0.0": + version: 3.0.0 + resolution: "videojs-contrib-quality-levels@npm:3.0.0" + dependencies: + global: ^4.4.0 + peerDependencies: + video.js: ^6 || ^7 || ^8 + checksum: 06635a74f4c88d7adb7c8e55687b76306432ea5921c4a03cfb9845adc0eef671c9e043706911e761366a41e6a4046cafaa619c645f25858764500e5596ce9b41 + languageName: node + linkType: hard + +"videojs-font@npm:3.2.0": + version: 3.2.0 + resolution: "videojs-font@npm:3.2.0" + checksum: 3c773d4a64123c237c26029a5d04c51919e3b6e688db0a20c6f9c647198ec815425d96a62dd24989046f27aa583c96cecae715f789f8d98452b4df419c23158a + languageName: node + linkType: hard + +"videojs-vtt.js@npm:0.15.4": + version: 0.15.4 + resolution: "videojs-vtt.js@npm:0.15.4" + dependencies: + global: ^4.3.1 + checksum: 10c6c861621d4314e7d4b60b7bef1afc60f1ac438879f6b3f22e8944d694c8e9dfc809a8187ed72f44e06c39a159044d8fa15e80695b9bf7b9bef99ea2740b70 + languageName: node + linkType: hard + "void-elements@npm:3.1.0": version: 3.1.0 resolution: "void-elements@npm:3.1.0"