preview spectrograms for non-music files

This commit is contained in:
Joel Mathew Thomas
2025-03-18 21:32:33 +05:30
parent 9139ddce53
commit 4a5296cb18
3 changed files with 47 additions and 10 deletions
+30 -1
View File
@@ -8,7 +8,7 @@ import JSZip from "jszip";
function ProcessingPage() { function ProcessingPage() {
const navigate = useNavigate(); const navigate = useNavigate();
const { mediaFile, response, setExtractedFiles, setDownloadedFileURL } = useMediaContext(); const { mediaFile, response, setExtractedFiles, setDownloadedFileURL, setDownloadedFileSpectrogram } = useMediaContext();
const [progress, setProgress] = useState(0); const [progress, setProgress] = useState(0);
const [statusText, setStatusText] = useState("Analyzing media..."); const [statusText, setStatusText] = useState("Analyzing media...");
@@ -73,7 +73,36 @@ function ProcessingPage() {
const fileURL = URL.createObjectURL(blob); const fileURL = URL.createObjectURL(blob);
setDownloadedFileURL( fileURL ); setDownloadedFileURL( fileURL );
setProgress(90);
// Get spectrogram
setProgress(95);
setStatusText("Calculating Spectrogram");
const formData = new FormData();
formData.append("file_uuid", response.file_uuid);
if (mediaFile?.name) {
formData.append("file_name", mediaFile?.name);
}
const startTime = Date.now();
const resp = await axios.post<{
Status: String;
spectrogram: string;
spec_sr: number;
}>("/api/spectrogram", formData, {
headers: {
"Content-Type": "multipart/form-data",
}
})
if (resp.status === 200 && resp.data) {
const elapsedTime = Date.now() - startTime;
if(elapsedTime < 5000) await delay(5000 - elapsedTime);
setDownloadedFileSpectrogram({spectrogram: resp.data.spectrogram, spec_sr: resp.data.spec_sr})
setProgress(100); setProgress(100);
}
} else { } else {
console.log("Failed to download the file"); console.log("Failed to download the file");
+9 -7
View File
@@ -1,4 +1,4 @@
import { useEffect, useRef } from 'react'; import { useEffect } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
//import axios from 'axios'; //import axios from 'axios';
import { import {
@@ -23,10 +23,9 @@ import SpectrogramPlayer from "react-audio-spectrogram-player"
function ResultsPage() { function ResultsPage() {
const navigate = useNavigate(); const navigate = useNavigate();
const { mediaFile, response, extractedFiles, downloadedFileURL } = useMediaContext(); const { mediaFile, response, extractedFiles, downloadedFileURL, downloadedFileSpectrogram } = useMediaContext();
console.log("Extracted files are", extractedFiles); console.log("Extracted files are", extractedFiles);
// const [isPlaying, setIsPlaying] = useState(false); // const [isPlaying, setIsPlaying] = useState(false);
const audioRefs = [useRef(null), useRef(null), useRef(null),useRef(null)];
const audioClass = response.audio_class const audioClass = response.audio_class
const isVideo = mediaFile?.type.includes('video'); const isVideo = mediaFile?.type.includes('video');
@@ -147,11 +146,14 @@ function ResultsPage() {
<Typography variant="body2" color="textSecondary" sx={{ mb: 1 }}> <Typography variant="body2" color="textSecondary" sx={{ mb: 1 }}>
{mediaFile?.name} {mediaFile?.name}
</Typography> </Typography>
<audio <SpectrogramPlayer
ref={audioRefs[0]}
src={downloadedFileURL} src={downloadedFileURL}
style={{ width: '100%', borderRadius: '8px', boxShadow: '0 2px 10px rgba(0,0,0,0.2)' }} sxx={JSON.parse(downloadedFileSpectrogram.spectrogram)}
controls SampleRate={downloadedFileSpectrogram.spec_sr}
colormap={'magma'}
settings={true}
transparent={false}
navigator={true}
/> />
</Box> </Box>
</> </>
+7 -1
View File
@@ -9,6 +9,8 @@ interface MediaContextType {
setExtractedFiles: (files: {name: string; url: string, spectrogram: string, spec_sr: number}[]) => void; setExtractedFiles: (files: {name: string; url: string, spectrogram: string, spec_sr: number}[]) => void;
downloadedFileURL: string; downloadedFileURL: string;
setDownloadedFileURL: ( file: string) => void; setDownloadedFileURL: ( file: string) => void;
downloadedFileSpectrogram: { spectrogram: string, spec_sr: number};
setDownloadedFileSpectrogram: (spectrogram: {spectrogram: string, spec_sr: number}) => void;
} }
@@ -25,10 +27,14 @@ export const MediaProvider: React.FC<{ children: React.ReactNode }> = ({ childre
}); });
const [extractedFiles, setExtractedFiles] = useState<MediaContextType["extractedFiles"]>([]); const [extractedFiles, setExtractedFiles] = useState<MediaContextType["extractedFiles"]>([]);
const [downloadedFileURL, setDownloadedFileURL] = useState<MediaContextType["downloadedFileURL"]>(""); const [downloadedFileURL, setDownloadedFileURL] = useState<MediaContextType["downloadedFileURL"]>("");
const [downloadedFileSpectrogram, setDownloadedFileSpectrogram] = useState<MediaContextType["downloadedFileSpectrogram"]>({
spectrogram: "",
spec_sr: 0
});
return ( return (
<MediaContext.Provider value={{ mediaFile, setMediaFile, response, setResponse, extractedFiles, setExtractedFiles, downloadedFileURL, setDownloadedFileURL }}> <MediaContext.Provider value={{ mediaFile, setMediaFile, response, setResponse, extractedFiles, setExtractedFiles, downloadedFileURL, setDownloadedFileURL, downloadedFileSpectrogram, setDownloadedFileSpectrogram }}>
{children} {children}
</MediaContext.Provider> </MediaContext.Provider>
); );