diff --git a/components/previews/VideoPreview.tsx b/components/previews/VideoPreview.tsx
index 875825d..beafb78 100644
--- a/components/previews/VideoPreview.tsx
+++ b/components/previews/VideoPreview.tsx
@@ -3,12 +3,15 @@ import { useRouter } from 'next/router'
import { useClipboard } from 'use-clipboard-copy'
import DPlayer from 'react-dplayer'
import toast from 'react-hot-toast'
+import { useAsync } from 'react-async-hook'
import { getBaseUrl } from '../../utils/getBaseUrl'
-import { DownloadButton } from '../DownloadBtnGtoup'
-import { DownloadBtnContainer, PreviewContainer } from './Containers'
import { getExtension } from '../../utils/getFileIcon'
import { getReadablePath } from '../../utils/getReadablePath'
+import { DownloadButton } from '../DownloadBtnGtoup'
+import { DownloadBtnContainer, PreviewContainer } from './Containers'
+import FourOhFour from '../FourOhFour'
+import Loading from '../Loading'
const VideoPreview: React.FC<{ file: OdFileObject }> = ({ file }) => {
const { asPath } = useRouter()
@@ -20,21 +23,49 @@ const VideoPreview: React.FC<{ file: OdFileObject }> = ({ file }) => {
// We assume subtitle files are beside the video with the same name, only webvtt '.vtt' files are supported
const subtitle = `/api?path=${asPath.replace(getExtension(file.name), 'vtt')}&raw=true`
+ const isFlv = getExtension(file.name) === 'flv'
+ const {
+ loading,
+ error,
+ result: flvjs,
+ } = useAsync(async () => {
+ if (isFlv) {
+ return (await import('flv.js')).default
+ }
+ }, [isFlv])
+
return (
<>
-
+ {error ? (
+
+ ) : loading && isFlv ? (
+
+ ) : (
+ {
+ const flvPlayer = flvjs!.createPlayer({
+ type: 'flv',
+ url: video.src,
+ })
+ flvPlayer.attachMediaElement(video)
+ flvPlayer.load()
+ },
+ },
+ },
+ subtitle: { url: subtitle },
+ }}
+ />
+ )}
diff --git a/package.json b/package.json
index d433360..36a1669 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"cors": "^2.8.5",
"crypto-js": "^4.1.1",
"emoji-regex": "^10.0.0",
+ "flv.js": "^1.6.2",
"ioredis": "^4.28.2",
"jszip": "^3.7.1",
"next": "^12.0.10",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 514d019..f87579b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26,6 +26,7 @@ specifiers:
eslint: 8.8.0
eslint-config-next: 12.0.10
eslint-config-prettier: ^8.3.0
+ flv.js: ^1.6.2
ioredis: ^4.28.2
jszip: ^3.7.1
next: ^12.0.10
@@ -68,6 +69,7 @@ dependencies:
cors: 2.8.5
crypto-js: 4.1.1
emoji-regex: 10.0.0
+ flv.js: 1.6.2
ioredis: 4.28.3
jszip: 3.7.1
next: 12.0.10_react-dom@17.0.2+react@17.0.2
@@ -1185,6 +1187,10 @@ packages:
es6-symbol: 3.1.3
dev: false
+ /es6-promise/4.2.8:
+ resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
+ dev: false
+
/es6-symbol/3.1.3:
resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==}
dependencies:
@@ -1539,6 +1545,13 @@ packages:
resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==}
dev: true
+ /flv.js/1.6.2:
+ resolution: {integrity: sha512-xre4gUbX1MPtgQRKj2pxJENp/RnaHaxYvy3YToVVCrSmAWUu85b9mug6pTXF6zakUjNP2lFWZ1rkSX7gxhB/2A==}
+ dependencies:
+ es6-promise: 4.2.8
+ webworkify-webpack: 2.1.5
+ dev: false
+
/follow-redirects/1.14.7:
resolution: {integrity: sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==}
engines: {node: '>=4.0'}
@@ -3696,6 +3709,10 @@ packages:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
dev: false
+ /webworkify-webpack/2.1.5:
+ resolution: {integrity: sha512-2akF8FIyUvbiBBdD+RoHpoTbHMQF2HwjcxfDvgztAX5YwbZNyrtfUMgvfgFVsgDhDPVTlkbb5vyasqDHfIDPQw==}
+ dev: false
+
/which-boxed-primitive/1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies: