Skip to content

Commit 657012d

Browse files
authored
feat: add 360 video player (#184)
* feat: add video360 player * move canvas and video * Improved controlbar * autoplay check
1 parent 5847c16 commit 657012d

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"vite-plugin-solid": "^2.3.0"
5353
},
5454
"dependencies": {
55+
"@egjs/view360": "4.0.0-beta.7",
5556
"@github/webauthn-json": "^2.1.1",
5657
"@hope-ui/solid": "0.6.7",
5758
"@monaco-editor/loader": "^1.4.0",

pnpm-lock.yaml

Lines changed: 37 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/pages/home/previews/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ const previews: Preview[] = [
8484
exts: ["cast"],
8585
component: lazy(() => import("./asciinema")),
8686
},
87+
{
88+
name: "Video360",
89+
type: ObjType.VIDEO,
90+
component: lazy(() => import("./video360")),
91+
},
8792
]
8893

8994
export const getPreviews = (
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.view360-controls-main,
2+
.view360-controls-float-left,
3+
.view360-controls-float-right {
4+
pointer-events: all !important;
5+
}
6+
7+
.view360-controls-top .view360-range {
8+
height: 8px !important;
9+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { Box } from "@hope-ui/solid"
2+
import { VideoBox } from "./video_box"
3+
import { createSignal, onCleanup, onMount } from "solid-js"
4+
import { getSettingBool, objStore } from "~/store"
5+
import { ObjType } from "~/types"
6+
import View360, { ControlBar, EquirectProjection } from "@egjs/view360"
7+
import "@egjs/view360/css/view360.min.css"
8+
import "./video360.css"
9+
10+
const Preview = () => {
11+
let videos = objStore.objs.filter((obj) => obj.type === ObjType.VIDEO)
12+
if (videos.length === 0) {
13+
videos = [objStore.obj]
14+
}
15+
16+
let viewer: View360
17+
18+
onMount(() => {
19+
const container = document.getElementById("view360-container")
20+
const video = document.getElementById("view360-video")
21+
22+
if (container && video) {
23+
viewer = new View360(container, {
24+
projection: new EquirectProjection({
25+
src: video,
26+
video: {
27+
autoplay: getSettingBool("video_autoplay"),
28+
},
29+
}),
30+
plugins: [
31+
new ControlBar({
32+
pieView: { order: 0 },
33+
gyroButton: { position: "top-right", order: 1 },
34+
vrButton: { position: "top-right", order: 2 },
35+
}),
36+
],
37+
})
38+
}
39+
})
40+
41+
onCleanup(() => viewer?.destroy())
42+
43+
const [autoNext, setAutoNext] = createSignal(false)
44+
45+
return (
46+
<VideoBox onAutoNextChange={setAutoNext}>
47+
<Box w="$full" h="60vh" id="video360-player">
48+
<Box
49+
w={"100%"}
50+
h={"100%"}
51+
id="view360-container"
52+
className="view360-container"
53+
>
54+
<canvas class="view360-canvas" />
55+
<video
56+
src={objStore.raw_url}
57+
id="view360-video"
58+
playsinline
59+
crossOrigin="anonymous"
60+
style="display: none;"
61+
/>
62+
</Box>
63+
</Box>
64+
</VideoBox>
65+
)
66+
}
67+
68+
export default Preview

0 commit comments

Comments
 (0)