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 ( +