player is super broken

This commit is contained in:
vel 2022-01-31 11:21:04 -08:00
parent 9350346b4c
commit f52b9a9c53
Signed by: velvox
GPG Key ID: 1C8200C1D689CEF5
7 changed files with 51 additions and 10 deletions

View File

@ -5,10 +5,9 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="8a64704d-5500-41a6-aa4c-e275933fc58c" name="Changes" comment=""> <list default="true" id="8a64704d-5500-41a6-aa4c-e275933fc58c" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/internal/ws/state.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/internal/ws/handlers.go" beforeDir="false" afterPath="$PROJECT_DIR$/internal/ws/handlers.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/internal/ws/handlers.go" beforeDir="false" afterPath="$PROJECT_DIR$/internal/ws/handlers.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/internal/ws/hub.go" beforeDir="false" afterPath="$PROJECT_DIR$/internal/ws/hub.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/internal/ws/state.go" beforeDir="false" afterPath="$PROJECT_DIR$/internal/ws/state.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../frontend/src/components/Player.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/../frontend/src/components/Player.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../frontend/src/components/Player.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/../frontend/src/components/Player.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../frontend/src/pages/player.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/../frontend/src/pages/player.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../frontend/src/pages/player.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/../frontend/src/pages/player.tsx" afterDir="false" />
</list> </list>
@ -101,4 +100,15 @@
<component name="VgoProject"> <component name="VgoProject">
<integration-enabled>true</integration-enabled> <integration-enabled>true</integration-enabled>
</component> </component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/internal/ws/handlers.go</url>
<line>61</line>
<option name="timeStamp" value="7" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
</component>
</project> </project>

View File

