From c4291c87591b5c283589e2c372f6c4f97bf0f64e Mon Sep 17 00:00:00 2001 From: ovosimpatico Date: Wed, 14 May 2025 21:17:41 -0300 Subject: [PATCH] video post-processing, moves saved, used by ts --- .gitignore | 5 +- jd-clone/index.json | 18 + jd-clone/package.json | 2 +- .../src/components/common/AudioPreview.tsx | 61 +++ jd-clone/src/components/game/VideoPlayer.scss | 14 + jd-clone/src/components/game/VideoPlayer.tsx | 168 +++++++ jd-clone/src/pages/gameplay/GameplayPage.scss | 61 +++ jd-clone/src/pages/gameplay/GameplayPage.tsx | 47 +- jd-clone/src/pages/results/ResultsPage.tsx | 4 +- jd-clone/src/pages/setup/GameSetupPage.tsx | 27 +- jd-clone/src/services/song-service.ts | 204 ++++---- jd-clone/src/types/index.ts | 24 +- pose_detector_window.py | 391 +++++++++++++--- pose_viewer.py | 436 ++++++++++++++++++ requirements.txt | 3 +- 15 files changed, 1262 insertions(+), 203 deletions(-) create mode 100644 jd-clone/index.json create mode 100644 jd-clone/src/components/common/AudioPreview.tsx create mode 100644 jd-clone/src/components/game/VideoPlayer.scss create mode 100644 jd-clone/src/components/game/VideoPlayer.tsx create mode 100644 pose_viewer.py diff --git a/.gitignore b/.gitignore index 7386e39..1ce164e 100644 --- a/.gitignore +++ b/.gitignore @@ -301,4 +301,7 @@ dist .pnp.* # Yolo -*.pt \ No newline at end of file +*.pt + +# Downloads +downloaded_videos/ diff --git a/jd-clone/index.json b/jd-clone/index.json new file mode 100644 index 0000000..9570087 --- /dev/null +++ b/jd-clone/index.json @@ -0,0 +1,18 @@ +{ + "songs": { + "Butter": { + "Name": "Butter", + "Artist": "BTS", + "Album": "Butter", + "Year": 2021, + "Genre": "K-Pop", + "GameData": { + "moves": "https://cdn.ovosimpatico.com/jdlo/maps/Butter/poses.json", + "video": "https://cdn.ovosimpatico.com/jdlo/maps/Butter/Butter_ULTRA.webm", + "audio": "https://cdn.ovosimpatico.com/jdlo/maps/Butter/Butter.ogg", + "cover": "https://cdn.ovosimpatico.com/jdlo/maps/Butter/butter_cover_generic.png", + "audio_preview": "https://cdn.ovosimpatico.com/jdlo/maps/Butter/butter_audiopreview.ogg" + } + } + } +} diff --git a/jd-clone/package.json b/jd-clone/package.json index ba7a2dd..20973d1 100644 --- a/jd-clone/package.json +++ b/jd-clone/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc -b && vite build", + "build": "tsc -b && vite build && cp ../index.json dist/", "lint": "eslint .", "preview": "vite preview" }, diff --git a/jd-clone/src/components/common/AudioPreview.tsx b/jd-clone/src/components/common/AudioPreview.tsx new file mode 100644 index 0000000..28aeafb --- /dev/null +++ b/jd-clone/src/components/common/AudioPreview.tsx @@ -0,0 +1,61 @@ +import { useEffect, useRef, useState } from 'react'; +import useAppStore from '../../store/app-store'; + +interface AudioPreviewProps { + src: string; + autoPlay?: boolean; +} + +const AudioPreview = ({ src, autoPlay = false }: AudioPreviewProps) => { + const audioRef = useRef(null); + const [isPlaying, setIsPlaying] = useState(false); + const masterVolume = useAppStore(state => state.settings.volume.master); + const musicVolume = useAppStore(state => state.settings.volume.music); + + useEffect(() => { + if (!audioRef.current) return; + + // Set volume based on app settings + const volume = masterVolume * musicVolume; + audioRef.current.volume = volume; + + // Autoplay if needed + if (autoPlay && audioRef.current) { + audioRef.current.play().catch(error => { + console.warn('Autoplay prevented:', error); + }); + } + + return () => { + if (audioRef.current) { + audioRef.current.pause(); + audioRef.current.currentTime = 0; + } + }; + }, [src, autoPlay, masterVolume, musicVolume]); + + useEffect(() => { + const audio = audioRef.current; + if (!audio) return; + + const handlePlay = () => setIsPlaying(true); + const handlePause = () => setIsPlaying(false); + const handleEnded = () => setIsPlaying(false); + + audio.addEventListener('play', handlePlay); + audio.addEventListener('pause', handlePause); + audio.addEventListener('ended', handleEnded); + + return () => { + audio.removeEventListener('play', handlePlay); + audio.removeEventListener('pause', handlePause); + audio.removeEventListener('ended', handleEnded); + }; + }, []); + + return ( +