@ -15,7 +15,7 @@ func handleIdentifyEvent(message *Message) {
user := d["user"].(map[string]interface{}) user := d["user"].(map[string]interface{})
userId := user["id"].(string) userId := user["id"].(string)
playhead := message.hub.State.playhead playhead := message.hub.State.playhead
paused := message.hub.State.paused
m := Message{ m := Message{
MessageData: MessageData{ MessageData: MessageData{
Type: Identify, Type: Identify,
@ -24,6 +24,7 @@ func handleIdentifyEvent(message *Message) {
"playlist": "http://localhost:8081/BelleOpening.m3u8", "playlist": "http://localhost:8081/BelleOpening.m3u8",
"hasController": message.hub.State.IsController(userId), "hasController": message.hub.State.IsController(userId),
"playhead": playhead, "playhead": playhead,
"paused": paused,
"user": d["user"], "user": d["user"],
}, },
}, },
@ -62,6 +63,10 @@ func handleSetPlayhead(message *Message) {
if err != nil { if err != nil {
log.Errorf("unable to set playhead. %s", err) log.Errorf("unable to set playhead. %s", err)
} }
err = message.hub.State.setPaused(d["paused"].(bool))
if err != nil {
log.Errorf("unable to set paused. %s", err)
}
for client := range message.Client.hub.Clients { for client := range message.Client.hub.Clients {
if client == message.Client { if client == message.Client {
continue continue

View File

@ -27,11 +27,19 @@ func (s *State) setPlayhead(playhead float64) error {
return errors.New("unable to find state") return errors.New("unable to find state")
} }
s.Lock() s.Lock()
defer s.Lock() defer s.Unlock()
s.playhead = playhead s.playhead = playhead
return nil return nil
} }
func (s *State) setPaused(paused bool) error {
if s == nil {
return errors.New("unable to find state")
}
s.Lock()
defer s.Unlock()
s.paused = paused
return nil
}
func (s *State) IsController(userID string) bool { func (s *State) IsController(userID string) bool {
if userID == s.controllerUserId { if userID == s.controllerUserId {
return true return true

View File

@ -1,6 +1,7 @@
import { Box, css } from "@chakra-ui/react"; import { Box, css } from "@chakra-ui/react";
import React, { FC, useRef, useState } from "react"; import React, { FC, useEffect, useRef, useState } from "react";
import ReactPlayer, { Config, ReactPlayerProps } from "react-player"; import ReactPlayer, { Config, ReactPlayerProps } from "react-player";
import IdentityData from "../interfaces/Identity";
import { MessageTypes } from "../interfaces/IMessage"; import { MessageTypes } from "../interfaces/IMessage";
import SocketEvents from "../interfaces/SocketEvents"; import SocketEvents from "../interfaces/SocketEvents";
import Message from "../util/Message"; import Message from "../util/Message";
@ -10,6 +11,7 @@ import PlayerSocket from "../ws/websocket";
type PlayerProps = { type PlayerProps = {
id: string; id: string;
socket: PlayerSocket; socket: PlayerSocket;
identity?: IdentityData;
} & ReactPlayerProps; } & ReactPlayerProps;
const Player: FC<PlayerProps> = (props) => { const Player: FC<PlayerProps> = (props) => {
@ -21,10 +23,20 @@ const Player: FC<PlayerProps> = (props) => {
forceHLS: true, forceHLS: true,
}, },
}; };
socket.emitter.on(SocketEvents.GetPlayhead, (e) => { useEffect(() => {
if (playerRef.current && typeof props.identity !== "undefined") {
console.log(props.identity.playhead);
playerRef.current.seekTo(props.identity.playhead);
setPaused(props.identity.paused);
}
}, []);
socket.emitter.once(SocketEvents.SetPlayhead, (e) => {
console.log(e);
playerRef.current.seekTo(e.playhead); playerRef.current.seekTo(e.playhead);
setPaused(e.paused);
}); });
const onSeek = (playedSeconds: number) => { const onSeek = (playedSeconds: number) => {
if (!props.identity.admin) return;
if (paused) { if (paused) {
socket?.send( socket?.send(
MessageUtil.encode( MessageUtil.encode(
@ -46,6 +58,7 @@ const Player: FC<PlayerProps> = (props) => {
); );
}; };
const onPause = () => { const onPause = () => {
if (!props.identity.admin) return;
setPaused(true); setPaused(true);
socket?.send( socket?.send(
MessageUtil.encode( MessageUtil.encode(
@ -57,6 +70,7 @@ const Player: FC<PlayerProps> = (props) => {
); );
}; };
const onPlay = () => { const onPlay = () => {
if (!props.identity.admin) return;
setPaused(false); setPaused(false);
socket?.send( socket?.send(
MessageUtil.encode( MessageUtil.encode(
@ -74,11 +88,12 @@ const Player: FC<PlayerProps> = (props) => {
width="100%" width="100%"
height="100%" height="100%"
config={config} config={config}
controls controls={props.identity.admin}
onPlay={onPlay} onPlay={onPlay}
onPause={onPause} onPause={onPause}
onSeek={onSeek} onSeek={onSeek}
ref={playerRef} ref={playerRef}
playing={!paused}
{...props} {...props}
/> />
</Box> </Box>

View File

@ -5,7 +5,8 @@ interface IdentityData {
controller?: boolean; controller?: boolean;
clientID?: string; clientID?: string;
playlist?: string; playlist?: string;
playHead?: number; playhead?: number;
paused?: boolean;
user: IUser; user: IUser;
} }

View File

@ -1,5 +1,6 @@
enum SocketEvents { enum SocketEvents {
Identify = "Identify", Identify = "Identify",
SetPlayhead = "SetPlayhead",
GetPlayhead = "GetPlayhead", GetPlayhead = "GetPlayhead",
} }

View File

@ -28,6 +28,7 @@ const PlayerPage: NextPage<PlayerPageProps> = ({ user }) => {
setID(e.playlist); setID(e.playlist);
setIdentity(e); setIdentity(e);
}); });
console.log(identity);
} }
return ( return (
<> <>
@ -35,7 +36,7 @@ const PlayerPage: NextPage<PlayerPageProps> = ({ user }) => {
<title>Watch Together</title> <title>Watch Together</title>
</Head> </Head>
<Container height="100vh" background={"#000"}> <Container height="100vh" background={"#000"}>
<Player id={id} socket={socket} /> <Player id={id} socket={socket} identity={identity} />
</Container> </Container>
</> </>
); );